paaudio: reduce effective playback buffer size
Add the buffer_get_free pcm_ops function to reduce the effective playback buffer size. All intermediate audio playback buffers become temporary buffers. Signed-off-by: Volker Rümelin <vr_qemu@t-online.de> Message-Id: <20220301191311.26695-11-vr_qemu@t-online.de> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
9833438ef6
commit
ddf2050ce6
|
@ -201,13 +201,11 @@ unlock_and_fail:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *qpa_get_buffer_out(HWVoiceOut *hw, size_t *size)
|
static size_t qpa_buffer_get_free(HWVoiceOut *hw)
|
||||||
{
|
{
|
||||||
PAVoiceOut *p = (PAVoiceOut *) hw;
|
PAVoiceOut *p = (PAVoiceOut *)hw;
|
||||||
PAConnection *c = p->g->conn;
|
PAConnection *c = p->g->conn;
|
||||||
void *ret;
|
|
||||||
size_t l;
|
size_t l;
|
||||||
int r;
|
|
||||||
|
|
||||||
pa_threaded_mainloop_lock(c->mainloop);
|
pa_threaded_mainloop_lock(c->mainloop);
|
||||||
|
|
||||||
|
@ -216,7 +214,6 @@ static void *qpa_get_buffer_out(HWVoiceOut *hw, size_t *size)
|
||||||
if (pa_stream_get_state(p->stream) != PA_STREAM_READY) {
|
if (pa_stream_get_state(p->stream) != PA_STREAM_READY) {
|
||||||
/* wait for stream to become ready */
|
/* wait for stream to become ready */
|
||||||
l = 0;
|
l = 0;
|
||||||
ret = NULL;
|
|
||||||
goto unlock;
|
goto unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -224,16 +221,33 @@ static void *qpa_get_buffer_out(HWVoiceOut *hw, size_t *size)
|
||||||
CHECK_SUCCESS_GOTO(c, l != (size_t) -1, unlock_and_fail,
|
CHECK_SUCCESS_GOTO(c, l != (size_t) -1, unlock_and_fail,
|
||||||
"pa_stream_writable_size failed\n");
|
"pa_stream_writable_size failed\n");
|
||||||
|
|
||||||
|
unlock:
|
||||||
|
pa_threaded_mainloop_unlock(c->mainloop);
|
||||||
|
return l;
|
||||||
|
|
||||||
|
unlock_and_fail:
|
||||||
|
pa_threaded_mainloop_unlock(c->mainloop);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *qpa_get_buffer_out(HWVoiceOut *hw, size_t *size)
|
||||||
|
{
|
||||||
|
PAVoiceOut *p = (PAVoiceOut *)hw;
|
||||||
|
PAConnection *c = p->g->conn;
|
||||||
|
void *ret;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
pa_threaded_mainloop_lock(c->mainloop);
|
||||||
|
|
||||||
|
CHECK_DEAD_GOTO(c, p->stream, unlock_and_fail,
|
||||||
|
"pa_threaded_mainloop_lock failed\n");
|
||||||
|
|
||||||
*size = -1;
|
*size = -1;
|
||||||
r = pa_stream_begin_write(p->stream, &ret, size);
|
r = pa_stream_begin_write(p->stream, &ret, size);
|
||||||
CHECK_SUCCESS_GOTO(c, r >= 0, unlock_and_fail,
|
CHECK_SUCCESS_GOTO(c, r >= 0, unlock_and_fail,
|
||||||
"pa_stream_begin_write failed\n");
|
"pa_stream_begin_write failed\n");
|
||||||
|
|
||||||
unlock:
|
|
||||||
pa_threaded_mainloop_unlock(c->mainloop);
|
pa_threaded_mainloop_unlock(c->mainloop);
|
||||||
if (*size > l) {
|
|
||||||
*size = l;
|
|
||||||
}
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
unlock_and_fail:
|
unlock_and_fail:
|
||||||
|
@ -901,6 +915,7 @@ static struct audio_pcm_ops qpa_pcm_ops = {
|
||||||
.init_out = qpa_init_out,
|
.init_out = qpa_init_out,
|
||||||
.fini_out = qpa_fini_out,
|
.fini_out = qpa_fini_out,
|
||||||
.write = qpa_write,
|
.write = qpa_write,
|
||||||
|
.buffer_get_free = qpa_buffer_get_free,
|
||||||
.get_buffer_out = qpa_get_buffer_out,
|
.get_buffer_out = qpa_get_buffer_out,
|
||||||
.put_buffer_out = qpa_put_buffer_out,
|
.put_buffer_out = qpa_put_buffer_out,
|
||||||
.volume_out = qpa_volume_out,
|
.volume_out = qpa_volume_out,
|
||||||
|
|
Loading…
Reference in New Issue