aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/Output/alsa/outputalsa.cpp12
-rw-r--r--src/plugins/Output/alsa/outputalsa.h2
-rw-r--r--src/plugins/Output/alsa/outputalsafactory.cpp4
-rw-r--r--src/plugins/Output/alsa/outputalsafactory.h2
-rw-r--r--src/qmmp/decoder.cpp37
-rw-r--r--src/qmmp/decoder.h5
-rw-r--r--src/qmmp/output.cpp49
-rw-r--r--src/qmmp/output.h7
-rw-r--r--src/qmmp/outputfactory.h4
-rw-r--r--src/qmmp/soundcore.cpp56
-rw-r--r--src/qmmp/soundcore.h17
-rw-r--r--src/qmmp/volumecontrol.cpp64
-rw-r--r--src/qmmp/volumecontrol.h25
-rw-r--r--src/ui/configdialog.cpp6
-rw-r--r--src/ui/mainwindow.cpp2
15 files changed, 134 insertions, 158 deletions
diff --git a/src/plugins/Output/alsa/outputalsa.cpp b/src/plugins/Output/alsa/outputalsa.cpp
index 1491c4584..6e277663c 100644
--- a/src/plugins/Output/alsa/outputalsa.cpp
+++ b/src/plugins/Output/alsa/outputalsa.cpp
@@ -37,7 +37,7 @@
#include <qmmp/statehandler.h>
#include "outputalsa.h"
-OutputALSA::OutputALSA(QObject * parent, bool useVolume)
+OutputALSA::OutputALSA(QObject * parent)
: Output(parent), m_inited(FALSE), m_pause(FALSE), m_play(FALSE),
m_userStop(FALSE), m_totalWritten(0), m_currentSeconds(-1),
m_bps(-1), m_channels(-1), m_precision(-1)
@@ -48,22 +48,12 @@ OutputALSA::OutputALSA(QObject * parent, bool useVolume)
m_use_mmap = settings.value("ALSA/use_mmap", FALSE).toBool();
pcm_name = strdup(dev_name.toAscii().data());
pcm_handle = 0;
- //alsa mixer
- /*mixer = 0;
- if (useVolume)
- {
- QString card = settings.value("ALSA/mixer_card","hw:0").toString();
- QString dev = settings.value("ALSA/mixer_device", "PCM").toString();
- setupMixer(card, dev);
- }*/
}
OutputALSA::~OutputALSA()
{
uninitialize();
free (pcm_name);
- /*if (mixer)
- snd_mixer_close(mixer);*/
}
void OutputALSA::stop()
diff --git a/src/plugins/Output/alsa/outputalsa.h b/src/plugins/Output/alsa/outputalsa.h
index abf7cb1e5..72b4de5a1 100644
--- a/src/plugins/Output/alsa/outputalsa.h
+++ b/src/plugins/Output/alsa/outputalsa.h
@@ -38,7 +38,7 @@ class OutputALSA : public Output
{
Q_OBJECT
public:
- OutputALSA(QObject * parent = 0, bool useVolume = TRUE);
+ OutputALSA(QObject * parent = 0);
~OutputALSA();
bool initialize();
diff --git a/src/plugins/Output/alsa/outputalsafactory.cpp b/src/plugins/Output/alsa/outputalsafactory.cpp
index d9ecce6af..3b90073a5 100644
--- a/src/plugins/Output/alsa/outputalsafactory.cpp
+++ b/src/plugins/Output/alsa/outputalsafactory.cpp
@@ -34,9 +34,9 @@ const OutputProperties OutputALSAFactory::properties() const
return properties;
}
-Output* OutputALSAFactory::create(QObject* parent, bool volume)
+Output* OutputALSAFactory::create(QObject* parent)
{
- return new OutputALSA(parent, volume);
+ return new OutputALSA(parent);
}
VolumeControl *OutputALSAFactory::createVolumeControl(QObject *parent)
diff --git a/src/plugins/Output/alsa/outputalsafactory.h b/src/plugins/Output/alsa/outputalsafactory.h
index b772248d3..98f35ed4f 100644
--- a/src/plugins/Output/alsa/outputalsafactory.h
+++ b/src/plugins/Output/alsa/outputalsafactory.h
@@ -38,7 +38,7 @@ Q_INTERFACES(OutputFactory);
public:
const OutputProperties properties() const;
- Output* create(QObject* parent, bool volume);
+ Output* create(QObject* parent);
VolumeControl *createVolumeControl(QObject *parent);
void showSettings(QWidget* parent);
void showAbout(QWidget *parent);
diff --git a/src/qmmp/decoder.cpp b/src/qmmp/decoder.cpp
index da13ebfec..13be451dc 100644
--- a/src/qmmp/decoder.cpp
+++ b/src/qmmp/decoder.cpp
@@ -20,6 +20,7 @@
#include "visual.h"
#include "decoderfactory.h"
#include "streamreader.h"
+#include "volumecontrol.h"
extern "C"
{
#include "equ/iir.h"
@@ -37,11 +38,6 @@ Decoder::Decoder(QObject *parent, DecoderFactory *d, QIODevice *i, Output *o)
qRegisterMetaType<Qmmp::State>("Qmmp::State");
blksize = Buffer::size();
m_effects = Effect::create(this);
- QSettings settings(QDir::homePath()+"/.qmmp/qmmprc", QSettings::IniFormat);
- m_useVolume = settings.value("Volume/software_volume", FALSE).toBool();
- m_volL = settings.value("Volume/left", 80).toInt();
- m_volR = settings.value("Volume/right", 80).toInt();
- //setVolume(m_volL, m_volR);
m_handler = StateHandler::instance();
}
@@ -100,24 +96,6 @@ void Decoder::setEQEnabled(bool on)
m_useEQ = on;
}
-void Decoder::setVolume(int l, int r)
-{
- m_mutex.lock();
- m_volL = l;
- m_volR = r;
- m_volLF = pow( 10, (l - 100)/40.0 ) * 256;
- m_volRF = pow( 10, (r - 100)/40.0 ) * 256;
- m_mutex.lock();
-}
-
-void Decoder::volume(int *l, int *r)
-{
- m_mutex.lock();
- *l = m_volL;
- *r = m_volR;
- m_mutex.unlock();
-}
-
void Decoder::configure(quint32 srate, int chan, int bps)
{
Effect* effect = 0;
@@ -145,10 +123,7 @@ qint64 Decoder::produceSound(char *data, qint64 size, quint32 brate, int chan)
}
iir((void*) data, sz, chan);
}
- if (m_useVolume)
- {
- changeVolume(data, sz, chan);
- }
+ changeVolume(data, sz, chan);
char *out_data = data;
char *prev_data = data;
qint64 w = sz;
@@ -197,15 +172,17 @@ void Decoder::finish()
void Decoder::changeVolume(char *data, qint64 size, int chan)
{
+ if (!SoftwareVolume::instance())
+ return;
if (chan > 1)
for (qint64 i = 0; i < size/2; i+=2)
{
- ((short*)data)[i]*= m_volLF/256.0;
- ((short*)data)[i+1]*= m_volRF/256.0;
+ ((short*)data)[i]*= SoftwareVolume::instance()->left()/256.0;
+ ((short*)data)[i+1]*= SoftwareVolume::instance()->right()/256.0;
}
else
{
- int l = qMax(m_volLF,m_volRF);
+ int l = qMax(SoftwareVolume::instance()->left(), SoftwareVolume::instance()->right());
for (qint64 i = 0; i < size/2; i++)
((short*)data)[i]*= l/256.0;
}
diff --git a/src/qmmp/decoder.h b/src/qmmp/decoder.h
index 75600a687..08931563c 100644
--- a/src/qmmp/decoder.h
+++ b/src/qmmp/decoder.h
@@ -56,9 +56,6 @@ public:
void setEQ(int bands[10], int preamp);
void setEQEnabled(bool on);
- void setVolume(int, int);
- void volume(int*, int*);
-
// static methods
static QStringList all();
static bool supports(const QString &);
@@ -98,8 +95,6 @@ private:
uint blksize;
bool m_eqInited;
bool m_useEQ;
- bool m_useVolume;
- int m_volL, m_volR, m_volLF, m_volRF;
StateHandler *m_handler;
static QList<DecoderFactory*> *m_factories;
static QStringList m_files;
diff --git a/src/qmmp/output.cpp b/src/qmmp/output.cpp
index 2ffe11aaf..839fb1f50 100644
--- a/src/qmmp/output.cpp
+++ b/src/qmmp/output.cpp
@@ -17,8 +17,6 @@
Output::Output (QObject* parent) : QThread (parent), m_recycler (stackSize())
{
- m_bl = -1;
- m_br = -1;
m_handler = 0;
}
@@ -64,30 +62,6 @@ void Output::clearVisuals()
}
}
-void Output::checkVolume()
-{
- int ll = 0, lr = 0;
- //volume(&ll,&lr);
- ll = (ll > 100) ? 100 : ll;
- lr = (lr > 100) ? 100 : lr;
- ll = (ll < 0) ? 0 : ll;
- lr = (lr < 0) ? 0 : lr;
- if (m_bl!=ll || m_br!=lr)
- {
- m_bl = ll;
- m_br = lr;
- //dispatchVolume(ll,lr);
- }
-}
-
-void Output::checkSoftwareVolume()
-{
- QSettings settings(QDir::homePath()+"/.qmmp/qmmprc", QSettings::IniFormat);
- int L = settings.value("Volume/left", 80).toInt();
- int R = settings.value("Volume/right", 80).toInt();
- //dispatchVolume(L, R);
-}
-
void Output::dispatch(qint64 elapsed,
qint64 totalTime,
int bitrate,
@@ -163,29 +137,8 @@ Output *Output::create (QObject *parent)
OutputFactory *fact = Output::currentFactory();
if (!fact && !m_factories->isEmpty())
fact = m_factories->at(0);
- /*foreach(fact, *m_factories)
- {
- if (isEnabled(fact))
- break;
- else
- fact = m_factories->at(0);
- }*/
- QSettings settings (QDir::homePath() +"/.qmmp/qmmprc", QSettings::IniFormat);
- bool useVolume = !settings.value("Volume/software_volume", FALSE).toBool();
if (fact)
- {
- output = fact->create (parent, useVolume);
- if (useVolume)
- {
- m_timer = new QTimer(output);
- connect(m_timer, SIGNAL(timeout()), output, SLOT(checkVolume()));
- m_timer->start(125);
- }
- else
- {
- QTimer::singleShot(125, output, SLOT(checkSoftwareVolume()));
- }
- }
+ output = fact->create (parent);
return output;
}
diff --git a/src/qmmp/output.h b/src/qmmp/output.h
index 86e5d3aef..b0ff92313 100644
--- a/src/qmmp/output.h
+++ b/src/qmmp/output.h
@@ -43,8 +43,6 @@ public:
virtual qint64 written() = 0;
virtual qint64 latency() = 0;
virtual void seek(qint64) = 0;
- //virtual void setVolume(int, int){};
- //virtual void volume(int *, int *){};
Recycler *recycler();
QMutex *mutex();
@@ -57,10 +55,6 @@ public:
static void setCurrentFactory(OutputFactory* factory);
static OutputFactory *currentFactory();
-public slots:
- void checkVolume();
- void checkSoftwareVolume();
-
protected:
void dispatch(qint64 elapsed,
qint64 totalTime,
@@ -75,7 +69,6 @@ protected:
private:
QMutex m_mutex;
Recycler m_recycler;
- int m_bl, m_br;
StateHandler *m_handler;
static void checkFactories();
diff --git a/src/qmmp/outputfactory.h b/src/qmmp/outputfactory.h
index 3e3e6cd01..3e27f2396 100644
--- a/src/qmmp/outputfactory.h
+++ b/src/qmmp/outputfactory.h
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2007 by Ilya Kotov *
+ * Copyright (C) 2007-2008 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -43,7 +43,7 @@ class OutputFactory
public:
virtual ~OutputFactory() {}
virtual const OutputProperties properties() const = 0;
- virtual Output *create(QObject *, bool) = 0;
+ virtual Output *create(QObject *) = 0;
virtual VolumeControl *createVolumeControl(QObject *) = 0;
virtual void showSettings(QWidget *parent) = 0;
virtual void showAbout(QWidget *parent) = 0;
diff --git a/src/qmmp/soundcore.cpp b/src/qmmp/soundcore.cpp
index 7c242948a..14afd503a 100644
--- a/src/qmmp/soundcore.cpp
+++ b/src/qmmp/soundcore.cpp
@@ -260,47 +260,33 @@ void SoundCore::setEQEnabled(bool on)
void SoundCore::setVolume(int L, int R)
{
m_volumeControl->setVolume(L, R);
- /*QSettings settings(QDir::homePath()+"/.qmmp/qmmprc", QSettings::IniFormat);
- bool sofVolume = settings.value("Volume/software_volume", FALSE).toBool();
- if (sofVolume)
- {
- L = qMin(L,100);
- R = qMin(R,100);
- L = qMax(L,0);
- R = qMax(R,0);
- settings.setValue("Volume/left", L);
- settings.setValue("Volume/right", R);
- if (m_decoder)
- m_decoder->setVolume(L,R);
- if (m_output)
- m_output->checkSoftwareVolume();
- }
-/* else if (m_output)
- m_output->setVolume(L,R);*/
}
-void SoundCore::volume(int *left, int *right)
+int SoundCore::leftVolume()
{
- *left = 0;
- *right = 0;
- QSettings settings(QDir::homePath()+"/.qmmp/qmmprc", QSettings::IniFormat);
- bool sofVolume = settings.value("Volume/software_volume", FALSE).toBool();
- if (sofVolume)
- {
- *left = settings.value("Volume/left", 0).toInt();
- *right = settings.value("Volume/right", 0).toInt();
- }
- /*else if (m_output)
- m_output->volume(left,right);*/
- return;
+ return m_volumeControl->left();
+}
+
+int SoundCore::rightVolume()
+{
+ return m_volumeControl->right();
+}
+
+void SoundCore::setSoftwareVolume(bool b)
+{
+ SoftwareVolume::setEnabled(b);
+ if (m_decoder)
+ m_decoder->mutex()->lock();
+ delete m_volumeControl;
+ m_volumeControl = VolumeControl::create(this);
+ connect(m_volumeControl, SIGNAL(volumeChanged(int, int)), SIGNAL(volumeChanged(int, int)));
+ if (m_decoder)
+ m_decoder->mutex()->unlock();
}
-void SoundCore::updateConfig()
+bool SoundCore::softwareVolume()
{
- //m_update = TRUE;
- /*if (isInitialized())
- return;
- stop();*/
+ return SoftwareVolume::instance() != 0;
}
qint64 SoundCore::elapsed()
diff --git a/src/qmmp/soundcore.h b/src/qmmp/soundcore.h
index 645a0cc7e..b24dd886e 100644
--- a/src/qmmp/soundcore.h
+++ b/src/qmmp/soundcore.h
@@ -61,18 +61,9 @@ public:
*/
void setEQEnabled(bool on);
- /*!
- * reads current volume.
- * \p left contains volume of the left channel.
- * \p right contains volume of the right channel.
- */
- void volume(int *left, int *right);
-
- /*!
- * updates configuration
- */
- void updateConfig();
-
+ int leftVolume();
+ int rightVolume();
+ bool softwareVolume();
qint64 elapsed();
int bitrate();
@@ -100,6 +91,8 @@ public:
public slots:
+ void setSoftwareVolume(bool);
+
/*!
* Sets volume.
* \p left - volume of the left channel.
diff --git a/src/qmmp/volumecontrol.cpp b/src/qmmp/volumecontrol.cpp
index 637427a98..2dd22562d 100644
--- a/src/qmmp/volumecontrol.cpp
+++ b/src/qmmp/volumecontrol.cpp
@@ -19,6 +19,9 @@
***************************************************************************/
#include <QTimer>
+#include <QSettings>
+#include <QDir>
+
#include "output.h"
#include "volumecontrol.h"
@@ -30,20 +33,34 @@ VolumeControl::VolumeControl(QObject *parent)
m_right = 0;
}
-
VolumeControl::~VolumeControl()
{
}
VolumeControl *VolumeControl::create(QObject *parent)
{
+ QSettings settings(QDir::homePath()+"/.qmmp/qmmprc", QSettings::IniFormat);
+ if (settings.value("Volume/software_volume", FALSE).toBool())
+ return new SoftwareVolume(parent);
VolumeControl *control = Output::currentFactory()->createVolumeControl(parent);
+ if (!control)
+ return new SoftwareVolume(parent);
QTimer *m_timer = new QTimer(control);
connect(m_timer, SIGNAL(timeout()), control, SLOT(checkVolume()));
m_timer->start(125);
return control;
}
+int VolumeControl::left()
+{
+ return m_left;
+}
+
+int VolumeControl::right()
+{
+ return m_right;
+}
+
void VolumeControl::checkVolume()
{
int l = 0, r = 0;
@@ -59,3 +76,48 @@ void VolumeControl::checkVolume()
emit volumeChanged(m_left, m_right);
}
}
+
+SoftwareVolume *SoftwareVolume::m_instance = 0;
+
+SoftwareVolume::SoftwareVolume(QObject *parent)
+ : VolumeControl(parent)
+{
+ QSettings settings(QDir::homePath()+"/.qmmp/qmmprc", QSettings::IniFormat);
+ m_left = settings.value("Volume/left", 80).toInt();
+ m_right = settings.value("Volume/right", 80).toInt();
+ QTimer::singleShot(125, this, SLOT(checkVolume()));
+ m_instance = this;
+ //checkVolume();
+}
+
+SoftwareVolume::~SoftwareVolume()
+{
+ QSettings settings(QDir::homePath()+"/.qmmp/qmmprc", QSettings::IniFormat);
+ settings.setValue("Volume/left", m_left);
+ settings.setValue("Volume/right", m_right);
+ m_instance = 0;
+}
+
+void SoftwareVolume::setVolume(int left, int right)
+{
+ m_left = left;
+ m_right = right;
+ checkVolume();
+}
+
+void SoftwareVolume::volume(int *left, int *right)
+{
+ *left = m_left;
+ *right = m_right;
+}
+//static
+SoftwareVolume *SoftwareVolume::instance()
+{
+ return m_instance;
+}
+
+void SoftwareVolume::setEnabled(bool b)
+{
+ QSettings settings(QDir::homePath()+"/.qmmp/qmmprc", QSettings::IniFormat);
+ settings.setValue("Volume/software_volume", b);
+}
diff --git a/src/qmmp/volumecontrol.h b/src/qmmp/volumecontrol.h
index 72e0bbe7e..5fa17ce78 100644
--- a/src/qmmp/volumecontrol.h
+++ b/src/qmmp/volumecontrol.h
@@ -35,6 +35,9 @@ public:
virtual void setVolume(int left, int right) = 0;
+ int left();
+ int right();
+
static VolumeControl *create(QObject *parent = 0);
signals:
@@ -51,4 +54,26 @@ private:
};
+class SoftwareVolume : public VolumeControl
+{
+ Q_OBJECT
+public:
+ SoftwareVolume(QObject *parent = 0);
+
+ ~SoftwareVolume();
+
+ void setVolume(int left, int right);
+
+ static SoftwareVolume *instance();
+ static void setEnabled(bool b);
+
+protected:
+ void volume(int *left, int *right);
+
+private:
+ int m_left, m_right;
+ static SoftwareVolume *m_instance;
+
+};
+
#endif
diff --git a/src/ui/configdialog.cpp b/src/ui/configdialog.cpp
index 6b950d546..9ddfb3c29 100644
--- a/src/ui/configdialog.cpp
+++ b/src/ui/configdialog.cpp
@@ -33,6 +33,7 @@
#include <qmmp/visualfactory.h>
#include <qmmp/effectfactory.h>
#include <qmmp/effect.h>
+#include <qmmp/soundcore.h>
#include <qmmpui/generalfactory.h>
#include <qmmpui/general.h>
#include <qmmpui/generalhandler.h>
@@ -120,7 +121,9 @@ void ConfigDialog::readSettings()
ui.hiddenCheckBox->setChecked(settings.value("MainWindow/start_hidden", FALSE).toBool());
ui.hideOnCloseCheckBox->setChecked(settings.value("MainWindow/hide_on_close", FALSE).toBool());
- ui.softVolumeCheckBox->setChecked(settings.value("Volume/software_volume", FALSE).toBool());
+ //volume
+ ui.softVolumeCheckBox->setChecked(SoundCore::instance()->softwareVolume());
+ connect(ui.softVolumeCheckBox, SIGNAL(clicked(bool)), SoundCore::instance(), SLOT(setSoftwareVolume(bool)));
}
void ConfigDialog::changePage (QListWidgetItem *current, QListWidgetItem *previous)
@@ -545,7 +548,6 @@ void ConfigDialog::saveSettings()
settings.setValue ("Proxy/port",ui.portLineEdit->text());
settings.setValue ("Proxy/user",ui.proxyUserLineEdit->text());
settings.setValue ("Proxy/passw",ui.proxyPasswLineEdit->text());
- settings.setValue ("Volume/software_volume", ui.softVolumeCheckBox->isChecked());
settings.setValue ("MainWindow/start_hidden", ui.hiddenCheckBox->isChecked());
settings.setValue ("MainWindow/hide_on_close", ui.hideOnCloseCheckBox->isChecked());
}
diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp
index 0e2d1ade9..d2e50a98c 100644
--- a/src/ui/mainwindow.cpp
+++ b/src/ui/mainwindow.cpp
@@ -492,7 +492,7 @@ void MainWindow::showSettings()
readSettings();
m_playlist->readSettings();
TextScroller::getPointer()->readSettings();
- m_core->updateConfig();
+ //m_core->updateConfig();
m_visMenu->updateActions();
}
delete m_confDialog;