[Mplayerxp-cvslog] CVS: mplayerxp/mplayerxp/libao2 ao_accel.c,NONE,1.1 ao_accel_template.c,NONE,1.1
Brought to you by:
olov
Update of /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2 In directory sc8-pr-cvs1:/tmp/cvs-serv22640 Modified Files: ao_alsa9.c ao_null.c ao_oss.c ao_plugin.c ao_sdl.c audio_out.c audio_plugin.h audio_plugin_internal.h fir.h Makefile pl_delay.c pl_eq.c pl_extrastereo.c pl_format.c pl_resample.c pl_surround.c Added Files: ao_accel.c ao_accel_template.c pl_lp.c Removed Files: ao_mpegpes.c ao_pcm.c Log Message: sync with mphq and lot of my improvements include new audio plugin --- NEW FILE: ao_accel.c --- #include <inttypes.h> #include "../config.h" #include "../cpudetect.h" #include "fir.h" #ifdef ARCH_X86 #define CAN_COMPILE_X86_ASM #endif #undef HAVE_MMX #undef HAVE_MMX2 #undef HAVE_3DNOW #undef HAVE_SSE #define RENAME(a) a ## _c #include "ao_accel_template.c" #ifdef CAN_COMPILE_X86_ASM //MMX versions #undef RENAME #define HAVE_MMX #undef HAVE_MMX2 #undef HAVE_3DNOW #define RENAME(a) a ## _MMX #include "ao_accel_template.c" #endif static int32_t init_firn(int16_t* x, int16_t* w, int n) { #ifdef CAN_COMPILE_X86_ASM if(gCpuCaps.hasMMX) firn = firn_MMX; else #endif //CAN_COMPILE_X86_ASM firn = firn_c; return (*firn)(x,w,n); } int32_t (*firn)(int16_t* x, int16_t* w, int n)=init_firn; --- NEW FILE: ao_accel_template.c --- static int32_t RENAME(firn)(int16_t* x, int16_t* w, int n) { register int32_t y=0; register int i,nn=(n/2)*2; #ifdef HAVE_MMX /* Prologue */ asm volatile( "pxor %%mm4, %%mm4\n" "pxor %%mm5, %%mm5" :::"memory"); /* Clear buffer yt */ /* Main loop (Note: the case n==8 is most often (for resampling stereo 48KHz to 44.1KHz for example)*/ for(i=0;i<nn;i+=8){ asm volatile( " movq (%1), %%mm0\n" /* Load x(n:n+4) */ " movq 8(%1), %%mm1\n" " pmaddwd (%0), %%mm0\n" /* yt(n:n+1)=sum(x(n:n+4).*w(n:n+4)) */ " pmaddwd 8(%0), %%mm1\n" " psrld $16, %%mm0\n" /* yt(n:n+1)=yt(n:n+1)>>16 */ " psrld $16, %%mm1\n" " paddd %%mm0, %%mm4\n" /* yt(n:n+1)=yt(n-2:n-1)+yt(n:n+1) */ " paddd %%mm1, %%mm5\n" :: "g" (&w[i]), "g" (&x[i])); } /* Tail loop */ for(;i<n;i+=4){ asm volatile( " movq (%1), %%mm0\n" /* Load x(n:n+4) */ " pmaddwd (%0), %%mm0\n" /* yt(n:n+1)=sum(x(n:n+4).*w(n:n+4)) */ " psrld $16, %%mm0\n" /* yt(n:n+1)=yt(n:n+1)>>16 */ " paddd %%mm0, %%mm4\n" /* yt(n:n+1)=yt(n-2:n-1)+yt(n:n+1) */ :: "g" (&w[i]), "g" (&x[i])); } /* Epilogue */ asm volatile( " movq %%mm4, %%mm0\n" " movq %%mm5, %%mm1\n" " punpckhdq %%mm4, %%mm0\n" " punpckhdq %%mm5, %%mm1\n" " paddd %%mm0, %%mm4\n" /* yt(n)=yt(n)+yt(n+1) */ " paddd %%mm1, %%mm5\n" " paddd %%mm5, %%mm4\n" " movd %%mm4, %0\n" /* y=yt */ " emms\n" : "=&r" (y)); #else /* HAVE_MMX */ for(i=0;i<nn;i+=8) y+=(w[i+0]*x[i+0]+w[i+1]*x[i+1]+w[i+2]*x[i+2]+w[i+3]*x[i+3])>>16+ (w[i+4]*x[i+4]+w[i+5]*x[i+5]+w[i+6]*x[i+6]+w[i+7]*x[i+7])>>16; for(;i<n;i+=4) y+=(w[i]*x[i]+w[i+1]*x[i+1]+w[i+2]*x[i+2]+w[i+3]*x[i+3])>>16; #endif /* HAVE_MMX */ return y; } --- NEW FILE: pl_lp.c --- /*============================================================================= // // This software has been released under the terms of the GNU Public // license. See http://www.gnu.org/copyleft/gpl.html for details. // // Copyright 2003 Nick Kurshev // //============================================================================= */ /* LongPlay - This audio output plugin fakes changing of sample rate. The output should be played longer than original sound track so it may help to avoid framedropping by longer movie playback */ #define PLUGIN #include "../config.h" #include "audio_out.h" #include "audio_plugin.h" #include "audio_plugin_internal.h" #include "libmpdemux/stream.h" #include "libmpdemux/demuxer.h" #include "../libmpdemux/stheader.h" #include "ao_msg.h" static ao_info_t info = { "LongPlay audio plugin", "lp", "Nick Kurshev", "" }; LIBAO_PLUGIN_EXTERN(lp) static int control(int cmd,long arg){ switch(cmd){ case AOCONTROL_PLUGIN_SET_LEN: return CONTROL_OK; } return CONTROL_UNKNOWN; } static int init(){ int fin=ao_plugin_data.rate; int fout=ao_plugin_cfg.pl_resample_fout; /* Tell the world what we are up to */ MSG_INFO("[pl_lp] In=%i, Faked Out=%i\n",fin,fout); ao_plugin_data.rate=fout; ao_plugin_data.delay_mult*=(float)fout/(float)fin; return 1; } static void uninit(){} static void reset(){} static int play(){ /* Do nothing here */ return 1; } Index: ao_alsa9.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/ao_alsa9.c,v retrieving revision 1.8 retrieving revision 1.9 diff -p -u -d -r1.8 -r1.9 --- ao_alsa9.c 11 Feb 2003 15:14:24 -0000 1.8 +++ ao_alsa9.c 29 Apr 2003 17:25:14 -0000 1.9 @@ -54,6 +54,8 @@ static int alsa_fragsize = 4096; static int alsa_fragcount = 16; static int chunk_size = 1024; //is alsa_fragsize / 4 +#define MIN_CHUNK_SIZE 1024 + static size_t bits_per_sample, bytes_per_sample, bits_per_frame; static size_t chunk_bytes; @@ -416,7 +418,7 @@ static int init(int rate_hz, int channel " mmap-mode and the device-name as first card third device\n"); return(0); } else { - printf("alsa-init: soundcard set to %s\n", alsa_device); + MSG_INFO("alsa-init: soundcard set to %s\n", alsa_device); } //setting modes for block or nonblock-mode @@ -725,23 +727,17 @@ static void reset() { int err; - if (!ao_noblock) { - //drain causes error in nonblock-mode! - if ((err = snd_pcm_drain(alsa_handler)) < 0) - { - MSG_ERR("alsa-pause: pcm drain error: %s\n", snd_strerror(err)); - return; - } - - if ((err = snd_pcm_prepare(alsa_handler)) < 0) - { - MSG_ERR("alsa-reset: pcm prepare error: %s\n", snd_strerror(err)); - return; - } - } else { - MSG_V("alsa-reset: reset nonblocked"); - return; + if ((err = snd_pcm_drop(alsa_handler)) < 0) + { + MSG_ERR("alsa-reset: pcm drop error: %s\n", snd_strerror(err)); + return; } + if ((err = snd_pcm_prepare(alsa_handler)) < 0) + { + MSG_ERR("alsa-reset: pcm prepare error: %s\n", snd_strerror(err)); + return; + } + return; } #ifdef USE_POLL @@ -1060,6 +1056,10 @@ static int get_space() ret = 0; } + // workaround for too small value returned + if (ret < MIN_CHUNK_SIZE) + ret = 0; + return(ret); } Index: ao_null.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/ao_null.c,v retrieving revision 1.3 retrieving revision 1.4 diff -p -u -d -r1.3 -r1.4 --- ao_null.c 30 Jun 2002 21:21:07 -0000 1.3 +++ ao_null.c 29 Apr 2003 17:25:14 -0000 1.4 @@ -19,7 +19,7 @@ LIBAO_EXTERN(null) struct timeval last_tv; int buffer; -static int drain(){ +static void drain(){ struct timeval now_tv; int temp, temp2; Index: ao_oss.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/ao_oss.c,v retrieving revision 1.7 retrieving revision 1.8 diff -p -u -d -r1.7 -r1.8 --- ao_oss.c 30 Jun 2002 21:21:07 -0000 1.7 +++ ao_oss.c 29 Apr 2003 17:25:14 -0000 1.8 @@ -18,8 +18,6 @@ #include "audio_out.h" #include "audio_out_internal.h" -extern int verbose; - static ao_info_t info = { "OSS/ioctl audio output", @@ -50,7 +48,7 @@ static int control(int cmd,long arg){ case AOCONTROL_SET_VOLUME: { ao_control_vol_t *vol = (ao_control_vol_t *)arg; - int fd, v, mcmd, devs; + int fd, v, devs; if(ao_data.format == AFMT_AC3) return CONTROL_TRUE; @@ -90,8 +88,7 @@ static int control(int cmd,long arg){ // return: 1=success 0=fail static int init(int rate,int channels,int format,int flags){ - if (verbose) - MSG_INFO("ao2: %d Hz %d chans %s\n",rate,channels, + MSG_V("ao2: %d Hz %d chans %s\n",rate,channels, audio_out_format_name(format)); if (ao_subdevice) @@ -120,9 +117,9 @@ static int init(int rate,int channels,in } #endif - ao_data.bps=channels; - if(format != AFMT_U8 && format != AFMT_S8) - ao_data.bps*=2; +#if defined(FD_CLOEXEC) && defined(F_SETFD) + fcntl(audio_fd, F_SETFD, FD_CLOEXEC); +#endif if(format == AFMT_AC3) { ao_data.samplerate=rate; @@ -133,7 +130,7 @@ ac3_retry: ao_data.format=format; if( ioctl(audio_fd, SNDCTL_DSP_SETFMT, &ao_data.format)<0 || ao_data.format != format) if(format == AFMT_AC3){ - MSG_ERR("Can't set audio device %s to AC3 output, trying S16...\n", dsp); + MSG_WARN("Can't set audio device %s to AC3 output, trying S16...\n", dsp); #ifdef WORDS_BIGENDIAN format=AFMT_S16_BE; #else @@ -141,36 +138,37 @@ ac3_retry: #endif goto ac3_retry; } - MSG_INFO("audio_setup: sample format: %s (requested: %s)\n", + MSG_V("audio_setup: sample format: %s (requested: %s)\n", audio_out_format_name(ao_data.format), audio_out_format_name(format)); + ao_data.channels = channels; if(format != AFMT_AC3) { // We only use SNDCTL_DSP_CHANNELS for >2 channels, in case some drivers don't have it - ao_data.channels = channels; if (ao_data.channels > 2) { if ( ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &ao_data.channels) == -1 || ao_data.channels != channels ) { - MSG_FATAL("audio_setup: Failed to set audio device to %d channels\n", channels); + MSG_ERR("audio_setup: Failed to set audio device to %d channels\n", channels); return 0; } } else { int c = ao_data.channels-1; if (ioctl (audio_fd, SNDCTL_DSP_STEREO, &c) == -1) { - MSG_FATAL("audio_setup: Failed to set audio device to %d channels\n", ao_data.channels); + MSG_ERR("audio_setup: Failed to set audio device to %d channels\n", ao_data.channels); return 0; } + ao_data.channels=c+1; } - MSG_INFO("audio_setup: using %d channels (requested: %d)\n", ao_data.channels, channels); + MSG_V("audio_setup: using %d channels (requested: %d)\n", ao_data.channels, channels); // set rate ao_data.samplerate=rate; ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_data.samplerate); - MSG_INFO("audio_setup: using %d Hz samplerate (requested: %d)\n",ao_data.samplerate,rate); + MSG_V("audio_setup: using %d Hz samplerate (requested: %d)\n",ao_data.samplerate,rate); } if(ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)==-1){ int r=0; - MSG_ERR("audio_setup: driver doesn't support SNDCTL_DSP_GETOSPACE :-(\n"); + MSG_WARN("audio_setup: driver doesn't support SNDCTL_DSP_GETOSPACE :-(\n"); if(ioctl(audio_fd, SNDCTL_DSP_GETBLKSIZE, &r)==-1){ MSG_V("audio_setup: %d bytes/frag (config.h)\n",ao_data.outburst); } else { @@ -201,25 +199,31 @@ ac3_retry: } free(data); if(ao_data.buffersize==0){ - MSG_FATAL("\n *** Your audio driver DOES NOT support select() ***\n"); - MSG_FATAL("Recompile mplayer with #undef HAVE_AUDIO_SELECT in config.h !\n\n"); + MSG_ERR("\n *** Your audio driver DOES NOT support select() ***\n" + "Recompile mplayerxp with #undef HAVE_AUDIO_SELECT in config.h !\n\n"); return 0; } #endif } + ao_data.bps=ao_data.channels; + if(ao_data.format != AFMT_U8 && ao_data.format != AFMT_S8) + ao_data.bps*=2; + ao_data.outburst-=ao_data.outburst % ao_data.bps; // round down - ao_data.bps*=rate; + ao_data.bps*=ao_data.samplerate; return 1; } // close audio device static void uninit(){ + if(audio_fd == -1) return; #ifdef SNDCTL_DSP_RESET ioctl(audio_fd, SNDCTL_DSP_RESET, NULL); #endif close(audio_fd); + audio_fd = -1; } // stop playing and empty buffers (for seeking/pause) @@ -253,6 +257,7 @@ static void audio_pause() // resume playing, after audio_pause() static void audio_resume() { + reset(); } Index: ao_plugin.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/ao_plugin.c,v retrieving revision 1.5 retrieving revision 1.6 diff -p -u -d -r1.5 -r1.6 --- ao_plugin.c 30 Jun 2002 21:21:07 -0000 1.5 +++ ao_plugin.c 29 Apr 2003 17:25:14 -0000 1.6 @@ -124,7 +124,7 @@ static int init(int rate,int channels,in // Create list of plugins from cfg option int i=0; if(ao_plugin_cfg.plugin_list){ - config = malloc(strlen(ao_plugin_cfg.plugin_list)); + config = malloc(strlen(ao_plugin_cfg.plugin_list)+1); if(!config) return 0; if(!strcpy(config, ao_plugin_cfg.plugin_list) || !add_plugin(i,config)){ free(config); @@ -148,15 +148,15 @@ static int init(int rate,int channels,in ao_plugin_data.delay_mult=1; ao_plugin_data.delay_fix=0; - for(i=0;i<NPL,plugin(i);i++){ + for(i=0;i<NPL && plugin(i);i++){ use_plugin[i]=plugin(i)->init(); if(!use_plugin[i]) plugin(i)->uninit(); } npl=i; - for(i=0;i<npl,plugin(i);i++) + for(i=0;i<npl && plugin(i);i++) if(!use_plugin[i+unused]){ unused++; - for(x=i;x<npl,plugin(x+1);x++) plugin(x)=plugin(x+1); + for(x=i;x<npl && plugin(x+1);x++) plugin(x)=plugin(x+1); plugin(x)=NULL; npl--; i--; Index: ao_sdl.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/ao_sdl.c,v retrieving revision 1.7 retrieving revision 1.8 diff -p -u -d -r1.7 -r1.8 --- ao_sdl.c 30 Jun 2002 21:21:07 -0000 1.7 +++ ao_sdl.c 29 Apr 2003 17:25:14 -0000 1.8 @@ -30,9 +30,6 @@ static ao_info_t info = LIBAO_EXTERN(sdl) - -extern int verbose; - // Samplesize used by the SDLlib AudioSpec struct #define SAMPLESIZE 1024 @@ -95,8 +92,8 @@ static int read_buffer(unsigned char* da // end ring buffer stuff -#if defined(sun) && defined(__svr4__) -/* setenv is missing on solaris */ +#if defined(HPUX) || defined(sun) && defined(__svr4__) +/* setenv is missing on solaris and HPUX */ static void setenv(const char *name, const char *val, int _xx) { int len = strlen(name) + strlen(val) + 2; @@ -143,7 +140,7 @@ void outputaudio(void *unused, Uint8 *st static int init(int rate,int channels,int format,int flags){ /* SDL Audio Specifications */ - SDL_AudioSpec aspec; + SDL_AudioSpec aspec, obtained; char drv_name[80]; int i; /* Allocate ring-buffer memory */ @@ -153,6 +150,10 @@ static int init(int rate,int channels,in setenv("SDL_AUDIODRIVER", ao_subdevice, 1); } + ao_data.channels=channels; + ao_data.samplerate=rate; + ao_data.format=format; + ao_data.bps=channels*rate; if(format != AFMT_U8 && format != AFMT_S8) ao_data.bps*=2; @@ -205,14 +206,41 @@ void callback(void *userdata, Uint8 *str } /* Open the audio device and start playing sound! */ - if(SDL_OpenAudio(&aspec, NULL) < 0) { + if(SDL_OpenAudio(&aspec, &obtained) < 0) { MSG_ERR("SDL: Unable to open audio: %s\n", SDL_GetError()); return(0); } - if(verbose) MSG_V("SDL: buf size = %d\n",aspec.size); - if(ao_data.buffersize==-1) ao_data.buffersize=aspec.size; - + /* did we got what we wanted ? */ + ao_data.channels=obtained.channels; + ao_data.samplerate=obtained.freq; + + switch(obtained.format) { + case AUDIO_U8 : + ao_data.format = AFMT_U8; + break; + case AUDIO_S16LSB : + ao_data.format = AFMT_S16_LE; + break; + case AUDIO_S16MSB : + ao_data.format = AFMT_S16_BE; + break; + case AUDIO_S8 : + ao_data.format = AFMT_S8; + break; + case AUDIO_U16LSB : + ao_data.format = AFMT_U16_LE; + break; + case AUDIO_U16MSB : + ao_data.format = AFMT_U16_BE; + break; + default: + MSG_WARN("SDL: Unsupported SDL audio format: 0x%x.\n", obtained.format); + return 0; + } + + MSG_V("SDL: buf size = %d\n",aspec.size); + ao_data.buffersize=obtained.size; SDL_AudioDriverName(drv_name, sizeof(drv_name)); MSG_OK("SDL: using %s audio driver (%iHz %s \"%s\")\n" @@ -229,7 +257,7 @@ void callback(void *userdata, Uint8 *str // close audio device static void uninit(){ - if(verbose) MSG_INFO("SDL: Audio Subsystem shutting down!\n"); + MSG_V("SDL: Audio Subsystem shutting down!\n"); SDL_CloseAudio(); SDL_QuitSubSystem(SDL_INIT_AUDIO); } @@ -251,13 +279,13 @@ static void reset(){ // stop playing, keep buffers (for pause) static void audio_pause() { - SDL_LockAudio(); + SDL_PauseAudio(1); } // resume playing, after audio_pause() static void audio_resume() { - SDL_UnlockAudio(); + SDL_PauseAudio(0); } @@ -290,9 +318,3 @@ static int play(void* data,int len,int f static float get_delay(){ return (float)(buffered_bytes + ao_data.buffersize)/(float)ao_data.bps; } - - - - - - Index: audio_out.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/audio_out.c,v retrieving revision 1.4 retrieving revision 1.5 diff -p -u -d -r1.4 -r1.5 --- audio_out.c 11 Feb 2003 15:14:24 -0000 1.4 +++ audio_out.c 29 Apr 2003 17:25:14 -0000 1.5 @@ -14,18 +14,11 @@ extern ao_functions_t audio_out_oss; #endif extern ao_functions_t audio_out_null; #ifdef HAVE_ALSA - extern ao_functions_t audio_out_alsa; -#endif -#ifdef HAVE_ESD - extern ao_functions_t audio_out_esd; +extern ao_functions_t audio_out_alsa; #endif #ifdef HAVE_SDL extern ao_functions_t audio_out_sdl; #endif -#ifdef HAVE_DVB -extern ao_functions_t audio_out_mpegpes; -#endif -extern ao_functions_t audio_out_pcm; extern ao_functions_t audio_out_pss; extern ao_functions_t audio_out_plugin; @@ -41,14 +34,6 @@ ao_functions_t* audio_out_drivers[] = #ifdef HAVE_ALSA &audio_out_alsa, #endif -#ifdef HAVE_ESD - &audio_out_esd, -#endif -#ifdef HAVE_DVB - &audio_out_mpegpes, -#endif - &audio_out_pcm, &audio_out_plugin, -// &audio_out_pss, NULL }; Index: audio_plugin.h =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/audio_plugin.h,v retrieving revision 1.2 retrieving revision 1.3 diff -p -u -d -r1.2 -r1.3 --- audio_plugin.h 17 Jun 2002 07:43:14 -0000 1.2 +++ audio_plugin.h 29 Apr 2003 17:25:15 -0000 1.3 @@ -5,11 +5,11 @@ typedef struct ao_plugin_functions_s { ao_info_t *info; - int (*control)(int cmd,int arg); - int (*init)(); - void (*uninit)(); - void (*reset)(); - int (*play)(); + int (*control)(int cmd,long arg); + int (*init)(void); + void (*uninit)(void); + void (*reset)(void); + int (*play)(void); } ao_plugin_functions_t; // Global data for all audio plugins @@ -56,7 +56,7 @@ extern ao_plugin_cfg_t ao_plugin_cfg; // This block should not be available in the pl_xxxx files // due to compilation issues #ifndef PLUGIN -#define NPL 8+1 // Number of PLugins ( +1 list ends with NULL ) +#define NPL 9+1 // Number of PLugins ( +1 list ends with NULL ) // List of plugins extern ao_plugin_functions_t audio_plugin_delay; extern ao_plugin_functions_t audio_plugin_format; @@ -66,6 +66,7 @@ extern ao_plugin_functions_t audio_plugi extern ao_plugin_functions_t audio_plugin_extrastereo; extern ao_plugin_functions_t audio_plugin_volnorm; extern ao_plugin_functions_t audio_plugin_eq; +extern ao_plugin_functions_t audio_plugin_lp; #define AO_PLUGINS { \ &audio_plugin_delay, \ @@ -76,6 +77,7 @@ extern ao_plugin_functions_t audio_plugi &audio_plugin_extrastereo, \ &audio_plugin_volnorm, \ &audio_plugin_eq, \ + &audio_plugin_lp, \ NULL \ } #endif /* PLUGIN */ @@ -83,6 +85,8 @@ extern ao_plugin_functions_t audio_plugi // Control parameters used by the plugins #define AOCONTROL_PLUGIN_SET_LEN 1 // All plugins must respond to this parameter +#define AOCONTROL_PLUGIN_ES_SET 4 // set extra stereo coefficient +#define AOCONTROL_PLUGIN_ES_GET 5 // get extra stereo coefficient #endif Index: audio_plugin_internal.h =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/audio_plugin_internal.h,v retrieving revision 1.2 retrieving revision 1.3 diff -p -u -d -r1.2 -r1.3 --- audio_plugin_internal.h 30 Jun 2002 21:21:07 -0000 1.2 +++ audio_plugin_internal.h 29 Apr 2003 17:25:15 -0000 1.3 @@ -1,9 +1,9 @@ // prototypes: static int control(int cmd,long arg); -static int init(); -static void uninit(); -static void reset(); -static int play(); +static int init(void); +static void uninit(void); +static void reset(void); +static int play(void); #define LIBAO_PLUGIN_EXTERN(x) ao_plugin_functions_t audio_plugin_##x =\ {\ Index: fir.h =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/fir.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -p -u -d -r1.1.1.1 -r1.2 --- fir.h 23 Mar 2002 11:09:20 -0000 1.1.1.1 +++ fir.h 29 Apr 2003 17:25:15 -0000 1.2 @@ -19,53 +19,15 @@ must be multiple of 4 (pad fiter with ze Sometimes it works with filters longer than 4*16 (the problem is overshoot and the acumulated energy in the filter taps). */ -#ifdef HAVE_MMX -inline int32_t firn(int16_t* x, int16_t* w, int16_t n) -{ - register int32_t y; // Output - // Prologue - asm volatile(" pxor %mm1, %mm1;\n" ); // Clear buffer yt - // Main loop - while((n-=4)>=0){ - asm volatile( - " movq (%1), %%mm0;\n" // Load x(n:n+4) - " pmaddwd (%0), %%mm0;\n" // yt(n:n+1)=sum(x(n:n+4).*w(n:n+4)) - " psrld $16, %%mm0;\n" // yt(n:n+1)=yt(n:n+1)>>16 - " paddd %%mm0, %%mm1;\n" // yt(n:n+1)=yt(n-2:n-1)+yt(n:n+1) - :: "r" (w), "r" (x)); - w+=4; x+=4; - } - // Epilogue - asm volatile( - " movq %%mm1, %%mm0;\n" - " punpckhdq %%mm1, %%mm0;\n" - " paddd %%mm0, %%mm1;\n" //yt(n)=yt(n)+yt(n+1) - " movd %%mm1, %0 ;\n" //y=yt - " emms ;\n" - : "=&r" (y)); - return y; -} - -#else /* HAVE_MMX */ - -// Same thing as above but in C -inline int32_t firn(int16_t* x, int16_t* w, int16_t n) -{ - register int32_t y=0; - while((n-=4) >=0) - y+=w[n]*x[n]+w[n+1]*x[n+1]+w[n+2]*x[n+2]+w[n+3]*x[n+3] >> 16; - return y; -} - -#endif /* HAVE_MMX */ +extern int32_t (*firn)(int16_t* x, int16_t* w, int n); /* Add new data to circular queue designed to be used with a FIR filter. xq is the circular queue, in pointing at the new sample, xi current index for in xq and l the lenght of the filter */ -inline uint16_t updateq(int16_t* xq, int16_t* in, uint16_t xi, uint16_t l) +static inline uint16_t updateq(int16_t* xq, int16_t* in, uint16_t xi, uint16_t l) { xq[xi]=xq[xi+l]=*in; - return (--xi)&(l-1); \ + return (--xi)&(l-1); } #endif /* __FIR_H__ */ Index: Makefile =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/Makefile,v retrieving revision 1.4 retrieving revision 1.5 diff -p -u -d -r1.4 -r1.5 --- Makefile 6 Jan 2003 08:28:38 -0000 1.4 +++ Makefile 29 Apr 2003 17:25:15 -0000 1.5 @@ -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_mpegpes.c ao_null.c ao_pcm.c ao_plugin.c pl_delay.c pl_format.c pl_surround.c remez.c pl_resample.c pl_volume.c pl_extrastereo.c pl_volnorm.c pl_eq.c $(OPTIONAL_SRCS) +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) OBJS=$(SRCS:.c=.o) Index: pl_delay.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/pl_delay.c,v retrieving revision 1.4 retrieving revision 1.5 diff -p -u -d -r1.4 -r1.5 --- pl_delay.c 30 Jun 2002 21:21:07 -0000 1.4 +++ pl_delay.c 29 Apr 2003 17:25:15 -0000 1.5 @@ -56,7 +56,6 @@ static int control(int cmd,long arg){ // open & setup audio device // return: 1=success 0=fail static int init(){ - int i=0; float time_delay; // The time in [s] this plugin delays the output data /* If the output format of any of the below parameters differs from @@ -93,11 +92,8 @@ static void uninit(){ // empty buffers static void reset(){ - int i = 0; - for(i=0;i<pl_delay.len;i++) - ((char*)pl_delay.data)[i]=0; - for(i=0;i<ao_plugin_cfg.pl_delay_len;i++) - ((char*)pl_delay.delay)[i]=0; + memset(pl_delay.data,0,pl_delay.len); + memset(pl_delay.delay,0,ao_plugin_cfg.pl_delay_len); } // processes 'ao_plugin_data.len' bytes of 'data' Index: pl_eq.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/pl_eq.c,v retrieving revision 1.3 retrieving revision 1.4 diff -p -u -d -r1.3 -r1.4 --- pl_eq.c 17 Sep 2002 16:33:10 -0000 1.3 +++ pl_eq.c 29 Apr 2003 17:25:15 -0000 1.4 @@ -201,17 +201,16 @@ static int play(){ // Pointer to circular buffer wq register int16_t* wq = pl_eq.wq[ci][k]; // Calculate output from AR part of current filter - register int32_t xt = (x*pl_eq.b[k][0]) >> 4; + register int32_t xt = (x*pl_eq.b[k][0]) / 48; register int32_t w = xt + wq[0]*pl_eq.a[k][0] + wq[1]*pl_eq.a[k][1]; // Calculate output form MA part of current filter yt+=(((w + wq[1]*pl_eq.b[k][1]) >> 10)*g[k]) >> 12; // Update circular buffer - wq[1] = wq[0]; wq[0] = w >> 14; + wq[1] = wq[0]; wq[0] = w / 24576; } // Calculate output - *out=(int16_t)(yt+x); - out+=nch; + *out=(int16_t)(yt * 0.25 + x * 0.5); } } return 1; Index: pl_extrastereo.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/pl_extrastereo.c,v retrieving revision 1.4 retrieving revision 1.5 diff -p -u -d -r1.4 -r1.5 --- pl_extrastereo.c 17 Sep 2002 16:33:10 -0000 1.4 +++ pl_extrastereo.c 29 Apr 2003 17:25:15 -0000 1.5 @@ -45,6 +45,12 @@ static int control(int cmd,long arg){ switch(cmd){ case AOCONTROL_PLUGIN_SET_LEN: return CONTROL_OK; + case AOCONTROL_PLUGIN_ES_SET: + pl_extrastereo.mul=*((float*)arg); + return CONTROL_OK; + case AOCONTROL_PLUGIN_ES_GET: + *((float*)arg)=pl_extrastereo.mul; + return CONTROL_OK; } return CONTROL_UNKNOWN; } Index: pl_format.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/pl_format.c,v retrieving revision 1.5 retrieving revision 1.6 diff -p -u -d -r1.5 -r1.6 --- pl_format.c 17 Sep 2002 16:33:10 -0000 1.5 +++ pl_format.c 29 Apr 2003 17:25:15 -0000 1.6 @@ -253,7 +253,7 @@ static int play(){ switch(pl_format.in&SIGN_MASK){ case(US): for(i=0;i<len;i++) - ((int32_t*)in_data)[i]=(int32_t)(-(1<<31-1)+((uint32_t*)in_data)[i]); + ((int32_t*)in_data)[i]=(int32_t)(((uint32_t*)in_data)[i]-0x80000000); break; case(SI): for(i=0;i<len;i++) Index: pl_resample.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/pl_resample.c,v retrieving revision 1.3 retrieving revision 1.4 diff -p -u -d -r1.3 -r1.4 --- pl_resample.c 30 Jun 2002 21:21:07 -0000 1.3 +++ pl_resample.c 29 Apr 2003 17:25:15 -0000 1.4 @@ -161,22 +161,6 @@ static void uninit(){ static void reset(){ } -// processes 'ao_plugin_data.len' bytes of 'data' -// called for every block of data -// FIXME: this routine needs to be optimized (it is probably possible to do a lot here) -static int play(){ - if(pl_resample.up==pl_resample.dn){ - register int16_t* in = ((int16_t*)ao_plugin_data.data); - register int16_t* end = in+ao_plugin_data.len/2; - while(in < end) *in=(*in++)>>1; - return 1; - } - if(pl_resample.up>pl_resample.dn) - return upsample(); - if(pl_resample.up<pl_resample.dn) - return downsample(); -} - int upsample(){ static uint16_t pwi = 0; // Index for w static uint16_t pxi = 0; // Index for circular queue @@ -281,3 +265,20 @@ int downsample(){ ao_plugin_data.data=pl_resample.data; return 1; } + +// processes 'ao_plugin_data.len' bytes of 'data' +// called for every block of data +// FIXME: this routine needs to be optimized (it is probably possible to do a lot here) +static int play(){ + if(pl_resample.up==pl_resample.dn){ + register int16_t* in = ((int16_t*)ao_plugin_data.data); + register int16_t* end = in+ao_plugin_data.len/2; + while(in < end) *in=(*in++)>>1; + return 1; + } + if(pl_resample.up>pl_resample.dn) + return upsample(); + else + return downsample(); +} + Index: pl_surround.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libao2/pl_surround.c,v retrieving revision 1.6 retrieving revision 1.7 diff -p -u -d -r1.6 -r1.7 --- pl_surround.c 17 Sep 2002 16:33:10 -0000 1.6 +++ pl_surround.c 29 Apr 2003 17:25:15 -0000 1.7 @@ -169,9 +169,6 @@ static double steering_matrix[][12] = { {.707, .0, .0, .707, .5, -.5, .5878, -.3928, .3928, -.5878, .5, .5}, }; -// Experimental moving average dominances -static int amp_L = 0, amp_R = 0, amp_C = 0, amp_S = 0; - // processes 'ao_plugin_data.len' bytes of 'data' // called for every block of data static int play(){ --- ao_mpegpes.c DELETED --- --- ao_pcm.c DELETED --- |