aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMark Farrugia <mark.farrugia@fiberdyne.com.au>2019-01-30 17:50:49 +1100
committerMark Farrugia <mark.farrugia@fiberdyne.com.au>2019-01-30 17:51:09 +1100
commitc80e9f59a309f428c412c11bf207f186f89ce59e (patch)
tree19cbfdb14ef5b47abc041075e1adc79bbfe8ee03 /src
parent3205195333eb1435bdef8257e0d122c25d0b7e6f (diff)
Add function to get the ALSA card index for an AVIRT card
From an AVIRT internal card index, we retrieve the ALSA card index. Signed-off-by: Mark Farrugia <mark.farrugia@fiberdyne.com.au>
Diffstat (limited to 'src')
-rw-r--r--src/avirt-config.c40
1 files changed, 39 insertions, 1 deletions
diff --git a/src/avirt-config.c b/src/avirt-config.c
index 9bfb4cd..a4a8957 100644
--- a/src/avirt-config.c
+++ b/src/avirt-config.c
@@ -30,7 +30,7 @@
#define AVIRT_CONFIGFS_PATH_STREAMS "/config/snd-avirt/streams/"
#define AVIRT_CONFIGFS_PATH_MAXLEN 64
-#define AVIRT_DEVICE_PATH "/dev/snd/by-path/platform-snd_avirt.0"
+#define AVIRT_DEVICE_PATH "/dev/snd/by-path/platform-snd_avirt"
#define AVIRT_ERROR(errmsg) \
fprintf(stderr, "AVIRT ERROR: %s\n", errmsg);
@@ -123,12 +123,50 @@ static int mount_configfs()
return err;
}
+int snd_avirt_info_get_card(int idx)
+{
+ int open_dev, err = 0;
+ snd_ctl_card_info_t *card_info;
+ char path[64];
+
+ sprintf(path, AVIRT_DEVICE_PATH ".%d", idx);
+ open_dev = open(path, O_RDONLY);
+ if (open_dev < 0)
+ {
+ AVIRT_ERROR_V("Could not open device with path: %s", path);
+ err = -ENODEV;
+ goto exit_dev;
+ }
+
+ snd_ctl_card_info_alloca(&card_info);
+ err = ioctl(open_dev,
+ SNDRV_CTL_IOCTL_CARD_INFO(snd_ctl_card_info_sizeof()),
+ card_info);
+ if (err < 0)
+ {
+ AVIRT_ERROR("Could not ioctl card info for AVIRT");
+ goto exit_dev;
+ }
+
+ return snd_ctl_card_info_get_card(card_info);
+
+exit_dev:
+ close(open_dev);
+
+ return err;
+}
+
int snd_avirt_pcm_info(const char *pcm_name, snd_pcm_info_t *pcm_info)
{
int pcm_dev = -1, err = 0;
snd_ctl_t *handle;
char name[32];
+ if (card_index < 0)
+ card_index = snd_avirt_info_get_card(0); /* TD MF: Dynamically get the AVIRT card number */
+ if (card_index < 0)
+ return card_index;
+
sprintf(name, "hw:%d", card_index);
if ((err = snd_ctl_open(&handle, name, 0)) < 0)
{