diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index 7433d647e8a0..487f522748ca 100644
--- a/src/qcam/main_window.cpp
+++ b/src/qcam/main_window.cpp
@@ -269,11 +269,6 @@ void MainWindow::switchCamera(int index)
 
 	const std::shared_ptr<Camera> &cam = cameras[index];
 
-	if (cam->acquire()) {
-		qInfo() << "Failed to acquire camera" << cam->id().c_str();
-		return;
-	}
-
 	qInfo() << "Switching to camera" << cam->id().c_str();
 
 	/*
@@ -283,7 +278,26 @@ void MainWindow::switchCamera(int index)
 	startStopAction_->setChecked(false);
 
 	camera_->release();
-	camera_ = cam;
+
+	/*
+	 * Only attempt to acquire after releasing to ensure we support
+	 * pipelines which can only stream from one device at a time.
+	 *
+	 * Todo: Consider how we could acquire more than one camera
+	 *       but ensure only one could stream at a time.
+	 */
+	if (cam->acquire()) {
+		qInfo() << "Failed to acquire camera" << cam->id().c_str();
+		qInfo() << "Switching back to " << camera_->id().c_str();
+
+		if (camera_->acquire()) {
+			qInfo() << "Failed to reacquire " << camera_->id().c_str();
+			return;
+		}
+	} else {
+		/* Acquire was successful, Switch to this camera */
+		camera_ = cam;
+	}
 
 	startStopAction_->setChecked(true);
 }
