ALSA: usb: fix corrupted pointers due to interface setting change
When a transition occurs between alternate settings that do not use the same synchronization method, the substream pointers were not reset. This prevents audio from being played during the second transition. Identified and tested with M-Audio Transit device (0763:2006 Midiman M-Audio Transit) Details of the issue: First playback to adaptive endpoint: $ aplay -Dhw:1,0 ~/24_96.wav Playing WAVE '/home/plb/24_96.wav' : Signed 24 bit Little Endian in 3bytes, Rate 96000 Hz, Stereo [ 3169.297556] usb 1-2: setting usb interface 1:1 [ 3169.297568] usb 1-2: Creating new playback data endpoint #3 [ 3169.298563] usb 1-2: Setting params for ep #3 (type 0, 3 urbs), ret=0 [ 3169.298574] usb 1-2: Starting data EP @ffff880035fc8000 first playback to asynchronous endpoint: $ aplay -Dhw:1,0 ~/16_48.wav Playing WAVE '/home/plb/16_48.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo [ 3204.520251] usb 1-2: setting usb interface 1:3 [ 3204.520264] usb 1-2: Creating new playback data endpoint #3 [ 3204.520272] usb 1-2: Creating new capture sync endpoint #83 [ 3204.521162] usb 1-2: Setting params for ep #3 (type 0, 4 urbs), ret=0 [ 3204.521177] usb 1-2: Setting params for ep #83 (type 1, 4 urbs), ret=0 [ 3204.521182] usb 1-2: Starting data EP @ffff880035fce000 [ 3204.521204] usb 1-2: Starting sync EP @ffff8800bd616000 second playback to adaptive endpoint: no audio and error on terminal: $ aplay -Dhw:1,0 ~/24_96.wav Playing WAVE '/home/plb/24_96.wav' : Signed 24 bit Little Endian in 3bytes, Rate 96000 Hz, Stereo aplay: pcm_write:1939: write error: Input/output error [ 3239.483589] usb 1-2: setting usb interface 1:1 [ 3239.483601] usb 1-2: Re-using EP 3 in iface 1,1 @ffff880035fc8000 [ 3239.484590] usb 1-2: Setting params for ep #3 (type 0, 4 urbs), ret=0 [ 3239.484606] usb 1-2: Setting params for ep #83 (type 1, 4 urbs), ret=0 This last line shows that a sync endpoint is used when it shouldn't. The sync endpoint is no longer valid and the pointers are corrupted Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
bc18e31c30
commit
630184477e
1 changed files with 14 additions and 0 deletions
|
@ -391,6 +391,20 @@ static int set_sync_endpoint(struct snd_usb_substream *subs,
|
|||
*/
|
||||
attr = fmt->ep_attr & USB_ENDPOINT_SYNCTYPE;
|
||||
|
||||
if ((is_playback && (attr != USB_ENDPOINT_SYNC_ASYNC)) ||
|
||||
(!is_playback && (attr != USB_ENDPOINT_SYNC_ADAPTIVE))) {
|
||||
|
||||
/*
|
||||
* In these modes the notion of sync_endpoint is irrelevant.
|
||||
* Reset pointers to avoid using stale data from previously
|
||||
* used settings, e.g. when configuration and endpoints were
|
||||
* changed
|
||||
*/
|
||||
|
||||
subs->sync_endpoint = NULL;
|
||||
subs->data_endpoint->sync_master = NULL;
|
||||
}
|
||||
|
||||
err = set_sync_ep_implicit_fb_quirk(subs, dev, altsd, attr);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
|
Loading…
Reference in a new issue