diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-02-11 19:20:11 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-02-11 19:20:11 +0000 |
| commit | e2034145c9c2a79a393716c750fc89fe4f1ff099 (patch) | |
| tree | 51517005111cd0daae80a80a39b1c13ec5b53b94 /src | |
| parent | bfa4ea1b72c633ec1ec9c361e1ad67d611c1a101 (diff) | |
| download | qmmp-e2034145c9c2a79a393716c750fc89fe4f1ff099.tar.gz qmmp-e2034145c9c2a79a393716c750fc89fe4f1ff099.tar.bz2 qmmp-e2034145c9c2a79a393716c750fc89fe4f1ff099.zip | |
software volume control: fixed 24-bit support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3228 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
| -rw-r--r-- | src/qmmp/volumecontrol.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/qmmp/volumecontrol.cpp b/src/qmmp/volumecontrol.cpp index 49043deba..a7bc100c1 100644 --- a/src/qmmp/volumecontrol.cpp +++ b/src/qmmp/volumecontrol.cpp @@ -143,6 +143,8 @@ int SoftwareVolume::volume(int channel) void SoftwareVolume::changeVolume(Buffer *b, int chan, Qmmp::AudioFormat format) { int samples = 0; + qint32 sample1 = 0; + qint32 sample2 = 0; switch(format) { case Qmmp::PCM_S8: @@ -177,6 +179,41 @@ void SoftwareVolume::changeVolume(Buffer *b, int chan, Qmmp::AudioFormat format) } break; case Qmmp::PCM_S24LE: + samples = b->nbytes/4; + if (chan > 1) + { + for (qint64 i = 0; i < samples; i+=2) + { + sample1 = ((qint32*)b->data)[i]; + sample2 = ((qint32*)b->data)[i+1]; + + if (sample1 & 0x800000) + sample1 |= 0xff000000; + + if (sample2 & 0x800000) + sample2 |= 0xff000000; + + sample1 *= m_scaleLeft; + sample2 *= m_scaleRight; + + ((qint32*)b->data)[i] = sample1; + ((qint32*)b->data)[i+1] = sample2; + } + } + else + { + for (qint64 i = 0; i < samples; i++) + { + sample1 = ((qint32*)b->data)[i]; + sample1 *= qMax(m_scaleRight, m_scaleLeft); + + if (sample1 & 0x800000) + sample1 |= 0xff000000; + + ((qint32*)b->data)[i] = sample1; + } + } + break; case Qmmp::PCM_S32LE: samples = b->nbytes/4; if (chan > 1) |
