summaryrefslogtreecommitdiffstats
path: root/src/multimedia
diff options
context:
space:
mode:
authorAssam Boudjelthia <assam.boudjelthia@qt.io>2021-09-01 22:52:28 +0300
committerAssam Boudjelthia <assam.boudjelthia@qt.io>2021-09-03 20:22:47 +0300
commit5971a78630cda0c9d7f5a7af4e476ae7fc92061a (patch)
treee95c13b3e33a562e73888acd69cb153de9e064d0 /src/multimedia
parent970dadd763bffa086bc702ab93a367f6a788f40d (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')
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp3
-rw-r--r--src/multimedia/platform/android/wrappers/jni/androidmediarecorder.cpp28
-rw-r--r--src/multimedia/platform/android/wrappers/jni/androidmediarecorder_p.h2
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