diff options
-rw-r--r-- | libao2/audio_out.c | 52 | ||||
-rw-r--r-- | libao2/audio_out.h | 4 | ||||
-rw-r--r-- | mplayer.c | 103 |
3 files changed, 75 insertions, 84 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; +} diff --git a/libao2/audio_out.h b/libao2/audio_out.h index 4765a6562d..6269645d51 100644 --- a/libao2/audio_out.h +++ b/libao2/audio_out.h @@ -48,10 +48,12 @@ extern ao_data_t ao_data; extern char *audio_out_format_name(int format); extern int audio_out_format_bits(int format); +void list_audio_out(); +ao_functions_t* init_best_audio_out(char** ao_list,int use_plugin,int rate,int channels,int format,int flags); + // NULL terminated array of all drivers extern ao_functions_t* audio_out_drivers[]; - #define CONTROL_OK 1 #define CONTROL_TRUE 1 #define CONTROL_FALSE 0 @@ -34,7 +34,6 @@ #endif #include "libvo/video_out.h" -//extern void* mDisplay; // Display* mDisplay; #include "libvo/font_load.h" #include "libvo/sub.h" @@ -42,9 +41,6 @@ #include "libao2/audio_out.h" #include "libao2/audio_plugin.h" -#include "libmpeg2/mpeg2.h" -#include "libmpeg2/mpeg2_internal.h" - #include "codec-cfg.h" #ifdef HAVE_LIBCSS @@ -59,9 +55,7 @@ #include "vobsub.h" #include "linux/getch2.h" -//#include "linux/keycodes.h" #include "linux/timer.h" -//#include "linux/shmem.h" #include "cpudetect.h" @@ -73,7 +67,7 @@ int slave_mode=0; int verbose=0; -int quiet=0; +static int quiet=0; #define ABS(x) (((x)>=0)?(x):(-(x))) @@ -83,7 +77,6 @@ int quiet=0; #ifdef USE_TV #include "libmpdemux/tv.h" - extern int tv_param_on; #endif @@ -483,7 +476,6 @@ play_tree_iter_t* playtree_iter = NULL; int file_format=DEMUXER_TYPE_UNKNOWN; int delay_corrected=1; -//char* title="MPlayer"; // movie info: int eof=0; @@ -598,15 +590,8 @@ int gui_no_filename=0; exit(0); } - audio_driver=audio_driver_list?audio_driver_list[0]:NULL; - if(audio_driver && strcmp(audio_driver,"help")==0){ - mp_msg(MSGT_CPLAYER, MSGL_INFO, MSGTR_AvailableAudioOutputDrivers); - i=0; - 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"); + if(audio_driver_list && strcmp(audio_driver_list[0],"help")==0){ + list_audio_out(); exit(0); } @@ -846,56 +831,6 @@ if(!use_stdin && !slave_mode){ if(vo_vobsub) sub_auto=0; // don't do autosub for textsubs if vobsub found -//==================== Init Audio Out ============================ - -// check audio_out driver name: -{ - char* ao = audio_driver ? strdup(audio_driver) : NULL; - if(ao_subdevice) { - free(ao_subdevice); - ao_subdevice = NULL; - } - if (audio_driver) - if ((i = strcspn(audio_driver, ":")) > 0) - { - size_t i2 = strlen(audio_driver); - - if (audio_driver[i] == ':') - { - ao_subdevice = malloc(i2-i); - if (ao_subdevice != NULL) - strncpy(ao_subdevice, (char *)(audio_driver+i+1), i2-i); - ao[i] = '\0'; - } -// printf("audio_driver: %s, subdevice: %s\n", audio_driver, ao_subdevice); - } - if(!audio_driver) - audio_out=audio_out_drivers[0]; - else - for (i=0; audio_out_drivers[i] != NULL; i++){ - const ao_info_t *info = audio_out_drivers[i]->info; - if(strcmp(info->short_name,ao) == 0){ - audio_out = audio_out_drivers[i];break; - } - } - if (!audio_out){ - mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_InvalidAOdriver,ao?ao:"?"); - exit_player(MSGTR_Exit_error); - } - if(ao) - free(ao); - /* Initailize audio plugin interface if used */ - if(ao_plugin_cfg.plugin_list){ - for (i=0; audio_out_drivers[i] != NULL; i++){ - const ao_info_t *info = audio_out_drivers[i]->info; - if(strcmp(info->short_name,"plugin") == 0){ - audio_out_drivers[i]->control(AOCONTROL_SET_PLUGIN_DRIVER,(int)audio_out); - audio_out = audio_out_drivers[i]; - break; - } - } - } -} //============ Open & Sync STREAM --- fork cache2 ==================== stream=NULL; @@ -1296,25 +1231,27 @@ osd_text_buffer[0]=0; //================ SETUP AUDIO ========================== if(sh_audio){ - const ao_info_t *info=audio_out->info; - current_module="setup_audio"; - mp_msg(MSGT_CPLAYER,MSGL_INFO,"AO: [%s] %iHz %dch %s\n", - info->short_name, + //const ao_info_t *info=audio_out->info; + current_module="ao2_init"; + if(!(audio_out=init_best_audio_out(audio_driver_list, + (ao_plugin_cfg.plugin_list), // plugin flag force_srate?force_srate:sh_audio->samplerate, - sh_audio->channels, - audio_out_format_name(sh_audio->sample_format) - ); - mp_msg(MSGT_CPLAYER,MSGL_V,MSGTR_AODescription_AOAuthor, - info->name, info->author); - if(strlen(info->comment) > 0) - mp_msg(MSGT_CPLAYER,MSGL_V,MSGTR_AOComment, info->comment); - - if(!audio_out->init(force_srate?force_srate:sh_audio->samplerate, - sh_audio->channels,sh_audio->sample_format,0)){ + sh_audio->channels,sh_audio->sample_format,0))){ + // FAILED: mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CannotInitAO); - sh_audio=d_audio->sh=NULL; + sh_audio=d_audio->sh=NULL; // -> nosound } else { + // SUCCESS: inited_flags|=INITED_AO; + mp_msg(MSGT_CPLAYER,MSGL_INFO,"AO: [%s] %iHz %dch %s\n", + audio_out->info->short_name, + force_srate?force_srate:sh_audio->samplerate, + sh_audio->channels, + audio_out_format_name(sh_audio->sample_format)); + mp_msg(MSGT_CPLAYER,MSGL_V,MSGTR_AODescription_AOAuthor, + audio_out->info->name, audio_out->info->author); + if(strlen(audio_out->info->comment) > 0) + mp_msg(MSGT_CPLAYER,MSGL_V,MSGTR_AOComment, audio_out->info->comment); } } |