Fixups in audio backend

Removes 's_' prefix from variables that are no longer static and
thread_local. Removes superfluous comments left behind due to copy-paste
mistakes.
This commit is contained in:
Rui Pinheiro 2019-01-09 22:19:05 +00:00 committed by kd-11
parent fe9062671e
commit 1e4513e2e3
5 changed files with 97 additions and 99 deletions

View file

@ -28,7 +28,7 @@ ALSABackend::ALSABackend()
ALSABackend::~ALSABackend() ALSABackend::~ALSABackend()
{ {
if (s_tls_sw_params || s_tls_hw_params || s_tls_handle) if (tls_sw_params || tls_hw_params || tls_handle)
{ {
Close(); Close();
} }
@ -36,71 +36,71 @@ ALSABackend::~ALSABackend()
void ALSABackend::Open(u32 num_buffers) void ALSABackend::Open(u32 num_buffers)
{ {
if (!check(snd_pcm_open(&s_tls_handle, "default", SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK), "snd_pcm_open")) if (!check(snd_pcm_open(&tls_handle, "default", SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK), "snd_pcm_open"))
return; return;
if (!check(snd_pcm_hw_params_malloc(&s_tls_hw_params), "snd_pcm_hw_params_malloc")) if (!check(snd_pcm_hw_params_malloc(&tls_hw_params), "snd_pcm_hw_params_malloc"))
return; return;
if (!check(snd_pcm_hw_params_any(s_tls_handle, s_tls_hw_params), "snd_pcm_hw_params_any")) if (!check(snd_pcm_hw_params_any(tls_handle, tls_hw_params), "snd_pcm_hw_params_any"))
return; return;
if (!check(snd_pcm_hw_params_set_access(s_tls_handle, s_tls_hw_params, SND_PCM_ACCESS_RW_INTERLEAVED), "snd_pcm_hw_params_set_access")) if (!check(snd_pcm_hw_params_set_access(tls_handle, tls_hw_params, SND_PCM_ACCESS_RW_INTERLEAVED), "snd_pcm_hw_params_set_access"))
return; return;
if (!check(snd_pcm_hw_params_set_format(s_tls_handle, s_tls_hw_params, g_cfg.audio.convert_to_u16 ? SND_PCM_FORMAT_S16_LE : SND_PCM_FORMAT_FLOAT_LE), "snd_pcm_hw_params_set_format")) if (!check(snd_pcm_hw_params_set_format(tls_handle, tls_hw_params, g_cfg.audio.convert_to_u16 ? SND_PCM_FORMAT_S16_LE : SND_PCM_FORMAT_FLOAT_LE), "snd_pcm_hw_params_set_format"))
return; return;
uint rate = get_sampling_rate(); uint rate = get_sampling_rate();
if (!check(snd_pcm_hw_params_set_rate_near(s_tls_handle, s_tls_hw_params, &rate, nullptr), "snd_pcm_hw_params_set_rate_near")) if (!check(snd_pcm_hw_params_set_rate_near(tls_handle, tls_hw_params, &rate, nullptr), "snd_pcm_hw_params_set_rate_near"))
return; return;
if (!check(snd_pcm_hw_params_set_channels(s_tls_handle, s_tls_hw_params, get_channels()), "snd_pcm_hw_params_set_channels")) if (!check(snd_pcm_hw_params_set_channels(tls_handle, tls_hw_params, get_channels()), "snd_pcm_hw_params_set_channels"))
return; return;
//uint period = 5333; //uint period = 5333;
//if (!check(snd_pcm_hw_params_set_period_time_near(s_tls_handle, s_tls_hw_params, &period, nullptr), "snd_pcm_hw_params_set_period_time_near")) //if (!check(snd_pcm_hw_params_set_period_time_near(tls_handle, tls_hw_params, &period, nullptr), "snd_pcm_hw_params_set_period_time_near"))
// return; // return;
//if (!check(snd_pcm_hw_params_set_periods(s_tls_handle, s_tls_hw_params, 4, 0), "snd_pcm_hw_params_set_periods")) //if (!check(snd_pcm_hw_params_set_periods(tls_handle, tls_hw_params, 4, 0), "snd_pcm_hw_params_set_periods"))
// return; // return;
snd_pcm_uframes_t bufsize_frames = num_buffers * AUDIO_BUFFER_SAMPLES; snd_pcm_uframes_t bufsize_frames = num_buffers * AUDIO_BUFFER_SAMPLES;
snd_pcm_uframes_t period_frames = AUDIO_BUFFER_SAMPLES; snd_pcm_uframes_t period_frames = AUDIO_BUFFER_SAMPLES;
if (!check(snd_pcm_hw_params_set_buffer_size_near(s_tls_handle, s_tls_hw_params, &bufsize_frames), "snd_pcm_hw_params_set_buffer_size_near")) if (!check(snd_pcm_hw_params_set_buffer_size_near(tls_handle, tls_hw_params, &bufsize_frames), "snd_pcm_hw_params_set_buffer_size_near"))
return; return;
if (!check(snd_pcm_hw_params_set_period_size_near(s_tls_handle, s_tls_hw_params, &period_frames, 0), "snd_pcm_hw_params_set_period_size")) if (!check(snd_pcm_hw_params_set_period_size_near(tls_handle, tls_hw_params, &period_frames, 0), "snd_pcm_hw_params_set_period_size"))
return; return;
if (!check(snd_pcm_hw_params(s_tls_handle, s_tls_hw_params), "snd_pcm_hw_params")) if (!check(snd_pcm_hw_params(tls_handle, tls_hw_params), "snd_pcm_hw_params"))
return; return;
if (!check(snd_pcm_hw_params_get_buffer_size(s_tls_hw_params, &bufsize_frames), "snd_pcm_hw_params_get_buffer_size")) if (!check(snd_pcm_hw_params_get_buffer_size(tls_hw_params, &bufsize_frames), "snd_pcm_hw_params_get_buffer_size"))
return; return;
if (!check(snd_pcm_hw_params_get_period_size(s_tls_hw_params, &period_frames, nullptr), "snd_pcm_hw_params_get_period_size")) if (!check(snd_pcm_hw_params_get_period_size(tls_hw_params, &period_frames, nullptr), "snd_pcm_hw_params_get_period_size"))
return; return;
if (!check(snd_pcm_sw_params_malloc(&s_tls_sw_params), "snd_pcm_sw_params_malloc")) if (!check(snd_pcm_sw_params_malloc(&tls_sw_params), "snd_pcm_sw_params_malloc"))
return; return;
if (!check(snd_pcm_sw_params_current(s_tls_handle, s_tls_sw_params), "snd_pcm_sw_params_current")) if (!check(snd_pcm_sw_params_current(tls_handle, tls_sw_params), "snd_pcm_sw_params_current"))
return; return;
period_frames *= g_cfg.audio.startt; period_frames *= g_cfg.audio.startt;
if (!check(snd_pcm_sw_params_set_start_threshold(s_tls_handle, s_tls_sw_params, period_frames + 1), "snd_pcm_sw_params_set_start_threshold")) if (!check(snd_pcm_sw_params_set_start_threshold(tls_handle, tls_sw_params, period_frames + 1), "snd_pcm_sw_params_set_start_threshold"))
return; return;
if (!check(snd_pcm_sw_params_set_stop_threshold(s_tls_handle, s_tls_sw_params, bufsize_frames), "snd_pcm_sw_params_set_stop_threshold")) if (!check(snd_pcm_sw_params_set_stop_threshold(tls_handle, tls_sw_params, bufsize_frames), "snd_pcm_sw_params_set_stop_threshold"))
return; return;
if (!check(snd_pcm_sw_params(s_tls_handle, s_tls_sw_params), "snd_pcm_sw_params")) if (!check(snd_pcm_sw_params(tls_handle, tls_sw_params), "snd_pcm_sw_params"))
return; return;
if (!check(snd_pcm_prepare(s_tls_handle), "snd_pcm_prepare")) if (!check(snd_pcm_prepare(tls_handle), "snd_pcm_prepare"))
return; return;
LOG_NOTICE(GENERAL, "ALSA: bufsize_frames=%u, period_frames=%u", bufsize_frames, period_frames); LOG_NOTICE(GENERAL, "ALSA: bufsize_frames=%u, period_frames=%u", bufsize_frames, period_frames);
@ -108,22 +108,22 @@ void ALSABackend::Open(u32 num_buffers)
void ALSABackend::Close() void ALSABackend::Close()
{ {
if (s_tls_sw_params) if (tls_sw_params)
{ {
snd_pcm_sw_params_free(s_tls_sw_params); snd_pcm_sw_params_free(tls_sw_params);
s_tls_sw_params = nullptr; tls_sw_params = nullptr;
} }
if (s_tls_hw_params) if (tls_hw_params)
{ {
snd_pcm_hw_params_free(s_tls_hw_params); snd_pcm_hw_params_free(tls_hw_params);
s_tls_hw_params = nullptr; tls_hw_params = nullptr;
} }
if (s_tls_handle) if (tls_handle)
{ {
snd_pcm_close(s_tls_handle); snd_pcm_close(tls_handle);
s_tls_handle = nullptr; tls_handle = nullptr;
} }
} }
@ -131,7 +131,7 @@ bool ALSABackend::AddData(const void* src, u32 num_samples)
{ {
u32 num_frames = num_samples / get_channels(); u32 num_frames = num_samples / get_channels();
int res = snd_pcm_writei(s_tls_handle, src, num_frames); int res = snd_pcm_writei(tls_handle, src, num_frames);
if (res == -EAGAIN) if (res == -EAGAIN)
{ {
@ -141,7 +141,7 @@ bool ALSABackend::AddData(const void* src, u32 num_samples)
if (res < 0) if (res < 0)
{ {
res = snd_pcm_recover(s_tls_handle, res, 0); res = snd_pcm_recover(tls_handle, res, 0);
if (res < 0) if (res < 0)
{ {
@ -149,7 +149,7 @@ bool ALSABackend::AddData(const void* src, u32 num_samples)
return false; return false;
} }
res = snd_pcm_writei(s_tls_handle, src, num_frames); res = snd_pcm_writei(tls_handle, src, num_frames);
} }
if (res != num_frames) if (res != num_frames)

View file

@ -8,9 +8,9 @@
class ALSABackend : public AudioBackend class ALSABackend : public AudioBackend
{ {
snd_pcm_t* s_tls_handle{nullptr}; snd_pcm_t* tls_handle{nullptr};
snd_pcm_hw_params_t* s_tls_hw_params{nullptr}; snd_pcm_hw_params_t* tls_hw_params{nullptr};
snd_pcm_sw_params_t* s_tls_sw_params{nullptr}; snd_pcm_sw_params_t* tls_sw_params{nullptr};
public: public:
ALSABackend(); ALSABackend();

View file

@ -9,14 +9,14 @@
class XAudio27Library : public XAudio2Backend::XAudio2Library class XAudio27Library : public XAudio2Backend::XAudio2Library
{ {
const HMODULE s_tls_xaudio2_lib; const HMODULE tls_xaudio2_lib;
IXAudio2* s_tls_xaudio2_instance{}; IXAudio2* tls_xaudio2_instance{};
IXAudio2MasteringVoice* s_tls_master_voice{}; IXAudio2MasteringVoice* tls_master_voice{};
IXAudio2SourceVoice* s_tls_source_voice{}; IXAudio2SourceVoice* tls_source_voice{};
public: public:
XAudio27Library(void* lib2_7) XAudio27Library(void* lib2_7)
: s_tls_xaudio2_lib(static_cast<HMODULE>(lib2_7)) : tls_xaudio2_lib(static_cast<HMODULE>(lib2_7))
{ {
HRESULT hr = S_OK; HRESULT hr = S_OK;
@ -28,7 +28,7 @@ public:
return; return;
} }
hr = XAudio2Create(&s_tls_xaudio2_instance, 0, XAUDIO2_DEFAULT_PROCESSOR); hr = XAudio2Create(&tls_xaudio2_instance, 0, XAUDIO2_DEFAULT_PROCESSOR);
if (FAILED(hr)) if (FAILED(hr))
{ {
LOG_ERROR(GENERAL, "XAudio2Backend : XAudio2Create() failed(0x%08x)", (u32)hr); LOG_ERROR(GENERAL, "XAudio2Backend : XAudio2Create() failed(0x%08x)", (u32)hr);
@ -36,42 +36,42 @@ public:
return; return;
} }
hr = s_tls_xaudio2_instance->CreateMasteringVoice(&s_tls_master_voice, g_cfg.audio.downmix_to_2ch ? 2 : 8, 48000); hr = tls_xaudio2_instance->CreateMasteringVoice(&tls_master_voice, g_cfg.audio.downmix_to_2ch ? 2 : 8, 48000);
if (FAILED(hr)) if (FAILED(hr))
{ {
LOG_ERROR(GENERAL, "XAudio2Backend : CreateMasteringVoice() failed(0x%08x)", (u32)hr); LOG_ERROR(GENERAL, "XAudio2Backend : CreateMasteringVoice() failed(0x%08x)", (u32)hr);
s_tls_xaudio2_instance->Release(); tls_xaudio2_instance->Release();
Emu.Pause(); Emu.Pause();
} }
} }
~XAudio27Library() ~XAudio27Library()
{ {
if (s_tls_source_voice != nullptr) if (tls_source_voice != nullptr)
{ {
s_tls_source_voice->Stop(); tls_source_voice->Stop();
s_tls_source_voice->DestroyVoice(); tls_source_voice->DestroyVoice();
} }
if (s_tls_master_voice != nullptr) if (tls_master_voice != nullptr)
{ {
s_tls_master_voice->DestroyVoice(); tls_master_voice->DestroyVoice();
} }
if (s_tls_xaudio2_instance != nullptr) if (tls_xaudio2_instance != nullptr)
{ {
s_tls_xaudio2_instance->StopEngine(); tls_xaudio2_instance->StopEngine();
s_tls_xaudio2_instance->Release(); tls_xaudio2_instance->Release();
} }
CoUninitialize(); CoUninitialize();
FreeLibrary(s_tls_xaudio2_lib); FreeLibrary(tls_xaudio2_lib);
} }
virtual void play() override virtual void play() override
{ {
HRESULT hr = s_tls_source_voice->Start(); HRESULT hr = tls_source_voice->Start();
if (FAILED(hr)) if (FAILED(hr))
{ {
LOG_ERROR(GENERAL, "XAudio2Backend : Start() failed(0x%08x)", (u32)hr); LOG_ERROR(GENERAL, "XAudio2Backend : Start() failed(0x%08x)", (u32)hr);
@ -81,7 +81,7 @@ public:
virtual void flush() override virtual void flush() override
{ {
HRESULT hr = s_tls_source_voice->FlushSourceBuffers(); HRESULT hr = tls_source_voice->FlushSourceBuffers();
if (FAILED(hr)) if (FAILED(hr))
{ {
LOG_ERROR(GENERAL, "XAudio2Backend : FlushSourceBuffers() failed(0x%08x)", (u32)hr); LOG_ERROR(GENERAL, "XAudio2Backend : FlushSourceBuffers() failed(0x%08x)", (u32)hr);
@ -91,7 +91,7 @@ public:
virtual void stop() override virtual void stop() override
{ {
HRESULT hr = s_tls_source_voice->Stop(); HRESULT hr = tls_source_voice->Stop();
if (FAILED(hr)) if (FAILED(hr))
{ {
LOG_ERROR(GENERAL, "XAudio2Backend : Stop() failed(0x%08x)", (u32)hr); LOG_ERROR(GENERAL, "XAudio2Backend : Stop() failed(0x%08x)", (u32)hr);
@ -102,7 +102,7 @@ public:
virtual bool is_playing() override virtual bool is_playing() override
{ {
XAUDIO2_VOICE_STATE state; XAUDIO2_VOICE_STATE state;
s_tls_source_voice->GetState(&state); tls_source_voice->GetState(&state);
return state.BuffersQueued > 0 || state.pCurrentBufferContext != nullptr; return state.BuffersQueued > 0 || state.pCurrentBufferContext != nullptr;
} }
@ -124,7 +124,7 @@ public:
waveformatex.wBitsPerSample = sample_size * 8; waveformatex.wBitsPerSample = sample_size * 8;
waveformatex.cbSize = 0; waveformatex.cbSize = 0;
hr = s_tls_xaudio2_instance->CreateSourceVoice(&s_tls_source_voice, &waveformatex, 0, XAUDIO2_DEFAULT_FREQ_RATIO); hr = tls_xaudio2_instance->CreateSourceVoice(&tls_source_voice, &waveformatex, 0, XAUDIO2_DEFAULT_FREQ_RATIO);
if (FAILED(hr)) if (FAILED(hr))
{ {
LOG_ERROR(GENERAL, "XAudio2Backend : CreateSourceVoice() failed(0x%08x)", (u32)hr); LOG_ERROR(GENERAL, "XAudio2Backend : CreateSourceVoice() failed(0x%08x)", (u32)hr);
@ -132,13 +132,13 @@ public:
return; return;
} }
s_tls_source_voice->SetVolume(channels == 2 ? 1.0f : 4.0f); tls_source_voice->SetVolume(channels == 2 ? 1.0f : 4.0f);
} }
virtual bool add(const void* src, u32 num_samples) override virtual bool add(const void* src, u32 num_samples) override
{ {
XAUDIO2_VOICE_STATE state; XAUDIO2_VOICE_STATE state;
s_tls_source_voice->GetState(&state); tls_source_voice->GetState(&state);
// XAudio 2.7 bug workaround, when it says "SimpList: non-growable list ran out of room for new elements" and hits int 3 // XAudio 2.7 bug workaround, when it says "SimpList: non-growable list ran out of room for new elements" and hits int 3
if (state.BuffersQueued >= MAX_AUDIO_BUFFERS) if (state.BuffersQueued >= MAX_AUDIO_BUFFERS)
@ -159,7 +159,7 @@ public:
buffer.PlayBegin = 0; buffer.PlayBegin = 0;
buffer.PlayLength = AUDIO_BUFFER_SAMPLES; buffer.PlayLength = AUDIO_BUFFER_SAMPLES;
HRESULT hr = s_tls_source_voice->SubmitSourceBuffer(&buffer); HRESULT hr = tls_source_voice->SubmitSourceBuffer(&buffer);
if (FAILED(hr)) if (FAILED(hr))
{ {
LOG_ERROR(GENERAL, "XAudio2Backend : AddData() failed(0x%08x)", (u32)hr); LOG_ERROR(GENERAL, "XAudio2Backend : AddData() failed(0x%08x)", (u32)hr);
@ -173,7 +173,7 @@ public:
virtual u64 enqueued_samples() override virtual u64 enqueued_samples() override
{ {
XAUDIO2_VOICE_STATE state; XAUDIO2_VOICE_STATE state;
s_tls_source_voice->GetState(&state); tls_source_voice->GetState(&state);
// all buffers contain AUDIO_BUFFER_SAMPLES, so we can easily calculate how many samples there are remaining // all buffers contain AUDIO_BUFFER_SAMPLES, so we can easily calculate how many samples there are remaining
return (AUDIO_BUFFER_SAMPLES - state.SamplesPlayed % AUDIO_BUFFER_SAMPLES) + (state.BuffersQueued * AUDIO_BUFFER_SAMPLES); return (AUDIO_BUFFER_SAMPLES - state.SamplesPlayed % AUDIO_BUFFER_SAMPLES) + (state.BuffersQueued * AUDIO_BUFFER_SAMPLES);
@ -183,7 +183,7 @@ public:
{ {
new_ratio = std::clamp(new_ratio, XAUDIO2_MIN_FREQ_RATIO, XAUDIO2_DEFAULT_FREQ_RATIO); new_ratio = std::clamp(new_ratio, XAUDIO2_MIN_FREQ_RATIO, XAUDIO2_DEFAULT_FREQ_RATIO);
HRESULT hr = s_tls_source_voice->SetFrequencyRatio(new_ratio); HRESULT hr = tls_source_voice->SetFrequencyRatio(new_ratio);
if (FAILED(hr)) if (FAILED(hr))
{ {
LOG_ERROR(GENERAL, "XAudio2Backend : SetFrequencyRatio() failed(0x%08x)", (u32)hr); LOG_ERROR(GENERAL, "XAudio2Backend : SetFrequencyRatio() failed(0x%08x)", (u32)hr);

View file

@ -9,16 +9,16 @@
class XAudio28Library : public XAudio2Backend::XAudio2Library class XAudio28Library : public XAudio2Backend::XAudio2Library
{ {
const HMODULE s_tls_xaudio2_lib; const HMODULE tls_xaudio2_lib;
IXAudio2* s_tls_xaudio2_instance{}; IXAudio2* tls_xaudio2_instance{};
IXAudio2MasteringVoice* s_tls_master_voice{}; IXAudio2MasteringVoice* tls_master_voice{};
IXAudio2SourceVoice* s_tls_source_voice{}; IXAudio2SourceVoice* tls_source_voice{};
public: public:
XAudio28Library(void* lib2_8) XAudio28Library(void* lib2_8)
: s_tls_xaudio2_lib(static_cast<HMODULE>(lib2_8)) : tls_xaudio2_lib(static_cast<HMODULE>(lib2_8))
{ {
const auto create = (XAudio2Create)GetProcAddress(s_tls_xaudio2_lib, "XAudio2Create"); const auto create = (XAudio2Create)GetProcAddress(tls_xaudio2_lib, "XAudio2Create");
HRESULT hr = S_OK; HRESULT hr = S_OK;
@ -30,7 +30,7 @@ public:
return; return;
} }
hr = create(&s_tls_xaudio2_instance, 0, XAUDIO2_DEFAULT_PROCESSOR); hr = create(&tls_xaudio2_instance, 0, XAUDIO2_DEFAULT_PROCESSOR);
if (FAILED(hr)) if (FAILED(hr))
{ {
LOG_ERROR(GENERAL, "XAudio2Backend : XAudio2Create() failed(0x%08x)", (u32)hr); LOG_ERROR(GENERAL, "XAudio2Backend : XAudio2Create() failed(0x%08x)", (u32)hr);
@ -38,44 +38,44 @@ public:
return; return;
} }
hr = s_tls_xaudio2_instance->CreateMasteringVoice(&s_tls_master_voice, g_cfg.audio.downmix_to_2ch ? 2 : 8, 48000); hr = tls_xaudio2_instance->CreateMasteringVoice(&tls_master_voice, g_cfg.audio.downmix_to_2ch ? 2 : 8, 48000);
if (FAILED(hr)) if (FAILED(hr))
{ {
LOG_ERROR(GENERAL, "XAudio2Backend : CreateMasteringVoice() failed(0x%08x)", (u32)hr); LOG_ERROR(GENERAL, "XAudio2Backend : CreateMasteringVoice() failed(0x%08x)", (u32)hr);
s_tls_xaudio2_instance->Release(); tls_xaudio2_instance->Release();
Emu.Pause(); Emu.Pause();
} }
} }
~XAudio28Library() ~XAudio28Library()
{ {
if (s_tls_source_voice != nullptr) if (tls_source_voice != nullptr)
{ {
s_tls_source_voice->Stop(); tls_source_voice->Stop();
s_tls_source_voice->DestroyVoice(); tls_source_voice->DestroyVoice();
} }
if (s_tls_master_voice != nullptr) if (tls_master_voice != nullptr)
{ {
s_tls_master_voice->DestroyVoice(); tls_master_voice->DestroyVoice();
} }
if (s_tls_xaudio2_instance != nullptr) if (tls_xaudio2_instance != nullptr)
{ {
s_tls_xaudio2_instance->StopEngine(); tls_xaudio2_instance->StopEngine();
s_tls_xaudio2_instance->Release(); tls_xaudio2_instance->Release();
} }
CoUninitialize(); CoUninitialize();
FreeLibrary(s_tls_xaudio2_lib); FreeLibrary(tls_xaudio2_lib);
} }
virtual void play() override virtual void play() override
{ {
AUDIT(s_tls_source_voice != nullptr); AUDIT(tls_source_voice != nullptr);
HRESULT hr = s_tls_source_voice->Start(); HRESULT hr = tls_source_voice->Start();
if (FAILED(hr)) if (FAILED(hr))
{ {
LOG_ERROR(GENERAL, "XAudio2Backend : Start() failed(0x%08x)", (u32)hr); LOG_ERROR(GENERAL, "XAudio2Backend : Start() failed(0x%08x)", (u32)hr);
@ -85,9 +85,9 @@ public:
virtual void flush() override virtual void flush() override
{ {
AUDIT(s_tls_source_voice != nullptr); AUDIT(tls_source_voice != nullptr);
HRESULT hr = s_tls_source_voice->FlushSourceBuffers(); HRESULT hr = tls_source_voice->FlushSourceBuffers();
if (FAILED(hr)) if (FAILED(hr))
{ {
LOG_ERROR(GENERAL, "XAudio2Backend : FlushSourceBuffers() failed(0x%08x)", (u32)hr); LOG_ERROR(GENERAL, "XAudio2Backend : FlushSourceBuffers() failed(0x%08x)", (u32)hr);
@ -97,9 +97,9 @@ public:
virtual void stop() override virtual void stop() override
{ {
AUDIT(s_tls_source_voice != nullptr); AUDIT(tls_source_voice != nullptr);
HRESULT hr = s_tls_source_voice->Stop(); HRESULT hr = tls_source_voice->Stop();
if (FAILED(hr)) if (FAILED(hr))
{ {
LOG_ERROR(GENERAL, "XAudio2Backend : Stop() failed(0x%08x)", (u32)hr); LOG_ERROR(GENERAL, "XAudio2Backend : Stop() failed(0x%08x)", (u32)hr);
@ -109,10 +109,10 @@ public:
virtual bool is_playing() override virtual bool is_playing() override
{ {
AUDIT(s_tls_source_voice != nullptr); AUDIT(tls_source_voice != nullptr);
XAUDIO2_VOICE_STATE state; XAUDIO2_VOICE_STATE state;
s_tls_source_voice->GetState(&state, XAUDIO2_VOICE_NOSAMPLESPLAYED); tls_source_voice->GetState(&state, XAUDIO2_VOICE_NOSAMPLESPLAYED);
return state.BuffersQueued > 0 || state.pCurrentBufferContext != nullptr; return state.BuffersQueued > 0 || state.pCurrentBufferContext != nullptr;
} }
@ -134,7 +134,7 @@ public:
waveformatex.wBitsPerSample = sample_size * 8; waveformatex.wBitsPerSample = sample_size * 8;
waveformatex.cbSize = 0; waveformatex.cbSize = 0;
hr = s_tls_xaudio2_instance->CreateSourceVoice(&s_tls_source_voice, &waveformatex, 0, XAUDIO2_DEFAULT_FREQ_RATIO); hr = tls_xaudio2_instance->CreateSourceVoice(&tls_source_voice, &waveformatex, 0, XAUDIO2_DEFAULT_FREQ_RATIO);
if (FAILED(hr)) if (FAILED(hr))
{ {
LOG_ERROR(GENERAL, "XAudio2Backend : CreateSourceVoice() failed(0x%08x)", (u32)hr); LOG_ERROR(GENERAL, "XAudio2Backend : CreateSourceVoice() failed(0x%08x)", (u32)hr);
@ -142,16 +142,16 @@ public:
return; return;
} }
AUDIT(s_tls_source_voice != nullptr); AUDIT(tls_source_voice != nullptr);
s_tls_source_voice->SetVolume(channels == 2 ? 1.0f : 4.0f); tls_source_voice->SetVolume(channels == 2 ? 1.0f : 4.0f);
} }
virtual bool add(const void* src, u32 num_samples) override virtual bool add(const void* src, u32 num_samples) override
{ {
AUDIT(s_tls_source_voice != nullptr); AUDIT(tls_source_voice != nullptr);
XAUDIO2_VOICE_STATE state; XAUDIO2_VOICE_STATE state;
s_tls_source_voice->GetState(&state, XAUDIO2_VOICE_NOSAMPLESPLAYED); tls_source_voice->GetState(&state, XAUDIO2_VOICE_NOSAMPLESPLAYED);
if (state.BuffersQueued >= MAX_AUDIO_BUFFERS) if (state.BuffersQueued >= MAX_AUDIO_BUFFERS)
{ {
@ -171,7 +171,7 @@ public:
buffer.PlayBegin = 0; buffer.PlayBegin = 0;
buffer.PlayLength = AUDIO_BUFFER_SAMPLES; buffer.PlayLength = AUDIO_BUFFER_SAMPLES;
HRESULT hr = s_tls_source_voice->SubmitSourceBuffer(&buffer); HRESULT hr = tls_source_voice->SubmitSourceBuffer(&buffer);
if (FAILED(hr)) if (FAILED(hr))
{ {
LOG_ERROR(GENERAL, "XAudio2Backend : AddData() failed(0x%08x)", (u32)hr); LOG_ERROR(GENERAL, "XAudio2Backend : AddData() failed(0x%08x)", (u32)hr);
@ -185,7 +185,7 @@ public:
virtual u64 enqueued_samples() override virtual u64 enqueued_samples() override
{ {
XAUDIO2_VOICE_STATE state; XAUDIO2_VOICE_STATE state;
s_tls_source_voice->GetState(&state); tls_source_voice->GetState(&state);
// all buffers contain AUDIO_BUFFER_SAMPLES, so we can easily calculate how many samples there are remaining // all buffers contain AUDIO_BUFFER_SAMPLES, so we can easily calculate how many samples there are remaining
return (AUDIO_BUFFER_SAMPLES - state.SamplesPlayed % AUDIO_BUFFER_SAMPLES) + (state.BuffersQueued * AUDIO_BUFFER_SAMPLES); return (AUDIO_BUFFER_SAMPLES - state.SamplesPlayed % AUDIO_BUFFER_SAMPLES) + (state.BuffersQueued * AUDIO_BUFFER_SAMPLES);
@ -195,7 +195,7 @@ public:
{ {
new_ratio = std::clamp(new_ratio, XAUDIO2_MIN_FREQ_RATIO, XAUDIO2_DEFAULT_FREQ_RATIO); new_ratio = std::clamp(new_ratio, XAUDIO2_MIN_FREQ_RATIO, XAUDIO2_DEFAULT_FREQ_RATIO);
HRESULT hr = s_tls_source_voice->SetFrequencyRatio(new_ratio); HRESULT hr = tls_source_voice->SetFrequencyRatio(new_ratio);
if (FAILED(hr)) if (FAILED(hr))
{ {
LOG_ERROR(GENERAL, "XAudio2Backend : SetFrequencyRatio() failed(0x%08x)", (u32)hr); LOG_ERROR(GENERAL, "XAudio2Backend : SetFrequencyRatio() failed(0x%08x)", (u32)hr);

View file

@ -45,14 +45,12 @@ void XAudio2Backend::Open(u32 /* num_buffers */)
} }
else if (hmodule = LoadLibraryExW(L"XAudio2_8.dll", nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32)) else if (hmodule = LoadLibraryExW(L"XAudio2_8.dll", nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32))
{ {
// XAudio 2.9 uses the same code as XAudio 2.8
lib.reset(xa28_init(hmodule)); lib.reset(xa28_init(hmodule));
LOG_SUCCESS(GENERAL, "XAudio 2.8 initialized"); LOG_SUCCESS(GENERAL, "XAudio 2.8 initialized");
} }
else if (hmodule = LoadLibraryExW(L"XAudio2_7.dll", nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32)) else if (hmodule = LoadLibraryExW(L"XAudio2_7.dll", nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32))
{ {
// XAudio 2.9 uses the same code as XAudio 2.8
lib.reset(xa27_init(hmodule)); lib.reset(xa27_init(hmodule));
LOG_SUCCESS(GENERAL, "XAudio 2.7 initialized"); LOG_SUCCESS(GENERAL, "XAudio 2.7 initialized");