aboutsummaryrefslogtreecommitdiffstats
path: root/meta-pipewire/recipes-multimedia
diff options
context:
space:
mode:
authorGeorge Kiagiadakis <george.kiagiadakis@collabora.com>2019-07-10 18:07:13 +0300
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>2019-07-12 12:49:22 +0000
commit0bbd98e4f8e7fafa83cc389d9ded739696545fa1 (patch)
tree8713a78551c37cb3d614786197b85ac3d9edaf14 /meta-pipewire/recipes-multimedia
parent245d048ecc1861aee6a4a0e78a0769e789ab3f79 (diff)
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 <george.kiagiadakis@collabora.com>
Diffstat (limited to 'meta-pipewire/recipes-multimedia')
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-spa-include-install-missing-headers.patch3
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0002-extensions-implement-Endpoint-ClientEndpoint-interfa.patch (renamed from meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-extensions-implement-Endpoint-ClientEndpoint-interfa.patch)11
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0003-pipewire-cli-add-support-for-printing-endpoint-info-.patch (renamed from meta-pipewire/recipes-multimedia/pipewire/pipewire/0002-pipewire-cli-add-support-for-printing-endpoint-info-.patch)7
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0004-pipewire-cli-add-command-to-modify-endpoint-control-.patch124
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0005-arm-build-with-mno-unaligned-access.patch (renamed from meta-pipewire/recipes-multimedia/pipewire/pipewire/0004-arm-build-with-mno-unaligned-access.patch)4
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0006-logger-print-timestamps-on-logged-messages.patch52
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0007-alsa-make-corrections-on-the-timeout-based-on-how-fa.patch130
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0008-audio-dsp-allow-mode-to-be-set-with-a-property.patch45
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0009-audioconvert-do-setup-internal-links-and-buffers-als.patch55
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire_git.bb11
10 files changed, 429 insertions, 13 deletions
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 <george.kiagiadakis@collabora.com>
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
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 <george.kiagiadakis@collabora.com>
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
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 <george.kiagiadakis@collabora.com>
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 <george.kiagiadakis@collabora.com>
+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 <object-id> [<param-id-name>]", do_enum_params },
+ { "permissions", "Set permissions for a client <client-id> <permissions>", do_permissions },
+ { "get-permissions", "Get permissions of a client <client-id>", do_get_permissions },
++ { "endpoint-control", "Set control value on an endpoint <object-id> <control-id> <type: b|i|l|d> <value>", 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 <object-id> <control-id> <type: b|i|l|d> <value>", 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
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 <george.kiagiadakis@collabora.com>
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 <george.kiagiadakis@collabora.com>
+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 <string.h>
+ #include <errno.h>
+ #include <stdio.h>
++#include <time.h>
+ #include <sys/eventfd.h>
+
+ #include <spa/support/log.h>
+@@ -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 <george.kiagiadakis@collabora.com>
+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 <julian.bouzas@collabora.com>
+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 <george.kiagiadakis@collabora.com>
+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"