From de584a58f787c4b30485bb592776a8c0b8dc0100 Mon Sep 17 00:00:00 2001 From: Kieran Bingham Date: Thu, 13 Feb 2020 21:22:48 +0000 Subject: 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 Reviewed-by: Laurent Pinchart --- src/qcam/main_window.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src/qcam') 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; -- cgit v1.2.1