Fix double finalisation of audio drivers

This commit is contained in:
Marcelo Fernandez 2017-08-02 11:45:19 -03:00
parent 0586524b9c
commit 1ca107a057
4 changed files with 18 additions and 15 deletions

View File

@ -79,7 +79,7 @@ int AudioDriverRtAudio::callback(void *outputBuffer, void *inputBuffer, unsigned
Error AudioDriverRtAudio::init() { Error AudioDriverRtAudio::init() {
active = false; active = false;
mutex = NULL; mutex = Mutex::create(true);
dac = memnew(RtAudio); dac = memnew(RtAudio);
ERR_EXPLAIN("Cannot initialize RtAudio audio driver: No devices present.") ERR_EXPLAIN("Cannot initialize RtAudio audio driver: No devices present.")
@ -136,7 +136,6 @@ Error AudioDriverRtAudio::init() {
try { try {
dac->openStream(&parameters, NULL, RTAUDIO_SINT32, mix_rate, &buffer_size, &callback, this, &options); dac->openStream(&parameters, NULL, RTAUDIO_SINT32, mix_rate, &buffer_size, &callback, this, &options);
mutex = Mutex::create(true);
active = true; active = true;
break; break;
@ -162,6 +161,7 @@ Error AudioDriverRtAudio::init() {
try { try {
dac->closeStream(); dac->closeStream();
active = false;
} catch (RtAudioError &e) { } catch (RtAudioError &e) {
ERR_PRINT(e.what()); ERR_PRINT(e.what());
ERR_FAIL_V(ERR_UNAVAILABLE); ERR_FAIL_V(ERR_UNAVAILABLE);
@ -212,17 +212,27 @@ void AudioDriverRtAudio::unlock() {
void AudioDriverRtAudio::finish() { void AudioDriverRtAudio::finish() {
if (active && dac->isStreamOpen()) lock();
if (active && dac->isStreamOpen()) {
dac->closeStream(); dac->closeStream();
if (mutex) active = false;
}
unlock();
if (mutex) {
memdelete(mutex); memdelete(mutex);
if (dac) mutex = NULL;
}
if (dac) {
memdelete(dac); memdelete(dac);
dac = NULL;
}
} }
AudioDriverRtAudio::AudioDriverRtAudio() { AudioDriverRtAudio::AudioDriverRtAudio() {
mutex = NULL; mutex = NULL;
dac = NULL;
mix_rate = 44100; mix_rate = 44100;
speaker_mode = SPEAKER_MODE_STEREO; speaker_mode = SPEAKER_MODE_STEREO;
} }

View File

@ -1192,10 +1192,6 @@ void OS_Windows::finalize() {
main_loop = NULL; main_loop = NULL;
for (int i = 0; i < get_audio_driver_count(); i++) {
AudioDriverManager::get_driver(i)->finish();
}
memdelete(joypad); memdelete(joypad);
memdelete(input); memdelete(input);

View File

@ -529,10 +529,6 @@ void OS_X11::finalize() {
memdelete(main_loop); memdelete(main_loop);
main_loop = NULL; main_loop = NULL;
for (int i = 0; i < get_audio_driver_count(); i++) {
AudioDriverManager::get_driver(i)->finish();
}
/* /*
if (debugger_connection_console) { if (debugger_connection_console) {
memdelete(debugger_connection_console); memdelete(debugger_connection_console);

View File

@ -772,10 +772,11 @@ void AudioServer::finish() {
buses.clear(); buses.clear();
if (AudioDriver::get_singleton()) { for (int i = 0; i < AudioDriverManager::get_driver_count(); i++) {
AudioDriver::get_singleton()->finish(); AudioDriverManager::get_driver(i)->finish();
} }
} }
void AudioServer::update() { void AudioServer::update() {
} }