summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author arbee <rb6502@users.noreply.github.com>2026-03-20 22:14:43 -0400
committer arbee <rb6502@users.noreply.github.com>2026-03-20 22:14:43 -0400
commitc48c18802e312b3ce5fea4502a369a5ae564fb39 (patch)
treecc6e6036fadc3986056f46cd810f0c0a521122c0
parent9b734657da2aab18d6e4c2d730c8fe0a0c70c18c (diff)
sdl3_sound.cpp: Rate-limit the output stream so it doesn't queue up to infinity when you unthrottle. (MAMETesters #9401) [R. Belmont]
-rw-r--r--src/osd/modules/sound/sdl3_sound.cpp20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/osd/modules/sound/sdl3_sound.cpp b/src/osd/modules/sound/sdl3_sound.cpp
index d450a898a83..57fcc48df89 100644
--- a/src/osd/modules/sound/sdl3_sound.cpp
+++ b/src/osd/modules/sound/sdl3_sound.cpp
@@ -88,8 +88,6 @@ private:
osd::audio_info m_deviceinfo;
std::map<uint32_t, std::unique_ptr<stream_info>> m_streams;
-
- static void sink_callback(void *userdata, Uint8 *stream, int len);
};
//============================================================
@@ -344,18 +342,28 @@ void sound_sdl3::stream_close(uint32_t id)
void sound_sdl3::stream_sink_update(uint32_t id, const int16_t *buffer, int samples_this_frame)
{
auto si = m_streams.find(id);
- if(si == m_streams.end())
+ if (si == m_streams.end())
+ {
return;
- stream_info *stream = si->second.get();
- SDL_PutAudioStreamData(stream->m_sdl_stream, (void *)buffer, samples_this_frame * sizeof(int16_t) * stream->m_buffer.channels());
+ }
+
+ const stream_info *stream = si->second.get();
+ const auto queue_size = SDL_GetAudioStreamQueued(stream->m_sdl_stream);
+ if (queue_size <= 8 * samples_this_frame)
+ {
+ SDL_PutAudioStreamData(stream->m_sdl_stream, (void *)buffer, samples_this_frame * sizeof(int16_t) * stream->m_buffer.channels());
+ }
}
void sound_sdl3::stream_source_update(uint32_t id, int16_t *buffer, int samples_this_frame)
{
auto si = m_streams.find(id);
if (si == m_streams.end())
+ {
return;
- stream_info *stream = si->second.get();
+ }
+
+ const stream_info *stream = si->second.get();
SDL_GetAudioStreamData(stream->m_sdl_stream, (void *)buffer, samples_this_frame * sizeof(int16_t) * stream->m_buffer.channels());
}