diff options
author | Ahmed S. Darwish <darwish.07@gmail.com> | 2016-04-15 23:06:02 +0200 |
---|---|---|
committer | Arun Raghavan <git@arunraghavan.net> | 2016-04-27 18:37:07 +0530 |
commit | b1d47d60fc3f5dcc098f0ccc52a0f29dca8ce29e (patch) | |
tree | 9eb4cdd987c5963e91c0e327b781d84c3a413b8d /src/pulsecore | |
parent | a831e455159ff1ce917d5526ba4966b7a1ad5aac (diff) |
client audio: Support memfd transport
Now that all layers in the stack support memfd blocks, add memfd
pools support for client context and audio playback data.
Use such memfd pools by default only if the server signals memfd
support in its connection negotiations.
Also add ability for clients to force-disable memfd transport
through the `enable-memfd=' client configuration option.
Signed-off-by: Ahmed S. Darwish <darwish.07@gmail.com>
Diffstat (limited to 'src/pulsecore')
-rw-r--r-- | src/pulsecore/mem.h | 9 | ||||
-rw-r--r-- | src/pulsecore/protocol-native.c | 28 |
2 files changed, 35 insertions, 2 deletions
diff --git a/src/pulsecore/mem.h b/src/pulsecore/mem.h index 11a808620..cba141048 100644 --- a/src/pulsecore/mem.h +++ b/src/pulsecore/mem.h @@ -22,6 +22,7 @@ #include <stdbool.h> +#include <pulsecore/creds.h> #include <pulsecore/macro.h> typedef enum pa_mem_type { @@ -48,4 +49,12 @@ static inline bool pa_mem_type_is_shared(pa_mem_type_t t) { return (t == PA_MEM_TYPE_SHARED_POSIX) || (t == PA_MEM_TYPE_SHARED_MEMFD); } +static inline bool pa_memfd_is_locally_supported() { +#if defined(HAVE_CREDS) && defined(HAVE_MEMFD) + return true; +#else + return false; +#endif +} + #endif diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c index 93a7ce091..566ba6f1e 100644 --- a/src/pulsecore/protocol-native.c +++ b/src/pulsecore/protocol-native.c @@ -48,6 +48,7 @@ #include <pulsecore/core-scache.h> #include <pulsecore/core-subscribe.h> #include <pulsecore/log.h> +#include <pulsecore/mem.h> #include <pulsecore/strlist.h> #include <pulsecore/shared.h> #include <pulsecore/sample-util.h> @@ -2681,7 +2682,9 @@ static void command_enable_srbchannel(pa_pdispatch *pd, uint32_t command, uint32 static void command_auth(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) { pa_native_connection *c = PA_NATIVE_CONNECTION(userdata); const void*cookie; + bool memfd_on_remote = false; pa_tagstruct *reply; + pa_mem_type_t shm_type; bool shm_on_remote = false, do_shm; pa_native_connection_assert_ref(c); @@ -2705,7 +2708,15 @@ static void command_auth(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_ta not. */ if (c->version >= 13) { shm_on_remote = !!(c->version & 0x80000000U); - c->version &= 0x7FFFFFFFU; + + /* Starting with protocol version 31, the second MSB of the version + * tag reflects whether memfd is supported on the other PA end. */ + if (c->version >= 31) + memfd_on_remote = !!(c->version & 0x40000000U); + + /* Reserve the two most-significant _bytes_ of the version tag + * for flags. */ + c->version &= 0x0000FFFFU; } pa_log_debug("Protocol version: remote %u, local %u", c->version, PA_PROTOCOL_VERSION); @@ -2792,8 +2803,21 @@ static void command_auth(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_ta pa_log_debug("Negotiated SHM: %s", pa_yes_no(do_shm)); pa_pstream_enable_shm(c->pstream, do_shm); + shm_type = PA_MEM_TYPE_PRIVATE; + if (do_shm) { + if (c->version >= 31 && memfd_on_remote && pa_memfd_is_locally_supported()) { + pa_pstream_enable_memfd(c->pstream); + shm_type = PA_MEM_TYPE_SHARED_MEMFD; + } else + shm_type = PA_MEM_TYPE_SHARED_POSIX; + + pa_log_debug("Memfd possible: %s", pa_yes_no(pa_memfd_is_locally_supported())); + pa_log_debug("Negotiated SHM type: %s", pa_mem_type_to_string(shm_type)); + } + reply = reply_new(tag); - pa_tagstruct_putu32(reply, PA_PROTOCOL_VERSION | (do_shm ? 0x80000000 : 0)); + pa_tagstruct_putu32(reply, PA_PROTOCOL_VERSION | (do_shm ? 0x80000000 : 0) | + (pa_memfd_is_locally_supported() ? 0x40000000 : 0)); #ifdef HAVE_CREDS { |