From 9bf7adfc1fcf1e57b5279f3d56983bc222366562 Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Mon, 21 Dec 2015 10:51:27 -0300 Subject: [PATCH] -another approach to solving the deadlock problem :| --- scene/audio/stream_player.cpp | 7 +++++- scene/audio/stream_player.h | 1 + servers/audio/audio_server_sw.cpp | 39 +++++++++++-------------------- 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/scene/audio/stream_player.cpp b/scene/audio/stream_player.cpp index 4cfca0492a99..d08fdd0c765a 100644 --- a/scene/audio/stream_player.cpp +++ b/scene/audio/stream_player.cpp @@ -75,7 +75,10 @@ void StreamPlayer::sp_update() { //check that all this audio has been flushed before stopping the stream int to_mix = resampler.get_total() - resampler.get_todo(); if (to_mix==0) { - stop(); + if (!stop_request) { + stop_request=true; + call_deferred("stop"); + } return; } @@ -164,6 +167,7 @@ void StreamPlayer::stop() { //_THREAD_SAFE_METHOD_ AudioServer::get_singleton()->stream_set_active(stream_rid,false); + stop_request=false; playback->stop(); resampler.flush(); @@ -389,6 +393,7 @@ StreamPlayer::StreamPlayer() { stream_rid=AudioServer::get_singleton()->audio_stream_create(&internal_stream); buffering_ms=500; loop_point=0; + stop_request=false; } diff --git a/scene/audio/stream_player.h b/scene/audio/stream_player.h index be090f50e140..0a29e78de7be 100644 --- a/scene/audio/stream_player.h +++ b/scene/audio/stream_player.h @@ -66,6 +66,7 @@ class StreamPlayer : public Node { float volume; float loop_point; int buffering_ms; + volatile bool stop_request; AudioRBResampler resampler; diff --git a/servers/audio/audio_server_sw.cpp b/servers/audio/audio_server_sw.cpp index a20e0e4ab576..b4723fdc2583 100644 --- a/servers/audio/audio_server_sw.cpp +++ b/servers/audio/audio_server_sw.cpp @@ -30,10 +30,6 @@ #include "globals.h" #include "os/os.h" -#ifdef NO_THREADS -#define NO_AUDIO_THREADS -#endif - struct _AudioDriverLock { _AudioDriverLock() { if (AudioDriverSW::get_singleton()) AudioDriverSW::get_singleton()->lock(); } @@ -663,7 +659,7 @@ bool AudioServerSW::voice_is_active(RID p_voice) const { RID AudioServerSW::audio_stream_create(AudioStream *p_stream) { - AUDIO_LOCK + AUDIO_LOCK Stream *s = memnew(Stream); s->audio_stream=p_stream; s->event_stream=NULL; @@ -701,24 +697,16 @@ void AudioServerSW::stream_set_active(RID p_stream, bool p_active) { if (s->active==p_active) return; - if (!thread || thread->get_ID()!=Thread::get_caller_ID()) { - //do not lock in mix thread - lock(); - } - { - s->active=p_active; - if (p_active) - s->E=active_audio_streams.push_back(s); - else { - active_audio_streams.erase(s->E); - s->E=NULL; - } - } - if (!thread || thread->get_ID()!=Thread::get_caller_ID()) { - //do not lock in mix thread - unlock(); + AUDIO_LOCK; + s->active=p_active; + if (p_active) + s->E=active_audio_streams.push_back(s); + else { + active_audio_streams.erase(s->E); + s->E=NULL; } + } bool AudioServerSW::stream_is_active(RID p_stream) const { @@ -779,7 +767,7 @@ void AudioServerSW::_thread_func(void *self) { AudioServerSW *as=(AudioServerSW *)self; - //as->thread->set_name("AudioServerSW"); + as->thread->set_name("AudioServerSW"); while (!as->exit_update_thread) { as->_update_streams(true); @@ -818,17 +806,16 @@ void AudioServerSW::init() { if (AudioDriverSW::get_singleton()) AudioDriverSW::get_singleton()->start(); -#ifndef NO_AUDIO_THREADS +#ifndef NO_THREADS exit_update_thread=false; thread = Thread::create(_thread_func,this); - thread->set_name("AudioServerSW"); #endif } void AudioServerSW::finish() { -#ifndef NO_AUDIO_THREADS +#ifndef NO_THREADS exit_update_thread=true; Thread::wait_to_finish(thread); memdelete(thread); @@ -861,7 +848,7 @@ void AudioServerSW::_update_streams(bool p_thread) { void AudioServerSW::update() { _update_streams(false); -#ifdef NO_AUDIO_THREADS +#ifdef NO_THREADS _update_streams(true); #endif