]> git.sesse.net Git - vlc/blobdiff - modules/audio_output/portaudio.c
ASF: help stupid compiler
[vlc] / modules / audio_output / portaudio.c
index 8441fd011dc8d89e0ed0835de7ede4548308b8b9..6bc6c699facd449fe91fc58234a1bb28d19f2997 100644 (file)
@@ -48,7 +48,7 @@
  *****************************************************************************/
 typedef struct
 {
-    aout_instance_t *p_aout;
+    audio_output_t *p_aout;
 
     vlc_thread_t thread;
     vlc_cond_t  wait;
@@ -63,7 +63,8 @@ typedef struct
 
 struct aout_sys_t
 {
-    aout_instance_t *p_aout;
+    aout_packet_t packet;
+    audio_output_t *p_aout;
     PaStream *p_stream;
 
     PaDeviceIndex i_devices;
@@ -95,10 +96,10 @@ static void* PORTAUDIOThread( void * );
  *****************************************************************************/
 static int  Open        ( vlc_object_t * );
 static void Close       ( vlc_object_t * );
-static void Play        ( aout_instance_t * );
+static void Play        ( audio_output_t *, block_t * );
 
-static int PAOpenDevice( aout_instance_t * );
-static int PAOpenStream( aout_instance_t * );
+static int PAOpenDevice( audio_output_t * );
+static int PAOpenStream( audio_output_t * );
 
 /*****************************************************************************
  * Module descriptor
@@ -113,7 +114,6 @@ vlc_module_begin ()
     set_subcategory( SUBCAT_AUDIO_AOUT )
     add_integer( "portaudio-audio-device", 0,
                  DEVICE_TEXT, DEVICE_LONGTEXT, false )
-        add_deprecated_alias( "portaudio-device" )   /* deprecated since 0.9.3 */
     set_capability( "audio output", 0 )
     set_callbacks( Open, Close )
 vlc_module_end ()
@@ -130,13 +130,13 @@ static int paCallback( const void *inputBuffer, void *outputBuffer,
     VLC_UNUSED( inputBuffer ); VLC_UNUSED( statusFlags );
 
     struct aout_sys_t *p_sys = (struct aout_sys_t*) p_cookie;
-    aout_instance_t   *p_aout = p_sys->p_aout;
+    audio_output_t   *p_aout = p_sys->p_aout;
     aout_buffer_t     *p_buffer;
     mtime_t out_date;
 
     out_date = mdate() + (mtime_t) ( 1000000 *
         ( paDate->outputBufferDacTime - paDate->currentTime ) );
-    p_buffer = aout_OutputNextBuffer( p_aout, out_date, true );
+    p_buffer = aout_PacketNext( p_aout, out_date );
 
     if ( p_buffer != NULL )
     {
@@ -149,12 +149,6 @@ static int paCallback( const void *inputBuffer, void *outputBuffer,
         }
         vlc_memcpy( outputBuffer, p_buffer->p_buffer,
                     framesPerBuffer * p_sys->i_sample_size );
-        /* aout_BufferFree may be dangereous here, but then so is
-         * aout_OutputNextBuffer (calls aout_BufferFree internally).
-         * one solution would be to link the no longer useful buffers
-         * in a second fifo (in aout_OutputNextBuffer too) and to
-         * wait until we are in Play to do the actual free.
-         */
         aout_BufferFree( p_buffer );
     }
     else
@@ -170,7 +164,7 @@ static int paCallback( const void *inputBuffer, void *outputBuffer,
  *****************************************************************************/
 static int Open( vlc_object_t * p_this )
 {
-    aout_instance_t *p_aout = (aout_instance_t *)p_this;
+    audio_output_t *p_aout = (audio_output_t *)p_this;
     struct aout_sys_t * p_sys;
 
     msg_Dbg( p_aout, "entering Open()");
@@ -181,9 +175,10 @@ static int Open( vlc_object_t * p_this )
         return VLC_ENOMEM;
     p_sys->p_aout = p_aout;
     p_sys->p_stream = 0;
-    p_aout->output.p_sys = p_sys;
-    p_aout->output.pf_play = Play;
-    p_aout->output.pf_pause = NULL;
+    p_aout->sys = p_sys;
+    p_aout->pf_play = aout_PacketPlay;
+    p_aout->pf_pause = aout_PacketPause;
+    p_aout->pf_flush = aout_PacketFlush;
 
     /* Retrieve output device id from config */
     p_sys->i_device_id = var_CreateGetInteger( p_aout, "portaudio-audio-device" );
@@ -282,8 +277,8 @@ static int Open( vlc_object_t * p_this )
  *****************************************************************************/
 static void Close ( vlc_object_t *p_this )
 {
-    aout_instance_t *p_aout = (aout_instance_t *)p_this;
-    aout_sys_t *p_sys = p_aout->output.p_sys;
+    audio_output_t *p_aout = (audio_output_t *)p_this;
+    aout_sys_t *p_sys = p_aout->sys;
 
     msg_Dbg( p_aout, "closing portaudio");
 
@@ -327,12 +322,13 @@ static void Close ( vlc_object_t *p_this )
 #endif
 
     msg_Dbg( p_aout, "portaudio closed");
+    aout_PacketDestroy( p_aout );
     free( p_sys );
 }
 
-static int PAOpenDevice( aout_instance_t *p_aout )
+static int PAOpenDevice( audio_output_t *p_aout )
 {
-    aout_sys_t *p_sys = p_aout->output.p_sys;
+    aout_sys_t *p_sys = p_aout->sys;
     const PaDeviceInfo *p_pdi;
     PaError i_err;
     vlc_value_t val, text;
@@ -439,7 +435,7 @@ static int PAOpenDevice( aout_instance_t *p_aout )
     }
 
     /* Audio format is paFloat32 (always supported by portaudio v19) */
-    p_aout->output.output.i_format = VLC_CODEC_FL32;
+    p_aout->format.i_format = VLC_CODEC_FL32;
 
     return VLC_SUCCESS;
 
@@ -451,9 +447,9 @@ static int PAOpenDevice( aout_instance_t *p_aout )
     return VLC_EGENERIC;
 }
 
-static int PAOpenStream( aout_instance_t *p_aout )
+static int PAOpenStream( audio_output_t *p_aout )
 {
-    aout_sys_t *p_sys = p_aout->output.p_sys;
+    aout_sys_t *p_sys = p_aout->sys;
     const PaHostErrorInfo* paLastHostErrorInfo = Pa_GetLastHostErrorInfo();
     PaStreamParameters paStreamParameters;
     vlc_value_t val;
@@ -467,54 +463,54 @@ static int PAOpenStream( aout_instance_t *p_aout )
 
     if( val.i_int == AOUT_VAR_5_1 )
     {
-        p_aout->output.output.i_physical_channels
+        p_aout->format.i_physical_channels
             = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
               | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT
               | AOUT_CHAN_LFE;
     }
     else if( val.i_int == AOUT_VAR_3F2R )
     {
-        p_aout->output.output.i_physical_channels
+        p_aout->format.i_physical_channels
             = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
             | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT;
     }
     else if( val.i_int == AOUT_VAR_2F2R )
     {
-        p_aout->output.output.i_physical_channels
+        p_aout->format.i_physical_channels
             = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT
             | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT;
     }
     else if( val.i_int == AOUT_VAR_MONO )
     {
-        p_aout->output.output.i_physical_channels = AOUT_CHAN_CENTER;
+        p_aout->format.i_physical_channels = AOUT_CHAN_CENTER;
     }
     else
     {
-        p_aout->output.output.i_physical_channels
+        p_aout->format.i_physical_channels
             = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
     }
 
-    i_channels = aout_FormatNbChannels( &p_aout->output.output );
+    i_channels = aout_FormatNbChannels( &p_aout->format );
     msg_Dbg( p_aout, "nb_channels requested = %d", i_channels );
-    i_channel_mask = p_aout->output.output.i_physical_channels;
+    i_channel_mask = p_aout->format.i_physical_channels;
 
     /* Calculate the frame size in bytes */
     p_sys->i_sample_size = 4 * i_channels;
-    p_aout->output.i_nb_samples = FRAME_SIZE;
-    aout_FormatPrepare( &p_aout->output.output );
+    aout_FormatPrepare( &p_aout->format );
+    aout_PacketInit( p_aout, &p_sys->packet, FRAME_SIZE );
     aout_VolumeSoftInit( p_aout );
 
     /* Check for channel reordering */
-    p_aout->output.p_sys->i_channel_mask = i_channel_mask;
-    p_aout->output.p_sys->i_bits_per_sample = 32; /* forced to paFloat32 */
-    p_aout->output.p_sys->i_channels = i_channels;
+    p_aout->sys->i_channel_mask = i_channel_mask;
+    p_aout->sys->i_bits_per_sample = 32; /* forced to paFloat32 */
+    p_aout->sys->i_channels = i_channels;
 
-    p_aout->output.p_sys->b_chan_reorder =
+    p_aout->sys->b_chan_reorder =
         aout_CheckChannelReorder( NULL, pi_channels_out,
                                   i_channel_mask, i_channels,
-                                  p_aout->output.p_sys->pi_chan_table );
+                                  p_aout->sys->pi_chan_table );
 
-    if( p_aout->output.p_sys->b_chan_reorder )
+    if( p_aout->sys->b_chan_reorder )
     {
         msg_Dbg( p_aout, "channel reordering needed" );
     }
@@ -527,7 +523,7 @@ static int PAOpenStream( aout_instance_t *p_aout )
     paStreamParameters.hostApiSpecificStreamInfo = NULL;
 
     i_err = Pa_OpenStream( &p_sys->p_stream, NULL /* no input */,
-                &paStreamParameters, (double)p_aout->output.output.i_rate,
+                &paStreamParameters, (double)p_aout->format.i_rate,
                 FRAME_SIZE, paClipOff, paCallback, p_sys );
     if( i_err != paNoError )
     {
@@ -541,6 +537,7 @@ static int PAOpenStream( aout_instance_t *p_aout )
                      paLastHostErrorInfo->errorText );
         }
         p_sys->p_stream = 0;
+        aout_PacketDestroy( p_aout );
         return VLC_EGENERIC;
     }
 
@@ -549,20 +546,13 @@ static int PAOpenStream( aout_instance_t *p_aout )
     {
         msg_Err( p_aout, "Pa_StartStream() failed" );
         Pa_CloseStream( p_sys->p_stream );
+        aout_PacketDestroy( p_aout );
         return VLC_EGENERIC;
     }
 
     return VLC_SUCCESS;
 }
 
-/*****************************************************************************
- * Play: play sound
- *****************************************************************************/
-static void Play( aout_instance_t * p_aout )
-{
-    VLC_UNUSED( p_aout );
-}
-
 #ifdef PORTAUDIO_IS_SERIOUSLY_BROKEN
 /*****************************************************************************
  * PORTAUDIOThread: all interactions with libportaudio.a are handled
@@ -571,7 +561,7 @@ static void Play( aout_instance_t * p_aout )
 static void* PORTAUDIOThread( void *data )
 {
     pa_thread_t *pa_thread = (pa_thread_t*)data;
-    aout_instance_t *p_aout;
+    audio_output_t *p_aout;
     aout_sys_t *p_sys;
     int i_err;
     int canc = vlc_savecancel ();
@@ -586,7 +576,7 @@ static void* PORTAUDIOThread( void *data )
         pa_thread->b_signal = false;
 
         p_aout = pa_thread->p_aout;
-        p_sys = p_aout->output.p_sys;
+        p_sys = p_aout->sys;
 
         if( PAOpenDevice( p_aout ) != VLC_SUCCESS )
         {