Fix memory management of XAudio2 driver

This commit is contained in:
George Marques 2016-10-17 14:42:05 -02:00
parent f3102160a1
commit 05bf24b9a5
No known key found for this signature in database
GPG key ID: 046BD46A3201E43D
2 changed files with 5 additions and 8 deletions

View file

@ -80,9 +80,7 @@ Error AudioDriverXAudio2::init() {
wave_format.nBlockAlign = channels * wave_format.wBitsPerSample >> 3; wave_format.nBlockAlign = channels * wave_format.wBitsPerSample >> 3;
wave_format.nAvgBytesPerSec = mix_rate * wave_format.nBlockAlign; wave_format.nAvgBytesPerSec = mix_rate * wave_format.nBlockAlign;
voice_callback = memnew(XAudio2DriverVoiceCallback); hr = xaudio->CreateSourceVoice(&source_voice, &wave_format, 0, XAUDIO2_MAX_FREQ_RATIO, &voice_callback);
hr = xaudio->CreateSourceVoice(&source_voice, &wave_format, 0, XAUDIO2_MAX_FREQ_RATIO, voice_callback);
if (hr != S_OK) { if (hr != S_OK) {
ERR_EXPLAIN("Error creating XAudio2 source voice. " + itos(hr)); ERR_EXPLAIN("Error creating XAudio2 source voice. " + itos(hr));
ERR_FAIL_V(ERR_UNAVAILABLE); ERR_FAIL_V(ERR_UNAVAILABLE);
@ -133,7 +131,7 @@ void AudioDriverXAudio2::thread_func(void* p_udata) {
XAUDIO2_VOICE_STATE state; XAUDIO2_VOICE_STATE state;
while (ad->source_voice->GetState(&state), state.BuffersQueued > AUDIO_BUFFERS - 1) while (ad->source_voice->GetState(&state), state.BuffersQueued > AUDIO_BUFFERS - 1)
{ {
WaitForSingleObject(ad->voice_callback->buffer_end_event, INFINITE); WaitForSingleObject(ad->voice_callback.buffer_end_event, INFINITE);
} }
} }
@ -197,7 +195,7 @@ void AudioDriverXAudio2::finish() {
if (source_voice) { if (source_voice) {
source_voice->Stop(0); source_voice->Stop(0);
memdelete(source_voice); source_voice->DestroyVoice();
} }
if (samples_in) { if (samples_in) {
@ -209,8 +207,7 @@ void AudioDriverXAudio2::finish() {
} }
}; };
memdelete(voice_callback); mastering_voice->DestroyVoice();
memdelete(mastering_voice);
memdelete(thread); memdelete(thread);
if (mutex) if (mutex)

View file

@ -87,7 +87,7 @@ class AudioDriverXAudio2 : public AudioDriverSW {
IXAudio2MasteringVoice* mastering_voice; IXAudio2MasteringVoice* mastering_voice;
XAUDIO2_BUFFER xaudio_buffer[AUDIO_BUFFERS]; XAUDIO2_BUFFER xaudio_buffer[AUDIO_BUFFERS];
IXAudio2SourceVoice* source_voice; IXAudio2SourceVoice* source_voice;
XAudio2DriverVoiceCallback* voice_callback; XAudio2DriverVoiceCallback voice_callback;
public: public: