Skip to content

Commit d4537f7

Browse files
committed
update enumerate video devices with ipc::value
1 parent 9000fe8 commit d4537f7

3 files changed

Lines changed: 17 additions & 20 deletions

File tree

obs-studio-server/source/nodeobs_settings-osx.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@
22

33
#ifdef __APPLE__
44

5-
#include <string>
6-
#include <utility>
5+
#include "ipc-value.hpp"
76
#include <vector>
87

9-
// Returns (localizedName, uniqueID) pairs for connected video capture devices.
10-
// Availability and results depend on the runtime implementation and OS support.
11-
std::vector<std::pair<std::string, std::string>> getVideoDevicesMacOS();
8+
void enumVideoDevicesMacOS(std::vector<ipc::value> &rval);
129

1310
#endif

obs-studio-server/source/nodeobs_settings-osx.mm

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
#include "nodeobs_settings-osx.h"
2-
2+
#include "osn-error.hpp"
33
#import <AVFoundation/AVFoundation.h>
44

55
// This implementation must remain in-sync with plugins/mac-avcapture/plugin-properties.m.
66
// Implementation reference: properties_update_device function.
7-
std::vector<std::pair<std::string, std::string>> getVideoDevicesMacOS()
7+
void enumVideoDevicesMacOS(std::vector<ipc::value> &rval)
88
{
9-
std::vector<std::pair<std::string, std::string>> result;
9+
rval.push_back(ipc::value((uint64_t)ErrorCode::Ok));
10+
uint32_t count = 0;
11+
rval.push_back(ipc::value(0));
1012

1113
@autoreleasepool {
1214
NSArray *deviceTypes;
@@ -23,7 +25,9 @@
2325
for (AVCaptureDevice *device in session.devices) {
2426
if (!device.localizedName || !device.uniqueID)
2527
continue;
26-
result.push_back({[device.localizedName UTF8String], [device.uniqueID UTF8String]});
28+
rval.push_back(ipc::value([device.localizedName UTF8String]));
29+
rval.push_back(ipc::value([device.uniqueID UTF8String]));
30+
count++;
2731
}
2832

2933
AVCaptureDeviceDiscoverySession *muxedDiscoverySession = [AVCaptureDeviceDiscoverySession
@@ -33,9 +37,11 @@
3337
for (AVCaptureDevice *device in muxedDiscoverySession.devices) {
3438
if (!device.localizedName || !device.uniqueID)
3539
continue;
36-
result.push_back({[device.localizedName UTF8String], [device.uniqueID UTF8String]});
40+
rval.push_back(ipc::value([device.localizedName UTF8String]));
41+
rval.push_back(ipc::value([device.uniqueID UTF8String]));
42+
count++;
3743
}
3844
}
3945

40-
return result;
46+
rval[1] = ipc::value(count);
4147
}

obs-studio-server/source/nodeobs_settings.cpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3870,7 +3870,7 @@ void OBS_settings::saveGenericSettings(std::vector<SubCategory> genericSettings,
38703870
// plugins this is fine but should be avoided for plugins like mac-coreaudio
38713871
// because it will create a reconnect_thread. Also might not work for
38723872
// mac_avcapture_fast because this plugin requires that graphics is init first.
3873-
void getDevicesUsingDummySource(const char *source_id, const char *property_name, std::vector<ipc::value> &rval)
3873+
void enumDevicesUsingDummySource(const char *source_id, const char *property_name, std::vector<ipc::value> &rval)
38743874
{
38753875
OBSDataAutoRelease settings = obs_get_source_defaults(source_id);
38763876
if (!settings) {
@@ -4137,17 +4137,11 @@ void OBS_settings::OBS_settings_getVideoDevices(void *data, const int64_t id, co
41374137
if (args.size() > 0)
41384138
sourceId = args[0].value_str;
41394139
if (!sourceId.empty()) {
4140-
getDevicesUsingDummySource(sourceId.c_str(), "device", rval);
4140+
enumDevicesUsingDummySource(sourceId.c_str(), "device", rval);
41414141
} else {
4142-
rval.push_back(ipc::value((uint64_t)ErrorCode::Ok));
41434142
// Enumerate video devices manually so we can use any plugin
41444143
// such as mac_avcapture_fast.
4145-
auto devices = getVideoDevicesMacOS();
4146-
rval.push_back(ipc::value((uint64_t)devices.size()));
4147-
for (const auto &[name, uid] : devices) {
4148-
rval.push_back(ipc::value(name.c_str()));
4149-
rval.push_back(ipc::value(uid.c_str()));
4150-
}
4144+
enumVideoDevicesMacOS(rval);
41514145
}
41524146
#endif
41534147

0 commit comments

Comments
 (0)