diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/android/camera_hal_manager.cpp | 5 | ||||
-rw-r--r-- | src/cam/main.cpp | 8 | ||||
-rw-r--r-- | src/libcamera/camera_manager.cpp | 36 | ||||
-rw-r--r-- | src/qcam/main.cpp | 4 |
4 files changed, 30 insertions, 23 deletions
diff --git a/src/android/camera_hal_manager.cpp b/src/android/camera_hal_manager.cpp index cf981720..22f0323b 100644 --- a/src/android/camera_hal_manager.cpp +++ b/src/android/camera_hal_manager.cpp @@ -59,7 +59,7 @@ void CameraHalManager::run() * order to bind them to the camera HAL manager thread that * executes the event dispatcher. */ - cameraManager_ = libcamera::CameraManager::instance(); + cameraManager_ = new CameraManager(); int ret = cameraManager_->start(); if (ret) { @@ -93,7 +93,10 @@ void CameraHalManager::run() /* Clean up the resources we have allocated. */ proxies_.clear(); + cameraManager_->stop(); + delete cameraManager_; + cameraManager_ = nullptr; } CameraProxy *CameraHalManager::open(unsigned int id, diff --git a/src/cam/main.cpp b/src/cam/main.cpp index 77bb20e9..9d99f558 100644 --- a/src/cam/main.cpp +++ b/src/cam/main.cpp @@ -23,6 +23,7 @@ class CamApp { public: CamApp(); + ~CamApp(); static CamApp *instance(); @@ -54,6 +55,11 @@ CamApp::CamApp() CamApp::app_ = this; } +CamApp::~CamApp() +{ + delete cm_; +} + CamApp *CamApp::instance() { return CamApp::app_; @@ -67,7 +73,7 @@ int CamApp::init(int argc, char **argv) if (ret < 0) return ret; - cm_ = CameraManager::instance(); + cm_ = new CameraManager(); ret = cm_->start(); if (ret) { diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp index 4a880684..12cb5a0b 100644 --- a/src/libcamera/camera_manager.cpp +++ b/src/libcamera/camera_manager.cpp @@ -35,11 +35,14 @@ LOG_DEFINE_CATEGORY(Camera) * in the system to applications. The manager owns all Camera objects and * handles hot-plugging and hot-unplugging to manage the lifetime of cameras. * - * To interact with libcamera, an application retrieves the camera manager - * instance with CameraManager::instance(). The manager is initially stopped, - * and shall be configured before being started. In particular a custom event - * dispatcher shall be installed if needed with - * CameraManager::setEventDispatcher(). + * To interact with libcamera, an application starts by creating a camera + * manager instance. Only a single instance of the camera manager may exist at + * a time. Attempting to create a second instance without first deleting the + * existing instance results in undefined behaviour. + * + * The manager is initially stopped, and shall be configured before being + * started. In particular a custom event dispatcher shall be installed if + * needed with CameraManager::setEventDispatcher(). * * Once the camera manager is configured, it shall be started with start(). * This will enumerate all the cameras present in the system, which can then be @@ -56,13 +59,21 @@ LOG_DEFINE_CATEGORY(Camera) * removed due to hot-unplug. */ +CameraManager *CameraManager::self_ = nullptr; + CameraManager::CameraManager() : enumerator_(nullptr) { + if (self_) + LOG(Camera, Fatal) + << "Multiple CameraManager objects are not allowed"; + + self_ = this; } CameraManager::~CameraManager() { + self_ = nullptr; } /** @@ -213,21 +224,6 @@ void CameraManager::removeCamera(Camera *camera) } /** - * \brief Retrieve the camera manager instance - * - * The CameraManager is a singleton and can't be constructed manually. This - * function shall instead be used to retrieve the single global instance of the - * manager. - * - * \return The camera manager instance - */ -CameraManager *CameraManager::instance() -{ - static CameraManager manager; - return &manager; -} - -/** * \fn const std::string &CameraManager::version() * \brief Retrieve the libcamera version string * \return The libcamera version string diff --git a/src/qcam/main.cpp b/src/qcam/main.cpp index 05d3b77e..a7ff5c52 100644 --- a/src/qcam/main.cpp +++ b/src/qcam/main.cpp @@ -63,7 +63,7 @@ int main(int argc, char **argv) sigaction(SIGINT, &sa, nullptr); std::unique_ptr<EventDispatcher> dispatcher(new QtEventDispatcher()); - CameraManager *cm = CameraManager::instance(); + CameraManager *cm = new CameraManager(); cm->setEventDispatcher(std::move(dispatcher)); ret = cm->start(); @@ -79,5 +79,7 @@ int main(int argc, char **argv) delete mainWindow; cm->stop(); + delete cm; + return ret; } |