From: Dan Dennedy Date: Thu, 21 Apr 2011 23:36:34 +0000 (-0700) Subject: Fix deadlock in sdl_audio appearing in kdenlive. X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=48da805e6ec33ad09760df7c7fc82678a3d00773;p=mlt Fix deadlock in sdl_audio appearing in kdenlive. --- diff --git a/src/modules/sdl/consumer_sdl_audio.c b/src/modules/sdl/consumer_sdl_audio.c index 552e9d20..fecdf236 100644 --- a/src/modules/sdl/consumer_sdl_audio.c +++ b/src/modules/sdl/consumer_sdl_audio.c @@ -157,10 +157,6 @@ int consumer_start( mlt_consumer parent ) { consumer_stop( parent ); - this->running = 1; - this->joined = 0; - - pthread_mutex_lock( &mlt_sdl_mutex ); int ret = SDL_Init( SDL_INIT_AUDIO | SDL_INIT_NOPARACHUTE ); pthread_mutex_unlock( &mlt_sdl_mutex ); @@ -170,6 +166,8 @@ int consumer_start( mlt_consumer parent ) return -1; } + this->running = 1; + this->joined = 0; pthread_create( &this->thread, NULL, consumer_thread, this ); } @@ -181,7 +179,7 @@ int consumer_stop( mlt_consumer parent ) // Get the actual object consumer_sdl this = parent->child; - if ( this->joined == 0 ) + if ( this->running && !this->joined ) { // Kill the thread and clean up this->joined = 1; @@ -198,12 +196,18 @@ int consumer_stop( mlt_consumer parent ) #endif pthread_join( this->thread, NULL ); + // Unlatch the video thread + pthread_mutex_lock( &this->video_mutex ); + pthread_cond_broadcast( &this->video_cond ); + pthread_mutex_unlock( &this->video_mutex ); + // Unlatch the audio callback pthread_mutex_lock( &this->audio_mutex ); pthread_cond_broadcast( &this->audio_cond ); pthread_mutex_unlock( &this->audio_mutex ); - SDL_QuitSubSystem( SDL_INIT_AUDIO ); + if ( this->playing ) + SDL_QuitSubSystem( SDL_INIT_AUDIO ); } return 0;