Patch "ALSA: usb-audio: Add quirk for Tascam Model 12" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    ALSA: usb-audio: Add quirk for Tascam Model 12

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     alsa-usb-audio-add-quirk-for-tascam-model-12.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 0aec1a0b154daba5a66d3f310f4c1d75cb63fe95
Author: John Keeping <john@xxxxxxxxxxxxx>
Date:   Tue Nov 29 13:00:59 2022 +0000

    ALSA: usb-audio: Add quirk for Tascam Model 12
    
    [ Upstream commit 67df411db3f0209e4bb5227d4dd9d41b21368b9d ]
    
    Tascam's Model 12 is a mixer which can also operate as a USB audio
    interface.  The audio interface uses explicit feedback but it seems that
    it does not correctly handle missing isochronous frames.
    
    When injecting an xrun (or doing anything else that pauses the playback
    stream) the feedback rate climbs (for example, at 44,100Hz nominal, I
    see a stable rate around 44,099 but xrun injection sees this peak at
    around 44,135 in most cases) and glitches are heard in the audio stream
    for several seconds - this is significantly worse than the single glitch
    expected for an underrun.
    
    While the stream does normally recover and the feedback rate returns to
    a stable value, I have seen some occurrences where this does not happen
    and the rate continues to increase while no audio is heard from the
    output.  I have not found a solid reproduction for this.
    
    This misbehaviour can be avoided by totally resetting the stream state
    by switching the interface to alt 0 and back before restarting the
    playback stream.
    
    Add a new quirk flag which forces the endpoint and interface to be
    reconfigured whenever the stream is stopped, and use this for the Tascam
    Model 12.
    
    Separate interfaces are used for the playback and capture endpoints, so
    resetting the playback interface here will not affect the capture stream
    if it is running.  While there are two endpoints on the interface,
    these are the OUT data endpoint and the IN explicit feedback endpoint
    corresponding to it and these are always stopped and started together.
    
    Signed-off-by: John Keeping <john@xxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20221129130100.1257904-1-john@xxxxxxxxxxxx
    Signed-off-by: Takashi Iwai <tiwai@xxxxxxx>
    Stable-dep-of: 7822baa844a8 ("ALSA: usb-audio: add quirk for RODE NT-USB+")
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
index cf48d7ccc496e..aca9ebfec22c8 100644
--- a/sound/usb/endpoint.c
+++ b/sound/usb/endpoint.c
@@ -1674,6 +1674,13 @@ void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep, bool keep_pending)
 		stop_urbs(ep, false, keep_pending);
 		if (ep->clock_ref)
 			atomic_dec(&ep->clock_ref->locked);
+
+		if (ep->chip->quirk_flags & QUIRK_FLAG_FORCE_IFACE_RESET &&
+		    usb_pipeout(ep->pipe)) {
+			ep->need_prepare = true;
+			if (ep->iface_ref)
+				ep->iface_ref->need_setup = true;
+		}
 	}
 }
 
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
index 03b6a07a2ea05..b9c0affb79b10 100644
--- a/sound/usb/quirks.c
+++ b/sound/usb/quirks.c
@@ -1786,6 +1786,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
 	DEVICE_FLG(0x0644, 0x804a, /* TEAC UD-301 */
 		   QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY |
 		   QUIRK_FLAG_IFACE_DELAY),
+	DEVICE_FLG(0x0644, 0x805f, /* TEAC Model 12 */
+		   QUIRK_FLAG_FORCE_IFACE_RESET),
 	DEVICE_FLG(0x06f8, 0xb000, /* Hercules DJ Console (Windows Edition) */
 		   QUIRK_FLAG_IGNORE_CTL_ERROR),
 	DEVICE_FLG(0x06f8, 0xd002, /* Hercules DJ Console (Macintosh Edition) */
diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
index e97141ef730ad..2aba508a48312 100644
--- a/sound/usb/usbaudio.h
+++ b/sound/usb/usbaudio.h
@@ -172,6 +172,9 @@ extern bool snd_usb_skip_validation;
  *  Don't apply implicit feedback sync mode
  * QUIRK_FLAG_IFACE_SKIP_CLOSE
  *  Don't closed interface during setting sample rate
+ * QUIRK_FLAG_FORCE_IFACE_RESET
+ *  Force an interface reset whenever stopping & restarting a stream
+ *  (e.g. after xrun)
  */
 
 #define QUIRK_FLAG_GET_SAMPLE_RATE	(1U << 0)
@@ -194,5 +197,6 @@ extern bool snd_usb_skip_validation;
 #define QUIRK_FLAG_GENERIC_IMPLICIT_FB	(1U << 17)
 #define QUIRK_FLAG_SKIP_IMPLICIT_FB	(1U << 18)
 #define QUIRK_FLAG_IFACE_SKIP_CLOSE	(1U << 19)
+#define QUIRK_FLAG_FORCE_IFACE_RESET	(1U << 20)
 
 #endif /* __USBAUDIO_H */




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux