diff --git a/src/daemon/pipewire.conf.in b/src/daemon/pipewire.conf.in index dd547514f..5daf52863 100644 --- a/src/daemon/pipewire.conf.in +++ b/src/daemon/pipewire.conf.in @@ -1,11 +1,11 @@ #load-module libpipewire-module-protocol-dbus load-module libpipewire-module-protocol-native load-module libpipewire-module-suspend-on-idle -#load-module libpipewire-module-spa-monitor alsa/libspa-alsa alsa-monitor alsa +load-module libpipewire-module-spa-monitor alsa/libspa-alsa alsa-monitor alsa load-module libpipewire-module-spa-monitor v4l2/libspa-v4l2 v4l2-monitor v4l2 #load-module libpipewire-module-spa-node videotestsrc/libspa-videotestsrc videotestsrc videotestsrc media.class=Video/Source Spa:POD:Object:Props:patternType=Spa:POD:Object:Props:patternType:snow load-module libpipewire-module-autolink -#load-module libpipewire-module-mixer +load-module libpipewire-module-mixer load-module libpipewire-module-client-node load-module libpipewire-module-flatpak #load-module libpipewire-module-jack diff --git a/src/gst/gstpipewiredeviceprovider.c b/src/gst/gstpipewiredeviceprovider.c index 1af784634..3645204a0 100644 --- a/src/gst/gstpipewiredeviceprovider.c +++ b/src/gst/gstpipewiredeviceprovider.c @@ -319,7 +319,7 @@ static const struct pw_node_events node_events = { &node_event_info }; -static void registry_event_global(void *object, uint32_t id, const char *type, uint32_t version) +static void registry_event_global(void *object, uint32_t id, uint32_t type, uint32_t version) { struct pw_proxy *registry = object; GstPipeWireDeviceProvider *self = registry->object; @@ -327,7 +327,7 @@ static void registry_event_global(void *object, uint32_t id, const char *type, u struct pw_core *core = remote->core; struct pw_proxy *proxy = NULL; - if (strcmp(type, PIPEWIRE_TYPE__Node)) + if (type != core->type.node) return; proxy = pw_proxy_new(remote, SPA_ID_INVALID, core->type.node, 0); diff --git a/src/modules/module-protocol-native.c b/src/modules/module-protocol-native.c index 6e9b5d209..10bf2a489 100644 --- a/src/modules/module-protocol-native.c +++ b/src/modules/module-protocol-native.c @@ -452,6 +452,8 @@ on_remote_data(struct spa_loop_utils *utils, struct pw_connection *conn = impl->connection; if (mask & (SPA_IO_ERR | SPA_IO_HUP)) { + pw_log_error("protocol-native %p: got connection error", impl); + pw_remote_destroy(this); return; } diff --git a/src/modules/module-protocol-native/protocol-native.c b/src/modules/module-protocol-native/protocol-native.c index 225fcb4d1..5eba1ee26 100644 --- a/src/modules/module-protocol-native/protocol-native.c +++ b/src/modules/module-protocol-native/protocol-native.c @@ -522,7 +522,7 @@ static bool core_demarshal_update_types_server(void *object, void *data, size_t return true; } -static void registry_marshal_global(void *object, uint32_t id, const char *type, uint32_t version) +static void registry_marshal_global(void *object, uint32_t id, uint32_t type, uint32_t version) { struct pw_resource *resource = object; struct pw_connection *connection = resource->client->protocol_private; @@ -533,7 +533,7 @@ static void registry_marshal_global(void *object, uint32_t id, const char *type, spa_pod_builder_struct(b, &f, SPA_POD_TYPE_INT, id, - SPA_POD_TYPE_STRING, type, + SPA_POD_TYPE_ID, type, SPA_POD_TYPE_INT, version); pw_connection_end_write(connection, b); @@ -829,13 +829,13 @@ static bool registry_demarshal_global(void *object, void *data, size_t size) { struct pw_proxy *proxy = object; struct spa_pod_iter it; - uint32_t id, version; - const char *type; + uint32_t id, type, version; if (!spa_pod_iter_struct(&it, data, size) || + !pw_pod_remap_data(SPA_POD_TYPE_STRUCT, data, size, &proxy->remote->types) || !spa_pod_iter_get(&it, SPA_POD_TYPE_INT, &id, - SPA_POD_TYPE_STRING, &type, + SPA_POD_TYPE_ID, &type, SPA_POD_TYPE_INT, &version, 0)) return false; diff --git a/src/pipewire/core.c b/src/pipewire/core.c index c654fa6f4..c8f49e96b 100644 --- a/src/pipewire/core.c +++ b/src/pipewire/core.c @@ -133,8 +133,7 @@ static void core_get_registry(void *object, uint32_t new_id) if (pw_global_is_visible(global, client)) pw_registry_notify_global(registry_resource, global->id, - spa_type_map_get_type(this->type.map, - global->type), + global->type, global->version); } @@ -400,7 +399,6 @@ pw_core_add_global(struct pw_core *core, struct global_impl *impl; struct pw_global *this; struct pw_resource *registry; - const char *type_name; impl = calloc(1, sizeof(struct global_impl)); if (impl == NULL) @@ -423,12 +421,11 @@ pw_core_add_global(struct pw_core *core, spa_list_insert(core->global_list.prev, &this->link); pw_signal_emit(&core->global_added, core, this); - type_name = spa_type_map_get_type(core->type.map, this->type); - pw_log_debug("global %p: new %u %s, owner %p", this, this->id, type_name, owner); + pw_log_debug("global %p: new %u %d, owner %p", this, this->id, this->type, owner); spa_list_for_each(registry, &core->registry_resource_list, link) if (pw_global_is_visible(this, registry->client)) - pw_registry_notify_global(registry, this->id, type_name, this->version); + pw_registry_notify_global(registry, this->id, this->type, this->version); return true; } diff --git a/src/pipewire/interfaces.h b/src/pipewire/interfaces.h index 76aa767b4..452a1fa96 100644 --- a/src/pipewire/interfaces.h +++ b/src/pipewire/interfaces.h @@ -256,7 +256,7 @@ struct pw_registry_events { * \param type the type of the object * \param version the version of the object */ - void (*global) (void *object, uint32_t id, const char *type, uint32_t version); + void (*global) (void *object, uint32_t id, uint32_t type, uint32_t version); /** * Notify of a global object removal * diff --git a/src/pipewire/remote.c b/src/pipewire/remote.c index c49ec75c0..ddae04813 100644 --- a/src/pipewire/remote.c +++ b/src/pipewire/remote.c @@ -206,7 +206,6 @@ struct pw_remote *pw_remote_new(struct pw_core *core, void pw_remote_destroy(struct pw_remote *remote) { struct remote *impl = SPA_CONTAINER_OF(remote, struct remote, this); - struct pw_proxy *proxy, *t2; pw_log_debug("remote %p: destroy", remote); pw_signal_emit(&remote->destroy_signal, remote); @@ -216,17 +215,8 @@ void pw_remote_destroy(struct pw_remote *remote) remote->conn->destroy(remote->conn); - spa_list_for_each_safe(proxy, t2, &remote->proxy_list, link) - pw_proxy_destroy(proxy); - - pw_map_clear(&remote->objects); - pw_map_clear(&remote->types); - spa_list_remove(&remote->link); - if (remote->info) - pw_core_info_free (remote->info); - if (remote->properties) pw_properties_free(remote->properties); free(remote->error); @@ -283,11 +273,24 @@ int pw_remote_connect_fd(struct pw_remote *remote, int fd) void pw_remote_disconnect(struct pw_remote *remote) { + struct pw_proxy *proxy, *t2; + + pw_log_debug("remote %p: disconnect", remote); remote->conn->disconnect(remote->conn); - if (remote->core_proxy) - pw_proxy_destroy(remote->core_proxy); + spa_list_for_each_safe(proxy, t2, &remote->proxy_list, link) + pw_proxy_destroy(proxy); + remote->core_proxy = NULL; + pw_map_clear(&remote->objects); + pw_map_clear(&remote->types); + remote->n_types = 0; + + if (remote->info) { + pw_core_info_free (remote->info); + remote->info = NULL; + } + remote_update_state(remote, PW_REMOTE_STATE_UNCONNECTED, NULL); } diff --git a/src/pipewire/remote.h b/src/pipewire/remote.h index 5a11fc599..453292eb0 100644 --- a/src/pipewire/remote.h +++ b/src/pipewire/remote.h @@ -137,7 +137,7 @@ struct pw_remote { struct pw_map types; /**< client types */ struct spa_list proxy_list; /**< list of \ref pw_proxy objects */ - struct spa_list stream_list; /**< list of \ref pw_proxy objects */ + struct spa_list stream_list; /**< list of \ref pw_stream objects */ struct pw_protocol *protocol; /**< the protocol in use */ void *protocol_private; /**< private data for the protocol */ diff --git a/src/tools/pipewire-monitor.c b/src/tools/pipewire-monitor.c index 3c35be122..b796479da 100644 --- a/src/tools/pipewire-monitor.c +++ b/src/tools/pipewire-monitor.c @@ -241,36 +241,35 @@ destroy_proxy (void *data) } -static void registry_event_global(void *object, uint32_t id, const char *type, uint32_t version) +static void registry_event_global(void *object, uint32_t id, uint32_t type, uint32_t version) { struct pw_proxy *registry_proxy = object; struct data *data = registry_proxy->object; struct pw_core *core = data->core; struct pw_remote *remote = registry_proxy->remote; struct pw_proxy *proxy = NULL; - uint32_t proxy_type, client_version; + uint32_t client_version; const void *implementation; - if (!strcmp(type, PIPEWIRE_TYPE__Node)) { - proxy_type = core->type.node; + if (type == core->type.node) { implementation = &node_events; client_version = PW_VERSION_NODE; - } else if (!strcmp(type, PIPEWIRE_TYPE__Module)) { - proxy_type = core->type.module; + } + else if (type == core->type.module) { implementation = &module_events; client_version = PW_VERSION_MODULE; - } else if (!strcmp(type, PIPEWIRE_TYPE__Client)) { - proxy_type = core->type.client; + } + else if (type == core->type.client) { implementation = &client_events; client_version = PW_VERSION_CLIENT; - } else if (!strcmp(type, PIPEWIRE_TYPE__Link)) { - proxy_type = core->type.link; + } + else if (type == core->type.link) { implementation = &link_events; client_version = PW_VERSION_LINK; } else return; - proxy = pw_proxy_new(remote, SPA_ID_INVALID, proxy_type, sizeof(struct proxy_data)); + proxy = pw_proxy_new(remote, SPA_ID_INVALID, type, sizeof(struct proxy_data)); if (proxy == NULL) goto no_mem;