diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-01-16 18:43:58 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-01-16 18:43:58 +0000 |
| commit | 230caf399303a72a9cc93f19158f120c30bd116f (patch) | |
| tree | fb026b5627b0a82290f5bb57deb9dfc8b3c2243c /src | |
| parent | 9289605dbae4ec73ef37213626bb2252abeefaf1 (diff) | |
| download | qmmp-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
Diffstat (limited to 'src')
| -rw-r--r-- | src/qmmp/output.cpp | 4 | ||||
| -rw-r--r-- | src/qmmp/volumecontrol.cpp | 55 | ||||
| -rw-r--r-- | src/qmmp/volumecontrol.h | 11 |
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. */ |
