directshow: Fix plugging/unplugging a second camera
authorSergio Martins <sergio.martins@kdab.com>
Wed, 4 Feb 2015 16:28:21 +0000 (16:28 +0000)
committerSérgio Martins <sergio.martins@kdab.com>
Thu, 5 Feb 2015 13:42:10 +0000 (13:42 +0000)
When having more than 1 camera (like one laptop integrated webcam
and a separate one) you had to restart the application for QCameraInfo::availableCameras()
to work.

Change-Id: I47cfa928cfd9500524b81a4bf8ec5ebff0b79879
Reviewed-by: Yoann Lopes <yoann.lopes@theqtcompany.com>
src/plugins/directshow/dsserviceplugin.cpp

index b59cd1d..f28f274 100644 (file)
@@ -39,6 +39,7 @@
 #include "dsvideodevicecontrol.h"
 
 #ifdef QMEDIA_DIRECTSHOW_CAMERA
+#include <QtCore/QElapsedTimer>
 #include <dshow.h>
 #include "dscameraservice.h"
 #endif
@@ -121,8 +122,7 @@ QByteArray DSServicePlugin::defaultDevice(const QByteArray &service) const
 {
 #ifdef QMEDIA_DIRECTSHOW_CAMERA
     if (service == Q_MEDIASERVICE_CAMERA) {
-        if (m_cameraDevices.isEmpty())
-            updateDevices();
+        updateDevices();
 
         return m_defaultCameraDevice;
     }
@@ -135,8 +135,7 @@ QList<QByteArray> DSServicePlugin::devices(const QByteArray &service) const
 {
 #ifdef QMEDIA_DIRECTSHOW_CAMERA
     if (service == Q_MEDIASERVICE_CAMERA) {
-        if (m_cameraDevices.isEmpty())
-            updateDevices();
+        updateDevices();
 
         return m_cameraDevices;
     }
@@ -149,8 +148,7 @@ QString DSServicePlugin::deviceDescription(const QByteArray &service, const QByt
 {
 #ifdef QMEDIA_DIRECTSHOW_CAMERA
     if (service == Q_MEDIASERVICE_CAMERA) {
-        if (m_cameraDevices.isEmpty())
-            updateDevices();
+        updateDevices();
 
         for (int i=0; i<m_cameraDevices.count(); i++)
             if (m_cameraDevices[i] == device)
@@ -164,6 +162,10 @@ QString DSServicePlugin::deviceDescription(const QByteArray &service, const QByt
 
 void DSServicePlugin::updateDevices() const
 {
+    static QElapsedTimer timer;
+    if (timer.isValid() && timer.elapsed() < 500) // ms
+        return;
+
     addRefCount();
 
     m_defaultCameraDevice.clear();
@@ -176,6 +178,7 @@ void DSServicePlugin::updateDevices() const
     }
 
     releaseRefCount();
+    timer.restart();
 }
 #endif