]> git.sesse.net Git - vlc/blobdiff - modules/audio_output/alsa.c
Use the right declaration for threaded functions.
[vlc] / modules / audio_output / alsa.c
index f81ac2880f0bab3784ef575dda0ab28415399da2..325fa5f733736c572be256a4f37655d853c6aacc 100644 (file)
@@ -31,7 +31,7 @@
 # include "config.h"
 #endif
 
-#include <vlc/vlc.h>
+#include <vlc_common.h>
 #include <vlc_plugin.h>
 
 #include <errno.h>                                                 /* ENOMEM */
@@ -90,22 +90,22 @@ struct aout_sys_t
 /*****************************************************************************
  * Local prototypes
  *****************************************************************************/
-static int  Open         ( vlc_object_t * );
-static void Close        ( vlc_object_t * );
-static void Play         ( aout_instance_t * );
-static int  ALSAThread   ( aout_instance_t * );
-static void ALSAFill     ( aout_instance_t * );
+static int   Open         ( vlc_object_t * );
+static void  Close        ( vlc_object_t * );
+static void  Play         ( aout_instance_t * );
+static void* ALSAThread   ( vlc_object_t * );
+static void  ALSAFill     ( aout_instance_t * );
 static int FindDevicesCallback( vlc_object_t *p_this, char const *psz_name,
                                 vlc_value_t newval, vlc_value_t oldval, void *p_unused );
 
 /*****************************************************************************
  * 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,
@@ -313,10 +313,7 @@ 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 );
@@ -733,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;
 
@@ -760,23 +760,24 @@ static void Close( vlc_object_t *p_this )
 /*****************************************************************************
  * ALSAThread: asynchronous thread used to DMA the data to the device
  *****************************************************************************/
-static int ALSAThread( aout_instance_t * p_aout )
+static void* ALSAThread( vlc_object_t* p_this )
 {
+    aout_instance_t * p_aout = (aout_instance_t*)p_this;
     struct aout_sys_t * p_sys = p_aout->output.p_sys;
     p_sys->p_status = (snd_pcm_status_t *)malloc(snd_pcm_status_sizeof());
 
     /* 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 );
     }
@@ -784,7 +785,7 @@ static int ALSAThread( aout_instance_t * p_aout )
 cleanup:
     snd_pcm_drop( p_sys->p_snd_pcm );
     free( p_aout->output.p_sys->p_status );
-    return 0;
+    return NULL;
 }
 
 /*****************************************************************************
@@ -879,7 +880,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 );