All of lore.kernel.org
 help / color / mirror / Atom feed
From: Takashi Iwai <tiwai@suse.de>
To: alsa-devel@alsa-project.org
Subject: [PATCH 2/2] ALSA: usb-audio: Avoid shoving a new stream into already registered device
Date: Mon, 23 Mar 2020 18:06:43 +0100	[thread overview]
Message-ID: <20200323170643.19181-2-tiwai@suse.de> (raw)
In-Reply-To: <20200323170643.19181-1-tiwai@suse.de>

USB-audio driver registers the card and its devices at each probe of
USB interface, while trying to append a USB substream into the empty
PCM stream slot.  This works for most cases where the all PCM streams
are declared in the single interface description.  However, when the
device provides multiple individual interfaces, this may up with
pushing a new stream into the existing snd_pcm object that has been
already registered.  From the driver perspective, it's OK, but it
doesn't work for PulseAudio and others because they manage in the card
registration level, hence they'll miss this new device creation.

This patch tries to warn such a too-late-appended stream, and also
tries to put rather into a new snd_pcm object.

If we get a report from a user about this, we may add it to an entry
for snd_usb_registration_quirk().

Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 sound/usb/stream.c   | 9 +++++++++
 sound/usb/usbaudio.h | 1 +
 2 files changed, 10 insertions(+)

diff --git a/sound/usb/stream.c b/sound/usb/stream.c
index afd5aa574611..6c758af069e6 100644
--- a/sound/usb/stream.c
+++ b/sound/usb/stream.c
@@ -502,6 +502,15 @@ static int __snd_usb_add_audio_stream(struct snd_usb_audio *chip,
 		subs = &as->substream[stream];
 		if (subs->ep_num)
 			continue;
+		if (snd_device_get_state(chip->card, as->pcm) !=
+		    SNDRV_DEV_BUILD) {
+			if (!chip->pcm_devs_warned) {
+				usb_audio_warn(chip, "PCM stream already registered\n");
+				usb_audio_warn(chip, "Please report to upstream for assigning the delayed card registration\n");
+				chip->pcm_devs_warned = true;
+			}
+			continue;
+		}
 		err = snd_pcm_new_stream(as->pcm, stream, 1);
 		if (err < 0)
 			return err;
diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
index 6fe3ab582ec6..b2b693eeca91 100644
--- a/sound/usb/usbaudio.h
+++ b/sound/usb/usbaudio.h
@@ -34,6 +34,7 @@ struct snd_usb_audio {
 	unsigned int txfr_quirk:1; /* Subframe boundaries on transfers */
 	unsigned int tx_length_quirk:1; /* Put length specifier in transfers */
 	unsigned int setup_fmt_after_resume_quirk:1; /* setup the format to interface after resume */
+	unsigned int pcm_devs_warned:1; /* warned for delayed PCM registrations */
 	int num_interfaces;
 	int num_suspended_intf;
 	int sample_rate_read_error;
-- 
2.16.4


  reply	other threads:[~2020-03-23 17:07 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-23 17:06 [PATCH 1/2] ALSA: core: Add snd_device_get_state() helper Takashi Iwai
2020-03-23 17:06 ` Takashi Iwai [this message]
2020-03-23 20:25   ` [PATCH 2/2] ALSA: usb-audio: Avoid shoving a new stream into already registered device Takashi Iwai

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200323170643.19181-2-tiwai@suse.de \
    --to=tiwai@suse.de \
    --cc=alsa-devel@alsa-project.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.