audio: cleanup pitch_scale
- use better normalization: (value - 32768) / 32768.0; - use DataView to access little-endian 16bit raw audio data Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
This commit is contained in:
parent
3721da90dc
commit
58c6ad6113
|
@ -23,7 +23,8 @@
|
|||
//
|
||||
// ## Audio format
|
||||
//
|
||||
// We use/expect U16 raw audio data.
|
||||
// We use/expect U16, little endian, raw audio data,
|
||||
// interleaved channel data: [L0, R0, L1, R1, ...]
|
||||
|
||||
import * as Log from './util/logging.js';
|
||||
|
||||
|
@ -38,6 +39,7 @@ export default class Audio {
|
|||
// ===== PROPERTIES =====
|
||||
this._sample_rate = sample_rate;
|
||||
this._nchannels = nchannels;
|
||||
this._little_endian = true;
|
||||
}
|
||||
|
||||
// ===== PROPERTIES =====
|
||||
|
@ -127,6 +129,7 @@ export default class Audio {
|
|||
_pitchScale(payload, factor) {
|
||||
let sample_bytes = 2*this._nchannels;
|
||||
let new_length = Math.ceil(payload.length/(factor*sample_bytes));
|
||||
const payload_view = new DataView(payload);
|
||||
|
||||
let buffer = this._context.createBuffer(this._nchannels, new_length, this._sample_rate);
|
||||
for (let ch = 0; ch < this._nchannels; ch++) {
|
||||
|
@ -138,14 +141,14 @@ export default class Audio {
|
|||
let second_weight = pos_float % 1;
|
||||
let first_weight = 1 - second_weight;
|
||||
let p = j*sample_bytes + channel_offset;
|
||||
let value0 = payload[p] + payload[p+1]*256;
|
||||
let value0 = payload_view.getUint16(p, this._little_endian);
|
||||
p += sample_bytes;
|
||||
let value1 = value0;
|
||||
if (p < payload.length) {
|
||||
value1 = payload[p] + payload[p+1]*256;
|
||||
value1 = payload_view.getUint16(p, this._little_endian);
|
||||
}
|
||||
let value = (value0*first_weight + value1*second_weight);
|
||||
channel[i] = (value / 32768.0) - 1.0;
|
||||
channel[i] = (value - 32768) / 32768.0;
|
||||
}
|
||||
}
|
||||
return buffer;
|
||||
|
|
Loading…
Reference in New Issue