libcamera: camera: Add disconnection notification

As camera object have the potential to outlive the hardware they
represent, there is a need to inform the camera that the underlying
device has been disconnected, and in turn to notify applications.

Implement a disconnection notification mechanism that can be used by
pipeline handlers to notify the camera of disconnection. The camera then
block all new API calls and emit the disconnected signal.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Niklas Söderlund 2019-01-22 16:58:40 +01:00 committed by Laurent Pinchart
parent 9d29af143b
commit 124aaffde0
2 changed files with 38 additions and 0 deletions

View file

@ -10,6 +10,8 @@
#include <memory>
#include <string>
#include <libcamera/signal.h>
namespace libcamera {
class PipelineHandler;
@ -25,10 +27,15 @@ public:
const std::string &name() const;
Signal<Camera *> disconnected;
private:
Camera(PipelineHandler *pipe, const std::string &name);
~Camera();
friend class PipelineHandler;
void disconnect();
std::shared_ptr<PipelineHandler> pipe_;
std::string name_;
};

View file

@ -34,6 +34,8 @@
namespace libcamera {
LOG_DECLARE_CATEGORY(Camera)
/**
* \class Camera
* \brief Camera device
@ -87,6 +89,18 @@ const std::string &Camera::name() const
return name_;
}
/**
* \var Camera::disconnected
* \brief Signal emitted when the camera is disconnected from the system
*
* This signal is emitted when libcamera detects that the cameera has been
* removed from the system. For hot-pluggable devices this is usually caused by
* physical device disconnection. The media device is passed as a parameter.
*
* As soon as this signal is emitted the camera instance will refuse all new
* application API calls by returning errors immediately.
*/
Camera::Camera(PipelineHandler *pipe, const std::string &name)
: pipe_(pipe->shared_from_this()), name_(name)
{
@ -96,4 +110,21 @@ Camera::~Camera()
{
}
/**
* \brief Notify camera disconnection
*
* This method is used to notify the camera instance that the underlying
* hardware has been unplugged. In response to the disconnection the camera
* instance notifies the application by emitting the #disconnected signal, and
* ensures that all new calls to the application-facing Camera API return an
* error immediately.
*/
void Camera::disconnect()
{
LOG(Camera, Debug) << "Disconnecting camera " << name_;
/** \todo Block API calls when they will be implemented. */
disconnected.emit(this);
}
} /* namespace libcamera */