mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04:00
media-session: move libcamera+bluez5 device removal to object free callback
libcamera + bluez5 devices should be freed/unloaded via the sm_object free callback, similarly as in alsa and v4l2 monitors. This ensures they are run at session_shutdown.
This commit is contained in:
parent
5b8c7c405d
commit
8ba6e98320
2 changed files with 35 additions and 25 deletions
|
|
@ -376,6 +376,23 @@ static void device_destroy(void *data)
|
||||||
bluez5_remove_node(device, node);
|
bluez5_remove_node(device, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void device_free(void *data)
|
||||||
|
{
|
||||||
|
struct device *device = data;
|
||||||
|
|
||||||
|
pw_log_debug("remove device %u", device->id);
|
||||||
|
spa_list_remove(&device->link);
|
||||||
|
spa_hook_remove(&device->listener);
|
||||||
|
if (device->appeared)
|
||||||
|
spa_hook_remove(&device->device_listener);
|
||||||
|
|
||||||
|
sm_object_discard(&device->sdevice->obj);
|
||||||
|
|
||||||
|
pw_unload_spa_handle(device->handle);
|
||||||
|
pw_properties_free(device->props);
|
||||||
|
free(device);
|
||||||
|
}
|
||||||
|
|
||||||
static void device_update(void *data)
|
static void device_update(void *data)
|
||||||
{
|
{
|
||||||
struct device *device = data;
|
struct device *device = data;
|
||||||
|
|
@ -398,6 +415,7 @@ static void device_update(void *data)
|
||||||
static const struct sm_object_events device_events = {
|
static const struct sm_object_events device_events = {
|
||||||
SM_VERSION_OBJECT_EVENTS,
|
SM_VERSION_OBJECT_EVENTS,
|
||||||
.destroy = device_destroy,
|
.destroy = device_destroy,
|
||||||
|
.free = device_free,
|
||||||
.update = device_update,
|
.update = device_update,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -477,21 +495,7 @@ exit:
|
||||||
|
|
||||||
static void bluez5_remove_device(struct impl *impl, struct device *device)
|
static void bluez5_remove_device(struct impl *impl, struct device *device)
|
||||||
{
|
{
|
||||||
struct node *node;
|
sm_object_destroy(&device->sdevice->obj);
|
||||||
|
|
||||||
pw_log_debug("remove device %u", device->id);
|
|
||||||
spa_list_remove(&device->link);
|
|
||||||
spa_hook_remove(&device->device_listener);
|
|
||||||
|
|
||||||
spa_list_consume(node, &device->node_list, link)
|
|
||||||
bluez5_remove_node(device, node);
|
|
||||||
|
|
||||||
if (device->sdevice)
|
|
||||||
sm_object_destroy(&device->sdevice->obj);
|
|
||||||
|
|
||||||
pw_unload_spa_handle(device->handle);
|
|
||||||
pw_properties_free(device->props);
|
|
||||||
free(device);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bluez5_enum_object_info(void *data, uint32_t id,
|
static void bluez5_enum_object_info(void *data, uint32_t id,
|
||||||
|
|
|
||||||
|
|
@ -300,6 +300,20 @@ static void device_destroy(void *data)
|
||||||
libcamera_remove_node(device, node);
|
libcamera_remove_node(device, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void device_free(void *data)
|
||||||
|
{
|
||||||
|
struct device *dev = data;
|
||||||
|
pw_log_debug("remove device %u", dev->id);
|
||||||
|
spa_list_remove(&dev->link);
|
||||||
|
if (dev->appeared)
|
||||||
|
spa_hook_remove(&dev->device_listener);
|
||||||
|
sm_object_discard(&dev->sdevice->obj);
|
||||||
|
spa_hook_remove(&dev->listener);
|
||||||
|
pw_unload_spa_handle(dev->handle);
|
||||||
|
pw_properties_free(dev->props);
|
||||||
|
free(dev);
|
||||||
|
}
|
||||||
|
|
||||||
static void device_update(void *data)
|
static void device_update(void *data)
|
||||||
{
|
{
|
||||||
struct device *device = data;
|
struct device *device = data;
|
||||||
|
|
@ -323,6 +337,7 @@ static void device_update(void *data)
|
||||||
static const struct sm_object_events device_events = {
|
static const struct sm_object_events device_events = {
|
||||||
SM_VERSION_OBJECT_EVENTS,
|
SM_VERSION_OBJECT_EVENTS,
|
||||||
.destroy = device_destroy,
|
.destroy = device_destroy,
|
||||||
|
.free = device_free,
|
||||||
.update = device_update,
|
.update = device_update,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -400,16 +415,7 @@ exit:
|
||||||
|
|
||||||
static void libcamera_remove_device(struct impl *impl, struct device *dev)
|
static void libcamera_remove_device(struct impl *impl, struct device *dev)
|
||||||
{
|
{
|
||||||
pw_log_debug("remove device %u", dev->id);
|
sm_object_destroy(&dev->sdevice->obj);
|
||||||
spa_list_remove(&dev->link);
|
|
||||||
if (dev->appeared)
|
|
||||||
spa_hook_remove(&dev->device_listener);
|
|
||||||
if (dev->sdevice)
|
|
||||||
sm_object_destroy(&dev->sdevice->obj);
|
|
||||||
spa_hook_remove(&dev->listener);
|
|
||||||
pw_unload_spa_handle(dev->handle);
|
|
||||||
pw_properties_free(dev->props);
|
|
||||||
free(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void libcamera_udev_object_info(void *data, uint32_t id,
|
static void libcamera_udev_object_info(void *data, uint32_t id,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue