From 6e8d8b67ecf9172a8f3826e2093870e25c0363d7 Mon Sep 17 00:00:00 2001 From: Anthony Ilersich Date: Tue, 27 Sep 2022 13:28:31 -0400 Subject: [PATCH 1/7] add session services property --- src/modules/module-session-manager/client-endpoint/endpoint.c | 1 + .../module-session-manager/client-session/client-session.c | 1 + src/pipewire/extensions/session-manager/keys.h | 1 + 3 files changed, 3 insertions(+) diff --git a/src/modules/module-session-manager/client-endpoint/endpoint.c b/src/modules/module-session-manager/client-endpoint/endpoint.c index aa13989b6..8672833a4 100644 --- a/src/modules/module-session-manager/client-endpoint/endpoint.c +++ b/src/modules/module-session-manager/client-endpoint/endpoint.c @@ -325,6 +325,7 @@ int endpoint_init(struct endpoint *this, PW_KEY_NODE_ID, PW_KEY_MEDIA_CLASS, PW_KEY_SESSION_ID, + PW_KEY_SESSION_SERVICES, PW_KEY_PRIORITY_SESSION, PW_KEY_ENDPOINT_NAME, PW_KEY_ENDPOINT_CLIENT_ID, diff --git a/src/modules/module-session-manager/client-session/client-session.c b/src/modules/module-session-manager/client-session/client-session.c index 89997c94b..7f208902c 100644 --- a/src/modules/module-session-manager/client-session/client-session.c +++ b/src/modules/module-session-manager/client-session/client-session.c @@ -84,6 +84,7 @@ static int client_session_link_update(void *object, PW_KEY_FACTORY_ID, PW_KEY_CLIENT_ID, PW_KEY_SESSION_ID, + PW_KEY_SESSION_SERVICES, PW_KEY_ENDPOINT_LINK_OUTPUT_ENDPOINT, PW_KEY_ENDPOINT_LINK_OUTPUT_STREAM, PW_KEY_ENDPOINT_LINK_INPUT_ENDPOINT, diff --git a/src/pipewire/extensions/session-manager/keys.h b/src/pipewire/extensions/session-manager/keys.h index 9ff89f9c9..a450e9ef6 100644 --- a/src/pipewire/extensions/session-manager/keys.h +++ b/src/pipewire/extensions/session-manager/keys.h @@ -36,6 +36,7 @@ extern "C" { */ #define PW_KEY_SESSION_ID "session.id" /**< id of a session manager */ +#define PW_KEY_SESSION_SERVICES "session.services" /**< a list of available services on this session */ #define PW_KEY_ENDPOINT_ID "endpoint.id" /**< id of an endpoint */ #define PW_KEY_ENDPOINT_NAME "endpoint.name" /**< the name of an endpoint */ From ead3a99fd90653610212762ad87f6128c8b58d3c Mon Sep 17 00:00:00 2001 From: Anthony Ilersich Date: Tue, 11 Oct 2022 18:37:34 -0400 Subject: [PATCH 2/7] block context_connect for session.services --- src/pipewire/core.c | 33 +++++++++++++++++++++++++++++++++ src/pipewire/core.h | 4 ++++ 2 files changed, 37 insertions(+) diff --git a/src/pipewire/core.c b/src/pipewire/core.c index dd7e05eac..98e617f6b 100644 --- a/src/pipewire/core.c +++ b/src/pipewire/core.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -36,10 +37,14 @@ #include "pipewire/private.h" #include "pipewire/extensions/protocol-native.h" +#include "pipewire/extensions/session-manager/keys.h" PW_LOG_TOPIC_EXTERN(log_core); #define PW_LOG_TOPIC_DEFAULT log_core +static pthread_mutex_t service_added_lock = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t service_added_cv = PTHREAD_COND_INITIALIZER; + static void core_event_ping(void *data, uint32_t id, int seq) { struct pw_core *this = data; @@ -397,18 +402,46 @@ exit_cleanup: return NULL; } +SPA_EXPORT +void +pw_context_add_service(struct pw_context *context, const char *service) +{ + struct pw_properties *props = pw_context_get_properties (context); + const char* old_services = pw_properties_get(props, PW_KEY_SESSION_SERVICES); + // TODO: avoid adding duplicates + pw_properties_setf(props, PW_KEY_SESSION_SERVICES, "%s test", old_services); + pw_log_error("ADDED SERVICE!"); + pw_log_error("session.services: %s", pw_properties_get(props, PW_KEY_SESSION_SERVICES)); + pthread_mutex_lock(&service_added_lock); + pthread_cond_signal(&service_added_cv); + pthread_mutex_unlock(&service_added_lock); +} + SPA_EXPORT struct pw_core * pw_context_connect(struct pw_context *context, struct pw_properties *properties, size_t user_data_size) { struct pw_core *core; + const struct spa_dict_item *session_services; int res; core = core_new(context, properties, user_data_size); if (core == NULL) return NULL; + session_services = spa_dict_lookup_item(&core->properties->dict, PW_KEY_SESSION_SERVICES); + // if the property is present and empty, context creation blocks until services are added + if (session_services != NULL && !strcmp(session_services->value, "")) + { + pw_log_error("pw_context_connect is waiting for session.services to be populated"); + pthread_mutex_lock(&service_added_lock); + pthread_cond_wait(&service_added_cv, &service_added_lock); + pthread_mutex_unlock(&service_added_lock); + pw_log_error("pw_context_connect is resuming"); + pw_log_error("session.services: %s", session_services->value); + } + pw_log_debug("%p: connect", core); if ((res = pw_protocol_client_connect(core->conn, diff --git a/src/pipewire/core.h b/src/pipewire/core.h index 604e7ccdf..ddd248ef7 100644 --- a/src/pipewire/core.h +++ b/src/pipewire/core.h @@ -531,6 +531,10 @@ pw_registry_bind(struct pw_registry *registry, * \{ */ +void +pw_context_add_service(struct pw_context *context, + const char *service); + /** Connect to a PipeWire instance * * \param context a \ref pw_context From 0a31d58e00ca3c5b81d129b50629c8f0448cf26d Mon Sep 17 00:00:00 2001 From: Anthony Ilersich Date: Sat, 15 Oct 2022 21:37:46 -0400 Subject: [PATCH 3/7] wip check global session object in pw_context_connect --- .../client-endpoint/endpoint.c | 1 - .../client-session/client-session.c | 2 + .../client-session/session.c | 2 + .../proxy-session-manager.c | 2 + src/modules/module-session-manager/session.c | 2 + src/pipewire/core.c | 69 ++++++++++++++----- src/pipewire/core.h | 4 -- .../extensions/session-manager/interfaces.h | 6 ++ 8 files changed, 65 insertions(+), 23 deletions(-) diff --git a/src/modules/module-session-manager/client-endpoint/endpoint.c b/src/modules/module-session-manager/client-endpoint/endpoint.c index 8672833a4..aa13989b6 100644 --- a/src/modules/module-session-manager/client-endpoint/endpoint.c +++ b/src/modules/module-session-manager/client-endpoint/endpoint.c @@ -325,7 +325,6 @@ int endpoint_init(struct endpoint *this, PW_KEY_NODE_ID, PW_KEY_MEDIA_CLASS, PW_KEY_SESSION_ID, - PW_KEY_SESSION_SERVICES, PW_KEY_PRIORITY_SESSION, PW_KEY_ENDPOINT_NAME, PW_KEY_ENDPOINT_CLIENT_ID, diff --git a/src/modules/module-session-manager/client-session/client-session.c b/src/modules/module-session-manager/client-session/client-session.c index 7f208902c..1daba576e 100644 --- a/src/modules/module-session-manager/client-session/client-session.c +++ b/src/modules/module-session-manager/client-session/client-session.c @@ -283,6 +283,8 @@ int client_session_factory_init(struct pw_impl_module *module) if (factory == NULL) return -ENOMEM; + pw_log_error("create \"client-session\" factory from client-session"); + data = pw_impl_factory_get_user_data(factory); data->factory = factory; data->module = module; diff --git a/src/modules/module-session-manager/client-session/session.c b/src/modules/module-session-manager/client-session/session.c index 87c1b96a7..2c23b24d2 100644 --- a/src/modules/module-session-manager/client-session/session.c +++ b/src/modules/module-session-manager/client-session/session.c @@ -306,6 +306,8 @@ int session_init(struct session *this, if (!this->global) goto no_mem; + pw_log_error("create global session object from client-session with id=%u", pw_global_get_id(this->global)); + pw_properties_setf(this->props, PW_KEY_OBJECT_ID, "%u", pw_global_get_id(this->global)); pw_properties_setf(this->props, PW_KEY_OBJECT_SERIAL, "%"PRIu64, diff --git a/src/modules/module-session-manager/proxy-session-manager.c b/src/modules/module-session-manager/proxy-session-manager.c index cd418e191..288090a72 100644 --- a/src/modules/module-session-manager/proxy-session-manager.c +++ b/src/modules/module-session-manager/proxy-session-manager.c @@ -168,6 +168,8 @@ struct pw_proxy *pw_core_session_export(struct pw_core *core, user_data_size + sizeof(struct object_data)); if (proxy == NULL) return NULL; + + pw_log_error("created session proxy from proxy-session-manager with proxy id=%u", pw_proxy_get_id(proxy)); data = pw_proxy_get_user_data(proxy); data = SPA_PTROFF(data, user_data_size, struct object_data); diff --git a/src/modules/module-session-manager/session.c b/src/modules/module-session-manager/session.c index e3d721097..4fff1bd38 100644 --- a/src/modules/module-session-manager/session.c +++ b/src/modules/module-session-manager/session.c @@ -556,6 +556,8 @@ int session_factory_init(struct pw_impl_module *module) sizeof(*data)); if (factory == NULL) return -errno; + + pw_log_error("created session factory from module-session-manager"); data = pw_impl_factory_get_user_data(factory); data->factory = factory; diff --git a/src/pipewire/core.c b/src/pipewire/core.c index 98e617f6b..2475c7745 100644 --- a/src/pipewire/core.c +++ b/src/pipewire/core.c @@ -37,7 +37,7 @@ #include "pipewire/private.h" #include "pipewire/extensions/protocol-native.h" -#include "pipewire/extensions/session-manager/keys.h" +#include "pipewire/extensions/session-manager.h" PW_LOG_TOPIC_EXTERN(log_core); #define PW_LOG_TOPIC_DEFAULT log_core @@ -297,6 +297,7 @@ struct pw_proxy *pw_core_export(struct pw_core *core, goto error_proxy_failed; } pw_log_debug("%p: export:%s proxy:%p", core, type, proxy); + pw_log_error("%p: export:%s proxy:%p", core, type, proxy); return proxy; error_export_type: @@ -402,44 +403,76 @@ exit_cleanup: return NULL; } -SPA_EXPORT -void -pw_context_add_service(struct pw_context *context, const char *service) +static void +signal_service_added() { - struct pw_properties *props = pw_context_get_properties (context); - const char* old_services = pw_properties_get(props, PW_KEY_SESSION_SERVICES); - // TODO: avoid adding duplicates - pw_properties_setf(props, PW_KEY_SESSION_SERVICES, "%s test", old_services); - pw_log_error("ADDED SERVICE!"); - pw_log_error("session.services: %s", pw_properties_get(props, PW_KEY_SESSION_SERVICES)); pthread_mutex_lock(&service_added_lock); pthread_cond_signal(&service_added_cv); pthread_mutex_unlock(&service_added_lock); } +// /* [registry_event_global] */ +// static void registry_event_global(void *_data, uint32_t id, +// uint32_t permissions, const char *type, +// uint32_t version, const struct spa_dict *props) +// { +// struct data *data = _data; +// if (data->client != NULL) +// return; +// if (strcmp(type, PW_TYPE_INTERFACE_Client) == 0) { +// data->client = pw_registry_bind(data->registry, +// id, type, PW_VERSION_CLIENT, 0); +// pw_client_add_listener(data->client, +// &data->client_listener, +// &client_events, data); +// } +// } +// /* [registry_event_global] */ + +// static const struct pw_registry_events registry_events = { +// PW_VERSION_REGISTRY_EVENTS, +// .global = registry_event_global, +// }; + SPA_EXPORT struct pw_core * pw_context_connect(struct pw_context *context, struct pw_properties *properties, size_t user_data_size) { struct pw_core *core; - const struct spa_dict_item *session_services; int res; + pw_log_error("pw_context_connect"); + core = core_new(context, properties, user_data_size); if (core == NULL) return NULL; - session_services = spa_dict_lookup_item(&core->properties->dict, PW_KEY_SESSION_SERVICES); - // if the property is present and empty, context creation blocks until services are added - if (session_services != NULL && !strcmp(session_services->value, "")) + // struct pw_registry *registry = pw_core_get_registry(core, PW_VERSION_REGISTRY, 0); + // pw_registry_add_listener(registry, &data.registry_listener, ®istry_events, &data); + + bool should_block_for_services = false; // TODO + if (should_block_for_services) { - pw_log_error("pw_context_connect is waiting for session.services to be populated"); + struct spa_dict_item *services = NULL; + struct pw_session_info *info; + struct spa_dict *props; + struct pw_global *global; + uint32_t id = 0; // TODO: how to find id of global for pw_session_info? + global = pw_context_find_global(context, id); + // TODO: are these the properties of the pw_session_info object? + // if not, should we use pw_global_get_object(global), and will this be the pw_session_info object? + props = pw_global_get_properties(global); + services = spa_dict_lookup_item(props, PW_KEY_SESSION_SERVICES); pthread_mutex_lock(&service_added_lock); - pthread_cond_wait(&service_added_cv, &service_added_lock); + if (services != NULL && spa_streq(services->value, PW_SESSION_SERVICE_NONE)) + { + pw_log_error("pw_context_connect is waiting for session.services to be populated"); + pthread_cond_wait(&service_added_cv, &service_added_lock); + pw_log_error("pw_context_connect is resuming"); + pw_log_error(PW_KEY_SESSION_SERVICES": %s", services->value); + } pthread_mutex_unlock(&service_added_lock); - pw_log_error("pw_context_connect is resuming"); - pw_log_error("session.services: %s", session_services->value); } pw_log_debug("%p: connect", core); diff --git a/src/pipewire/core.h b/src/pipewire/core.h index ddd248ef7..604e7ccdf 100644 --- a/src/pipewire/core.h +++ b/src/pipewire/core.h @@ -531,10 +531,6 @@ pw_registry_bind(struct pw_registry *registry, * \{ */ -void -pw_context_add_service(struct pw_context *context, - const char *service); - /** Connect to a PipeWire instance * * \param context a \ref pw_context diff --git a/src/pipewire/extensions/session-manager/interfaces.h b/src/pipewire/extensions/session-manager/interfaces.h index 0c11e1dec..402c7b3ee 100644 --- a/src/pipewire/extensions/session-manager/interfaces.h +++ b/src/pipewire/extensions/session-manager/interfaces.h @@ -40,6 +40,12 @@ extern "C" { * \{ */ +#define PW_SESSION_SERVICE_NONE "" +#define PW_SESSION_SERVICE_AUDIO_IN "audio-in" +#define PW_SESSION_SERVICE_AUDIO_OUT "audio-out" +#define PW_SESSION_SERVICE_VIDEO_IN "video-in" +#define PW_SESSION_SERVICE_VIDEO_OUT "video-out" + #define PW_TYPE_INTERFACE_Session PW_TYPE_INFO_INTERFACE_BASE "Session" #define PW_VERSION_SESSION 0 struct pw_session; From c2d0f2e8aaa0404831891433562ace86717c277d Mon Sep 17 00:00:00 2001 From: Anthony Ilersich Date: Tue, 25 Oct 2022 18:00:20 -0400 Subject: [PATCH 4/7] stream wait for session object --- .../client-session/client-session.c | 2 - .../client-session/session.c | 2 - .../proxy-session-manager.c | 2 - src/modules/module-session-manager/session.c | 2 - src/pipewire/core.c | 65 ------------------- src/pipewire/private.h | 6 ++ src/pipewire/stream.c | 51 ++++++++++++++- 7 files changed, 56 insertions(+), 74 deletions(-) diff --git a/src/modules/module-session-manager/client-session/client-session.c b/src/modules/module-session-manager/client-session/client-session.c index 1daba576e..7f208902c 100644 --- a/src/modules/module-session-manager/client-session/client-session.c +++ b/src/modules/module-session-manager/client-session/client-session.c @@ -283,8 +283,6 @@ int client_session_factory_init(struct pw_impl_module *module) if (factory == NULL) return -ENOMEM; - pw_log_error("create \"client-session\" factory from client-session"); - data = pw_impl_factory_get_user_data(factory); data->factory = factory; data->module = module; diff --git a/src/modules/module-session-manager/client-session/session.c b/src/modules/module-session-manager/client-session/session.c index 2c23b24d2..5d14ba91e 100644 --- a/src/modules/module-session-manager/client-session/session.c +++ b/src/modules/module-session-manager/client-session/session.c @@ -305,8 +305,6 @@ int session_init(struct session *this, NULL, session_bind, this); if (!this->global) goto no_mem; - - pw_log_error("create global session object from client-session with id=%u", pw_global_get_id(this->global)); pw_properties_setf(this->props, PW_KEY_OBJECT_ID, "%u", pw_global_get_id(this->global)); diff --git a/src/modules/module-session-manager/proxy-session-manager.c b/src/modules/module-session-manager/proxy-session-manager.c index 288090a72..cd418e191 100644 --- a/src/modules/module-session-manager/proxy-session-manager.c +++ b/src/modules/module-session-manager/proxy-session-manager.c @@ -168,8 +168,6 @@ struct pw_proxy *pw_core_session_export(struct pw_core *core, user_data_size + sizeof(struct object_data)); if (proxy == NULL) return NULL; - - pw_log_error("created session proxy from proxy-session-manager with proxy id=%u", pw_proxy_get_id(proxy)); data = pw_proxy_get_user_data(proxy); data = SPA_PTROFF(data, user_data_size, struct object_data); diff --git a/src/modules/module-session-manager/session.c b/src/modules/module-session-manager/session.c index 4fff1bd38..e3d721097 100644 --- a/src/modules/module-session-manager/session.c +++ b/src/modules/module-session-manager/session.c @@ -556,8 +556,6 @@ int session_factory_init(struct pw_impl_module *module) sizeof(*data)); if (factory == NULL) return -errno; - - pw_log_error("created session factory from module-session-manager"); data = pw_impl_factory_get_user_data(factory); data->factory = factory; diff --git a/src/pipewire/core.c b/src/pipewire/core.c index 2475c7745..6ad2d7eb2 100644 --- a/src/pipewire/core.c +++ b/src/pipewire/core.c @@ -28,7 +28,6 @@ #include #include #include -#include #include #include @@ -42,9 +41,6 @@ PW_LOG_TOPIC_EXTERN(log_core); #define PW_LOG_TOPIC_DEFAULT log_core -static pthread_mutex_t service_added_lock = PTHREAD_MUTEX_INITIALIZER; -static pthread_cond_t service_added_cv = PTHREAD_COND_INITIALIZER; - static void core_event_ping(void *data, uint32_t id, int seq) { struct pw_core *this = data; @@ -297,7 +293,6 @@ struct pw_proxy *pw_core_export(struct pw_core *core, goto error_proxy_failed; } pw_log_debug("%p: export:%s proxy:%p", core, type, proxy); - pw_log_error("%p: export:%s proxy:%p", core, type, proxy); return proxy; error_export_type: @@ -403,37 +398,6 @@ exit_cleanup: return NULL; } -static void -signal_service_added() -{ - pthread_mutex_lock(&service_added_lock); - pthread_cond_signal(&service_added_cv); - pthread_mutex_unlock(&service_added_lock); -} - -// /* [registry_event_global] */ -// static void registry_event_global(void *_data, uint32_t id, -// uint32_t permissions, const char *type, -// uint32_t version, const struct spa_dict *props) -// { -// struct data *data = _data; -// if (data->client != NULL) -// return; -// if (strcmp(type, PW_TYPE_INTERFACE_Client) == 0) { -// data->client = pw_registry_bind(data->registry, -// id, type, PW_VERSION_CLIENT, 0); -// pw_client_add_listener(data->client, -// &data->client_listener, -// &client_events, data); -// } -// } -// /* [registry_event_global] */ - -// static const struct pw_registry_events registry_events = { -// PW_VERSION_REGISTRY_EVENTS, -// .global = registry_event_global, -// }; - SPA_EXPORT struct pw_core * pw_context_connect(struct pw_context *context, struct pw_properties *properties, @@ -442,39 +406,10 @@ pw_context_connect(struct pw_context *context, struct pw_properties *properties, struct pw_core *core; int res; - pw_log_error("pw_context_connect"); - core = core_new(context, properties, user_data_size); if (core == NULL) return NULL; - // struct pw_registry *registry = pw_core_get_registry(core, PW_VERSION_REGISTRY, 0); - // pw_registry_add_listener(registry, &data.registry_listener, ®istry_events, &data); - - bool should_block_for_services = false; // TODO - if (should_block_for_services) - { - struct spa_dict_item *services = NULL; - struct pw_session_info *info; - struct spa_dict *props; - struct pw_global *global; - uint32_t id = 0; // TODO: how to find id of global for pw_session_info? - global = pw_context_find_global(context, id); - // TODO: are these the properties of the pw_session_info object? - // if not, should we use pw_global_get_object(global), and will this be the pw_session_info object? - props = pw_global_get_properties(global); - services = spa_dict_lookup_item(props, PW_KEY_SESSION_SERVICES); - pthread_mutex_lock(&service_added_lock); - if (services != NULL && spa_streq(services->value, PW_SESSION_SERVICE_NONE)) - { - pw_log_error("pw_context_connect is waiting for session.services to be populated"); - pthread_cond_wait(&service_added_cv, &service_added_lock); - pw_log_error("pw_context_connect is resuming"); - pw_log_error(PW_KEY_SESSION_SERVICES": %s", services->value); - } - pthread_mutex_unlock(&service_added_lock); - } - pw_log_debug("%p: connect", core); if ((res = pw_protocol_client_connect(core->conn, diff --git a/src/pipewire/private.h b/src/pipewire/private.h index 50080079a..04a03ef61 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -1056,6 +1056,12 @@ struct pw_stream { struct pw_proxy *proxy; struct spa_hook proxy_listener; + struct pw_registry *registry; + struct spa_hook registry_listener; + + struct pw_session *session; + struct spa_hook session_listener; + struct spa_hook node_listener; struct spa_list controls; diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index 59c5ee2a0..0b61cb623 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -42,6 +42,7 @@ #include "pipewire/pipewire.h" #include "pipewire/stream.h" #include "pipewire/private.h" +#include "pipewire/extensions/session-manager.h" PW_LOG_TOPIC_EXTERN(log_stream); #define PW_LOG_TOPIC_DEFAULT log_stream @@ -1113,6 +1114,47 @@ static const struct spa_node_methods impl_node = { .port_reuse_buffer = impl_port_reuse_buffer, }; +static void session_event_info (void *data, const struct pw_session_info *info) { + struct pw_stream *stream = data; + const char *services = spa_dict_lookup(info->props, PW_KEY_SESSION_SERVICES); + if (services == NULL || !strcmp(services, PW_SESSION_SERVICE_NONE)) { + return; + } + // some services are available, so the stream can now be considered + // connected, although more services may become available after this + pw_log_error("%p: stream has received services: %s", stream, services); // TODO: switch to _debug after testing + if (stream->state == PW_STREAM_STATE_CONNECTING) { + stream_set_state(stream, PW_STREAM_STATE_PAUSED, NULL); + } +} + +static const struct pw_session_events session_events = { + PW_VERSION_SESSION_EVENTS, + .info = &session_event_info, +}; + +static void registry_event_global(void *data, uint32_t id, + uint32_t permissions, const char *type, + uint32_t version, const struct spa_dict *props) +{ + struct pw_stream *stream = data; + if (stream->session != NULL) + return; + + if (strcmp(type, PW_TYPE_INTERFACE_Session) == 0) { + stream->session = pw_registry_bind(stream->registry, + id, type, PW_VERSION_SESSION, 0); + pw_session_add_listener(stream->session, + &stream->session_listener, + &session_events, data); + } +} + +static const struct pw_registry_events registry_events = { + PW_VERSION_REGISTRY_EVENTS, + .global = registry_event_global, +}; + static void proxy_removed(void *_data) { struct pw_stream *stream = _data; @@ -1143,7 +1185,11 @@ static void proxy_bound(void *data, uint32_t global_id) { struct pw_stream *stream = data; stream->node_id = global_id; - stream_set_state(stream, PW_STREAM_STATE_PAUSED, NULL); + stream->registry = pw_core_get_registry(stream->core, + PW_VERSION_REGISTRY, + 0 /* user_data size */ ); + pw_registry_add_listener(stream->registry, &stream->registry_listener, + ®istry_events, data); } static const struct pw_proxy_events proxy_events = { @@ -1485,6 +1531,9 @@ stream_new(struct pw_context *context, const char *name, this->name = name ? strdup(name) : NULL; this->node_id = SPA_ID_INVALID; + + this->registry = NULL; + this->session = NULL; spa_ringbuffer_init(&impl->dequeued.ring); spa_ringbuffer_init(&impl->queued.ring); From 5ad2445c1b2bdb30192220359d5169133907f765 Mon Sep 17 00:00:00 2001 From: Anthony Ilersich Date: Tue, 25 Oct 2022 18:05:50 -0400 Subject: [PATCH 5/7] remove unnecessary include --- src/pipewire/core.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pipewire/core.c b/src/pipewire/core.c index 6ad2d7eb2..dd7e05eac 100644 --- a/src/pipewire/core.c +++ b/src/pipewire/core.c @@ -36,7 +36,6 @@ #include "pipewire/private.h" #include "pipewire/extensions/protocol-native.h" -#include "pipewire/extensions/session-manager.h" PW_LOG_TOPIC_EXTERN(log_core); #define PW_LOG_TOPIC_DEFAULT log_core From 9abbda10ac83dfead29d6847ea699a3253e76d8a Mon Sep 17 00:00:00 2001 From: Anthony Ilersich Date: Tue, 15 Nov 2022 11:34:24 -0500 Subject: [PATCH 6/7] small fixes --- src/pipewire/stream.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index 0b61cb623..ce8305897 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -1114,10 +1114,12 @@ static const struct spa_node_methods impl_node = { .port_reuse_buffer = impl_port_reuse_buffer, }; -static void session_event_info (void *data, const struct pw_session_info *info) { +static void session_event_info (void *data, const struct pw_session_info *info) +{ struct pw_stream *stream = data; + pw_log_error("%p: stream has received session info", stream); const char *services = spa_dict_lookup(info->props, PW_KEY_SESSION_SERVICES); - if (services == NULL || !strcmp(services, PW_SESSION_SERVICE_NONE)) { + if (services == NULL || spa_streq(services, PW_SESSION_SERVICE_NONE)) { return; } // some services are available, so the stream can now be considered @@ -1141,7 +1143,7 @@ static void registry_event_global(void *data, uint32_t id, if (stream->session != NULL) return; - if (strcmp(type, PW_TYPE_INTERFACE_Session) == 0) { + if (spa_streq(type, PW_TYPE_INTERFACE_Session)) { stream->session = pw_registry_bind(stream->registry, id, type, PW_VERSION_SESSION, 0); pw_session_add_listener(stream->session, From 587d37562ff8750f9abc929fd1d124158f2f48b8 Mon Sep 17 00:00:00 2001 From: Anthony Ilersich Date: Mon, 12 Dec 2022 13:55:41 -0500 Subject: [PATCH 7/7] remove debug messages --- src/pipewire/stream.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/pipewire/stream.c b/src/pipewire/stream.c index ce8305897..c0b736f10 100644 --- a/src/pipewire/stream.c +++ b/src/pipewire/stream.c @@ -1117,14 +1117,12 @@ static const struct spa_node_methods impl_node = { static void session_event_info (void *data, const struct pw_session_info *info) { struct pw_stream *stream = data; - pw_log_error("%p: stream has received session info", stream); const char *services = spa_dict_lookup(info->props, PW_KEY_SESSION_SERVICES); if (services == NULL || spa_streq(services, PW_SESSION_SERVICE_NONE)) { return; } // some services are available, so the stream can now be considered // connected, although more services may become available after this - pw_log_error("%p: stream has received services: %s", stream, services); // TODO: switch to _debug after testing if (stream->state == PW_STREAM_STATE_CONNECTING) { stream_set_state(stream, PW_STREAM_STATE_PAUSED, NULL); }