From efbb769b24e1a3b88326578042029876b09b4dea Mon Sep 17 00:00:00 2001
From: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
Date: Wed, 27 Sep 2017 17:37:25 +0200
Subject: [PATCH] Support changing of volume in 24-bit audio samples

Introduced a fix to support changing of volume for 3 bytes samples audio stream.

Task-number: QTBUG-60579
Change-Id: I4ba4a9a1cf65812ccbc46b40c78546875d5e4d73
Reviewed-by: Christian Stromme <christian.stromme@qt.io>
---
 src/multimedia/audio/qaudiohelpers.cpp        |  49 ++++++++++++++++++
 .../auto/integration/qsoundeffect/test24.wav  | Bin 0 -> 16482 bytes
 .../qsoundeffect/tst_qsoundeffect.cpp         |  27 ++++++++++
 3 files changed, 76 insertions(+)
 create mode 100644 tests/auto/integration/qsoundeffect/test24.wav

diff --git a/src/multimedia/audio/qaudiohelpers.cpp b/src/multimedia/audio/qaudiohelpers.cpp
index 8aa4c090b..fae591477 100644
--- a/src/multimedia/audio/qaudiohelpers.cpp
+++ b/src/multimedia/audio/qaudiohelpers.cpp
@@ -43,6 +43,49 @@
 
 QT_BEGIN_NAMESPACE
 
+// Base implementation of 24 bits number.
+// Used to adjust 3 bytes values by a factor.
+// TODO: Uses little-endian only.
+class Int24
+{
+public:
+    quint8 data[3];
+    Int24(qint32 v) {
+        data[0] = v & 0xFF;
+        data[1] = (v & 0xFF00) >> 8;
+        data[2] = (v & 0xFF0000) >> 16;
+    }
+    template<class T>
+    T multiply(qreal factor, T v = 0) const {
+        v |= data[0];
+        v |= data[1] << 8;
+        v |= data[2] << 16;
+        v *= factor;
+        return v;
+    }
+};
+
+class qint24: public Int24
+{
+public:
+    qint24(qint32 v): Int24(v) {}
+    qint24 operator*(qreal factor) const {
+        // Checks if it is a signed value.
+        qint32 v = (data[2] & 0x80) ? 0xFF000000 : 0;
+        return multiply(factor, v);
+    }
+};
+
+class quint24: public Int24
+{
+public:
+    quint24(quint32 v): Int24(v) {}
+    quint24 operator*(qreal factor) const {
+        return multiply<quint32>(factor);
+    }
+};
+
+
 namespace QAudioHelperInternal
 {
 
@@ -101,6 +144,12 @@ void qMultiplySamples(qreal factor, const QAudioFormat &format, const void* src,
         else if (format.sampleType() == QAudioFormat::UnSignedInt)
             QAudioHelperInternal::adjustUnsignedSamples<quint16>(factor,src,dest,samplesCount);
         break;
+    case 24:
+        if (format.sampleType() == QAudioFormat::SignedInt)
+            QAudioHelperInternal::adjustSamples<qint24>(factor,src,dest,samplesCount);
+        else if (format.sampleType() == QAudioFormat::UnSignedInt)
+            QAudioHelperInternal::adjustSamples<quint24>(factor,src,dest,samplesCount);
+        break;
     default:
         if (format.sampleType() == QAudioFormat::SignedInt)
             QAudioHelperInternal::adjustSamples<qint32>(factor,src,dest,samplesCount);
diff --git a/tests/auto/integration/qsoundeffect/test24.wav b/tests/auto/integration/qsoundeffect/test24.wav
new file mode 100644
index 0000000000000000000000000000000000000000..9575aaaee3bc7563a0ec8a2157afe6037eca10ad
GIT binary patch
literal 16482
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
Ryw*9db<S&@|Hrk?{{Sz=?E?S+

literal 0
HcmV?d00001

diff --git a/tests/auto/integration/qsoundeffect/tst_qsoundeffect.cpp b/tests/auto/integration/qsoundeffect/tst_qsoundeffect.cpp
index 5be889096..fa98c8b16 100644
--- a/tests/auto/integration/qsoundeffect/tst_qsoundeffect.cpp
+++ b/tests/auto/integration/qsoundeffect/tst_qsoundeffect.cpp
@@ -62,12 +62,14 @@ private slots:
     void testSetSourceWhilePlaying();
     void testSupportedMimeTypes();
     void testCorruptFile();
+    void testPlaying24Bits();
 
 private:
     QSoundEffect* sound;
     QUrl url; // test.wav: pcm_s16le, 48000 Hz, stereo, s16
     QUrl url2; // test_tone.wav: pcm_s16le, 44100 Hz, mono
     QUrl urlCorrupted; // test_corrupted.wav: corrupted
+    QUrl url24Bits; // test24.wav pcm_s24le, 44100 Hz, mono
 };
 
 void tst_QSoundEffect::init()
@@ -105,6 +107,11 @@ void tst_QSoundEffect::initTestCase()
     QVERIFY2(!fullPath.isEmpty(), qPrintable(QStringLiteral("Unable to locate ") + testFileName));
     urlCorrupted = QUrl::fromLocalFile(fullPath);
 
+    testFileName = QStringLiteral("test24.wav");
+    fullPath = QFINDTESTDATA(testFileName);
+    QVERIFY2(!fullPath.isEmpty(), qPrintable(QStringLiteral("Unable to locate ") + testFileName));
+    url24Bits = QUrl::fromLocalFile(fullPath);
+
     sound = new QSoundEffect(this);
 
     QVERIFY(sound->source().isEmpty());
@@ -409,6 +416,26 @@ void tst_QSoundEffect::testCorruptFile()
     }
 }
 
+void tst_QSoundEffect::testPlaying24Bits()
+{
+    sound->setLoopCount(QSoundEffect::Infinite);
+    sound->setSource(url24Bits);
+    QTestEventLoop::instance().enterLoop(1);
+    sound->play();
+    QTestEventLoop::instance().enterLoop(1);
+    QTRY_COMPARE(sound->isPlaying(), true);
+    sound->stop();
+
+    QSignalSpy readSignal(sound, SIGNAL(volumeChanged()));
+    sound->setVolume(0.5);
+    QCOMPARE(sound->volume(), 0.5);
+    sound->play();
+    QTestEventLoop::instance().enterLoop(1);
+    QTRY_COMPARE(sound->isPlaying(), true);
+    QCOMPARE(readSignal.count(), 1);
+    sound->stop();
+}
+
 QTEST_MAIN(tst_QSoundEffect)
 
 #include "tst_qsoundeffect.moc"
-- 
GitLab