summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKieran Bingham <kieran.bingham@ideasonboard.com>2020-02-13 21:22:48 +0000
committerKieran Bingham <kieran.bingham@ideasonboard.com>2020-02-14 12:34:23 +0000
commitde584a58f787c4b30485bb592776a8c0b8dc0100 (patch)
treeeea110ab81c5cd5fd1adc07c84ac73515957b11e
parent1bf51730760e19ed3f64d1d0a98a8bcd1e8671d0 (diff)
qcam: Move requestCompleted signal mapping
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. Introducing the error_disconnect cleanup path in start_capture identified that we left the camera in the start state, thus we also add a call to camera->stop() when disconnecting the signal connection. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/qcam/main_window.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index db14245d..38d70633 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;