diff options
Diffstat (limited to 'sound/usb/pcm.c')
| -rw-r--r-- | sound/usb/pcm.c | 12 | 
1 files changed, 9 insertions, 3 deletions
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index bf5a0f3c1fad..e5311b6bb3f6 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -845,13 +845,19 @@ get_sync_ep_from_substream(struct snd_usb_substream *subs)  	list_for_each_entry(fp, &subs->fmt_list, list) {  		ep = snd_usb_get_endpoint(chip, fp->endpoint); -		if (ep && ep->cur_rate) -			return ep; +		if (ep && ep->cur_audiofmt) { +			/* if EP is already opened solely for this substream, +			 * we still allow us to change the parameter; otherwise +			 * this substream has to follow the existing parameter +			 */ +			if (ep->cur_audiofmt != subs->cur_audiofmt || ep->opened > 1) +				return ep; +		}  		if (!fp->implicit_fb)  			continue;  		/* for the implicit fb, check the sync ep as well */  		ep = snd_usb_get_endpoint(chip, fp->sync_ep); -		if (ep && ep->cur_rate) +		if (ep && ep->cur_audiofmt)  			return ep;  	}  	return NULL;  | 
