From 3a5a59ed8555390400ef1a1e2c5d6ed9dfcaefa2 Mon Sep 17 00:00:00 2001 From: Michael Goddard Date: Mon, 9 Jul 2012 16:51:50 +1000 Subject: Add 32 bit support (int/float) support to audioinput example. Change-Id: Ib7160f60af36cdccfe91a620f5555189792c13c4 Reviewed-by: Dmytro Poplavskiy --- examples/audioinput/audioinput.cpp | 34 ++++++++++++++++++++++++++++++++-- examples/audioinput/audioinput.h | 2 +- 2 files changed, 33 insertions(+), 3 deletions(-) (limited to 'examples') diff --git a/examples/audioinput/audioinput.cpp b/examples/audioinput/audioinput.cpp index 44f614532..f7b83dbfc 100644 --- a/examples/audioinput/audioinput.cpp +++ b/examples/audioinput/audioinput.cpp @@ -41,6 +41,8 @@ #include #include +#include + #include #include #include @@ -91,6 +93,22 @@ AudioInfo::AudioInfo(const QAudioFormat &format, QObject *parent) break; } break; + + case 32: + switch (m_format.sampleType()) { + case QAudioFormat::UnSignedInt: + m_maxAmplitude = 0xffffffff; + break; + case QAudioFormat::SignedInt: + m_maxAmplitude = 0x7fffffff; + break; + case QAudioFormat::Float: + m_maxAmplitude = 0x7fffffff; // Kind of + default: + break; + } + break; + default: break; } @@ -127,12 +145,12 @@ qint64 AudioInfo::writeData(const char *data, qint64 len) Q_ASSERT(len % sampleBytes == 0); const int numSamples = len / sampleBytes; - quint16 maxValue = 0; + quint32 maxValue = 0; const unsigned char *ptr = reinterpret_cast(data); for (int i = 0; i < numSamples; ++i) { for (int j = 0; j < m_format.channelCount(); ++j) { - quint16 value = 0; + quint32 value = 0; if (m_format.sampleSize() == 8 && m_format.sampleType() == QAudioFormat::UnSignedInt) { value = *reinterpret_cast(ptr); @@ -148,6 +166,18 @@ qint64 AudioInfo::writeData(const char *data, qint64 len) value = qAbs(qFromLittleEndian(ptr)); else value = qAbs(qFromBigEndian(ptr)); + } else if (m_format.sampleSize() == 32 && m_format.sampleType() == QAudioFormat::UnSignedInt) { + if (m_format.byteOrder() == QAudioFormat::LittleEndian) + value = qFromLittleEndian(ptr); + else + value = qFromBigEndian(ptr); + } else if (m_format.sampleSize() == 32 && m_format.sampleType() == QAudioFormat::SignedInt) { + if (m_format.byteOrder() == QAudioFormat::LittleEndian) + value = qAbs(qFromLittleEndian(ptr)); + else + value = qAbs(qFromBigEndian(ptr)); + } else if (m_format.sampleSize() == 32 && m_format.sampleType() == QAudioFormat::Float) { + value = qAbs(*reinterpret_cast(ptr) * 0x7fffffff); // assumes 0-1.0 } maxValue = qMax(value, maxValue); diff --git a/examples/audioinput/audioinput.h b/examples/audioinput/audioinput.h index 3970cca61..9ef8132a3 100644 --- a/examples/audioinput/audioinput.h +++ b/examples/audioinput/audioinput.h @@ -69,7 +69,7 @@ public: private: const QAudioFormat m_format; - quint16 m_maxAmplitude; + quint32 m_maxAmplitude; qreal m_level; // 0.0 <= m_level <= 1.0 signals: -- cgit v1.2.3