summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartlomiej Moskal <bartlomiej.moskal@qt.io>2022-07-13 07:35:48 +0200
committerBartlomiej Moskal <bartlomiej.moskal@qt.io>2022-07-27 13:20:21 +0200
commitcd5a5156105ab53c11bea66275d74a4dbf721dbd (patch)
treee90144498d71b2d60d9ef9afd4b3bce6c77c03e3
parent711c1edf18d0e1b4ff7d1fc40bd7c1802082c98c (diff)
downloadqtmultimedia-cd5a5156105ab53c11bea66275d74a4dbf721dbd.tar.gz
Android: Fix for changing Audio sink
The OpenSL ES API does not provide direct audio output IO-devices as a sink for media objects. That's why setting audio output in QAndroidAudioSink is done with JNI calls by AudioManager. The disadvantage of this solution is that the audio output is set for the entire Android device (not just for the current sink). But this is still a better solution than not working audio output change at all. Task-number: QTBUG-99022 Change-Id: Id9a3d7a1abf2497b8e94363c93f888d09db9edb4 Reviewed-by: Samuel Mira <samuel.mira@qt.io> Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io> (cherry picked from commit eed4ee2729af19e75a3a35d0778dd87c6c1cf1b7)
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/multimedia/QtAudioDeviceManager.java2
-rw-r--r--src/multimedia/platform/android/audio/qandroidaudiosink.cpp3
-rw-r--r--src/multimedia/platform/android/audio/qopenslesengine.cpp9
-rw-r--r--src/multimedia/platform/android/audio/qopenslesengine_p.h1
4 files changed, 14 insertions, 1 deletions
diff --git a/src/android/jar/src/org/qtproject/qt/android/multimedia/QtAudioDeviceManager.java b/src/android/jar/src/org/qtproject/qt/android/multimedia/QtAudioDeviceManager.java
index c2a8a0a51..5359b08df 100644
--- a/src/android/jar/src/org/qtproject/qt/android/multimedia/QtAudioDeviceManager.java
+++ b/src/android/jar/src/org/qtproject/qt/android/multimedia/QtAudioDeviceManager.java
@@ -252,7 +252,7 @@ public class QtAudioDeviceManager
setAudioOutput(AudioManager.MODE_IN_COMMUNICATION, true, false);
return true;
case AudioDeviceInfo.TYPE_BUILTIN_SPEAKER:
- setAudioOutput(AudioManager.MODE_NORMAL, false, true);
+ setAudioOutput(AudioManager.STREAM_MUSIC, false, true);
return true;
case AudioDeviceInfo.TYPE_WIRED_HEADSET:
case AudioDeviceInfo.TYPE_WIRED_HEADPHONES:
diff --git a/src/multimedia/platform/android/audio/qandroidaudiosink.cpp b/src/multimedia/platform/android/audio/qandroidaudiosink.cpp
index f5923a403..d7a67f207 100644
--- a/src/multimedia/platform/android/audio/qandroidaudiosink.cpp
+++ b/src/multimedia/platform/android/audio/qandroidaudiosink.cpp
@@ -356,6 +356,9 @@ bool QAndroidAudioSink::preparePlayer()
else
return true;
+ if (!QOpenSLESEngine::setAudioOutput(m_deviceName))
+ qWarning() << "Unable to setup Audio Output Device";
+
SLEngineItf engine = QOpenSLESEngine::instance()->slEngine();
if (!engine) {
qWarning() << "No engine";
diff --git a/src/multimedia/platform/android/audio/qopenslesengine.cpp b/src/multimedia/platform/android/audio/qopenslesengine.cpp
index de3912e91..6032c06cc 100644
--- a/src/multimedia/platform/android/audio/qopenslesengine.cpp
+++ b/src/multimedia/platform/android/audio/qopenslesengine.cpp
@@ -147,6 +147,15 @@ QList<QAudioDevice> QOpenSLESEngine::availableDevices(QAudioDevice::Mode mode)
return devices;
}
+bool QOpenSLESEngine::setAudioOutput(const QByteArray &deviceId)
+{
+ return QJniObject::callStaticMethod<jboolean>(
+ "org/qtproject/qt/android/multimedia/QtAudioDeviceManager",
+ "setAudioOutput",
+ "(I)Z",
+ deviceId.toInt());
+}
+
static bool hasRecordPermission()
{
const auto recordPerm = QtAndroidPrivate::checkPermission(QtAndroidPrivate::Microphone);
diff --git a/src/multimedia/platform/android/audio/qopenslesengine_p.h b/src/multimedia/platform/android/audio/qopenslesengine_p.h
index 3adf34594..0f9781bd5 100644
--- a/src/multimedia/platform/android/audio/qopenslesengine_p.h
+++ b/src/multimedia/platform/android/audio/qopenslesengine_p.h
@@ -75,6 +75,7 @@ public:
static SLAndroidDataFormat_PCM_EX audioFormatToSLFormatPCM(const QAudioFormat &format);
static QList<QAudioDevice> availableDevices(QAudioDevice::Mode mode);
+ static bool setAudioOutput(const QByteArray &deviceId);
QList<int> supportedChannelCounts(QAudioDevice::Mode mode) const;
QList<int> supportedSampleRates(QAudioDevice::Mode mode) const;