From 52ef84873ecd70afdfa73cd655d257bc59b21afc Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 6 Jan 2019 13:28:43 -0800 Subject: [PATCH] Remove excess latency control logic from SDL renderer, since it doesn't appear to work very well anyway --- app/streaming/audio/renderers/sdl.h | 5 -- app/streaming/audio/renderers/sdlaud.cpp | 80 +----------------------- 2 files changed, 1 insertion(+), 84 deletions(-) diff --git a/app/streaming/audio/renderers/sdl.h b/app/streaming/audio/renderers/sdl.h index a9c4d62b..552a6e4c 100644 --- a/app/streaming/audio/renderers/sdl.h +++ b/app/streaming/audio/renderers/sdl.h @@ -16,9 +16,4 @@ public: private: SDL_AudioDeviceID m_AudioDevice; - Uint32 m_ChannelCount; - Uint32 m_PendingDrops; - Uint32 m_PendingHardDrops; - Uint32 m_SampleIndex; - Uint32 m_BaselinePendingData; }; diff --git a/app/streaming/audio/renderers/sdlaud.cpp b/app/streaming/audio/renderers/sdlaud.cpp index bb3a4dd7..ea572f3c 100644 --- a/app/streaming/audio/renderers/sdlaud.cpp +++ b/app/streaming/audio/renderers/sdlaud.cpp @@ -5,18 +5,8 @@ #include -#define MIN_QUEUED_FRAMES 2 -#define MAX_QUEUED_FRAMES 4 -#define STOP_THE_WORLD_LIMIT 20 -#define DROP_RATIO_DENOM 32 - SdlAudioRenderer::SdlAudioRenderer() - : m_AudioDevice(0), - m_ChannelCount(0), - m_PendingDrops(0), - m_PendingHardDrops(0), - m_SampleIndex(0), - m_BaselinePendingData(0) + : m_AudioDevice(0) { SDL_assert(!SDL_WasInit(SDL_INIT_AUDIO)); if (SDL_InitSubSystem(SDL_INIT_AUDIO) != 0) { @@ -61,27 +51,6 @@ bool SdlAudioRenderer::prepareForPlayback(const OPUS_MULTISTREAM_CONFIGURATION* have.samples, have.size); - // SDL counts pending samples in the queued - // audio size using the WASAPI backend. This - // includes silence, which can throw off our - // pending data count. Get a baseline so we - // can exclude that data. - m_BaselinePendingData = 0; -#ifdef Q_OS_WIN32 - for (int i = 0; i < 100; i++) { - m_BaselinePendingData = qMax(m_BaselinePendingData, SDL_GetQueuedAudioSize(m_AudioDevice)); - SDL_Delay(10); - } -#endif - m_BaselinePendingData *= 2; - SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, - "Baseline pending audio data: %d bytes", - m_BaselinePendingData); - - m_ChannelCount = opusConfig->channelCount; - m_SampleIndex = 0; - m_PendingDrops = m_PendingHardDrops = 0; - // Start playback SDL_PauseAudioDevice(m_AudioDevice, 0); @@ -102,53 +71,6 @@ SdlAudioRenderer::~SdlAudioRenderer() bool SdlAudioRenderer::submitAudio(short* audioBuffer, int audioSize) { - m_SampleIndex++; - - Uint32 queuedAudio = SDL_GetQueuedAudioSize(m_AudioDevice); - if (queuedAudio > m_BaselinePendingData) { - queuedAudio -= m_BaselinePendingData; - } - else { - queuedAudio = 0; - } - - Uint32 framesQueued = queuedAudio / (SAMPLES_PER_FRAME * m_ChannelCount * sizeof(short)); - - // We must check this prior to the below checks to ensure we don't - // underflow if framesQueued - m_PendingHardDrops < 0. - if (framesQueued <= MIN_QUEUED_FRAMES) { - m_PendingDrops = m_PendingHardDrops = 0; - } - // Pend enough drops to get us back to MIN_QUEUED_FRAMES, checking first - // to ensure we don't underflow. - else if (framesQueued > m_PendingHardDrops && - framesQueued - m_PendingHardDrops > STOP_THE_WORLD_LIMIT) { - m_PendingHardDrops = framesQueued - MIN_QUEUED_FRAMES; - SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, - "Pending hard drop of %u audio frames", - m_PendingHardDrops); - } - // If we're under the stop the world limit, we can drop samples - // gracefully over the next little while. - else if (framesQueued > m_PendingHardDrops + m_PendingDrops && - framesQueued - m_PendingHardDrops - m_PendingDrops > MAX_QUEUED_FRAMES) { - m_PendingDrops = framesQueued - MIN_QUEUED_FRAMES; - } - - // Determine if this frame should be dropped - if (m_PendingHardDrops != 0) { - // Hard drops happen all at once to forcefully - // resync with the source. - m_PendingHardDrops--; - return true; - } - else if (m_PendingDrops != 0 && m_SampleIndex % DROP_RATIO_DENOM == 0) { - // Normal drops are interspersed with the audio data - // to hide the glitches. - m_PendingDrops--; - return true; - } - if (SDL_QueueAudio(m_AudioDevice, audioBuffer, audioSize) < 0) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to queue audio sample: %s",