From d603c1086ac135648d9807e8807c07e437e52fab Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 8 Mar 2021 13:20:02 +0100 Subject: [PATCH] media-session: (re)schedule rescan after new pending operation Every time a new operation is started, schedule a rescan. This ensures that there are no more pending actions before the policy module scans the nodes. This has the effect that all devices and nodes are up to data and ready to be used by policy-node. Fixes #789 --- src/examples/media-session/alsa-monitor.c | 1 + src/examples/media-session/media-session.c | 4 ++++ src/examples/media-session/v4l2-monitor.c | 1 + 3 files changed, 6 insertions(+) diff --git a/src/examples/media-session/alsa-monitor.c b/src/examples/media-session/alsa-monitor.c index 285a4c133..c7d8c28f3 100644 --- a/src/examples/media-session/alsa-monitor.c +++ b/src/examples/media-session/alsa-monitor.c @@ -960,6 +960,7 @@ static void alsa_udev_object_info(void *data, uint32_t id, } else { alsa_update_device(impl, device, info); } + sm_media_session_schedule_rescan(impl->session); } static const struct spa_device_events alsa_udev_events = diff --git a/src/examples/media-session/media-session.c b/src/examples/media-session/media-session.c index 4cc802ce8..07c40cdc5 100644 --- a/src/examples/media-session/media-session.c +++ b/src/examples/media-session/media-session.c @@ -470,6 +470,7 @@ static void device_event_info(void *object, const struct pw_device_info *info) } } sm_object_sync_update(&device->obj); + sm_media_session_schedule_rescan(&impl->this); } static void device_event_param(void *object, int seq, @@ -570,6 +571,7 @@ static void node_event_info(void *object, const struct pw_node_info *info) } } sm_object_sync_update(&node->obj); + sm_media_session_schedule_rescan(&impl->this); } static void node_event_param(void *object, int seq, @@ -1263,6 +1265,7 @@ registry_global(void *data, uint32_t id, impl, id, obj->type, type); update_object(impl, info, obj, id, permissions, type, version, props); } + sm_media_session_schedule_rescan(&impl->this); } int sm_object_add_listener(struct sm_object *obj, struct spa_hook *listener, @@ -1410,6 +1413,7 @@ static void monitor_sync(struct impl *impl) pw_core_set_paused(impl->policy_core, true); impl->monitor_seq = pw_core_sync(impl->monitor_core, 0, impl->monitor_seq); pw_log_debug(NAME " %p: monitor sync start %d", impl, impl->monitor_seq); + sm_media_session_schedule_rescan(&impl->this); } struct pw_proxy *sm_media_session_export(struct sm_media_session *sess, diff --git a/src/examples/media-session/v4l2-monitor.c b/src/examples/media-session/v4l2-monitor.c index 36545d0b1..52d341d0e 100644 --- a/src/examples/media-session/v4l2-monitor.c +++ b/src/examples/media-session/v4l2-monitor.c @@ -255,6 +255,7 @@ static void v4l2_device_object_info(void *data, uint32_t id, } else { v4l2_update_node(dev, node, info); } + sm_media_session_schedule_rescan(dev->impl->session); } static const struct spa_device_events v4l2_device_events = {