Skip to contentSkip to conversation

Harmony - better mixer channel names

PATCH New Stuart Brady 2 participants 4 messages May 27, 2004 – Jun 8, 2004 2 messages not in the archive Sound

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): 20040527150933.GB612@calypso

A message that is not in the archive (sent off-list or not yet received): [email protected]

#2 lore raw

PATCH 1/1 Harmony - better mixer channel names

Hi,

This patch improves the Harmony driver's naming of mixer channels:

* VOLUME is now MONITOR
* OGAIN is now VOLUME
* SPEAKER is now LINE1
* For output, LINE is now LINE2
* PHONEOUT is now LINE3
* The LINE channel is now for input only
* Within the source, the names INTERNAL, LINEOUT and HEADPHONES refer to LINE1, LINE2 and LINE3, respectively
* MIC and IGAIN remain unchanged

Regards,

Signature · 1 line
Stuart Brady
sound/harmony.c renamed from sound/harmony.c.orig +39 -31
@@ -124,9 +124,17 @@
 #define GAIN_RO_MASK    ( 0x3f << GAIN_RO_SHIFT) 
 
 
-#define MAX_OUTPUT_LEVEL (GAIN_RO_MASK >> GAIN_RO_SHIFT)
-#define MAX_INPUT_LEVEL  (GAIN_RI_MASK >> GAIN_RI_SHIFT)
-#define MAX_VOLUME_LEVEL (GAIN_MA_MASK >> GAIN_MA_SHIFT)
+#define MAX_OUTPUT_LEVEL  (GAIN_RO_MASK >> GAIN_RO_SHIFT)
+#define MAX_INPUT_LEVEL   (GAIN_RI_MASK >> GAIN_RI_SHIFT)
+#define MAX_MONITOR_LEVEL (GAIN_MA_MASK >> GAIN_MA_SHIFT)
+
+#define MIXER_INTERNAL   SOUND_MIXER_LINE1
+#define MIXER_LINEOUT    SOUND_MIXER_LINE2
+#define MIXER_HEADPHONES SOUND_MIXER_LINE3
+
+#define MASK_INTERNAL   SOUND_MASK_LINE1
+#define MASK_LINEOUT    SOUND_MASK_LINE2
+#define MASK_HEADPHONES SOUND_MASK_LINE3
 
 /*
  * Channels Mask in mixer register
@@ -882,7 +890,7 @@
 	int right_level;
 
 	switch (channel) {
-		case SOUND_MIXER_OGAIN:
+		case SOUND_MIXER_VOLUME:
 			left_level  = (harmony.current_gain & GAIN_LO_MASK) >> GAIN_LO_SHIFT;
 			right_level = (harmony.current_gain & GAIN_RO_MASK) >> GAIN_RO_SHIFT;
 			left_level  = to_oss_level(MAX_OUTPUT_LEVEL - left_level, MAX_OUTPUT_LEVEL);
@@ -896,9 +904,9 @@
 			right_level= to_oss_level(right_level, MAX_INPUT_LEVEL);
 			return (right_level << 8)+left_level;
 			
-		case SOUND_MIXER_VOLUME:
+		case SOUND_MIXER_MONITOR:
 			left_level = (harmony.current_gain & GAIN_MA_MASK) >> GAIN_MA_SHIFT;
-			left_level = to_oss_level(MAX_VOLUME_LEVEL-left_level, MAX_VOLUME_LEVEL);
+			left_level = to_oss_level(MAX_MONITOR_LEVEL-left_level, MAX_MONITOR_LEVEL);
 			return left_level;
 	}
 	return -EINVAL;
@@ -923,7 +931,7 @@
 	left_level = value & 0x000000ff;
   
 	switch (channel) {
-		case SOUND_MIXER_OGAIN:
+		case SOUND_MIXER_VOLUME:
 			right_level = to_harmony_level(100-right_level, MAX_OUTPUT_LEVEL);
 			left_level  = to_harmony_level(100-left_level, MAX_OUTPUT_LEVEL);
 			new_right_level = to_oss_level(MAX_OUTPUT_LEVEL - right_level, MAX_OUTPUT_LEVEL);
@@ -943,10 +951,10 @@
 			harmony_mixer_set_gain();
 			return (new_right_level << 8) + new_left_level;
 	
-		case SOUND_MIXER_VOLUME:
-			left_level = to_harmony_level(100-left_level, MAX_VOLUME_LEVEL);
-			new_left_level = to_oss_level(MAX_VOLUME_LEVEL-left_level, MAX_VOLUME_LEVEL);
-			harmony.current_gain = (harmony.current_gain & ~GAIN_MA_MASK)| (left_level << GAIN_MA_SHIFT);
+		case SOUND_MIXER_MONITOR:
+			left_level = to_harmony_level(100-left_level, MAX_MONITOR_LEVEL);
+			new_left_level = to_oss_level(MAX_MONITOR_LEVEL-left_level, MAX_MONITOR_LEVEL);
+			harmony.current_gain = (harmony.current_gain & ~GAIN_MA_MASK) | (left_level << GAIN_MA_SHIFT);
 			harmony_mixer_set_gain();
 			return new_left_level;
 	}
@@ -1004,9 +1012,9 @@
 {
 	int outmask = 0;
 	
-	if (harmony.current_gain & GAIN_HE_MASK) outmask |=SOUND_MASK_PHONEOUT;
-	if (harmony.current_gain & GAIN_LE_MASK) outmask |=SOUND_MASK_LINE;
-	if (harmony.current_gain & GAIN_SE_MASK) outmask |=SOUND_MASK_SPEAKER;
+	if (harmony.current_gain & GAIN_SE_MASK) outmask |= MASK_INTERNAL;
+	if (harmony.current_gain & GAIN_LE_MASK) outmask |= MASK_LINEOUT;
+	if (harmony.current_gain & GAIN_HE_MASK) outmask |= MASK_HEADPHONES;
 	
 	return outmask;
 }
@@ -1014,24 +1022,24 @@
 
 static int harmony_mixer_set_outmask(int outmask)
 {
-	if (outmask & SOUND_MASK_PHONEOUT) 
-		harmony.current_gain |= GAIN_HE_MASK; 
+	if (outmask & MASK_INTERNAL) 
+		harmony.current_gain |= GAIN_SE_MASK;
 	else 
-		harmony.current_gain &= ~GAIN_HE_MASK;
+		harmony.current_gain &= ~GAIN_SE_MASK;
 	
-	if (outmask & SOUND_MASK_LINE) 
+	if (outmask & MASK_LINEOUT) 
 		harmony.current_gain |= GAIN_LE_MASK;
 	else 
 		harmony.current_gain &= ~GAIN_LE_MASK;
 	
-	if (outmask & SOUND_MASK_SPEAKER) 
-		harmony.current_gain |= GAIN_SE_MASK;
+	if (outmask & MASK_HEADPHONES) 
+		harmony.current_gain |= GAIN_HE_MASK; 
 	else 
-		harmony.current_gain &= ~GAIN_SE_MASK;
+		harmony.current_gain &= ~GAIN_HE_MASK;
 	
 	harmony_mixer_set_gain();
 
-	return (outmask & (SOUND_MASK_PHONEOUT | SOUND_MASK_LINE | SOUND_MASK_SPEAKER));
+	return (outmask & (MASK_INTERNAL | MASK_LINEOUT | MASK_HEADPHONES));
 }
 
 /*
@@ -1069,19 +1077,19 @@
 		ret = SOUND_CAP_EXCL_INPUT;
 		break;
 	case MIXER_READ(SOUND_MIXER_STEREODEVS):
-		ret = SOUND_MASK_IGAIN | SOUND_MASK_OGAIN;
+		ret = SOUND_MASK_VOLUME | SOUND_MASK_IGAIN;
 		break;
 		
 	case MIXER_READ(SOUND_MIXER_RECMASK):
 		ret = SOUND_MASK_MIC | SOUND_MASK_LINE;
 		break;
 	case MIXER_READ(SOUND_MIXER_DEVMASK):
-		ret = SOUND_MASK_OGAIN | SOUND_MASK_IGAIN |
-			SOUND_MASK_VOLUME;
+		ret = SOUND_MASK_VOLUME | SOUND_MASK_IGAIN |
+			SOUND_MASK_MONITOR;
 		break;
 	case MIXER_READ(SOUND_MIXER_OUTMASK):
-		ret = SOUND_MASK_SPEAKER | SOUND_MASK_LINE |
-			SOUND_MASK_PHONEOUT;
+		ret = MASK_INTERNAL | MASK_LINEOUT |
+			MASK_HEADPHONES;
 		break;
 		
 	case MIXER_WRITE(SOUND_MIXER_RECSRC):
@@ -1098,15 +1106,15 @@
 		ret = harmony_mixer_get_outmask();
 		break;
 	
-	case MIXER_WRITE(SOUND_MIXER_OGAIN):
-	case MIXER_WRITE(SOUND_MIXER_IGAIN):
 	case MIXER_WRITE(SOUND_MIXER_VOLUME):
+	case MIXER_WRITE(SOUND_MIXER_IGAIN):
+	case MIXER_WRITE(SOUND_MIXER_MONITOR):
 		ret = harmony_mixer_set_level(cmd & 0xff, val);
 		break;
 
-	case MIXER_READ(SOUND_MIXER_OGAIN):
-	case MIXER_READ(SOUND_MIXER_IGAIN):
 	case MIXER_READ(SOUND_MIXER_VOLUME):
+	case MIXER_READ(SOUND_MIXER_IGAIN):
+	case MIXER_READ(SOUND_MIXER_MONITOR):
 		ret = harmony_mixer_get_level(cmd & 0xff);
 		break;
 

_______________________________________________
parisc-linux mailing list
[email protected]
http://lists.parisc-linux.org/mailman/listinfo/parisc-linux

#3 lore raw

PATCH 1/1 Harmony - improved recording source toggling

In reply to a message not in the archive

This patch improves toggling of the recording source between the MIC and LINE channels. It does not depend on the channel names patch.

Cheers,

Signature · 1 line
Stuart Brady
sound/harmony.c renamed from sound/harmony.c.orig +0 -0
@@ -981,11 +981,15 @@
 {
 	int new_input_line;
 	int new_input_mask;
#4 lore raw

PATCH 1/1 Harmony fixes

In reply to a message not in the archive

Hi,

Here's the next set of fixes. I should point out an annoyance with the harmony-s16le patch though: apps that use AFMT_S16_NE are broken by this patch, because the kernel headers incorrectly define AFMT_S16_NE as AFMT_S16_LE, when it should be AFMT_S16_BE.

harmony-levellimit.patch:
Volume levels passed to the MIXER_WRITE ioctls are now limited to 100, which prevents bogus levels from interferring with other mixer channels.

harmony-stereolevels.patch:
The MIXER_READ ioctls now return a right_level for the monophonic mixer channels that is the same as the left_level.

harmony-s16le.patch:
The AFMT_S16_LE format is now rejected, just as all other unsupported formats are rejected. As a result, applications which write big-endian samples with AFMT_S16_LE format set will no longer work.

Thanks,

Signature · 1 line
Stuart Brady
sound/harmony.c renamed from sound/harmony.c.orig +2 -0
@@ -940,6 +940,8 @@
 
 	right_level = (value & 0x0000ff00) >> 8;
 	left_level = value & 0x000000ff;
+	if (right_level > 100) right_level = 100;
+	if (left_level > 100) left_level = 100;
   
 	switch (channel) {
 		case SOUND_MIXER_VOLUME:
sound/harmony.c renamed from sound/harmony.c.orig +2 -2
@@ -918,7 +918,7 @@
 		case SOUND_MIXER_MONITOR:
 			left_level = (harmony.current_gain & GAIN_MA_MASK) >> GAIN_MA_SHIFT;
 			left_level = to_oss_level(MAX_MONITOR_LEVEL-left_level, MAX_MONITOR_LEVEL);
-			return left_level;
+			return (left_level << 8)+left_level;
 	}
 	return -EINVAL;
 }
@@ -967,7 +967,7 @@
 			new_left_level = to_oss_level(MAX_MONITOR_LEVEL-left_level, MAX_MONITOR_LEVEL);
 			harmony.current_gain = (harmony.current_gain & ~GAIN_MA_MASK) | (left_level << GAIN_MA_SHIFT);
 			harmony_mixer_set_gain();
-			return new_left_level;
+			return (new_left_level << 8) + new_left_level;
 	}
 
 	return -EINVAL;
sound/harmony.c renamed from sound/harmony.c.orig +5 -6
@@ -655,18 +655,17 @@
 			switch (ival) {
 			case AFMT_MU_LAW:	new_format = HARMONY_DF_8BIT_ULAW; break;
 			case AFMT_A_LAW:	new_format = HARMONY_DF_8BIT_ALAW; break;
-			case AFMT_S16_LE:	/* fall through, but not really supported */
-			case AFMT_S16_BE:	new_format = HARMONY_DF_16BIT_LINEAR;
-						ival = AFMT_S16_BE;
-						break; 
+			case AFMT_S16_BE:	new_format = HARMONY_DF_16BIT_LINEAR; break;
 			default: {
 				DPRINTK(KERN_WARNING PFX 
 					"unsupported sound format 0x%04x requested.\n",
 					ival);
-				return -EINVAL;
+				ival = AFMT_S16_BE;
+				return put_user(ival, (int *) arg);
 			}
 			}
 			harmony_set_format(new_format);
+			return 0;
 		} else {
 			switch (harmony.data_format) {
 			case HARMONY_DF_8BIT_ULAW:	ival = AFMT_MU_LAW; break;
@@ -674,8 +673,8 @@
 			case HARMONY_DF_16BIT_LINEAR:	ival = AFMT_U16_BE; break;
 			default: ival = 0;
 			}
+			return put_user(ival, (int *) arg);
 		}
-		return put_user(ival, (int *) arg);
 
 	case SOUND_PCM_READ_RATE:
 		ival = harmony.dac_rate;

_______________________________________________
parisc-linux mailing list
[email protected]
http://lists.parisc-linux.org/mailman/listinfo/parisc-linux

#5 lore raw

[parisc-linux] Re: [PATCH] Harmony fixes

tested and committed, enjoy.

Le samedi, 5 juin 2004, =E0 20:45 Europe/Paris, Stuart Brady a =E9crit :

Quoted 7 lines

harmony-levellimit.patch:
Volume levels passed to the MIXER_WRITE ioctls are now limited to 100, which prevents bogus levels from interferring with other mixer=20 channels.

harmony-stereolevels.patch:
The MIXER_READ ioctls now return a right_level for the monophonic =

mixer

Quoted 5 lines

channels that is the same as the left_level.

harmony-s16le.patch:
The AFMT_S16_LE format is now rejected, just as all other unsupported formats are rejected. As a result, applications which write =

big-endian

Quoted 1 line

samples with AFMT_S16_LE format set will no longer work.=

_______________________________________________
parisc-linux mailing list
[email protected]
http://lists.parisc-linux.org/mailman/listinfo/parisc-linux