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