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:
parent
9d29af143b
commit
124aaffde0
2 changed files with 38 additions and 0 deletions
|
@ -10,6 +10,8 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include <libcamera/signal.h>
|
||||||
|
|
||||||
namespace libcamera {
|
namespace libcamera {
|
||||||
|
|
||||||
class PipelineHandler;
|
class PipelineHandler;
|
||||||
|
@ -25,10 +27,15 @@ public:
|
||||||
|
|
||||||
const std::string &name() const;
|
const std::string &name() const;
|
||||||
|
|
||||||
|
Signal<Camera *> disconnected;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Camera(PipelineHandler *pipe, const std::string &name);
|
Camera(PipelineHandler *pipe, const std::string &name);
|
||||||
~Camera();
|
~Camera();
|
||||||
|
|
||||||
|
friend class PipelineHandler;
|
||||||
|
void disconnect();
|
||||||
|
|
||||||
std::shared_ptr<PipelineHandler> pipe_;
|
std::shared_ptr<PipelineHandler> pipe_;
|
||||||
std::string name_;
|
std::string name_;
|
||||||
};
|
};
|
||||||
|
|
|
@ -34,6 +34,8 @@
|
||||||
|
|
||||||
namespace libcamera {
|
namespace libcamera {
|
||||||
|
|
||||||
|
LOG_DECLARE_CATEGORY(Camera)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \class Camera
|
* \class Camera
|
||||||
* \brief Camera device
|
* \brief Camera device
|
||||||
|
@ -87,6 +89,18 @@ const std::string &Camera::name() const
|
||||||
return name_;
|
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)
|
Camera::Camera(PipelineHandler *pipe, const std::string &name)
|
||||||
: pipe_(pipe->shared_from_this()), name_(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 */
|
} /* namespace libcamera */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue