diff options
-rw-r--r-- | src/plugins/android/src/mediacapture/qandroidcapturesession.cpp | 77 | ||||
-rw-r--r-- | src/plugins/android/src/mediacapture/qandroidcapturesession.h | 3 |
2 files changed, 47 insertions, 33 deletions
diff --git a/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp b/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp index f40ec2498..fef2a5beb 100644 --- a/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp +++ b/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp @@ -65,12 +65,16 @@ QAndroidCaptureSession::QAndroidCaptureSession(QAndroidCameraSession *cameraSess , m_audioEncoder(JMediaRecorder::DefaultAudioEncoder) , m_videoEncoder(JMediaRecorder::DefaultVideoEncoder) { + 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(onCameraStatusChanged(QCamera::Status))); + connect(cameraSession, SIGNAL(statusChanged(QCamera::Status)), this, SLOT(updateStatus())); connect(cameraSession, SIGNAL(captureModeChanged(QCamera::CaptureModes)), - this, SLOT(onCameraCaptureModeChanged(QCamera::CaptureModes))); + this, SLOT(updateStatus())); + connect(cameraSession, SIGNAL(readyForCaptureChanged(bool)), this, SLOT(updateStatus())); + } else { + updateStatus(); } m_notifyTimer.setInterval(1000); @@ -164,10 +168,10 @@ void QAndroidCaptureSession::setState(QMediaRecorder::State state) bool QAndroidCaptureSession::start() { - if (m_state == QMediaRecorder::RecordingState) + if (m_state == QMediaRecorder::RecordingState || m_status != QMediaRecorder::LoadedStatus) return false; - setStatus(QMediaRecorder::LoadingStatus); + setStatus(QMediaRecorder::StartingStatus); if (m_mediaRecorder) { m_mediaRecorder->release(); @@ -179,17 +183,11 @@ bool QAndroidCaptureSession::start() // Set audio/video sources if (m_cameraSession) { - if (m_cameraSession->status() != QCamera::ActiveStatus) { - emit error(QMediaRecorder::ResourceError, QLatin1String("Camera must be active to record it.")); - setStatus(QMediaRecorder::UnloadedStatus); - return false; - } else { - updateViewfinder(); - m_cameraSession->camera()->unlock(); - m_mediaRecorder->setCamera(m_cameraSession->camera()); - m_mediaRecorder->setAudioSource(JMediaRecorder::Camcorder); - m_mediaRecorder->setVideoSource(JMediaRecorder::Camera); - } + updateViewfinder(); + m_cameraSession->camera()->unlock(); + m_mediaRecorder->setCamera(m_cameraSession->camera()); + m_mediaRecorder->setAudioSource(JMediaRecorder::Camcorder); + m_mediaRecorder->setVideoSource(JMediaRecorder::Camera); } else { m_mediaRecorder->setAudioSource(m_audioSource); } @@ -213,7 +211,6 @@ bool QAndroidCaptureSession::start() m_mediaRecorder->setOrientationHint(m_cameraSession->currentCameraRotation()); } - // Set output file QString filePath = m_mediaStorageLocation.generateFileName( m_requestedOutputLocation.isLocalFile() ? m_requestedOutputLocation.toLocalFile() @@ -236,17 +233,12 @@ bool QAndroidCaptureSession::start() return false; } - setStatus(QMediaRecorder::LoadedStatus); - setStatus(QMediaRecorder::StartingStatus); - if (!m_mediaRecorder->start()) { emit error(QMediaRecorder::FormatError, QLatin1String("Unable to start the media recorder.")); setStatus(QMediaRecorder::UnloadedStatus); return false; } - setStatus(QMediaRecorder::RecordingStatus); - m_elapsedTime.start(); m_notifyTimer.start(); updateDuration(); @@ -292,7 +284,6 @@ void QAndroidCaptureSession::stop(bool error) JMultimediaUtils::registerMediaFile(mediaPath); } - setStatus(QMediaRecorder::UnloadedStatus); } void QAndroidCaptureSession::setStatus(QMediaRecorder::Status status) @@ -513,16 +504,40 @@ QAndroidCaptureSession::CaptureProfile QAndroidCaptureSession::getProfile(int id return profile; } -void QAndroidCaptureSession::onCameraStatusChanged(QCamera::Status status) +void QAndroidCaptureSession::updateStatus() { - if (status == QCamera::StoppingStatus) - setState(QMediaRecorder::StoppedState); -} + if (m_cameraSession) { + // Video recording -void QAndroidCaptureSession::onCameraCaptureModeChanged(QCamera::CaptureModes mode) -{ - if (!mode.testFlag(QCamera::CaptureVideo)) - setState(QMediaRecorder::StoppedState); + // stop recording when stopping the camera + if (m_cameraSession->status() == QCamera::StoppingStatus + || !m_cameraSession->captureMode().testFlag(QCamera::CaptureVideo)) { + setState(QMediaRecorder::StoppedState); + } + + 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) diff --git a/src/plugins/android/src/mediacapture/qandroidcapturesession.h b/src/plugins/android/src/mediacapture/qandroidcapturesession.h index fcd87cd02..deee50569 100644 --- a/src/plugins/android/src/mediacapture/qandroidcapturesession.h +++ b/src/plugins/android/src/mediacapture/qandroidcapturesession.h @@ -99,8 +99,7 @@ Q_SIGNALS: private Q_SLOTS: void updateDuration(); void onCameraOpened(); - void onCameraStatusChanged(QCamera::Status); - void onCameraCaptureModeChanged(QCamera::CaptureModes mode); + void updateStatus(); void onError(int what, int extra); void onInfo(int what, int extra); |