]> git.sesse.net Git - vlc/blobdiff - modules/audio_output/alsa.c
aout: move packet FIFO management to plugins that need it
[vlc] / modules / audio_output / alsa.c
index db04ab41cc49f5029d00bcd1ff390b7432a1b986..b0f91667d5df87d58e96bbe7eb6e41b8e2303d3e 100644 (file)
@@ -52,6 +52,7 @@
  *****************************************************************************/
 struct aout_sys_t
 {
+    aout_packet_t packet;
     snd_pcm_t         * p_snd_pcm;
     unsigned int                 i_period_time;
 
@@ -344,7 +345,7 @@ static int Open (vlc_object_t *obj)
         pcm_format = SND_PCM_FORMAT_S16;
         channels = 2;
 
-        p_aout->i_nb_samples = i_period_size = ALSA_SPDIF_PERIOD_SIZE;
+        i_period_size = ALSA_SPDIF_PERIOD_SIZE;
         p_aout->format.i_bytes_per_frame = AOUT_SPDIF_SIZE;
         p_aout->format.i_frame_length = A52_FRAME_NB;
 
@@ -355,14 +356,14 @@ static int Open (vlc_object_t *obj)
         i_buffer_size = ALSA_DEFAULT_BUFFER_SIZE;
         channels = aout_FormatNbChannels( &p_aout->format );
 
-        p_aout->i_nb_samples = i_period_size = ALSA_DEFAULT_PERIOD_SIZE;
+        i_period_size = ALSA_DEFAULT_PERIOD_SIZE;
 
         aout_VolumeSoftInit( p_aout );
     }
 
     p_aout->pf_play = Play;
-    p_aout->pf_pause = NULL;
-    p_aout->pf_flush = NULL;
+    p_aout->pf_pause = aout_PacketPause;
+    p_aout->pf_flush = aout_PacketFlush;
 
     snd_pcm_hw_params_t *p_hw;
     snd_pcm_sw_params_t *p_sw;
@@ -433,7 +434,6 @@ static int Open (vlc_object_t *obj)
                  snd_strerror( val ) );
         goto error;
     }
-    p_aout->i_nb_samples = i_period_size;
 
     /* Set buffer size. */
     val = snd_pcm_hw_params_set_buffer_size_near( p_sys->p_snd_pcm, p_hw,
@@ -466,8 +466,7 @@ static int Open (vlc_object_t *obj)
     /* Get Initial software parameters */
     snd_pcm_sw_params_current( p_sys->p_snd_pcm, p_sw );
 
-    snd_pcm_sw_params_set_avail_min( p_sys->p_snd_pcm, p_sw,
-                                     p_aout->i_nb_samples );
+    snd_pcm_sw_params_set_avail_min( p_sys->p_snd_pcm, p_sw, i_period_size );
     /* start playing when one period has been written */
     val = snd_pcm_sw_params_set_start_threshold( p_sys->p_snd_pcm, p_sw,
                                                  ALSA_DEFAULT_PERIOD_SIZE);
@@ -495,6 +494,7 @@ static int Open (vlc_object_t *obj)
 
     p_sys->start_date = 0;
     vlc_sem_init( &p_sys->wait, 0 );
+    aout_PacketInit (p_aout, &p_sys->packet, i_period_size);
 
     /* Create ALSA thread and wait for its readiness. */
     if( vlc_clone( &p_sys->thread, ALSAThread, p_aout,
@@ -522,21 +522,16 @@ error:
     return VLC_EGENERIC;
 }
 
-static void PlayIgnore( audio_output_t *p_aout, block_t *block )
-{
-    aout_FifoPush( &p_aout->fifo, block );
-}
-
 /*****************************************************************************
  * Play: start playback
  *****************************************************************************/
 static void Play( audio_output_t *p_aout, block_t *block )
 {
-    p_aout->pf_play = PlayIgnore;
-
     /* get the playing date of the first aout buffer */
     p_aout->sys->start_date = block->i_pts;
-    aout_FifoPush( &p_aout->fifo, block );
+
+    aout_PacketPlay( p_aout, block );
+    p_aout->pf_play = aout_PacketPlay;
 
     /* wake up the audio output thread */
     sem_post( &p_aout->sys->wait );
@@ -554,6 +549,7 @@ static void Close (vlc_object_t *obj)
     vlc_cancel( p_sys->thread );
     vlc_join( p_sys->thread, NULL );
     vlc_sem_destroy( &p_sys->wait );
+    aout_PacketDestroy (p_aout);
 
     snd_pcm_drop( p_sys->p_snd_pcm );
     snd_pcm_close( p_sys->p_snd_pcm );