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:
Pauli Virtanen 2021-03-04 23:57:29 +02:00 committed by Wim Taymans
parent 5b8c7c405d
commit 8ba6e98320
2 changed files with 35 additions and 25 deletions

View file

@ -376,6 +376,23 @@ static void device_destroy(void *data)
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)
{
struct device *device = data;
@ -398,6 +415,7 @@ static void device_update(void *data)
static const struct sm_object_events device_events = {
SM_VERSION_OBJECT_EVENTS,
.destroy = device_destroy,
.free = device_free,
.update = device_update,
};
@ -477,21 +495,7 @@ exit:
static void bluez5_remove_device(struct impl *impl, struct device *device)
{
struct node *node;
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);
sm_object_destroy(&device->sdevice->obj);
}
static void bluez5_enum_object_info(void *data, uint32_t id,

View file

@ -300,6 +300,20 @@ static void device_destroy(void *data)
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)
{
struct device *device = data;
@ -323,6 +337,7 @@ static void device_update(void *data)
static const struct sm_object_events device_events = {
SM_VERSION_OBJECT_EVENTS,
.destroy = device_destroy,
.free = device_free,
.update = device_update,
};
@ -400,16 +415,7 @@ exit:
static void libcamera_remove_device(struct impl *impl, struct device *dev)
{
pw_log_debug("remove device %u", dev->id);
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);
sm_object_destroy(&dev->sdevice->obj);
}
static void libcamera_udev_object_info(void *data, uint32_t id,