mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04:00
modules: Propagate the combine latency
When we get latency on the combine stream, forward it to all streams after setting the per stream compensate latency (if any). See #4731
This commit is contained in:
parent
549f3fc46f
commit
4c1be71773
1 changed files with 41 additions and 3 deletions
|
|
@ -319,6 +319,7 @@ struct stream {
|
||||||
|
|
||||||
int64_t delay_samples; /* for main loop */
|
int64_t delay_samples; /* for main loop */
|
||||||
int64_t data_delay_samples; /* for data loop */
|
int64_t data_delay_samples; /* for data loop */
|
||||||
|
int64_t compensate_samples; /* for main loop */
|
||||||
|
|
||||||
unsigned int ready:1;
|
unsigned int ready:1;
|
||||||
unsigned int added:1;
|
unsigned int added:1;
|
||||||
|
|
@ -574,6 +575,7 @@ static void update_delay(struct impl *impl)
|
||||||
|
|
||||||
max_delay = SPA_MAX(max_delay, delay);
|
max_delay = SPA_MAX(max_delay, delay);
|
||||||
s->delay_samples = delay;
|
s->delay_samples = delay;
|
||||||
|
s->compensate_samples = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
spa_list_for_each(s, &impl->streams, link) {
|
spa_list_for_each(s, &impl->streams, link) {
|
||||||
|
|
@ -581,9 +583,9 @@ static void update_delay(struct impl *impl)
|
||||||
|
|
||||||
if (s->delay_samples != INT64_MIN) {
|
if (s->delay_samples != INT64_MIN) {
|
||||||
int64_t delay = max_delay - s->delay_samples;
|
int64_t delay = max_delay - s->delay_samples;
|
||||||
|
s->compensate_samples = delay;
|
||||||
size = delay * sizeof(float);
|
size = delay * sizeof(float);
|
||||||
}
|
}
|
||||||
|
|
||||||
resize_delay(s, size);
|
resize_delay(s, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -653,6 +655,40 @@ static void param_tag_changed(struct impl *impl, const struct spa_pod *param)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void param_latency_changed(struct impl *impl, const struct spa_pod *param)
|
||||||
|
{
|
||||||
|
if (param == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
pw_log_debug("latency update");
|
||||||
|
struct stream *s;
|
||||||
|
struct spa_latency_info info;
|
||||||
|
const struct spa_pod *params[1];
|
||||||
|
|
||||||
|
if (spa_latency_parse(param, &info) < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
spa_list_for_each(s, &impl->streams, link) {
|
||||||
|
uint8_t buffer[1024];
|
||||||
|
struct spa_pod_builder b;
|
||||||
|
|
||||||
|
if (s->stream == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
pw_log_debug("updating stream %d", s->id);
|
||||||
|
if (impl->latency_compensate) {
|
||||||
|
struct spa_latency_info other = info;
|
||||||
|
other.min_rate += s->compensate_samples;
|
||||||
|
other.max_rate += s->compensate_samples;
|
||||||
|
spa_pod_builder_init(&b, buffer, sizeof(buffer));
|
||||||
|
params[0] = spa_latency_build(&b, SPA_PARAM_Latency, &other);
|
||||||
|
} else {
|
||||||
|
params[0] = param;
|
||||||
|
}
|
||||||
|
pw_stream_update_params(s->stream, params, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int do_remove_stream(struct spa_loop *loop, bool async, uint32_t seq,
|
static int do_remove_stream(struct spa_loop *loop, bool async, uint32_t seq,
|
||||||
const void *data, size_t size, void *user_data)
|
const void *data, size_t size, void *user_data)
|
||||||
{
|
{
|
||||||
|
|
@ -1299,10 +1335,12 @@ static void combine_param_changed(void *d, uint32_t id, const struct spa_pod *pa
|
||||||
update_latency(impl);
|
update_latency(impl);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SPA_PARAM_Tag: {
|
case SPA_PARAM_Tag:
|
||||||
param_tag_changed(impl, param);
|
param_tag_changed(impl, param);
|
||||||
break;
|
break;
|
||||||
}
|
case SPA_PARAM_Latency:
|
||||||
|
param_latency_changed(impl, param);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue