]> git.sesse.net Git - vlc/blobdiff - modules/audio_output/alsa.c
Fixed infinite loop if alsa was closed before playing any audio.
[vlc] / modules / audio_output / alsa.c
index 4380a170f7d7baf7ae430f72d83376b0c6cd4f89..e16a05f78543c0b3397431cfe6be22ec4db28e57 100644 (file)
@@ -31,7 +31,8 @@
 # include "config.h"
 #endif
 
-#include <vlc/vlc.h>
+#include <vlc_common.h>
+#include <vlc_plugin.h>
 
 #include <errno.h>                                                 /* ENOMEM */
 #include <vlc_interface.h>
@@ -100,11 +101,11 @@ static int FindDevicesCallback( vlc_object_t *p_this, char const *psz_name,
 /*****************************************************************************
  * Module descriptor
  *****************************************************************************/
-static const char *ppsz_devices[] = { "default" };
-static const char *ppsz_devices_text[] = { N_("Default") };
+static const char *const ppsz_devices[] = { "default" };
+static const char *const ppsz_devices_text[] = { N_("Default") };
 vlc_module_begin();
     set_shortname( "ALSA" );
-    set_description( _("ALSA audio output") );
+    set_description( N_("ALSA audio output") );
     set_category( CAT_AUDIO );
     set_subcategory( SUBCAT_AUDIO_AOUT );
     add_string( "alsadev", DEFAULT_ALSA_DEVICE, aout_FindAndRestart,
@@ -312,14 +313,11 @@ static int Open( vlc_object_t *p_this )
     /* Allocate structures */
     p_aout->output.p_sys = p_sys = malloc( sizeof( aout_sys_t ) );
     if( p_sys == NULL )
-    {
-        msg_Err( p_aout, "out of memory" );
         return VLC_ENOMEM;
-    }
     p_sys->b_playing = false;
     p_sys->start_date = 0;
     vlc_cond_init( p_aout, &p_sys->wait );
-    vlc_mutex_init( p_aout, &p_sys->lock );
+    vlc_mutex_init( &p_sys->lock );
 
     /* Get device name */
     if( (psz_device = config_GetPsz( p_aout, "alsadev" )) == NULL )
@@ -732,12 +730,15 @@ static void Close( vlc_object_t *p_this )
     struct aout_sys_t * p_sys = p_aout->output.p_sys;
     int i_snd_rc;
 
+    /* Make sure that the thread will stop once it is waken up */
+    vlc_object_kill( p_aout );
+
     /* make sure the audio output thread is waken up */
     vlc_mutex_lock( &p_aout->output.p_sys->lock );
     vlc_cond_signal( &p_aout->output.p_sys->wait );
     vlc_mutex_unlock( &p_aout->output.p_sys->lock );
 
-    vlc_object_kill( p_aout );
+    /* */
     vlc_thread_join( p_aout );
     p_aout->b_die = false;
 
@@ -766,16 +767,16 @@ static int ALSAThread( aout_instance_t * p_aout )
 
     /* Wait for the exact time to start playing (avoids resampling) */
     vlc_mutex_lock( &p_sys->lock );
-    while( !p_sys->start_date && !p_aout->b_die )
+    while( !p_sys->start_date && vlc_object_alive (p_aout) )
         vlc_cond_wait( &p_sys->wait, &p_sys->lock );
     vlc_mutex_unlock( &p_sys->lock );
 
-    if( p_aout->b_die )
+    if( !vlc_object_alive (p_aout) )
        goto cleanup;
 
     mwait( p_sys->start_date - AOUT_PTS_TOLERANCE / 4 );
 
-    while ( !p_aout->b_die )
+    while ( vlc_object_alive (p_aout) )
     {
         ALSAFill( p_aout );
     }
@@ -878,7 +879,7 @@ static void ALSAFill( aout_instance_t * p_aout )
          * (stream is suspended and waiting for an application recovery) */
         msg_Dbg( p_aout, "entering in suspend mode, trying to resume..." );
 
-        while( !p_aout->b_die && !p_aout->p_libvlc->b_die &&
+        while( vlc_object_alive (p_aout) && vlc_object_alive (p_aout->p_libvlc) &&
                ( i_snd_rc = snd_pcm_resume( p_sys->p_snd_pcm ) ) == -EAGAIN )
         {
             msleep( 1000000 );