diff options
author | VaL Doroshchuk <valentyn.doroshchuk@qt.io> | 2017-09-27 17:37:25 +0200 |
---|---|---|
committer | VaL Doroshchuk <valentyn.doroshchuk@qt.io> | 2018-03-22 11:00:10 +0000 |
commit | efbb769b24e1a3b88326578042029876b09b4dea (patch) | |
tree | daa935dbd2e5b0c9a29c7ffd9940bb0a43c4d9e6 /src/multimedia/audio | |
parent | a429fb971beccf174f2df7f1ae8551a10d17d696 (diff) | |
download | qtmultimedia-efbb769b24e1a3b88326578042029876b09b4dea.tar.gz |
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/multimedia/audio')
-rw-r--r-- | src/multimedia/audio/qaudiohelpers.cpp | 49 |
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); |