From 331cb52eea82493f8881a08280638827ee26c16d Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Fri, 14 Feb 2025 10:23:12 +0000 Subject: [PATCH] SDLAudioStream: Migrate to SDL_AudioStream --- pcsx2/Host/SDLAudioStream.cpp | 62 +++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/pcsx2/Host/SDLAudioStream.cpp b/pcsx2/Host/SDLAudioStream.cpp index 0fc4a8a66f..b0573712f8 100644 --- a/pcsx2/Host/SDLAudioStream.cpp +++ b/pcsx2/Host/SDLAudioStream.cpp @@ -23,11 +23,11 @@ namespace void CloseDevice(); protected: - __fi bool IsOpen() const { return (m_device_id != 0); } + __fi bool IsOpen() const { return (m_stream != nullptr); } - static void AudioCallback(void* userdata, uint8_t* stream, int len); + static void AudioCallback(void* userdata, SDL_AudioStream* stream, int additional_amount, int total_amount); - u32 m_device_id = 0; + SDL_AudioStream* m_stream = nullptr; }; } // namespace @@ -102,27 +102,24 @@ bool SDLAudioStream::OpenDevice(bool stretch_enabled, Error* error) READ_CHANNEL_REAR_LEFT, READ_CHANNEL_REAR_RIGHT>, }}; - SDL_AudioSpec spec = {}; - spec.freq = m_sample_rate; - spec.channels = m_output_channels; - spec.format = SDL_AUDIO_S16LE; - spec.samples = static_cast(GetBufferSizeForMS( - m_sample_rate, (m_parameters.minimal_output_latency) ? m_parameters.buffer_ms : m_parameters.output_latency_ms)); - spec.callback = AudioCallback; - spec.userdata = static_cast(this); + uint samples = GetBufferSizeForMS( + m_sample_rate, (m_parameters.minimal_output_latency) ? m_parameters.buffer_ms : m_parameters.output_latency_ms); + + SDL_SetHint(SDL_HINT_AUDIO_DEVICE_SAMPLE_FRAMES, fmt::format("{}", samples).c_str()); + + const SDL_AudioSpec spec = {SDL_AUDIO_S16LE, m_output_channels, static_cast(m_sample_rate)}; + m_stream = SDL_OpenAudioDeviceStream(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &spec, AudioCallback, static_cast(this)); SDL_AudioSpec obtained_spec = {}; - m_device_id = SDL_OpenAudioDevice(nullptr, 0, &spec, &obtained_spec, SDL_AUDIO_ALLOW_SAMPLES_CHANGE); - if (m_device_id == 0) - { - Error::SetStringFmt(error, "SDL_OpenAudioDevice() failed: {}", SDL_GetError()); - return false; - } + int obtained_samples = 0; - DEV_LOG("Requested {} frame buffer, got {} frame buffer", spec.samples, obtained_spec.samples); + if (SDL_GetAudioDeviceFormat(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &obtained_spec, &obtained_samples)) + DEV_LOG("Requested {} frame buffer, got {} frame buffer", samples, obtained_samples); + else + DEV_LOG("SDL_GetAudioDeviceFormat() failed {}", SDL_GetError()); BaseInitialize(sample_readers[static_cast(m_parameters.expansion_mode)], stretch_enabled); - SDL_ResumeAudioDevice(m_device_id); + SDL_ResumeAudioDevice(SDL_GetAudioStreamDevice(m_stream)); return true; } @@ -131,25 +128,34 @@ void SDLAudioStream::SetPaused(bool paused) { if (m_paused == paused) return; - + if (paused) - SDL_PauseAudioDevice(m_device_id); + SDL_PauseAudioDevice(SDL_GetAudioStreamDevice(m_stream)); else - SDL_ResumeAudioDevice(m_device_id); + SDL_ResumeAudioDevice(SDL_GetAudioStreamDevice(m_stream)); m_paused = paused; } void SDLAudioStream::CloseDevice() { - SDL_CloseAudioDevice(m_device_id); - m_device_id = 0; + SDL_DestroyAudioStream(m_stream); + m_stream = nullptr; } -void SDLAudioStream::AudioCallback(void* userdata, uint8_t* stream, int len) +void SDLAudioStream::AudioCallback(void* userdata, SDL_AudioStream* stream, int additional_amount, int total_amount) { - SDLAudioStream* const this_ptr = static_cast(userdata); - const u32 num_frames = len / sizeof(SampleType) / this_ptr->m_output_channels; + if (additional_amount > 0) + { + SDLAudioStream* const this_ptr = static_cast(userdata); - this_ptr->ReadFrames(reinterpret_cast(stream), num_frames); + const u32 num_frames = additional_amount / sizeof(SampleType) / this_ptr->m_output_channels; + SampleType* buffer = SDL_stack_alloc(SampleType, additional_amount / sizeof(SampleType)); + if (buffer) + { + this_ptr->ReadFrames(buffer, num_frames); + SDL_PutAudioStreamData(stream, buffer, additional_amount); + SDL_stack_free(buffer); + } + } }