* aout_internal.h : internal defines for audio output
*****************************************************************************
* Copyright (C) 2002 VideoLAN
- * $Id: aout_internal.h,v 1.10 2002/08/21 23:19:58 sam Exp $
+ * $Id: aout_internal.h,v 1.11 2002/08/24 10:19:42 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
audio_sample_format_t * p_format );
void aout_OutputPlay( aout_instance_t * p_aout, aout_buffer_t * p_buffer );
void aout_OutputDelete( aout_instance_t * p_aout );
-VLC_EXPORT( aout_buffer_t *, aout_OutputNextBuffer, ( aout_instance_t *, mtime_t, vlc_bool_t ) );
+VLC_EXPORT( aout_buffer_t *, aout_OutputNextBuffer, ( aout_instance_t *, mtime_t, mtime_t, vlc_bool_t ) );
void aout_FormatPrepare( audio_sample_format_t * p_format );
void aout_FifoInit( aout_instance_t *, aout_fifo_t *, u32 );
{
aout_buffer_t * (* aout_BufferNew_inner) ( aout_instance_t *, aout_input_t *, size_t ) ;
aout_buffer_t * (* aout_FifoPop_inner) ( aout_instance_t * p_aout, aout_fifo_t * p_fifo ) ;
- aout_buffer_t * (* aout_OutputNextBuffer_inner) ( aout_instance_t *, mtime_t, vlc_bool_t ) ;
+ aout_buffer_t * (* aout_OutputNextBuffer_inner) ( aout_instance_t *, mtime_t, mtime_t, vlc_bool_t ) ;
aout_input_t * (* __aout_InputNew_inner) ( vlc_object_t *, aout_instance_t **, audio_sample_format_t * ) ;
aout_instance_t * (* __aout_NewInstance_inner) ( vlc_object_t * ) ;
char * (* __config_GetPsz_inner) (vlc_object_t *, const char *) ;
* alsa.c : alsa plugin for vlc
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
- * $Id: alsa.c,v 1.6 2002/08/19 23:07:30 sam Exp $
+ * $Id: alsa.c,v 1.7 2002/08/24 10:19:42 sam Exp $
*
* Authors: Henri Fallon <henri@videolan.org> - Original Author
* Jeffrey Baker <jwbaker@acm.org> - Port to ALSA 1.0 API
snd_pcm_status_get_tstamp( p_status, &ts_next );
next_date = (mtime_t)ts_next.tv_sec * 1000000 + ts_next.tv_usec;
- p_buffer = aout_OutputNextBuffer( p_aout, next_date,
+ p_buffer = aout_OutputNextBuffer( p_aout, next_date, 0,
p_sys->b_can_sleek );
/* Audio output buffer shortage -> stop the fill process and
/* Get the presentation date of the next write() operation. It
* is equal to the current date + latency */
- p_buffer = aout_OutputNextBuffer( p_aout, mdate() + p_sys->latency, 0 );
+ p_buffer = aout_OutputNextBuffer( p_aout, mdate() + p_sys->latency,
+ 0, VLC_FALSE );
if ( p_buffer != NULL )
{
* esd.c : EsounD module
*****************************************************************************
* Copyright (C) 2000, 2001 VideoLAN
- * $Id: esd.c,v 1.8 2002/08/19 23:07:30 sam Exp $
+ * $Id: esd.c,v 1.9 2002/08/24 10:19:42 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
(mtime_t)( esd_get_latency( esd_open_sound(NULL) ) + ESD_BUF_SIZE/2
* p_aout->output.output.i_bytes_per_frame
* p_aout->output.output.i_rate
- / p_aout->output.output.i_frame_length
/ ESD_DEFAULT_RATE )
* (mtime_t)1000000
/ p_aout->output.output.i_bytes_per_frame
- / p_aout->output.output.i_rate
- * p_aout->output.output.i_frame_length;
+ / p_aout->output.output.i_rate;
p_sys->b_initialized = VLC_TRUE;
/* Get the presentation date of the next write() operation. It
* is equal to the current date + buffered samples + esd latency */
- p_buffer = aout_OutputNextBuffer( p_aout, mdate() + p_sys->latency, 0 );
+ p_buffer = aout_OutputNextBuffer( p_aout, mdate() + p_sys->latency,
+ 0, VLC_FALSE );
if ( p_buffer != NULL )
{
* oss.c : OSS /dev/dsp module for vlc
*****************************************************************************
* Copyright (C) 2000-2002 VideoLAN
- * $Id: oss.c,v 1.14 2002/08/24 01:14:29 sigmunau Exp $
+ * $Id: oss.c,v 1.15 2002/08/24 10:19:42 sam Exp $
*
* Authors: Michel Kaempf <maxx@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
volatile vlc_bool_t b_initialized;
};
-#define FRAME_SIZE 2048
+#define FRAME_SIZE 1024
#define A52_FRAME_NB 1536
/*****************************************************************************
add_file( "dspdev", "/dev/dsp", NULL, N_("OSS dsp device"), NULL );
set_description( _("Linux OSS /dev/dsp module") );
set_capability( "audio output", 100 );
+ add_shortcut( "dsp" );
set_callbacks( Open, Close );
vlc_module_end();
p_aout->b_die = 1;
vlc_thread_join( p_aout );
+ ioctl( p_sys->i_fd, SNDCTL_DSP_RESET, NULL );
close( p_sys->i_fd );
+
free( p_sys );
}
if ( p_aout->output.output.i_format != AOUT_FMT_SPDIF )
{
- mtime_t next_date = 0;
- /* Get the presentation date of the next write() operation. It
- * is equal to the current date + duration of buffered samples.
- * Order is important here, since GetBufInfo is believed to take
- * more time than mdate(). */
- next_date = (mtime_t)GetBufInfo( p_aout ) * 100000
- / p_aout->output.output.i_bytes_per_frame
- / p_aout->output.output.i_rate
- * p_aout->output.output.i_frame_length;
- next_date += mdate();
-
- p_buffer = aout_OutputNextBuffer( p_aout, next_date, VLC_FALSE );
+ mtime_t buffered = (mtime_t)GetBufInfo( p_aout ) * 1000000
+ / p_aout->output.output.i_bytes_per_frame
+ / p_aout->output.output.i_rate
+ * p_aout->output.output.i_frame_length;
+
+ /* Next buffer will be played at mdate()+buffered, and we tell
+ * the audio output that it can wait for a new packet for
+ * buffered/2 microseconds. */
+ p_buffer = aout_OutputNextBuffer( p_aout, mdate() + buffered,
+ buffered / 2, VLC_FALSE );
}
else
{
- p_buffer = aout_OutputNextBuffer( p_aout, 0, VLC_TRUE );
+ p_buffer = aout_OutputNextBuffer( p_aout, 0, 0, VLC_TRUE );
}
if ( p_buffer != NULL )
* sdl.c : SDL audio output plugin for vlc
*****************************************************************************
* Copyright (C) 2000-2002 VideoLAN
- * $Id: sdl.c,v 1.4 2002/08/21 22:41:59 massiot Exp $
+ * $Id: sdl.c,v 1.5 2002/08/24 10:19:42 sam Exp $
*
* Authors: Michel Kaempf <maxx@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
static void SDLCallback( void * _p_aout, byte_t * p_stream, int i_len )
{
aout_instance_t * p_aout = (aout_instance_t *)_p_aout;
+//static mtime_t old = 0;
+//static mtime_t diff = 0;
+//mtime_t foo = mdate();
+ aout_buffer_t * p_buffer;
+//if(old) diff = (9 * diff + (foo-old))/10;
/* FIXME : take into account SDL latency instead of mdate() */
- aout_buffer_t * p_buffer = aout_OutputNextBuffer( p_aout, mdate(), 1 );
+ p_buffer = aout_OutputNextBuffer( p_aout, mdate(), 0, VLC_TRUE );
+ //p_buffer = aout_OutputNextBuffer( p_aout, foo - diff, 0, VLC_TRUE );
+//fprintf(stderr, "foo - old : %lli, diff : %lli\n", foo-old, diff);
+//old=foo;
if ( i_len != FRAME_SIZE * sizeof(s16)
* p_aout->output.output.i_channels )
if ( p_buffer != NULL )
{
+//fprintf(stderr, "got buffer %lli\n", p_buffer->end_date - p_buffer->start_date);
+
p_aout->p_vlc->pf_memcpy( p_stream, p_buffer->p_buffer, i_len );
aout_BufferFree( p_buffer );
}
else
{
+//fprintf(stderr, "NO BUFFER !\n");
p_aout->p_vlc->pf_memset( p_stream, 0, i_len );
}
}
* aout.m: CoreAudio output plugin
*****************************************************************************
* Copyright (C) 2002 VideoLAN
- * $Id: aout.m,v 1.5 2002/08/19 21:31:11 massiot Exp $
+ * $Id: aout.m,v 1.6 2002/08/24 10:19:42 sam Exp $
*
* Authors: Colin Delacroix <colin@zoy.org>
* Jon Lech Johansen <jon-vl@nanocrew.net>
current_date = p_sys->clock_diff
+ AudioConvertHostTimeToNanos(host_time.mHostTime) / 1000;
- p_buffer = aout_OutputNextBuffer( p_aout, current_date, 0 );
+ p_buffer = aout_OutputNextBuffer( p_aout, current_date, 0, VLC_FALSE );
/* move data into output data buffer */
if ( p_buffer != NULL )
* 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, 0, VLC_FALSE );
}
else
{
- p_buffer = aout_OutputNextBuffer( p_aout, 0, VLC_TRUE );
+ p_buffer = aout_OutputNextBuffer( p_aout, 0, 0, VLC_TRUE );
}
if ( p_buffer != NULL )
* aout.c: Windows DirectX audio output method
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: aout.c,v 1.5 2002/08/19 21:31:11 massiot Exp $
+ * $Id: aout.c,v 1.6 2002/08/24 10:19:42 sam Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
}
/* FIXME : take into account DirectSound latency instead of mdate() */
- p_buffer = aout_OutputNextBuffer( p_aout, mdate(), 0 );
+ p_buffer = aout_OutputNextBuffer( p_aout, mdate(), 0, VLC_FALSE );
/* Now do the actual memcpy into the circular buffer */
if ( l_bytes1 != p_notif->i_buffer_size )
* input.c : internal management of input streams for the audio output
*****************************************************************************
* Copyright (C) 2002 VideoLAN
- * $Id: input.c,v 1.7 2002/08/21 22:41:59 massiot Exp $
+ * $Id: input.c,v 1.8 2002/08/24 10:19:43 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
/* The decoder is _very_ late. This can only happen if the user
* pauses the stream (or if the decoder is buggy, which cannot
* happen :). */
- msg_Warn( p_aout, "Computed PTS is out of range (%lld), clearing out",
+ msg_Warn( p_aout, "computed PTS is out of range (%lld), clearing out",
start_date );
vlc_mutex_lock( &p_aout->mixer_lock );
aout_FifoSet( p_aout, &p_input->fifo, 0 );
start_date = 0;
}
- if ( p_buffer->start_date < mdate() - AOUT_MIN_PREPARE_TIME )
+ if ( p_buffer->start_date < mdate() + AOUT_MIN_PREPARE_TIME )
{
/* The decoder gives us f*cked up PTS. It's its business, but we
* can't present it anyway, so drop the buffer. */
* output.c : internal management of output streams for the audio output
*****************************************************************************
* Copyright (C) 2002 VideoLAN
- * $Id: output.c,v 1.9 2002/08/21 22:41:59 massiot Exp $
+ * $Id: output.c,v 1.10 2002/08/24 10:19:43 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
* compensate it by itself. S/PDIF outputs should always set b_can_sleek = 1.
*****************************************************************************/
aout_buffer_t * aout_OutputNextBuffer( aout_instance_t * p_aout,
- mtime_t start_date ,
+ mtime_t start_date,
+ mtime_t timeout,
vlc_bool_t b_can_sleek )
{
aout_buffer_t * p_buffer;
+ mtime_t now = mdate();
vlc_mutex_lock( &p_aout->mixer_lock );
- p_buffer = p_aout->output.fifo.p_first;
+ timeout += now;
+
+ while( p_aout->output.fifo.p_first == NULL && timeout > now )
+ {
+ vlc_mutex_unlock( &p_aout->mixer_lock );
+ msleep( AOUT_PTS_TOLERANCE / 2 );
+ vlc_mutex_lock( &p_aout->mixer_lock );
+ now = mdate();
+ }
+
+ p_buffer = p_aout->output.fifo.p_first;
while ( p_buffer != NULL && p_buffer->start_date < start_date )
{
- msg_Dbg( p_aout, "audio output is too slow (%lld)",
- start_date - p_buffer->start_date );
+ msg_Dbg( p_aout, "audio output is too slow (%lld), trashing %lldms",
+ start_date - p_buffer->start_date,
+ p_buffer->end_date - p_buffer->start_date );
p_buffer = p_buffer->p_next;
}
/* Set date to 0, to allow the mixer to send a new buffer ASAP */
aout_FifoSet( p_aout, &p_aout->output.fifo, 0 );
vlc_mutex_unlock( &p_aout->mixer_lock );
- msg_Dbg( p_aout, "audio output is starving" );
+ msg_Dbg( p_aout, "audio output is starving, waited too long" );
return NULL;
}