diff options
| author | 2026-03-20 22:14:43 -0400 | |
|---|---|---|
| committer | 2026-03-20 22:14:43 -0400 | |
| commit | c48c18802e312b3ce5fea4502a369a5ae564fb39 (patch) | |
| tree | cc6e6036fadc3986056f46cd810f0c0a521122c0 | |
| parent | 9b734657da2aab18d6e4c2d730c8fe0a0c70c18c (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.cpp | 20 |
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()); } |
