diff --git a/mixer.c b/mixer.c new file mode 100644 index 0000000000..7b3206e0e5 --- /dev/null +++ b/mixer.c @@ -0,0 +1,91 @@ + +#include +#include +#include +#include +#include + +#include "mixer.h" + +#define DEV_MIXER "/dev/mixer" + +char * mixer_device=NULL; +char * devname=NULL; +int mixer_usemaster=0; + +void mixer_getvolume( int *l,int *r ) +{ + int fd,v,cmd,devs; + + if ( !mixer_device ) devname=strdup( DEV_MIXER ); + else devname=strdup( mixer_device ); + fd=open( devname,O_RDONLY ); + free( devname ); + if ( fd != -1 ) + { + ioctl( fd,SOUND_MIXER_READ_DEVMASK,&devs ); + if ( ( devs & SOUND_MASK_PCM ) && ( mixer_usemaster==0 ) ) cmd=SOUND_MIXER_READ_PCM; + else + if ( ( devs & SOUND_MASK_VOLUME ) && ( mixer_usemaster==1 ) ) cmd=SOUND_MIXER_READ_VOLUME; + else + { + close( fd ); + return; + } + ioctl( fd,cmd,&v ); + *r=( v & 0xFF00 ) >> 8; + *l=( v & 0x00FF ); + close( fd ); + } +} + +void mixer_setvolume( int l,int r ) +{ + int fd,v,cmd,devs; + + if ( !mixer_device ) devname=strdup( DEV_MIXER ); + else devname=strdup( mixer_device ); + fd=open( devname,O_RDONLY ); + free( devname ); + if ( fd != -1 ) + { + ioctl( fd,SOUND_MIXER_READ_DEVMASK,&devs ); + if ( ( devs & SOUND_MASK_PCM ) && ( mixer_usemaster==0 ) ) cmd=SOUND_MIXER_WRITE_PCM; + else + if ( ( devs & SOUND_MASK_VOLUME ) && ( mixer_usemaster==1 ) ) cmd=SOUND_MIXER_WRITE_VOLUME; + else + { + close( fd ); + return; + } + v=( r << 8 ) | l; + ioctl( fd,cmd,&v ); + close( fd ); + } +} + +int mixer_l=0; int mixer_r=0; + +void mixer_incvolume( void ) +{ + fprintf( stderr,"[mixer] inc.\n" ); + mixer_getvolume( &mixer_l,&mixer_r ); + if ( mixer_l < 100 ) mixer_l++; + if ( mixer_r < 100 ) mixer_r++; + mixer_setvolume( mixer_l,mixer_r ); +} + +void mixer_decvolume( void ) +{ + fprintf( stderr,"[mixer] dec.\n" ); + mixer_getvolume( &mixer_l,&mixer_r ); + if ( mixer_l > 0 ) mixer_l--; + if ( mixer_r > 0 ) mixer_r--; + mixer_setvolume( mixer_l,mixer_r ); +} + +int mixer_getbothvolume( void ) +{ + mixer_getvolume( &mixer_l,&mixer_r ); + return ( mixer_l + mixer_r ) / 2; +} diff --git a/mixer.h b/mixer.h new file mode 100644 index 0000000000..a541657dc8 --- /dev/null +++ b/mixer.h @@ -0,0 +1,19 @@ + +#ifndef __MPLAYER_MIXER +#define __MPLAYER_MIXER + +#define DEV_MIXER "/dev/mixer" + +extern int mixer_usemaster; +extern char * mixer_device; + +extern void mixer_getvolume( int *l,int *r ); +extern void mixer_setvolume( int l,int r ); +extern void mixer_incvolume( void ); +extern void mixer_decvolume( void ); +extern int mixer_getbothvolume( void ); + +//extern void mixer_setbothvolume( int v ); +#define mixer_setbothvolume( v ) mixer_setvolume( v,v ) + +#endif \ No newline at end of file