From patchwork Tue Jun 16 19:45:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 4067 Return-Path: Received: from o1.f.az.sendgrid.net (o1.f.az.sendgrid.net [208.117.55.132]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 2FE32603C4 for ; Tue, 16 Jun 2020 21:45:37 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=uajain.com header.i=@uajain.com header.b="homrzrVG"; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=uajain.com; h=from:subject:in-reply-to:references:mime-version:to:cc: content-transfer-encoding:content-type; s=s1; bh=HRIMNLA7LvCcjxKSj7EXJEBLwqsw622/8tZpTpXIiKM=; b=homrzrVG/mTYqN/OmKYyECq7uVt5vEiNFrn+W1sch0AZjSw2r+SKH45QvssyrFeA7TCq CsOzXN8fVnGhAwC45bIB/lWwAPubJvMSvRcxX3DRMTeEF99OMRAZOqSgjvtXfSrKNauEM+ rluRWLw/2STQ7IV5ueU7qQJ0+qYXnPD6s= Received: by filterdrecv-p3mdw1-6f5df8956d-25bh4 with SMTP id filterdrecv-p3mdw1-6f5df8956d-25bh4-19-5EE9215F-8E 2020-06-16 19:45:35.945609367 +0000 UTC m=+1121503.543881372 Received: from mail.uajain.com (unknown) by ismtpd0006p1maa1.sendgrid.net (SG) with ESMTP id XTwDqPMGS7G7f7OK3HfI6Q Tue, 16 Jun 2020 19:45:35.587 +0000 (UTC) From: Umang Jain Date: Tue, 16 Jun 2020 19:45:36 +0000 (UTC) Message-Id: <20200616194523.23268-4-email@uajain.com> In-Reply-To: <20200616194523.23268-1-email@uajain.com> References: <20200616194523.23268-1-email@uajain.com> Mime-Version: 1.0 X-SG-EID: 1Q40EQ7YGir8a9gjSIAdTjhngY657NMk9ckeo4dbHZDiOpywc/L3L9rFqlwE4KPclKwCK9CCZVFbQyNjpl2ex/ZeUGECgJ3/kvYxMJpVbVxe/Y/bRHUQZ5dpXE55Cw1MNGLVQWvLoPv8rSaooLH+nGSNa6CPFgOK7Yjxd+EUHlr644WwKjA53nU4vA/woL4axWn10SvFqkEmXfz2XqV4gVeyU/sYXFE8anC/rJtZfRYPOS+ihC5P5NwkWV0LuZWctpXcKf4PkCsyKTp8QzMbEA== To: laurent.pinchart@ideasonboard.com, kieran.bingham@ideasonboard.com, libcamera-devel@lists.libcamera.org Subject: [libcamera-devel] [PATCH v5 3/6] libcamera: device_enumerator: Emit a signal when new devices are added X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 16 Jun 2020 19:45:38 -0000 Emit a signal whenever new MediaDevices are added to the DeviceEnumerator. This will allow CameraManager to be notified about the new devices and it can re-emumerate all the devices currently present on the system. Device enumeration by the CameraManger is an expensive operation hence, we want one signal emission per 'x' milliseconds to notify multiple devices additions as a single batch, by the DeviceEnumerator. Add a \todo to investigate the support for that. Signed-off-by: Umang Jain Reviewed-by: Laurent Pinchart Reviewed-by: Kieran Bingham --- include/libcamera/internal/device_enumerator.h | 4 ++++ src/libcamera/camera_manager.cpp | 4 ++-- src/libcamera/device_enumerator.cpp | 13 +++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/include/libcamera/internal/device_enumerator.h b/include/libcamera/internal/device_enumerator.h index 25a3630..a985040 100644 --- a/include/libcamera/internal/device_enumerator.h +++ b/include/libcamera/internal/device_enumerator.h @@ -13,6 +13,8 @@ #include +#include + namespace libcamera { class MediaDevice; @@ -43,6 +45,8 @@ public: std::shared_ptr search(const DeviceMatch &dm); + Signal<> devicesAdded; + protected: std::unique_ptr createDevice(const std::string &deviceNode); void addDevice(std::unique_ptr &&media); diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp index de6d5d8..3082797 100644 --- a/src/libcamera/camera_manager.cpp +++ b/src/libcamera/camera_manager.cpp @@ -155,12 +155,12 @@ void CameraManager::Private::createPipelineHandlers() } } - /* \todo Register hot-plug callback here */ + enumerator_->devicesAdded.connect(this, &Private::createPipelineHandlers); } void CameraManager::Private::cleanup() { - /* \todo Unregister hot-plug callback here */ + enumerator_->devicesAdded.disconnect(this, &Private::createPipelineHandlers); /* * Release all references to cameras to ensure they all get destroyed diff --git a/src/libcamera/device_enumerator.cpp b/src/libcamera/device_enumerator.cpp index e21a2a7..647974b 100644 --- a/src/libcamera/device_enumerator.cpp +++ b/src/libcamera/device_enumerator.cpp @@ -227,6 +227,16 @@ std::unique_ptr DeviceEnumerator::createDevice(const std::string &d return media; } +/** +* \var DeviceEnumerator::devicesAdded +* \brief Notify of new media devices being found +* +* This signal is emitted when the device enumerator finds new media devices in +* the system. It may be emitted for every newly detected device, or once for +* multiple devices, at the discretion of the device enumerator. Not all device +* enumerator types may support dynamic detection of new devices. +*/ + /** * \brief Add a media device to the enumerator * \param[in] media media device instance to add @@ -242,6 +252,9 @@ void DeviceEnumerator::addDevice(std::unique_ptr &&media) << "Added device " << media->deviceNode() << ": " << media->driver(); devices_.push_back(std::move(media)); + + /* \todo To batch multiple additions, emit with a small delay here. */ + devicesAdded.emit(); } /**