void AnalyserNode::AppendChunk(const AudioChunk& aChunk) { const uint32_t bufferSize = mBuffer.Length(); const uint32_t channelCount = aChunk.mChannelData.Length(); uint32_t chunkDuration = aChunk.mDuration; MOZ_ASSERT((bufferSize & (bufferSize - 1)) == 0); // Must be a power of two! MOZ_ASSERT(channelCount > 0); MOZ_ASSERT(chunkDuration == WEBAUDIO_BLOCK_SIZE); if (chunkDuration > bufferSize) { // Copy a maximum bufferSize samples. chunkDuration = bufferSize; } PodCopy(mBuffer.Elements() + mWriteIndex, static_cast<const float*>(aChunk.mChannelData[0]), chunkDuration); for (uint32_t i = 1; i < channelCount; ++i) { AudioBlockAddChannelWithScale(static_cast<const float*>(aChunk.mChannelData[i]), 1.0f, mBuffer.Elements() + mWriteIndex); } if (channelCount > 1) { AudioBlockInPlaceScale(mBuffer.Elements() + mWriteIndex, 1.0f / aChunk.mChannelData.Length()); } mWriteIndex += chunkDuration; MOZ_ASSERT(mWriteIndex <= bufferSize); if (mWriteIndex >= bufferSize) { mWriteIndex = 0; } }
void PannerNodeEngine::DistanceAndConeGain(AudioChunk* aChunk, float aGain) { float* samples = static_cast<float*>(const_cast<void*>(*aChunk->mChannelData.Elements())); uint32_t channelCount = aChunk->mChannelData.Length(); AudioBlockInPlaceScale(samples, channelCount, aGain); }