mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-08 13:29:59 -05:00
protocol-native: Allow clients to know at what index underrun occurred
This patch introduces some extra protocol information, so protocol version is bumped. This functionality is primarily needed to solve a long standing issue in alsa-plugins, which should ignore underruns if and only if it is obsolete, i e, if more data has been written to the pipe in the meantime (which will automatically end the underrun). BugLink: http://bugs.launchpad.net/bugs/805940 Signed-off-by: David Henningsson <david.henningsson@canonical.com>
This commit is contained in:
parent
00493a4ef0
commit
1893234063
6 changed files with 36 additions and 4 deletions
|
|
@ -169,6 +169,7 @@ struct pa_stream {
|
|||
/* playback */
|
||||
pa_memblock *write_memblock;
|
||||
void *write_data;
|
||||
int64_t latest_underrun_at_index;
|
||||
|
||||
/* recording */
|
||||
pa_memchunk peek_memchunk;
|
||||
|
|
|
|||
|
|
@ -180,6 +180,7 @@ static pa_stream *pa_stream_new_with_proplist_internal(
|
|||
s->timing_info_valid = FALSE;
|
||||
|
||||
s->previous_time = 0;
|
||||
s->latest_underrun_at_index = -1;
|
||||
|
||||
s->read_index_not_before = 0;
|
||||
s->write_index_not_before = 0;
|
||||
|
|
@ -843,10 +844,17 @@ finish:
|
|||
pa_context_unref(c);
|
||||
}
|
||||
|
||||
int64_t pa_stream_get_underflow_index(pa_stream *p)
|
||||
{
|
||||
pa_assert(p);
|
||||
return p->latest_underrun_at_index;
|
||||
}
|
||||
|
||||
void pa_command_overflow_or_underflow(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
|
||||
pa_stream *s;
|
||||
pa_context *c = userdata;
|
||||
uint32_t channel;
|
||||
int64_t offset = -1;
|
||||
|
||||
pa_assert(pd);
|
||||
pa_assert(command == PA_COMMAND_OVERFLOW || command == PA_COMMAND_UNDERFLOW);
|
||||
|
|
@ -856,8 +864,19 @@ void pa_command_overflow_or_underflow(pa_pdispatch *pd, uint32_t command, uint32
|
|||
|
||||
pa_context_ref(c);
|
||||
|
||||
if (pa_tagstruct_getu32(t, &channel) < 0 ||
|
||||
!pa_tagstruct_eof(t)) {
|
||||
if (pa_tagstruct_getu32(t, &channel) < 0) {
|
||||
pa_context_fail(c, PA_ERR_PROTOCOL);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
if (c->version >= 23 && command == PA_COMMAND_UNDERFLOW) {
|
||||
if (pa_tagstruct_gets64(t, &offset) < 0) {
|
||||
pa_context_fail(c, PA_ERR_PROTOCOL);
|
||||
goto finish;
|
||||
}
|
||||
}
|
||||
|
||||
if (!pa_tagstruct_eof(t)) {
|
||||
pa_context_fail(c, PA_ERR_PROTOCOL);
|
||||
goto finish;
|
||||
}
|
||||
|
|
@ -868,6 +887,9 @@ void pa_command_overflow_or_underflow(pa_pdispatch *pd, uint32_t command, uint32
|
|||
if (s->state != PA_STREAM_READY)
|
||||
goto finish;
|
||||
|
||||
if (offset != -1)
|
||||
s->latest_underrun_at_index = offset;
|
||||
|
||||
if (s->buffer_attr.prebuf > 0)
|
||||
check_smoother_status(s, TRUE, FALSE, TRUE);
|
||||
|
||||
|
|
|
|||
|
|
@ -570,6 +570,12 @@ void pa_stream_set_read_callback(pa_stream *p, pa_stream_request_cb_t cb, void *
|
|||
/** Set the callback function that is called when a buffer overflow happens. (Only for playback streams) */
|
||||
void pa_stream_set_overflow_callback(pa_stream *p, pa_stream_notify_cb_t cb, void *userdata);
|
||||
|
||||
/** Return at what position the latest underflow occurred, or -1 if this information is not
|
||||
* known (e g if no underflow has occurred, or server is older than 1.0).
|
||||
* Can be used inside the underflow callback to get information about the current underflow.
|
||||
* (Only for playback streams) \since 1.0 */
|
||||
int64_t pa_stream_get_underflow_index(pa_stream *p);
|
||||
|
||||
/** Set the callback function that is called when a buffer underflow happens. (Only for playback streams) */
|
||||
void pa_stream_set_underflow_callback(pa_stream *p, pa_stream_notify_cb_t cb, void *userdata);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue