aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/qmmp/outputwriter.cpp15
-rw-r--r--src/qmmp/outputwriter_p.h5
-rw-r--r--src/qmmp/qmmp.pro7
-rw-r--r--src/qmmp/softwarevolume.cpp75
-rw-r--r--src/qmmp/softwarevolume_p.h46
-rw-r--r--src/qmmp/volumehandler.cpp79
-rw-r--r--src/qmmp/volumehandler.h7
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;
};