[libcamera-devel] [PATCH v2 2/7] qcam: Move requestCompleted signal mapping

Kieran Bingham kieran.bingham at ideasonboard.com
Fri Feb 14 01:18:05 CET 2020


The MainWindow connects a handler to the Camera requestCompleted signal
when the camera is opened, but never disconnects it.

Move the connection to the startCapture() function, and ensure that it
is disconnected again when the stream is stopped.

This ensures that we can successfully tear down the stream, and restart
with a new camera.

Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
---
 src/qcam/main_window.cpp | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index db14245d7f51..38d7063363f0 100644
--- a/src/qcam/main_window.cpp
+++ b/src/qcam/main_window.cpp
@@ -113,8 +113,6 @@ int MainWindow::openCamera(CameraManager *cm)
 
 	std::cout << "Using camera " << camera_->name() << std::endl;
 
-	camera_->requestCompleted.connect(this, &MainWindow::requestComplete);
-
 	return 0;
 }
 
@@ -212,17 +210,23 @@ int MainWindow::startCapture()
 		goto error;
 	}
 
+	camera_->requestCompleted.connect(this, &MainWindow::requestComplete);
+
 	for (Request *request : requests) {
 		ret = camera_->queueRequest(request);
 		if (ret < 0) {
 			std::cerr << "Can't queue request" << std::endl;
-			goto error;
+			goto error_disconnect;
 		}
 	}
 
 	isCapturing_ = true;
 	return 0;
 
+error_disconnect:
+	camera_->requestCompleted.disconnect(this, &MainWindow::requestComplete);
+	camera_->stop();
+
 error:
 	for (Request *request : requests)
 		delete request;
@@ -249,6 +253,8 @@ void MainWindow::stopCapture()
 	if (ret)
 		std::cout << "Failed to stop capture" << std::endl;
 
+	camera_->requestCompleted.disconnect(this, &MainWindow::requestComplete);
+
 	for (auto &iter : mappedBuffers_) {
 		void *memory = iter.second.first;
 		unsigned int length = iter.second.second;
-- 
2.20.1



More information about the libcamera-devel mailing list