forked from mirrors/gecko-dev
Bug 1203616 - Properly scale the input buffer of a WaveShaperNode before processing it with the curve. r=karlt, a=sylvestre
--HG-- extra : source : a61652a27e8cc83682b24a9f920df0955b4720b4 extra : amend_source : 6960da7cbae1677685b8af431db301e818d4d4fe
This commit is contained in:
parent
5bef9005b8
commit
1858803b03
1 changed files with 14 additions and 6 deletions
|
|
@ -229,26 +229,34 @@ public:
|
||||||
|
|
||||||
AllocateAudioBlock(channelCount, aOutput);
|
AllocateAudioBlock(channelCount, aOutput);
|
||||||
for (uint32_t i = 0; i < channelCount; ++i) {
|
for (uint32_t i = 0; i < channelCount; ++i) {
|
||||||
float* scaledSample = (float *)(aInput.mChannelData[i]);
|
const float* inputSamples;
|
||||||
AudioBlockInPlaceScale(scaledSample, aInput.mVolume);
|
float scaledInput[WEBAUDIO_BLOCK_SIZE];
|
||||||
const float* inputBuffer = static_cast<const float*>(scaledSample);
|
if (aInput.mVolume != 1.0f) {
|
||||||
|
AudioBlockCopyChannelWithScale(
|
||||||
|
static_cast<const float*>(aInput.mChannelData[i]),
|
||||||
|
aInput.mVolume,
|
||||||
|
scaledInput);
|
||||||
|
inputSamples = scaledInput;
|
||||||
|
} else {
|
||||||
|
inputSamples = static_cast<const float*>(aInput.mChannelData[i]);
|
||||||
|
}
|
||||||
float* outputBuffer = aOutput->ChannelFloatsForWrite(i);
|
float* outputBuffer = aOutput->ChannelFloatsForWrite(i);
|
||||||
float* sampleBuffer;
|
float* sampleBuffer;
|
||||||
|
|
||||||
switch (mType) {
|
switch (mType) {
|
||||||
case OverSampleType::None:
|
case OverSampleType::None:
|
||||||
mResampler.Reset(channelCount, aStream->SampleRate(), OverSampleType::None);
|
mResampler.Reset(channelCount, aStream->SampleRate(), OverSampleType::None);
|
||||||
ProcessCurve<1>(inputBuffer, outputBuffer);
|
ProcessCurve<1>(inputSamples, outputBuffer);
|
||||||
break;
|
break;
|
||||||
case OverSampleType::_2x:
|
case OverSampleType::_2x:
|
||||||
mResampler.Reset(channelCount, aStream->SampleRate(), OverSampleType::_2x);
|
mResampler.Reset(channelCount, aStream->SampleRate(), OverSampleType::_2x);
|
||||||
sampleBuffer = mResampler.UpSample(i, inputBuffer, 2);
|
sampleBuffer = mResampler.UpSample(i, inputSamples, 2);
|
||||||
ProcessCurve<2>(sampleBuffer, sampleBuffer);
|
ProcessCurve<2>(sampleBuffer, sampleBuffer);
|
||||||
mResampler.DownSample(i, outputBuffer, 2);
|
mResampler.DownSample(i, outputBuffer, 2);
|
||||||
break;
|
break;
|
||||||
case OverSampleType::_4x:
|
case OverSampleType::_4x:
|
||||||
mResampler.Reset(channelCount, aStream->SampleRate(), OverSampleType::_4x);
|
mResampler.Reset(channelCount, aStream->SampleRate(), OverSampleType::_4x);
|
||||||
sampleBuffer = mResampler.UpSample(i, inputBuffer, 4);
|
sampleBuffer = mResampler.UpSample(i, inputSamples, 4);
|
||||||
ProcessCurve<4>(sampleBuffer, sampleBuffer);
|
ProcessCurve<4>(sampleBuffer, sampleBuffer);
|
||||||
mResampler.DownSample(i, outputBuffer, 4);
|
mResampler.DownSample(i, outputBuffer, 4);
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue