Add 32 bit support (int/float) support to audioinput example.
authorMichael Goddard <michael.goddard@nokia.com>
Mon, 9 Jul 2012 06:51:50 +0000 (16:51 +1000)
committerQt by Nokia <qt-info@nokia.com>
Fri, 3 Aug 2012 05:05:46 +0000 (07:05 +0200)
Change-Id: Ib7160f60af36cdccfe91a620f5555189792c13c4
Reviewed-by: Dmytro Poplavskiy <dmytro.poplavskiy@nokia.com>
examples/audioinput/audioinput.cpp
examples/audioinput/audioinput.h

index 44f6145..f7b83db 100644 (file)
@@ -41,6 +41,8 @@
 #include <stdlib.h>
 #include <math.h>
 
+#include <QDateTime>
+
 #include <QDebug>
 #include <QPainter>
 #include <QVBoxLayout>
@@ -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<const unsigned char *>(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<const quint8*>(ptr);
@@ -148,6 +166,18 @@ qint64 AudioInfo::writeData(const char *data, qint64 len)
                         value = qAbs(qFromLittleEndian<qint16>(ptr));
                     else
                         value = qAbs(qFromBigEndian<qint16>(ptr));
+                } else if (m_format.sampleSize() == 32 && m_format.sampleType() == QAudioFormat::UnSignedInt) {
+                    if (m_format.byteOrder() == QAudioFormat::LittleEndian)
+                        value = qFromLittleEndian<quint32>(ptr);
+                    else
+                        value = qFromBigEndian<quint32>(ptr);
+                } else if (m_format.sampleSize() == 32 && m_format.sampleType() == QAudioFormat::SignedInt) {
+                    if (m_format.byteOrder() == QAudioFormat::LittleEndian)
+                        value = qAbs(qFromLittleEndian<qint32>(ptr));
+                    else
+                        value = qAbs(qFromBigEndian<qint32>(ptr));
+                } else if (m_format.sampleSize() == 32 && m_format.sampleType() == QAudioFormat::Float) {
+                    value = qAbs(*reinterpret_cast<const float*>(ptr) * 0x7fffffff); // assumes 0-1.0
                 }
 
                 maxValue = qMax(value, maxValue);
index 3970cca..9ef8132 100644 (file)
@@ -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: