changeset 8272:b1c5460a8105

Implement volume setting functionality, original patch by Nguyen Kim <nguyenk@ie2.u-psud.fr>. Note that volume changing never worked on my system with NAS, but that seems to be a nasd problem which I did not try to track down yet...
author ranma
date Sun, 24 Nov 2002 23:13:15 +0000
parents 64786fe1a8a6
children 226e6866212d
files libao2/ao_nas.c
diffstat 1 files changed, 47 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/libao2/ao_nas.c	Sun Nov 24 22:26:43 2002 +0000
+++ b/libao2/ao_nas.c	Sun Nov 24 23:13:15 2002 +0000
@@ -333,8 +333,53 @@
 }
 
 // to set/get/query special features/parameters
-static int control(int cmd,int arg){
-	return -1;
+static int control(int cmd, int arg)
+{
+	AuDeviceAttributes *dattr;
+	AuFixedPoint fpgain;
+	AuStatus as;
+	int gain;
+	ao_control_vol_t *vol = (ao_control_vol_t *)arg;
+
+	dattr = AuGetDeviceAttributes(nas_data->aud, nas_data->dev, &as);
+	if (as != AuSuccess) {
+		nas_print_error(nas_data->aud,
+		                "control(): AuGetDeviceAttributes", as);
+		return CONTROL_ERROR;
+	}
+	gain = AuFixedPointRoundDown(AuDeviceGain(dattr));
+	// kn: 0 <= gain <= 100
+
+	switch (cmd) {
+	case AOCONTROL_GET_VOLUME:
+
+		vol->right = (float) gain;
+		vol->left = vol->right;
+
+		return CONTROL_OK;
+
+	case AOCONTROL_SET_VOLUME:
+		/*
+		 * kn: we should have vol->left == vol->right but i don't
+		 * know if something can change it outside of ao_nas
+		 * so i take the mean of both values.
+		 */
+		gain = (int) ((vol->left+vol->right)/2);
+
+		fpgain = AuFixedPointFromSum(gain, 0);
+		AuDeviceGain(dattr) = fpgain;
+		AuSetDeviceAttributes(nas_data->aud, nas_data->dev,
+		                      AuCompDeviceGainMask, dattr, &as);
+		if (as != AuSuccess) {
+			nas_print_error(nas_data->aud,
+			                "control(): AuSetDeviceAttributes", as);
+			return CONTROL_ERROR;
+		}
+		return CONTROL_OK;
+
+	default:
+		return CONTROL_UNKNOWN;
+	};
 }
 
 // open & setup audio device