From eb93d56d8d76be74193a77ee163462c14af92959 Mon Sep 17 00:00:00 2001 From: Christophe Massiot Date: Wed, 14 Aug 2002 00:23:59 +0000 Subject: [PATCH] * Changed aout_FormatTo* ; aout_FormatToSize does no longer exist. p_buffer now has a i_nb_bytes member. It is possible to indicate for a format its byterate (necessary for AC3 and SPDIF). * S/PDIF output seems to be working at last (tested with the file output). --- include/aout_internal.h | 19 ++++++------ include/audio_output.h | 15 +++++----- include/defs.h.in | 2 +- include/vlc_symbols.h | 4 +-- modules/audio_filter/converter/a52tospdif.c | 5 ++-- modules/audio_filter/converter/float32tos16.c | 3 +- modules/audio_filter/converter/float32tos8.c | 3 +- modules/audio_filter/converter/float32tou16.c | 5 ++-- modules/audio_filter/converter/float32tou8.c | 5 ++-- modules/audio_mixer/spdif.c | 4 +-- modules/audio_output/arts.c | 8 ++--- modules/audio_output/esd.c | 13 ++++----- modules/audio_output/file.c | 23 ++++++++++----- modules/audio_output/oss.c | 27 ++++++++--------- modules/codec/a52.c | 8 ++--- modules/codec/spdif.c | 20 +++++++------ modules/misc/dummy/aout.c | 14 +++++++-- src/audio_output/audio_output.c | 29 ++++++++++--------- src/audio_output/filters.c | 12 ++++---- src/audio_output/input.c | 7 +++-- src/audio_output/mixer.c | 5 +++- src/audio_output/output.c | 25 ++++++++++------ src/misc/modules_plugin.h | 2 +- 23 files changed, 147 insertions(+), 111 deletions(-) diff --git a/include/aout_internal.h b/include/aout_internal.h index a36733210d..3355ff3d28 100644 --- a/include/aout_internal.h +++ b/include/aout_internal.h @@ -2,7 +2,7 @@ * aout_internal.h : internal defines for audio output ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: aout_internal.h,v 1.3 2002/08/12 22:12:50 massiot Exp $ + * $Id: aout_internal.h,v 1.4 2002/08/14 00:23:59 massiot Exp $ * * Authors: Christophe Massiot * @@ -35,30 +35,29 @@ typedef struct aout_alloc_t #define AOUT_ALLOC_STACK 1 #define AOUT_ALLOC_HEAP 2 -#define aout_BufferAlloc( p_alloc, i_nb_usec, p_previous_buffer, p_new_buffer ) \ +#define aout_BufferAlloc( p_alloc, i_nb_usec, p_previous_buffer, \ + p_new_buffer ) \ if ( (p_alloc)->i_alloc_type == AOUT_ALLOC_NONE ) \ { \ (p_new_buffer) = p_previous_buffer; \ } \ else \ { \ + int i_alloc_size; \ + i_alloc_size = (u64)(p_alloc)->i_bytes_per_sec \ + * (i_nb_usec) / 1000000 + 1; \ if ( (p_alloc)->i_alloc_type == AOUT_ALLOC_STACK ) \ { \ - (p_new_buffer) = alloca( (u64)(p_alloc)->i_bytes_per_sec \ - * (i_nb_usec) \ - / 1000000 + 1 + sizeof(aout_buffer_t) ); \ + (p_new_buffer) = alloca( i_alloc_size + sizeof(aout_buffer_t) );\ } \ else \ { \ - (p_new_buffer) = malloc( (u64)(p_alloc)->i_bytes_per_sec \ - * (i_nb_usec) \ - / 1000000 + 1 + sizeof(aout_buffer_t) ); \ + (p_new_buffer) = malloc( i_alloc_size + sizeof(aout_buffer_t) );\ } \ if ( p_new_buffer != NULL ) \ { \ (p_new_buffer)->i_alloc_type = (p_alloc)->i_alloc_type; \ - (p_new_buffer)->i_size = (u64)(p_alloc)->i_bytes_per_sec \ - * (i_nb_usec) / 1000000 + 1; \ + (p_new_buffer)->i_size = i_alloc_size; \ (p_new_buffer)->p_buffer = (byte_t *)(p_new_buffer) \ + sizeof(aout_buffer_t); \ if ( (p_previous_buffer) != NULL ) \ diff --git a/include/audio_output.h b/include/audio_output.h index f9a5874349..addf857056 100644 --- a/include/audio_output.h +++ b/include/audio_output.h @@ -2,7 +2,7 @@ * audio_output.h : audio output interface ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: audio_output.h,v 1.57 2002/08/11 23:26:28 massiot Exp $ + * $Id: audio_output.h,v 1.58 2002/08/14 00:23:59 massiot Exp $ * * Authors: Christophe Massiot * @@ -31,6 +31,8 @@ struct audio_sample_format_t int i_format; int i_rate; int i_channels; + /* Optional - for A52, SPDIF and DTS types */ + int i_bytes_per_sec; }; #define AOUT_FMT_MU_LAW 0x00000001 @@ -62,7 +64,7 @@ struct audio_sample_format_t # define AOUT_FMT_U16_NE AOUT_FMT_U16_LE #endif -#define AOUT_FMT_IS_SPDIF( p_format ) \ +#define AOUT_FMT_NON_LINEAR( p_format ) \ ( ((p_format)->i_format == AOUT_FMT_SPDIF) \ || ((p_format)->i_format == AOUT_FMT_A52) \ || ((p_format)->i_format == AOUT_FMT_DTS) ) @@ -94,7 +96,6 @@ typedef s32 vlc_fixed_t; #define FIXED32_ONE ((vlc_fixed_t) 0x10000000) - /***************************************************************************** * aout_buffer_t : audio output buffer *****************************************************************************/ @@ -102,7 +103,9 @@ struct aout_buffer_t { byte_t * p_buffer; int i_alloc_type; - size_t i_size; + /* i_size is the real size of the buffer (normally unused), i_nb_bytes + * is the number of significative bytes in it. */ + size_t i_size, i_nb_bytes; int i_nb_samples; mtime_t start_date, end_date; @@ -122,9 +125,7 @@ VLC_EXPORT( void, aout_DeleteInstance, ( aout_instance_t * ) ); VLC_EXPORT( aout_buffer_t *, aout_BufferNew, ( aout_instance_t *, aout_input_t *, size_t ) ); VLC_EXPORT( void, aout_BufferDelete, ( aout_instance_t *, aout_input_t *, aout_buffer_t * ) ); VLC_EXPORT( void, aout_BufferPlay, ( aout_instance_t *, aout_input_t *, aout_buffer_t * ) ); -VLC_EXPORT( int, aout_FormatTo, ( audio_sample_format_t * p_format, int ) ); -#define aout_FormatToByterate(a,b) aout_FormatTo(a,b) -#define aout_FormatToSize(a,b) aout_FormatTo(a,b) +VLC_EXPORT( int, aout_FormatToByterate, ( audio_sample_format_t * p_format ) ); /* From input.c : */ #define aout_InputNew(a,b,c) __aout_InputNew(VLC_OBJECT(a),b,c) diff --git a/include/defs.h.in b/include/defs.h.in index d963a95f9f..3fd8eabe61 100644 --- a/include/defs.h.in +++ b/include/defs.h.in @@ -1,4 +1,4 @@ -/* include/defs.h.in. Generated automatically from configure.in by autoheader 2.13. */ +/* include/defs.h.in. Generated automatically from configure.in by autoheader. */ /* Define if using alloca.c. */ #undef C_ALLOCA diff --git a/include/vlc_symbols.h b/include/vlc_symbols.h index 5d06d0c969..4074523c8c 100644 --- a/include/vlc_symbols.h +++ b/include/vlc_symbols.h @@ -36,7 +36,7 @@ struct module_symbols_t int (* __vlc_thread_create_inner) ( vlc_object_t *, char *, int, char *, void * ( * ) ( void * ), vlc_bool_t ) ; int (* __vlc_threads_end_inner) ( vlc_object_t * ) ; int (* __vlc_threads_init_inner) ( vlc_object_t * ) ; - int (* aout_FormatTo_inner) ( audio_sample_format_t * p_format, int ) ; + int (* aout_FormatToByterate_inner) ( audio_sample_format_t * p_format ) ; int (* input_AccessInit_inner) ( input_thread_t * ) ; int (* input_AddInfo_inner) ( input_info_category_t *, char *, char *, ... ) ; int (* input_ChangeArea_inner) ( input_thread_t *, input_area_t * ) ; @@ -206,7 +206,7 @@ struct module_symbols_t # define aout_BufferNew p_symbols->aout_BufferNew_inner # define aout_BufferPlay p_symbols->aout_BufferPlay_inner # define aout_DeleteInstance p_symbols->aout_DeleteInstance_inner -# define aout_FormatTo p_symbols->aout_FormatTo_inner +# define aout_FormatToByterate p_symbols->aout_FormatToByterate_inner # define aout_InputDelete p_symbols->aout_InputDelete_inner # define aout_OutputNextBuffer p_symbols->aout_OutputNextBuffer_inner # define config_Duplicate p_symbols->config_Duplicate_inner diff --git a/modules/audio_filter/converter/a52tospdif.c b/modules/audio_filter/converter/a52tospdif.c index ae0f5c123c..84105371bd 100644 --- a/modules/audio_filter/converter/a52tospdif.c +++ b/modules/audio_filter/converter/a52tospdif.c @@ -2,7 +2,7 @@ * a52tospdif.c : encapsulates A/52 frames into S/PDIF packets ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: a52tospdif.c,v 1.6 2002/08/13 16:11:15 sam Exp $ + * $Id: a52tospdif.c,v 1.7 2002/08/14 00:23:59 massiot Exp $ * * Authors: Christophe Massiot * Stéphane Borel @@ -120,6 +120,7 @@ static void DoWork( aout_instance_t * p_aout, aout_filter_t * p_filter, p_filter->p_vlc->pf_memset( p_out + 8 + i_length, 0, AOUT_SPDIF_SIZE - i_length - 8 ); - p_out_buf->i_nb_samples = 1; + p_out_buf->i_nb_samples = p_in_buf->i_nb_samples; + p_out_buf->i_nb_bytes = AOUT_SPDIF_SIZE; } diff --git a/modules/audio_filter/converter/float32tos16.c b/modules/audio_filter/converter/float32tos16.c index 8a77a36fe9..0353d774dc 100644 --- a/modules/audio_filter/converter/float32tos16.c +++ b/modules/audio_filter/converter/float32tos16.c @@ -2,7 +2,7 @@ * float32tos16.c : converter from float32 to signed 16 bits integer ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: float32tos16.c,v 1.6 2002/08/13 22:42:23 massiot Exp $ + * $Id: float32tos16.c,v 1.7 2002/08/14 00:23:59 massiot Exp $ * * Authors: Christophe Massiot * @@ -107,5 +107,6 @@ static void DoWork( aout_instance_t * p_aout, aout_filter_t * p_filter, } p_out_buf->i_nb_samples = p_in_buf->i_nb_samples; + p_out_buf->i_nb_bytes = p_in_buf->i_nb_bytes / 2; } diff --git a/modules/audio_filter/converter/float32tos8.c b/modules/audio_filter/converter/float32tos8.c index c51b5294fd..da6185575e 100644 --- a/modules/audio_filter/converter/float32tos8.c +++ b/modules/audio_filter/converter/float32tos8.c @@ -2,7 +2,7 @@ * float32tos8.c : converter from float32 to signed 8 bits integer ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: float32tos8.c,v 1.1 2002/08/13 22:42:23 massiot Exp $ + * $Id: float32tos8.c,v 1.2 2002/08/14 00:23:59 massiot Exp $ * * Authors: Xavier Maillard * @@ -96,5 +96,6 @@ static void DoWork( aout_instance_t * p_aout, aout_filter_t * p_filter, } p_out_buf->i_nb_samples = p_in_buf->i_nb_samples; + p_out_buf->i_nb_bytes = p_in_buf->i_nb_bytes / 4; } diff --git a/modules/audio_filter/converter/float32tou16.c b/modules/audio_filter/converter/float32tou16.c index 566a196368..b5aa6a3e96 100644 --- a/modules/audio_filter/converter/float32tou16.c +++ b/modules/audio_filter/converter/float32tou16.c @@ -2,7 +2,7 @@ * float32tou16.c : converter from float32 to unsigned 16 bits integer ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: float32tou16.c,v 1.1 2002/08/13 22:42:23 massiot Exp $ + * $Id: float32tou16.c,v 1.2 2002/08/14 00:23:59 massiot Exp $ * * Authors: Xavier Maillard * @@ -59,7 +59,7 @@ static int Create( vlc_object_t *p_this ) aout_filter_t * p_filter = (aout_filter_t *)p_this; if ( p_filter->input.i_format != AOUT_FMT_FLOAT32 - && p_filter->output.i_format != AOUT_FMT_U16_NE ) + || p_filter->output.i_format != AOUT_FMT_U16_NE ) { return -1; } @@ -95,5 +95,6 @@ static void DoWork( aout_instance_t * p_aout, aout_filter_t * p_filter, } p_out_buf->i_nb_samples = p_in_buf->i_nb_samples; + p_out_buf->i_nb_bytes = p_in_buf->i_nb_bytes / 2; } diff --git a/modules/audio_filter/converter/float32tou8.c b/modules/audio_filter/converter/float32tou8.c index 2f245a77dc..185cd0299a 100644 --- a/modules/audio_filter/converter/float32tou8.c +++ b/modules/audio_filter/converter/float32tou8.c @@ -2,7 +2,7 @@ * float32tou8.c : converter from float32 to unsigned 8 bits integer ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: float32tou8.c,v 1.1 2002/08/13 22:42:23 massiot Exp $ + * $Id: float32tou8.c,v 1.2 2002/08/14 00:23:59 massiot Exp $ * * Authors: Xavier Maillard * @@ -59,7 +59,7 @@ static int Create( vlc_object_t *p_this ) aout_filter_t * p_filter = (aout_filter_t *)p_this; if ( p_filter->input.i_format != AOUT_FMT_FLOAT32 - && p_filter->output.i_format != AOUT_FMT_U8 ) + || p_filter->output.i_format != AOUT_FMT_U8 ) { return -1; } @@ -96,5 +96,6 @@ static void DoWork( aout_instance_t * p_aout, aout_filter_t * p_filter, } p_out_buf->i_nb_samples = p_in_buf->i_nb_samples; + p_out_buf->i_nb_bytes = p_in_buf->i_nb_bytes / 4; } diff --git a/modules/audio_mixer/spdif.c b/modules/audio_mixer/spdif.c index 8ee4d62375..307056959e 100644 --- a/modules/audio_mixer/spdif.c +++ b/modules/audio_mixer/spdif.c @@ -2,7 +2,7 @@ * spdif.c : dummy mixer for S/PDIF output (1 input only) ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: spdif.c,v 1.2 2002/08/12 07:40:23 massiot Exp $ + * $Id: spdif.c,v 1.3 2002/08/14 00:23:59 massiot Exp $ * * Authors: Christophe Massiot * @@ -56,7 +56,7 @@ static int Create( vlc_object_t *p_this ) { aout_instance_t * p_aout = (aout_instance_t *)p_this; - if ( p_aout->mixer.output.i_format != AOUT_FMT_SPDIF ) + if ( !AOUT_FMT_NON_LINEAR(&p_aout->mixer.output) ) { return -1; } diff --git a/modules/audio_output/arts.c b/modules/audio_output/arts.c index ce202fc383..c00d85f40f 100644 --- a/modules/audio_output/arts.c +++ b/modules/audio_output/arts.c @@ -210,13 +210,13 @@ static int aRtsThread( aout_instance_t * p_aout ) if ( p_buffer != NULL ) { p_bytes = p_buffer->p_buffer; - i_size = aout_FormatToSize( &p_aout->output.output, - p_buffer->i_nb_samples ); + i_size = p_buffer->i_nb_bytes; } else { - i_size = aout_FormatToSize( &p_aout->output.output, - p_sys->i_size ); + i_size = aout_FormatToByterate( &p_aout->output.output ) + * p_sys->i_size + / p_aout->output.output.i_rate; p_bytes = alloca( i_size ); memset( p_bytes, 0, i_size ); } diff --git a/modules/audio_output/esd.c b/modules/audio_output/esd.c index 99a7e27106..4db499ecd7 100644 --- a/modules/audio_output/esd.c +++ b/modules/audio_output/esd.c @@ -2,7 +2,7 @@ * esd.c : EsounD module ***************************************************************************** * Copyright (C) 2000, 2001 VideoLAN - * $Id: esd.c,v 1.3 2002/08/13 14:53:46 sam Exp $ + * $Id: esd.c,v 1.4 2002/08/14 00:23:59 massiot Exp $ * * Authors: Samuel Hocevar * @@ -150,8 +150,7 @@ static int SetFormat( aout_instance_t *p_aout ) * p_aout->output.output.i_rate / ESD_DEFAULT_RATE * aout_FormatTo( &p_aout->output.output, 1 ) ) * (mtime_t)1000000 - / (mtime_t)aout_FormatToByterate( &p_aout->output.output, - p_aout->output.output.i_rate ); + / (mtime_t)aout_FormatToByterate( &p_aout->output.output ); p_sys->b_initialized = VLC_TRUE; @@ -207,13 +206,13 @@ static int ESDThread( aout_instance_t * p_aout ) if ( p_buffer != NULL ) { p_bytes = p_buffer->p_buffer; - i_size = aout_FormatToSize( &p_aout->output.output, - p_buffer->i_nb_samples ); + i_size = p_buffer->i_nb_bytes; } else { - i_size = aout_FormatToSize( &p_aout->output.output, - ESD_BUF_SIZE * 2 ); + i_size = aout_FormatToByterate( &p_aout->output.output ) + * ESD_BUF_SIZE * 2 + / p_aout->output.output.i_rate; p_bytes = alloca( i_size ); memset( p_bytes, 0, i_size ); } diff --git a/modules/audio_output/file.c b/modules/audio_output/file.c index 4ec06747e1..84de6fc5ee 100644 --- a/modules/audio_output/file.c +++ b/modules/audio_output/file.c @@ -2,7 +2,7 @@ * file.c : audio output which writes the samples to a file ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: file.c,v 1.4 2002/08/12 22:12:51 massiot Exp $ + * $Id: file.c,v 1.5 2002/08/14 00:23:59 massiot Exp $ * * Authors: Christophe Massiot * @@ -34,6 +34,7 @@ #include "aout_internal.h" #define FRAME_SIZE 2048 +#define A52_FRAME_NB 1536 /***************************************************************************** * Local prototypes. @@ -57,7 +58,7 @@ static char *format_list[] = { "u8", "s8", "u16", "s16", "u16_le", "s16_le", static int format_int[] = { AOUT_FMT_U8, AOUT_FMT_S8, AOUT_FMT_U16_NE, AOUT_FMT_S16_NE, AOUT_FMT_U16_LE, AOUT_FMT_S16_LE, AOUT_FMT_U16_BE, AOUT_FMT_S16_BE, AOUT_FMT_FIXED32, - AOUT_FMT_FLOAT32, AOUT_FMT_A52 }; + AOUT_FMT_FLOAT32, AOUT_FMT_SPDIF }; #define PATH_TEXT N_("Path of the output file") #define PATH_LONGTEXT N_("By default samples.raw") @@ -82,7 +83,8 @@ static int Open( vlc_object_t * p_this ) FILE * p_file; char * psz_name = config_GetPsz( p_this, "path" ); - (FILE *)p_aout->output.p_sys = p_file = fopen( psz_name, "wb" ); + p_file = fopen( psz_name, "wb" ); + p_aout->output.p_sys = (void *)p_file; free( psz_name ); if ( p_file == NULL ) return -1; @@ -128,7 +130,16 @@ static int SetFormat( aout_instance_t * p_aout ) } p_aout->output.output.i_format = format_int[i]; - p_aout->output.i_nb_samples = FRAME_SIZE; + if ( p_aout->output.output.i_format == AOUT_FMT_SPDIF ) + { + p_aout->output.i_nb_samples = A52_FRAME_NB; + p_aout->output.output.i_bytes_per_sec = p_aout->output.output.i_rate + * AOUT_SPDIF_SIZE / A52_FRAME_NB; + } + else + { + p_aout->output.i_nb_samples = FRAME_SIZE; + } return 0; } @@ -137,9 +148,7 @@ static int SetFormat( aout_instance_t * p_aout ) *****************************************************************************/ static void Play( aout_instance_t * p_aout, aout_buffer_t * p_buffer ) { - if( fwrite( p_buffer->p_buffer, - aout_FormatToSize( &p_aout->output.output, - p_buffer->i_nb_samples ), 1, + if( fwrite( p_buffer->p_buffer, p_buffer->i_nb_bytes, 1, (FILE *)p_aout->output.p_sys ) != 1 ) { msg_Err( p_aout, "write error (%s)", strerror(errno) ); diff --git a/modules/audio_output/oss.c b/modules/audio_output/oss.c index 09350b6e76..7e1f67d205 100644 --- a/modules/audio_output/oss.c +++ b/modules/audio_output/oss.c @@ -2,7 +2,7 @@ * oss.c : OSS /dev/dsp module for vlc ***************************************************************************** * Copyright (C) 2000-2002 VideoLAN - * $Id: oss.c,v 1.8 2002/08/13 11:59:36 sam Exp $ + * $Id: oss.c,v 1.9 2002/08/14 00:23:59 massiot Exp $ * * Authors: Michel Kaempf * Samuel Hocevar @@ -65,7 +65,8 @@ struct aout_sys_t volatile vlc_bool_t b_initialized; }; -#define DEFAULT_FRAME_SIZE 2048 +#define FRAME_SIZE 2048 +#define A52_FRAME_NB 1536 /***************************************************************************** * Local prototypes @@ -167,15 +168,16 @@ static int SetFormat( aout_instance_t *p_aout ) } /* Set the output format */ - if ( AOUT_FMT_IS_SPDIF( &p_aout->output.output ) ) + if ( p_aout->output.output.i_format == AOUT_FMT_SPDIF ) { - p_aout->output.output.i_format = i_format = AOUT_FMT_SPDIF; - p_aout->output.i_nb_samples = 1; + p_aout->output.i_nb_samples = A52_FRAME_NB; + p_aout->output.output.i_bytes_per_sec = p_aout->output.output.i_rate + * AOUT_SPDIF_SIZE / A52_FRAME_NB; } else { p_aout->output.output.i_format = i_format = AOUT_FMT_S16_NE; - p_aout->output.i_nb_samples = DEFAULT_FRAME_SIZE; + p_aout->output.i_nb_samples = FRAME_SIZE; } if( ioctl( p_sys->i_fd, SNDCTL_DSP_SETFMT, &i_format ) < 0 @@ -186,7 +188,7 @@ static int SetFormat( aout_instance_t *p_aout ) return -1; } - if ( !AOUT_FMT_IS_SPDIF( &p_aout->output.output ) ) + if ( p_aout->output.output.i_format != AOUT_FMT_SPDIF ) { /* FIXME */ if ( p_aout->output.output.i_channels > 2 ) @@ -308,8 +310,7 @@ static int OSSThread( aout_instance_t * p_aout ) * Order is important here, since GetBufInfo is believed to take * more time than mdate(). */ next_date = (mtime_t)GetBufInfo( p_aout ) * 1000000 - / aout_FormatToByterate( &p_aout->output.output, - p_aout->output.output.i_rate ); + / aout_FormatToByterate( &p_aout->output.output ); next_date += mdate(); } @@ -318,13 +319,13 @@ static int OSSThread( aout_instance_t * p_aout ) if ( p_buffer != NULL ) { p_bytes = p_buffer->p_buffer; - i_size = aout_FormatToSize( &p_aout->output.output, - p_buffer->i_nb_samples ); + i_size = p_buffer->i_nb_bytes; } else { - i_size = aout_FormatToSize( &p_aout->output.output, - DEFAULT_FRAME_SIZE ); + i_size = aout_FormatToByterate( &p_aout->output.output ) + * FRAME_SIZE + / p_aout->output.output.i_rate; p_bytes = alloca( i_size ); memset( p_bytes, 0, i_size ); } diff --git a/modules/codec/a52.c b/modules/codec/a52.c index c9a8e3f572..f48e40dcc4 100644 --- a/modules/codec/a52.c +++ b/modules/codec/a52.c @@ -4,7 +4,7 @@ * (http://liba52.sf.net/). ***************************************************************************** * Copyright (C) 2001, 2002 VideoLAN - * $Id: a52.c,v 1.3 2002/08/13 11:59:36 sam Exp $ + * $Id: a52.c,v 1.4 2002/08/14 00:23:59 massiot Exp $ * * Authors: Gildas Bazin * Christophe Massiot @@ -49,7 +49,7 @@ # include "a52dec/a52.h" #endif -#define A52_FRAME_SIZE 1536 +#define A52_FRAME_NB 1536 /***************************************************************************** * a52_thread_t : a52 decoder thread descriptor @@ -301,10 +301,10 @@ static int DecodeFrame( a52_thread_t * p_dec, byte_t * p_frame_buffer ) } p_buffer = aout_BufferNew( p_dec->p_aout, p_dec->p_aout_input, - A52_FRAME_SIZE ); + A52_FRAME_NB ); if ( p_buffer == NULL ) return -1; p_buffer->start_date = p_dec->last_date; - p_dec->last_date += (mtime_t)(A52_FRAME_SIZE * 1000000) + p_dec->last_date += (mtime_t)(A52_FRAME_NB * 1000000) / p_dec->output_format.i_rate; p_buffer->end_date = p_dec->last_date; diff --git a/modules/codec/spdif.c b/modules/codec/spdif.c index 433f6635e4..758f9f7251 100644 --- a/modules/codec/spdif.c +++ b/modules/codec/spdif.c @@ -2,7 +2,7 @@ * spdif.c: A52 pass-through to external decoder with enabled soundcard ***************************************************************************** * Copyright (C) 2001-2002 VideoLAN - * $Id: spdif.c,v 1.4 2002/08/12 22:12:51 massiot Exp $ + * $Id: spdif.c,v 1.5 2002/08/14 00:23:59 massiot Exp $ * * Authors: Stéphane Borel * Juha Yrjola @@ -40,7 +40,7 @@ # include #endif -#define A52_FRAME_SIZE 1536 +#define A52_FRAME_NB 1536 /***************************************************************************** * spdif_thread_t : A52 pass-through thread descriptor @@ -137,8 +137,8 @@ static int RunDecoder( decoder_fifo_t *p_fifo ) return -1; } - /* liba52 decoder thread's main loop */ - while( !p_dec->p_fifo->b_die && !p_dec->p_fifo->b_error ) + /* decoder thread's main loop */ + while ( !p_dec->p_fifo->b_die && !p_dec->p_fifo->b_error ) { int i_frame_size, i_flags, i_rate, i_bit_rate; mtime_t pts; @@ -148,8 +148,8 @@ static int RunDecoder( decoder_fifo_t *p_fifo ) /* Look for sync word - should be 0x0b77 */ RealignBits( &p_dec->bit_stream ); - while( (ShowBits( &p_dec->bit_stream, 16 ) ) != 0x0b77 && - (!p_dec->p_fifo->b_die) && (!p_dec->p_fifo->b_error)) + while ( (ShowBits( &p_dec->bit_stream, 16 ) ) != 0x0b77 && + (!p_dec->p_fifo->b_die) && (!p_dec->p_fifo->b_error)) { RemoveBits( &p_dec->bit_stream, 8 ); } @@ -169,7 +169,8 @@ static int RunDecoder( decoder_fifo_t *p_fifo ) } if( (p_dec->p_aout_input != NULL) && - ( (p_dec->output_format.i_rate != i_rate) ) ) + ( (p_dec->output_format.i_rate != i_rate) + || (p_dec->output_format.i_bytes_per_sec != i_bit_rate * 1000 / 8) ) ) { /* Parameters changed - this should not happen. */ aout_InputDelete( p_dec->p_aout, p_dec->p_aout_input ); @@ -180,6 +181,7 @@ static int RunDecoder( decoder_fifo_t *p_fifo ) if( p_dec->p_aout_input == NULL ) { p_dec->output_format.i_rate = i_rate; + p_dec->output_format.i_bytes_per_sec = i_bit_rate * 1000 / 8; /* p_dec->output_format.i_channels = i_channels; */ p_dec->p_aout_input = aout_InputNew( p_dec->p_fifo, &p_dec->p_aout, @@ -209,10 +211,10 @@ static int RunDecoder( decoder_fifo_t *p_fifo ) } p_buffer = aout_BufferNew( p_dec->p_aout, p_dec->p_aout_input, - i_frame_size ); + A52_FRAME_NB ); if ( p_buffer == NULL ) return -1; p_buffer->start_date = last_date; - last_date += (mtime_t)(A52_FRAME_SIZE * 1000000) + last_date += (mtime_t)(A52_FRAME_NB * 1000000) / p_dec->output_format.i_rate; p_buffer->end_date = last_date; diff --git a/modules/misc/dummy/aout.c b/modules/misc/dummy/aout.c index 09b67bf073..3c40338d78 100644 --- a/modules/misc/dummy/aout.c +++ b/modules/misc/dummy/aout.c @@ -2,7 +2,7 @@ * aout_dummy.c : dummy audio output plugin ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: aout.c,v 1.3 2002/08/12 22:12:51 massiot Exp $ + * $Id: aout.c,v 1.4 2002/08/14 00:23:59 massiot Exp $ * * Authors: Christophe Massiot * @@ -33,6 +33,7 @@ #include "aout_internal.h" #define FRAME_SIZE 2048 +#define A52_FRAME_NB 1536 /***************************************************************************** * Local prototypes. @@ -58,7 +59,16 @@ int E_(OpenAudio) ( vlc_object_t * p_this ) *****************************************************************************/ static int SetFormat( aout_instance_t * p_aout ) { - p_aout->output.i_nb_samples = FRAME_SIZE; + if ( p_aout->output.output.i_format == AOUT_FMT_SPDIF ) + { + p_aout->output.i_nb_samples = A52_FRAME_NB; + p_aout->output.output.i_bytes_per_sec = p_aout->output.output.i_rate + * AOUT_SPDIF_SIZE / A52_FRAME_NB; + } + else + { + p_aout->output.i_nb_samples = FRAME_SIZE; + } return 0; } diff --git a/src/audio_output/audio_output.c b/src/audio_output/audio_output.c index 1bda239b78..15605d8f4d 100644 --- a/src/audio_output/audio_output.c +++ b/src/audio_output/audio_output.c @@ -2,7 +2,7 @@ * audio_output.c : audio output instance ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: audio_output.c,v 1.94 2002/08/12 09:34:15 sam Exp $ + * $Id: audio_output.c,v 1.95 2002/08/14 00:23:59 massiot Exp $ * * Authors: Christophe Massiot * @@ -88,12 +88,15 @@ aout_buffer_t * aout_BufferNew( aout_instance_t * p_aout, size_t i_nb_samples ) { aout_buffer_t * p_buffer; + mtime_t duration = (1000000 * (mtime_t)i_nb_samples) + / p_input->input.i_rate; /* This necessarily allocates in the heap. */ - aout_BufferAlloc( &p_input->input_alloc, (u64)(1000000 * i_nb_samples) - / p_input->input.i_rate, - NULL, p_buffer ); + aout_BufferAlloc( &p_input->input_alloc, duration, NULL, p_buffer ); p_buffer->i_nb_samples = i_nb_samples; + p_buffer->i_nb_bytes = duration + * aout_FormatToByterate( &p_input->input ) + / 1000000; if ( p_buffer == NULL ) { @@ -161,10 +164,9 @@ void aout_BufferPlay( aout_instance_t * p_aout, aout_input_t * p_input, } /***************************************************************************** - * aout_FormatTo : compute the number of bytes/sample for format (used for - * aout_FormatToByterate and aout_FormatToSize) + * aout_FormatToByterate : compute the number of bytes per second *****************************************************************************/ -int aout_FormatTo( audio_sample_format_t * p_format, int i_multiplier ) +int aout_FormatToByterate( audio_sample_format_t * p_format ) { int i_result; @@ -188,17 +190,16 @@ int aout_FormatTo( audio_sample_format_t * p_format, int i_multiplier ) break; case AOUT_FMT_SPDIF: - case AOUT_FMT_A52: /* Actually smaller and variable, but who cares ? */ - case AOUT_FMT_DTS: /* Unimplemented and untested */ - /* Please note that we don't multiply by multiplier, because i_rate - * and i_nb_samples do not have any sense for S/PDIF (yes, it - * _is_ kludgy). --Meuuh */ - return AOUT_SPDIF_SIZE; + case AOUT_FMT_A52: + case AOUT_FMT_DTS: + /* For these formats the caller has to indicate the number of bytes + * per second it evaluates. */ + return p_format->i_bytes_per_sec; default: return 0; /* will segfault much sooner... */ } - return i_result * p_format->i_channels * i_multiplier; + return i_result * p_format->i_channels * p_format->i_rate; } diff --git a/src/audio_output/filters.c b/src/audio_output/filters.c index 5c4d340c51..7afe654444 100644 --- a/src/audio_output/filters.c +++ b/src/audio_output/filters.c @@ -2,7 +2,7 @@ * filters.c : audio output filters management ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: filters.c,v 1.3 2002/08/12 09:34:15 sam Exp $ + * $Id: filters.c,v 1.4 2002/08/14 00:23:59 massiot Exp $ * * Authors: Christophe Massiot * @@ -161,10 +161,8 @@ void aout_FiltersHintBuffers( aout_instance_t * p_aout, { aout_filter_t * p_filter = pp_filters[i]; - int i_output_size = aout_FormatToByterate( &p_filter->output, - p_filter->output.i_rate ); - int i_input_size = aout_FormatToByterate( &p_filter->input, - p_filter->input.i_rate ); + int i_output_size = aout_FormatToByterate( &p_filter->output ); + int i_input_size = aout_FormatToByterate( &p_filter->input ); p_first_alloc->i_bytes_per_sec = __MAX( p_first_alloc->i_bytes_per_sec, i_output_size ); @@ -209,8 +207,8 @@ void aout_FiltersPlay( aout_instance_t * p_aout, msg_Err( p_aout, "out of memory" ); return; } - /* Please note that p_output_buffer->i_nb_samples shall be set by - * the filter plug-in. */ + /* Please note that p_output_buffer->i_nb_samples & i_nb_bytes + * shall be set by the filter plug-in. */ p_filter->pf_do_work( p_aout, p_filter, *pp_input_buffer, p_output_buffer ); diff --git a/src/audio_output/input.c b/src/audio_output/input.c index b1ce100d96..4b915306f9 100644 --- a/src/audio_output/input.c +++ b/src/audio_output/input.c @@ -2,7 +2,7 @@ * input.c : internal management of input streams for the audio output ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: input.c,v 1.3 2002/08/12 22:12:51 massiot Exp $ + * $Id: input.c,v 1.4 2002/08/14 00:23:59 massiot Exp $ * * Authors: Christophe Massiot * @@ -64,6 +64,8 @@ static aout_input_t * InputNew( aout_instance_t * p_aout, memcpy( &p_input->input, p_format, sizeof(audio_sample_format_t) ); + p_input->input.i_bytes_per_sec = + aout_FormatToByterate( &p_input->input ); /* Prepare FIFO. */ aout_FifoInit( p_aout, &p_input->fifo ); @@ -117,8 +119,7 @@ static aout_input_t * InputNew( aout_instance_t * p_aout, /* i_bytes_per_sec is still == -1 if no filters */ p_input->input_alloc.i_bytes_per_sec = __MAX( p_input->input_alloc.i_bytes_per_sec, - aout_FormatToByterate( &p_input->input, - p_input->input.i_rate ) ); + p_input->input.i_bytes_per_sec ); /* Allocate in the heap, it is more convenient for the decoder. */ p_input->input_alloc.i_alloc_type = AOUT_ALLOC_HEAP; diff --git a/src/audio_output/mixer.c b/src/audio_output/mixer.c index 040c7d6254..2aa2204066 100644 --- a/src/audio_output/mixer.c +++ b/src/audio_output/mixer.c @@ -2,7 +2,7 @@ * mixer.c : audio output mixing operations ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: mixer.c,v 1.3 2002/08/12 22:12:51 massiot Exp $ + * $Id: mixer.c,v 1.4 2002/08/14 00:23:59 massiot Exp $ * * Authors: Christophe Massiot * @@ -122,6 +122,9 @@ void aout_MixerRun( aout_instance_t * p_aout ) return; } p_output_buffer->i_nb_samples = p_aout->output.i_nb_samples; + p_output_buffer->i_nb_bytes = (wanted_date - first_date) + * aout_FormatToByterate( &p_aout->mixer.output ) + / 1000000; p_output_buffer->start_date = first_date; p_output_buffer->end_date = wanted_date; p_aout->output.last_date = wanted_date; diff --git a/src/audio_output/output.c b/src/audio_output/output.c index 48e61e6122..bde793c5b2 100644 --- a/src/audio_output/output.c +++ b/src/audio_output/output.c @@ -2,7 +2,7 @@ * output.c : internal management of output streams for the audio output ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: output.c,v 1.4 2002/08/12 22:12:51 massiot Exp $ + * $Id: output.c,v 1.5 2002/08/14 00:23:59 massiot Exp $ * * Authors: Christophe Massiot * @@ -61,7 +61,7 @@ int aout_OutputNew( aout_instance_t * p_aout, memcpy( &p_aout->output.output, p_format, sizeof(audio_sample_format_t) ); if ( i_rate != -1 ) p_aout->output.output.i_rate = i_rate; if ( i_channels != -1 ) p_aout->output.output.i_channels = i_channels; - if ( AOUT_FMT_IS_SPDIF(&p_aout->output.output) ) + if ( AOUT_FMT_NON_LINEAR(&p_aout->output.output) ) { p_aout->output.output.i_format = AOUT_FMT_SPDIF; } @@ -88,22 +88,30 @@ int aout_OutputNew( aout_instance_t * p_aout, /* Calculate the resulting mixer output format. */ p_aout->mixer.output.i_channels = p_aout->output.output.i_channels; p_aout->mixer.output.i_rate = p_aout->output.output.i_rate; - if ( AOUT_FMT_IS_SPDIF(&p_aout->output.output) ) - { - p_aout->mixer.output.i_format = AOUT_FMT_SPDIF; - } - else + if ( !AOUT_FMT_NON_LINEAR(&p_aout->output.output) ) { /* Non-S/PDIF mixer only deals with float32 or fixed32. */ p_aout->mixer.output.i_format = (p_aout->p_vlc->i_cpu & CPU_CAPABILITY_FPU) ? AOUT_FMT_FLOAT32 : AOUT_FMT_FIXED32; + p_aout->mixer.output.i_bytes_per_sec + = aout_FormatToByterate( &p_aout->mixer.output ); } + else + { + p_aout->mixer.output.i_format = p_format->i_format; + p_aout->mixer.output.i_bytes_per_sec = p_format->i_bytes_per_sec; + } + + msg_Dbg( p_aout, "mixer format=%d rate=%d channels=%d", + p_aout->mixer.output.i_format, p_aout->mixer.output.i_rate, + p_aout->mixer.output.i_channels ); /* Calculate the resulting mixer input format. */ p_aout->mixer.input.i_channels = -1; /* unchanged */ p_aout->mixer.input.i_rate = p_aout->mixer.output.i_rate; p_aout->mixer.input.i_format = p_aout->mixer.output.i_format; + p_aout->mixer.input.i_bytes_per_sec = p_aout->mixer.output.i_bytes_per_sec; /* Create filters. */ if ( aout_FiltersCreatePipeline( p_aout, p_aout->output.pp_filters, @@ -119,8 +127,7 @@ int aout_OutputNew( aout_instance_t * p_aout, /* Prepare hints for the buffer allocator. */ p_aout->mixer.output_alloc.i_alloc_type = AOUT_ALLOC_HEAP; p_aout->mixer.output_alloc.i_bytes_per_sec - = aout_FormatToByterate( &p_aout->output.output, - p_aout->output.output.i_rate ); + = aout_FormatToByterate( &p_aout->output.output ); aout_FiltersHintBuffers( p_aout, p_aout->output.pp_filters, p_aout->output.i_nb_filters, diff --git a/src/misc/modules_plugin.h b/src/misc/modules_plugin.h index 442c46116d..6d7368d47c 100644 --- a/src/misc/modules_plugin.h +++ b/src/misc/modules_plugin.h @@ -184,7 +184,7 @@ static const char * module_error( char *psz_buffer ) (p_symbols)->aout_BufferNew_inner = aout_BufferNew; \ (p_symbols)->aout_BufferDelete_inner = aout_BufferDelete; \ (p_symbols)->aout_BufferPlay_inner = aout_BufferPlay; \ - (p_symbols)->aout_FormatTo_inner = aout_FormatTo; \ + (p_symbols)->aout_FormatToByterate_inner = aout_FormatToByterate; \ (p_symbols)->__aout_InputNew_inner = __aout_InputNew; \ (p_symbols)->aout_InputDelete_inner = aout_InputDelete; \ (p_symbols)->aout_OutputNextBuffer_inner = aout_OutputNextBuffer; \ -- 2.39.2