directshow: Fix plugging/unplugging a second camera

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>
This commit is contained in:
Sergio Martins
2015-02-04 16:28:21 +00:00
committed by Sérgio Martins
parent 456944f855
commit 8923c0ff6b

View File

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