Android: correctly report QMediaRecorder status.

QMediaRecorder should have the LoadedStatus before starting recording.
When recording the camera, the recorder should be considered loaded
when all prerequisites are met (viewfinder started, recording mode set
to video and capture ready).

Task-number: QTBUG-36828
Change-Id: I3279bdfdc2b361c7e0707c52e74ae47e0bb4a93d
Reviewed-by: Christian Stromme <christian.stromme@digia.com>
This commit is contained in:
Yoann Lopes
2014-03-13 16:19:04 +01:00
committed by The Qt Project
parent d7533fd935
commit 29ba8cf4c4
2 changed files with 47 additions and 33 deletions

View File

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

View File

@@ -99,8 +99,7 @@ Q_SIGNALS:
private Q_SLOTS: private Q_SLOTS:
void updateDuration(); void updateDuration();
void onCameraOpened(); void onCameraOpened();
void onCameraStatusChanged(QCamera::Status); void updateStatus();
void onCameraCaptureModeChanged(QCamera::CaptureModes mode);
void onError(int what, int extra); void onError(int what, int extra);
void onInfo(int what, int extra); void onInfo(int what, int extra);