summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVaL Doroshchuk <valentyn.doroshchuk@qt.io>2017-09-27 17:37:25 +0200
committerVaL Doroshchuk <valentyn.doroshchuk@qt.io>2018-03-22 11:00:10 +0000
commitefbb769b24e1a3b88326578042029876b09b4dea (patch)
treedaa935dbd2e5b0c9a29c7ffd9940bb0a43c4d9e6 /src
parenta429fb971beccf174f2df7f1ae8551a10d17d696 (diff)
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>
Diffstat (limited to 'src')
-rw-r--r--src/multimedia/audio/qaudiohelpers.cpp49
1 files changed, 49 insertions, 0 deletions
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);