mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-03 09:01:50 -05:00
fix up latency before calling into stream code, to make sure we don't ask for too much data to early
This commit is contained in:
parent
63505bee07
commit
450fe170a5
4 changed files with 16 additions and 13 deletions
|
|
@ -756,14 +756,11 @@ pa_usec_t pa_sink_input_set_requested_latency(pa_sink_input *i, pa_usec_t usec)
|
||||||
|
|
||||||
if (PA_SINK_INPUT_IS_LINKED(i->state))
|
if (PA_SINK_INPUT_IS_LINKED(i->state))
|
||||||
pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_REQUESTED_LATENCY, &usec, 0, NULL) == 0);
|
pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_REQUESTED_LATENCY, &usec, 0, NULL) == 0);
|
||||||
else {
|
else
|
||||||
/* If this sink input is not realized yet, we have to touch
|
/* If this sink input is not realized yet, we have to touch
|
||||||
* the thread info data directly */
|
* the thread info data directly */
|
||||||
|
|
||||||
usec = fixup_latency(i->sink, usec);
|
|
||||||
i->thread_info.requested_sink_latency = usec;
|
i->thread_info.requested_sink_latency = usec;
|
||||||
i->sink->thread_info.requested_latency_valid = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return usec;
|
return usec;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1042,11 +1042,15 @@ int pa_sink_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offse
|
||||||
|
|
||||||
pa_sink_input_set_state_within_thread(i, i->state);
|
pa_sink_input_set_state_within_thread(i, i->state);
|
||||||
|
|
||||||
|
/* The requested latency of the sink input needs to be
|
||||||
|
* fixed up and then configured on the sink */
|
||||||
|
|
||||||
|
if (i->thread_info.requested_sink_latency != (pa_usec_t) -1)
|
||||||
|
pa_sink_input_set_requested_latency_within_thread(i, i->thread_info.requested_sink_latency);
|
||||||
|
|
||||||
pa_sink_input_update_max_rewind(i, s->thread_info.max_rewind);
|
pa_sink_input_update_max_rewind(i, s->thread_info.max_rewind);
|
||||||
pa_sink_input_update_max_request(i, s->thread_info.max_request);
|
pa_sink_input_update_max_request(i, s->thread_info.max_request);
|
||||||
|
|
||||||
pa_sink_invalidate_requested_latency(s);
|
|
||||||
|
|
||||||
/* We don't rewind here automatically. This is left to the
|
/* We don't rewind here automatically. This is left to the
|
||||||
* sink input implementor because some sink inputs need a
|
* sink input implementor because some sink inputs need a
|
||||||
* slow start, i.e. need some time to buffer client
|
* slow start, i.e. need some time to buffer client
|
||||||
|
|
@ -1158,11 +1162,12 @@ int pa_sink_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offse
|
||||||
if (i->attach)
|
if (i->attach)
|
||||||
i->attach(i);
|
i->attach(i);
|
||||||
|
|
||||||
|
if (i->thread_info.requested_sink_latency != (pa_usec_t) -1)
|
||||||
|
pa_sink_input_set_requested_latency_within_thread(i, i->thread_info.requested_sink_latency);
|
||||||
|
|
||||||
pa_sink_input_update_max_rewind(i, s->thread_info.max_rewind);
|
pa_sink_input_update_max_rewind(i, s->thread_info.max_rewind);
|
||||||
pa_sink_input_update_max_request(i, s->thread_info.max_request);
|
pa_sink_input_update_max_request(i, s->thread_info.max_request);
|
||||||
|
|
||||||
pa_sink_input_set_requested_latency_within_thread(i, i->thread_info.requested_sink_latency);
|
|
||||||
|
|
||||||
if (i->thread_info.state != PA_SINK_INPUT_CORKED) {
|
if (i->thread_info.state != PA_SINK_INPUT_CORKED) {
|
||||||
pa_usec_t usec = 0;
|
pa_usec_t usec = 0;
|
||||||
size_t nbytes;
|
size_t nbytes;
|
||||||
|
|
@ -1424,7 +1429,6 @@ void pa_sink_set_max_rewind(pa_sink *s, size_t max_rewind) {
|
||||||
|
|
||||||
/* Called from IO thread */
|
/* Called from IO thread */
|
||||||
void pa_sink_set_max_request(pa_sink *s, size_t max_request) {
|
void pa_sink_set_max_request(pa_sink *s, size_t max_request) {
|
||||||
pa_sink_input *i;
|
|
||||||
void *state = NULL;
|
void *state = NULL;
|
||||||
|
|
||||||
pa_sink_assert_ref(s);
|
pa_sink_assert_ref(s);
|
||||||
|
|
@ -1435,6 +1439,8 @@ void pa_sink_set_max_request(pa_sink *s, size_t max_request) {
|
||||||
s->thread_info.max_request = max_request;
|
s->thread_info.max_request = max_request;
|
||||||
|
|
||||||
if (PA_SINK_IS_LINKED(s->thread_info.state)) {
|
if (PA_SINK_IS_LINKED(s->thread_info.state)) {
|
||||||
|
pa_sink_input *i;
|
||||||
|
|
||||||
while ((i = pa_hashmap_iterate(s->thread_info.inputs, &state, NULL)))
|
while ((i = pa_hashmap_iterate(s->thread_info.inputs, &state, NULL)))
|
||||||
pa_sink_input_update_max_request(i, s->thread_info.max_request);
|
pa_sink_input_update_max_request(i, s->thread_info.max_request);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -511,14 +511,11 @@ pa_usec_t pa_source_output_set_requested_latency(pa_source_output *o, pa_usec_t
|
||||||
|
|
||||||
if (PA_SOURCE_OUTPUT_IS_LINKED(o->state))
|
if (PA_SOURCE_OUTPUT_IS_LINKED(o->state))
|
||||||
pa_assert_se(pa_asyncmsgq_send(o->source->asyncmsgq, PA_MSGOBJECT(o), PA_SOURCE_OUTPUT_MESSAGE_SET_REQUESTED_LATENCY, &usec, 0, NULL) == 0);
|
pa_assert_se(pa_asyncmsgq_send(o->source->asyncmsgq, PA_MSGOBJECT(o), PA_SOURCE_OUTPUT_MESSAGE_SET_REQUESTED_LATENCY, &usec, 0, NULL) == 0);
|
||||||
else {
|
else
|
||||||
/* If this source output is not realized yet, we have to touch
|
/* If this source output is not realized yet, we have to touch
|
||||||
* the thread info data directly */
|
* the thread info data directly */
|
||||||
|
|
||||||
usec = fixup_latency(o->source, usec);
|
|
||||||
o->thread_info.requested_source_latency = usec;
|
o->thread_info.requested_source_latency = usec;
|
||||||
o->source->thread_info.requested_latency_valid = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return usec;
|
return usec;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -670,6 +670,9 @@ int pa_source_process_msg(pa_msgobject *object, int code, void *userdata, int64_
|
||||||
|
|
||||||
pa_source_output_set_state_within_thread(o, o->state);
|
pa_source_output_set_state_within_thread(o, o->state);
|
||||||
|
|
||||||
|
if (o->thread_info.requested_source_latency != (pa_usec_t) -1)
|
||||||
|
pa_source_output_set_requested_latency_within_thread(o, o->thread_info.requested_source_latency);
|
||||||
|
|
||||||
pa_source_output_update_max_rewind(o, s->thread_info.max_rewind);
|
pa_source_output_update_max_rewind(o, s->thread_info.max_rewind);
|
||||||
|
|
||||||
/* We don't just invalidate the requested latency here,
|
/* We don't just invalidate the requested latency here,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue