mutex_lock(&dice->mutex);
- err = snd_dice_stream_reserve_duplex(dice, 0, 0);
+ err = snd_dice_stream_reserve_duplex(dice, 0, 0, 0);
if (err >= 0) {
++dice->substreams_counter;
err = snd_dice_stream_start_duplex(dice);
if (!internal ||
(dice->substreams_counter > 0 && d->events_per_period > 0)) {
unsigned int frames_per_period = d->events_per_period;
+ unsigned int frames_per_buffer = d->events_per_buffer;
unsigned int rate;
err = snd_dice_transaction_get_rate(dice, &rate);
if (frames_per_period > 0) {
// For double_pcm_frame quirk.
- if (rate > 96000)
+ if (rate > 96000) {
frames_per_period *= 2;
+ frames_per_buffer *= 2;
+ }
err = snd_pcm_hw_constraint_minmax(substream->runtime,
SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
mutex_unlock(&dice->mutex);
goto err_locked;
}
+
+ err = snd_pcm_hw_constraint_minmax(substream->runtime,
+ SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
+ frames_per_buffer, frames_per_buffer);
+ if (err < 0) {
+ mutex_unlock(&dice->mutex);
+ goto err_locked;
+ }
}
}
if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN) {
unsigned int rate = params_rate(hw_params);
unsigned int events_per_period = params_period_size(hw_params);
+ unsigned int events_per_buffer = params_buffer_size(hw_params);
mutex_lock(&dice->mutex);
// For double_pcm_frame quirk.
- if (rate > 96000)
+ if (rate > 96000) {
events_per_period /= 2;
+ events_per_buffer /= 2;
+ }
err = snd_dice_stream_reserve_duplex(dice, rate,
- events_per_period);
+ events_per_period, events_per_buffer);
if (err >= 0)
++dice->substreams_counter;
mutex_unlock(&dice->mutex);
}
int snd_dice_stream_reserve_duplex(struct snd_dice *dice, unsigned int rate,
- unsigned int events_per_period)
+ unsigned int events_per_period,
+ unsigned int events_per_buffer)
{
unsigned int curr_rate;
int err;
goto error;
err = amdtp_domain_set_events_per_period(&dice->domain,
- events_per_period, 0);
+ events_per_period, events_per_buffer);
if (err < 0)
goto error;
}
int snd_dice_stream_init_duplex(struct snd_dice *dice);
void snd_dice_stream_destroy_duplex(struct snd_dice *dice);
int snd_dice_stream_reserve_duplex(struct snd_dice *dice, unsigned int rate,
- unsigned int events_per_period);
+ unsigned int events_per_period,
+ unsigned int events_per_buffer);
void snd_dice_stream_update_duplex(struct snd_dice *dice);
int snd_dice_stream_detect_current_formats(struct snd_dice *dice);