[alsa-devel] [PATCH v1 2/4] alsabat: parse the card and PCM ID for XRUN injections path
Takashi Iwai
tiwai at suse.de
Thu Aug 31 20:19:27 CEST 2017
On Thu, 31 Aug 2017 15:37:07 +0200,
Zhang Keqiao wrote:
>
> 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 at intel.com>
> ---
> 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;
> + }
> + }
FYI, a handy function for this kind of parsing is sscanf().
For example, the above can be a simple form like:
if (sscanf(bat->playback.device, "pcm:%d,%d", &card, &pcm) != 2)
return -EINVAL;
thanks,
Takashi
More information about the Alsa-devel
mailing list