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 <yoann.lopes@theqtcompany.com>
This commit is contained in:
committed by
Christian Stromme
parent
d910b6d63f
commit
0559f645bb
@@ -151,23 +151,19 @@ void QAndroidCaptureSession::setState(QMediaRecorder::State state)
|
|||||||
stop();
|
stop();
|
||||||
break;
|
break;
|
||||||
case QMediaRecorder::RecordingState:
|
case QMediaRecorder::RecordingState:
|
||||||
if (!start())
|
start();
|
||||||
return;
|
|
||||||
break;
|
break;
|
||||||
case QMediaRecorder::PausedState:
|
case QMediaRecorder::PausedState:
|
||||||
// Not supported by Android API
|
// Not supported by Android API
|
||||||
qWarning("QMediaRecorder::PausedState is not supported on Android");
|
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)
|
if (m_state == QMediaRecorder::RecordingState || m_status != QMediaRecorder::LoadedStatus)
|
||||||
return false;
|
return;
|
||||||
|
|
||||||
setStatus(QMediaRecorder::StartingStatus);
|
setStatus(QMediaRecorder::StartingStatus);
|
||||||
|
|
||||||
@@ -225,13 +221,13 @@ bool QAndroidCaptureSession::start()
|
|||||||
if (!m_mediaRecorder->prepare()) {
|
if (!m_mediaRecorder->prepare()) {
|
||||||
emit error(QMediaRecorder::FormatError, QLatin1String("Unable to prepare the media recorder."));
|
emit error(QMediaRecorder::FormatError, QLatin1String("Unable to prepare the media recorder."));
|
||||||
restartViewfinder();
|
restartViewfinder();
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
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."));
|
||||||
restartViewfinder();
|
restartViewfinder();
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_elapsedTime.start();
|
m_elapsedTime.start();
|
||||||
@@ -241,22 +237,21 @@ bool QAndroidCaptureSession::start()
|
|||||||
if (m_cameraSession)
|
if (m_cameraSession)
|
||||||
m_cameraSession->setReadyForCapture(false);
|
m_cameraSession->setReadyForCapture(false);
|
||||||
|
|
||||||
return true;
|
m_state = QMediaRecorder::RecordingState;
|
||||||
|
emit stateChanged(m_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QAndroidCaptureSession::stop(bool error)
|
void QAndroidCaptureSession::stop(bool error)
|
||||||
{
|
{
|
||||||
if (m_state == QMediaRecorder::StoppedState)
|
if (m_state == QMediaRecorder::StoppedState || m_mediaRecorder == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
setStatus(QMediaRecorder::FinalizingStatus);
|
setStatus(QMediaRecorder::FinalizingStatus);
|
||||||
|
|
||||||
m_mediaRecorder->stop();
|
m_mediaRecorder->stop();
|
||||||
|
|
||||||
m_notifyTimer.stop();
|
m_notifyTimer.stop();
|
||||||
updateDuration();
|
updateDuration();
|
||||||
m_elapsedTime.invalidate();
|
m_elapsedTime.invalidate();
|
||||||
|
|
||||||
m_mediaRecorder->release();
|
m_mediaRecorder->release();
|
||||||
delete m_mediaRecorder;
|
delete m_mediaRecorder;
|
||||||
m_mediaRecorder = 0;
|
m_mediaRecorder = 0;
|
||||||
@@ -279,6 +274,9 @@ void QAndroidCaptureSession::stop(bool error)
|
|||||||
m_actualOutputLocation = m_usedOutputLocation;
|
m_actualOutputLocation = m_usedOutputLocation;
|
||||||
emit actualLocationChanged(m_actualOutputLocation);
|
emit actualLocationChanged(m_actualOutputLocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_state = QMediaRecorder::StoppedState;
|
||||||
|
emit stateChanged(m_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QAndroidCaptureSession::setStatus(QMediaRecorder::Status status)
|
void QAndroidCaptureSession::setStatus(QMediaRecorder::Status status)
|
||||||
@@ -541,8 +539,6 @@ void QAndroidCaptureSession::onError(int what, int extra)
|
|||||||
Q_UNUSED(what)
|
Q_UNUSED(what)
|
||||||
Q_UNUSED(extra)
|
Q_UNUSED(extra)
|
||||||
stop(true);
|
stop(true);
|
||||||
m_state = QMediaRecorder::StoppedState;
|
|
||||||
emit stateChanged(m_state);
|
|
||||||
emit error(QMediaRecorder::ResourceError, QLatin1String("Unknown error."));
|
emit error(QMediaRecorder::ResourceError, QLatin1String("Unknown error."));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ private:
|
|||||||
|
|
||||||
CaptureProfile getProfile(int id);
|
CaptureProfile getProfile(int id);
|
||||||
|
|
||||||
bool start();
|
void start();
|
||||||
void stop(bool error = false);
|
void stop(bool error = false);
|
||||||
|
|
||||||
void setStatus(QMediaRecorder::Status status);
|
void setStatus(QMediaRecorder::Status status);
|
||||||
|
|||||||
Reference in New Issue
Block a user