summaryrefslogtreecommitdiffstats
path: root/mixer.c
diff options
context:
space:
mode:
Diffstat (limited to 'mixer.c')
-rw-r--r--mixer.c96
1 files changed, 64 insertions, 32 deletions
diff --git a/mixer.c b/mixer.c
index 2340179ec0..150c3cc2d4 100644
--- a/mixer.c
+++ b/mixer.c
@@ -1,36 +1,34 @@
#include <string.h>
#include <sys/ioctl.h>
-#ifdef __sun
-#include <sys/audioio.h>
-#else
-#include <sys/soundcard.h>
-#endif
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
-#include "mixer.h"
+#include "config.h"
-#ifdef __sun
-char * mixer_device="/dev/audioctl";
-#else
-char * mixer_device="/dev/mixer";
+#ifdef USE_OSS_AUDIO
+#include <sys/soundcard.h>
#endif
+
+#ifdef USE_SUN_AUDIO
+#include <sys/audioio.h>
+#endif
+
+#include "mixer.h"
+
+#if defined(USE_OSS_AUDIO)
+
+char * mixer_device=DEV_MIXER;
int mixer_usemaster=0;
-void mixer_getvolume( int *l,int *r )
+void mixer_getvolume( float *l,float *r )
{
int fd,v,cmd,devs;
fd=open( mixer_device,O_RDONLY );
if ( fd != -1 )
{
-#ifdef __sun
- audio_info_t info;
- ioctl( fd,AUDIO_GETINFO,&info );
- *r=*l=(info.play.gain * 100 + (AUDIO_MAX_GAIN-1))/AUDIO_MAX_GAIN;
-#else
ioctl( fd,SOUND_MIXER_READ_DEVMASK,&devs );
if ( ( devs & SOUND_MASK_PCM ) && ( mixer_usemaster==0 ) ) cmd=SOUND_MIXER_READ_PCM;
else
@@ -43,24 +41,17 @@ void mixer_getvolume( int *l,int *r )
ioctl( fd,cmd,&v );
*r=( v & 0xFF00 ) >> 8;
*l=( v & 0x00FF );
-#endif
close( fd );
}
}
-void mixer_setvolume( int l,int r )
+void mixer_setvolume( float l,float r )
{
int fd,v,cmd,devs;
fd=open( mixer_device,O_RDONLY );
if ( fd != -1 )
{
-#ifdef __sun
- audio_info_t info;
- ioctl( fd,AUDIO_GETINFO,&info );
- info.play.gain = ((l+r)*AUDIO_MAX_GAIN+199)/200;
- ioctl( fd,AUDIO_SETINFO,&info );
-#else
ioctl( fd,SOUND_MIXER_READ_DEVMASK,&devs );
if ( ( devs & SOUND_MASK_PCM ) && ( mixer_usemaster==0 ) ) cmd=SOUND_MIXER_WRITE_PCM;
else
@@ -70,33 +61,74 @@ void mixer_setvolume( int l,int r )
close( fd );
return;
}
- v=( r << 8 ) | l;
+ v=( (int)r << 8 ) | (int)l;
ioctl( fd,cmd,&v );
-#endif
close( fd );
}
}
+#elif defined(USE_SUN_AUDIO)
+
+char * mixer_device="/dev/audioctl";
+int mixer_usemaster=0;
+
+void mixer_getvolume( float *l,float *r )
+{
+ int fd,v,cmd,devs;
+
+ fd=open( mixer_device,O_RDONLY );
+ if ( fd != -1 )
+ {
+ struct audio_info info;
+
+ ioctl( fd,AUDIO_GETINFO,&info);
+ *r=info.play.gain * 100. / AUDIO_MAX_GAIN;
+ *l=info.play.gain * 100. / AUDIO_MAX_GAIN;
+ close( fd );
+ }
+}
+
+void mixer_setvolume( float l,float r )
+{
+ int fd,v,cmd,devs;
+
+ fd=open( mixer_device,O_RDONLY );
+ if ( fd != -1 )
+ {
+ struct audio_info info;
+ AUDIO_INITINFO(&info);
+ info.play.gain = (r+l) * AUDIO_MAX_GAIN / 100 / 2;
+ ioctl( fd,AUDIO_SETINFO,&info );
+ close( fd );
+ }
+}
+#endif
-int mixer_l=0; int mixer_r=0;
void mixer_incvolume( void )
{
+ float mixer_l, mixer_r;
mixer_getvolume( &mixer_l,&mixer_r );
- if ( mixer_l < 100 ) mixer_l++;
- if ( mixer_r < 100 ) mixer_r++;
+ mixer_l++;
+ if ( mixer_l > 100 ) mixer_l = 100;
+ mixer_r++;
+ if ( mixer_r > 100 ) mixer_r = 100;
mixer_setvolume( mixer_l,mixer_r );
}
void mixer_decvolume( void )
{
+ float mixer_l, mixer_r;
mixer_getvolume( &mixer_l,&mixer_r );
- if ( mixer_l > 0 ) mixer_l--;
- if ( mixer_r > 0 ) mixer_r--;
+ mixer_l--;
+ if ( mixer_l < 0 ) mixer_l = 0;
+ mixer_r--;
+ if ( mixer_r < 0 ) mixer_r = 0;
mixer_setvolume( mixer_l,mixer_r );
}
-int mixer_getbothvolume( void )
+float mixer_getbothvolume( void )
{
+ float mixer_l, mixer_r;
mixer_getvolume( &mixer_l,&mixer_r );
return ( mixer_l + mixer_r ) / 2;
}