diff options
| -rw-r--r-- | src/qmmp/outputwriter.cpp | 15 | ||||
| -rw-r--r-- | src/qmmp/outputwriter_p.h | 5 | ||||
| -rw-r--r-- | src/qmmp/qmmp.pro | 7 | ||||
| -rw-r--r-- | src/qmmp/softwarevolume.cpp | 75 | ||||
| -rw-r--r-- | src/qmmp/softwarevolume_p.h | 46 | ||||
| -rw-r--r-- | src/qmmp/volumehandler.cpp | 79 | ||||
| -rw-r--r-- | src/qmmp/volumehandler.h | 7 |
7 files changed, 82 insertions, 152 deletions
diff --git a/src/qmmp/outputwriter.cpp b/src/qmmp/outputwriter.cpp index 28d91a325..63abd7980 100644 --- a/src/qmmp/outputwriter.cpp +++ b/src/qmmp/outputwriter.cpp @@ -108,17 +108,6 @@ void OutputWriter::stop() m_user_stop = true; } -/*void OutputWriter::setMuted(bool muted) -{ - m_muted = muted; - if(isRunning() && m_output) - { - m_mutex.lock(); - m_output->setMuted(muted); - m_mutex.unlock(); - } -}*/ - void OutputWriter::finish() { m_finish = true; @@ -300,8 +289,8 @@ void OutputWriter::run() } m_mutex.unlock(); dispatchVisual(b); - //if (SoftwareVolume::instance()) - // SoftwareVolume::instance()->changeVolume(b, m_channels); + if(VolumeHandler::instance()) + VolumeHandler::instance()->apply(b, m_channels); if(m_channel_converter) m_channel_converter->applyEffect(b); l = 0; diff --git a/src/qmmp/outputwriter_p.h b/src/qmmp/outputwriter_p.h index a0fb6f9c7..6f8204e67 100644 --- a/src/qmmp/outputwriter_p.h +++ b/src/qmmp/outputwriter_p.h @@ -63,11 +63,6 @@ public: */ void stop(); /*! - * Mutes/Restores volume - * @param mute state of volume (\b true - mute, \b false - restore) - */ - //void setMuted(bool muted); - /*! * Requests playback to finish. */ void finish(); diff --git a/src/qmmp/qmmp.pro b/src/qmmp/qmmp.pro index 466e0a6ce..7ebb9a0e8 100644 --- a/src/qmmp/qmmp.pro +++ b/src/qmmp/qmmp.pro @@ -41,8 +41,7 @@ HEADERS += \ visualbuffer_p.h \ qmmp_export.h \ trackinfo.h \ - volumehandler.h \ - softwarevolume_p.h + volumehandler.h SOURCES += recycler.cpp \ decoder.cpp \ output.cpp \ @@ -76,8 +75,7 @@ SOURCES += recycler.cpp \ dithering.cpp \ visualbuffer.cpp \ trackinfo.cpp \ - volumehandler.cpp \ - softwarevolume.cpp + volumehandler.cpp unix:TARGET = ../../lib/qmmp$$APP_NAME_SUFFIX win32:TARGET = ../../../bin/qmmp @@ -140,6 +138,7 @@ unix { visualfactory.h \ visual.h \ volume.h \ + volumehandler.h \ qmmp_export.h isEmpty(APP_NAME_SUFFIX) { diff --git a/src/qmmp/softwarevolume.cpp b/src/qmmp/softwarevolume.cpp deleted file mode 100644 index ed4343fb4..000000000 --- a/src/qmmp/softwarevolume.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2008-2019 by Ilya Kotov * - * forkotov02@ya.ru * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#include <QSettings> -#include "buffer.h" -#include "qmmp.h" -#include "softwarevolume_p.h" - -SoftwareVolume::SoftwareVolume() -{ - QSettings settings(Qmmp::configFile(), QSettings::IniFormat); - m_left = settings.value("Volume/left", 80).toInt(); - m_right = settings.value("Volume/right", 80).toInt(); - m_scaleLeft = (double)m_left/100.0; - m_scaleRight = (double)m_right/100.0; -} - -SoftwareVolume::~SoftwareVolume() -{ - QSettings settings(Qmmp::configFile(), QSettings::IniFormat); - settings.setValue("Volume/left", m_left); - settings.setValue("Volume/right", m_right); -} - -void SoftwareVolume::setVolume(const VolumeSettings &v) -{ - m_left = v.left; - m_right = v.right; - m_scaleLeft = (double)m_left/100.0; - m_scaleRight = (double)m_right/100.0; -} - -VolumeSettings SoftwareVolume::volume() const -{ - VolumeSettings v; - v.left = m_left; - v.right = m_right; - return v; -} - -void SoftwareVolume::changeVolume(Buffer *b, int chan) -{ - if(chan == 1) - { - for(size_t i = 0; i < b->samples; ++i) - { - b->data[i] *= qMax(m_scaleLeft, m_scaleRight); - } - } - else - { - for(size_t i = 0; i < b->samples; i+=2) - { - b->data[i] *= m_scaleLeft; - b->data[i+1] *= m_scaleRight; - } - } -} diff --git a/src/qmmp/softwarevolume_p.h b/src/qmmp/softwarevolume_p.h deleted file mode 100644 index e82f4317b..000000000 --- a/src/qmmp/softwarevolume_p.h +++ /dev/null @@ -1,46 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2008-2019 by Ilya Kotov * - * forkotov02@ya.ru * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#ifndef SOFTWAREVOLUME_P_H -#define SOFTWAREVOLUME_P_H - -#include "volume.h" -#include "buffer.h" - -/*! @internal - * @brief The SoftwareVolume class provides access to the software volume control. - * @author Ilya Kotov <forkotov02@ya.ru> - */ -class SoftwareVolume : public Volume -{ -public: - SoftwareVolume(); - ~SoftwareVolume(); - - void setVolume(const VolumeSettings &v) override; - VolumeSettings volume() const override; - void changeVolume(Buffer *b, int chan); - -private: - int m_left, m_right; - double m_scaleLeft, m_scaleRight; -}; - -#endif // SOFTWAREVOLUME_P_H diff --git a/src/qmmp/volumehandler.cpp b/src/qmmp/volumehandler.cpp index 49abeb064..9932fa69d 100644 --- a/src/qmmp/volumehandler.cpp +++ b/src/qmmp/volumehandler.cpp @@ -23,20 +23,33 @@ #include <QSettings> #include "qmmpsettings.h" #include "output.h" -#include "softwarevolume_p.h" #include "volumehandler.h" +VolumeHandler *VolumeHandler::m_instance = nullptr; + VolumeHandler::VolumeHandler(QObject *parent) : QObject(parent) { + if(m_instance) + qFatal("VolumeHandler: only one instance is allowed!"); + + QSettings settings(Qmmp::configFile(), QSettings::IniFormat); + m_settings.left = settings.value("Volume/left", 80).toInt(); + m_settings.right = settings.value("Volume/right", 80).toInt(); m_timer = new QTimer(this); connect(m_timer, SIGNAL(timeout()), SLOT(checkVolume())); reload(); + m_instance = this; } VolumeHandler::~VolumeHandler() { + m_instance = nullptr; if(m_volume) delete m_volume; + + QSettings settings(Qmmp::configFile(), QSettings::IniFormat); + settings.setValue("Volume/left", m_settings.left); + settings.setValue("Volume/right", m_settings.right); } void VolumeHandler::setVolume(int left, int right) @@ -44,8 +57,18 @@ void VolumeHandler::setVolume(int left, int right) VolumeSettings v; v.left = qBound(0,left,100); v.right = qBound(0,right,100); - m_volume->setVolume(v); - checkVolume(); + if(m_volume) + { + m_volume->setVolume(v); + checkVolume(); + } + else if(m_settings != v) + { + m_settings = v; + m_scaleLeft = double(m_settings.left) / 100.0; + m_scaleRight = double(m_settings.right) / 100.0; + checkVolume(); + } } void VolumeHandler::changeVolume(int delta) @@ -71,8 +94,11 @@ void VolumeHandler::setMuted(bool muted) { if(m_muted != muted) { - m_volume->setMuted(muted); - checkVolume(); + if(m_volume) + { + m_volume->setMuted(muted); + checkVolume(); + } } } @@ -102,8 +128,43 @@ bool VolumeHandler::isMuted() const return m_muted; } +void VolumeHandler::apply(Buffer *b, int chan) +{ + if(m_apply) + { + if(chan == 1) + { + for(size_t i = 0; i < b->samples; ++i) + { + b->data[i] *= qMax(m_scaleLeft, m_scaleRight); + } + } + else + { + for(size_t i = 0; i < b->samples; i+=2) + { + b->data[i] *= m_scaleLeft; + b->data[i+1] *= m_scaleRight; + } + } + } +} + +VolumeHandler *VolumeHandler::instance() +{ + return m_instance; +} + void VolumeHandler::checkVolume() { + if(!m_volume) //soft volume + { + emit volumeChanged(m_settings.left, m_settings.right); + emit volumeChanged(volume()); + emit balanceChanged(balance()); + return; + } + VolumeSettings v = m_volume->volume(); bool muted = m_volume->isMuted(); @@ -141,6 +202,7 @@ void VolumeHandler::reload() delete m_volume; m_volume = nullptr; } + m_apply = false; if(!QmmpSettings::instance()->useSoftVolume() && Output::currentFactory()) m_volume = Output::currentFactory()->createVolume(); @@ -162,10 +224,9 @@ void VolumeHandler::reload() } else { - if(restore) - m_volume->setMuted(m_muted); - - m_volume = new SoftwareVolume; + m_scaleLeft = double(m_settings.left) / 100.0; + m_scaleRight = double(m_settings.right) / 100.0; + m_apply = true; blockSignals(true); checkVolume(); blockSignals(false); diff --git a/src/qmmp/volumehandler.h b/src/qmmp/volumehandler.h index 0bf3bd99e..5071c112e 100644 --- a/src/qmmp/volumehandler.h +++ b/src/qmmp/volumehandler.h @@ -86,6 +86,10 @@ public: bool isMuted() const; + void apply(Buffer *b, int chan); + + static VolumeHandler *instance(); + signals: /*! * Emitted when volume is changed. @@ -119,8 +123,11 @@ private: VolumeSettings m_settings; bool m_prev_block = false; bool m_muted = false; + double m_scaleLeft = 0, m_scaleRight = 0; + bool m_apply = false; Volume *m_volume = nullptr; QTimer *m_timer; + static VolumeHandler *m_instance; }; |
