|
@@ -76,10 +76,9 @@ snd_pcm_uframes_t snd_usb_pcm_delay(struct snd_usb_substream *subs,
|
|
|
*/
|
|
|
static snd_pcm_uframes_t snd_usb_pcm_pointer(struct snd_pcm_substream *substream)
|
|
|
{
|
|
|
- struct snd_usb_substream *subs;
|
|
|
+ struct snd_usb_substream *subs = substream->runtime->private_data;
|
|
|
unsigned int hwptr_done;
|
|
|
|
|
|
- subs = (struct snd_usb_substream *)substream->runtime->private_data;
|
|
|
if (atomic_read(&subs->stream->chip->shutdown))
|
|
|
return SNDRV_PCM_POS_XRUN;
|
|
|
spin_lock(&subs->lock);
|
|
@@ -1172,9 +1171,6 @@ static int setup_hw_info(struct snd_pcm_runtime *runtime, struct snd_usb_substre
|
|
|
pt = 125 * (1 << fp->datainterval);
|
|
|
ptmin = min(ptmin, pt);
|
|
|
}
|
|
|
- err = snd_usb_autoresume(subs->stream->chip);
|
|
|
- if (err < 0)
|
|
|
- return err;
|
|
|
|
|
|
param_period_time_if_needed = SNDRV_PCM_HW_PARAM_PERIOD_TIME;
|
|
|
if (subs->speed == USB_SPEED_FULL)
|
|
@@ -1183,30 +1179,37 @@ static int setup_hw_info(struct snd_pcm_runtime *runtime, struct snd_usb_substre
|
|
|
if (ptmin == 1000)
|
|
|
/* if period time doesn't go below 1 ms, no rules needed */
|
|
|
param_period_time_if_needed = -1;
|
|
|
- snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_TIME,
|
|
|
- ptmin, UINT_MAX);
|
|
|
-
|
|
|
- if ((err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
|
|
|
- hw_rule_rate, subs,
|
|
|
- SNDRV_PCM_HW_PARAM_FORMAT,
|
|
|
- SNDRV_PCM_HW_PARAM_CHANNELS,
|
|
|
- param_period_time_if_needed,
|
|
|
- -1)) < 0)
|
|
|
- goto rep_err;
|
|
|
- if ((err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
|
|
|
- hw_rule_channels, subs,
|
|
|
- SNDRV_PCM_HW_PARAM_FORMAT,
|
|
|
- SNDRV_PCM_HW_PARAM_RATE,
|
|
|
- param_period_time_if_needed,
|
|
|
- -1)) < 0)
|
|
|
- goto rep_err;
|
|
|
- if ((err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_FORMAT,
|
|
|
- hw_rule_format, subs,
|
|
|
- SNDRV_PCM_HW_PARAM_RATE,
|
|
|
- SNDRV_PCM_HW_PARAM_CHANNELS,
|
|
|
- param_period_time_if_needed,
|
|
|
- -1)) < 0)
|
|
|
- goto rep_err;
|
|
|
+
|
|
|
+ err = snd_pcm_hw_constraint_minmax(runtime,
|
|
|
+ SNDRV_PCM_HW_PARAM_PERIOD_TIME,
|
|
|
+ ptmin, UINT_MAX);
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
+
|
|
|
+ err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
|
|
|
+ hw_rule_rate, subs,
|
|
|
+ SNDRV_PCM_HW_PARAM_FORMAT,
|
|
|
+ SNDRV_PCM_HW_PARAM_CHANNELS,
|
|
|
+ param_period_time_if_needed,
|
|
|
+ -1);
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
+ err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
|
|
|
+ hw_rule_channels, subs,
|
|
|
+ SNDRV_PCM_HW_PARAM_FORMAT,
|
|
|
+ SNDRV_PCM_HW_PARAM_RATE,
|
|
|
+ param_period_time_if_needed,
|
|
|
+ -1);
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
+ err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_FORMAT,
|
|
|
+ hw_rule_format, subs,
|
|
|
+ SNDRV_PCM_HW_PARAM_RATE,
|
|
|
+ SNDRV_PCM_HW_PARAM_CHANNELS,
|
|
|
+ param_period_time_if_needed,
|
|
|
+ -1);
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
if (param_period_time_if_needed >= 0) {
|
|
|
err = snd_pcm_hw_rule_add(runtime, 0,
|
|
|
SNDRV_PCM_HW_PARAM_PERIOD_TIME,
|
|
@@ -1216,15 +1219,13 @@ static int setup_hw_info(struct snd_pcm_runtime *runtime, struct snd_usb_substre
|
|
|
SNDRV_PCM_HW_PARAM_RATE,
|
|
|
-1);
|
|
|
if (err < 0)
|
|
|
- goto rep_err;
|
|
|
+ return err;
|
|
|
}
|
|
|
- if ((err = snd_usb_pcm_check_knot(runtime, subs)) < 0)
|
|
|
- goto rep_err;
|
|
|
- return 0;
|
|
|
+ err = snd_usb_pcm_check_knot(runtime, subs);
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
|
|
|
-rep_err:
|
|
|
- snd_usb_autosuspend(subs->stream->chip);
|
|
|
- return err;
|
|
|
+ return snd_usb_autoresume(subs->stream->chip);
|
|
|
}
|
|
|
|
|
|
static int snd_usb_pcm_open(struct snd_pcm_substream *substream)
|