From 28389e05f372ba4d7b5e5034ed2ec6d88bea423d Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 6 Apr 2017 17:32:00 +0200 Subject: [PATCH] alsa: fix device enumeration --- spa/plugins/alsa/alsa-monitor.c | 8 ++++++-- spa/plugins/alsa/alsa-utils.c | 4 ++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/spa/plugins/alsa/alsa-monitor.c b/spa/plugins/alsa/alsa-monitor.c index 33aa82b49..2d397e450 100644 --- a/spa/plugins/alsa/alsa-monitor.c +++ b/spa/plugins/alsa/alsa-monitor.c @@ -119,6 +119,7 @@ fill_item (SpaALSAMonitor *this, SpaPODBuilder b = SPA_POD_BUILDER_INIT (this->item_buffer, sizeof (this->item_buffer)); const SpaHandleFactory *factory = NULL; SpaPODFrame f[3]; + char card_name[64]; switch (snd_pcm_info_get_stream (dev_info)) { case SND_PCM_STREAM_PLAYBACK: @@ -143,6 +144,8 @@ fill_item (SpaALSAMonitor *this, if (!(name && *name)) name = "Unknown"; + snprintf (card_name, 63, "%s,%d", this->card_name, snd_pcm_info_get_device (dev_info)); + spa_pod_builder_add (&b, SPA_POD_TYPE_OBJECT, &f[0], 0, this->type.monitor.MonitorItem, SPA_POD_PROP (&f[1], this->type.monitor.id, 0, SPA_POD_TYPE_STRING, 1, name), @@ -159,7 +162,7 @@ fill_item (SpaALSAMonitor *this, SPA_POD_TYPE_STRUCT, 1, &f[2], 0); spa_pod_builder_add (&b, - SPA_POD_TYPE_STRING, "alsa.card", SPA_POD_TYPE_STRING, this->card_name, + SPA_POD_TYPE_STRING, "alsa.card", SPA_POD_TYPE_STRING, card_name, SPA_POD_TYPE_STRING, "alsa.card.id", SPA_POD_TYPE_STRING, snd_ctl_card_info_get_id (card_info), SPA_POD_TYPE_STRING, "alsa.card.components", SPA_POD_TYPE_STRING, snd_ctl_card_info_get_components (card_info), SPA_POD_TYPE_STRING, "alsa.card.driver", SPA_POD_TYPE_STRING, snd_ctl_card_info_get_driver (card_info), @@ -278,6 +281,7 @@ get_next_device (SpaALSAMonitor *this, struct udev_device *dev) snd_ctl_card_info_t *card_info; if (this->stream_idx == -1) { +next_device: if ((err = snd_ctl_pcm_next_device (this->ctl_hndl, &this->dev_idx)) < 0) { spa_log_error (this->log, "error iterating devices: %s", snd_strerror (err)); return err; @@ -301,7 +305,7 @@ again: snd_pcm_info_set_stream (dev_info, SND_PCM_STREAM_CAPTURE); break; default: - return -1; + goto next_device; } snd_ctl_card_info_alloca (&card_info); diff --git a/spa/plugins/alsa/alsa-utils.c b/spa/plugins/alsa/alsa-utils.c index 05f0f3926..3cf1f1a48 100644 --- a/spa/plugins/alsa/alsa-utils.c +++ b/spa/plugins/alsa/alsa-utils.c @@ -127,10 +127,12 @@ spa_alsa_enum_format (SpaALSAState *state, SpaPODProp *prop; SpaFormat *fmt; SpaResult res; + bool opened; if (index == 1) return SPA_RESULT_ENUM_END; + opened = state->opened; if ((err = spa_alsa_open (state)) < 0) return SPA_RESULT_ERROR; @@ -204,6 +206,8 @@ spa_alsa_enum_format (SpaALSAState *state, return res; *format = SPA_POD_BUILDER_DEREF (&b, 0, SpaFormat); + if (!opened) + spa_alsa_close (state); return SPA_RESULT_OK; }