From: Daniel Girnus <dgir...@de.adit-jv.com>

Some of userland applications call 'snd_pcm_hw_params()' and
'snd_pcm_hw_prepare()' sequentially, which means 'snd_pcm_hw_prepare()'
is called twice and the second 'snd_pcm_hw_prepare()' is called in
'SNDRV_PCM_STATE_PREPARED' state.

Some devices are not able to manage this and they will stop playback
if the sample rate will be configured several times over USB protocol.

V2: updated Changelog

Signed-off-by: Daniel Girnus <dgir...@de.adit-jv.com>
Signed-off-by: Jens Lorenz <jlor...@de.adit-jv.com>
Signed-off-by: Jiada Wang <jiada_w...@mentor.com>
---
 sound/usb/pcm.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
index 44d178e..a522c9a 100644
--- a/sound/usb/pcm.c
+++ b/sound/usb/pcm.c
@@ -806,17 +806,18 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream 
*substream)
        if (ret < 0)
                goto unlock;
 
-       iface = usb_ifnum_to_if(subs->dev, subs->cur_audiofmt->iface);
-       alts = &iface->altsetting[subs->cur_audiofmt->altset_idx];
-       ret = snd_usb_init_sample_rate(subs->stream->chip,
-                                      subs->cur_audiofmt->iface,
-                                      alts,
-                                      subs->cur_audiofmt,
-                                      subs->cur_rate);
-       if (ret < 0)
-               goto unlock;
-
        if (subs->need_setup_ep) {
+
+               iface = usb_ifnum_to_if(subs->dev, subs->cur_audiofmt->iface);
+               alts = &iface->altsetting[subs->cur_audiofmt->altset_idx];
+               ret = snd_usb_init_sample_rate(subs->stream->chip,
+                                              subs->cur_audiofmt->iface,
+                                              alts,
+                                              subs->cur_audiofmt,
+                                              subs->cur_rate);
+               if (ret < 0)
+                       goto unlock;
+
                ret = configure_endpoint(subs);
                if (ret < 0)
                        goto unlock;
-- 
2.9.3

Reply via email to