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>
This commit is contained in:
@@ -35,6 +35,7 @@
|
|||||||
|
|
||||||
#include "qopenslesengine.h"
|
#include "qopenslesengine.h"
|
||||||
#include <qbuffer.h>
|
#include <qbuffer.h>
|
||||||
|
#include <private/qaudiohelpers_p.h>
|
||||||
#include <qdebug.h>
|
#include <qdebug.h>
|
||||||
|
|
||||||
#ifdef ANDROID
|
#ifdef ANDROID
|
||||||
@@ -70,6 +71,7 @@ QOpenSLESAudioInput::QOpenSLESAudioInput(const QByteArray &device)
|
|||||||
, m_errorState(QAudio::NoError)
|
, m_errorState(QAudio::NoError)
|
||||||
, m_deviceState(QAudio::StoppedState)
|
, m_deviceState(QAudio::StoppedState)
|
||||||
, m_lastNotifyTime(0)
|
, m_lastNotifyTime(0)
|
||||||
|
, m_volume(1.0)
|
||||||
, m_bufferSize(0)
|
, m_bufferSize(0)
|
||||||
, m_periodSize(0)
|
, m_periodSize(0)
|
||||||
, m_intervalTime(1000)
|
, m_intervalTime(1000)
|
||||||
@@ -395,9 +397,19 @@ void QOpenSLESAudioInput::writeDataToDevice(const char *data, int size)
|
|||||||
{
|
{
|
||||||
m_processedBytes += 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) {
|
if (m_pullMode) {
|
||||||
// write buffer to the QIODevice
|
// write buffer to the QIODevice
|
||||||
if (m_audioSource->write(data, size) < 0) {
|
if (m_audioSource->write(outData) < 0) {
|
||||||
stop();
|
stop();
|
||||||
m_errorState = QAudio::IOError;
|
m_errorState = QAudio::IOError;
|
||||||
Q_EMIT errorChanged(m_errorState);
|
Q_EMIT errorChanged(m_errorState);
|
||||||
@@ -405,7 +417,7 @@ void QOpenSLESAudioInput::writeDataToDevice(const char *data, int size)
|
|||||||
} else {
|
} else {
|
||||||
// emits readyRead() so user will call read() on QIODevice to get some audio data
|
// emits readyRead() so user will call read() on QIODevice to get some audio data
|
||||||
if (m_bufferIODevice != 0) {
|
if (m_bufferIODevice != 0) {
|
||||||
m_pushBuffer.append(data, size);
|
m_pushBuffer.append(outData);
|
||||||
Q_EMIT m_bufferIODevice->readyRead();
|
Q_EMIT m_bufferIODevice->readyRead();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -478,13 +490,12 @@ qint64 QOpenSLESAudioInput::elapsedUSecs() const
|
|||||||
|
|
||||||
void QOpenSLESAudioInput::setVolume(qreal vol)
|
void QOpenSLESAudioInput::setVolume(qreal vol)
|
||||||
{
|
{
|
||||||
// Volume interface is not available for the recorder on Android
|
m_volume = vol;
|
||||||
Q_UNUSED(vol);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
qreal QOpenSLESAudioInput::volume() const
|
qreal QOpenSLESAudioInput::volume() const
|
||||||
{
|
{
|
||||||
return qreal(1.0);
|
return m_volume;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QOpenSLESAudioInput::reset()
|
void QOpenSLESAudioInput::reset()
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ private:
|
|||||||
QAudio::State m_deviceState;
|
QAudio::State m_deviceState;
|
||||||
QTime m_clockStamp;
|
QTime m_clockStamp;
|
||||||
qint64 m_lastNotifyTime;
|
qint64 m_lastNotifyTime;
|
||||||
|
qreal m_volume;
|
||||||
int m_bufferSize;
|
int m_bufferSize;
|
||||||
int m_periodSize;
|
int m_periodSize;
|
||||||
int m_intervalTime;
|
int m_intervalTime;
|
||||||
|
|||||||
Reference in New Issue
Block a user