From: George Kiagiadakis Date: Wed, 10 Jul 2019 15:07:13 +0000 (+0300) Subject: pipewire: update patches X-Git-Tag: 7.99.3~5 X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=commitdiff_plain;h=0bbd98e4f8e7fafa83cc389d9ded739696545fa1;p=AGL%2Fmeta-agl-devel.git pipewire: update patches 0004 adds a useful cli utility 0006 aids debugging 0007 fixes audio in qemu (SPEC-2570) 0008 & 0009 add functionality necessary for implementing multiple streams per device The rest is the same as before Bug-AGL: SPEC-2570 Change-Id: If6736f0fc87491edce6981c0be44094239ddaa89 Signed-off-by: George Kiagiadakis --- diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-spa-include-install-missing-headers.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-spa-include-install-missing-headers.patch index 01efe773..5b928117 100644 --- a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-spa-include-install-missing-headers.patch +++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-spa-include-install-missing-headers.patch @@ -1,8 +1,9 @@ -From 14893ae87ab0b15b7e438779433c4973c797c5f5 Mon Sep 17 00:00:00 2001 +From dbb6e10df8c2ba9b874eb9350d4cb93c62dba5a9 Mon Sep 17 00:00:00 2001 From: George Kiagiadakis Date: Wed, 29 May 2019 12:09:13 +0300 Subject: [PATCH] spa/include: install missing headers +Upstream-Status: Accepted --- spa/include/spa/meson.build | 3 +++ 1 file changed, 3 insertions(+) diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-extensions-implement-Endpoint-ClientEndpoint-interfa.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0002-extensions-implement-Endpoint-ClientEndpoint-interfa.patch similarity index 99% rename from meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-extensions-implement-Endpoint-ClientEndpoint-interfa.patch rename to meta-pipewire/recipes-multimedia/pipewire/pipewire/0002-extensions-implement-Endpoint-ClientEndpoint-interfa.patch index b78a9096..e49edf49 100644 --- a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-extensions-implement-Endpoint-ClientEndpoint-interfa.patch +++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0002-extensions-implement-Endpoint-ClientEndpoint-interfa.patch @@ -1,13 +1,14 @@ -From 3d186f7b97c508cc16955a96a69ee5d6c9db57dc Mon Sep 17 00:00:00 2001 +From 5afe82a430642c2f7e116941709a624b8fd73011 Mon Sep 17 00:00:00 2001 From: George Kiagiadakis Date: Thu, 23 May 2019 18:59:05 +0300 -Subject: [PATCH 1/2] extensions: implement Endpoint & ClientEndpoint - interfaces +Subject: [PATCH] extensions: implement Endpoint & ClientEndpoint interfaces The ClientEndpoint interface allows session managers to register endpoint objects on pipewire. The Endpoint interface allows other clients to interact with endpoints provided by the session manager. + +Upstream-Status: Pending --- src/extensions/client-endpoint.h | 106 ++++ src/extensions/endpoint.h | 237 +++++++++ @@ -141,7 +142,7 @@ index 00000000..0389893c +#endif /* PIPEWIRE_EXT_CLIENT_ENDPOINT_H */ diff --git a/src/extensions/endpoint.h b/src/extensions/endpoint.h new file mode 100644 -index 00000000..3b84dd49 +index 00000000..211c0895 --- /dev/null +++ b/src/extensions/endpoint.h @@ -0,0 +1,237 @@ @@ -231,7 +232,7 @@ index 00000000..3b84dd49 + { PW_ENDPOINT_PARAM_CONTROL_stream_id, SPA_TYPE_Int, PW_ENDPOINT_TYPE_INFO_PARAM_CONTROL_BASE "streamId", NULL }, + { PW_ENDPOINT_PARAM_CONTROL_name, SPA_TYPE_String, PW_ENDPOINT_TYPE_INFO_PARAM_CONTROL_BASE "name", NULL }, + { PW_ENDPOINT_PARAM_CONTROL_type, SPA_TYPE_Pod, PW_ENDPOINT_TYPE_INFO_PARAM_CONTROL_BASE "type", NULL }, -+ { PW_ENDPOINT_PARAM_CONTROL_value, SPA_TYPE_Struct, PW_ENDPOINT_TYPE_INFO_PARAM_CONTROL_BASE "labels", NULL }, ++ { PW_ENDPOINT_PARAM_CONTROL_value, SPA_TYPE_Struct, PW_ENDPOINT_TYPE_INFO_PARAM_CONTROL_BASE "value", NULL }, + { 0, 0, NULL, NULL }, +}; + diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0002-pipewire-cli-add-support-for-printing-endpoint-info-.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0003-pipewire-cli-add-support-for-printing-endpoint-info-.patch similarity index 96% rename from meta-pipewire/recipes-multimedia/pipewire/pipewire/0002-pipewire-cli-add-support-for-printing-endpoint-info-.patch rename to meta-pipewire/recipes-multimedia/pipewire/pipewire/0003-pipewire-cli-add-support-for-printing-endpoint-info-.patch index 008c15f9..a709abdf 100644 --- a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0002-pipewire-cli-add-support-for-printing-endpoint-info-.patch +++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0003-pipewire-cli-add-support-for-printing-endpoint-info-.patch @@ -1,12 +1,13 @@ -From e76140c534dde71424eb9abd1dde69cf14152da5 Mon Sep 17 00:00:00 2001 +From 0e9fe3cfb19c751655f16ce4b8c6100269f23ff2 Mon Sep 17 00:00:00 2001 From: George Kiagiadakis Date: Tue, 28 May 2019 11:46:36 +0300 -Subject: [PATCH 2/2] pipewire-cli: add support for printing endpoint info & - params +Subject: [PATCH] pipewire-cli: add support for printing endpoint info & params Note that you have to run: load-module libpipewire-module-endpoint before trying to query any endpoints + +Upstream-Status: Pending --- src/tools/pipewire-cli.c | 78 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 1 deletion(-) diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0004-pipewire-cli-add-command-to-modify-endpoint-control-.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0004-pipewire-cli-add-command-to-modify-endpoint-control-.patch new file mode 100644 index 00000000..4394d60d --- /dev/null +++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0004-pipewire-cli-add-command-to-modify-endpoint-control-.patch @@ -0,0 +1,124 @@ +From 824c8abf88e9ee82567c177145798b619298ab91 Mon Sep 17 00:00:00 2001 +From: George Kiagiadakis +Date: Wed, 5 Jun 2019 14:57:37 +0300 +Subject: [PATCH] pipewire-cli: add command to modify endpoint control values + +Upstream-Status: Pending +--- + src/tools/pipewire-cli.c | 86 ++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 86 insertions(+) + +diff --git a/src/tools/pipewire-cli.c b/src/tools/pipewire-cli.c +index 9511db82..b52ab100 100644 +--- a/src/tools/pipewire-cli.c ++++ b/src/tools/pipewire-cli.c +@@ -210,6 +210,7 @@ static bool do_export_node(struct data *data, const char *cmd, char *args, char + static bool do_enum_params(struct data *data, const char *cmd, char *args, char **error); + static bool do_permissions(struct data *data, const char *cmd, char *args, char **error); + static bool do_get_permissions(struct data *data, const char *cmd, char *args, char **error); ++static bool do_endpoint_control(struct data *data, const char *cmd, char *args, char **error); + + static struct command command_list[] = { + { "help", "Show this help", do_help }, +@@ -228,6 +229,7 @@ static struct command command_list[] = { + { "enum-params", "Enumerate params of an object []", do_enum_params }, + { "permissions", "Set permissions for a client ", do_permissions }, + { "get-permissions", "Get permissions of a client ", do_get_permissions }, ++ { "endpoint-control", "Set control value on an endpoint ", do_endpoint_control }, + }; + + static bool do_help(struct data *data, const char *cmd, char *args, char **error) +@@ -1357,6 +1359,90 @@ static bool do_get_permissions(struct data *data, const char *cmd, char *args, c + return true; + } + ++static bool do_endpoint_control(struct data *data, const char *cmd, char *args, char **error) ++{ ++ struct remote_data *rd = data->current; ++ int n; ++ char *a[4]; ++ uint32_t id, control_id; ++ struct global *global; ++ char buffer[1024]; ++ struct spa_pod_builder b; ++ struct spa_pod_frame f; ++ struct spa_pod *param; ++ ++ n = pw_split_ip(args, WHITESPACE, 4, a); ++ if (n < 4) { ++ asprintf(error, "%s ", cmd); ++ return false; ++ } ++ ++ id = atoi(a[0]); ++ global = pw_map_lookup(&rd->globals, id); ++ if (global == NULL) { ++ asprintf(error, "%s: unknown global %d", cmd, id); ++ return false; ++ } ++ if (global->type != PW_TYPE_INTERFACE_Endpoint) { ++ asprintf(error, "object %d is not an endpoint", atoi(a[0])); ++ return false; ++ } ++ if (global->proxy == NULL) { ++ if (!bind_global(rd, global, error)) ++ return false; ++ } ++ ++ control_id = atoi(a[1]); ++ ++ spa_pod_builder_init(&b, buffer, 1024); ++ spa_pod_builder_push_object (&b, &f, ++ PW_ENDPOINT_OBJECT_ParamControl, PW_ENDPOINT_PARAM_Control); ++ spa_pod_builder_add(&b, ++ PW_ENDPOINT_PARAM_CONTROL_id, SPA_POD_Int(control_id), ++ NULL); ++ ++ switch (*a[2]) { ++ case 'b': { ++ bool val = atoi(a[3]); ++ spa_pod_builder_add(&b, ++ PW_ENDPOINT_PARAM_CONTROL_value, SPA_POD_Bool(val), ++ NULL); ++ break; ++ } ++ case 'i': { ++ int val = atoi(a[3]); ++ spa_pod_builder_add(&b, ++ PW_ENDPOINT_PARAM_CONTROL_value, SPA_POD_Int(val), ++ NULL); ++ break; ++ } ++ case 'l': { ++ int64_t val = strtoll(a[3], NULL, 10); ++ spa_pod_builder_add(&b, ++ PW_ENDPOINT_PARAM_CONTROL_value, SPA_POD_Long(val), ++ NULL); ++ break; ++ } ++ case 'd': { ++ double val = strtod(a[3], NULL); ++ spa_pod_builder_add(&b, ++ PW_ENDPOINT_PARAM_CONTROL_value, SPA_POD_Double(val), ++ NULL); ++ break; ++ } ++ default: ++ asprintf(error, "%s: unknown value type %s", cmd, a[2]); ++ return false; ++ } ++ ++ param = spa_pod_builder_pop(&b, &f); ++ ++ pw_endpoint_proxy_set_param((struct pw_endpoint_proxy *) global->proxy, ++ PW_ENDPOINT_PARAM_Control, 0, param); ++ ++ return true; ++} ++ + static bool parse(struct data *data, char *buf, size_t size, char **error) + { + char *a[2]; +-- +2.20.1 + diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0004-arm-build-with-mno-unaligned-access.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0005-arm-build-with-mno-unaligned-access.patch similarity index 78% rename from meta-pipewire/recipes-multimedia/pipewire/pipewire/0004-arm-build-with-mno-unaligned-access.patch rename to meta-pipewire/recipes-multimedia/pipewire/pipewire/0005-arm-build-with-mno-unaligned-access.patch index d21af49f..a670e7ff 100644 --- a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0004-arm-build-with-mno-unaligned-access.patch +++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0005-arm-build-with-mno-unaligned-access.patch @@ -1,8 +1,10 @@ -From 4e1c70e9b4e8f3ece722f82d49b283a0c6ef0130 Mon Sep 17 00:00:00 2001 +From 2016605938f02835c75928648e99b25f7248aa5b Mon Sep 17 00:00:00 2001 From: George Kiagiadakis Date: Mon, 24 Jun 2019 12:19:20 +0300 Subject: [PATCH] arm: build with -mno-unaligned-access +Upstream-Status: Inappropriate [workaround] +See also https://github.com/PipeWire/pipewire/issues/161 --- meson.build | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0006-logger-print-timestamps-on-logged-messages.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0006-logger-print-timestamps-on-logged-messages.patch new file mode 100644 index 00000000..4d9117f0 --- /dev/null +++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0006-logger-print-timestamps-on-logged-messages.patch @@ -0,0 +1,52 @@ +From 352c58357e5922b21d664c1f5a0b89a74f864f41 Mon Sep 17 00:00:00 2001 +From: George Kiagiadakis +Date: Wed, 3 Jul 2019 17:47:46 +0300 +Subject: [PATCH] logger: print timestamps on logged messages + +Timestamps have usec precision and the seconds are limited +to 9 digits. Usually what matters in these messages is to spot +delays between printouts and not really what is the absolute +time of the system. + +Upstream-Status: Submitted [https://github.com/PipeWire/pipewire/pull/164] +--- + spa/plugins/support/logger.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/spa/plugins/support/logger.c b/spa/plugins/support/logger.c +index 87ba3c21..2976601c 100644 +--- a/spa/plugins/support/logger.c ++++ b/spa/plugins/support/logger.c +@@ -27,6 +27,7 @@ + #include + #include + #include ++#include + #include + + #include +@@ -70,6 +71,9 @@ impl_log_logv(struct spa_log *log, + const char *prefix = "", *suffix = ""; + int size; + bool do_trace; ++ struct timespec now; ++ ++ clock_gettime(CLOCK_MONOTONIC_RAW, &now); + + if ((do_trace = (level == SPA_LOG_LEVEL_TRACE && impl->have_source))) + level++; +@@ -86,8 +90,9 @@ impl_log_logv(struct spa_log *log, + } + + vsnprintf(text, sizeof(text), fmt, args); +- size = snprintf(location, sizeof(location), "%s[%s][%s:%i %s()] %s%s\n", +- prefix, levels[level], strrchr(file, '/') + 1, line, func, text, suffix); ++ size = snprintf(location, sizeof(location), "%s[%s][%09lu.%06lu][%s:%i %s()] %s%s\n", ++ prefix, levels[level], now.tv_sec & 0x1FFFFFFF, now.tv_nsec / 1000, ++ strrchr(file, '/') + 1, line, func, text, suffix); + + if (SPA_UNLIKELY(do_trace)) { + uint32_t index; +-- +2.20.1 + diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0007-alsa-make-corrections-on-the-timeout-based-on-how-fa.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0007-alsa-make-corrections-on-the-timeout-based-on-how-fa.patch new file mode 100644 index 00000000..86495014 --- /dev/null +++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0007-alsa-make-corrections-on-the-timeout-based-on-how-fa.patch @@ -0,0 +1,130 @@ +From 05a3a926df4906cdf60f7978843c637bbf37714a Mon Sep 17 00:00:00 2001 +From: George Kiagiadakis +Date: Tue, 9 Jul 2019 18:06:18 +0300 +Subject: [PATCH] alsa: make corrections on the timeout based on how fast ALSA + consumes samples + +This feels a bit hacky, but it actually makes huge difference when pipewire is +running in qemu. + +The idea is that it keeps track of how much samples are in the device +(fill level) and calculates how many are consumed when a timeout occurs. +Then it converts that into a time based on the sample rate and compares it to +the system clock time that elapsed since the last write to the device. +The division between the two gives a rate (drift) that can be used to shorten +the timeout window. + +So for instance, if the timeout window was 21.3 ms, but the device actually +consumed an equivalent of 28 ms in samples, the drift will be 21.3/28 = 0.76 +and the next timeout window will be approximately 21.3 * 0.76 = 16.1 ms + +To avoid making things worse, the drift is clamped between 0.6 and 1.0. +Min 0.6 was arbitrarily chosen, but sometimes alsa does report strange numbers, +causing the drift to be very low, which in turn causes an early wakeup. +Max 1.0 basically means that we don't care if the device is consuming samples +slower. In that case, the early wakeup mechanism will throttle pipewire. + +Fixes #163 + +Upstream-Status: Submitted [https://github.com/PipeWire/pipewire/pull/166] +--- + spa/plugins/alsa/alsa-utils.c | 31 ++++++++++++++++++++++++++----- + spa/plugins/alsa/alsa-utils.h | 2 ++ + 2 files changed, 28 insertions(+), 5 deletions(-) + +diff --git a/spa/plugins/alsa/alsa-utils.c b/spa/plugins/alsa/alsa-utils.c +index 87582c1c..872969bf 100644 +--- a/spa/plugins/alsa/alsa-utils.c ++++ b/spa/plugins/alsa/alsa-utils.c +@@ -593,7 +593,21 @@ static int get_status(struct state *state, snd_pcm_sframes_t *delay) + + static int update_time(struct state *state, uint64_t nsec, snd_pcm_sframes_t delay, bool slave) + { +- double err, corr; ++ double err, corr, drift; ++ snd_pcm_sframes_t consumed; ++ ++ consumed = state->fill_level - delay; ++ if (state->alsa_started && consumed > 0) { ++ double sysclk_diff = nsec - state->last_time; ++ double devclk_diff = ((double) consumed) * 1e9 / state->rate; ++ drift = sysclk_diff / devclk_diff; ++ drift = SPA_CLAMP(drift, 0.6, 1.0); ++ ++ spa_log_trace_fp(state->log, "cons:%ld sclk:%f dclk:%f drift:%f", ++ consumed, sysclk_diff, devclk_diff, drift); ++ } else { ++ drift = 1.0; ++ } + + if (state->stream == SND_PCM_STREAM_PLAYBACK) + err = delay - state->last_threshold; +@@ -650,11 +664,11 @@ static int update_time(struct state *state, uint64_t nsec, snd_pcm_sframes_t del + state->clock->rate_diff = corr; + } + +- spa_log_trace_fp(state->log, "slave:%d %"PRIu64" %f %ld %f %f %d", slave, nsec, +- corr, delay, err, state->threshold * corr, ++ spa_log_trace_fp(state->log, "slave:%d %"PRIu64" %f %ld %f %f %f %d", slave, nsec, ++ corr, delay, err, state->threshold * corr, drift, + state->threshold); + +- state->next_time += state->threshold / corr * 1e9 / state->rate; ++ state->next_time += state->threshold / corr * drift * 1e9 / state->rate; + state->last_threshold = state->threshold; + + return 0; +@@ -783,6 +797,10 @@ again: + goto again; + + state->sample_count += total_written; ++ state->fill_level += total_written; ++ ++ clock_gettime(CLOCK_MONOTONIC, &state->now); ++ state->last_time = SPA_TIMESPEC_TO_NSEC (&state->now); + + if (!state->alsa_started && total_written > 0) { + spa_log_trace(state->log, "snd_pcm_start %lu", written); +@@ -935,7 +953,7 @@ static int handle_play(struct state *state, uint64_t nsec, snd_pcm_sframes_t del + { + int res; + +- if (delay >= state->last_threshold * 2) { ++ if (delay > state->last_threshold * 2) { + spa_log_trace(state->log, "early wakeup %ld %d", delay, state->threshold); + state->next_time = nsec + (delay - state->last_threshold) * SPA_NSEC_PER_SEC / state->rate; + return -EAGAIN; +@@ -944,6 +962,8 @@ static int handle_play(struct state *state, uint64_t nsec, snd_pcm_sframes_t del + if ((res = update_time(state, nsec, delay, false)) < 0) + return res; + ++ state->fill_level = delay; ++ + if (spa_list_is_empty(&state->ready)) { + struct spa_io_buffers *io = state->io; + +@@ -1072,6 +1092,7 @@ int spa_alsa_start(struct state *state) + + state->slaved = is_slaved(state); + state->last_threshold = state->threshold; ++ state->fill_level = 0; + + init_loop(state); + state->safety = 0.0; +diff --git a/spa/plugins/alsa/alsa-utils.h b/spa/plugins/alsa/alsa-utils.h +index a862873f..b53890b5 100644 +--- a/spa/plugins/alsa/alsa-utils.h ++++ b/spa/plugins/alsa/alsa-utils.h +@@ -134,7 +134,9 @@ struct state { + int64_t sample_time; + uint64_t next_time; + uint64_t base_time; ++ uint64_t last_time; + ++ snd_pcm_uframes_t fill_level; + uint64_t underrun; + double safety; + +-- +2.20.1 + diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0008-audio-dsp-allow-mode-to-be-set-with-a-property.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0008-audio-dsp-allow-mode-to-be-set-with-a-property.patch new file mode 100644 index 00000000..681bae69 --- /dev/null +++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0008-audio-dsp-allow-mode-to-be-set-with-a-property.patch @@ -0,0 +1,45 @@ +From 0c85e1110e32720785f861c7a85cf0636394eee4 Mon Sep 17 00:00:00 2001 +From: Julian Bouzas +Date: Thu, 27 Jun 2019 12:44:39 -0400 +Subject: [PATCH] audio-dsp: allow mode to be set with a property + +Upstream-Status: Submitted [https://github.com/PipeWire/pipewire/pull/167] +--- + src/modules/module-audio-dsp/audio-dsp.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/src/modules/module-audio-dsp/audio-dsp.c b/src/modules/module-audio-dsp/audio-dsp.c +index be8a7592..68249307 100644 +--- a/src/modules/module-audio-dsp/audio-dsp.c ++++ b/src/modules/module-audio-dsp/audio-dsp.c +@@ -264,7 +264,7 @@ struct pw_node *pw_audio_dsp_new(struct pw_core *core, + { + struct pw_node *node; + struct node *n; +- const char *api, *alias, *str, *factory; ++ const char *api, *alias, *str, *factory, *mode; + char node_name[128]; + struct pw_properties *pr; + int i; +@@ -279,6 +279,7 @@ struct pw_node *pw_audio_dsp_new(struct pw_core *core, + pw_log_error("missing audio-dsp.name property"); + goto error; + } ++ mode = pw_properties_get(pr, "audio-dsp.mode"); + + snprintf(node_name, sizeof(node_name), "system_%s", alias); + for (i = 0; node_name[i]; i++) { +@@ -296,7 +297,9 @@ struct pw_node *pw_audio_dsp_new(struct pw_core *core, + if ((str = pw_properties_get(pr, "node.id")) != NULL) + pw_properties_set(pr, "node.session", str); + +- if (direction == PW_DIRECTION_OUTPUT) { ++ if (mode) { ++ factory = mode; ++ } else if (direction == PW_DIRECTION_OUTPUT) { + pw_properties_set(pr, "merger.monitor", "1"); + factory = "merge"; + } else { +-- +2.20.1 + diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0009-audioconvert-do-setup-internal-links-and-buffers-als.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0009-audioconvert-do-setup-internal-links-and-buffers-als.patch new file mode 100644 index 00000000..87141e91 --- /dev/null +++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0009-audioconvert-do-setup-internal-links-and-buffers-als.patch @@ -0,0 +1,55 @@ +From ddcda9fa6ec49168c5ddd9fbeda748c5fad18fce Mon Sep 17 00:00:00 2001 +From: George Kiagiadakis +Date: Wed, 10 Jul 2019 14:53:15 +0300 +Subject: [PATCH] audioconvert: do setup internal links and buffers also in + convert mode + +Upstream-Status: Submitted [https://github.com/PipeWire/pipewire/pull/167] +--- + spa/plugins/audioconvert/audioconvert.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/spa/plugins/audioconvert/audioconvert.c b/spa/plugins/audioconvert/audioconvert.c +index fa8dec97..0af0732d 100644 +--- a/spa/plugins/audioconvert/audioconvert.c ++++ b/spa/plugins/audioconvert/audioconvert.c +@@ -79,6 +79,8 @@ struct impl { + #define MODE_MERGE 1 + #define MODE_CONVERT 2 + int mode; ++ bool fmt_is_set[2]; ++ bool buffers_set[2]; + bool started; + + struct spa_handle *hnd_fmt[2]; +@@ -791,11 +793,11 @@ impl_node_port_set_param(struct spa_node *node, + if (id == SPA_PARAM_Format) { + if (param == NULL) + clean_convert(this); +- else if ((direction == SPA_DIRECTION_OUTPUT && this->mode == MODE_MERGE) || +- (direction == SPA_DIRECTION_INPUT && this->mode == MODE_SPLIT)) { ++ else if (this->fmt_is_set[SPA_DIRECTION_REVERSE(direction)]) { + if ((res = setup_convert(this)) < 0) + return res; + } ++ this->fmt_is_set[direction] = (param != NULL); + } + return res; + } +@@ -824,11 +826,11 @@ impl_node_port_use_buffers(struct spa_node *node, + direction, port_id, buffers, n_buffers)) < 0) + return res; + +- if ((direction == SPA_DIRECTION_OUTPUT && this->mode == MODE_MERGE) || +- (direction == SPA_DIRECTION_INPUT && this->mode == MODE_SPLIT)) { ++ if (buffers && this->buffers_set[SPA_DIRECTION_REVERSE(direction)]) { + if ((res = setup_buffers(this, SPA_DIRECTION_INPUT)) < 0) + return res; + } ++ this->buffers_set[direction] = (buffers != NULL); + return res; + } + +-- +2.20.1 + diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire_git.bb b/meta-pipewire/recipes-multimedia/pipewire/pipewire_git.bb index a9680047..dd1eebcc 100644 --- a/meta-pipewire/recipes-multimedia/pipewire/pipewire_git.bb +++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire_git.bb @@ -2,9 +2,14 @@ require pipewire.inc SRC_URI = "gitsm://github.com/PipeWire/pipewire;protocol=https;branch=work \ file://0001-spa-include-install-missing-headers.patch \ - file://0001-extensions-implement-Endpoint-ClientEndpoint-interfa.patch \ - file://0002-pipewire-cli-add-support-for-printing-endpoint-info-.patch \ - file://0004-arm-build-with-mno-unaligned-access.patch \ + file://0002-extensions-implement-Endpoint-ClientEndpoint-interfa.patch \ + file://0003-pipewire-cli-add-support-for-printing-endpoint-info-.patch \ + file://0004-pipewire-cli-add-command-to-modify-endpoint-control-.patch \ + file://0005-arm-build-with-mno-unaligned-access.patch \ + file://0006-logger-print-timestamps-on-logged-messages.patch \ + file://0007-alsa-make-corrections-on-the-timeout-based-on-how-fa.patch \ + file://0008-audio-dsp-allow-mode-to-be-set-with-a-property.patch \ + file://0009-audioconvert-do-setup-internal-links-and-buffers-als.patch \ " SRCREV = "4be788962e60891237f1f018627bf709ae3981e6"