X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Faudio_output.h;h=a8f1d15ecae9dd05f99ca059e3e0bf8bb81dbea7;hb=440f9992ee947ea5fd0debbf35fdd1011c6404b3;hp=ea9a5c7f9863a0067959a743e99a1c9c3df860bc;hpb=9be218d524fe2be7ff56416f404df9eca23ea460;p=vlc diff --git a/include/audio_output.h b/include/audio_output.h index ea9a5c7f98..a8f1d15eca 100644 --- a/include/audio_output.h +++ b/include/audio_output.h @@ -2,96 +2,41 @@ * audio_output.h : audio output thread interface ***************************************************************************** * Copyright (C) 1999, 2000 VideoLAN + * $Id: audio_output.h,v 1.37 2001/05/30 17:03:11 sam Exp $ * - * Authors: + * Authors: Michel Kaempf * * 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. + * 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-1307, USA. + * 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. *****************************************************************************/ /***************************************************************************** - * Required headers: - * - "common.h" ( boolean_t ) - * - "mtime.h" ( mtime_t ) - * - "threads.h" ( vlc_thread_t ) + * 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 ]; -/* 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 + 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 ) +extern aout_bank_t *p_aout_bank; /***************************************************************************** * aout_increment_t @@ -100,7 +45,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. */ @@ -124,11 +69,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; @@ -162,26 +108,22 @@ 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_SPDIF_FIFO 5 /***************************************************************************** * 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; @@ -191,16 +133,13 @@ typedef struct aout_thread_s vlc_mutex_t fifos_lock; aout_fifo_t fifo[ AOUT_MAX_FIFOS ]; - /* Plugins */ - plugin_id_t aout_plugin; /* video output plugin */ - 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 @@ -220,6 +159,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 */ @@ -234,10 +176,6 @@ typedef struct aout_thread_s * for the OSS output */ p_aout_sys_t p_sys; - - /* there is the current volume */ - int vol; - } aout_thread_t; /* Those are from but are needed because of formats @@ -248,19 +186,30 @@ 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 ); +void aout_InitBank ( void ); +void aout_EndBank ( void ); +aout_thread_t * aout_CreateThread ( int *pi_status ); +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 ); +