summaryrefslogtreecommitdiffstats
path: root/meta-pipewire/recipes-multimedia/pipewire/pipewire/0016-protocol-improve-flushing.patch
diff options
context:
space:
mode:
authorGeorge Kiagiadakis <george.kiagiadakis@collabora.com>2019-10-07 18:28:10 +0300
committerGeorge Kiagiadakis <george.kiagiadakis@collabora.com>2019-10-07 18:28:10 +0300
commita349a7d85434679a7d62fe5affe7074c33f0cb8a (patch)
treec2c80d2e61740de2131b126af003a49d219f3a44 /meta-pipewire/recipes-multimedia/pipewire/pipewire/0016-protocol-improve-flushing.patch
parentc5b99b7e8608c1201293d84ba06e4a3ca501d9e8 (diff)
pipewire: update to latest master
Update patches: * remove merged patches * remove the alsa algorithm correction that was needed for qemu, as it seems to cause severe underruns on other platforms now; I will recheck qemu to see if this is still an issue * add a workaround needed to get the audioconvert plugin running in merge+split mode (needed to get all the channels out instead of just the front left channel that we were getting before) Update version to 0.2.91 to reflect the fact that we are now tracking the master branch instead of the work branch. Enable the spa audiomixer plugin which is now required to mix audio on ports Bug-AGL: SPEC-2837 Change-Id: I2558aa5487b9c9918e077bf450230c143abf7e6c Signed-off-by: George Kiagiadakis <george.kiagiadakis@collabora.com>
Diffstat (limited to 'meta-pipewire/recipes-multimedia/pipewire/pipewire/0016-protocol-improve-flushing.patch')
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0016-protocol-improve-flushing.patch243
1 files changed, 0 insertions, 243 deletions
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0016-protocol-improve-flushing.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0016-protocol-improve-flushing.patch
deleted file mode 100644
index 124434e2..00000000
--- a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0016-protocol-improve-flushing.patch
+++ /dev/null
@@ -1,243 +0,0 @@
-From dffeeeb74f5b0a0385c4131b7ff349ff04fcebce Mon Sep 17 00:00:00 2001
-From: Wim Taymans <wtaymans@redhat.com>
-Date: Tue, 1 Oct 2019 12:53:56 +0200
-Subject: [PATCH] protocol: improve flushing
-
-Use the IO_OUT flag to schedule flushing instead of a flush_event.
-
-Handle EGAIN and wait for IO_OUT to try again.
-
-Fixes #111
-
-Upstream-Status: Backport [cc8e992cd155b4f19312a5036c7b744fc547410f]
----
- src/modules/module-protocol-native.c | 99 ++++++++++++-------
- .../module-protocol-native/connection.c | 2 -
- 2 files changed, 62 insertions(+), 39 deletions(-)
-
-diff --git a/src/modules/module-protocol-native.c b/src/modules/module-protocol-native.c
-index cc8501d5..be2d4f57 100644
---- a/src/modules/module-protocol-native.c
-+++ b/src/modules/module-protocol-native.c
-@@ -82,9 +82,8 @@ struct client {
- struct pw_protocol_native_connection *connection;
- struct spa_hook conn_listener;
-
-- struct spa_source *flush_event;
- unsigned int disconnecting:1;
-- unsigned int flush_signaled:1;
-+ unsigned int flushing:1;
- };
-
- struct server {
-@@ -106,6 +105,7 @@ struct client_data {
- struct spa_source *source;
- struct pw_protocol_native_connection *connection;
- unsigned int busy:1;
-+ unsigned int need_flush:1;
- };
-
- static void
-@@ -200,12 +200,14 @@ client_busy_changed(void *data, bool busy)
- {
- struct client_data *c = data;
- struct pw_client *client = c->client;
-- uint32_t mask = SPA_IO_ERR | SPA_IO_HUP;
-+ uint32_t mask = c->source->mask;
-
- c->busy = busy;
-
-- if (!busy)
-- mask |= SPA_IO_IN;
-+ if (busy)
-+ SPA_FLAG_UNSET(mask, SPA_IO_IN);
-+ else
-+ SPA_FLAG_SET(mask, SPA_IO_IN);
-
- pw_log_debug(NAME" %p: busy changed %d", client->protocol, busy);
- pw_loop_update_io(client->core->main_loop, c->source, mask);
-@@ -220,13 +222,32 @@ connection_data(void *data, int fd, uint32_t mask)
- {
- struct client_data *this = data;
- struct pw_client *client = this->client;
-+ int res;
-
-- if (mask & (SPA_IO_ERR | SPA_IO_HUP)) {
-+ if (mask & SPA_IO_HUP) {
- pw_log_info(NAME" %p: client %p disconnected", client->protocol, client);
- pw_client_destroy(client);
- return;
- }
--
-+ if (mask & SPA_IO_ERR) {
-+ pw_log_error(NAME" %p: client %p error", client->protocol, client);
-+ pw_client_destroy(client);
-+ return;
-+ }
-+ if (mask & SPA_IO_OUT) {
-+ res = pw_protocol_native_connection_flush(this->connection);
-+ if (res >= 0) {
-+ int mask = this->source->mask;
-+ SPA_FLAG_UNSET(mask, SPA_IO_OUT);
-+ pw_loop_update_io(client->protocol->core->main_loop,
-+ this->source, mask);
-+ } else if (res != EAGAIN) {
-+ pw_log_error("client %p: could not flush: %s",
-+ client, spa_strerror(res));
-+ pw_client_destroy(client);
-+ return;
-+ }
-+ }
- if (mask & SPA_IO_IN)
- process_messages(this);
- }
-@@ -296,7 +317,8 @@ static struct pw_client *client_new(struct server *s, int fd)
-
- this->client = client;
- this->source = pw_loop_add_io(pw_core_get_main_loop(core),
-- fd, SPA_IO_ERR | SPA_IO_HUP, true, connection_data, this);
-+ fd, SPA_IO_ERR | SPA_IO_HUP, true,
-+ connection_data, this);
- if (this->source == NULL)
- goto cleanup_client;
-
-@@ -408,7 +430,7 @@ socket_data(void *data, int fd, uint32_t mask)
-
- if (!client->busy)
- pw_loop_update_io(client->protocol->core->main_loop,
-- c->source, SPA_IO_IN | SPA_IO_ERR | SPA_IO_HUP);
-+ c->source, c->source->mask | SPA_IO_IN);
- }
-
- static int add_socket(struct pw_protocol *protocol, struct server *s)
-@@ -514,6 +536,17 @@ on_remote_data(void *data, int fd, uint32_t mask)
- res = -EPIPE;
- goto error;
- }
-+ if (mask & SPA_IO_OUT) {
-+ res = pw_protocol_native_connection_flush(conn);
-+ if (res >= 0) {
-+ int mask = impl->source->mask;
-+ SPA_FLAG_UNSET(mask, SPA_IO_OUT);
-+ pw_loop_update_io(core->main_loop,
-+ impl->source, mask);
-+ impl->flushing = false;
-+ } else if (res != EAGAIN)
-+ goto error;
-+ }
-
- if (mask & SPA_IO_IN) {
- const struct pw_protocol_native_message *msg;
-@@ -588,23 +621,17 @@ error:
- }
-
-
--static void do_flush_event(void *data, uint64_t count)
--{
-- struct client *impl = data;
-- impl->flush_signaled = false;
-- if (impl->connection)
-- if (pw_protocol_native_connection_flush(impl->connection) < 0)
-- impl->this.disconnect(&impl->this);
--}
--
- static void on_need_flush(void *data)
- {
- struct client *impl = data;
- struct pw_remote *remote = impl->this.remote;
-
-- if (!impl->flush_signaled) {
-- impl->flush_signaled = true;
-- pw_loop_signal_event(remote->core->main_loop, impl->flush_event);
-+ if (!impl->flushing) {
-+ int mask = impl->source->mask;
-+ impl->flushing = true;
-+ SPA_FLAG_SET(mask, SPA_IO_OUT);
-+ pw_loop_update_io(remote->core->main_loop,
-+ impl->source, mask);
- }
- }
-
-@@ -669,12 +696,9 @@ static void impl_disconnect(struct pw_protocol_client *client)
- static void impl_destroy(struct pw_protocol_client *client)
- {
- struct client *impl = SPA_CONTAINER_OF(client, struct client, this);
-- struct pw_remote *remote = client->remote;
-
- impl_disconnect(client);
-
-- pw_loop_destroy_source(remote->core->main_loop, impl->flush_event);
--
- spa_list_remove(&client->link);
- free(impl);
- }
-@@ -687,7 +711,6 @@ impl_new_client(struct pw_protocol *protocol,
- struct client *impl;
- struct pw_protocol_client *this;
- const char *str = NULL;
-- int res;
-
- if ((impl = calloc(1, sizeof(struct client))) == NULL)
- return NULL;
-@@ -711,20 +734,9 @@ impl_new_client(struct pw_protocol *protocol,
- this->disconnect = impl_disconnect;
- this->destroy = impl_destroy;
-
-- impl->flush_event = pw_loop_add_event(remote->core->main_loop, do_flush_event, impl);
-- if (impl->flush_event == NULL) {
-- res = -errno;
-- goto error_cleanup;
-- }
--
- spa_list_append(&protocol->client_list, &this->link);
-
- return this;
--
--error_cleanup:
-- free(impl);
-- errno = -res;
-- return NULL;
- }
-
- static void destroy_server(struct pw_protocol_server *server)
-@@ -757,10 +769,23 @@ static void on_before_hook(void *_data)
- struct pw_protocol_server *this = &server->this;
- struct pw_client *client, *tmp;
- struct client_data *data;
-+ int res;
-
- spa_list_for_each_safe(client, tmp, &this->client_list, protocol_link) {
- data = client->user_data;
-- pw_protocol_native_connection_flush(data->connection);
-+
-+ res = pw_protocol_native_connection_flush(data->connection);
-+ if (res == -EAGAIN) {
-+ int mask = data->source->mask;
-+ SPA_FLAG_SET(mask, SPA_IO_OUT);
-+ pw_loop_update_io(client->protocol->core->main_loop,
-+ data->source, mask);
-+ } else if (res < 0) {
-+ pw_log_warn("client %p: could not flush: %s",
-+ data->client, spa_strerror(res));
-+ pw_client_destroy(client);
-+ }
-+
- }
- }
-
-diff --git a/src/modules/module-protocol-native/connection.c b/src/modules/module-protocol-native/connection.c
-index 7b6cf112..116457e3 100644
---- a/src/modules/module-protocol-native/connection.c
-+++ b/src/modules/module-protocol-native/connection.c
-@@ -502,8 +502,6 @@ int pw_protocol_native_connection_flush(struct pw_protocol_native_connection *co
- continue;
- else {
- res = -errno;
-- pw_log_error("could not sendmsg on fd:%d n_fds:%d: %s",
-- conn->fd, n_fds, spa_strerror(res));
- goto exit;
- }
- }
---
-2.23.0
-