summaryrefslogtreecommitdiffstats
path: root/mixer.c
diff options
context:
space:
mode:
authoralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2004-06-26 09:14:20 +0000
committeralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2004-06-26 09:14:20 +0000
commitba3c4568fb1ac38da3cc3b098434ac399ba7bb7d (patch)
tree8ca93e3eeb12a81ebcfdff37b48cc2c24a026e32 /mixer.c
parenta26c2b997eef1fc20be08dc3a48784a2214f9a20 (diff)
downloadmpv-ba3c4568fb1ac38da3cc3b098434ac399ba7bb7d.tar.bz2
mpv-ba3c4568fb1ac38da3cc3b098434ac399ba7bb7d.tar.xz
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
Diffstat (limited to 'mixer.c')
-rw-r--r--mixer.c100
1 files changed, 61 insertions, 39 deletions
diff --git a/mixer.c b/mixer.c
index 1c187c82ca..6a3c54586c 100644
--- a/mixer.c
+++ b/mixer.c
@@ -1,4 +1,3 @@
-
#include <string.h>
#ifndef __MINGW32__
#include <sys/ioctl.h>
@@ -8,82 +7,105 @@
#include <unistd.h>
#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;
}
}
-
-
-