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()
{
if (s_tls_sw_params || s_tls_hw_params || s_tls_handle)
if (tls_sw_params || tls_hw_params || tls_handle)
{
Close();
}
@ -36,71 +36,71 @@ ALSABackend::~ALSABackend()
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;
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;
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;
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;
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;
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;
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;
//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;
//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;
snd_pcm_uframes_t bufsize_frames = num_buffers * 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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
if (!check(snd_pcm_prepare(s_tls_handle), "snd_pcm_prepare"))
if (!check(snd_pcm_prepare(tls_handle), "snd_pcm_prepare"))
return;
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()
{
if (s_tls_sw_params)
if (tls_sw_params)
{
snd_pcm_sw_params_free(s_tls_sw_params);
s_tls_sw_params = nullptr;
snd_pcm_sw_params_free(tls_sw_params);
tls_sw_params = nullptr;
}
if (s_tls_hw_params)
if (tls_hw_params)
{
snd_pcm_hw_params_free(s_tls_hw_params);
s_tls_hw_params = nullptr;
snd_pcm_hw_params_free(tls_hw_params);
tls_hw_params = nullptr;
}
if (s_tls_handle)
if (tls_handle)
{
snd_pcm_close(s_tls_handle);
s_tls_handle = nullptr;
snd_pcm_close(tls_handle);
tls_handle = nullptr;
}
}
@ -131,7 +131,7 @@ bool ALSABackend::AddData(const void* src, u32 num_samples)
{
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)
{
@ -141,7 +141,7 @@ bool ALSABackend::AddData(const void* src, u32 num_samples)
if (res < 0)
{
res = snd_pcm_recover(s_tls_handle, res, 0);
res = snd_pcm_recover(tls_handle, res, 0);
if (res < 0)
{
@ -149,7 +149,7 @@ bool ALSABackend::AddData(const void* src, u32 num_samples)
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)

View File

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

View File

@ -9,14 +9,14 @@
class XAudio27Library : public XAudio2Backend::XAudio2Library
{
const HMODULE s_tls_xaudio2_lib;
IXAudio2* s_tls_xaudio2_instance{};
IXAudio2MasteringVoice* s_tls_master_voice{};
IXAudio2SourceVoice* s_tls_source_voice{};
const HMODULE tls_xaudio2_lib;
IXAudio2* tls_xaudio2_instance{};
IXAudio2MasteringVoice* tls_master_voice{};
IXAudio2SourceVoice* tls_source_voice{};
public:
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;
@ -28,7 +28,7 @@ public:
return;
}
hr = XAudio2Create(&s_tls_xaudio2_instance, 0, XAUDIO2_DEFAULT_PROCESSOR);
hr = XAudio2Create(&tls_xaudio2_instance, 0, XAUDIO2_DEFAULT_PROCESSOR);
if (FAILED(hr))
{
LOG_ERROR(GENERAL, "XAudio2Backend : XAudio2Create() failed(0x%08x)", (u32)hr);
@ -36,42 +36,42 @@ public:
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))
{
LOG_ERROR(GENERAL, "XAudio2Backend : CreateMasteringVoice() failed(0x%08x)", (u32)hr);
s_tls_xaudio2_instance->Release();
tls_xaudio2_instance->Release();
Emu.Pause();
}
}
~XAudio27Library()
{
if (s_tls_source_voice != nullptr)
if (tls_source_voice != nullptr)
{
s_tls_source_voice->Stop();
s_tls_source_voice->DestroyVoice();
tls_source_voice->Stop();
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();
s_tls_xaudio2_instance->Release();
tls_xaudio2_instance->StopEngine();
tls_xaudio2_instance->Release();
}
CoUninitialize();
FreeLibrary(s_tls_xaudio2_lib);
FreeLibrary(tls_xaudio2_lib);
}
virtual void play() override
{
HRESULT hr = s_tls_source_voice->Start();
HRESULT hr = tls_source_voice->Start();
if (FAILED(hr))
{
LOG_ERROR(GENERAL, "XAudio2Backend : Start() failed(0x%08x)", (u32)hr);
@ -81,7 +81,7 @@ public:
virtual void flush() override
{
HRESULT hr = s_tls_source_voice->FlushSourceBuffers();
HRESULT hr = tls_source_voice->FlushSourceBuffers();
if (FAILED(hr))
{
LOG_ERROR(GENERAL, "XAudio2Backend : FlushSourceBuffers() failed(0x%08x)", (u32)hr);
@ -91,7 +91,7 @@ public:
virtual void stop() override
{
HRESULT hr = s_tls_source_voice->Stop();
HRESULT hr = tls_source_voice->Stop();
if (FAILED(hr))
{
LOG_ERROR(GENERAL, "XAudio2Backend : Stop() failed(0x%08x)", (u32)hr);
@ -102,7 +102,7 @@ public:
virtual bool is_playing() override
{
XAUDIO2_VOICE_STATE state;
s_tls_source_voice->GetState(&state);
tls_source_voice->GetState(&state);
return state.BuffersQueued > 0 || state.pCurrentBufferContext != nullptr;
}
@ -124,7 +124,7 @@ public:
waveformatex.wBitsPerSample = sample_size * 8;
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))
{
LOG_ERROR(GENERAL, "XAudio2Backend : CreateSourceVoice() failed(0x%08x)", (u32)hr);
@ -132,13 +132,13 @@ public:
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
{
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
if (state.BuffersQueued >= MAX_AUDIO_BUFFERS)
@ -159,7 +159,7 @@ public:
buffer.PlayBegin = 0;
buffer.PlayLength = AUDIO_BUFFER_SAMPLES;
HRESULT hr = s_tls_source_voice->SubmitSourceBuffer(&buffer);
HRESULT hr = tls_source_voice->SubmitSourceBuffer(&buffer);
if (FAILED(hr))
{
LOG_ERROR(GENERAL, "XAudio2Backend : AddData() failed(0x%08x)", (u32)hr);
@ -173,7 +173,7 @@ public:
virtual u64 enqueued_samples() override
{
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
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);
HRESULT hr = s_tls_source_voice->SetFrequencyRatio(new_ratio);
HRESULT hr = tls_source_voice->SetFrequencyRatio(new_ratio);
if (FAILED(hr))
{
LOG_ERROR(GENERAL, "XAudio2Backend : SetFrequencyRatio() failed(0x%08x)", (u32)hr);

View File

@ -9,16 +9,16 @@
class XAudio28Library : public XAudio2Backend::XAudio2Library
{
const HMODULE s_tls_xaudio2_lib;
IXAudio2* s_tls_xaudio2_instance{};
IXAudio2MasteringVoice* s_tls_master_voice{};
IXAudio2SourceVoice* s_tls_source_voice{};
const HMODULE tls_xaudio2_lib;
IXAudio2* tls_xaudio2_instance{};
IXAudio2MasteringVoice* tls_master_voice{};
IXAudio2SourceVoice* tls_source_voice{};
public:
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;
@ -30,7 +30,7 @@ public:
return;
}
hr = create(&s_tls_xaudio2_instance, 0, XAUDIO2_DEFAULT_PROCESSOR);
hr = create(&tls_xaudio2_instance, 0, XAUDIO2_DEFAULT_PROCESSOR);
if (FAILED(hr))
{
LOG_ERROR(GENERAL, "XAudio2Backend : XAudio2Create() failed(0x%08x)", (u32)hr);
@ -38,44 +38,44 @@ public:
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))
{
LOG_ERROR(GENERAL, "XAudio2Backend : CreateMasteringVoice() failed(0x%08x)", (u32)hr);
s_tls_xaudio2_instance->Release();
tls_xaudio2_instance->Release();
Emu.Pause();
}
}
~XAudio28Library()
{
if (s_tls_source_voice != nullptr)
if (tls_source_voice != nullptr)
{
s_tls_source_voice->Stop();
s_tls_source_voice->DestroyVoice();
tls_source_voice->Stop();
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();
s_tls_xaudio2_instance->Release();
tls_xaudio2_instance->StopEngine();
tls_xaudio2_instance->Release();
}
CoUninitialize();
FreeLibrary(s_tls_xaudio2_lib);
FreeLibrary(tls_xaudio2_lib);
}
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))
{
LOG_ERROR(GENERAL, "XAudio2Backend : Start() failed(0x%08x)", (u32)hr);
@ -85,9 +85,9 @@ public:
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))
{
LOG_ERROR(GENERAL, "XAudio2Backend : FlushSourceBuffers() failed(0x%08x)", (u32)hr);
@ -97,9 +97,9 @@ public:
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))
{
LOG_ERROR(GENERAL, "XAudio2Backend : Stop() failed(0x%08x)", (u32)hr);
@ -109,10 +109,10 @@ public:
virtual bool is_playing() override
{
AUDIT(s_tls_source_voice != nullptr);
AUDIT(tls_source_voice != nullptr);
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;
}
@ -134,7 +134,7 @@ public:
waveformatex.wBitsPerSample = sample_size * 8;
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))
{
LOG_ERROR(GENERAL, "XAudio2Backend : CreateSourceVoice() failed(0x%08x)", (u32)hr);
@ -142,16 +142,16 @@ public:
return;
}
AUDIT(s_tls_source_voice != nullptr);
s_tls_source_voice->SetVolume(channels == 2 ? 1.0f : 4.0f);
AUDIT(tls_source_voice != nullptr);
tls_source_voice->SetVolume(channels == 2 ? 1.0f : 4.0f);
}
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;
s_tls_source_voice->GetState(&state, XAUDIO2_VOICE_NOSAMPLESPLAYED);
tls_source_voice->GetState(&state, XAUDIO2_VOICE_NOSAMPLESPLAYED);
if (state.BuffersQueued >= MAX_AUDIO_BUFFERS)
{
@ -171,7 +171,7 @@ public:
buffer.PlayBegin = 0;
buffer.PlayLength = AUDIO_BUFFER_SAMPLES;
HRESULT hr = s_tls_source_voice->SubmitSourceBuffer(&buffer);
HRESULT hr = tls_source_voice->SubmitSourceBuffer(&buffer);
if (FAILED(hr))
{
LOG_ERROR(GENERAL, "XAudio2Backend : AddData() failed(0x%08x)", (u32)hr);
@ -185,7 +185,7 @@ public:
virtual u64 enqueued_samples() override
{
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
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);
HRESULT hr = s_tls_source_voice->SetFrequencyRatio(new_ratio);
HRESULT hr = tls_source_voice->SetFrequencyRatio(new_ratio);
if (FAILED(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))
{
// XAudio 2.9 uses the same code as XAudio 2.8
lib.reset(xa28_init(hmodule));
LOG_SUCCESS(GENERAL, "XAudio 2.8 initialized");
}
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));
LOG_SUCCESS(GENERAL, "XAudio 2.7 initialized");