From 230caf399303a72a9cc93f19158f120c30bd116f Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Sat, 16 Jan 2010 18:43:58 +0000 Subject: 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 --- src/qmmp/output.cpp | 4 ++-- src/qmmp/volumecontrol.cpp | 55 +++++++++++++++++++++++++--------------------- src/qmmp/volumecontrol.h | 11 +++++----- 3 files changed, 38 insertions(+), 32 deletions(-) (limited to 'src') 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 +#include "qmmp.h" +#include "buffer.h" /*! @brief The VolumeControl class provides the base interface class for volume control. * @author Ilya Kotov @@ -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. */ -- cgit v1.2.3-13-gbd6f