Linux PARISC architecture development
 help / color / mirror / Atom feed
* [parisc-linux] [PATCH] Harmony - better mixer channel names
       [not found] ` <20040527151731.633A93658BE@mail.esiee.fr>
@ 2004-05-27 20:02   ` Stuart Brady
  2004-05-27 22:02   ` [parisc-linux] [PATCH] Harmony - improved recording source toggling Stuart Brady
  2004-06-05 18:45   ` [parisc-linux] [PATCH] Harmony fixes Stuart Brady
  2 siblings, 0 replies; 4+ messages in thread
From: Stuart Brady @ 2004-05-27 20:02 UTC (permalink / raw)
  To: Thibaut VARENE; +Cc: parisc-linux

[-- Attachment #1: Type: text/plain, Size: 411 bytes --]

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,
-- 
Stuart Brady

[-- Attachment #2: harmony-mixer-channelnames.diff --]
[-- Type: text/plain, Size: 5500 bytes --]

--- drivers/sound/harmony.c.orig	2004-05-25 23:21:52.000000000 +0100
+++ drivers/sound/harmony.c	2004-05-27 18:20:31.000000000 +0100
@@ -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;
 

[-- Attachment #3: Type: text/plain, Size: 169 bytes --]

_______________________________________________
parisc-linux mailing list
parisc-linux@lists.parisc-linux.org
http://lists.parisc-linux.org/mailman/listinfo/parisc-linux

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [parisc-linux] [PATCH] Harmony - improved recording source toggling
       [not found] ` <20040527151731.633A93658BE@mail.esiee.fr>
  2004-05-27 20:02   ` [parisc-linux] [PATCH] Harmony - better mixer channel names Stuart Brady
@ 2004-05-27 22:02   ` Stuart Brady
  2004-06-05 18:45   ` [parisc-linux] [PATCH] Harmony fixes Stuart Brady
  2 siblings, 0 replies; 4+ messages in thread
From: Stuart Brady @ 2004-05-27 22:02 UTC (permalink / raw)
  To: Thibaut VARENE; +Cc: parisc-linux

[-- Attachment #1: Type: text/plain, Size: 162 bytes --]

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

Cheers,
-- 
Stuart Brady

[-- Attachment #2: harmony-mixer-recmask.diff --]
[-- Type: text/plain, Size: 201 bytes --]

--- drivers/sound/harmony.c.orig	2004-05-25 23:21:52.000000000 +0100
+++ drivers/sound/harmony.c	2004-05-27 21:44:18.000000000 +0100
@@ -981,11 +981,15 @@
 {
 	int new_input_line;
 	int new_input_mask;

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [parisc-linux] [PATCH] Harmony fixes
       [not found] ` <20040527151731.633A93658BE@mail.esiee.fr>
  2004-05-27 20:02   ` [parisc-linux] [PATCH] Harmony - better mixer channel names Stuart Brady
  2004-05-27 22:02   ` [parisc-linux] [PATCH] Harmony - improved recording source toggling Stuart Brady
@ 2004-06-05 18:45   ` Stuart Brady
  2004-06-08 18:21     ` [parisc-linux] " Thibaut VARENE
  2 siblings, 1 reply; 4+ messages in thread
From: Stuart Brady @ 2004-06-05 18:45 UTC (permalink / raw)
  To: Thibaut VARENE; +Cc: parisc-linux

[-- Attachment #1: Type: text/plain, Size: 826 bytes --]

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,
-- 
Stuart Brady

[-- Attachment #2: harmony-levellimit.patch --]
[-- Type: text/plain, Size: 372 bytes --]

--- drivers/sound/harmony.c.orig	2004-06-04 15:02:51.000000000 +0100
+++ drivers/sound/harmony.c	2004-06-05 15:27:03.000000000 +0100
@@ -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:

[-- Attachment #3: harmony-stereolevels.patch --]
[-- Type: text/plain, Size: 759 bytes --]

--- drivers/sound/harmony.c.orig	2004-06-04 15:02:51.000000000 +0100
+++ drivers/sound/harmony.c	2004-06-05 15:28:17.000000000 +0100
@@ -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;

[-- Attachment #4: harmony-s16le.patch --]
[-- Type: text/plain, Size: 1157 bytes --]

--- drivers/sound/harmony.c.orig	2004-06-04 15:02:51.000000000 +0100
+++ drivers/sound/harmony.c	2004-06-05 15:24:31.000000000 +0100
@@ -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;

[-- Attachment #5: Type: text/plain, Size: 169 bytes --]

_______________________________________________
parisc-linux mailing list
parisc-linux@lists.parisc-linux.org
http://lists.parisc-linux.org/mailman/listinfo/parisc-linux

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [parisc-linux] Re: [PATCH] Harmony fixes
  2004-06-05 18:45   ` [parisc-linux] [PATCH] Harmony fixes Stuart Brady
@ 2004-06-08 18:21     ` Thibaut VARENE
  0 siblings, 0 replies; 4+ messages in thread
From: Thibaut VARENE @ 2004-06-08 18:21 UTC (permalink / raw)
  To: Stuart Brady; +Cc: parisc-linux

tested and committed, enjoy.

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

> 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
> 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.=

_______________________________________________
parisc-linux mailing list
parisc-linux@lists.parisc-linux.org
http://lists.parisc-linux.org/mailman/listinfo/parisc-linux

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2004-06-08 18:21 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20040527150933.GB612@calypso>
     [not found] ` <20040527151731.633A93658BE@mail.esiee.fr>
2004-05-27 20:02   ` [parisc-linux] [PATCH] Harmony - better mixer channel names Stuart Brady
2004-05-27 22:02   ` [parisc-linux] [PATCH] Harmony - improved recording source toggling Stuart Brady
2004-06-05 18:45   ` [parisc-linux] [PATCH] Harmony fixes Stuart Brady
2004-06-08 18:21     ` [parisc-linux] " Thibaut VARENE

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox