1
/*****************************************************************
5
Copyright (c) 2003-2004 by Burkhard Plaum - plaum@ipf.uni-stuttgart.de
7
http://gmerlin.sourceforge.net
9
This program is distributed in the hope that it will be useful,
10
but WITHOUT ANY WARRANTY; without even the implied warranty of
11
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
GNU General Public License for more details.
14
You should have received a copy of the GNU General Public License
15
along with this program; if not, write to the Free Software
16
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
18
*****************************************************************/
24
#include <gavl/gavl.h>
28
gavl_sample_format_t format;
31
sample_format_names[] =
33
{ GAVL_SAMPLE_NONE, "Not specified" },
34
{ GAVL_SAMPLE_U8, "Unsigned 8 bit"},
35
{ GAVL_SAMPLE_S8, "Signed 8 bit"},
36
{ GAVL_SAMPLE_U16, "Unsigned 16 bit"},
37
{ GAVL_SAMPLE_S16, "Signed 16 bit"},
38
{ GAVL_SAMPLE_S32, "Signed 32 bit"},
39
{ GAVL_SAMPLE_FLOAT, "Floating point"},
42
const char * gavl_sample_format_to_string(gavl_sample_format_t format)
45
for(i = 0; i < sizeof(sample_format_names)/sizeof(sample_format_names[0]); i++)
47
if(format == sample_format_names[i].format)
48
return sample_format_names[i].name;
55
gavl_interleave_mode_t mode;
58
interleave_mode_names[] =
60
{ GAVL_INTERLEAVE_NONE, "Not interleaved" },
61
{ GAVL_INTERLEAVE_2, "Interleaved channel pairs" },
62
{ GAVL_INTERLEAVE_ALL, "All channels interleaved" },
66
const char * gavl_interleave_mode_to_string(gavl_interleave_mode_t mode)
70
i < sizeof(interleave_mode_names)/sizeof(interleave_mode_names[0]);
73
if(mode == interleave_mode_names[i].mode)
74
return interleave_mode_names[i].name;
87
GAVL_CHID_NONE = 0, /*!< Undefined */
88
GAVL_CHID_FRONT_CENTER, /*!< For mono */
89
GAVL_CHID_FRONT_LEFT, /*!< Front left */
90
GAVL_CHID_FRONT_RIGHT, /*!< Front right */
91
GAVL_CHID_FRONT_CENTER_LEFT, /*!< Left of Center */
92
GAVL_CHID_FRONT_CENTER_RIGHT, /*!< Right of Center */
93
GAVL_CHID_REAR_LEFT, /*!< Rear left */
94
GAVL_CHID_REAR_RIGHT, /*!< Rear right */
95
GAVL_CHID_REAR_CENTER, /*!< Rear Center */
96
GAVL_CHID_SIDE_LEFT, /*!< Side left */
97
GAVL_CHID_SIDE_RIGHT, /*!< Side right */
98
GAVL_CHID_LFE, /*!< Subwoofer */
99
GAVL_CHID_AUX, /*!< Additional channel (can be more than one) */
101
{ GAVL_CHID_NONE, "Unknown channel" },
102
{ GAVL_CHID_FRONT_CENTER, "Front C" },
103
{ GAVL_CHID_FRONT_LEFT, "Front L" },
104
{ GAVL_CHID_FRONT_RIGHT, "Front R" },
105
{ GAVL_CHID_FRONT_CENTER_LEFT, "Front CL" },
106
{ GAVL_CHID_FRONT_CENTER_RIGHT, "Front CR" },
107
{ GAVL_CHID_REAR_CENTER, "Rear C" },
108
{ GAVL_CHID_REAR_LEFT, "Rear L" },
109
{ GAVL_CHID_REAR_RIGHT, "Rear R" },
110
{ GAVL_CHID_SIDE_LEFT, "Side L" },
111
{ GAVL_CHID_SIDE_RIGHT, "Side R" },
112
{ GAVL_CHID_LFE, "LFE" },
113
{ GAVL_CHID_AUX, "AUX" },
116
const char * gavl_channel_id_to_string(gavl_channel_id_t id)
120
i < sizeof(channel_id_names)/sizeof(channel_id_names[0]);
123
// fprintf(stderr, "ID: %d\n", id);
124
if(id == channel_id_names[i].id)
125
return channel_id_names[i].name;
130
void gavl_audio_format_dump(const gavl_audio_format_t * f)
133
fprintf(stderr, " Channels: %d\n", f->num_channels);
135
fprintf(stderr, " Channel order: ");
136
for(i = 0; i < f->num_channels; i++)
138
fprintf(stderr, "%s", gavl_channel_id_to_string(f->channel_locations[i]));
139
if(i < f->num_channels - 1)
140
fprintf(stderr, ", ");
142
fprintf(stderr, "\n");
144
fprintf(stderr, " Samplerate: %d\n", f->samplerate);
145
fprintf(stderr, " Samples per frame: %d\n", f->samples_per_frame);
146
fprintf(stderr, " Interleave Mode: %s\n",
147
gavl_interleave_mode_to_string(f->interleave_mode));
148
fprintf(stderr, " Sample format: %s\n",
149
gavl_sample_format_to_string(f->sample_format));
151
if(gavl_front_channels(f) == 3)
153
if(f->center_level > 0.0)
154
fprintf(stderr, " Center level: %0.1f dB\n", 20 * log10(f->center_level));
156
fprintf(stderr, " Center level: Zero\n");
158
if(gavl_rear_channels(f))
160
if(f->rear_level > 0.0)
161
fprintf(stderr, " Rear level: %0.1f dB\n", 20 * log10(f->rear_level));
163
fprintf(stderr, " Rear level: Zero\n");
170
void gavl_set_channel_setup(gavl_audio_format_t * dst)
173
if(dst->channel_locations[0] == GAVL_CHID_NONE)
175
switch(dst->num_channels)
178
dst->channel_locations[0] = GAVL_CHID_FRONT_CENTER;
180
case 2: /* 2 Front channels (Stereo or Dual channels) */
181
dst->channel_locations[0] = GAVL_CHID_FRONT_LEFT;
182
dst->channel_locations[1] = GAVL_CHID_FRONT_RIGHT;
185
dst->channel_locations[0] = GAVL_CHID_FRONT_LEFT;
186
dst->channel_locations[1] = GAVL_CHID_FRONT_RIGHT;
187
dst->channel_locations[2] = GAVL_CHID_FRONT_CENTER;
190
dst->channel_locations[0] = GAVL_CHID_FRONT_LEFT;
191
dst->channel_locations[1] = GAVL_CHID_FRONT_RIGHT;
192
dst->channel_locations[2] = GAVL_CHID_REAR_LEFT;
193
dst->channel_locations[3] = GAVL_CHID_REAR_RIGHT;
196
dst->channel_locations[0] = GAVL_CHID_FRONT_LEFT;
197
dst->channel_locations[1] = GAVL_CHID_FRONT_RIGHT;
198
dst->channel_locations[2] = GAVL_CHID_REAR_LEFT;
199
dst->channel_locations[3] = GAVL_CHID_REAR_RIGHT;
200
dst->channel_locations[4] = GAVL_CHID_FRONT_CENTER;
203
dst->channel_locations[0] = GAVL_CHID_FRONT_LEFT;
204
dst->channel_locations[1] = GAVL_CHID_FRONT_RIGHT;
205
dst->channel_locations[2] = GAVL_CHID_REAR_LEFT;
206
dst->channel_locations[3] = GAVL_CHID_REAR_RIGHT;
207
dst->channel_locations[4] = GAVL_CHID_FRONT_CENTER;
208
dst->channel_locations[5] = GAVL_CHID_LFE;
211
for(i = 0; i < dst->num_channels; i++)
212
dst->channel_locations[i] = GAVL_CHID_AUX;
218
void gavl_audio_format_copy(gavl_audio_format_t * dst,
219
const gavl_audio_format_t * src)
221
memcpy(dst, src, sizeof(*dst));
224
int gavl_channel_index(const gavl_audio_format_t * f, gavl_channel_id_t id)
227
for(i = 0; i < f->num_channels; i++)
229
if(f->channel_locations[i] == id)
232
// fprintf(stderr, "Channel %s not present!!! Format was\n",
233
// gavl_channel_id_to_string(id));
234
gavl_audio_format_dump(f);
238
int gavl_front_channels(const gavl_audio_format_t * f)
242
for(i = 0; i < f->num_channels; i++)
244
switch(f->channel_locations[i])
246
case GAVL_CHID_FRONT_CENTER:
247
case GAVL_CHID_FRONT_LEFT:
248
case GAVL_CHID_FRONT_RIGHT:
249
case GAVL_CHID_FRONT_CENTER_LEFT:
250
case GAVL_CHID_FRONT_CENTER_RIGHT:
254
case GAVL_CHID_REAR_LEFT:
255
case GAVL_CHID_REAR_RIGHT:
256
case GAVL_CHID_REAR_CENTER:
257
case GAVL_CHID_SIDE_LEFT:
258
case GAVL_CHID_SIDE_RIGHT:
267
int gavl_rear_channels(const gavl_audio_format_t * f)
271
for(i = 0; i < f->num_channels; i++)
273
switch(f->channel_locations[i])
275
case GAVL_CHID_REAR_LEFT:
276
case GAVL_CHID_REAR_RIGHT:
277
case GAVL_CHID_REAR_CENTER:
280
case GAVL_CHID_FRONT_CENTER:
281
case GAVL_CHID_FRONT_LEFT:
282
case GAVL_CHID_FRONT_RIGHT:
283
case GAVL_CHID_FRONT_CENTER_LEFT:
284
case GAVL_CHID_FRONT_CENTER_RIGHT:
286
case GAVL_CHID_SIDE_LEFT:
287
case GAVL_CHID_SIDE_RIGHT:
296
int gavl_side_channels(const gavl_audio_format_t * f)
300
for(i = 0; i < f->num_channels; i++)
302
switch(f->channel_locations[i])
304
case GAVL_CHID_SIDE_LEFT:
305
case GAVL_CHID_SIDE_RIGHT:
308
case GAVL_CHID_REAR_LEFT:
309
case GAVL_CHID_REAR_RIGHT:
310
case GAVL_CHID_REAR_CENTER:
311
case GAVL_CHID_FRONT_CENTER:
312
case GAVL_CHID_FRONT_LEFT:
313
case GAVL_CHID_FRONT_RIGHT:
314
case GAVL_CHID_FRONT_CENTER_LEFT:
315
case GAVL_CHID_FRONT_CENTER_RIGHT:
325
int gavl_lfe_channels(const gavl_audio_format_t * f)
329
for(i = 0; i < f->num_channels; i++)
331
switch(f->channel_locations[i])
336
case GAVL_CHID_SIDE_LEFT:
337
case GAVL_CHID_SIDE_RIGHT:
338
case GAVL_CHID_REAR_LEFT:
339
case GAVL_CHID_REAR_RIGHT:
340
case GAVL_CHID_REAR_CENTER:
341
case GAVL_CHID_FRONT_CENTER:
342
case GAVL_CHID_FRONT_LEFT:
343
case GAVL_CHID_FRONT_RIGHT:
344
case GAVL_CHID_FRONT_CENTER_LEFT:
345
case GAVL_CHID_FRONT_CENTER_RIGHT:
354
int gavl_aux_channels(const gavl_audio_format_t * f)
358
for(i = 0; i < f->num_channels; i++)
360
switch(f->channel_locations[i])
365
case GAVL_CHID_SIDE_LEFT:
366
case GAVL_CHID_SIDE_RIGHT:
367
case GAVL_CHID_REAR_LEFT:
368
case GAVL_CHID_REAR_RIGHT:
369
case GAVL_CHID_REAR_CENTER:
370
case GAVL_CHID_FRONT_CENTER:
371
case GAVL_CHID_FRONT_LEFT:
372
case GAVL_CHID_FRONT_RIGHT:
373
case GAVL_CHID_FRONT_CENTER_LEFT:
374
case GAVL_CHID_FRONT_CENTER_RIGHT:
385
int gavl_bytes_per_sample(gavl_sample_format_t format)
393
case GAVL_SAMPLE_U16:
394
case GAVL_SAMPLE_S16:
397
case GAVL_SAMPLE_S32:
400
case GAVL_SAMPLE_FLOAT:
401
return sizeof(float);
403
case GAVL_SAMPLE_NONE: