diff options
Diffstat (limited to 'libao2/audio_out.c')
-rw-r--r-- | libao2/audio_out.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/libao2/audio_out.c b/libao2/audio_out.c index 8b861ede6b..2c8c16ec29 100644 --- a/libao2/audio_out.c +++ b/libao2/audio_out.c @@ -5,6 +5,9 @@ #include "audio_out.h" #include "afmt.h" +#include "../mp_msg.h" +#include "../help_mp.h" + // there are some globals: ao_data_t ao_data={0,0,0,0,OUTBURST,-1,0}; char *ao_subdevice = NULL; @@ -85,5 +88,54 @@ ao_functions_t* audio_out_drivers[] = NULL }; +void list_audio_out(){ + int i=0; + mp_msg(MSGT_AO, MSGL_INFO, MSGTR_AvailableAudioOutputDrivers); + while (audio_out_drivers[i]) { + const ao_info_t *info = audio_out_drivers[i++]->info; + printf("\t%s\t%s\n", info->short_name, info->name); + } + printf("\n"); +} +ao_functions_t* init_best_audio_out(char** ao_list,int use_plugin,int rate,int channels,int format,int flags){ + int i; + // first try the preferred drivers, with their optional subdevice param: + if(ao_list && ao_list[0]) + while(ao_list[0][0]){ + char* ao=strdup(ao_list[0]); + ao_subdevice=strchr(ao,':'); + if(ao_subdevice){ + ao_subdevice[0]=0; + ++ao_subdevice; + } + for(i=0;audio_out_drivers[i];i++){ + ao_functions_t* audio_out=audio_out_drivers[i]; + if(!strcmp(audio_out->info->short_name,ao)){ + // name matches, try it + if(use_plugin){ + audio_out_plugin.control(AOCONTROL_SET_PLUGIN_DRIVER,(int)audio_out); + audio_out=&audio_out_plugin; + } + if(audio_out->init(rate,channels,format,flags)) + return audio_out; // success! + } + } + // continue... + ++ao_list; + if(!(ao_list[0])) return NULL; // do NOT fallback to others + } + // now try the rest... + ao_subdevice=NULL; + for(i=0;audio_out_drivers[i];i++){ + ao_functions_t* audio_out=audio_out_drivers[i]; + if(use_plugin){ + audio_out_plugin.control(AOCONTROL_SET_PLUGIN_DRIVER,(int)audio_out); + audio_out=&audio_out_plugin; + } + if(audio_out->init(rate,channels,format,flags)) + return audio_out; // success! + } + return NULL; +} |