Harmony - better mixer channel names
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]
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
PATCH 1/1 Harmony - improved recording source toggling
In reply to a message not in the archiveThis 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;
PATCH 1/1 Harmony fixes
In reply to a message not in the archiveHi,
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
[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 theMIXER_WRITEioctls are now limited to 100, which prevents bogus levels from interferring with other mixer=20 channels.harmony-stereolevels.patch:
TheMIXER_READioctls now return aright_levelfor the monophonic =
mixer
Quoted 5 lines
channels that is the same as the
left_level.harmony-s16le.patch:
TheAFMT_S16_LEformat 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_LEformat set will no longer work.=
_______________________________________________
parisc-linux mailing list
[email protected]
http://lists.parisc-linux.org/mailman/listinfo/parisc-linux