123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- #include "mpg123.h"
- void audio_info_struct_init(struct audio_info_struct *ai)
- {
- #ifdef AUDIO_USES_FD
- ai->fn = -1;
- #endif
- #ifdef SGI
- #if 0
- ALconfig config;
- ALport port;
- #endif
- #endif
- ai->rate = -1;
- ai->gain = -1;
- ai->output = -1;
- #ifdef ALSA
- ai->handle = NULL;
- ai->alsa_format.format = -1;
- ai->alsa_format.rate = -1;
- ai->alsa_format.channels = -1;
- #endif
- ai->device = NULL;
- ai->channels = -1;
- ai->format = -1;
- }
- #define NUM_CHANNELS 2
- #define NUM_ENCODINGS 6
- #define NUM_RATES 10
- struct audio_name audio_val2name[NUM_ENCODINGS+1] = {
- { AUDIO_FORMAT_SIGNED_16 , "signed 16 bit" , "s16 " } ,
- { AUDIO_FORMAT_UNSIGNED_16, "unsigned 16 bit" , "u16 " } ,
- { AUDIO_FORMAT_UNSIGNED_8 , "unsigned 8 bit" , "u8 " } ,
- { AUDIO_FORMAT_SIGNED_8 , "signed 8 bit" , "s8 " } ,
- { AUDIO_FORMAT_ULAW_8 , "mu-law (8 bit)" , "ulaw " } ,
- { AUDIO_FORMAT_ALAW_8 , "a-law (8 bit)" , "alaw " } ,
- { -1 , NULL }
- };
- #if 0
- static char *channel_name[NUM_CHANNELS] =
- { "mono" , "stereo" };
- #endif
- static int channels[NUM_CHANNELS] = { 1 , 2 };
- static int rates[NUM_RATES] = {
- 8000, 11025, 12000,
- 16000, 22050, 24000,
- 32000, 44100, 48000,
- 8000 /* 8000 = dummy for user forced */
- };
- static int encodings[NUM_ENCODINGS] = {
- AUDIO_FORMAT_SIGNED_16,
- AUDIO_FORMAT_UNSIGNED_16,
- AUDIO_FORMAT_UNSIGNED_8,
- AUDIO_FORMAT_SIGNED_8,
- AUDIO_FORMAT_ULAW_8,
- AUDIO_FORMAT_ALAW_8
- };
- static char capabilities[NUM_CHANNELS][NUM_ENCODINGS][NUM_RATES];
- void audio_capabilities(struct audio_info_struct *ai)
- {
- int fmts;
- int i,j,k,k1=NUM_RATES-1;
- struct audio_info_struct ai1 = *ai;
- if (param.outmode != DECODE_AUDIO) {
- memset(capabilities,1,sizeof(capabilities));
- return;
- }
- memset(capabilities,0,sizeof(capabilities));
- if(param.force_rate) {
- rates[NUM_RATES-1] = param.force_rate;
- k1 = NUM_RATES;
- }
- if(audio_open(&ai1) < 0) {
- perror("audio");
- exit(1);
- }
- for(i=0;i<NUM_CHANNELS;i++) {
- for(j=0;j<NUM_RATES;j++) {
- ai1.channels = channels[i];
- ai1.rate = rates[j];
- fmts = audio_get_formats(&ai1);
- if(fmts < 0)
- continue;
- for(k=0;k<NUM_ENCODINGS;k++) {
- if((fmts & encodings[k]) == encodings[k])
- capabilities[i][k][j] = 1;
- }
- }
- }
- audio_close(&ai1);
- if(param.verbose > 1) {
- fprintf(stderr,"\nAudio capabilities:\n |");
- for(j=0;j<NUM_ENCODINGS;j++) {
- fprintf(stderr," %5s |",audio_val2name[j].sname);
- }
- fprintf(stderr,"\n --------------------------------------------------------\n");
- for(k=0;k<k1;k++) {
- fprintf(stderr," %5d |",rates[k]);
- for(j=0;j<NUM_ENCODINGS;j++) {
- if(capabilities[0][j][k]) {
- if(capabilities[1][j][k])
- fprintf(stderr," M/S |");
- else
- fprintf(stderr," M |");
- }
- else if(capabilities[1][j][k])
- fprintf(stderr," S |");
- else
- fprintf(stderr," |");
- }
- fprintf(stderr,"\n");
- }
- fprintf(stderr,"\n");
- }
- }
- static int rate2num(int r)
- {
- int i;
- for(i=0;i<NUM_RATES;i++)
- if(rates[i] == r)
- return i;
- return -1;
- }
- static int audio_fit_cap_helper(struct audio_info_struct *ai,int rn,int f0,int f2,int c)
- {
- int i;
- if(rn >= 0) {
- for(i=f0;i<f2;i++) {
- if(capabilities[c][i][rn]) {
- ai->rate = rates[rn];
- ai->format = encodings[i];
- ai->channels = channels[c];
- return 1;
- }
- }
- }
- return 0;
- }
- /*
- * c=num of channels of stream
- * r=rate of stream
- */
- void audio_fit_capabilities(struct audio_info_struct *ai,int c,int r)
- {
- int rn;
- int f0=0;
-
- if(param.force_8bit) {
- f0 = 2;
- }
- c--; /* stereo=1 ,mono=0 */
- if(param.force_mono >= 0)
- c = 0;
- if(param.force_stereo)
- c = 1;
- if(param.force_rate) {
- rn = rate2num(param.force_rate);
- if(audio_fit_cap_helper(ai,rn,f0,2,c))
- return;
- if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c))
- return;
- if(c == 1 && !param.force_stereo)
- c = 0;
- else if(c == 0 && !param.force_mono)
- c = 1;
- if(audio_fit_cap_helper(ai,rn,f0,2,c))
- return;
- if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c))
- return;
- fprintf(stderr,"No supported rate found!\n");
- exit(1);
- }
- rn = rate2num(r>>0);
- if(audio_fit_cap_helper(ai,rn,f0,2,c))
- return;
- rn = rate2num(r>>1);
- if(audio_fit_cap_helper(ai,rn,f0,2,c))
- return;
- rn = rate2num(r>>2);
- if(audio_fit_cap_helper(ai,rn,f0,2,c))
- return;
- rn = rate2num(r>>0);
- if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c))
- return;
- rn = rate2num(r>>1);
- if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c))
- return;
- rn = rate2num(r>>2);
- if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c))
- return;
- if(c == 1 && !param.force_stereo)
- c = 0;
- else if(c == 0 && !param.force_mono)
- c = 1;
- rn = rate2num(r>>0);
- if(audio_fit_cap_helper(ai,rn,f0,2,c))
- return;
- rn = rate2num(r>>1);
- if(audio_fit_cap_helper(ai,rn,f0,2,c))
- return;
- rn = rate2num(r>>2);
- if(audio_fit_cap_helper(ai,rn,f0,2,c))
- return;
- rn = rate2num(r>>0);
- if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c))
- return;
- rn = rate2num(r>>1);
- if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c))
- return;
- rn = rate2num(r>>2);
- if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c))
- return;
- fprintf(stderr,"No supported rate found!\n");
- exit(1);
- }
- char *audio_encoding_name(int format)
- {
- int i;
- for(i=0;i<NUM_ENCODINGS;i++) {
- if(audio_val2name[i].val == format)
- return audio_val2name[i].name;
- }
- return "Unknown";
- }
- #if !defined(SOLARIS) && !defined(__NetBSD__) || defined(NAS)
- void audio_queueflush(struct audio_info_struct *ai)
- {
- }
- #endif
|