From da82e9b8ea8e24a09e1e0a8ebbe890b81abf9810 Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Sun, 28 Sep 2008 20:46:28 +0000 Subject: improved software volume control, removed unused code git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@570 90c681e8-e032-0410-971d-27865f9a5e38 --- src/plugins/Output/alsa/outputalsa.cpp | 12 +---- src/plugins/Output/alsa/outputalsa.h | 2 +- src/plugins/Output/alsa/outputalsafactory.cpp | 4 +- src/plugins/Output/alsa/outputalsafactory.h | 2 +- src/qmmp/decoder.cpp | 37 +++------------- src/qmmp/decoder.h | 5 --- src/qmmp/output.cpp | 49 +------------------- src/qmmp/output.h | 7 --- src/qmmp/outputfactory.h | 4 +- src/qmmp/soundcore.cpp | 56 +++++++++-------------- src/qmmp/soundcore.h | 17 +++---- src/qmmp/volumecontrol.cpp | 64 ++++++++++++++++++++++++++- src/qmmp/volumecontrol.h | 25 +++++++++++ src/ui/configdialog.cpp | 6 ++- src/ui/mainwindow.cpp | 2 +- 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 #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"); 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 *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 +#include +#include + #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 #include #include +#include #include #include #include @@ -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; -- cgit v1.2.3-13-gbd6f