]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ALSA: usb-audio: avoid setting of sample rate multiple times on bus
authorDaniel Girnus <dgirnus@de.adit-jv.com>
Tue, 6 Dec 2016 05:46:15 +0000 (14:46 +0900)
committerTakashi Iwai <tiwai@suse.de>
Tue, 6 Dec 2016 12:55:15 +0000 (13:55 +0100)
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 <dgirnus@de.adit-jv.com>
Signed-off-by: Jens Lorenz <jlorenz@de.adit-jv.com>
Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/pcm.c

index 44d178ee9177565bba3fde9d2ac2b7308e8dd7ae..a522c9af1f341f515c4c406834d4796f119e16ce 100644 (file)
@@ -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;