aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2010-01-16 18:43:58 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2010-01-16 18:43:58 +0000
commit230caf399303a72a9cc93f19158f120c30bd116f (patch)
treefb026b5627b0a82290f5bb57deb9dfc8b3c2243c
parent9289605dbae4ec73ef37213626bb2252abeefaf1 (diff)
downloadqmmp-230caf399303a72a9cc93f19158f120c30bd116f.tar.gz
qmmp-230caf399303a72a9cc93f19158f120c30bd116f.tar.bz2
qmmp-230caf399303a72a9cc93f19158f120c30bd116f.zip
fixed software volume control (Closes issue 231)
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1505 90c681e8-e032-0410-971d-27865f9a5e38
-rw-r--r--src/qmmp/output.cpp4
-rw-r--r--src/qmmp/volumecontrol.cpp55
-rw-r--r--src/qmmp/volumecontrol.h11
3 files changed, 38 insertions, 32 deletions
diff --git a/src/qmmp/output.cpp b/src/qmmp/output.cpp
index 6468d4165..07a7a02e4 100644
--- a/src/qmmp/output.cpp
+++ b/src/qmmp/output.cpp
@@ -269,8 +269,8 @@ void Output::run()
if (b)
{
dispatchVisual(b);
- /*if (SoftwareVolume::instance())
- SoftwareVolume::instance()->changeVolume(b->data, b->nbytes, m_channels, m_precision);*/
+ if (SoftwareVolume::instance())
+ SoftwareVolume::instance()->changeVolume(b, m_channels, m_format);
l = 0;
m = 0;
while (l < b->nbytes)
diff --git a/src/qmmp/volumecontrol.cpp b/src/qmmp/volumecontrol.cpp
index 6c520d3df..500b1f5da 100644
--- a/src/qmmp/volumecontrol.cpp
+++ b/src/qmmp/volumecontrol.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2008-2009 by Ilya Kotov *
+ * Copyright (C) 2008-2010 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -123,56 +123,61 @@ void SoftwareVolume::volume(int *left, int *right)
*right = m_right;
}
-void SoftwareVolume::changeVolume(uchar *data, qint64 size, int chan, int bits)
+void SoftwareVolume::changeVolume(Buffer *b, int chan, Qmmp::AudioFormat format)
{
- size = size*8/bits;
- if(bits == 16)
+ int samples = 0;
+ switch(format)
{
+ case Qmmp::PCM_S8:
+ samples = b->nbytes;
if (chan > 1)
{
- for (qint64 i = 0; i < size; i+=2)
+ for (int i = 0; i < samples; i+=2)
{
- ((short*)data)[i]*= m_scaleLeft;
- ((short*)data)[i+1]*= m_scaleRight;
+ ((char*)b->data)[i]*= m_scaleLeft;
+ ((char*)b->data)[i+1]*= m_scaleRight;
}
}
else
{
- for (qint64 i = 0; i < size; i++)
- ((short*)data)[i]*= qMax(m_scaleRight, m_scaleLeft);
+ for (int i = 0; i < samples; i++)
+ ((char*)b->data)[i]*= qMax(m_scaleRight, m_scaleLeft);
}
- }
- else if(bits == 8)
- {
+ case Qmmp::PCM_S16LE:
+ samples = b->nbytes/2;
if (chan > 1)
{
- for (qint64 i = 0; i < size; i+=2)
+ for (int i = 0; i < samples; i+=2)
{
- ((char*)data)[i]*= m_scaleLeft;
- ((char*)data)[i+1]*= m_scaleRight;
+ ((short*)b->data)[i]*= m_scaleLeft;
+ ((short*)b->data)[i+1]*= m_scaleRight;
}
}
else
{
- for (qint64 i = 0; i < size; i++)
- ((char*)data)[i]*= qMax(m_scaleRight, m_scaleLeft);
+ for (int i = 0; i < samples; i++)
+ ((short*)b->data)[i]*= qMax(m_scaleRight, m_scaleLeft);
}
- }
- else if(bits == 32)
- {
+ break;
+ case Qmmp::PCM_S24LE:
+ case Qmmp::PCM_S32LE:
+ samples = b->nbytes/4;
if (chan > 1)
{
- for (qint64 i = 0; i < size; i+=2)
+ for (qint64 i = 0; i < samples; i+=2)
{
- ((qint32*)data)[i]*= m_scaleLeft;
- ((qint32*)data)[i+1]*= m_scaleRight;
+ ((qint32*)b->data)[i]*= m_scaleLeft;
+ ((qint32*)b->data)[i+1]*= m_scaleRight;
}
}
else
{
- for (qint64 i = 0; i < size; i++)
- ((qint32*)data)[i]*= qMax(m_scaleRight, m_scaleLeft);
+ for (qint64 i = 0; i < samples; i++)
+ ((qint32*)b->data)[i]*= qMax(m_scaleRight, m_scaleLeft);
}
+ break;
+ default:
+ ;
}
}
diff --git a/src/qmmp/volumecontrol.h b/src/qmmp/volumecontrol.h
index bc299378a..54a10846a 100644
--- a/src/qmmp/volumecontrol.h
+++ b/src/qmmp/volumecontrol.h
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2008-2009 by Ilya Kotov *
+ * Copyright (C) 2008-2010 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -21,6 +21,8 @@
#define VOLUMECONTROL_H
#include <QObject>
+#include "qmmp.h"
+#include "buffer.h"
/*! @brief The VolumeControl class provides the base interface class for volume control.
* @author Ilya Kotov <forkotov02@hotmail.ru>
@@ -111,12 +113,11 @@ public:
void setVolume(int left, int right);
/*!
* Changes volume of buffer.
- * @param data Pointer to the buffer.
- * @param size Buffer size in bytes.
+ * @param b Pointer to the buffer object.
* @param chan Number of channels.
- * @param bits Sample size in bits.
+ * @param format Audio format.
*/
- void changeVolume(uchar *data, qint64 size, int chan, int bits);
+ void changeVolume(Buffer *b, int chan, Qmmp::AudioFormat format);
/*!
* Returns software volume object instance.
*/