public inbox for alsa-devel@alsa-project.org
 help / color / mirror / Atom feed
* [es18xx.c PATCH] #2/4 for Zoom Video - resolve number of record sources
@ 2005-12-26 15:45 Mark Salazar
  2005-12-26 17:36 ` Mark Salazar
  0 siblings, 1 reply; 4+ messages in thread
From: Mark Salazar @ 2005-12-26 15:45 UTC (permalink / raw)
  To: alsa-devel

Second of 4 es18xx.c patches culminating in Zoom Video support.

This patch changes the 'record source' mux routines to reflect the fact 
that not all of the
supported chipsets have 8 possible inputs. Some have 4 and some have 5.

Testing:
This work was initially done on the source from the Debian Sarge ALSA 
package, then tested
on an ES1879 and an ES1878 machine. Patches were created against the 
Sarge code and then edited
to apply correctly to the ALSA cvs code. Lastly the patched ALSA cvs 
code was test for
successful compilation. No additional testing was done on the ALSA cvs 
version.

Applying:
cd alsa-driver/
cat ../../es18xx.CVSmod2.diff |  patch -p1

Signed-off-by: Mark Salazar <markTheCoder@justmyself.net>

------
diff -Nur ../alsa-driverMod1/alsa-kernel/isa/es18xx.c 
./alsa-kernel/isa/es18xx.c
--- ../alsa-driverMod1/alsa-kernel/isa/es18xx.c    2005-12-10 
13:59:30.000000000 -0500
+++ ./alsa-kernel/isa/es18xx.c    2005-12-10 13:59:42.000000000 -0500
@@ -929,37 +929,116 @@
  *  MIXER part
  */
 
+/* Record source mux routines:
+ * Depending on the chipset this mux switches between 4, 5, or 8 
possible inputs.
+ * bit table for the 4/5 source mux:
+ * reg 1C:
+ *  b2 b1 b0   muxSource
+ *   x  0  x   microphone
+ *   0  1  x   CD
+ *   1  1  0   line
+ *   1  1  1   mixer
+ * if it's "mixer" and it's a 5 source mux chipset then reg 7A bit 3 
determines
+ * either the play mixer or the capture mixer.
+ *
+ * "map4Source" translates from source number to reg bit pattern
+ * "invMap4Source" translates from reg bit pattern to source number
+ */
+
 static int snd_es18xx_info_mux(struct snd_kcontrol *kcontrol, struct 
snd_ctl_elem_info *uinfo)
 {
-    static char *texts[8] = {
+    static char *texts4Source[4] = {
+        "Mic", "CD", "Line", "Master"
+    };
+    static char *texts5Source[5] = {
+        "Mic", "CD", "Line", "Master", "Mix"
+    };
+    static char *texts8Source[8] = {
         "Mic", "Mic Master", "CD", "AOUT",
         "Mic1", "Mix", "Line", "Master"
     };
 
     uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
     uinfo->count = 1;
-    uinfo->value.enumerated.items = 8;
-    if (uinfo->value.enumerated.item > 7)
-        uinfo->value.enumerated.item = 7;
-    strcpy(uinfo->value.enumerated.name, 
texts[uinfo->value.enumerated.item]);
+    struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
+    switch (chip->version) {
+    case 0x1868:
+    case 0x1878:
+        uinfo->value.enumerated.items = 4;
+        if (uinfo->value.enumerated.item > 3)
+            uinfo->value.enumerated.item = 3;
+        strcpy(uinfo->value.enumerated.name, 
texts4Source[uinfo->value.enumerated.item]);
+        break;
+    case 0x1887:
+    case 0x1888:
+        uinfo->value.enumerated.items = 5;
+        if (uinfo->value.enumerated.item > 4)
+            uinfo->value.enumerated.item = 4;
+        strcpy(uinfo->value.enumerated.name, 
texts5Source[uinfo->value.enumerated.item]);
+        break;
+    case 0x1869: /* DS somewhat contradictory for 1869: could be be 5 
or 8 */
+    case 0x1879:
+        uinfo->value.enumerated.items = 8;
+        if (uinfo->value.enumerated.item > 7)
+            uinfo->value.enumerated.item = 7;
+        strcpy(uinfo->value.enumerated.name, 
texts8Source[uinfo->value.enumerated.item]);
+        break;
+    }
     return 0;
 }
 
 static int snd_es18xx_get_mux(struct snd_kcontrol *kcontrol, struct 
snd_ctl_elem_value *ucontrol)
 {
+    static unsigned char invMap4Source[8] = {0, 0, 1, 1, 0, 0, 2, 3};
     struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
-    ucontrol->value.enumerated.item[0] = snd_es18xx_mixer_read(chip, 
0x1c) & 0x07;
+    int muxSource = snd_es18xx_mixer_read(chip, 0x1c) & 0x07;
+    if (!(chip->version == 0x1869 || chip->version == 0x1879)) {
+        muxSource = invMap4Source[muxSource];
+        if (muxSource==3 &&
+            (chip->version == 0x1887 || chip->version == 0x1888) &&
+            (snd_es18xx_mixer_read(chip, 0x7a) & 0x08)
+        ) {
+            muxSource = 4;
+        }
+    }
+    ucontrol->value.enumerated.item[0] = muxSource;
     return 0;
 }
 
 static int snd_es18xx_put_mux(struct snd_kcontrol *kcontrol, struct 
snd_ctl_elem_value *ucontrol)
 {
+    static unsigned char map4Source[4] = {0, 2, 6, 7};
     struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
     unsigned char val = ucontrol->value.enumerated.item[0];
-    
-    if (val > 7)
-        return -EINVAL;
-    return snd_es18xx_mixer_bits(chip, 0x1c, 0x07, val) != val;
+    unsigned char retVal = 0;
+
+    switch (chip->version) {
+ /* 5 source chips */
+    case 0x1887:
+    case 0x1888:
+        if (val > 4)
+            return -EINVAL;
+        if (val == 4){
+            retVal = snd_es18xx_mixer_bits(chip, 0x7a, 0x08, 0x08) != 0x08;
+            val = 3;
+        }else{
+            retVal = snd_es18xx_mixer_bits(chip, 0x7a, 0x08, 0x00) != 0x00;
+        }
+ /* 4 source chips */
+    case 0x1868:
+    case 0x1878:
+        if (val > 3)
+            return -EINVAL;
+        val = map4Source[val];
+        break;
+ /* 8 source chips */
+    case 0x1869:
+    case 0x1879:
+        if (val > 7)
+            return -EINVAL;
+        break;
+    }
+    return (snd_es18xx_mixer_bits(chip, 0x1c, 0x07, val) != val) || retVal;
 }
 
 static int snd_es18xx_info_spatializer_enable(struct snd_kcontrol 
*kcontrol, struct snd_ctl_elem_info *uinfo)



-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click

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

* Re: [es18xx.c PATCH] #2/4 for Zoom Video - resolve number of record sources
  2005-12-26 15:45 [es18xx.c PATCH] #2/4 for Zoom Video - resolve number of record sources Mark Salazar
@ 2005-12-26 17:36 ` Mark Salazar
  2006-01-02 14:26   ` Takashi Iwai
  0 siblings, 1 reply; 4+ messages in thread
From: Mark Salazar @ 2005-12-26 17:36 UTC (permalink / raw)
  To: alsa-devel; +Cc: Mark Salazar

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

I surrender. Unable to make Thunderbird's wrapping function submit to 
my will I just attach my patch message and slink away.



[-- Attachment #2: es18xx.CVSmod2.diff.msg --]
[-- Type: text/plain, Size: 4935 bytes --]

Second of 4 es18xx.c patches culminating in Zoom Video support.

This patch changes the 'record source' mux routines to reflect the fact that not all of the
supported chipsets have 8 possible inputs. Some have 4 and some have 5.

Testing:
This work was initially done on the source from the Debian Sarge ALSA package, then tested
on an ES1879 and an ES1878 machine. Patches were created against the Sarge code and then edited
to apply correctly to the ALSA cvs code. Lastly the patched ALSA cvs code was test for
successful compilation. No additional testing was done on the ALSA cvs version.

Applying:
cd alsa-driver/
cat ../../es18xx.CVSmod2.diff |  patch -p1

Signed-off-by: Mark Salazar <markTheCoder@justmyself.net>

------
diff -Nur ../alsa-driverMod1/alsa-kernel/isa/es18xx.c ./alsa-kernel/isa/es18xx.c
--- ../alsa-driverMod1/alsa-kernel/isa/es18xx.c	2005-12-10 13:59:30.000000000 -0500
+++ ./alsa-kernel/isa/es18xx.c	2005-12-10 13:59:42.000000000 -0500
@@ -929,37 +929,116 @@
  *  MIXER part
  */
 
+/* Record source mux routines:
+ * Depending on the chipset this mux switches between 4, 5, or 8 possible inputs.
+ * bit table for the 4/5 source mux:
+ * reg 1C:
+ *  b2 b1 b0   muxSource
+ *   x  0  x   microphone
+ *   0  1  x   CD
+ *   1  1  0   line
+ *   1  1  1   mixer
+ * if it's "mixer" and it's a 5 source mux chipset then reg 7A bit 3 determines
+ * either the play mixer or the capture mixer.
+ *
+ * "map4Source" translates from source number to reg bit pattern
+ * "invMap4Source" translates from reg bit pattern to source number
+ */
+
 static int snd_es18xx_info_mux(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
 {
-	static char *texts[8] = {
+	static char *texts4Source[4] = {
+		"Mic", "CD", "Line", "Master"
+	};
+	static char *texts5Source[5] = {
+		"Mic", "CD", "Line", "Master", "Mix"
+	};
+	static char *texts8Source[8] = {
 		"Mic", "Mic Master", "CD", "AOUT",
 		"Mic1", "Mix", "Line", "Master"
 	};
 
 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
 	uinfo->count = 1;
-	uinfo->value.enumerated.items = 8;
-	if (uinfo->value.enumerated.item > 7)
-		uinfo->value.enumerated.item = 7;
-	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
+	struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
+	switch (chip->version) {
+	case 0x1868:
+	case 0x1878:
+		uinfo->value.enumerated.items = 4;
+		if (uinfo->value.enumerated.item > 3)
+			uinfo->value.enumerated.item = 3;
+		strcpy(uinfo->value.enumerated.name, texts4Source[uinfo->value.enumerated.item]);
+		break;
+	case 0x1887:
+	case 0x1888:
+		uinfo->value.enumerated.items = 5;
+		if (uinfo->value.enumerated.item > 4)
+			uinfo->value.enumerated.item = 4;
+		strcpy(uinfo->value.enumerated.name, texts5Source[uinfo->value.enumerated.item]);
+		break;
+	case 0x1869: /* DS somewhat contradictory for 1869: could be be 5 or 8 */
+	case 0x1879:
+		uinfo->value.enumerated.items = 8;
+		if (uinfo->value.enumerated.item > 7)
+			uinfo->value.enumerated.item = 7;
+		strcpy(uinfo->value.enumerated.name, texts8Source[uinfo->value.enumerated.item]);
+		break;
+	}
 	return 0;
 }
 
 static int snd_es18xx_get_mux(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 {
+	static unsigned char invMap4Source[8] = {0, 0, 1, 1, 0, 0, 2, 3};
 	struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
-	ucontrol->value.enumerated.item[0] = snd_es18xx_mixer_read(chip, 0x1c) & 0x07;
+	int muxSource = snd_es18xx_mixer_read(chip, 0x1c) & 0x07;
+	if (!(chip->version == 0x1869 || chip->version == 0x1879)) {
+		muxSource = invMap4Source[muxSource];
+		if (muxSource==3 && 
+		    (chip->version == 0x1887 || chip->version == 0x1888) &&
+		    (snd_es18xx_mixer_read(chip, 0x7a) & 0x08)
+		) {
+			muxSource = 4;
+		}
+	}
+	ucontrol->value.enumerated.item[0] = muxSource;
 	return 0;
 }
 
 static int snd_es18xx_put_mux(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 {
+	static unsigned char map4Source[4] = {0, 2, 6, 7};
 	struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
 	unsigned char val = ucontrol->value.enumerated.item[0];
-	
-	if (val > 7)
-		return -EINVAL;
-	return snd_es18xx_mixer_bits(chip, 0x1c, 0x07, val) != val;
+	unsigned char retVal = 0;
+
+	switch (chip->version) {
+ /* 5 source chips */
+	case 0x1887:
+	case 0x1888:
+		if (val > 4)
+			return -EINVAL;
+		if (val == 4){
+			retVal = snd_es18xx_mixer_bits(chip, 0x7a, 0x08, 0x08) != 0x08;
+			val = 3;
+		}else{
+			retVal = snd_es18xx_mixer_bits(chip, 0x7a, 0x08, 0x00) != 0x00;
+		}
+ /* 4 source chips */
+	case 0x1868:
+	case 0x1878:
+		if (val > 3)
+			return -EINVAL;
+		val = map4Source[val];
+		break;
+ /* 8 source chips */
+	case 0x1869:
+	case 0x1879:
+		if (val > 7)
+			return -EINVAL;
+		break;
+	}
+	return (snd_es18xx_mixer_bits(chip, 0x1c, 0x07, val) != val) || retVal;
 }
 
 static int snd_es18xx_info_spatializer_enable(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)

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

* Re: Re: [es18xx.c PATCH] #2/4 for Zoom Video - resolve number of record sources
  2005-12-26 17:36 ` Mark Salazar
@ 2006-01-02 14:26   ` Takashi Iwai
  2006-01-08 23:01     ` Mark Salazar
  0 siblings, 1 reply; 4+ messages in thread
From: Takashi Iwai @ 2006-01-02 14:26 UTC (permalink / raw)
  To: Mark Salazar; +Cc: alsa-devel

At Mon, 26 Dec 2005 12:36:38 -0500,
Mark Salazar wrote:
> 
>  static int snd_es18xx_info_mux(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
>  {
> -	static char *texts[8] = {
> +	static char *texts4Source[4] = {
> +		"Mic", "CD", "Line", "Master"
> +	};
> +	static char *texts5Source[5] = {
> +		"Mic", "CD", "Line", "Master", "Mix"
> +	};
> +	static char *texts8Source[8] = {
>  		"Mic", "Mic Master", "CD", "AOUT",
>  		"Mic1", "Mix", "Line", "Master"
>  	};
>  
>  	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
>  	uinfo->count = 1;
> -	uinfo->value.enumerated.items = 8;
> -	if (uinfo->value.enumerated.item > 7)
> -		uinfo->value.enumerated.item = 7;
> -	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
> +	struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
> +	switch (chip->version) {
> +	case 0x1868:
> +	case 0x1878:
> +		uinfo->value.enumerated.items = 4;
> +		if (uinfo->value.enumerated.item > 3)
> +			uinfo->value.enumerated.item = 3;
> +		strcpy(uinfo->value.enumerated.name, texts4Source[uinfo->value.enumerated.item]);
> +		break;
> +	case 0x1887:
> +	case 0x1888:
> +		uinfo->value.enumerated.items = 5;
> +		if (uinfo->value.enumerated.item > 4)
> +			uinfo->value.enumerated.item = 4;
> +		strcpy(uinfo->value.enumerated.name, texts5Source[uinfo->value.enumerated.item]);
> +		break;
> +	case 0x1869: /* DS somewhat contradictory for 1869: could be be 5 or 8 */
> +	case 0x1879:
> +		uinfo->value.enumerated.items = 8;
> +		if (uinfo->value.enumerated.item > 7)
> +			uinfo->value.enumerated.item = 7;
> +		strcpy(uinfo->value.enumerated.name, texts8Source[uinfo->value.enumerated.item]);
> +		break;

I would add default to return an error here (just to be sure).

> +	}
>  	return 0;
>  }
>  
>  static int snd_es18xx_get_mux(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
>  {
> +	static unsigned char invMap4Source[8] = {0, 0, 1, 1, 0, 0, 2, 3};
>  	struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
> -	ucontrol->value.enumerated.item[0] = snd_es18xx_mixer_read(chip, 0x1c) & 0x07;
> +	int muxSource = snd_es18xx_mixer_read(chip, 0x1c) & 0x07;
> +	if (!(chip->version == 0x1869 || chip->version == 0x1879)) {
> +		muxSource = invMap4Source[muxSource];
> +		if (muxSource==3 && 
> +		    (chip->version == 0x1887 || chip->version == 0x1888) &&
> +		    (snd_es18xx_mixer_read(chip, 0x7a) & 0x08)
> +		) {
> +			muxSource = 4;
> +		}

Don't put braces for a single line.

> +	}
> +	ucontrol->value.enumerated.item[0] = muxSource;
>  	return 0;
>  }
>  
>  static int snd_es18xx_put_mux(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
>  {
> +	static unsigned char map4Source[4] = {0, 2, 6, 7};
>  	struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
>  	unsigned char val = ucontrol->value.enumerated.item[0];
> -	
> -	if (val > 7)
> -		return -EINVAL;
> -	return snd_es18xx_mixer_bits(chip, 0x1c, 0x07, val) != val;
> +	unsigned char retVal = 0;
> +
> +	switch (chip->version) {
> + /* 5 source chips */
> +	case 0x1887:
> +	case 0x1888:
> +		if (val > 4)
> +			return -EINVAL;
> +		if (val == 4){
> +			retVal = snd_es18xx_mixer_bits(chip, 0x7a, 0x08, 0x08) != 0x08;
> +			val = 3;
> +		}else{
> +			retVal = snd_es18xx_mixer_bits(chip, 0x7a, 0x08, 0x00) != 0x00;
> +		}

Please fix white spaces around braces.


Takashi


-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click

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

* Re: Re: [es18xx.c PATCH] #2/4 for Zoom Video - resolve number of record sources
  2006-01-02 14:26   ` Takashi Iwai
@ 2006-01-08 23:01     ` Mark Salazar
  0 siblings, 0 replies; 4+ messages in thread
From: Mark Salazar @ 2006-01-08 23:01 UTC (permalink / raw)
  To: Takashi Iwai; +Cc: alsa-devel

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

Takashi Iwai wrote:

>I would add default to return an error here (just to be sure).
>  
>
Done

>Don't put braces for a single line.
>  
>
Done

>Please fix white spaces around braces.
>  
>
Done

New patch attached . Tested same as original version.

Also repatched and tested mods 3 & 4. No change necessary.


[-- Attachment #2: es18xx.CVSmod2V2.diff --]
[-- Type: text/plain, Size: 4236 bytes --]

diff -Nur ../alsa-driverMod1/alsa-kernel/isa/es18xx.c ./alsa-kernel/isa/es18xx.c
--- ../alsa-driverMod1/alsa-kernel/isa/es18xx.c	2006-01-03 21:50:26.000000000 -0500
+++ ./alsa-kernel/isa/es18xx.c	2006-01-08 12:07:22.000000000 -0500
@@ -929,37 +929,118 @@
  *  MIXER part
  */
 
+/* Record source mux routines:
+ * Depending on the chipset this mux switches between 4, 5, or 8 possible inputs.
+ * bit table for the 4/5 source mux:
+ * reg 1C:
+ *  b2 b1 b0   muxSource
+ *   x  0  x   microphone
+ *   0  1  x   CD
+ *   1  1  0   line
+ *   1  1  1   mixer
+ * if it's "mixer" and it's a 5 source mux chipset then reg 7A bit 3 determines
+ * either the play mixer or the capture mixer.
+ *
+ * "map4Source" translates from source number to reg bit pattern
+ * "invMap4Source" translates from reg bit pattern to source number
+ */
+
 static int snd_es18xx_info_mux(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
 {
-	static char *texts[8] = {
+	static char *texts4Source[4] = {
+		"Mic", "CD", "Line", "Master"
+	};
+	static char *texts5Source[5] = {
+		"Mic", "CD", "Line", "Master", "Mix"
+	};
+	static char *texts8Source[8] = {
 		"Mic", "Mic Master", "CD", "AOUT",
 		"Mic1", "Mix", "Line", "Master"
 	};
 
 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
 	uinfo->count = 1;
-	uinfo->value.enumerated.items = 8;
-	if (uinfo->value.enumerated.item > 7)
-		uinfo->value.enumerated.item = 7;
-	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
+	struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
+	switch (chip->version) {
+	case 0x1868:
+	case 0x1878:
+		uinfo->value.enumerated.items = 4;
+		if (uinfo->value.enumerated.item > 3)
+			uinfo->value.enumerated.item = 3;
+		strcpy(uinfo->value.enumerated.name, texts4Source[uinfo->value.enumerated.item]);
+		break;
+	case 0x1887:
+	case 0x1888:
+		uinfo->value.enumerated.items = 5;
+		if (uinfo->value.enumerated.item > 4)
+			uinfo->value.enumerated.item = 4;
+		strcpy(uinfo->value.enumerated.name, texts5Source[uinfo->value.enumerated.item]);
+		break;
+	case 0x1869: /* DS somewhat contradictory for 1869: could be be 5 or 8 */
+	case 0x1879:
+		uinfo->value.enumerated.items = 8;
+		if (uinfo->value.enumerated.item > 7)
+			uinfo->value.enumerated.item = 7;
+		strcpy(uinfo->value.enumerated.name, texts8Source[uinfo->value.enumerated.item]);
+		break;
+	default:
+		return -EINVAL;
+	}
 	return 0;
 }
 
 static int snd_es18xx_get_mux(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 {
+	static unsigned char invMap4Source[8] = {0, 0, 1, 1, 0, 0, 2, 3};
 	struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
-	ucontrol->value.enumerated.item[0] = snd_es18xx_mixer_read(chip, 0x1c) & 0x07;
+	int muxSource = snd_es18xx_mixer_read(chip, 0x1c) & 0x07;
+	if (!(chip->version == 0x1869 || chip->version == 0x1879)) {
+		muxSource = invMap4Source[muxSource];
+		if (muxSource==3 && 
+		    (chip->version == 0x1887 || chip->version == 0x1888) &&
+		    (snd_es18xx_mixer_read(chip, 0x7a) & 0x08)
+		) 
+			muxSource = 4;
+	}
+	ucontrol->value.enumerated.item[0] = muxSource;
 	return 0;
 }
 
 static int snd_es18xx_put_mux(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 {
+	static unsigned char map4Source[4] = {0, 2, 6, 7};
 	struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
 	unsigned char val = ucontrol->value.enumerated.item[0];
-	
-	if (val > 7)
+	unsigned char retVal = 0;
+
+	switch (chip->version) {
+ /* 5 source chips */
+	case 0x1887:
+	case 0x1888:
+		if (val > 4)
+			return -EINVAL;
+		if (val == 4) {
+			retVal = snd_es18xx_mixer_bits(chip, 0x7a, 0x08, 0x08) != 0x08;
+			val = 3;
+		} else
+			retVal = snd_es18xx_mixer_bits(chip, 0x7a, 0x08, 0x00) != 0x00;
+ /* 4 source chips */
+	case 0x1868:
+	case 0x1878:
+		if (val > 3)
+			return -EINVAL;
+		val = map4Source[val];
+		break;
+ /* 8 source chips */
+	case 0x1869:
+	case 0x1879:
+		if (val > 7)
+			return -EINVAL;
+		break;
+	default:
 		return -EINVAL;
-	return snd_es18xx_mixer_bits(chip, 0x1c, 0x07, val) != val;
+	}
+	return (snd_es18xx_mixer_bits(chip, 0x1c, 0x07, val) != val) || retVal;
 }
 
 static int snd_es18xx_info_spatializer_enable(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)

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

end of thread, other threads:[~2006-01-08 23:01 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-12-26 15:45 [es18xx.c PATCH] #2/4 for Zoom Video - resolve number of record sources Mark Salazar
2005-12-26 17:36 ` Mark Salazar
2006-01-02 14:26   ` Takashi Iwai
2006-01-08 23:01     ` Mark Salazar

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