2
audio: audio output interface
4
copyright ?-2006 by the mpg123 project - free software under the terms of the LGPL 2.1
5
see COPYING and AUTHORS files in distribution or http://mpg123.de
6
initially written by Michael Hipp
13
void audio_info_struct_init(struct audio_info_struct *ai)
21
ai->alsa_format.format = -1;
22
ai->alsa_format.rate = -1;
23
ai->alsa_format.channels = -1;
31
void audio_info_struct_dump(struct audio_info_struct *ai)
33
fprintf(stderr, "ai->fn=%d\n", ai->fn);
34
fprintf(stderr, "ai->handle=%p\n", ai->handle);
35
fprintf(stderr, "ai->rate=%ld\n", ai->rate);
36
fprintf(stderr, "ai->gain=%ld\n", ai->gain);
37
fprintf(stderr, "ai->output=%d\n", ai->output);
38
fprintf(stderr, "ai->device='%s'\n", ai->device);
39
fprintf(stderr, "ai->channels=%d\n", ai->channels);
40
fprintf(stderr, "ai->format=%d\n", ai->format);
44
#define NUM_CHANNELS 2
45
#define NUM_ENCODINGS 6
48
struct audio_name audio_val2name[NUM_ENCODINGS+1] = {
49
{ AUDIO_FORMAT_SIGNED_16 , "signed 16 bit" , "s16 " } ,
50
{ AUDIO_FORMAT_UNSIGNED_16, "unsigned 16 bit" , "u16 " } ,
51
{ AUDIO_FORMAT_UNSIGNED_8 , "unsigned 8 bit" , "u8 " } ,
52
{ AUDIO_FORMAT_SIGNED_8 , "signed 8 bit" , "s8 " } ,
53
{ AUDIO_FORMAT_ULAW_8 , "mu-law (8 bit)" , "ulaw " } ,
54
{ AUDIO_FORMAT_ALAW_8 , "a-law (8 bit)" , "alaw " } ,
59
static char *channel_name[NUM_CHANNELS] =
60
{ "mono" , "stereo" };
63
static int channels[NUM_CHANNELS] = { 1 , 2 };
64
static int rates[NUM_RATES] = {
68
8000 /* 8000 = dummy for user forced */
71
static int encodings[NUM_ENCODINGS] = {
72
AUDIO_FORMAT_SIGNED_16,
73
AUDIO_FORMAT_UNSIGNED_16,
74
AUDIO_FORMAT_UNSIGNED_8,
75
AUDIO_FORMAT_SIGNED_8,
80
static char capabilities[NUM_CHANNELS][NUM_ENCODINGS][NUM_RATES];
82
void audio_capabilities(struct audio_info_struct *ai)
85
int i,j,k,k1=NUM_RATES-1;
86
struct audio_info_struct ai1 = *ai;
88
if (param.outmode != DECODE_AUDIO) {
89
memset(capabilities,1,sizeof(capabilities));
93
memset(capabilities,0,sizeof(capabilities));
94
if(param.force_rate) {
95
rates[NUM_RATES-1] = param.force_rate;
99
if(audio_open(&ai1) < 0) {
104
for(i=0;i<NUM_CHANNELS;i++) {
105
for(j=0;j<NUM_RATES;j++) {
106
ai1.channels = channels[i];
108
fmts = audio_get_formats(&ai1);
111
for(k=0;k<NUM_ENCODINGS;k++) {
112
if((fmts & encodings[k]) == encodings[k])
113
capabilities[i][k][j] = 1;
120
if(param.verbose > 1) {
121
fprintf(stderr,"\nAudio capabilities:\n |");
122
for(j=0;j<NUM_ENCODINGS;j++) {
123
fprintf(stderr," %5s |",audio_val2name[j].sname);
125
fprintf(stderr,"\n --------------------------------------------------------\n");
127
fprintf(stderr," %5d |",rates[k]);
128
for(j=0;j<NUM_ENCODINGS;j++) {
129
if(capabilities[0][j][k]) {
130
if(capabilities[1][j][k])
131
fprintf(stderr," M/S |");
133
fprintf(stderr," M |");
135
else if(capabilities[1][j][k])
136
fprintf(stderr," S |");
138
fprintf(stderr," |");
140
fprintf(stderr,"\n");
142
fprintf(stderr,"\n");
146
static int rate2num(int r)
149
for(i=0;i<NUM_RATES;i++)
156
static int audio_fit_cap_helper(struct audio_info_struct *ai,int rn,int f0,int f2,int c)
162
if(capabilities[c][i][rn]) {
163
ai->rate = rates[rn];
164
ai->format = encodings[i];
165
ai->channels = channels[c];
175
* c=num of channels of stream
178
void audio_fit_capabilities(struct audio_info_struct *ai,int c,int r)
183
if(param.force_8bit) {
187
c--; /* stereo=1 ,mono=0 */
189
if(param.force_mono >= 0)
191
if(param.force_stereo)
194
if(param.force_rate) {
195
rn = rate2num(param.force_rate);
196
if(audio_fit_cap_helper(ai,rn,f0,2,c))
198
if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c))
201
if(c == 1 && !param.force_stereo)
203
else if(c == 0 && !param.force_mono)
206
if(audio_fit_cap_helper(ai,rn,f0,2,c))
208
if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c))
211
fprintf(stderr,"No supported rate found!\n");
216
if(audio_fit_cap_helper(ai,rn,f0,2,c))
219
if(audio_fit_cap_helper(ai,rn,f0,2,c))
222
if(audio_fit_cap_helper(ai,rn,f0,2,c))
226
if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c))
229
if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c))
232
if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c))
236
if(c == 1 && !param.force_stereo)
238
else if(c == 0 && !param.force_mono)
242
if(audio_fit_cap_helper(ai,rn,f0,2,c))
245
if(audio_fit_cap_helper(ai,rn,f0,2,c))
248
if(audio_fit_cap_helper(ai,rn,f0,2,c))
252
if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c))
255
if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c))
258
if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c))
261
fprintf(stderr,"No supported rate found!\n");
265
char *audio_encoding_name(int format)
269
for(i=0;i<NUM_ENCODINGS;i++) {
270
if(audio_val2name[i].val == format)
271
return audio_val2name[i].name;