This patch intends to parse the card ID and PCM ID of playback and capture, then replace it in the path macro. Signed-off-by: Zhang Keqiao <keqiao.zhang@xxxxxxxxx> --- bat/bat.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ bat/common.h | 3 +++ 2 files changed, 72 insertions(+) diff --git a/bat/bat.c b/bat/bat.c index bf6873a..b12e5d3 100644 --- a/bat/bat.c +++ b/bat/bat.c @@ -127,6 +127,69 @@ static void get_sine_frequencies(struct bat *bat, char *freq) } } +/* parse the card and pcm ID of playback device and capture device */ +/* Then we can get the path for specify device to do the XRUN injection */ +static int parse_card_and_pcm_id(struct bat *bat) +{ + char *tmp1; + char *tmp2; + char playback_device[MAX_DEV]; + char capture_device[MAX_DEV]; + + strcpy(playback_device, bat->playback.device); + strcpy(capture_device, bat->capture.device); + + if (bat->playback.device == bat->capture.device) { + tmp1 = strchr(playback_device, ','); + if (tmp1 != NULL) { + *tmp1 = '\0'; + bat->playback.pcm_id = bat->capture.pcm_id = (tmp1 + 1); + } else { + fprintf(bat->err, _("err, cannot find the pcm ID\n")); + return -EINVAL; + } + tmp2 = strchr(playback_device, ':'); + if (tmp2 != NULL) { + bat->playback.card_id = bat->capture.card_id = (tmp2 + 1); + } else { + fprintf(bat->err, _("err, cannot find the card ID\n")); + return -EINVAL; + } + } else { + tmp1 = strchr(playback_device, ','); + if (tmp1 != NULL) { + *tmp1 = '\0'; + bat->playback.pcm_id = (tmp1 + 1); + } else { + fprintf(bat->err, _("err, cannot find the pcm ID of playback\n")); + return -EINVAL; + } + tmp2 = strchr(playback_device, ':'); + if (tmp2 != NULL) + bat->playback.card_id = (tmp2 + 1); + else { + fprintf(bat->err, _("err, cannot find the card ID of playback\n")); + return -EINVAL; + } + tmp1 = strchr(capture_device, ','); + if (tmp1 != NULL) { + *tmp1 = '\0'; + bat->capture.pcm_id = (tmp1 + 1); + } else { + fprintf(bat->err, _("err, cannot find the pcm ID of capture")); + return -EINVAL; + } + tmp2 = strchr(capture_device, ':'); + if (tmp2 != NULL) + bat->capture.card_id = (tmp2 + 1); + else { + fprintf(bat->err, _("err, cannot find the card ID of capture")); + return -EINVAL; + } + } + return 0; +} + static void get_format(struct bat *bat, char *optarg) { if (strcasecmp(optarg, "cd") == 0) { @@ -561,6 +624,12 @@ static int bat_init(struct bat *bat) return err; } + if (bat->xarg) { + err = parse_card_and_pcm_id(bat); + if (err < 0) + return err; + } + /* Set default playback and capture devices */ if (bat->playback.device == NULL && bat->capture.device == NULL) bat->playback.device = bat->capture.device = DEFAULT_DEV_NAME; diff --git a/bat/common.h b/bat/common.h index a014f87..9f71c6c 100644 --- a/bat/common.h +++ b/bat/common.h @@ -16,6 +16,7 @@ #define TEMP_RECORD_FILE_NAME "/tmp/bat.wav.XXXXXX" #define DEFAULT_DEV_NAME "default" +#define MAX_DEV 15 #define OPT_BASE 300 #define OPT_LOG (OPT_BASE + 1) #define OPT_READFILE (OPT_BASE + 2) @@ -167,6 +168,8 @@ struct pcm { unsigned int device_tiny; char *device; char *file; + char *pcm_id; + char *card_id; enum _bat_op_mode mode; void *(*fct)(struct bat *); }; -- 2.9.3 _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel