X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Faudio_output.h;h=5814e9bb64500c6a26816ac048ee4627c0314811;hb=55545622ab2370903188ce700afaf6a81d7fc458;hp=80d909104fd321115b939b1952a2933701383512;hpb=57e189eb5d1d387f2036c31720e1e9aa8cb3ea78;p=vlc diff --git a/include/audio_output.h b/include/audio_output.h index 80d909104f..5814e9bb64 100644 --- a/include/audio_output.h +++ b/include/audio_output.h @@ -2,9 +2,10 @@ * audio_output.h : audio output thread interface ***************************************************************************** * Copyright (C) 1999, 2000 VideoLAN + * $Id: audio_output.h,v 1.48 2002/06/01 18:04:48 sam Exp $ * - * Authors: - * Michel Kaempf + * Authors: Michel Kaempf + * Cyril Deguet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,78 +22,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. *****************************************************************************/ -/***************************************************************************** - * Required headers: - * - "common.h" ( boolean_t ) - * - "mtime.h" ( mtime_t ) - * - "threads.h" ( vlc_thread_t ) - *****************************************************************************/ - -/* TODO : - * - * - Créer un flag destroy dans les fifos audio pour indiquer au thread audio - * qu'il peut libérer la mémoire occupée par le buffer de la fifo lorsqu'il - * le désire (fin du son ou fin du thread) - * - Redéplacer les #define dans config.h - * - */ - -/* - * Defines => "config.h" - */ - -/* Default output device. You probably should not change this. */ -#define AOUT_DEFAULT_DEVICE "/dev/dsp" - -/* Default audio output format (AOUT_FMT_S16_NE = Native Endianess) */ -#define AOUT_DEFAULT_FORMAT AOUT_FMT_S16_NE - -/* #define AOUT_DEFAULT_FORMAT AOUT_FMT_S8 */ -/* #define AOUT_DEFAULT_FORMAT AOUT_FMT_U8 */ -/* #define AOUT_DEFAULT_FORMAT AOUT_FMT_S16_BE */ -/* #define AOUT_DEFAULT_FORMAT AOUT_FMT_S16_LE */ -/* #define AOUT_DEFAULT_FORMAT AOUT_FMT_U16_BE */ -/* #define AOUT_DEFAULT_FORMAT AOUT_FMT_U16_LE */ - - -/* Default stereo mode (0 stands for mono, 1 for stereo) */ -#define AOUT_DEFAULT_STEREO 1 -/* #define AOUT_DEFAULT_STEREO 0 */ - -/* Audio output rate, in Hz */ -#define AOUT_MIN_RATE 22050 /* XXX?? */ -#define AOUT_DEFAULT_RATE 44100 -#define AOUT_MAX_RATE 48000 - - -/* Volume (default 100) */ -#define VOL 100 -#define VOLSTEP 5 -#define VOLMAX 300 - -/* Number of audio output frames contained in an audio output fifo. - * (AOUT_FIFO_SIZE + 1) must be a power of 2, in order to optimise the - * %(AOUT_FIFO_SIZE + 1) operation with an &AOUT_FIFO_SIZE. - * With 511 we have at least 511*384/2/48000=2 seconds of sound */ -#define AOUT_FIFO_SIZE 511 - -/* Maximum number of audio fifos. The value of AOUT_MAX_FIFOS should be a power - * of two, in order to optimize the '/AOUT_MAX_FIFOS' and '*AOUT_MAX_FIFOS' - * operations with '>>' and '<<' (gcc changes this at compilation-time) */ -#define AOUT_MAX_FIFOS 2 - -/* Duration (in microseconds) of an audio output buffer should be : - * - short, in order to be able to play a new song very quickly (especially a - * song from the interface) - * - long, in order to perform the buffer calculations as few as possible */ -#define AOUT_BUFFER_DURATION 100000 - -/* - * Macros - */ -#define AOUT_FIFO_ISEMPTY( fifo ) ( (fifo).l_end_frame == (fifo).i_start_frame ) -#define AOUT_FIFO_ISFULL( fifo ) ( ((((fifo).l_end_frame + 1) - (fifo).l_start_frame) & AOUT_FIFO_SIZE) == 0 ) - /***************************************************************************** * aout_increment_t ***************************************************************************** @@ -100,106 +29,102 @@ * order to avoid rounding problems and heavy computations, as the function * that handles this structure only uses additions. *****************************************************************************/ -typedef struct +typedef struct aout_increment_s { /* The remainder is used to keep track of the fractional part of the * index. */ - long l_remainder; + int i_r; /* * The increment structure is initialized with the result of an euclidean * division : * - * l_euclidean_numerator l_euclidean_remainder - * ----------------------- = l_euclidean_integer + ----------------------- - * l_euclidean_denominator l_euclidean_denominator + * i_x i_b + * ----- = i_a + ----- + * i_y i_c * */ - long l_euclidean_integer; - long l_euclidean_remainder; - long l_euclidean_denominator; + int i_a, i_b, i_c; } aout_increment_t; /***************************************************************************** * aout_fifo_t *****************************************************************************/ -typedef struct +struct aout_fifo_s { - /* See the fifo types below */ - int i_type; - boolean_t b_die; - + /* See the fifo formats below */ + int i_format; int i_channels; - boolean_t b_stereo; - long l_rate; + int i_rate; + int i_frame_size; + + vlc_bool_t b_die; + int i_fifo; /* Just to keep track of the fifo index */ vlc_mutex_t data_lock; vlc_cond_t data_wait; - long l_frame_size; - void * buffer; + u8 * buffer; mtime_t * date; + /* The start frame is the first frame in the buffer that contains decoded * audio data. It it also the first frame in the current timestamped frame * area, ie the first dated frame in the decoded part of the buffer. :-p */ - long l_start_frame; - boolean_t b_start_frame; + int i_start_frame; + vlc_bool_t b_start_frame; /* The next frame is the end frame of the current timestamped frame area, * ie the first dated frame after the start frame. */ - long l_next_frame; - boolean_t b_next_frame; + int i_next_frame; + vlc_bool_t b_next_frame; /* The end frame is the first frame, after the start frame, that doesn't * contain decoded audio data. That's why the end frame is the first frame * where the audio decoder can store its decoded audio frames. */ - long l_end_frame; + int i_end_frame; - long l_unit; + /* Current index in p_aout->buffer */ + int i_unit; + /* Max index in p_aout->buffer */ + int i_unit_limit; + /* Structure used to calculate i_unit with a Bresenham algorithm */ aout_increment_t unit_increment; + /* The following variable is used to store the number of remaining audio * units in the current timestamped frame area. */ - long l_units; + int i_units; +}; + +#define AOUT_FIFO_ISEMPTY( fifo ) \ + ( (fifo).i_end_frame == (fifo).i_start_frame ) + +#define AOUT_FIFO_ISFULL( fifo ) \ + ( ((((fifo).i_end_frame + 1) - (fifo).i_start_frame) & AOUT_FIFO_SIZE) == 0 ) -} aout_fifo_t; +#define AOUT_FIFO_INC( i_index ) \ + ( ((i_index) + 1) & AOUT_FIFO_SIZE ) -#define AOUT_EMPTY_FIFO 0 -#define AOUT_INTF_MONO_FIFO 1 -#define AOUT_INTF_STEREO_FIFO 2 -#define AOUT_ADEC_MONO_FIFO 3 -#define AOUT_ADEC_STEREO_FIFO 4 +/* List of known fifo formats */ +#define AOUT_FIFO_NONE 0 +#define AOUT_FIFO_PCM 1 +#define AOUT_FIFO_SPDIF 2 /***************************************************************************** * aout_thread_t : audio output thread descriptor *****************************************************************************/ -typedef int (aout_sys_open_t) ( p_aout_thread_t p_aout ); -typedef int (aout_sys_reset_t) ( p_aout_thread_t p_aout ); -typedef int (aout_sys_setformat_t) ( p_aout_thread_t p_aout ); -typedef int (aout_sys_setchannels_t) ( p_aout_thread_t p_aout ); -typedef int (aout_sys_setrate_t) ( p_aout_thread_t p_aout ); -typedef long (aout_sys_getbufinfo_t) ( p_aout_thread_t p_aout, - long l_buffer_limit ); -typedef void (aout_sys_playsamples_t) ( p_aout_thread_t p_aout, - byte_t *buffer, int i_size ); -typedef void (aout_sys_close_t) ( p_aout_thread_t p_aout ); - -typedef struct aout_thread_s +struct aout_thread_s { - vlc_thread_t thread_id; - boolean_t b_die; - boolean_t b_active; + VLC_COMMON_MEMBERS vlc_mutex_t fifos_lock; aout_fifo_t fifo[ AOUT_MAX_FIFOS ]; - /* Plugins */ - aout_sys_open_t * p_sys_open; - aout_sys_reset_t * p_sys_reset; - aout_sys_setformat_t * p_sys_setformat; - aout_sys_setchannels_t * p_sys_setchannels; - aout_sys_setrate_t * p_sys_setrate; - aout_sys_getbufinfo_t * p_sys_getbufinfo; - aout_sys_playsamples_t * p_sys_playsamples; - aout_sys_close_t * p_sys_close; + /* Plugin used and shortcuts to access its capabilities */ + module_t * p_module; + int ( *pf_open ) ( aout_thread_t * ); + int ( *pf_setformat ) ( aout_thread_t * ); + int ( *pf_getbufinfo ) ( aout_thread_t * , int ); + void ( *pf_play ) ( aout_thread_t * , byte_t *, int ); + void ( *pf_close ) ( aout_thread_t * ); void * buffer; /* The s32 buffer is used to mix all the audio fifos together before @@ -208,36 +133,29 @@ typedef struct aout_thread_s /* The size of the audio output buffer is kept in audio units, as this is * the only unit that is common with every audio decoder and audio fifo */ - long l_units; - long l_msleep; + int i_units; /* date is the moment where the first audio unit of the output buffer * will be played */ mtime_t date; - /* Path to the audio output device (default is set to "/dev/dsp") */ - char * psz_device; - int i_fd; + /* The current volume */ + int i_volume; + int i_savedvolume; - /* Format of the audio output samples */ + /* Format of the audio output samples, number of channels, and + * rate and gain (in Hz) of the audio output sound */ int i_format; - /* Number of channels */ int i_channels; - /* Mono or Stereo sound */ - boolean_t b_stereo; - /* Rate and gain of the audio output sound (in Hz) */ - long l_rate; - long l_gain; + int i_rate; + + /* Latency of the audio output plugin, in bytes */ + int i_latency; /* there might be some useful private structure, such as audio_buf_info * for the OSS output */ - p_aout_sys_t p_sys; - - - /* there is the current volume */ - int vol; - -} aout_thread_t; + aout_sys_t * p_sys; +}; /* Those are from but are needed because of formats * on other platforms */ @@ -247,19 +165,28 @@ typedef struct aout_thread_s #define AOUT_FMT_S8 0x00000040 #define AOUT_FMT_U16_LE 0x00000080 /* Little endian U16 */ #define AOUT_FMT_U16_BE 0x00000100 /* Big endian U16 */ +#define AOUT_FMT_AC3 0x00000400 /* Dolby Digital AC3 */ -#if __BYTE_ORDER == __LITTLE_ENDIAN -#define AOUT_FMT_S16_NE AOUT_FMT_S16_LE -#elif __BYTE_ORDER == __BIG_ENDIAN +#ifdef WORDS_BIGENDIAN #define AOUT_FMT_S16_NE AOUT_FMT_S16_BE +#else +#define AOUT_FMT_S16_NE AOUT_FMT_S16_LE #endif +/* Number of samples in an AC3 frame */ +#define AC3_FRAME_SIZE 1536 + +/* Size of a frame for spdif output */ +#define SPDIF_FRAME_SIZE 6144 + /***************************************************************************** * Prototypes *****************************************************************************/ -aout_thread_t * aout_CreateThread ( int *pi_status ); -void aout_DestroyThread ( aout_thread_t *p_aout, int *pi_status ); +aout_thread_t * aout_CreateThread ( vlc_object_t *, int, int ); +void aout_DestroyThread ( aout_thread_t * ); +#define aout_CreateFifo(a,b,c,d,e,f) __aout_CreateFifo(CAST_TO_VLC_OBJECT(a),b,c,d,e,f) +VLC_EXPORT( aout_fifo_t *, __aout_CreateFifo, ( vlc_object_t *, int, int, int, int, void * ) ); +VLC_EXPORT( void, aout_DestroyFifo, ( aout_fifo_t *p_fifo ) ); + void aout_FreeFifo ( aout_fifo_t *p_fifo ); -aout_fifo_t * aout_CreateFifo ( aout_thread_t *p_aout, aout_fifo_t *p_fifo ); -void aout_DestroyFifo ( aout_fifo_t *p_fifo );