summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYoann Lopes <yoann.lopes@theqtcompany.com>2014-12-03 16:28:48 +0100
committerYoann Lopes <yoann.lopes@theqtcompany.com>2014-12-03 16:45:55 +0100
commit9496d5fba5439bf4e4c1d80b5e5f76af82b89165 (patch)
tree85b65f27b55f4bc83b2eab5b9da9352477e26cd4
parent3443517265cbe432ada3b857f68ad981af6cd152 (diff)
OpenSL ES: volume support for QAudioInput.
The OpenSL volume interface is not available for audio inputs on Android so we apply the volume ourselves on the PCM data. Task-number: QTBUG-42159 Change-Id: If43d8aa576bc70a925681f0db1ca8b40e71f7b29 Reviewed-by: Christian Stromme <christian.stromme@theqtcompany.com>
-rw-r--r--src/plugins/opensles/qopenslesaudioinput.cpp21
-rw-r--r--src/plugins/opensles/qopenslesaudioinput.h1
2 files changed, 17 insertions, 5 deletions
diff --git a/src/plugins/opensles/qopenslesaudioinput.cpp b/src/plugins/opensles/qopenslesaudioinput.cpp
index 181649ae0..30372059f 100644
--- a/src/plugins/opensles/qopenslesaudioinput.cpp
+++ b/src/plugins/opensles/qopenslesaudioinput.cpp
@@ -35,6 +35,7 @@
#include "qopenslesengine.h"
#include <qbuffer.h>
+#include <private/qaudiohelpers_p.h>
#include <qdebug.h>
#ifdef ANDROID
@@ -70,6 +71,7 @@ QOpenSLESAudioInput::QOpenSLESAudioInput(const QByteArray &device)
, m_errorState(QAudio::NoError)
, m_deviceState(QAudio::StoppedState)
, m_lastNotifyTime(0)
+ , m_volume(1.0)
, m_bufferSize(0)
, m_periodSize(0)
, m_intervalTime(1000)
@@ -395,9 +397,19 @@ void QOpenSLESAudioInput::writeDataToDevice(const char *data, int size)
{
m_processedBytes += size;
+ QByteArray outData;
+
+ // Apply volume
+ if (m_volume < 1.0f) {
+ outData.resize(size);
+ QAudioHelperInternal::qMultiplySamples(m_volume, m_format, data, outData.data(), size);
+ } else {
+ outData.append(data, size);
+ }
+
if (m_pullMode) {
// write buffer to the QIODevice
- if (m_audioSource->write(data, size) < 0) {
+ if (m_audioSource->write(outData) < 0) {
stop();
m_errorState = QAudio::IOError;
Q_EMIT errorChanged(m_errorState);
@@ -405,7 +417,7 @@ void QOpenSLESAudioInput::writeDataToDevice(const char *data, int size)
} else {
// emits readyRead() so user will call read() on QIODevice to get some audio data
if (m_bufferIODevice != 0) {
- m_pushBuffer.append(data, size);
+ m_pushBuffer.append(outData);
Q_EMIT m_bufferIODevice->readyRead();
}
}
@@ -478,13 +490,12 @@ qint64 QOpenSLESAudioInput::elapsedUSecs() const
void QOpenSLESAudioInput::setVolume(qreal vol)
{
- // Volume interface is not available for the recorder on Android
- Q_UNUSED(vol);
+ m_volume = vol;
}
qreal QOpenSLESAudioInput::volume() const
{
- return qreal(1.0);
+ return m_volume;
}
void QOpenSLESAudioInput::reset()
diff --git a/src/plugins/opensles/qopenslesaudioinput.h b/src/plugins/opensles/qopenslesaudioinput.h
index 481ff371a..7ffff0470 100644
--- a/src/plugins/opensles/qopenslesaudioinput.h
+++ b/src/plugins/opensles/qopenslesaudioinput.h
@@ -113,6 +113,7 @@ private:
QAudio::State m_deviceState;
QTime m_clockStamp;
qint64 m_lastNotifyTime;
+ qreal m_volume;
int m_bufferSize;
int m_periodSize;
int m_intervalTime;