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 <schwab@issan.informatik.uni-dortmund.de>
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;
