2018-03-07 19:06:52 +01:00
|
|
|
class AudioResampler {
|
|
|
|
targetSampleRate: number;
|
|
|
|
|
|
|
|
constructor(targetSampleRate: number = 44100){
|
|
|
|
this.targetSampleRate = targetSampleRate;
|
2018-04-11 17:56:09 +02:00
|
|
|
if(this.targetSampleRate < 3000 || this.targetSampleRate > 384000) throw "The target sample rate is outside the range [3000, 384000].";
|
2018-03-07 19:06:52 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
resample(buffer: AudioBuffer) : Promise<AudioBuffer> {
|
2018-04-18 16:25:10 +02:00
|
|
|
console.log("Encode from %i to %i", buffer.sampleRate, this.targetSampleRate);
|
2018-03-07 19:06:52 +01:00
|
|
|
if(buffer.sampleRate == this.targetSampleRate)
|
|
|
|
return new Promise<AudioBuffer>(resolve => resolve(buffer));
|
|
|
|
|
|
|
|
let context;
|
2018-04-18 20:12:10 +02:00
|
|
|
context = new OfflineAudioContext(buffer.numberOfChannels, Math.ceil(buffer.length * this.targetSampleRate / buffer.sampleRate), this.targetSampleRate);
|
2018-03-07 19:06:52 +01:00
|
|
|
|
|
|
|
let source = context.createBufferSource();
|
|
|
|
source.buffer = buffer;
|
|
|
|
source.connect(context.destination);
|
|
|
|
source.start(0);
|
|
|
|
|
|
|
|
return context.startRendering();
|
|
|
|
}
|
|
|
|
}
|