[libcamera-devel] [PATCH v2 3/5] libcamera: camera_manager: Introduce signals when a camera is added/removed
Umang Jain
email at uajain.com
Tue May 19 10:53:49 CEST 2020
Hi Kieran,
On Mon, 2020-05-18 at 16:44 +0100, Kieran Bingham wrote:
> Hi Umang,
>
> On 13/05/2020 18:29, Umang Jain wrote:
> > Emit 'cameraAdded' and 'cameraRemoved' from CameraManager to enable
> > hotplug and hot-unplug support in appplications like QCam.
>
> s/appplications/applications/
>
>
> Hrm ... seeing cameraAdded and cameraRemoved, makes me think back to
> my
> earlier signal name bikeshedding ;-) Perhaps that one should be
> deviceAdded and deviceRemoved (was newDevicesFound?)
>
> Anyway, let the bikeshedding happen on that patch instead ;-)
The DeviceEnumerator::newDevicesFound is somewhat internal to libcamera
(i.e. not meant to be used by applications - only by CameraManager).
'cameraAdded' and 'cameraRemoved' are application facing signal-probes
that denote hotplugging. Maybe using 'newCameraAdded'
and 'cameraRemoved' for CameraManager will make more things clear?
As far as DeviceEnumerator:newDevicesFound is concerned, I think:
s/newDeviceFound/deviceAdded/ should do too.
>
> > Signed-off-by: Umang Jain <email at uajain.com>
> > ---
> > include/libcamera/camera_manager.h | 6 +++++-
> > src/libcamera/camera_manager.cpp | 34
> > +++++++++++++++++++++++++++---
> > src/libcamera/pipeline_handler.cpp | 2 +-
> > 3 files changed, 37 insertions(+), 5 deletions(-)
> >
> > diff --git a/include/libcamera/camera_manager.h
> > b/include/libcamera/camera_manager.h
> > index 079f848..366fa07 100644
> > --- a/include/libcamera/camera_manager.h
> > +++ b/include/libcamera/camera_manager.h
> > @@ -13,6 +13,7 @@
> > #include <vector>
> >
> > #include <libcamera/object.h>
> > +#include <libcamera/signal.h>
> >
> > namespace libcamera {
> >
> > @@ -35,13 +36,16 @@ public:
> > std::shared_ptr<Camera> get(dev_t devnum);
> >
> > void addCamera(std::shared_ptr<Camera> camera, dev_t devnum);
> > - void removeCamera(Camera *camera);
> > + void removeCamera(std::shared_ptr<Camera> camera);
> >
> > static const std::string &version() { return version_; }
> >
> > void setEventDispatcher(std::unique_ptr<EventDispatcher>
> > dispatcher);
> > EventDispatcher *eventDispatcher();
> >
> > + Signal<std::shared_ptr<Camera>> cameraAdded;
> > + Signal<std::shared_ptr<Camera>> cameraRemoved;
> > +
> > private:
> > static const std::string version_;
> > static CameraManager *self_;
> > diff --git a/src/libcamera/camera_manager.cpp
> > b/src/libcamera/camera_manager.cpp
> > index a13cfe1..b9d2496 100644
> > --- a/src/libcamera/camera_manager.cpp
> > +++ b/src/libcamera/camera_manager.cpp
> > @@ -186,7 +186,7 @@ void
> > CameraManager::Private::addCamera(std::shared_ptr<Camera> &camera,
> > }
> > }
> >
> > - cameras_.push_back(std::move(camera));
> > + cameras_.push_back(camera);
> >
> > if (devnum) {
> > unsigned int index = cameras_.size() - 1;
> > @@ -376,6 +376,32 @@ std::shared_ptr<Camera>
> > CameraManager::get(dev_t devnum)
> > return iter->second.lock();
> > }
> >
> > +/**
> > + * \brief Notify of a new camera added to the system
>
> Missing the \var to reference the signal.
>
> > + *
> > + * This signal is emitted when a new camera is detected and
> > successfully handled
> > + * by the camera manager. The notification occurs alike for
> > cameras detected
> > + * when the manager is started with start() or when new cameras
> > are later
> > + * connected to the system. When the signal is emitted the new
> > camera is already
> > + * available from the list of cameras().
> > + *
> > + * The signal is emitted from the CameraManager thread.
> > Applications shall
> > + * minimize the time spent in the signal handler and shall in
> > particular not
> > + * perform any blocking operation.
> > + */
> > +
> > +/**
>
> And missing here too.
>
> > + * \brief Notify of a new camera removed from the system
> > + *
> > + * This signal is emitted when a camera is removed from the
> > system. When the
> > + * signal is emitted the camera is not available from the list of
> > cameras()
> > + * anymore.
> > + *
> > + * The signal is emitted from the CameraManager thread.
> > Applications shall
> > + * minimize the time spent in the signal handler and shall in
> > particular not
> > + * perform any blocking operation.
> > + */
> > +
> > /**
> > * \brief Add a camera to the camera manager
> > * \param[in] camera The camera to be added
> > @@ -395,6 +421,7 @@ void
> > CameraManager::addCamera(std::shared_ptr<Camera> camera, dev_t
> > devnum)
> > ASSERT(Thread::current() == p_.get());
> >
> > p_->addCamera(camera, devnum);
> > + cameraAdded.emit(camera);
> > }
> >
> > /**
> > @@ -407,11 +434,12 @@ void
> > CameraManager::addCamera(std::shared_ptr<Camera> camera, dev_t
> > devnum)
> > *
> > * \context This function shall be called from the CameraManager
> > thread.
> > */
> > -void CameraManager::removeCamera(Camera *camera)
> > +void CameraManager::removeCamera(std::shared_ptr<Camera> camera)
> > {
> > ASSERT(Thread::current() == p_.get());
> >
> > - p_->removeCamera(camera);
> > + p_->removeCamera(camera.get());
> > + cameraRemoved.emit(camera);
>
> Is there any race here, or potential problem emitting the signal with
> the camera, after it's been removed from the CameraManager? (I
> hope/expect not as it's using a shared_ptr ... But I haven't checked
> to
> see if there are any implications caused by the removeCamera call)
>
>
> > }
> >
> > /**
> > diff --git a/src/libcamera/pipeline_handler.cpp
> > b/src/libcamera/pipeline_handler.cpp
> > index 254d341..a9187e1 100644
> > --- a/src/libcamera/pipeline_handler.cpp
> > +++ b/src/libcamera/pipeline_handler.cpp
> > @@ -555,7 +555,7 @@ void PipelineHandler::disconnect()
> > continue;
> >
> > camera->disconnect();
> > - manager_->removeCamera(camera.get());
> > + manager_->removeCamera(camera);
> > }
> >
> > cameras_.clear();
> >
More information about the libcamera-devel
mailing list