diff --git a/doc/classes/CameraServer.xml b/doc/classes/CameraServer.xml index 757c09448c5..3b16768a3b0 100644 --- a/doc/classes/CameraServer.xml +++ b/doc/classes/CameraServer.xml @@ -49,6 +49,29 @@ If [code]true[/code], the server is actively monitoring available camera feeds. This has a performance cost, so only set it to [code]true[/code] when you're actively accessing the camera. + [b]Note:[/b] After setting it to [code]true[/code], you can receive updated camera feeds through the [signal camera_feeds_updated] signal. + [codeblocks] + [gdscript] + func _ready(): + CameraServer.camera_feeds_updated.connect(_on_camera_feeds_updated) + CameraServer.monitoring_feeds = true + + func _on_camera_feeds_updated(): + var feeds = CameraServer.feeds() + [/gdscript] + [csharp] + public override void _Ready() + { + CameraServer.CameraFeedsUpdated += OnCameraFeedsUpdated; + CameraServer.MonitoringFeeds = true; + } + + void OnCameraFeedsUpdated() + { + var feeds = CameraServer.Feeds(); + } + [/csharp] + [/codeblocks] @@ -64,6 +87,11 @@ Emitted when a [CameraFeed] is removed (e.g. a webcam is unplugged). + + + Emitted when camera feeds are updated. + + diff --git a/modules/camera/camera_android.cpp b/modules/camera/camera_android.cpp index 60ff4952901..852da40853a 100644 --- a/modules/camera/camera_android.cpp +++ b/modules/camera/camera_android.cpp @@ -474,6 +474,7 @@ void CameraAndroid::update_feeds() { } ACameraManager_deleteCameraIdList(cameraIds); + emit_signal(SNAME(CameraServer::feeds_updated_signal_name)); } void CameraAndroid::remove_all_feeds() { diff --git a/modules/camera/camera_linux.cpp b/modules/camera/camera_linux.cpp index 0c33598634b..0880bf9e070 100644 --- a/modules/camera/camera_linux.cpp +++ b/modules/camera/camera_linux.cpp @@ -80,6 +80,7 @@ void CameraLinux::_update_devices() { free(devices); } + call_deferred("emit_signal", SNAME(CameraServer::feeds_updated_signal_name)); usleep(1000000); } } diff --git a/modules/camera/camera_macos.mm b/modules/camera/camera_macos.mm index 88f7f0dfb87..eb1a810991e 100644 --- a/modules/camera/camera_macos.mm +++ b/modules/camera/camera_macos.mm @@ -363,6 +363,7 @@ void CameraMacOS::update_feeds() { add_feed(newfeed); }; }; + emit_signal(SNAME(CameraServer::feeds_updated_signal_name)); } void CameraMacOS::set_monitoring_feeds(bool p_monitoring_feeds) { diff --git a/servers/camera_server.cpp b/servers/camera_server.cpp index f95a8cb7306..c23f2020d03 100644 --- a/servers/camera_server.cpp +++ b/servers/camera_server.cpp @@ -53,6 +53,7 @@ void CameraServer::_bind_methods() { ADD_SIGNAL(MethodInfo("camera_feed_added", PropertyInfo(Variant::INT, "id"))); ADD_SIGNAL(MethodInfo("camera_feed_removed", PropertyInfo(Variant::INT, "id"))); + ADD_SIGNAL(MethodInfo(feeds_updated_signal_name)); BIND_ENUM_CONSTANT(FEED_RGBA_IMAGE); BIND_ENUM_CONSTANT(FEED_YCBCR_IMAGE); diff --git a/servers/camera_server.h b/servers/camera_server.h index bb34229dade..91866fa3144 100644 --- a/servers/camera_server.h +++ b/servers/camera_server.h @@ -59,6 +59,7 @@ public: }; typedef CameraServer *(*CreateFunc)(); + static inline constexpr const char feeds_updated_signal_name[] = "camera_feeds_updated"; private: protected: