From 0559f645bbe928e9a54666356409fce444e80c57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Str=C3=B8mme?= Date: Mon, 27 Apr 2015 16:24:18 +0200 Subject: Android: Don't delete the media recorder object twice. In QAndroidCaptureSession::stop() we call restartViewFinder() which eventually calls QAndroidCaptureSession::stop() again, but this time the media recorder object is already released. Task-number: QTBUG-45637 Change-Id: I943c423398a99d98ccda1063fc16e47cba470deb Reviewed-by: Yoann Lopes --- .../src/mediacapture/qandroidcapturesession.cpp | 28 ++++++++++------------ .../src/mediacapture/qandroidcapturesession.h | 2 +- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp b/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp index ae6991a3d..3e3b17c7f 100644 --- a/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp +++ b/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp @@ -151,23 +151,19 @@ void QAndroidCaptureSession::setState(QMediaRecorder::State state) stop(); break; case QMediaRecorder::RecordingState: - if (!start()) - return; + start(); break; case QMediaRecorder::PausedState: // Not supported by Android API qWarning("QMediaRecorder::PausedState is not supported on Android"); - return; + break; } - - m_state = state; - emit stateChanged(m_state); } -bool QAndroidCaptureSession::start() +void QAndroidCaptureSession::start() { if (m_state == QMediaRecorder::RecordingState || m_status != QMediaRecorder::LoadedStatus) - return false; + return; setStatus(QMediaRecorder::StartingStatus); @@ -225,13 +221,13 @@ bool QAndroidCaptureSession::start() if (!m_mediaRecorder->prepare()) { emit error(QMediaRecorder::FormatError, QLatin1String("Unable to prepare the media recorder.")); restartViewfinder(); - return false; + return; } if (!m_mediaRecorder->start()) { emit error(QMediaRecorder::FormatError, QLatin1String("Unable to start the media recorder.")); restartViewfinder(); - return false; + return; } m_elapsedTime.start(); @@ -241,22 +237,21 @@ bool QAndroidCaptureSession::start() if (m_cameraSession) m_cameraSession->setReadyForCapture(false); - return true; + m_state = QMediaRecorder::RecordingState; + emit stateChanged(m_state); } void QAndroidCaptureSession::stop(bool error) { - if (m_state == QMediaRecorder::StoppedState) + if (m_state == QMediaRecorder::StoppedState || m_mediaRecorder == 0) return; setStatus(QMediaRecorder::FinalizingStatus); m_mediaRecorder->stop(); - m_notifyTimer.stop(); updateDuration(); m_elapsedTime.invalidate(); - m_mediaRecorder->release(); delete m_mediaRecorder; m_mediaRecorder = 0; @@ -279,6 +274,9 @@ void QAndroidCaptureSession::stop(bool error) m_actualOutputLocation = m_usedOutputLocation; emit actualLocationChanged(m_actualOutputLocation); } + + m_state = QMediaRecorder::StoppedState; + emit stateChanged(m_state); } void QAndroidCaptureSession::setStatus(QMediaRecorder::Status status) @@ -541,8 +539,6 @@ void QAndroidCaptureSession::onError(int what, int extra) Q_UNUSED(what) Q_UNUSED(extra) stop(true); - m_state = QMediaRecorder::StoppedState; - emit stateChanged(m_state); emit error(QMediaRecorder::ResourceError, QLatin1String("Unknown error.")); } diff --git a/src/plugins/android/src/mediacapture/qandroidcapturesession.h b/src/plugins/android/src/mediacapture/qandroidcapturesession.h index f96e9766a..c17f081d1 100644 --- a/src/plugins/android/src/mediacapture/qandroidcapturesession.h +++ b/src/plugins/android/src/mediacapture/qandroidcapturesession.h @@ -130,7 +130,7 @@ private: CaptureProfile getProfile(int id); - bool start(); + void start(); void stop(bool error = false); void setStatus(QMediaRecorder::Status status); -- cgit v1.2.3