]> git.sesse.net Git - vlc/blobdiff - modules/gui/qnx/aout.c
Remove CDDAX module
[vlc] / modules / gui / qnx / aout.c
index 17a9d045ca4617f23336ce2d30468504c816c8e5..10e06d9f15aa53b5b8d5d41265fa97aec0d32a1c 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * aout.c : QNX audio output
  *****************************************************************************
- * Copyright (C) 2000, 2001 VideoLAN
+ * Copyright (C) 2000, 2001 the VideoLAN team
  *
  * Authors: Henri Fallon <henri@videolan.org>
  *          Jon Lech Johansen <jon-vl@nanocrew.net>
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
 /*****************************************************************************
  * Preamble
  *****************************************************************************/
 #include <errno.h>                                                 /* ENOMEM */
-#include <string.h>                                            /* strerror() */
-#include <stdlib.h>                            /* calloc(), malloc(), free() */
 
-#include <vlc/vlc.h>
-
-#ifdef HAVE_ALLOCA_H
-#   include <alloca.h>
+#ifdef HAVE_CONFIG_H
+# include "config.h"
 #endif
 
-#include <vlc/aout.h>
-#include "aout_internal.h"
+#include <vlc_common.h>
+
+#include <vlc_aout.h>
 
 #include <sys/asoundlib.h>
 
@@ -46,7 +43,7 @@ struct aout_sys_t
     int          i_card;
     int          i_device;
 
-    byte_t *     p_silent_buffer;
+    uint8_t *    p_silent_buffer;
 };
 
 #define DEFAULT_FRAME_SIZE 2048
@@ -54,22 +51,23 @@ struct aout_sys_t
 /*****************************************************************************
  * Local prototypes
  *****************************************************************************/
-int            E_(OpenAudio)    ( vlc_object_t *p_this );
-void           E_(CloseAudio)   ( vlc_object_t *p_this );
+int            OpenAudio    ( vlc_object_t *p_this );
+void           CloseAudio   ( vlc_object_t *p_this );
 static int     GetBufInfo       ( aout_instance_t * );
 static void    Play             ( aout_instance_t * );
-static int     QNXaoutThread    ( aout_instance_t * );
+static void*   QNXaoutThread    ( vlc_object_t * );
 
 /*****************************************************************************
  * Open : creates a handle and opens an alsa device
  *****************************************************************************
  * This function opens an alsa device, through the alsa API
  *****************************************************************************/
-int E_(OpenAudio)( vlc_object_t *p_this )
+int OpenAudio( vlc_object_t *p_this )
 {
     aout_instance_t *p_aout = (aout_instance_t *)p_this;
     int i_ret;
     int i_bytes_per_sample;
+    int i_nb_channels;
     snd_pcm_channel_info_t pi;
     snd_pcm_channel_params_t pp;
     aout_instance_t *p_aout = (aout_instance_t *)p_this;
@@ -77,10 +75,7 @@ int E_(OpenAudio)( vlc_object_t *p_this )
     /* allocate structure */
     p_aout->output.p_sys = malloc( sizeof( aout_sys_t ) );
     if( p_aout->output.p_sys == NULL )
-    {
-        msg_Err( p_aout, "out of memory" );
         return -1;
-    }
 
     /* open audio device */
     if( ( i_ret = snd_pcm_open_preferred( &p_aout->output.p_sys->p_pcm_handle,
@@ -99,7 +94,7 @@ int E_(OpenAudio)( vlc_object_t *p_this )
                                               PLUGIN_DISABLE_MMAP ) ) < 0 )
     {
         msg_Err( p_aout, "unable to disable mmap (%s)", snd_strerror(i_ret) );
-        E_(CloseAudio)( p_this );
+        CloseAudio( p_this );
         free( p_aout->output.p_sys );
         return -1;
     }
@@ -117,6 +112,8 @@ int E_(OpenAudio)( vlc_object_t *p_this )
     {
         msg_Err( p_aout, "unable to get plugin info (%s)",
                          snd_strerror( i_ret ) );
+        CloseAudio( p_this );
+        free( p_aout->output.p_sys );
         return -1;
     }
 
@@ -130,23 +127,20 @@ int E_(OpenAudio)( vlc_object_t *p_this )
 
     pp.format.interleave     = 1;
     pp.format.rate           = p_aout->output.output.i_rate;
-    pp.format.voices         = p_aout->output.output.i_channels;
-
-    p_aout->output.output.i_format = AOUT_FMT_S16_NE;
-    p_aout->output.i_nb_samples = DEFAULT_FRAME_SIZE;
 
-    switch( p_aout->output.output.i_format )
+    i_nb_channels = aout_FormatNbChannels( &p_aout->output.output );
+    if ( i_nb_channels > 2 )
     {
-        case AOUT_FMT_S16_LE:
-            pp.format.format = SND_PCM_SFMT_S16_LE;
-            i_bytes_per_sample = 2;
-            break;
-
-        default:
-            pp.format.format = SND_PCM_SFMT_S16_BE;
-            i_bytes_per_sample = 2;
-            break;
+        /* I don't know if QNX supports more than two channels. */
+        i_nb_channels = 2;
+        p_aout->output.output.i_channels = AOUT_CHAN_STEREO;
     }
+    pp.format.voices         = i_nb_channels;
+
+    p_aout->output.output.i_format = VLC_CODEC_S16N;
+    p_aout->output.i_nb_samples = DEFAULT_FRAME_SIZE;
+    pp.format.format = SND_PCM_SFMT_S16;
+    i_bytes_per_sample = 2;
 
     pp.buf.block.frag_size = p_aout->output.i_nb_samples *
                             p_aout->output.output.i_channels *
@@ -157,6 +151,8 @@ int E_(OpenAudio)( vlc_object_t *p_this )
                                          &pp ) ) < 0 )
     {
         msg_Err( p_aout, "unable to set parameters (%s)", snd_strerror(i_ret) );
+        CloseAudio( p_this );
+        free( p_aout->output.p_sys );
         return -1;
     }
 
@@ -166,15 +162,17 @@ int E_(OpenAudio)( vlc_object_t *p_this )
     {
         msg_Err( p_aout, "unable to prepare channel (%s)",
                          snd_strerror( i_ret ) );
+        CloseAudio( p_this );
+        free( p_aout->output.p_sys );
         return -1;
     }
 
     /* Create audio thread and wait for its readiness. */
     if( vlc_thread_create( p_aout, "aout", QNXaoutThread,
-                           VLC_THREAD_PRIORITY_OUTPUT, VLC_FALSE ) )
+                           VLC_THREAD_PRIORITY_OUTPUT ) )
     {
-        msg_Err( p_aout, "cannot create QNX audio thread (%s)", strerror(errno) );
-        E_(CloseAudio)( p_this );
+        msg_Err( p_aout, "cannot create QNX audio thread (%m)" );
+        CloseAudio( p_this );
         free( p_aout->output.p_sys );
         return -1;
     }
@@ -234,12 +232,12 @@ static void Play( aout_instance_t *p_aout )
 /*****************************************************************************
  * CloseAudio: close the audio device
  *****************************************************************************/
-void E_(CloseAudio) ( vlc_object_t *p_this )
+void CloseAudio ( vlc_object_t *p_this )
 {
     aout_instance_t *p_aout = (aout_instance_t *)p_this;
     int i_ret;
 
-    p_aout->b_die = 1;
+    vlc_object_kill( p_aout );
     vlc_thread_join( p_aout );
 
     if( ( i_ret = snd_pcm_close( p_aout->output.p_sys->p_pcm_handle ) ) < 0 )
@@ -256,17 +254,19 @@ void E_(CloseAudio) ( vlc_object_t *p_this )
 /*****************************************************************************
  * QNXaoutThread: asynchronous thread used to DMA the data to the device
  *****************************************************************************/
-static int QNXaoutThread( aout_instance_t * p_aout )
+static void* QNXaoutThread( 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;
+    int canc = vlc_savecancel ();
 
-    while ( !p_aout->b_die )
+    while ( vlc_object_alive (p_aout) )
     {
         aout_buffer_t * p_buffer;
         int i_tmp, i_size;
-        byte_t * p_bytes;
+        uint8_t * p_bytes;
 
-        if ( p_aout->output.output.i_format != AOUT_FMT_SPDIF )
+        if ( p_aout->output.output.i_format != VLC_CODEC_SPDIFL )
         {
             mtime_t next_date = 0;
 
@@ -280,17 +280,17 @@ static int QNXaoutThread( aout_instance_t * p_aout )
                       * p_aout->output.output.i_frame_length;
             next_date += mdate();
 
-            p_buffer = aout_OutputNextBuffer( p_aout, next_date, VLC_FALSE );
+            p_buffer = aout_OutputNextBuffer( p_aout, next_date, false );
         }
         else
         {
-            p_buffer = aout_OutputNextBuffer( p_aout, 0, VLC_TRUE );
+            p_buffer = aout_OutputNextBuffer( p_aout, 0, true );
         }
 
         if ( p_buffer != NULL )
         {
             p_bytes = p_buffer->p_buffer;
-            i_size = p_buffer->i_nb_bytes;
+            i_size = p_buffer->i_buffer;
         }
         else
         {
@@ -306,7 +306,7 @@ static int QNXaoutThread( aout_instance_t * p_aout )
 
         if( i_tmp < 0 )
         {
-            msg_Err( p_aout, "write failed (%s)", strerror(errno) );
+            msg_Err( p_aout, "write failed (%m)" );
         }
 
         if ( p_buffer != NULL )
@@ -315,6 +315,7 @@ static int QNXaoutThread( aout_instance_t * p_aout )
         }
     }
 
-    return 0;
+    vlc_restorecancel (canc);
+    return NULL;
 }