Skip to content
Snippets Groups Projects
Commit 9d7ee78a authored by Paul Adenot's avatar Paul Adenot
Browse files

Bug 1830206 - Rework AudioSink's ringbuffer size computation. r=alwu, a=RyanVM

parent 71ce0dc5
No related branches found
No related tags found
No related merge requests found
......@@ -53,13 +53,22 @@ AudioSink::AudioSink(AbstractThread* aThread,
mAudioQueue(aAudioQueue),
mProcessedQueueThresholdMS(
StaticPrefs::media_audio_audiosink_threshold_ms()) {
// Not much to initialize here if there's no audio.
if (!aInfo.IsValid()) {
mProcessedSPSCQueue = MakeUnique<SPSCQueue<AudioDataValue>>(0);
return;
}
// Twice the limit that trigger a refill.
float capacitySeconds = mProcessedQueueThresholdMS / 1000.f * 2;
mProcessedSPSCQueue =
MakeUnique<SPSCQueue<AudioDataValue>>(static_cast<uint32_t>(
capacitySeconds * static_cast<float>(mOutputChannels * mOutputRate)));
double capacitySeconds = mProcessedQueueThresholdMS / 1000.f * 2;
// Clamp to correct boundaries, and align on the channel count
int elementCount = static_cast<int>(
std::clamp(capacitySeconds * mOutputChannels * mOutputRate, 0.,
std::numeric_limits<int>::max() - 1.));
elementCount -= elementCount % mOutputChannels;
mProcessedSPSCQueue = MakeUnique<SPSCQueue<AudioDataValue>>(elementCount);
SINK_LOG("Ringbuffer has space for %u elements (%lf seconds)",
mProcessedSPSCQueue->Capacity(), capacitySeconds);
mProcessedSPSCQueue->Capacity(),
static_cast<float>(elementCount) / mOutputChannels / mOutputRate);
// Determine if the data is likely to be audible when the stream will be
// ready, if possible.
RefPtr<AudioData> frontPacket = mAudioQueue.PeekFront();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment