Main Page | Modules | Class Hierarchy | Class List | Directories | File List | Class Members | File Members | Related Pages

audio_output.h

00001 /*****************************************************************************
00002  * audio_output.h : audio output interface
00003  *****************************************************************************
00004  * Copyright (C) 2002-2005 the VideoLAN team
00005  * $Id: audio_output.h 13671 2005-12-10 19:26:03Z hartman $
00006  *
00007  * Authors: Christophe Massiot <[email protected]>
00008  *
00009  * This program is free software; you can redistribute it and/or modify
00010  * it under the terms of the GNU General Public License as published by
00011  * the Free Software Foundation; either version 2 of the License, or
00012  * (at your option) any later version.
00013  *
00014  * This program is distributed in the hope that it will be useful,
00015  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00016  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017  * GNU General Public License for more details.
00018  *
00019  * You should have received a copy of the GNU General Public License
00020  * along with this program; if not, write to the Free Software
00021  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
00022  *****************************************************************************/
00023 #ifndef _VLC_AUDIO_OUTPUT_H
00024 #define _VLC_AUDIO_OUTPUT_H 1
00025 
00026 #include "vlc_es.h"
00027 
00028 #define AOUT_FMTS_IDENTICAL( p_first, p_second ) (                          \
00029     ((p_first)->i_format == (p_second)->i_format)                           \
00030       && ((p_first)->i_rate == (p_second)->i_rate)                          \
00031       && ((p_first)->i_physical_channels == (p_second)->i_physical_channels)\
00032       && ((p_first)->i_original_channels == (p_second)->i_original_channels) )
00033 
00034 /* Check if i_rate == i_rate and i_channels == i_channels */
00035 #define AOUT_FMTS_SIMILAR( p_first, p_second ) (                            \
00036     ((p_first)->i_rate == (p_second)->i_rate)                               \
00037       && ((p_first)->i_physical_channels == (p_second)->i_physical_channels)\
00038       && ((p_first)->i_original_channels == (p_second)->i_original_channels) )
00039 
00040 #ifdef WORDS_BIGENDIAN
00041 #   define AOUT_FMT_S16_NE VLC_FOURCC('s','1','6','b')
00042 #   define AOUT_FMT_U16_NE VLC_FOURCC('u','1','6','b')
00043 #   define AOUT_FMT_S24_NE VLC_FOURCC('s','2','4','b')
00044 #   define AOUT_FMT_SPDIF_NE VLC_FOURCC('s','p','d','b')
00045 #else
00046 #   define AOUT_FMT_S16_NE VLC_FOURCC('s','1','6','l')
00047 #   define AOUT_FMT_U16_NE VLC_FOURCC('u','1','6','l')
00048 #   define AOUT_FMT_S24_NE VLC_FOURCC('s','2','4','l')
00049 #   define AOUT_FMT_SPDIF_NE VLC_FOURCC('s','p','d','i')
00050 #endif
00051 
00052 #define AOUT_FMT_NON_LINEAR( p_format )                                    \
00053     ( ((p_format)->i_format == VLC_FOURCC('s','p','d','i'))                \
00054        || ((p_format)->i_format == VLC_FOURCC('s','p','d','b'))            \
00055        || ((p_format)->i_format == VLC_FOURCC('a','5','2',' '))            \
00056        || ((p_format)->i_format == VLC_FOURCC('d','t','s',' ')) )
00057 
00058 /* This is heavily borrowed from libmad, by Robert Leslie <[email protected]> */
00059 /*
00060  * Fixed-point format: 0xABBBBBBB
00061  * A == whole part      (sign + 3 bits)
00062  * B == fractional part (28 bits)
00063  *
00064  * Values are signed two's complement, so the effective range is:
00065  * 0x80000000 to 0x7fffffff
00066  *       -8.0 to +7.9999999962747097015380859375
00067  *
00068  * The smallest representable value is:
00069  * 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9)
00070  *
00071  * 28 bits of fractional accuracy represent about
00072  * 8.6 digits of decimal accuracy.
00073  *
00074  * Fixed-point numbers can be added or subtracted as normal
00075  * integers, but multiplication requires shifting the 64-bit result
00076  * from 56 fractional bits back to 28 (and rounding.)
00077  */
00078 typedef int32_t vlc_fixed_t;
00079 #define FIXED32_FRACBITS 28
00080 #define FIXED32_MIN ((vlc_fixed_t) -0x80000000L)
00081 #define FIXED32_MAX ((vlc_fixed_t) +0x7fffffffL)
00082 #define FIXED32_ONE ((vlc_fixed_t) 0x10000000)
00083 
00084 
00085 /*
00086  * Channels descriptions
00087  */
00088 
00089 /* Values available for physical and original channels */
00090 #define AOUT_CHAN_CENTER            0x1
00091 #define AOUT_CHAN_LEFT              0x2
00092 #define AOUT_CHAN_RIGHT             0x4
00093 #define AOUT_CHAN_REARCENTER        0x10
00094 #define AOUT_CHAN_REARLEFT          0x20
00095 #define AOUT_CHAN_REARRIGHT         0x40
00096 #define AOUT_CHAN_MIDDLELEFT        0x100
00097 #define AOUT_CHAN_MIDDLERIGHT       0x200
00098 #define AOUT_CHAN_LFE               0x1000
00099 
00100 /* Values available for original channels only */
00101 #define AOUT_CHAN_DOLBYSTEREO       0x10000
00102 #define AOUT_CHAN_DUALMONO          0x20000
00103 #define AOUT_CHAN_REVERSESTEREO     0x40000
00104 
00105 #define AOUT_CHAN_PHYSMASK          0xFFFF
00106 #define AOUT_CHAN_MAX               9
00107 
00108 /* Values used for the audio-device and audio-channels object variables */
00109 #define AOUT_VAR_MONO               1
00110 #define AOUT_VAR_STEREO             2
00111 #define AOUT_VAR_2F2R               4
00112 #define AOUT_VAR_3F2R               5
00113 #define AOUT_VAR_5_1                6
00114 #define AOUT_VAR_6_1                7
00115 #define AOUT_VAR_7_1                8
00116 #define AOUT_VAR_SPDIF              10
00117 
00118 #define AOUT_VAR_CHAN_STEREO        1
00119 #define AOUT_VAR_CHAN_RSTEREO       2
00120 #define AOUT_VAR_CHAN_LEFT          3
00121 #define AOUT_VAR_CHAN_RIGHT         4
00122 #define AOUT_VAR_CHAN_DOLBYS        5
00123 
00124 /*****************************************************************************
00125  * aout_buffer_t : audio output buffer
00126  *****************************************************************************/
00127 struct aout_buffer_t
00128 {
00129     byte_t *                p_buffer;
00130     int                     i_alloc_type;
00131     /* i_size is the real size of the buffer (used for debug ONLY), i_nb_bytes
00132      * is the number of significative bytes in it. */
00133     size_t                  i_size, i_nb_bytes;
00134     unsigned int            i_nb_samples;
00135     mtime_t                 start_date, end_date;
00136 
00137     struct aout_buffer_t *  p_next;
00138 
00141     void * p_sys;
00142 
00144     void (*pf_release)( aout_buffer_t * );
00145 };
00146 
00147 /* Size of a frame for S/PDIF output. */
00148 #define AOUT_SPDIF_SIZE 6144
00149 
00150 /* Number of samples in an A/52 frame. */
00151 #define A52_FRAME_NB 1536
00152 
00153 /*****************************************************************************
00154  * audio_date_t : date incrementation without long-term rounding errors
00155  *****************************************************************************/
00156 struct audio_date_t
00157 {
00158     mtime_t  date;
00159     uint32_t i_divider;
00160     uint32_t i_remainder;
00161 };
00162 
00163 /*****************************************************************************
00164  * Prototypes
00165  *****************************************************************************/
00166 /* From common.c : */
00167 #define aout_New(a) __aout_New(VLC_OBJECT(a))
00168 VLC_EXPORT( aout_instance_t *, __aout_New, ( vlc_object_t * ) );
00169 VLC_EXPORT( void, aout_Delete, ( aout_instance_t * ) );
00170 VLC_EXPORT( void, aout_DateInit, ( audio_date_t *, uint32_t ) );
00171 VLC_EXPORT( void, aout_DateSet, ( audio_date_t *, mtime_t ) );
00172 VLC_EXPORT( void, aout_DateMove, ( audio_date_t *, mtime_t ) );
00173 VLC_EXPORT( mtime_t, aout_DateGet, ( const audio_date_t * ) );
00174 VLC_EXPORT( mtime_t, aout_DateIncrement, ( audio_date_t *, uint32_t ) );
00175 
00176 VLC_EXPORT( int, aout_CheckChannelReorder, ( const uint32_t *, const uint32_t *, uint32_t, int, int * ) );
00177 VLC_EXPORT( void, aout_ChannelReorder, ( uint8_t *, int, int, const int *, int ) );
00178 
00179 /* From dec.c : */
00180 #define aout_DecNew(a, b, c) __aout_DecNew(VLC_OBJECT(a), b, c)
00181 VLC_EXPORT( aout_input_t *, __aout_DecNew, ( vlc_object_t *, aout_instance_t **, audio_sample_format_t * ) );
00182 VLC_EXPORT( int, aout_DecDelete, ( aout_instance_t *, aout_input_t * ) );
00183 VLC_EXPORT( aout_buffer_t *, aout_DecNewBuffer, ( aout_instance_t *, aout_input_t *, size_t ) );
00184 VLC_EXPORT( void, aout_DecDeleteBuffer, ( aout_instance_t *, aout_input_t *, aout_buffer_t * ) );
00185 VLC_EXPORT( int, aout_DecPlay, ( aout_instance_t *, aout_input_t *, aout_buffer_t * ) );
00186 
00187 /* From intf.c : */
00188 #define aout_VolumeGet(a, b) __aout_VolumeGet(VLC_OBJECT(a), b)
00189 VLC_EXPORT( int, __aout_VolumeGet, ( vlc_object_t *, audio_volume_t * ) );
00190 #define aout_VolumeSet(a, b) __aout_VolumeSet(VLC_OBJECT(a), b)
00191 VLC_EXPORT( int, __aout_VolumeSet, ( vlc_object_t *, audio_volume_t ) );
00192 #define aout_VolumeInfos(a, b) __aout_VolumeInfos(VLC_OBJECT(a), b)
00193 VLC_EXPORT( int, __aout_VolumeInfos, ( vlc_object_t *, audio_volume_t * ) );
00194 #define aout_VolumeUp(a, b, c) __aout_VolumeUp(VLC_OBJECT(a), b, c)
00195 VLC_EXPORT( int, __aout_VolumeUp, ( vlc_object_t *, int, audio_volume_t * ) );
00196 #define aout_VolumeDown(a, b, c) __aout_VolumeDown(VLC_OBJECT(a), b, c)
00197 VLC_EXPORT( int, __aout_VolumeDown, ( vlc_object_t *, int, audio_volume_t * ) );
00198 #define aout_VolumeMute(a, b) __aout_VolumeMute(VLC_OBJECT(a), b)
00199 VLC_EXPORT( int, __aout_VolumeMute, ( vlc_object_t *, audio_volume_t * ) );
00200 VLC_EXPORT( int, aout_Restart, ( aout_instance_t * p_aout ) );
00201 VLC_EXPORT( int, aout_FindAndRestart, ( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * ) );
00202 VLC_EXPORT( int, aout_ChannelsRestart, ( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * ) );
00203 
00204 #endif /* _VLC_AUDIO_OUTPUT_H */

Generated on Tue Dec 20 10:14:18 2005 for vlc-0.8.4a by  doxygen 1.4.2