static int cap_fit(mpg123_handle *fr, struct audioformat *nf, int f0, int f2) { int i; int c = nf->channels-1; int rn = rate2num(&fr->p, nf->rate); if(rn >= 0) for(i=f0;i<f2;i++) { if(fr->p.audio_caps[c][rn][i]) { nf->encoding = my_encodings[i]; return 1; } } return 0; }
/* * c=num of channels of stream * r=rate of stream * return 0 on error */ int audio_fit_capabilities(struct audio_info_struct *ai,int c,int r) { int rn; int f0=0; if(param.force_8bit) f0 = 2; /* skip the 16bit encodings */ c--; /* stereo=1 ,mono=0 */ /* force stereo is stronger */ if(param.force_mono) c = 0; if(param.force_stereo) c = 1; if(param.force_rate) { rn = rate2num(param.force_rate); /* 16bit encodings */ if(audio_fit_cap_helper(ai,rn,f0,2,c)) return 1; /* 8bit encodings */ if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c)) return 1; /* try again with different stereoness */ if(c == 1 && !param.force_stereo) c = 0; else if(c == 0 && !param.force_mono) c = 1; /* 16bit encodings */ if(audio_fit_cap_helper(ai,rn,f0,2,c)) return 1; /* 8bit encodings */ if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c)) return 1; error3("Unable to set up output device! Constraints: %s%s%liHz.", (param.force_stereo ? "stereo, " : (param.force_mono ? "mono, " : "")), (param.force_8bit ? "8bit, " : ""), param.force_rate); if(param.verbose <= 1) print_capabilities(ai); return 0; } /* try different rates with 16bit */ rn = rate2num(r>>0); if(audio_fit_cap_helper(ai,rn,f0,2,c)) return 1; rn = rate2num(r>>1); if(audio_fit_cap_helper(ai,rn,f0,2,c)) return 1; rn = rate2num(r>>2); if(audio_fit_cap_helper(ai,rn,f0,2,c)) return 1; /* try different rates with 8bit */ rn = rate2num(r>>0); if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c)) return 1; rn = rate2num(r>>1); if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c)) return 1; rn = rate2num(r>>2); if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c)) return 1; /* try again with different stereoness */ if(c == 1 && !param.force_stereo) c = 0; else if(c == 0 && !param.force_mono) c = 1; /* 16bit */ rn = rate2num(r>>0); if(audio_fit_cap_helper(ai,rn,f0,2,c)) return 1; rn = rate2num(r>>1); if(audio_fit_cap_helper(ai,rn,f0,2,c)) return 1; rn = rate2num(r>>2); if(audio_fit_cap_helper(ai,rn,f0,2,c)) return 1; /* 8bit */ rn = rate2num(r>>0); if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c)) return 1; rn = rate2num(r>>1); if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c)) return 1; rn = rate2num(r>>2); if(audio_fit_cap_helper(ai,rn,2,NUM_ENCODINGS,c)) return 1; error5("Unable to set up output device! Constraints: %s%s%i, %i or %iHz.", (param.force_stereo ? "stereo, " : (param.force_mono ? "mono, " : "")), (param.force_8bit ? "8bit, " : ""), r, r>>1, r>>2); if(param.verbose <= 1) print_capabilities(ai); 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; int save_channels = c; int save_rate = r; 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; } else { 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>>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; 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>>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; 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,"\nAudiodevice: No supported audio rate found for %d Hz and %d channels !\n",save_rate,save_channels); fprintf(stderr,"Use '-vv' to list all possible audio rates and\n"); fprintf(stderr,"choose a supported rate with the '-r <rate>' option.\n"); exit(1); }