From 110dd5b405ce4f8146da4430e3180833610712ad Mon Sep 17 00:00:00 2001 From: Val Doroshchuk Date: Thu, 28 Mar 2019 14:52:00 +0100 Subject: Android: Fix status of QMediaRecorder after start/stop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the camera is ready for capture -> QMediaRecorder::LoadedStatus. If CaptureVideo is changed to CaptureStillImage -> StoppedState and UnloadedStatus. If camera's status is StoppingStatus -> StoppedState and UnloadedStatus. If camera's status is LoadingStatus -> LoadingStatus. If recording is requested -> RecordingState and RecordingStatus. If recording is audio-only -> immediately LoadedStatus, before start and after stop. Fixes tst_QCameraBackend::testVideoRecording Task-number: QTBUG-73582 Change-Id: I976c4e3afab529e0949571c4002e9ceba74cac97 Reviewed-by: Christian Strømme --- .../src/mediacapture/qandroidcapturesession.cpp | 79 ++++++++++------------ .../src/mediacapture/qandroidcapturesession.h | 1 - 2 files changed, 35 insertions(+), 45 deletions(-) diff --git a/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp b/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp index bdc7ed403..bc9bc983e 100644 --- a/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp +++ b/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp @@ -73,16 +73,41 @@ QAndroidCaptureSession::QAndroidCaptureSession(QAndroidCameraSession *cameraSess QMediaStorageLocation::Sounds, AndroidMultimediaUtils::getDefaultMediaDirectory(AndroidMultimediaUtils::Sounds)); - connect(this, SIGNAL(stateChanged(QMediaRecorder::State)), this, SLOT(updateStatus())); - if (cameraSession) { connect(cameraSession, SIGNAL(opened()), this, SLOT(onCameraOpened())); - connect(cameraSession, SIGNAL(statusChanged(QCamera::Status)), this, SLOT(updateStatus())); - connect(cameraSession, SIGNAL(captureModeChanged(QCamera::CaptureModes)), - this, SLOT(updateStatus())); - connect(cameraSession, SIGNAL(readyForCaptureChanged(bool)), this, SLOT(updateStatus())); + connect(cameraSession, &QAndroidCameraSession::statusChanged, this, + [this](QCamera::Status status) { + if (status == QCamera::UnavailableStatus) { + setState(QMediaRecorder::StoppedState); + setStatus(QMediaRecorder::UnavailableStatus); + return; + } + + // Stop recording when stopping the camera. + if (status == QCamera::StoppingStatus) { + setState(QMediaRecorder::StoppedState); + setStatus(QMediaRecorder::UnloadedStatus); + return; + } + + if (status == QCamera::LoadingStatus) + setStatus(QMediaRecorder::LoadingStatus); + }); + connect(cameraSession, &QAndroidCameraSession::captureModeChanged, this, + [this](QCamera::CaptureModes mode) { + if (!mode.testFlag(QCamera::CaptureVideo)) { + setState(QMediaRecorder::StoppedState); + setStatus(QMediaRecorder::UnloadedStatus); + } + }); + connect(cameraSession, &QAndroidCameraSession::readyForCaptureChanged, this, + [this](bool ready) { + if (ready) + setStatus(QMediaRecorder::LoadedStatus); + }); } else { - updateStatus(); + // Audio-only recording. + setStatus(QMediaRecorder::LoadedStatus); } m_notifyTimer.setInterval(1000); @@ -277,6 +302,7 @@ void QAndroidCaptureSession::start() m_state = QMediaRecorder::RecordingState; emit stateChanged(m_state); + setStatus(QMediaRecorder::RecordingStatus); } void QAndroidCaptureSession::stop(bool error) @@ -315,6 +341,8 @@ void QAndroidCaptureSession::stop(bool error) m_state = QMediaRecorder::StoppedState; emit stateChanged(m_state); + if (!m_cameraSession) + setStatus(QMediaRecorder::LoadedStatus); } void QAndroidCaptureSession::setStatus(QMediaRecorder::Status status) @@ -539,43 +567,6 @@ QAndroidCaptureSession::CaptureProfile QAndroidCaptureSession::getProfile(int id return profile; } -void QAndroidCaptureSession::updateStatus() -{ - if (m_cameraSession) { - // Video recording - - // stop recording when stopping the camera - if (m_cameraSession->status() == QCamera::StoppingStatus - || !m_cameraSession->captureMode().testFlag(QCamera::CaptureVideo)) { - setState(QMediaRecorder::StoppedState); - return; - } - - if (m_state == QMediaRecorder::RecordingState) { - setStatus(QMediaRecorder::RecordingStatus); - } else if (m_cameraSession->status() == QCamera::UnavailableStatus) { - setStatus(QMediaRecorder::UnavailableStatus); - } else if (m_cameraSession->captureMode().testFlag(QCamera::CaptureVideo) - && m_cameraSession->isReadyForCapture()) { - if (m_cameraSession->status() == QCamera::StartingStatus) - setStatus(QMediaRecorder::LoadingStatus); - else if (m_cameraSession->status() == QCamera::ActiveStatus) - setStatus(QMediaRecorder::LoadedStatus); - else - setStatus(QMediaRecorder::UnloadedStatus); - } else { - setStatus(QMediaRecorder::UnloadedStatus); - } - - } else { - // Audio-only recording - if (m_state == QMediaRecorder::RecordingState) - setStatus(QMediaRecorder::RecordingStatus); - else - setStatus(QMediaRecorder::LoadedStatus); - } -} - void QAndroidCaptureSession::onError(int what, int extra) { Q_UNUSED(what) diff --git a/src/plugins/android/src/mediacapture/qandroidcapturesession.h b/src/plugins/android/src/mediacapture/qandroidcapturesession.h index 286fd1aa2..8cfb9ad2a 100644 --- a/src/plugins/android/src/mediacapture/qandroidcapturesession.h +++ b/src/plugins/android/src/mediacapture/qandroidcapturesession.h @@ -97,7 +97,6 @@ Q_SIGNALS: private Q_SLOTS: void updateDuration(); void onCameraOpened(); - void updateStatus(); void onError(int what, int extra); void onInfo(int what, int extra); -- cgit v1.2.1