From ba3c4568fb1ac38da3cc3b098434ac399ba7bb7d Mon Sep 17 00:00:00 2001 From: alex Date: Sat, 26 Jun 2004 09:14:20 +0000 Subject: New 'Mixer API' with ability to change volume through libaf (this part was written by Reimar Doffinger) and lesser global variables git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@12673 b3059339-0415-0410-9bf9-f77b7e298cf2 --- mixer.c | 100 +++++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 61 insertions(+), 39 deletions(-) (limited to 'mixer.c') diff --git a/mixer.c b/mixer.c index 1c187c82ca..6a3c54586c 100644 --- a/mixer.c +++ b/mixer.c @@ -1,4 +1,3 @@ - #include #ifndef __MINGW32__ #include @@ -8,82 +7,105 @@ #include #include "config.h" -#include "mixer.h" #include "libao2/audio_out.h" +#include "libaf/af.h" +#include "mixer.h" -extern ao_functions_t *audio_out; +#include "help_mp.h" char * mixer_device=NULL; char * mixer_channel=NULL; -int muted = 0; -float mute_l = 0.0f; -float mute_r = 0.0f; - -void mixer_getvolume( float *l,float *r ) +void mixer_getvolume(mixer_t *mixer, float *l, float *r) { ao_control_vol_t vol; *l=0; *r=0; - if(audio_out){ - if(CONTROL_OK != audio_out->control(AOCONTROL_GET_VOLUME,&vol)) - return; + if(mixer->audio_out){ + if(CONTROL_OK != mixer->audio_out->control(AOCONTROL_GET_VOLUME,&vol)) { + if (!mixer->afilter) + return; + else { + float db_vals[AF_NCH]; + if (!af_control_any_rev(mixer->afilter, + AF_CONTROL_VOLUME_LEVEL | AF_CONTROL_GET, db_vals)) + return; + af_from_dB (2, db_vals, db_vals, 20.0, -200.0, 60.0); + vol.left = db_vals[0] * 90.0; + vol.right = db_vals[1] * 90.0; + } + } *r=vol.right; *l=vol.left; } } -void mixer_setvolume( float l,float r ) +void mixer_setvolume(mixer_t *mixer, float l, float r) { ao_control_vol_t vol; vol.right=r; vol.left=l; - if(audio_out){ - if(CONTROL_OK != audio_out->control(AOCONTROL_SET_VOLUME,&vol)) - return; + if(mixer->audio_out){ + if(CONTROL_OK != mixer->audio_out->control(AOCONTROL_SET_VOLUME,&vol)) { + if (mixer->afilter) + return; + else { + // af_volume uses values in dB + float db_vals[AF_NCH]; + int i; + // a volume of 90% will give 0 dB (no change) + // like this, amplification is possible as well + db_vals[0] = l / 90.0; + db_vals[1] = r / 90.0; + for (i = 2; i < AF_NCH; i++) { + db_vals[i] = (l + r) / 180.0; + } + af_to_dB (AF_NCH, db_vals, db_vals, 20.0); + if (!af_control_any_rev(mixer->afilter, + AF_CONTROL_VOLUME_LEVEL | AF_CONTROL_SET, db_vals)) { + mp_msg(MSGT_GLOBAL, MSGL_HINT, MSGTR_NeedAfVolume); + return; + } + } + } } - muted=0; + mixer->muted=0; } -#define MIXER_CHANGE 3 - -void mixer_incvolume( void ) +void mixer_incvolume(mixer_t *mixer) { float mixer_l, mixer_r; - mixer_getvolume( &mixer_l,&mixer_r ); - mixer_l += MIXER_CHANGE; + mixer_getvolume(mixer, &mixer_l, &mixer_r); + mixer_l += mixer->volstep; if ( mixer_l > 100 ) mixer_l = 100; - mixer_r += MIXER_CHANGE; + mixer_r += mixer->volstep; if ( mixer_r > 100 ) mixer_r = 100; - mixer_setvolume( mixer_l,mixer_r ); + mixer_setvolume(mixer, mixer_l, mixer_r); } -void mixer_decvolume( void ) +void mixer_decvolume(mixer_t *mixer) { float mixer_l, mixer_r; - mixer_getvolume( &mixer_l,&mixer_r ); - mixer_l -= MIXER_CHANGE; + mixer_getvolume(mixer, &mixer_l, &mixer_r); + mixer_l -= mixer->volstep; if ( mixer_l < 0 ) mixer_l = 0; - mixer_r -= MIXER_CHANGE; + mixer_r -= mixer->volstep; if ( mixer_r < 0 ) mixer_r = 0; - mixer_setvolume( mixer_l,mixer_r ); + mixer_setvolume(mixer, mixer_l, mixer_r); } -float mixer_getbothvolume( void ) +void mixer_getbothvolume(mixer_t *mixer, float *b) { float mixer_l, mixer_r; - mixer_getvolume( &mixer_l,&mixer_r ); - return ( mixer_l + mixer_r ) / 2; + mixer_getvolume(mixer, &mixer_l, &mixer_r); + *b = ( mixer_l + mixer_r ) / 2; } -void mixer_mute( void ) +void mixer_mute(mixer_t *mixer) { - if ( muted ) mixer_setvolume( mute_l,mute_r ); + if (mixer->muted) mixer_setvolume(mixer, mixer->last_l, mixer->last_r); else { - mixer_getvolume( &mute_l,&mute_r ); - mixer_setvolume( 0,0 ); - muted=1; + mixer_getvolume(mixer, &mixer->last_l, &mixer->last_r); + mixer_setvolume(mixer, 0, 0); + mixer->muted=1; } } - - - -- cgit v1.2.3