00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef VLC_AOUT_H
00024 #define VLC_AOUT_H 1
00025
00026
00027
00028
00029
00030
00031
00032 #define AOUT_MAX_FILTERS 10
00033
00034
00035
00036 #define AOUT_MAX_ADVANCE_TIME (AOUT_MAX_PREPARE_TIME + CLOCK_FREQ)
00037
00038
00039
00040 #define AOUT_MAX_PREPARE_TIME (2 * CLOCK_FREQ)
00041
00042
00043
00044 #define AOUT_MIN_PREPARE_TIME AOUT_MAX_PTS_ADVANCE
00045
00046
00047
00048
00049 #define AOUT_MAX_PTS_ADVANCE (CLOCK_FREQ / 25)
00050
00051
00052
00053 #define AOUT_MAX_PTS_DELAY (3 * CLOCK_FREQ / 50)
00054
00055
00056 #define AOUT_MAX_RESAMPLING 10
00057
00058 #include "vlc_es.h"
00059
00060 #define AOUT_FMTS_IDENTICAL( p_first, p_second ) ( \
00061 ((p_first)->i_format == (p_second)->i_format) \
00062 && AOUT_FMTS_SIMILAR(p_first, p_second) )
00063
00064
00065 #define AOUT_FMTS_SIMILAR( p_first, p_second ) ( \
00066 ((p_first)->i_rate == (p_second)->i_rate) \
00067 && ((p_first)->i_physical_channels == (p_second)->i_physical_channels)\
00068 && ((p_first)->i_original_channels == (p_second)->i_original_channels) )
00069
00070 #define AOUT_FMT_LINEAR( p_format ) \
00071 (aout_BitsPerSample((p_format)->i_format) != 0)
00072
00073 #define VLC_CODEC_SPDIFL VLC_FOURCC('s','p','d','i')
00074 #define VLC_CODEC_SPDIFB VLC_FOURCC('s','p','d','b')
00075
00076 #define AOUT_FMT_SPDIF( p_format ) \
00077 ( ((p_format)->i_format == VLC_CODEC_SPDIFL) \
00078 || ((p_format)->i_format == VLC_CODEC_SPDIFB) \
00079 || ((p_format)->i_format == VLC_CODEC_A52) \
00080 || ((p_format)->i_format == VLC_CODEC_DTS) )
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102 typedef int32_t vlc_fixed_t;
00103 #define FIXED32_FRACBITS 28
00104 #define FIXED32_MIN ((vlc_fixed_t) -0x80000000L)
00105 #define FIXED32_MAX ((vlc_fixed_t) +0x7fffffffL)
00106 #define FIXED32_ONE ((vlc_fixed_t) 0x10000000)
00107
00108
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
00126
00127
00128 #define aout_BufferFree( buffer ) block_Release( buffer )
00129
00130
00131 #define AOUT_SPDIF_SIZE 6144
00132
00133
00134 #define A52_FRAME_NB 1536
00135
00136
00137 #include <vlc_block.h>
00138
00139 typedef int (*aout_volume_cb) (audio_output_t *, float, bool);
00140
00141
00142 struct audio_output
00143 {
00144 VLC_COMMON_MEMBERS
00145
00146 audio_sample_format_t format;
00147
00148
00149 struct aout_sys_t *sys;
00150 void (*pf_play)(audio_output_t *, block_t *);
00151 void (* pf_pause)( audio_output_t *, bool, mtime_t );
00152
00153 void (* pf_flush)( audio_output_t *, bool );
00154
00155 aout_volume_cb pf_volume_set;
00156 };
00157
00158
00159
00160
00161 static const uint32_t pi_vlc_chan_order_wg4[] =
00162 {
00163 AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT,
00164 AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT,
00165 AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT, AOUT_CHAN_REARCENTER,
00166 AOUT_CHAN_CENTER, AOUT_CHAN_LFE, 0
00167 };
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179 VLC_API int aout_CheckChannelReorder( const uint32_t *pi_chan_order_in, const uint32_t *pi_chan_order_out, uint32_t i_channel_mask, int i_channels, int *pi_chan_table );
00180 VLC_API void aout_ChannelReorder( uint8_t *, int, int, const int *, int );
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198 VLC_API bool aout_CheckChannelExtraction( int *pi_selection, uint32_t *pi_layout, int *pi_channels, const uint32_t pi_order_dst[AOUT_CHAN_MAX], const uint32_t *pi_order_src, int i_channels );
00199
00200
00201
00202
00203
00204
00205
00206
00207 VLC_API void aout_ChannelExtract( void *p_dst, int i_dst_channels, const void *p_src, int i_src_channels, int i_sample_count, const int *pi_selection, int i_bits_per_sample );
00208
00209
00210 static inline unsigned aout_FormatNbChannels(const audio_sample_format_t *fmt)
00211 {
00212 return popcount(fmt->i_physical_channels);
00213 }
00214
00215 VLC_API unsigned int aout_BitsPerSample( vlc_fourcc_t i_format ) VLC_USED;
00216 VLC_API void aout_FormatPrepare( audio_sample_format_t * p_format );
00217 VLC_API void aout_FormatPrint(vlc_object_t *, const char *,
00218 const audio_sample_format_t *);
00219 #define aout_FormatPrint(o, t, f) aout_FormatPrint(VLC_OBJECT(o), t, f)
00220 VLC_API const char * aout_FormatPrintChannels( const audio_sample_format_t * ) VLC_USED;
00221
00222 VLC_API void aout_VolumeNoneInit( audio_output_t * );
00223 VLC_API void aout_VolumeSoftInit( audio_output_t * );
00224 VLC_API void aout_VolumeHardInit( audio_output_t *, aout_volume_cb );
00225 VLC_API void aout_VolumeHardSet( audio_output_t *, float, bool );
00226
00227 VLC_API void aout_TimeReport(audio_output_t *, mtime_t);
00228
00229 VLC_API int aout_ChannelsRestart( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * );
00230
00231
00232 VLC_API vout_thread_t * aout_filter_RequestVout( filter_t *, vout_thread_t *p_vout, video_format_t *p_fmt ) VLC_USED;
00233
00234
00235 struct aout_fifo_t
00236 {
00237 aout_buffer_t * p_first;
00238 aout_buffer_t ** pp_last;
00239 date_t end_date;
00240 };
00241
00242
00243 typedef struct
00244 {
00245 vlc_mutex_t lock;
00246 aout_fifo_t partial;
00247 aout_fifo_t fifo;
00248 mtime_t pause_date;
00249 mtime_t time_report;
00250 unsigned samples;
00251 bool starving;
00252 } aout_packet_t;
00253
00254 VLC_DEPRECATED void aout_PacketInit(audio_output_t *, aout_packet_t *, unsigned);
00255 VLC_DEPRECATED void aout_PacketDestroy(audio_output_t *);
00256
00257 VLC_DEPRECATED void aout_PacketPlay(audio_output_t *, block_t *);
00258 VLC_DEPRECATED void aout_PacketPause(audio_output_t *, bool, mtime_t);
00259 VLC_DEPRECATED void aout_PacketFlush(audio_output_t *, bool);
00260
00261 VLC_DEPRECATED block_t *aout_PacketNext(audio_output_t *, mtime_t) VLC_USED;
00262
00263
00264 #endif