From b6b93bccc0202341c64102a6cc19a83b1e32d0a2 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 22 Jan 2021 15:39:50 +0100 Subject: Implement notifications when the available cameras change for macOS Listen to AVCaptureDeviceWas(Dis)ConnectedNotification notifications and refresh our video device list if we get one of them. Change-Id: Idf79e88e06422d74ab61cb82676c4b82fd1fb387 Reviewed-by: Doris Verria Reviewed-by: Lars Knoll --- examples/multimediawidgets/camera/camera.cpp | 29 +++++++++++++++++----------- examples/multimediawidgets/camera/camera.h | 5 +++++ 2 files changed, 23 insertions(+), 11 deletions(-) (limited to 'examples') diff --git a/examples/multimediawidgets/camera/camera.cpp b/examples/multimediawidgets/camera/camera.cpp index 196b8ba84..385608bbc 100644 --- a/examples/multimediawidgets/camera/camera.cpp +++ b/examples/multimediawidgets/camera/camera.cpp @@ -73,18 +73,10 @@ Camera::Camera() : ui(new Ui::Camera) //Camera devices: - QActionGroup *videoDevicesGroup = new QActionGroup(this); + videoDevicesGroup = new QActionGroup(this); videoDevicesGroup->setExclusive(true); - const QList availableCameras = QMediaDeviceManager::videoInputs(); - for (const QCameraInfo &cameraInfo : availableCameras) { - QAction *videoDeviceAction = new QAction(cameraInfo.description(), videoDevicesGroup); - videoDeviceAction->setCheckable(true); - videoDeviceAction->setData(QVariant::fromValue(cameraInfo)); - if (cameraInfo == QMediaDeviceManager::defaultVideoInput()) - videoDeviceAction->setChecked(true); - - ui->menuDevices->addAction(videoDeviceAction); - } + updateCameras(); + connect(QMediaDeviceManager::instance(), &QMediaDeviceManager::videoInputsChanged, this, &Camera::updateCameras); connect(videoDevicesGroup, &QActionGroup::triggered, this, &Camera::updateCameraDevice); connect(ui->captureWidget, &QTabWidget::currentChanged, this, &Camera::updateCaptureMode); @@ -433,3 +425,18 @@ void Camera::closeEvent(QCloseEvent *event) event->accept(); } } + +void Camera::updateCameras() +{ + ui->menuDevices->clear(); + const QList availableCameras = QMediaDeviceManager::videoInputs(); + for (const QCameraInfo &cameraInfo : availableCameras) { + QAction *videoDeviceAction = new QAction(cameraInfo.description(), videoDevicesGroup); + videoDeviceAction->setCheckable(true); + videoDeviceAction->setData(QVariant::fromValue(cameraInfo)); + if (cameraInfo == QMediaDeviceManager::defaultVideoInput()) + videoDeviceAction->setChecked(true); + + ui->menuDevices->addAction(videoDeviceAction); + } +} diff --git a/examples/multimediawidgets/camera/camera.h b/examples/multimediawidgets/camera/camera.h index bdef8b8f8..d45923cc4 100644 --- a/examples/multimediawidgets/camera/camera.h +++ b/examples/multimediawidgets/camera/camera.h @@ -60,6 +60,7 @@ QT_BEGIN_NAMESPACE namespace Ui { class Camera; } +class QActionGroup; QT_END_NAMESPACE class Camera : public QMainWindow @@ -109,6 +110,8 @@ private slots: void readyForCapture(bool ready); void imageSaved(int id, const QString &fileName); + void updateCameras(); + protected: void keyPressEvent(QKeyEvent *event) override; void keyReleaseEvent(QKeyEvent *event) override; @@ -117,6 +120,8 @@ protected: private: Ui::Camera *ui; + QActionGroup *videoDevicesGroup = nullptr; + QScopedPointer m_camera; QCameraImageCapture *m_imageCapture; QScopedPointer m_mediaRecorder; -- cgit v1.2.3