[RFC 4/4 ] iecset: allow to select control with device and sub-device numbers.

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

 



ASoc implementation force the index to 0.
In case of multi devices that export the iec control, we need device and
subdevice fields to differentiate and address the different controls.
This patch extends "-D" option to be able to address control using
PCM device/sub-device id.

Signed-off-by: Arnaud Pouliquen <arnaud.pouliquen@xxxxxx>
---
 iecset/iecset.c | 34 +++++++++++++++++++++++++++-------
 1 file changed, 27 insertions(+), 7 deletions(-)

diff --git a/iecset/iecset.c b/iecset/iecset.c
index 92a93e8..8d7a800 100644
--- a/iecset/iecset.c
+++ b/iecset/iecset.c
@@ -89,6 +89,8 @@ static void usage(void)
 	printf("Usage: iecset [options] [cmd arg...]\n");
 	printf("Options:\n");
 	printf("    -D device   specifies the control device to use\n");
+	printf("                for \"-Dhw:X,Y,Z\" Only control device X is mandatory\n");
+	printf("                the device(Y) and subdevice(Z) are optinal (default = 0)\n");
 	printf("    -c card     specifies the card number to use (equiv. with -Dhw:#)\n");
 	printf("    -n number   specifies the control index number (default = 0)\n");
 	printf("    -x          dump the dump the AESx hex code for IEC958 PCM parameters\n");
@@ -99,6 +101,15 @@ static void usage(void)
 	}
 }
 
+static int parse_device(char *parms, int *ctl_dev, int *dev, int *sdev)
+{
+
+	if (strncmp(parms, "hw", 2))
+		return 1;
+	sscanf(parms,"hw:%d,%d,%d",ctl_dev, dev, sdev);
+
+	return 0;
+}
 
 /*
  * parse iecset commands
@@ -312,6 +323,7 @@ int main(int argc, char **argv)
 	const char *dev = "default";
 	const char *spdif_str = SND_CTL_NAME_IEC958("", PLAYBACK, DEFAULT);
 	int spdif_index = -1;
+	int cdev, spdif_dev = -1, spdif_sdev = -1;
 	snd_ctl_t *ctl;
 	snd_ctl_elem_list_t *clist;
 	snd_ctl_elem_id_t *cid;
@@ -330,7 +342,11 @@ int main(int argc, char **argv)
 	while ((c = getopt(argc, argv, "D:c:n:xhi")) != -1) {
 		switch (c) {
 		case 'D':
-			dev = optarg;
+			if (parse_device(optarg, &cdev, &spdif_dev, &spdif_sdev))
+				dev = optarg;
+			else
+				sprintf(tmpname, "hw:%d", cdev);
+				dev = tmpname;
 			break;
 		case 'c':
 			i = atoi(optarg);
@@ -376,15 +392,19 @@ int main(int argc, char **argv)
 	}
 
 	controls = snd_ctl_elem_list_get_used(clist);
-	for (cidx = 0; cidx < controls; cidx++) {
-		if (!strcmp(snd_ctl_elem_list_get_name(clist, cidx), spdif_str))
-			if (spdif_index < 0 ||
-			    snd_ctl_elem_list_get_index(clist, cidx) == spdif_index)
+	for (cidx = 0; cidx < controls; cidx++)
+		if (!strcmp(snd_ctl_elem_list_get_name(clist, cidx), spdif_str)) {
+			if ((spdif_index < 0 ||
+			     snd_ctl_elem_list_get_index(clist, cidx) == spdif_index) &&
+			    (spdif_dev < 0 ||
+			     snd_ctl_elem_list_get_device(clist, cidx) == spdif_dev) &&
+			    (spdif_sdev < 0 ||
+			     snd_ctl_elem_list_get_subdevice(clist, cidx) == spdif_sdev))
 				break;
 	}
 	if (cidx >= controls) {
-		fprintf(stderr, "control \"%s\" (index %d) not found\n",
-			spdif_str, spdif_index);
+		fprintf(stderr, "control \"%s\" (index %d, device %d, subdevice %d) not found\n",
+			spdif_str, spdif_index, spdif_dev, spdif_sdev);
 		return 1;
 	}
 
-- 
1.9.1

_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxx
http://mailman.alsa-project.org/mailman/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