X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Faudio_output.h;h=be1f5bf2f3f207775a6276a673647056dd1d8276;hb=cf3d0f29d2487ff675ca54ba3588040f3b18621a;hp=3fb36a62f82ee70f62be50c5ea269a4477c9abbd;hpb=1399f00e702fa0f34dabfb7d008731405c283947;p=vlc diff --git a/include/audio_output.h b/include/audio_output.h index 3fb36a62f8..be1f5bf2f3 100644 --- a/include/audio_output.h +++ b/include/audio_output.h @@ -1,71 +1,47 @@ /***************************************************************************** * audio_output.h : audio output thread interface - * (c)1999 VideoLAN ***************************************************************************** - * Required headers: - * - ( audio_buf_info ) - * - "common.h" ( boolean_t ) - * - "mtime.h" ( mtime_t ) - * - "vlc_thread.h" ( vlc_thread_t ) - *****************************************************************************/ - -/* TODO : + * Copyright (C) 1999, 2000 VideoLAN + * $Id: audio_output.h,v 1.41 2002/01/14 12:15:10 asmax Exp $ * - * - 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 + * Authors: Michel Kaempf + * Cyril Deguet * - */ - -/* - * 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 - -/* Audio output rate, in Hz */ -#define AOUT_MIN_RATE 22050 /* ?? */ -#define AOUT_DEFAULT_RATE 44100 -#define AOUT_MAX_RATE 48000 + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + *****************************************************************************/ -/* 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 +/***************************************************************************** + * aout_bank_t, p_aout_bank (global variable) + ***************************************************************************** + * This global variable is accessed by any function using the audio output. + *****************************************************************************/ +typedef struct aout_bank_s +{ + /* Array to all the audio outputs */ + struct aout_thread_s *pp_aout[ AOUT_MAX_THREADS ]; -/* 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 + int i_count; + vlc_mutex_t lock; /* Global lock */ -/* 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 +} aout_bank_t; -/* - * 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 ) +#ifndef PLUGIN +extern aout_bank_t *p_aout_bank; +#else +# define p_aout_bank (p_symbols->p_aout_bank) +#endif /***************************************************************************** * aout_increment_t @@ -74,7 +50,7 @@ * 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. */ @@ -98,11 +74,12 @@ typedef struct /***************************************************************************** * aout_fifo_t *****************************************************************************/ -typedef struct +typedef struct aout_fifo_s { /* See the fifo types below */ int i_type; boolean_t b_die; + int i_fifo; /* Just to keep track of the fifo index */ int i_channels; boolean_t b_stereo; @@ -136,43 +113,36 @@ typedef struct } aout_fifo_t; +#define AOUT_FIFO_ISEMPTY( fifo ) \ + ( (fifo).l_end_frame == (fifo).l_start_frame ) + +#define AOUT_FIFO_ISFULL( fifo ) \ + ( ((((fifo).l_end_frame + 1) - (fifo).l_start_frame) & AOUT_FIFO_SIZE) == 0 ) + #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 +#define AOUT_ADEC_MONO_FIFO 1 +#define AOUT_ADEC_STEREO_FIFO 2 +#define AOUT_ADEC_SPDIF_FIFO 3 /***************************************************************************** * 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 { vlc_thread_t thread_id; boolean_t b_die; + boolean_t b_active; vlc_mutex_t fifos_lock; aout_fifo_t fifo[ AOUT_MAX_FIFOS ]; - /* method-dependant functions */ - 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 */ + struct module_s * p_module; + int ( *pf_open ) ( p_aout_thread_t ); + int ( *pf_setformat ) ( p_aout_thread_t ); + long ( *pf_getbufinfo ) ( p_aout_thread_t, long ); + void ( *pf_play ) ( p_aout_thread_t, byte_t *, int ); + void ( *pf_close ) ( p_aout_thread_t ); void * buffer; /* The s32 buffer is used to mix all the audio fifos together before @@ -192,6 +162,9 @@ typedef struct aout_thread_s char * psz_device; int i_fd; + /* The current volume */ + int i_volume; + int i_savedvolume; /* Format of the audio output samples */ int i_format; /* Number of channels */ @@ -201,6 +174,7 @@ typedef struct aout_thread_s /* Rate and gain of the audio output sound (in Hz) */ long l_rate; long l_gain; + int i_latency; /* there might be some useful private structure, such as audio_buf_info * for the OSS output */ @@ -208,17 +182,6 @@ typedef struct aout_thread_s } aout_thread_t; -/* Output methods */ -#define AOUT_DUMMY_METHOD 0x0000 /* dummy video output */ -#define AOUT_DSP_METHOD 0x0001 /* linux /dev/dsp */ - -/* Get the fallback method */ -#ifdef AUDIO_DSP -#define AOUT_DEFAULT_METHOD "dsp" -#else -#define AOUT_DEFAULT_METHOD "dummy" -#endif - /* Those are from but are needed because of formats * on other platforms */ #define AOUT_FMT_U8 0x00000008 @@ -227,19 +190,36 @@ 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 ); +#ifndef PLUGIN +void aout_InitBank ( void ); +void aout_EndBank ( void ); +aout_thread_t * aout_CreateThread ( int *pi_status, int i_channels, + long l_rate ); +void aout_DestroyThread ( aout_thread_t *, int * ); -aout_fifo_t * aout_CreateFifo ( aout_thread_t *p_aout, aout_fifo_t *p_fifo ); +aout_fifo_t * aout_CreateFifo ( int, int, long, long, long, void * ); void aout_DestroyFifo ( aout_fifo_t *p_fifo ); +void aout_FreeFifo ( aout_fifo_t *p_fifo ); +#else +# define aout_CreateFifo p_symbols->aout_CreateFifo +# define aout_DestroyFifo p_symbols->aout_DestroyFifo +#endif +