From c61d523d583c28b10bad11281dcf430376a50dee Mon Sep 17 00:00:00 2001 From: PatTheMav Date: Mon, 20 Jun 2022 10:07:41 +0200 Subject: [PATCH] mac-avcapture: Fix deprecation warning for AVCaptureDevice list Direct access to `[AVCaptureDevice devices]` is deprecated since macOS 10.15. An `AVCaptureDeviceDiscoverySession` is to be used instead, which this PR implements. When running on older macOS versions or compiling against older platform SDKs, the deprecated method is used. PS: The formatting is not proper ObjC style, but that's clang-format's doing with our current settings. --- plugins/mac-avcapture/av-capture.mm | 37 ++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/plugins/mac-avcapture/av-capture.mm b/plugins/mac-avcapture/av-capture.mm index 54818824f..58c44825f 100644 --- a/plugins/mac-avcapture/av-capture.mm +++ b/plugins/mac-avcapture/av-capture.mm @@ -3,6 +3,7 @@ #import #import #import +#include #include #include @@ -2241,7 +2242,41 @@ static obs_properties_t *av_capture_properties(void *data) OBS_COMBO_FORMAT_STRING); obs_property_list_add_string(dev_list, "", ""); - for (AVCaptureDevice *dev in [AVCaptureDevice devices]) { + NSArray *devices = nil; +#if (__MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_15) + if (@available(macOS 10.15, *)) { + AVCaptureDeviceDiscoverySession *mediaDeviceDiscoverySession = + [AVCaptureDeviceDiscoverySession + discoverySessionWithDeviceTypes:@[ + AVCaptureDeviceTypeBuiltInWideAngleCamera, + AVCaptureDeviceTypeExternalUnknown + ] + mediaType:AVMediaTypeVideo + position:AVCaptureDevicePositionUnspecified]; + NSArray *mediaDevices = [mediaDeviceDiscoverySession devices]; + + AVCaptureDeviceDiscoverySession *muxedDeviceDiscoverySession = + [AVCaptureDeviceDiscoverySession + discoverySessionWithDeviceTypes:@[ + AVCaptureDeviceTypeExternalUnknown + ] + mediaType:AVMediaTypeMuxed + position:AVCaptureDevicePositionUnspecified]; + NSArray *muxedDevices = [muxedDeviceDiscoverySession devices]; + + devices = [mediaDevices + arrayByAddingObjectsFromArray:muxedDevices]; + } else { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + devices = [AVCaptureDevice devices]; +#pragma clang diagnostic pop + } +#else + devices = [AVCaptureDevice devices]; +#endif + + for (AVCaptureDevice *dev in devices) { if ([dev hasMediaType:AVMediaTypeVideo] || [dev hasMediaType:AVMediaTypeMuxed]) { obs_property_list_add_string(