To: linux-m68k@lists.linux-m68k.org Subject: L68K: Volume control for TT sound X-Yow: Yow! It's a hole all the way to downtown Burbank! From: Andreas Schwab Date: 06 Feb 1998 10:54:19 +0100 Sender: owner-linux-m68k@phil.uni-sb.de This patch makes it possible to read/change the volume of the TT sound from within Linux, which has always been missing. It uses the SOUND_MIXER_READ_OGAIN and SOUND_MIXER_WRITE_OGAIN ioctls. Andreas. --- drivers/sound/dmasound.c.~1~ Fri Jan 9 18:13:39 1998 +++ drivers/sound/dmasound.c Thu Dec 18 08:51:34 1997 @@ -474,6 +474,7 @@ int (*setVolume)(int); int (*setBass)(int); int (*setTreble)(int); + int (*setGain)(int); void (*play)(void); } MACHINE; @@ -509,6 +510,7 @@ int volume_right; int bass; /* tone (range is machine dependent) */ int treble; + int gain; int minDev; /* minor device number currently open */ #ifdef CONFIG_ATARI int bal; /* balance factor for expanding (not volume!) */ @@ -532,6 +534,7 @@ static void TTInit(void); static int TTSetFormat(int format); static int TTSetVolume(int volume); +static int TTSetGain(int gain); static void FalconSilence(void); static void FalconInit(void); static int FalconSetFormat(int format); @@ -1746,6 +1749,18 @@ } +#define GAIN_VOXWARE_TO_DB(v) \ + (((v) < 0) ? -80 : ((v) > 100) ? 0 : ((v) * 4) / 5 - 80) +#define GAIN_DB_TO_VOXWARE(v) ((((v) + 80) * 5 + 1) / 4) + +static int TTSetGain(int gain) +{ + sound.gain = GAIN_VOXWARE_TO_DB(gain); + atari_microwire_cmd(MW_LM1992_VOLUME(sound.gain)); + return GAIN_DB_TO_VOXWARE(sound.gain); +} + + /* * Falcon @@ -2336,6 +2351,7 @@ AtaIrqCleanUp, #endif /* MODULE */ TTInit, TTSilence, TTSetFormat, TTSetVolume, AtaSetBass, AtaSetTreble, + TTSetGain, AtaPlay }; @@ -2345,7 +2361,7 @@ AtaIrqCleanUp, #endif /* MODULE */ FalconInit, FalconSilence, FalconSetFormat, FalconSetVolume, AtaSetBass, - AtaSetTreble, AtaPlay + AtaSetTreble, NULL, AtaPlay }; #endif /* CONFIG_ATARI */ @@ -2356,6 +2372,7 @@ AmiIrqCleanUp, #endif /* MODULE */ AmiInit, AmiSilence, AmiSetFormat, AmiSetVolume, NULL, AmiSetTreble, + NULL, AmiPlay }; #endif /* CONFIG_AMIGA */ @@ -2426,6 +2443,11 @@ { return(sound.mach.setBass ? (*sound.mach.setBass)(bass) : 50); } + +static int sound_set_gain(int gain) +{ + return sound.mach.setGain ? sound.mach.setGain(gain) : 100; +} #endif /* CONFIG_ATARI */ @@ -2612,6 +2634,8 @@ return(IOCTL_OUT(arg, TONE_DB_TO_VOXWARE(sound.bass))); case SOUND_MIXER_READ_TREBLE: return(IOCTL_OUT(arg, TONE_DB_TO_VOXWARE(sound.treble))); + case SOUND_MIXER_READ_OGAIN: + return(IOCTL_OUT(arg, GAIN_DB_TO_VOXWARE(sound.gain))); case SOUND_MIXER_READ_SPEAKER: { int porta; @@ -2633,6 +2657,9 @@ case SOUND_MIXER_WRITE_TREBLE: IOCTL_IN(arg, data); return(IOCTL_OUT(arg, sound_set_treble(data))); + case SOUND_MIXER_WRITE_OGAIN: + IOCTL_IN(arg, data); + return(IOCTL_OUT(arg, sound_set_gain(data))); case SOUND_MIXER_WRITE_SPEAKER: if (MACH_IS_TT) { int porta;