4 * 1024 * 1024;
pcm->buffer_attr.tlength =
io->buffer_size * pcm->frame_size;
- pcm->buffer_attr.prebuf =
- (io->buffer_size - io->period_size) * pcm->frame_size;
+ if (pcm->buffer_attr.prebuf == (uint32_t)-1)
+ pcm->buffer_attr.prebuf =
+ (io->buffer_size - io->period_size) * pcm->frame_size;
pcm->buffer_attr.minreq = io->period_size * pcm->frame_size;
pcm->buffer_attr.fragsize = io->period_size * pcm->frame_size;
return err;
}
+static int pulse_sw_params(snd_pcm_ioplug_t *io, snd_pcm_sw_params_t *params)
+{
+ snd_pcm_pulse_t *pcm = io->private_data;
+ snd_pcm_uframes_t start_threshold;
+
+ assert(pcm);
+
+ if (!pcm->p || !pcm->p->mainloop)
+ return -EBADFD;
+
+ pa_threaded_mainloop_lock(pcm->p->mainloop);
+
+ snd_pcm_sw_params_get_start_threshold(params, &start_threshold);
+
+ /* At least one period to keep PulseAudio happy */
+ if (start_threshold < io->period_size)
+ start_threshold = io->period_size;
+
+ pcm->buffer_attr.prebuf = start_threshold * pcm->frame_size;
+
+ pa_threaded_mainloop_unlock(pcm->p->mainloop);
+
+ return 0;
+}
+
static int pulse_close(snd_pcm_ioplug_t * io)
{
snd_pcm_pulse_t *pcm = io->private_data;
.poll_revents = pulse_pcm_poll_revents,
.prepare = pulse_prepare,
.hw_params = pulse_hw_params,
+ .sw_params = pulse_sw_params,
.close = pulse_close,
.pause = pulse_pause
};
}
pcm->handle_underrun = handle_underrun;
+ pcm->buffer_attr.prebuf = -1;
err = pulse_connect(pcm->p, server, fallback_name != NULL);
if (err < 0)