Skip to content

Commit 7f96fc5

Browse files
committed
Merge pull request #108165 from shiena/feature/improve-camera-server
Add `CameraServer` `feeds_updated` signal, and document async behavior
2 parents 11ba78a + 2560ddb commit 7f96fc5

File tree

6 files changed

+33
-0
lines changed

6 files changed

+33
-0
lines changed

doc/classes/CameraServer.xml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,29 @@
4949
<member name="monitoring_feeds" type="bool" setter="set_monitoring_feeds" getter="is_monitoring_feeds" default="false">
5050
If [code]true[/code], the server is actively monitoring available camera feeds.
5151
This has a performance cost, so only set it to [code]true[/code] when you're actively accessing the camera.
52+
[b]Note:[/b] After setting it to [code]true[/code], you can receive updated camera feeds through the [signal camera_feeds_updated] signal.
53+
[codeblocks]
54+
[gdscript]
55+
func _ready():
56+
CameraServer.camera_feeds_updated.connect(_on_camera_feeds_updated)
57+
CameraServer.monitoring_feeds = true
58+
59+
func _on_camera_feeds_updated():
60+
var feeds = CameraServer.feeds()
61+
[/gdscript]
62+
[csharp]
63+
public override void _Ready()
64+
{
65+
CameraServer.CameraFeedsUpdated += OnCameraFeedsUpdated;
66+
CameraServer.MonitoringFeeds = true;
67+
}
68+
69+
void OnCameraFeedsUpdated()
70+
{
71+
var feeds = CameraServer.Feeds();
72+
}
73+
[/csharp]
74+
[/codeblocks]
5275
</member>
5376
</members>
5477
<signals>
@@ -64,6 +87,11 @@
6487
Emitted when a [CameraFeed] is removed (e.g. a webcam is unplugged).
6588
</description>
6689
</signal>
90+
<signal name="camera_feeds_updated">
91+
<description>
92+
Emitted when camera feeds are updated.
93+
</description>
94+
</signal>
6795
</signals>
6896
<constants>
6997
<constant name="FEED_RGBA_IMAGE" value="0" enum="FeedImage">

modules/camera/camera_android.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,7 @@ void CameraAndroid::update_feeds() {
474474
}
475475

476476
ACameraManager_deleteCameraIdList(cameraIds);
477+
emit_signal(SNAME(CameraServer::feeds_updated_signal_name));
477478
}
478479

479480
void CameraAndroid::remove_all_feeds() {

modules/camera/camera_linux.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ void CameraLinux::_update_devices() {
8080
free(devices);
8181
}
8282

83+
call_deferred("emit_signal", SNAME(CameraServer::feeds_updated_signal_name));
8384
usleep(1000000);
8485
}
8586
}

modules/camera/camera_macos.mm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,7 @@ - (void)dealloc {
363363
add_feed(newfeed);
364364
};
365365
};
366+
emit_signal(SNAME(CameraServer::feeds_updated_signal_name));
366367
}
367368

368369
void CameraMacOS::set_monitoring_feeds(bool p_monitoring_feeds) {

servers/camera_server.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ void CameraServer::_bind_methods() {
5353

5454
ADD_SIGNAL(MethodInfo("camera_feed_added", PropertyInfo(Variant::INT, "id")));
5555
ADD_SIGNAL(MethodInfo("camera_feed_removed", PropertyInfo(Variant::INT, "id")));
56+
ADD_SIGNAL(MethodInfo(feeds_updated_signal_name));
5657

5758
BIND_ENUM_CONSTANT(FEED_RGBA_IMAGE);
5859
BIND_ENUM_CONSTANT(FEED_YCBCR_IMAGE);

servers/camera_server.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class CameraServer : public Object {
5959
};
6060

6161
typedef CameraServer *(*CreateFunc)();
62+
static inline constexpr const char feeds_updated_signal_name[] = "camera_feeds_updated";
6263

6364
private:
6465
protected:

0 commit comments

Comments
 (0)