Added support for big endian data to QAudioOutput win32 backend.
authorLev Zelenskiy <lev.zelenskiy@nokia.com>
Tue, 26 Jun 2012 04:03:54 +0000 (14:03 +1000)
committerQt by Nokia <qt-info@nokia.com>
Tue, 26 Jun 2012 07:13:30 +0000 (09:13 +0200)
Convert data from big endian to little endian.
QTBUG-19881

Change-Id: If62a69b79c01d66536010b3326a86df8ca5f83b0
Reviewed-by: Ling Hu <ling.hu@nokia.com>
src/multimedia/audio/qaudiooutput_win32_p.cpp

index 7592643..a189ddd 100644 (file)
@@ -51,6 +51,7 @@
 //
 
 #include "qaudiooutput_win32_p.h"
+#include <QtEndian>
 
 #ifndef SPEAKER_FRONT_LEFT
     #define SPEAKER_FRONT_LEFT            0x00000001
@@ -466,6 +467,30 @@ qint64 QAudioOutputPrivate::write( const char *data, qint64 len )
     char* p = (char*)data;
     int l = (int)len;
 
+    QByteArray reverse;
+    if (settings.byteOrder() == QAudioFormat::BigEndian) {
+
+        switch (settings.sampleSize()) {
+            case 8:
+                // No need to convert
+                break;
+
+            case 16:
+                reverse.resize(l);
+                for (qint64 i = 0; i < (l >> 1); i++)
+                    *((qint16*)reverse.data() + i) = qFromBigEndian(*((qint16*)data + i));
+                p = reverse.data();
+                break;
+
+            case 32:
+                reverse.resize(l);
+                for (qint64 i = 0; i < (l >> 2); i++)
+                    *((qint32*)reverse.data() + i) = qFromBigEndian(*((qint32*)data + i));
+                p = reverse.data();
+                break;
+        }
+    }
+
     WAVEHDR* current;
     int remain;
     current = &waveBlocks[waveCurrentBlock];