[libcamera-devel] [PATCH v2 2/5] libcamera: device_enumerator: Emit a signal when a new device is hotplugged
Kieran Bingham
kieran.bingham at ideasonboard.com
Mon May 18 15:20:54 CEST 2020
Hi Umang,
On 13/05/2020 18:29, Umang Jain wrote:
> Emit a signal whenever is a new MediaDevice is added to the
s/ whenever is a / whenever a /
> DeviceEnumerator. This will allow CameraManager to get notified
s/get/be/
> about the new devices that have been hot-plugged.
>
> Signed-off-by: Umang Jain <email at uajain.com>
> ---
> src/libcamera/camera_manager.cpp | 4 ++--
> src/libcamera/device_enumerator.cpp | 12 ++++++++++++
> src/libcamera/include/device_enumerator.h | 4 ++++
> 3 files changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
> index 1579ad4..a13cfe1 100644
> --- a/src/libcamera/camera_manager.cpp
> +++ b/src/libcamera/camera_manager.cpp
> @@ -154,12 +154,12 @@ void CameraManager::Private::enumerateDevices()
> }
> }
>
> - /* \todo register hot-plug callback here */
> + enumerator_->newDevicesFound.connect(this, &Private::enumerateDevices);
I'm half tempted to suggest calling this signal hotplug ...
But I think it's just bikesheding as then I end up down the path of
should it be hotPlug or hotplug, and should we have hotUnPlug or
hotplugRemove or ... oh it's a rabbit hole ;-)
> }
>
> void CameraManager::Private::cleanup()
> {
> - /* \todo unregister hot-plug callback here */
> + enumerator_->newDevicesFound.disconnect(this, &Private::enumerateDevices);
>
> /*
> * Release all references to cameras and pipeline handlers to ensure
> diff --git a/src/libcamera/device_enumerator.cpp b/src/libcamera/device_enumerator.cpp
> index dd17e3e..0492a86 100644
> --- a/src/libcamera/device_enumerator.cpp
> +++ b/src/libcamera/device_enumerator.cpp
> @@ -227,6 +227,15 @@ std::unique_ptr<MediaDevice> DeviceEnumerator::createDevice(const std::string &d
> return media;
> }
>
> +/**
I think this is missing tieing it to the signal?
Not 100% sure how to do that with doxygen, perhaps it's just
\var newDevicesFound
Presumably other signals are documented to show how this is done.
> +* \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 of 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 +251,9 @@ void DeviceEnumerator::addDevice(std::unique_ptr<MediaDevice> &&media)
> << "Added device " << media->deviceNode() << ": " << media->driver();
>
> devices_.push_back(std::move(media));
> +
> + /* \todo: To batch multiple additions, emit with a small delay here. */
Do we have support already to register a timeout or such to make this
call N milliseconds after the last registration of a device?
Sounds like a good way to reduce the signal frequency...
> + newDevicesFound.emit();
> }
>
> /**
> diff --git a/src/libcamera/include/device_enumerator.h b/src/libcamera/include/device_enumerator.h
> index 433e357..cd4e846 100644
> --- a/src/libcamera/include/device_enumerator.h
> +++ b/src/libcamera/include/device_enumerator.h
> @@ -13,6 +13,8 @@
>
> #include <linux/media.h>
>
> +#include <libcamera/signal.h>
> +
> namespace libcamera {
>
> class MediaDevice;
> @@ -43,6 +45,8 @@ public:
>
> std::shared_ptr<MediaDevice> search(const DeviceMatch &dm);
>
> + Signal<> newDevicesFound;
> +
> protected:
> std::unique_ptr<MediaDevice> createDevice(const std::string &deviceNode);
> void addDevice(std::unique_ptr<MediaDevice> &&media);
>
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list