From 3db5a90828bddb1f5959a20ad3e4ff2174439f5d Mon Sep 17 00:00:00 2001 From: kkostiuk <kateryna.kostiuk@savoirfairelinux.com> Date: Fri, 18 Feb 2022 11:31:24 -0500 Subject: [PATCH] video: start device event listener when device list is empty This patch fix video device detection. Before device event listeners would not start if a video device list is empty. Change-Id: I5b320c1ae47b945d6f570e3cd2afcd6bd01dfdae --- .../osxvideo/video_device_monitor_impl.mm | 58 +++++++++---------- 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/src/media/video/osxvideo/video_device_monitor_impl.mm b/src/media/video/osxvideo/video_device_monitor_impl.mm index c20def6465..1a78c9fdc1 100644 --- a/src/media/video/osxvideo/video_device_monitor_impl.mm +++ b/src/media/video/osxvideo/video_device_monitor_impl.mm @@ -71,45 +71,41 @@ void VideoDeviceMonitorImpl::start() auto myVideoDevices = [[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] arrayByAddingObjectsFromArray: [AVCaptureDevice devicesWithMediaType:AVMediaTypeMuxed]]; - if ( [myVideoDevices count] == 0 ) - { - JAMI_ERR("Can't find any suitable video device"); - return; - } - int deviceCount = [myVideoDevices count]; - int ivideo; - for ( ivideo = 0; ivideo < deviceCount; ++ivideo ) + if (deviceCount > 0) { - AVCaptureDevice* avf_device = [myVideoDevices objectAtIndex:ivideo]; - printf("avcapture %d/%d %s %s\n", ivideo + 1, - deviceCount, - [[avf_device modelID] UTF8String], - [[avf_device uniqueID] UTF8String]); - try { - monitor_->addDevice([[avf_device uniqueID] UTF8String]); - } catch (const std::runtime_error &e) { - JAMI_ERR("%s", e.what()); + for (int ivideo = 0; ivideo < deviceCount; ++ivideo) + { + AVCaptureDevice* avf_device = [myVideoDevices objectAtIndex:ivideo]; + printf("avcapture %d/%d %s %s\n", ivideo + 1, + deviceCount, + [[avf_device modelID] UTF8String], + [[avf_device uniqueID] UTF8String]); + try { + monitor_->addDevice([[avf_device uniqueID] UTF8String]); + } catch (const std::runtime_error &e) { + JAMI_ERR("%s", e.what()); + } } } NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; id deviceWasConnectedObserver = [notificationCenter addObserverForName:AVCaptureDeviceWasConnectedNotification - object:nil - queue:[NSOperationQueue mainQueue] - usingBlock:^(NSNotification *note) { - auto dev = (AVCaptureDevice*)note.object; - if([dev hasMediaType:AVMediaTypeVideo]) - monitor_->addDevice([[dev uniqueID] UTF8String]); - }]; + object:nil + queue:[NSOperationQueue mainQueue] + usingBlock:^(NSNotification *note) { + auto dev = (AVCaptureDevice*)note.object; + if([dev hasMediaType:AVMediaTypeVideo]) + monitor_->addDevice([[dev uniqueID] UTF8String]); + }]; id deviceWasDisconnectedObserver = [notificationCenter addObserverForName:AVCaptureDeviceWasDisconnectedNotification - object:nil - queue:[NSOperationQueue mainQueue] - usingBlock:^(NSNotification *note) { - auto dev = (AVCaptureDevice*)note.object; - if([dev hasMediaType:AVMediaTypeVideo]) - monitor_->removeDevice([[dev uniqueID] UTF8String]); - }]; + object:nil + queue:[NSOperationQueue mainQueue] + usingBlock:^(NSNotification *note) { + auto dev = (AVCaptureDevice*)note.object; + if([dev hasMediaType:AVMediaTypeVideo]) + monitor_->removeDevice([[dev uniqueID] UTF8String]); + }]; observers = [[NSArray alloc] initWithObjects:deviceWasConnectedObserver, deviceWasDisconnectedObserver, nil]; } -- GitLab