diff options
| -rw-r--r-- | src/qmmp/decoder.cpp | 23 | ||||
| -rw-r--r-- | src/qmmp/decoder.h | 2 | ||||
| -rw-r--r-- | src/qmmp/output.cpp | 91 | ||||
| -rw-r--r-- | src/qmmp/output.h | 8 | ||||
| -rw-r--r-- | src/qmmp/qmmpplugincache.cpp | 19 | ||||
| -rw-r--r-- | src/qmmp/qmmpplugincache_p.h | 6 | ||||
| -rw-r--r-- | src/qmmpui/aboutdialog.cpp | 2 | ||||
| -rw-r--r-- | src/qmmpui/configdialog.cpp | 4 |
8 files changed, 84 insertions, 71 deletions
diff --git a/src/qmmp/decoder.cpp b/src/qmmp/decoder.cpp index eab4deb95..2539b9e33 100644 --- a/src/qmmp/decoder.cpp +++ b/src/qmmp/decoder.cpp @@ -3,12 +3,13 @@ // Use, modification and distribution is allowed without limitation, // warranty, or liability of any kind. // -#include <QtGui> #include <QObject> #include <QStringList> #include <QApplication> #include <QSettings> #include <QIODevice> +#include <QBuffer> +#include <QDir> #include <math.h> #include "qmmpplugincache_p.h" #include "buffer.h" @@ -92,7 +93,7 @@ static bool _pluginCacheLessComparator(QmmpPluginCache* f1, QmmpPluginCache* f2) return f1->priority() < f2->priority(); } -void Decoder::checkFactories() +void Decoder::loadPlugins() { if (m_cache) return; @@ -118,7 +119,7 @@ void Decoder::checkFactories() QString Decoder::file(DecoderFactory *factory) { - checkFactories(); + loadPlugins(); foreach(QmmpPluginCache *item, *m_cache) { if(item->shortName() == factory->properties().shortName) @@ -129,7 +130,7 @@ QString Decoder::file(DecoderFactory *factory) QStringList Decoder::protocols() { - checkFactories(); + loadPlugins(); QStringList protocolsList; foreach (QmmpPluginCache *item, *m_cache) @@ -145,7 +146,7 @@ QStringList Decoder::protocols() DecoderFactory *Decoder::findByPath(const QString& source, bool useContent) { - checkFactories(); + loadPlugins(); DecoderFactory *fact = m_lastFactory; if(useContent) { @@ -206,7 +207,7 @@ DecoderFactory *Decoder::findByMime(const QString& type) { if(type.isEmpty()) return 0; - checkFactories(); + loadPlugins(); foreach (QmmpPluginCache *item, *m_cache) { if(m_disabledNames.contains(item->shortName())) @@ -220,7 +221,7 @@ DecoderFactory *Decoder::findByMime(const QString& type) DecoderFactory *Decoder::findByContent(QIODevice *input) { - checkFactories(); + loadPlugins(); foreach (QmmpPluginCache *item, *m_cache) { if(m_disabledNames.contains(item->shortName())) @@ -234,7 +235,7 @@ DecoderFactory *Decoder::findByContent(QIODevice *input) DecoderFactory *Decoder::findByProtocol(const QString &p) { - checkFactories(); + loadPlugins(); foreach (QmmpPluginCache *item, *m_cache) { if(m_disabledNames.contains(item->shortName())) @@ -248,7 +249,7 @@ DecoderFactory *Decoder::findByProtocol(const QString &p) void Decoder::setEnabled(DecoderFactory* factory, bool enable) { - checkFactories(); + loadPlugins(); if (!factories().contains(factory)) return; @@ -267,13 +268,13 @@ void Decoder::setEnabled(DecoderFactory* factory, bool enable) bool Decoder::isEnabled(DecoderFactory* factory) { - checkFactories(); + loadPlugins(); return !m_disabledNames.contains(factory->properties().shortName); } QList<DecoderFactory *> Decoder::factories() { - checkFactories(); + loadPlugins(); QList<DecoderFactory *> list; foreach (QmmpPluginCache *item, *m_cache) { diff --git a/src/qmmp/decoder.h b/src/qmmp/decoder.h index 1298c1891..1af07a5c6 100644 --- a/src/qmmp/decoder.h +++ b/src/qmmp/decoder.h @@ -162,7 +162,7 @@ protected: void configure(quint32 srate = 44100, int chan = 2, Qmmp::AudioFormat f = Qmmp::PCM_S16LE); private: - static void checkFactories(); + static void loadPlugins(); static DecoderFactory *m_lastFactory; static QList<QmmpPluginCache*> *m_cache; static QStringList m_disabledNames; diff --git a/src/qmmp/output.cpp b/src/qmmp/output.cpp index fcc931a16..644648002 100644 --- a/src/qmmp/output.cpp +++ b/src/qmmp/output.cpp @@ -3,17 +3,17 @@ // Use, modification and distribution is allowed without limitation, // warranty, or liability of any kind. // - -#include <QtGui> #include <QObject> #include <QStringList> #include <QApplication> +#include <QDir> #include <stdio.h> #include "audioparameters.h" #include "qmmpsettings.h" #include "buffer.h" #include "volumecontrol_p.h" #include "qmmp.h" +#include "qmmpplugincache_p.h" #include "output.h" Output::Output() @@ -65,76 +65,71 @@ Output::~Output() {} // static methods +QList<QmmpPluginCache*> *Output::m_cache = 0; -QList<OutputFactory*> *Output::m_factories = 0; -QHash <OutputFactory*, QString> *Output::m_files = 0; - -void Output::checkFactories() +void Output::loadPlugins() { - if (!m_factories) - { - m_files = new QHash <OutputFactory*, QString>; - m_factories = new QList<OutputFactory *>; + if (m_cache) + return; - QDir pluginsDir (Qmmp::pluginsPath()); - pluginsDir.cd("Output"); - foreach (QString fileName, pluginsDir.entryList (QDir::Files)) + m_cache = new QList<QmmpPluginCache *>; + QSettings settings (Qmmp::configFile(), QSettings::IniFormat); + QDir pluginsDir (Qmmp::pluginsPath()); + pluginsDir.cd("Output"); + foreach (QString fileName, pluginsDir.entryList(QDir::Files)) + { + QmmpPluginCache *item = new QmmpPluginCache(pluginsDir.absoluteFilePath(fileName), &settings); + if(item->hasError()) { - QPluginLoader loader (pluginsDir.absoluteFilePath (fileName)); - QObject *plugin = loader.instance(); - if (loader.isLoaded()) - qDebug ("Output: loaded plugin %s", qPrintable (fileName)); - else - qWarning("Output: %s", qPrintable(loader.errorString ())); - - OutputFactory *factory = 0; - if (plugin) - factory = qobject_cast<OutputFactory *> (plugin); - - if (factory) - { - m_factories->append (factory); - m_files->insert(factory, pluginsDir.absoluteFilePath(fileName)); - qApp->installTranslator(factory->createTranslator(qApp)); - } + delete item; + continue; } + m_cache->append(item); } } Output *Output::create () { + loadPlugins(); Output *output = 0; - - checkFactories(); - if (m_factories->isEmpty ()) + if (m_cache->isEmpty ()) { qDebug("Output: unable to find output plugins"); return output; } OutputFactory *fact = Output::currentFactory(); - if (!fact && !m_factories->isEmpty()) - fact = m_factories->at(0); if (fact) output = fact->create (); return output; } -QList<OutputFactory*> *Output::factories() +QList<OutputFactory *> Output::factories() { - checkFactories(); - return m_factories; + loadPlugins(); + QList<OutputFactory *> list; + foreach(QmmpPluginCache *item, *m_cache) + { + if(item->outputFactory()) + list.append(item->outputFactory()); + } + return list; } QString Output::file(OutputFactory *factory) { - checkFactories(); - return m_files->value(factory); + loadPlugins(); + foreach(QmmpPluginCache *item, *m_cache) + { + if(item->shortName() == factory->properties().shortName) + return item->file(); + } + return QString(); } void Output::setCurrentFactory(OutputFactory* factory) { - checkFactories(); - if (!m_factories->contains(factory)) + loadPlugins(); + if (file(factory).isEmpty()) return; QSettings settings (Qmmp::configFile(), QSettings::IniFormat); settings.setValue ("Output/current_plugin", factory->properties().shortName); @@ -142,7 +137,7 @@ void Output::setCurrentFactory(OutputFactory* factory) OutputFactory *Output::currentFactory() { - checkFactories(); + loadPlugins(); QSettings settings (Qmmp::configFile(), QSettings::IniFormat); #ifdef Q_OS_LINUX QString name = settings.value("Output/current_plugin", "alsa").toString(); @@ -151,12 +146,12 @@ OutputFactory *Output::currentFactory() #else QString name = settings.value("Output/current_plugin", "oss4").toString(); #endif - foreach(OutputFactory *factory, *m_factories) + foreach(QmmpPluginCache *item, *m_cache) { - if (factory->properties().shortName == name) - return factory; + if (item->shortName() == name && item->outputFactory()) + return item->outputFactory(); } - if (!m_factories->isEmpty()) - return m_factories->at(0); + if (!m_cache->isEmpty()) + return m_cache->at(0)->outputFactory(); return 0; } diff --git a/src/qmmp/output.h b/src/qmmp/output.h index 16c438b96..05a4741c8 100644 --- a/src/qmmp/output.h +++ b/src/qmmp/output.h @@ -22,6 +22,7 @@ class QTimer; class QmmpSettings; +class QmmpPluginCache; /*! @brief The Output class provides the base interface class of audio outputs. * @author Brad Hughes <bhughes@trolltech.com> @@ -107,7 +108,7 @@ public: /*! * Returns a list of output factories. */ - static QList<OutputFactory*> *factories(); + static QList<OutputFactory*> factories(); /*! * Returns plugin file path. * @param factory Output plugin factory. @@ -135,9 +136,8 @@ private: quint32 m_frequency; int m_channels; Qmmp::AudioFormat m_format; - static void checkFactories(); - static QList<OutputFactory*> *m_factories; - static QHash <OutputFactory*, QString> *m_files; + static void loadPlugins(); + static QList<QmmpPluginCache*> *m_cache; }; diff --git a/src/qmmp/qmmpplugincache.cpp b/src/qmmp/qmmpplugincache.cpp index d84dddbbc..5f6b105ca 100644 --- a/src/qmmp/qmmpplugincache.cpp +++ b/src/qmmp/qmmpplugincache.cpp @@ -33,6 +33,7 @@ QmmpPluginCache::QmmpPluginCache(const QString &file, QSettings *settings) m_error = false; m_instance = 0; m_decoderFactory = 0; + m_outputFactory = 0; m_priority = 0; bool update = false; QFileInfo info(file); @@ -67,11 +68,11 @@ QmmpPluginCache::QmmpPluginCache(const QString &file, QSettings *settings) m_shortName = factory->properties().shortName; m_priority = factory->properties().priority; } - /*else if(OutputFactory *factory = outputFactory()) + else if(OutputFactory *factory = outputFactory()) { m_shortName = factory->properties().shortName; m_priority = 0; - }*/ + } else { qWarning("QmmpPluginCache: unknown plugin type: %s", qPrintable(m_path)); @@ -121,6 +122,20 @@ DecoderFactory *QmmpPluginCache::decoderFactory() return m_decoderFactory; } +OutputFactory *QmmpPluginCache::outputFactory() +{ + if(!m_outputFactory) + { + m_outputFactory = qobject_cast<OutputFactory *> (instance()); + if(m_outputFactory) + { + qDebug("QmmpPluginCache: loaded output %s", qPrintable(QFileInfo(m_path).fileName())); + qApp->installTranslator(m_outputFactory->createTranslator(qApp)); + } + } + return m_outputFactory; +} + bool QmmpPluginCache::hasError() const { return m_error; diff --git a/src/qmmp/qmmpplugincache_p.h b/src/qmmp/qmmpplugincache_p.h index ec76b986c..bb0235d59 100644 --- a/src/qmmp/qmmpplugincache_p.h +++ b/src/qmmp/qmmpplugincache_p.h @@ -26,6 +26,7 @@ #include <QSettings> class DecoderFactory; +class OutputFactory; /*! @internal * @author Ilya Kotov <forkotov02@hotmail.ru> @@ -40,10 +41,10 @@ public: int priority() const; bool hasError() const; - DecoderFactory *decoderFactory(); + OutputFactory *outputFactory(); + - //OutputFactory *outputFactory(); //EngineFactory *engineFactory(); static void cleanup(QSettings *settings); @@ -55,6 +56,7 @@ private: bool m_error; QObject *m_instance; DecoderFactory *m_decoderFactory; + OutputFactory *m_outputFactory; int m_priority; }; diff --git a/src/qmmpui/aboutdialog.cpp b/src/qmmpui/aboutdialog.cpp index c464ae5f2..efd339ca4 100644 --- a/src/qmmpui/aboutdialog.cpp +++ b/src/qmmpui/aboutdialog.cpp @@ -84,7 +84,7 @@ QString AboutDialog::loadAbout() text.append("</ul>"); text.append("<h5>"+tr("Output plugins:")+"</h5>"); text.append("<ul type=\"square\">"); - foreach(OutputFactory *fact, *Output::factories()) + foreach(OutputFactory *fact, Output::factories()) { text.append("<li>"); text.append(fact->properties().name); diff --git a/src/qmmpui/configdialog.cpp b/src/qmmpui/configdialog.cpp index e98e09b7d..a34f6bdfa 100644 --- a/src/qmmpui/configdialog.cpp +++ b/src/qmmpui/configdialog.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2007-2012 by Ilya Kotov * + * Copyright (C) 2007-2013 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -232,7 +232,7 @@ void ConfigDialog::loadPluginsInfo() load output plugins information */ item = new QTreeWidgetItem (m_ui->treeWidget, QStringList() << tr("Output")); - foreach(OutputFactory *factory, *Output::factories()) + foreach(OutputFactory *factory, Output::factories()) { new PluginItem (item, factory, Output::file(factory)); } |
