diff options
author | Assam Boudjelthia <assam.boudjelthia@qt.io> | 2021-09-01 22:52:28 +0300 |
---|---|---|
committer | Assam Boudjelthia <assam.boudjelthia@qt.io> | 2021-09-03 20:22:47 +0300 |
commit | 5971a78630cda0c9d7f5a7af4e476ae7fc92061a (patch) | |
tree | e95c13b3e33a562e73888acd69cb153de9e064d0 /src/multimedia | |
parent | 970dadd763bffa086bc702ab93a367f6a788f40d (diff) |
Don't allow calling setAudioSource on MediaRecorder more than once
Calling setAudioSource twice or after calling setOutputFormat will throw
an exception, so make sure to not do the jni call anyway.
Pick-to: 6.2
Change-Id: I0cfacf082b3da3fc30a589d93fbf26b5493d8c2f
Reviewed-by: Samuel Mira <samuel.mira@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/multimedia')
3 files changed, 29 insertions, 4 deletions
diff --git a/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp b/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp index 80d77062a..677c3614d 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp +++ b/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp @@ -158,7 +158,8 @@ void QAndroidCaptureSession::start(QMediaEncoderSettings &settings, const QUrl & if (m_audioInput) { m_mediaRecorder->setAudioInput(m_audioInput->device.id()); - m_mediaRecorder->setAudioSource(AndroidMediaRecorder::DefaultAudioSource); + if (!m_mediaRecorder->isAudioSourceSet()) + m_mediaRecorder->setAudioSource(AndroidMediaRecorder::DefaultAudioSource); } // Set output format diff --git a/src/multimedia/platform/android/wrappers/jni/androidmediarecorder.cpp b/src/multimedia/platform/android/wrappers/jni/androidmediarecorder.cpp index b8d1311e9..c5cdadbfd 100644 --- a/src/multimedia/platform/android/wrappers/jni/androidmediarecorder.cpp +++ b/src/multimedia/platform/android/wrappers/jni/androidmediarecorder.cpp @@ -45,9 +45,12 @@ #include "qandroidglobal_p.h" #include "qandroidmultimediautils_p.h" #include <qmap.h> +#include <QtCore/qlogging.h> QT_BEGIN_NAMESPACE +Q_LOGGING_CATEGORY(lcMediaRecorder, "qt.multimedia.mediarecorder.android") + typedef QMap<QString, QJniObject> CamcorderProfiles; Q_GLOBAL_STATIC(CamcorderProfiles, g_camcorderProfiles) @@ -182,6 +185,7 @@ bool AndroidMediaRecorder::prepare() void AndroidMediaRecorder::reset() { m_mediaRecorder.callMethod<void>("reset"); + m_isAudioSourceSet = false; // Now setAudioSource can be used again. } bool AndroidMediaRecorder::start() @@ -223,7 +227,20 @@ void AndroidMediaRecorder::setAudioSamplingRate(int samplingRate) void AndroidMediaRecorder::setAudioSource(AudioSource source) { - m_mediaRecorder.callMethod<void>("setAudioSource", "(I)V", int(source)); + if (!m_isAudioSourceSet) { + QJniEnvironment env; + auto methodId = env->GetMethodID(m_mediaRecorder.objectClass(), "setAudioSource", "(I)V"); + env->CallVoidMethod(m_mediaRecorder.object(), methodId, source); + if (!env.checkAndClearExceptions()) + m_isAudioSourceSet = true; + } else { + qCWarning(lcMediaRecorder) << "Audio source already set. Not setting a new source."; + } +} + +bool AndroidMediaRecorder::isAudioSourceSet() const +{ + return m_isAudioSourceSet; } bool AndroidMediaRecorder::setAudioInput(const QByteArray &id) @@ -235,7 +252,7 @@ bool AndroidMediaRecorder::setAudioInput(const QByteArray &id) m_mediaRecorder.object(), id.toInt()); if (!ret) - qCWarning(QLoggingCategory("mediarecorder")) << "No default input device was set"; + qCWarning(lcMediaRecorder) << "No default input device was set."; return ret; } @@ -278,7 +295,12 @@ void AndroidMediaRecorder::setOrientationHint(int degrees) void AndroidMediaRecorder::setOutputFormat(OutputFormat format) { - m_mediaRecorder.callMethod<void>("setOutputFormat", "(I)V", int(format)); + QJniEnvironment env; + auto methodId = env->GetMethodID(m_mediaRecorder.objectClass(), "setOutputFormat", "(I)V"); + env->CallVoidMethod(m_mediaRecorder.object(), methodId, format); + // setAudioSource cannot be set after outputFormat is set. + if (!env.checkAndClearExceptions()) + m_isAudioSourceSet = true; } void AndroidMediaRecorder::setOutputFile(const QString &path) diff --git a/src/multimedia/platform/android/wrappers/jni/androidmediarecorder_p.h b/src/multimedia/platform/android/wrappers/jni/androidmediarecorder_p.h index 1db6297a8..b0f65dd1d 100644 --- a/src/multimedia/platform/android/wrappers/jni/androidmediarecorder_p.h +++ b/src/multimedia/platform/android/wrappers/jni/androidmediarecorder_p.h @@ -161,6 +161,7 @@ public: void setAudioEncodingBitRate(int bitRate); void setAudioSamplingRate(int samplingRate); void setAudioSource(AudioSource source); + bool isAudioSourceSet() const; bool setAudioInput(const QByteArray &id); void setCamera(AndroidCamera *camera); @@ -187,6 +188,7 @@ Q_SIGNALS: private: jlong m_id; QJniObject m_mediaRecorder; + bool m_isAudioSourceSet = false; }; QT_END_NAMESPACE |