[Mplayerxp-cvslog] CVS: mplayerxp/mplayerxp/libao2 ao_alsa9.c,1.9,1.10 ao_oss.c,1.8,1.9 ao_plugin.c,
Brought to you by:
olov
From: Nick K. <nic...@us...> - 2003-06-10 16:16:04
|
Update of /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2 In directory sc8-pr-cvs1:/tmp/cvs-serv15846 Modified Files: ao_alsa9.c ao_oss.c ao_plugin.c ao_sdl.c audio_out.c audio_out.h Makefile Removed Files: afmt.c Log Message: prepare ao2 to handle audio.oef correctly Index: ao_alsa9.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/ao_alsa9.c,v retrieving revision 1.9 retrieving revision 1.10 diff -p -u -d -r1.9 -r1.10 --- ao_alsa9.c 29 Apr 2003 17:25:14 -0000 1.9 +++ ao_alsa9.c 10 Jun 2003 16:15:49 -0000 1.10 @@ -205,7 +205,7 @@ static int init(int rate_hz, int channel MSG_WARN("alsa-init: testing and bugreports are welcome.\n"); MSG_INFO("alsa-init: requested format: %d Hz, %d channels, %s\n", rate_hz, - channels, audio_out_format_name(format)); + channels, ao_format_name(format)); alsa_handler = NULL; @@ -274,7 +274,7 @@ static int init(int rate_hz, int channel break; case -1: MSG_ERR("alsa-init: invalid format (%s) requested - output disabled\n", - audio_out_format_name(format)); + ao_format_name(format)); return(0); default: break; @@ -1070,6 +1070,7 @@ static float get_delay() if (alsa_handler) { snd_pcm_status_t *status; + int r; float ret; if ((ret = snd_pcm_status_malloc(&status)) < 0) @@ -1089,7 +1090,8 @@ static float get_delay() case SND_PCM_STATE_OPEN: case SND_PCM_STATE_PREPARED: case SND_PCM_STATE_RUNNING: - ret = (float)snd_pcm_status_get_delay(status)/(float)ao_data.samplerate; + r=snd_pcm_status_get_delay(status); + ret = (float)r/(float)ao_data.samplerate; break; default: ret = 0; Index: ao_oss.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/ao_oss.c,v retrieving revision 1.8 retrieving revision 1.9 diff -p -u -d -r1.8 -r1.9 --- ao_oss.c 29 Apr 2003 17:25:14 -0000 1.8 +++ ao_oss.c 10 Jun 2003 16:15:50 -0000 1.9 @@ -89,7 +89,7 @@ static int control(int cmd,long arg){ static int init(int rate,int channels,int format,int flags){ MSG_V("ao2: %d Hz %d chans %s\n",rate,channels, - audio_out_format_name(format)); + ao_format_name(format)); if (ao_subdevice) dsp = ao_subdevice; @@ -139,7 +139,7 @@ ac3_retry: goto ac3_retry; } MSG_V("audio_setup: sample format: %s (requested: %s)\n", - audio_out_format_name(ao_data.format), audio_out_format_name(format)); + ao_format_name(ao_data.format), ao_format_name(format)); ao_data.channels = channels; if(format != AFMT_AC3) { @@ -303,19 +303,26 @@ static int audio_delay_method=2; // return: delay in seconds between first and last sample in buffer static float get_delay(){ + int ierr; /* Calculate how many bytes/second is sent out */ if(audio_delay_method==2){ #ifdef SNDCTL_DSP_GETODELAY int r=0; - if(ioctl(audio_fd, SNDCTL_DSP_GETODELAY, &r)!=-1) + ierr=ioctl(audio_fd, SNDCTL_DSP_GETODELAY, &r); + if(ierr!=-1) + { return ((float)r)/(float)ao_data.bps; + } #endif audio_delay_method=1; // fallback if not supported } if(audio_delay_method==1){ // SNDCTL_DSP_GETOSPACE - if(ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)!=-1) + ierr=ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz); + if(ierr!=-1) + { return ((float)(ao_data.buffersize-zz.bytes))/(float)ao_data.bps; + } audio_delay_method=0; // fallback if not supported } return ((float)ao_data.buffersize)/(float)ao_data.bps; Index: ao_plugin.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/ao_plugin.c,v retrieving revision 1.6 retrieving revision 1.7 diff -p -u -d -r1.6 -r1.7 --- ao_plugin.c 29 Apr 2003 17:25:14 -0000 1.6 +++ ao_plugin.c 10 Jun 2003 16:15:50 -0000 1.7 @@ -138,7 +138,7 @@ static int init(int rate,int channels,in ao_plugin_local_data.format=format; ao_plugin_local_data.channels=channels; - ao_plugin_local_data.bpm=audio_out_format_bits(format); + ao_plugin_local_data.bpm=ao_format_bits(format); ao_plugin_data.rate=rate; ao_plugin_data.channels=channels; @@ -166,7 +166,7 @@ static int init(int rate,int channels,in // Calculate bps ao_plugin_local_data.bps=(float)(ao_plugin_data.rate * ao_plugin_data.channels); - ao_plugin_local_data.bps*=audio_out_format_bits(ao_plugin_data.format)/8; + ao_plugin_local_data.bps*=ao_format_bits(ao_plugin_data.format)/8; // This should never happen but check anyway if(NULL==ao_plugin_local_data.driver) Index: ao_sdl.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/ao_sdl.c,v retrieving revision 1.8 retrieving revision 1.9 diff -p -u -d -r1.8 -r1.9 --- ao_sdl.c 29 Apr 2003 17:25:14 -0000 1.8 +++ ao_sdl.c 10 Jun 2003 16:15:50 -0000 1.9 @@ -247,7 +247,7 @@ void callback(void *userdata, Uint8 *str ,drv_name ,rate ,channels>4?"Surround":channels>2?"Quadro":channels>1?"Stereo":"Mono" - ,audio_out_format_name(format)); + ,ao_format_name(format)); /* unsilence audio, if callback is ready */ SDL_PauseAudio(0); Index: audio_out.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/audio_out.c,v retrieving revision 1.5 retrieving revision 1.6 diff -p -u -d -r1.5 -r1.6 --- audio_out.c 29 Apr 2003 17:25:14 -0000 1.5 +++ audio_out.c 10 Jun 2003 16:15:50 -0000 1.6 @@ -3,7 +3,9 @@ #include "../config.h" #include "audio_out.h" +#include "libao2/audio_plugin.h" #include "afmt.h" +#include "ao_msg.h" // there are some globals: ao_data_t ao_data={0,0,0,0,OUTBURST,-1,0}; @@ -37,3 +39,182 @@ ao_functions_t* audio_out_drivers[] = &audio_out_plugin, NULL }; + +static ao_functions_t *audio_out=NULL; +static int ao_inited=0; + +char *ao_format_name(int format) +{ + switch (format) + { + case AFMT_MU_LAW: + return("Mu-Law"); + case AFMT_A_LAW: + return("A-Law"); + case AFMT_IMA_ADPCM: + return("Ima-ADPCM"); + case AFMT_S8: + return("Signed 8-bit"); + case AFMT_U8: + return("Unsigned 8-bit"); + case AFMT_U16_LE: + return("Unsigned 16-bit (Little-Endian)"); + case AFMT_U16_BE: + return("Unsigned 16-bit (Big-Endian)"); + case AFMT_S16_LE: + return("Signed 16-bit (Little-Endian)"); + case AFMT_S16_BE: + return("Signed 16-bit (Big-Endian)"); + case AFMT_MPEG: + return("MPEG (2) audio"); + case AFMT_AC3: + return("AC3"); +/* + the following two formats are not available with old linux kernel + headers (e.g. in 2.2.16) +*/ +#ifdef AFMT_S32_LE + case AFMT_S32_LE: + return("Signed 32-bit (Little-Endian)"); +#endif +#ifdef AFMT_S32_BE + case AFMT_S32_BE: + return("Signed 32-bit (Big-Endian)"); +#endif + } + return("Unknown"); +} + +// return number of bits for 1 sample in one channel, or 8 bits for compressed +int ao_format_bits(int format){ + switch (format) + { +/* + the following two formats are not available with old linux kernel + headers (e.g. in 2.2.16) +*/ +#ifdef AFMT_S32_LE + case AFMT_S32_LE: + return 32; +#endif +#ifdef AFMT_S32_BE + case AFMT_S32_BE: + return 32; +#endif + + case AFMT_U16_LE: + case AFMT_U16_BE: + case AFMT_S16_LE: + case AFMT_S16_BE: + return 16;//16 bits + + case AFMT_MU_LAW: + case AFMT_A_LAW: + case AFMT_IMA_ADPCM: + case AFMT_S8: + case AFMT_U8: + case AFMT_MPEG: + case AFMT_AC3: + default: + return 8;//default 1 byte + + } + return 8; +} + + +void ao_print_help( void ) +{ + unsigned i; + MSG_INFO("Available audio output drivers:\n"); + i=0; + while (audio_out_drivers[i]) { + const ao_info_t *info = audio_out_drivers[i++]->info; + MSG_INFO("\t%s\t%s\n", info->short_name, info->name); + } + MSG_INFO("\n"); +} + +ao_functions_t* ao_register(const char *driver_name) +{ + unsigned i; + if(!driver_name) + 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,driver_name) == 0){ + audio_out = audio_out_drivers[i];break; + } + } + if(audio_out) + { + /* Initialize 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,(long)audio_out); + audio_out = audio_out_drivers[i]; + break; + } + } + } + } + return audio_out; +} + +const ao_info_t* ao_get_info( void ) +{ + return audio_out->info; +} + +int ao_init(int rate,int channels,int format,int flags) +{ + int retval; + retval = audio_out->init(rate,channels,format,flags); + if(retval) ao_inited=1; + return retval; +} + +void ao_uninit(void) +{ + audio_out->uninit(); + ao_inited=0; +} + +void ao_reset(void) +{ + if(ao_inited) audio_out->reset(); +} + +int ao_get_space(void) +{ + return ao_inited?audio_out->get_space():0; +} + +int ao_play(void* data,int len,int flags) +{ + return ao_inited?audio_out->play(data,len,flags):0; +} + +float ao_get_delay(void) +{ + return ao_inited?audio_out->get_delay():0; +} + +void ao_pause(void) +{ + if(ao_inited) audio_out->pause(); +} + +void ao_resume(void) +{ + if(ao_inited) audio_out->resume(); +} + +int ao_control(int cmd,long arg) +{ + return ao_inited?audio_out->control(cmd,arg):CONTROL_ERROR; +} Index: audio_out.h =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/audio_out.h,v retrieving revision 1.3 retrieving revision 1.4 diff -p -u -d -r1.3 -r1.4 --- audio_out.h 30 Jun 2002 21:21:07 -0000 1.3 +++ audio_out.h 10 Jun 2003 16:15:50 -0000 1.4 @@ -1,3 +1,5 @@ +#ifndef __AUDIO_OUT_H +#define __AUDIO_OUT_H 1 typedef struct ao_info_s { /* driver name ("Matrox Millennium G200/G400" */ @@ -40,9 +42,6 @@ typedef struct ao_data_s extern char *ao_subdevice; extern ao_data_t ao_data; -// prototypes -extern char *audio_out_format_name(int format); -extern int audio_out_format_bits(int format); // NULL terminated array of all drivers extern ao_functions_t* audio_out_drivers[]; @@ -68,4 +67,20 @@ typedef struct ao_control_vol_s { float right; } ao_control_vol_t; +/* prototypes */ +extern char * ao_format_name(int format); +extern int ao_format_bits(int format); +extern void ao_print_help( void ); +extern ao_functions_t* ao_register(const char *driver_name); +extern const ao_info_t* ao_get_info( void ); +extern int ao_init(int rate,int channels,int format,int flags); +extern void ao_uninit(void); +extern void ao_reset(void); +extern int ao_get_space(void); +extern int ao_play(void* data,int len,int flags); +extern float ao_get_delay(void); +extern void ao_pause(void); +extern void ao_resume(void); +extern int ao_control(int cmd,long arg); +#endif Index: Makefile =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/Makefile,v retrieving revision 1.5 retrieving revision 1.6 diff -p -u -d -r1.5 -r1.6 --- Makefile 29 Apr 2003 17:25:15 -0000 1.5 +++ Makefile 10 Jun 2003 16:15:50 -0000 1.6 @@ -4,7 +4,7 @@ include config.mak LIBNAME = libao2.a # TODO: moveout ao_sdl.c so it's only used when SDL is detected -SRCS=afmt.c audio_out.c ao_null.c ao_plugin.c pl_delay.c pl_format.c pl_surround.c remez.c ao_accel.c pl_lp.c pl_resample.c pl_volume.c pl_extrastereo.c pl_volnorm.c pl_eq.c $(OPTIONAL_SRCS) +SRCS= audio_out.c ao_null.c ao_plugin.c pl_delay.c pl_format.c pl_surround.c remez.c ao_accel.c pl_lp.c pl_resample.c pl_volume.c pl_extrastereo.c pl_volnorm.c pl_eq.c $(OPTIONAL_SRCS) OBJS=$(SRCS:.c=.o) --- afmt.c DELETED --- |