aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-02-11 19:20:11 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-02-11 19:20:11 +0000
commite2034145c9c2a79a393716c750fc89fe4f1ff099 (patch)
tree51517005111cd0daae80a80a39b1c13ec5b53b94 /src
parentbfa4ea1b72c633ec1ec9c361e1ad67d611c1a101 (diff)
downloadqmmp-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.cpp37
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)