* [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