[PATCH try2 1/2] enable capture from line-in and CD on Revolution 5.1

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Enable capture from line-in and CD on the Revolution 5.1 card.

This patch adds support for switching between the 5 input channels of
the AK5365 ADC and modifies the Revolution 5.1 driver to make use of
this facility.  Previously the capture channel was fixed to channel 0
(microphone on the Revolution 5.1 card).

Signed-off-by: Jochen Voss <voss@xxxxxxxxxx>
---

Hi Takashi,

thanks for reviewing.  A fixed patch is below.

On Wed, Oct 04, 2006 at 12:43:01PM +0200, Takashi Iwai wrote:
> > +	while (num_names<5 && input_names[num_names])
> 
> White space around '<', and define a constant for 5, please.

fixed

> > +	if (idx >= num_names) return -1;
> 
> Break a line, and return a meaningful error code, e.g. -EINVAL.

ok

> > +	val = snd_akm4xxx_get(ak, chip, addr)&mask;
> 
> Put spaces around '&'.

fixed in two places

> > +        ucontrol->value.enumerated.item[0] = val;
> 
> Indentation?

changed eight spaces into a tab

> > +	if (val != oval)
> > +		snd_akm4xxx_write(ak, chip, addr, val);
> > +	return 0;
> 
> The put callback should return 1 if the value is changed and 0 if the
> value is unchanged.  That is, such as:
> 
> 	if (val != oval) {
> 		snd_akm4xxx_write(ak, chip, addr, val);
> 		return 1;
> 	}
> 	return 0;

fixed

> >  		if (ak->type == SND_AK5365 && (idx % 2) == 0) {
> >  			if (! ak->adc_info || 
> > -			    ! ak->adc_info[mixer_ch].switch_name)
> > +			    ! ak->adc_info[mixer_ch].switch_name) {
> >  				knew.name = "Capture Switch";
> > -			else
> > +				knew.index = mixer_ch + ak->idx_offset * 2;
> > +			} else {
> >  				knew.name = ak->adc_info[mixer_ch].switch_name;
> > +			}
> 
> Don't put braces around a single-line if.

I found it ugly to have braces around the two line if branch but no
braces around the one line else branch.  But I fixed it anyway.

---

diff -ur alsa-driver-hg20060929.orig/alsa-kernel/i2c/other/ak4xxx-adda.c alsa-driver-hg20060929.p1/alsa-kernel/i2c/other/ak4xxx-adda.c
--- alsa-driver-hg20060929.orig/alsa-kernel/i2c/other/ak4xxx-adda.c	2006-09-09 01:00:11.000000000 +0100
+++ alsa-driver-hg20060929.p1/alsa-kernel/i2c/other/ak4xxx-adda.c	2006-10-04 12:04:49.189233848 +0100
@@ -513,6 +513,66 @@
 	return change;
 }
 
+#define AK5365_NUM_INPUTS 5
+
+static int ak4xxx_capture_source_info(struct snd_kcontrol *kcontrol,
+				      struct snd_ctl_elem_info *uinfo)
+{
+	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
+	int mixer_ch = AK_GET_SHIFT(kcontrol->private_value);
+	const char **input_names;
+	int  num_names, idx;
+
+	input_names = ak->adc_info[mixer_ch].input_names;
+
+	num_names = 0;
+	while (num_names < AK5365_NUM_INPUTS && input_names[num_names])
+		++num_names;
+	
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
+	uinfo->count = 1;
+	uinfo->value.enumerated.items = num_names;
+	idx = uinfo->value.enumerated.item;
+	if (idx >= num_names)
+		return -EINVAL;
+	strncpy(uinfo->value.enumerated.name, input_names[idx],
+		sizeof(uinfo->value.enumerated.name));
+	return 0;
+}
+
+static int ak4xxx_capture_source_get(struct snd_kcontrol *kcontrol,
+				     struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
+	int chip = AK_GET_CHIP(kcontrol->private_value);
+	int addr = AK_GET_ADDR(kcontrol->private_value);
+	int mask = AK_GET_MASK(kcontrol->private_value);
+	unsigned char val;
+
+	val = snd_akm4xxx_get(ak, chip, addr) & mask;
+	ucontrol->value.enumerated.item[0] = val;
+	return 0;
+}
+
+static int ak4xxx_capture_source_put(struct snd_kcontrol *kcontrol,
+				     struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
+	int chip = AK_GET_CHIP(kcontrol->private_value);
+	int addr = AK_GET_ADDR(kcontrol->private_value);
+	int mask = AK_GET_MASK(kcontrol->private_value);
+	unsigned char oval, val;
+
+	oval = snd_akm4xxx_get(ak, chip, addr);
+	val = oval & ~mask;
+	val |= ucontrol->value.enumerated.item[0] & mask;
+	if (val != oval) {
+		snd_akm4xxx_write(ak, chip, addr, val);
+		return 1;
+	}
+	return 0;
+}
+
 /*
  * build AK4xxx controls
  */
@@ -647,9 +707,10 @@
 
 		if (ak->type == SND_AK5365 && (idx % 2) == 0) {
 			if (! ak->adc_info || 
-			    ! ak->adc_info[mixer_ch].switch_name)
+			    ! ak->adc_info[mixer_ch].switch_name) {
 				knew.name = "Capture Switch";
-			else
+				knew.index = mixer_ch + ak->idx_offset * 2;
+			} else
 				knew.name = ak->adc_info[mixer_ch].switch_name;
 			knew.info = ak4xxx_switch_info;
 			knew.get = ak4xxx_switch_get;
@@ -662,6 +723,26 @@
 			err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
 			if (err < 0)
 				return err;
+
+			memset(&knew, 0, sizeof(knew));
+			knew.name = ak->adc_info[mixer_ch].selector_name;
+			if (! knew.name) {
+				knew.name = "Capture Channel";
+				knew.index = mixer_ch + ak->idx_offset * 2;
+			}
+
+			knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
+			knew.info = ak4xxx_capture_source_info;
+			knew.get = ak4xxx_capture_source_get;
+			knew.put = ak4xxx_capture_source_put;
+			knew.access = 0;
+			/* input selector control: reg. 1, bits 0-2.
+			 * mis-use 'shift' to pass mixer_ch */
+			knew.private_value
+				= AK_COMPOSE(idx/2, 1, mixer_ch, 0x07);
+			err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
+			if (err < 0)
+				return err;
 		}
 
 		idx += num_stereo;
diff -ur alsa-driver-hg20060929.orig/alsa-kernel/include/ak4xxx-adda.h alsa-driver-hg20060929.p1/alsa-kernel/include/ak4xxx-adda.h
--- alsa-driver-hg20060929.orig/alsa-kernel/include/ak4xxx-adda.h	2006-09-09 01:00:11.000000000 +0100
+++ alsa-driver-hg20060929.p1/alsa-kernel/include/ak4xxx-adda.h	2006-10-03 20:37:46.940264000 +0100
@@ -50,6 +50,8 @@
 	char *name;		/* capture gain volume label */
 	char *switch_name;	/* capture switch */
 	unsigned int num_channels;
+	char *selector_name;	/* capture source select label */
+	const char **input_names; /* capture source names (NULL terminated) */
 };
 
 struct snd_akm4xxx {
diff -ur alsa-driver-hg20060929.orig/alsa-kernel/pci/ice1712/revo.c alsa-driver-hg20060929.p1/alsa-kernel/pci/ice1712/revo.c
--- alsa-driver-hg20060929.orig/alsa-kernel/pci/ice1712/revo.c	2006-09-09 01:00:11.000000000 +0100
+++ alsa-driver-hg20060929.p1/alsa-kernel/pci/ice1712/revo.c	2006-10-03 20:37:46.944264000 +0100
@@ -107,11 +107,19 @@
 	AK_DAC("PCM Rear Playback Volume", 2),
 };
 
+static const char *revo51_adc_input_names[] = {
+	"Mic",
+	"Line",
+	"CD",
+	NULL
+};
+
 static struct snd_akm4xxx_adc_channel revo51_adc[] = {
 	{
 		.name = "PCM Capture Volume",
 		.switch_name = "PCM Capture Switch",
-		.num_channels = 2
+		.num_channels = 2,
+		.input_names = revo51_adc_input_names
 	},
 };
 

Attachment: signature.asc
Description: Digital signature

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.sourceforge.net/lists/listinfo/alsa-devel

[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux