diff --git a/app/streaming/audio/renderers/slaud.cpp b/app/streaming/audio/renderers/slaud.cpp index 115c6d8e..27e72866 100644 --- a/app/streaming/audio/renderers/slaud.cpp +++ b/app/streaming/audio/renderers/slaud.cpp @@ -19,6 +19,10 @@ bool SLAudioRenderer::prepareForPlayback(const OPUS_MULTISTREAM_CONFIGURATION* o return false; } + // This number is pretty conservative (especially for surround), but + // it's hard to avoid since we get crushed by CPU limitations. + m_MaxQueuedAudioMs = 40 * opusConfig->channelCount / 2; + m_FrameDuration = opusConfig->samplesPerFrame / 48; m_AudioBufferSize = opusConfig->samplesPerFrame * sizeof(short) * opusConfig->channelCount; m_AudioStream = SLAudio_CreateStream(m_AudioContext, @@ -73,8 +77,7 @@ bool SLAudioRenderer::submitAudio(int bytesWritten) return true; } - // Only allow up to 40 ms of queued audio - if (LiGetPendingAudioFrames() * m_FrameDuration < 40) { + if (LiGetPendingAudioFrames() * m_FrameDuration < m_MaxQueuedAudioMs) { SLAudio_SubmitFrame(m_AudioStream); m_AudioBuffer = nullptr; } diff --git a/app/streaming/audio/renderers/slaud.h b/app/streaming/audio/renderers/slaud.h index 5debd129..52bf8d88 100644 --- a/app/streaming/audio/renderers/slaud.h +++ b/app/streaming/audio/renderers/slaud.h @@ -25,4 +25,5 @@ private: void* m_AudioBuffer; int m_AudioBufferSize; int m_FrameDuration; + int m_MaxQueuedAudioMs; }; diff --git a/app/streaming/session.cpp b/app/streaming/session.cpp index d8532b69..0915cb94 100644 --- a/app/streaming/session.cpp +++ b/app/streaming/session.cpp @@ -49,11 +49,13 @@ AUDIO_RENDERER_CALLBACKS Session::k_AudioCallbacks = { nullptr, Session::arCleanup, Session::arDecodeAndPlaySample, - CAPABILITY_DIRECT_SUBMIT | -#ifdef STEAM_LINK - CAPABILITY_SLOW_OPUS_DECODER +#ifndef STEAM_LINK + CAPABILITY_DIRECT_SUBMIT #else - 0 + // We cannot use direct submit for Steam Link because the + // SLAudio renderer needs to look at the audio backlog to + // cap latency since playback is a blocking operation. + CAPABILITY_SLOW_OPUS_DECODER #endif };