1
/*****************************************************************************
2
* audio_output.h : audio output interface
3
*****************************************************************************
4
* Copyright (C) 2002-2005 the VideoLAN team
5
* $Id: 4eef77635f46e97613819cbd18bf0fedcf39691c $
7
* Authors: Christophe Massiot <massiot@via.ecp.fr>
9
* This program is free software; you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License as published by
11
* the Free Software Foundation; either version 2 of the License, or
12
* (at your option) any later version.
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
19
* You should have received a copy of the GNU General Public License
20
* along with this program; if not, write to the Free Software
21
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22
*****************************************************************************/
23
#ifndef _VLC_AUDIO_OUTPUT_H
24
#define _VLC_AUDIO_OUTPUT_H 1
28
#define AOUT_FMTS_IDENTICAL( p_first, p_second ) ( \
29
((p_first)->i_format == (p_second)->i_format) \
30
&& ((p_first)->i_rate == (p_second)->i_rate) \
31
&& ((p_first)->i_physical_channels == (p_second)->i_physical_channels)\
32
&& ((p_first)->i_original_channels == (p_second)->i_original_channels) )
34
/* Check if i_rate == i_rate and i_channels == i_channels */
35
#define AOUT_FMTS_SIMILAR( p_first, p_second ) ( \
36
((p_first)->i_rate == (p_second)->i_rate) \
37
&& ((p_first)->i_physical_channels == (p_second)->i_physical_channels)\
38
&& ((p_first)->i_original_channels == (p_second)->i_original_channels) )
40
#ifdef WORDS_BIGENDIAN
41
# define AOUT_FMT_S16_NE VLC_FOURCC('s','1','6','b')
42
# define AOUT_FMT_U16_NE VLC_FOURCC('u','1','6','b')
43
# define AOUT_FMT_S24_NE VLC_FOURCC('s','2','4','b')
44
# define AOUT_FMT_SPDIF_NE VLC_FOURCC('s','p','d','b')
46
# define AOUT_FMT_S16_NE VLC_FOURCC('s','1','6','l')
47
# define AOUT_FMT_U16_NE VLC_FOURCC('u','1','6','l')
48
# define AOUT_FMT_S24_NE VLC_FOURCC('s','2','4','l')
49
# define AOUT_FMT_SPDIF_NE VLC_FOURCC('s','p','d','i')
52
#define AOUT_FMT_NON_LINEAR( p_format ) \
53
( ((p_format)->i_format == VLC_FOURCC('s','p','d','i')) \
54
|| ((p_format)->i_format == VLC_FOURCC('s','p','d','b')) \
55
|| ((p_format)->i_format == VLC_FOURCC('a','5','2',' ')) \
56
|| ((p_format)->i_format == VLC_FOURCC('d','t','s',' ')) )
58
/* This is heavily borrowed from libmad, by Robert Leslie <rob@mars.org> */
60
* Fixed-point format: 0xABBBBBBB
61
* A == whole part (sign + 3 bits)
62
* B == fractional part (28 bits)
64
* Values are signed two's complement, so the effective range is:
65
* 0x80000000 to 0x7fffffff
66
* -8.0 to +7.9999999962747097015380859375
68
* The smallest representable value is:
69
* 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9)
71
* 28 bits of fractional accuracy represent about
72
* 8.6 digits of decimal accuracy.
74
* Fixed-point numbers can be added or subtracted as normal
75
* integers, but multiplication requires shifting the 64-bit result
76
* from 56 fractional bits back to 28 (and rounding.)
78
typedef int32_t vlc_fixed_t;
79
#define FIXED32_FRACBITS 28
80
#define FIXED32_MIN ((vlc_fixed_t) -0x80000000L)
81
#define FIXED32_MAX ((vlc_fixed_t) +0x7fffffffL)
82
#define FIXED32_ONE ((vlc_fixed_t) 0x10000000)
86
* Channels descriptions
89
/* Values available for physical and original channels */
90
#define AOUT_CHAN_CENTER 0x1
91
#define AOUT_CHAN_LEFT 0x2
92
#define AOUT_CHAN_RIGHT 0x4
93
#define AOUT_CHAN_REARCENTER 0x10
94
#define AOUT_CHAN_REARLEFT 0x20
95
#define AOUT_CHAN_REARRIGHT 0x40
96
#define AOUT_CHAN_MIDDLELEFT 0x100
97
#define AOUT_CHAN_MIDDLERIGHT 0x200
98
#define AOUT_CHAN_LFE 0x1000
100
/* Values available for original channels only */
101
#define AOUT_CHAN_DOLBYSTEREO 0x10000
102
#define AOUT_CHAN_DUALMONO 0x20000
103
#define AOUT_CHAN_REVERSESTEREO 0x40000
105
#define AOUT_CHAN_PHYSMASK 0xFFFF
106
#define AOUT_CHAN_MAX 9
108
/* Values used for the audio-device and audio-channels object variables */
109
#define AOUT_VAR_MONO 1
110
#define AOUT_VAR_STEREO 2
111
#define AOUT_VAR_2F2R 4
112
#define AOUT_VAR_3F2R 5
113
#define AOUT_VAR_5_1 6
114
#define AOUT_VAR_6_1 7
115
#define AOUT_VAR_7_1 8
116
#define AOUT_VAR_SPDIF 10
118
#define AOUT_VAR_CHAN_STEREO 1
119
#define AOUT_VAR_CHAN_RSTEREO 2
120
#define AOUT_VAR_CHAN_LEFT 3
121
#define AOUT_VAR_CHAN_RIGHT 4
122
#define AOUT_VAR_CHAN_DOLBYS 5
124
/*****************************************************************************
125
* aout_buffer_t : audio output buffer
126
*****************************************************************************/
131
/* i_size is the real size of the buffer (used for debug ONLY), i_nb_bytes
132
* is the number of significative bytes in it. */
133
size_t i_size, i_nb_bytes;
134
unsigned int i_nb_samples;
135
mtime_t start_date, end_date;
137
struct aout_buffer_t * p_next;
139
/** Private data (aout_buffer_t will disappear soon so no need for an
140
* aout_buffer_sys_t type) */
143
/** This way the release can be overloaded */
144
void (*pf_release)( aout_buffer_t * );
147
/* Size of a frame for S/PDIF output. */
148
#define AOUT_SPDIF_SIZE 6144
150
/* Number of samples in an A/52 frame. */
151
#define A52_FRAME_NB 1536
153
/*****************************************************************************
154
* audio_date_t : date incrementation without long-term rounding errors
155
*****************************************************************************/
160
uint32_t i_remainder;
163
/*****************************************************************************
165
*****************************************************************************/
166
/* From common.c : */
167
#define aout_New(a) __aout_New(VLC_OBJECT(a))
168
VLC_EXPORT( aout_instance_t *, __aout_New, ( vlc_object_t * ) );
169
VLC_EXPORT( void, aout_Delete, ( aout_instance_t * ) );
170
VLC_EXPORT( void, aout_DateInit, ( audio_date_t *, uint32_t ) );
171
VLC_EXPORT( void, aout_DateSet, ( audio_date_t *, mtime_t ) );
172
VLC_EXPORT( void, aout_DateMove, ( audio_date_t *, mtime_t ) );
173
VLC_EXPORT( mtime_t, aout_DateGet, ( const audio_date_t * ) );
174
VLC_EXPORT( mtime_t, aout_DateIncrement, ( audio_date_t *, uint32_t ) );
176
VLC_EXPORT( int, aout_CheckChannelReorder, ( const uint32_t *, const uint32_t *, uint32_t, int, int * ) );
177
VLC_EXPORT( void, aout_ChannelReorder, ( uint8_t *, int, int, const int *, int ) );
180
#define aout_DecNew(a, b, c) __aout_DecNew(VLC_OBJECT(a), b, c)
181
VLC_EXPORT( aout_input_t *, __aout_DecNew, ( vlc_object_t *, aout_instance_t **, audio_sample_format_t * ) );
182
VLC_EXPORT( int, aout_DecDelete, ( aout_instance_t *, aout_input_t * ) );
183
VLC_EXPORT( aout_buffer_t *, aout_DecNewBuffer, ( aout_instance_t *, aout_input_t *, size_t ) );
184
VLC_EXPORT( void, aout_DecDeleteBuffer, ( aout_instance_t *, aout_input_t *, aout_buffer_t * ) );
185
VLC_EXPORT( int, aout_DecPlay, ( aout_instance_t *, aout_input_t *, aout_buffer_t * ) );
188
#define aout_VolumeGet(a, b) __aout_VolumeGet(VLC_OBJECT(a), b)
189
VLC_EXPORT( int, __aout_VolumeGet, ( vlc_object_t *, audio_volume_t * ) );
190
#define aout_VolumeSet(a, b) __aout_VolumeSet(VLC_OBJECT(a), b)
191
VLC_EXPORT( int, __aout_VolumeSet, ( vlc_object_t *, audio_volume_t ) );
192
#define aout_VolumeInfos(a, b) __aout_VolumeInfos(VLC_OBJECT(a), b)
193
VLC_EXPORT( int, __aout_VolumeInfos, ( vlc_object_t *, audio_volume_t * ) );
194
#define aout_VolumeUp(a, b, c) __aout_VolumeUp(VLC_OBJECT(a), b, c)
195
VLC_EXPORT( int, __aout_VolumeUp, ( vlc_object_t *, int, audio_volume_t * ) );
196
#define aout_VolumeDown(a, b, c) __aout_VolumeDown(VLC_OBJECT(a), b, c)
197
VLC_EXPORT( int, __aout_VolumeDown, ( vlc_object_t *, int, audio_volume_t * ) );
198
#define aout_VolumeMute(a, b) __aout_VolumeMute(VLC_OBJECT(a), b)
199
VLC_EXPORT( int, __aout_VolumeMute, ( vlc_object_t *, audio_volume_t * ) );
200
VLC_EXPORT( int, aout_Restart, ( aout_instance_t * p_aout ) );
201
VLC_EXPORT( int, aout_FindAndRestart, ( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * ) );
202
VLC_EXPORT( int, aout_ChannelsRestart, ( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * ) );
204
#endif /* _VLC_AUDIO_OUTPUT_H */