|
@@ -748,11 +748,11 @@ int snd_usb_pcm_resume(struct snd_usb_stream *as)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
|
- ret = snd_usb_pcm_change_state(&as->substream[0], UAC3_PD_STATE_D0);
|
|
|
+ ret = snd_usb_pcm_change_state(&as->substream[0], UAC3_PD_STATE_D1);
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
|
|
|
|
- ret = snd_usb_pcm_change_state(&as->substream[1], UAC3_PD_STATE_D0);
|
|
|
+ ret = snd_usb_pcm_change_state(&as->substream[1], UAC3_PD_STATE_D1);
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
|
|
|
@@ -803,16 +803,22 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream,
|
|
|
ret = snd_usb_lock_shutdown(subs->stream->chip);
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
|
+
|
|
|
+ ret = snd_usb_pcm_change_state(subs, UAC3_PD_STATE_D0);
|
|
|
+ if (ret < 0)
|
|
|
+ goto unlock;
|
|
|
+
|
|
|
ret = set_format(subs, fmt);
|
|
|
- snd_usb_unlock_shutdown(subs->stream->chip);
|
|
|
if (ret < 0)
|
|
|
- return ret;
|
|
|
+ goto unlock;
|
|
|
|
|
|
subs->interface = fmt->iface;
|
|
|
subs->altset_idx = fmt->altset_idx;
|
|
|
subs->need_setup_ep = true;
|
|
|
|
|
|
- return 0;
|
|
|
+ unlock:
|
|
|
+ snd_usb_unlock_shutdown(subs->stream->chip);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -869,6 +875,10 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream)
|
|
|
snd_usb_endpoint_sync_pending_stop(subs->sync_endpoint);
|
|
|
snd_usb_endpoint_sync_pending_stop(subs->data_endpoint);
|
|
|
|
|
|
+ ret = snd_usb_pcm_change_state(subs, UAC3_PD_STATE_D0);
|
|
|
+ if (ret < 0)
|
|
|
+ goto unlock;
|
|
|
+
|
|
|
ret = set_format(subs, subs->cur_audiofmt);
|
|
|
if (ret < 0)
|
|
|
goto unlock;
|
|
@@ -1313,6 +1323,7 @@ static int snd_usb_pcm_close(struct snd_pcm_substream *substream)
|
|
|
int direction = substream->stream;
|
|
|
struct snd_usb_stream *as = snd_pcm_substream_chip(substream);
|
|
|
struct snd_usb_substream *subs = &as->substream[direction];
|
|
|
+ int ret;
|
|
|
|
|
|
stop_endpoints(subs, true);
|
|
|
|
|
@@ -1321,7 +1332,10 @@ static int snd_usb_pcm_close(struct snd_pcm_substream *substream)
|
|
|
!snd_usb_lock_shutdown(subs->stream->chip)) {
|
|
|
usb_set_interface(subs->dev, subs->interface, 0);
|
|
|
subs->interface = -1;
|
|
|
+ ret = snd_usb_pcm_change_state(subs, UAC3_PD_STATE_D1);
|
|
|
snd_usb_unlock_shutdown(subs->stream->chip);
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
subs->pcm_substream = NULL;
|