aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/qmmp/decoder.cpp23
-rw-r--r--src/qmmp/decoder.h2
-rw-r--r--src/qmmp/output.cpp91
-rw-r--r--src/qmmp/output.h8
-rw-r--r--src/qmmp/qmmpplugincache.cpp19
-rw-r--r--src/qmmp/qmmpplugincache_p.h6
-rw-r--r--src/qmmpui/aboutdialog.cpp2
-rw-r--r--src/qmmpui/configdialog.cpp4
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));
}