Commit a25f41cb authored by Renaud Dartus's avatar Renaud Dartus

* Fix audio/video synchro bug with esd

* Should fix buggy sound due to 44100-48000 Hz conversions
parent 23b4e9ba
...@@ -103,7 +103,7 @@ Urgency: Critical ...@@ -103,7 +103,7 @@ Urgency: Critical
Description: Fix AC3 decoder Description: Fix AC3 decoder
The AC3 decoder still has a few quality issues; fix them, and try to add The AC3 decoder still has a few quality issues; fix them, and try to add
MMX support to it as well. MMX support to it as well.
Status: Todo Status: Done 15 June 2001 (reno)
Task: 0x52 Task: 0x52
Difficulty: Guru Difficulty: Guru
...@@ -193,7 +193,7 @@ Urgency: Critical ...@@ -193,7 +193,7 @@ Urgency: Critical
Description: Fix audio synchro Description: Fix audio synchro
With some audio plugins, the audio stream is late because of buffer With some audio plugins, the audio stream is late because of buffer
sizes. See what's wrong and fix it. sizes. See what's wrong and fix it.
Status: Todo Status: Done 12 July 2001 (reno)
Task: 0x47 Task: 0x47
Difficulty: Hard Difficulty: Hard
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* audio_output.h : audio output thread interface * audio_output.h : audio output thread interface
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN * Copyright (C) 1999, 2000 VideoLAN
* $Id: audio_output.h,v 1.37 2001/05/30 17:03:11 sam Exp $ * $Id: audio_output.h,v 1.38 2001/07/12 20:31:33 reno Exp $
* *
* Authors: Michel Kaempf <maxx@via.ecp.fr> * Authors: Michel Kaempf <maxx@via.ecp.fr>
* *
...@@ -171,6 +171,7 @@ typedef struct aout_thread_s ...@@ -171,6 +171,7 @@ typedef struct aout_thread_s
/* Rate and gain of the audio output sound (in Hz) */ /* Rate and gain of the audio output sound (in Hz) */
long l_rate; long l_rate;
long l_gain; long l_gain;
int i_latency;
/* there might be some useful private structure, such as audio_buf_info /* there might be some useful private structure, such as audio_buf_info
* for the OSS output */ * for the OSS output */
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* aout_esd.c : Esound functions library * aout_esd.c : Esound functions library
***************************************************************************** *****************************************************************************
* Copyright (C) 2000 VideoLAN * Copyright (C) 2000 VideoLAN
* $Id: aout_esd.c,v 1.13 2001/05/30 17:03:12 sam Exp $ * $Id: aout_esd.c,v 1.14 2001/07/12 20:31:33 reno Exp $
* *
* Authors: Samuel Hocevar <sam@zoy.org> * Authors: Samuel Hocevar <sam@zoy.org>
* *
...@@ -134,7 +134,7 @@ static int aout_Open( aout_thread_t *p_aout ) ...@@ -134,7 +134,7 @@ static int aout_Open( aout_thread_t *p_aout )
/* Initialize some variables */ /* Initialize some variables */
p_aout->i_format = AOUT_FORMAT_DEFAULT; p_aout->i_format = AOUT_FORMAT_DEFAULT;
p_aout->i_channels = 1 + main_GetIntVariable( AOUT_STEREO_VAR, AOUT_STEREO_DEFAULT ); p_aout->i_channels = 1 + main_GetIntVariable( AOUT_STEREO_VAR, AOUT_STEREO_DEFAULT );
p_aout->l_rate = main_GetIntVariable( AOUT_RATE_VAR, AOUT_RATE_DEFAULT ); p_aout->l_rate = esd_audio_rate; /* We use actual esd rate value, not AOUT_RATE_DEFAULT */
i_bits = ESD_BITS16; i_bits = ESD_BITS16;
i_mode = ESD_STREAM; i_mode = ESD_STREAM;
...@@ -162,10 +162,6 @@ static int aout_Open( aout_thread_t *p_aout ) ...@@ -162,10 +162,6 @@ static int aout_Open( aout_thread_t *p_aout )
return( -1 ); return( -1 );
} }
intf_ErrMsg( "aout error: you are using the Esound plugin. There is no way yet to get the\n"
" driver latency because esd_get_latency() hangs, so expect a one\n"
" second delay with sound. Type `esdctl off' to disable esd." );
return( 0 ); return( 0 );
} }
...@@ -174,6 +170,13 @@ static int aout_Open( aout_thread_t *p_aout ) ...@@ -174,6 +170,13 @@ static int aout_Open( aout_thread_t *p_aout )
*****************************************************************************/ *****************************************************************************/
static int aout_SetFormat( aout_thread_t *p_aout ) static int aout_SetFormat( aout_thread_t *p_aout )
{ {
int i_fd;
i_fd = esd_open_sound(NULL);
p_aout->i_latency = esd_get_latency(i_fd);
intf_WarnMsg(2, "aout_esd_latency: %d",p_aout->i_latency);
return( 0 ); return( 0 );
} }
...@@ -194,7 +197,7 @@ static long aout_GetBufInfo( aout_thread_t *p_aout, long l_buffer_limit ) ...@@ -194,7 +197,7 @@ static long aout_GetBufInfo( aout_thread_t *p_aout, long l_buffer_limit )
static void aout_Play( aout_thread_t *p_aout, byte_t *buffer, int i_size ) static void aout_Play( aout_thread_t *p_aout, byte_t *buffer, int i_size )
{ {
int i_amount; int i_amount;
if (p_aout->p_sys->esd_format & ESD_STEREO) if (p_aout->p_sys->esd_format & ESD_STEREO)
{ {
if (p_aout->p_sys->esd_format & ESD_BITS16) if (p_aout->p_sys->esd_format & ESD_BITS16)
......
...@@ -87,37 +87,16 @@ void aout_S16StereoThread( aout_thread_t * p_aout ) ...@@ -87,37 +87,16 @@ void aout_S16StereoThread( aout_thread_t * p_aout )
} }
l_bytes = p_aout->pf_getbufinfo( p_aout, l_buffer_limit ); l_bytes = p_aout->pf_getbufinfo( p_aout, l_buffer_limit );
#if 0
fprintf(stderr,"l_bytes 1: %li\n",l_bytes);
fprintf(stderr," playing...\n");
#endif
/* sizeof(s16) << (p_aout->b_stereo) == 4 */ /* sizeof(s16) << (p_aout->b_stereo) == 4 */
p_aout->date = mdate() + ((((mtime_t)(l_bytes / 4)) * 1000000) p_aout->date = mdate() + ((((mtime_t)((l_bytes + 4 * p_aout->i_latency) / 4)) * 1000000)
/ ((mtime_t)p_aout->l_rate)); / ((mtime_t)p_aout->l_rate));
p_aout->pf_play( p_aout, (byte_t *)p_aout->buffer, p_aout->pf_play( p_aout, (byte_t *)p_aout->buffer,
l_buffer_limit * sizeof(s16) ); l_buffer_limit * sizeof(s16) );
#if 0
fprintf( stderr,"l_bytes #: %li\n",
p_aout->pf_getbufinfo( p_aout, l_buffer_limit ) );
#endif
if ( l_bytes > (l_buffer_limit * sizeof(s16)) ) if ( l_bytes > (l_buffer_limit * sizeof(s16)) )
{ {
msleep( p_aout->l_msleep ); msleep( p_aout->l_msleep );
#if 0
fprintf(stderr," sleeping...\n");
msleep( p_aout->l_msleep / 2);
l_bytes = p_aout->pf_getbufinfo( p_aout, l_buffer_limit );
fprintf(stderr,"l_bytes *: %li\n",l_bytes);
msleep( p_aout->l_msleep / 2);
}
else
{
fprintf(stderr," not sleeping.\n");
l_bytes = p_aout->pf_getbufinfo( p_aout, l_buffer_limit );
fprintf(stderr,"l_bytes 2: %li\n\n",l_bytes);
#endif
} }
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* aout_u8.c: 8 bit unsigned audio output functions * aout_u8.c: 8 bit unsigned audio output functions
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN * Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: aout_u8.c,v 1.5 2001/05/15 16:19:42 sam Exp $ * $Id: aout_u8.c,v 1.6 2001/07/12 20:31:33 reno Exp $
* *
* Authors: Michel Kaempf <maxx@via.ecp.fr> * Authors: Michel Kaempf <maxx@via.ecp.fr>
* *
...@@ -82,7 +82,10 @@ void aout_U8MonoThread( aout_thread_t * p_aout ) ...@@ -82,7 +82,10 @@ void aout_U8MonoThread( aout_thread_t * p_aout )
} }
l_bytes = p_aout->pf_getbufinfo( p_aout, l_buffer_limit ); l_bytes = p_aout->pf_getbufinfo( p_aout, l_buffer_limit );
p_aout->date = mdate() + ((((mtime_t)(l_bytes / 1 )) * 1000000) / ((mtime_t)p_aout->l_rate)); /* sizeof(u8) << (p_aout->b_stereo) == 1 */ /* sizeof(u8) << (p_aout->b_stereo) == 1 */
p_aout->date = mdate() + ((((mtime_t)((l_bytes + 4 * p_aout->i_latency) / 1)) * 1000000)
/ ((mtime_t)p_aout->l_rate));
p_aout->pf_play( p_aout, (byte_t *)p_aout->buffer, l_buffer_limit * sizeof(u8) ); p_aout->pf_play( p_aout, (byte_t *)p_aout->buffer, l_buffer_limit * sizeof(u8) );
if ( l_bytes > (l_buffer_limit * sizeof(u8) * 2) ) /* There are 2 channels (left & right) */ if ( l_bytes > (l_buffer_limit * sizeof(u8) * 2) ) /* There are 2 channels (left & right) */
{ {
...@@ -133,7 +136,10 @@ void aout_U8StereoThread( aout_thread_t * p_aout ) ...@@ -133,7 +136,10 @@ void aout_U8StereoThread( aout_thread_t * p_aout )
p_aout->s32_buffer[l_buffer] = 0; p_aout->s32_buffer[l_buffer] = 0;
} }
l_bytes = p_aout->pf_getbufinfo( p_aout, l_buffer_limit ); l_bytes = p_aout->pf_getbufinfo( p_aout, l_buffer_limit );
p_aout->date = mdate() + ((((mtime_t)(l_bytes / 2 )) * 1000000) / ((mtime_t)p_aout->l_rate)); /* sizeof(u8) << (p_aout->b_stereo) == 2 */ /* sizeof(u8) << (p_aout->b_stereo) == 2 */
p_aout->date = mdate() + ((((mtime_t)((l_bytes + 4 * p_aout->i_latency) / 2)) * 1000000)
/ ((mtime_t)p_aout->l_rate));
p_aout->pf_play( p_aout, (byte_t *)p_aout->buffer, l_buffer_limit * sizeof(u8) ); p_aout->pf_play( p_aout, (byte_t *)p_aout->buffer, l_buffer_limit * sizeof(u8) );
if ( l_bytes > (l_buffer_limit * sizeof(u8)) ) if ( l_bytes > (l_buffer_limit * sizeof(u8)) )
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment