aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/qmmp/decoder.cpp26
-rw-r--r--src/qmmp/decoder.h9
-rw-r--r--src/qmmp/metadatamanager.cpp67
-rw-r--r--src/qmmp/metadatamanager.h22
-rw-r--r--src/qmmp/qmmpaudioengine.cpp8
-rw-r--r--src/qmmpui/detailsdialog.cpp13
-rw-r--r--src/qmmpui/mediaplayer.cpp2
-rw-r--r--src/qmmpui/playlistmodel.cpp16
8 files changed, 91 insertions, 72 deletions
diff --git a/src/qmmp/decoder.cpp b/src/qmmp/decoder.cpp
index cee614ee8..dd0235ca8 100644
--- a/src/qmmp/decoder.cpp
+++ b/src/qmmp/decoder.cpp
@@ -111,22 +111,6 @@ QStringList Decoder::files()
return m_files;
}
-
-bool Decoder::supports(const QString &source)
-{
- checkFactories();
-
- DecoderFactory *fact;
- foreach(fact, *m_factories)
- {
- if (fact->supports(source) && isEnabled(fact))
- {
- return TRUE;
- }
- }
- return FALSE;
-}
-
DecoderFactory *Decoder::findByPath(const QString& source)
{
checkFactories();
@@ -160,7 +144,6 @@ DecoderFactory *Decoder::findByMime(const QString& type)
}
}
}
- qDebug("Decoder: unable to find factory by mime");
return 0;
}
@@ -174,22 +157,17 @@ DecoderFactory *Decoder::findByContent(QIODevice *input)
return fact;
}
}
- qDebug("Decoder: unable to find factory by content");
return 0;
}
-DecoderFactory *Decoder::findByURL(const QUrl &url)
+DecoderFactory *Decoder::findByProtocol(const QString &p)
{
checkFactories();
foreach(DecoderFactory *fact, *m_factories)
{
- if (fact->supports(url.path()) && isEnabled(fact) &&
- fact->properties().protocols.split(" ").contains(url.scheme()))
- {
+ if (isEnabled(fact) && fact->properties().protocols.split(" ").contains(p))
return fact;
- }
}
- qDebug("Decoder: unable to find factory by url");
return 0;
}
diff --git a/src/qmmp/decoder.h b/src/qmmp/decoder.h
index 485d86479..af4c2d81b 100644
--- a/src/qmmp/decoder.h
+++ b/src/qmmp/decoder.h
@@ -65,11 +65,6 @@ public:
const AudioParameters audioParameters();
QIODevice *input();
-
- /*!
- * Returns \b true if \b file is supported by input plugins, otherwise returns \b false
- */
- static bool supports(const QString &file);
/*!
* Returns DecoderFactory pointer which supports file \b path or 0 if file \b path is unsupported
*/
@@ -84,9 +79,9 @@ public:
*/
static DecoderFactory *findByContent(QIODevice *input);
/*!
- * Returns DecoderFactory pointer which supports \b url or \b 0 if \b url is not supported.
+ * Returns DecoderFactory pointer which supports protocol \b p or \b 0 if \b url is not supported.
*/
- static DecoderFactory *findByURL(const QUrl &url);
+ static DecoderFactory *findByProtocol(const QString &p);
/*!
* Returns a list of decoder factories.
*/
diff --git a/src/qmmp/metadatamanager.cpp b/src/qmmp/metadatamanager.cpp
index 756fb8b02..9fed9a193 100644
--- a/src/qmmp/metadatamanager.cpp
+++ b/src/qmmp/metadatamanager.cpp
@@ -18,6 +18,7 @@
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
+#include <QFile>
#include "decoder.h"
#include "decoderfactory.h"
#include "abstractengine.h"
@@ -41,7 +42,7 @@ MetaDataManager::~MetaDataManager()
m_instance = 0;
}
-QList <FileInfo *> MetaDataManager::createPlayList(const QString &fileName, bool useMetaData)
+QList <FileInfo *> MetaDataManager::createPlayList(const QString &fileName, bool useMetaData) const
{
QList <FileInfo *> list;
DecoderFactory *fact = 0;
@@ -55,22 +56,28 @@ QList <FileInfo *> MetaDataManager::createPlayList(const QString &fileName, bool
return efact->createPlayList(fileName, useMetaData);
return list;
}
- else
+ else if(protocols().contains(fileName.section("://",0,0)))
+ list << new FileInfo(fileName);
+ return list;
+}
+
+MetaDataModel* MetaDataManager::createMetaDataModel(const QString &path, QObject *parent) const
+{
+ DecoderFactory *fact = 0;
+ EngineFactory *efact = 0;
+ if (!path.contains("://")) //local file
{
- QString p = fileName.section("://",0,0);
- QStringList protocols;
- foreach(InputSourceFactory *f, *m_inputSourceFactories)
- {
- protocols << f->properties().protocols.split(" ", QString::SkipEmptyParts);
- }
- if(protocols.contains(p))
- list << new FileInfo(fileName);
+ if((fact = Decoder::findByPath(path)))
+ return fact->createMetaDataModel(path, parent);
+ else if((efact = AbstractEngine::findByPath(path)))
+ return efact->createMetaDataModel(path, parent);
+ return 0;
}
-
- return list;
+ return 0;
}
-QStringList MetaDataManager::filters()
+
+const QStringList MetaDataManager::filters() const
{
QStringList filters;
foreach(DecoderFactory *fact, *m_decoderFactories)
@@ -86,7 +93,7 @@ QStringList MetaDataManager::filters()
return filters;
}
-QStringList MetaDataManager::nameFilters()
+const QStringList MetaDataManager::nameFilters() const
{
QStringList filters;
foreach(DecoderFactory *fact, *m_decoderFactories)
@@ -102,6 +109,38 @@ QStringList MetaDataManager::nameFilters()
return filters;
}
+const QStringList MetaDataManager::protocols() const
+{
+ QStringList p;
+ foreach(InputSourceFactory *f, *m_inputSourceFactories)
+ {
+ p << f->properties().protocols.split(" ", QString::SkipEmptyParts);
+ }
+ foreach(DecoderFactory *f, *m_decoderFactories)
+ {
+ if (Decoder::isEnabled(f))
+ p << f->properties().protocols.split(" ", QString::SkipEmptyParts);
+ }
+ return p;
+}
+
+bool MetaDataManager::supports(const QString &fileName) const
+{
+ DecoderFactory *fact = 0;
+ EngineFactory *efact = 0;
+ if (!fileName.contains("://")) //local file
+ {
+ if (!QFile::exists(fileName))
+ return FALSE;
+ if((fact = Decoder::findByPath(fileName)))
+ return TRUE;
+ else if((efact = AbstractEngine::findByPath(fileName)))
+ return TRUE;
+ return FALSE;
+ }
+ return FALSE;
+}
+
MetaDataManager *MetaDataManager::instance()
{
if(!m_instance)
diff --git a/src/qmmp/metadatamanager.h b/src/qmmp/metadatamanager.h
index 826b71b52..ee0be9912 100644
--- a/src/qmmp/metadatamanager.h
+++ b/src/qmmp/metadatamanager.h
@@ -24,6 +24,7 @@
#include <QList>
#include <QStringList>
#include "fileinfo.h"
+#include "metadatamodel.h"
class DecoderFactory;
class EngineFactory;
@@ -42,15 +43,30 @@ public:
* @param path Source file path.
* @param useMetaData Metadata usage (\b true - use, \b - do not use)
*/
- QList <FileInfo *> createPlayList(const QString &path, bool useMetaData = TRUE);
+ QList <FileInfo *> createPlayList(const QString &path, bool useMetaData = TRUE) const;
+ /*!
+ * Creats metadata object, which provides full access to file tags.
+ * @param path File path.
+ * @param parent Parent object.
+ * @return MetaDataModel pointer or null pointer.
+ */
+ MetaDataModel* createMetaDataModel(const QString &path, QObject *parent = 0) const;
/*!
* Returns a list of file name filters with description, i.e. "MPEG Files (*.mp3 *.mpg)"
*/
- QStringList filters();
+ const QStringList filters() const;
/*!
* Returns a list of file name filters, i.e. "*.mp3 *.mpg"
*/
- QStringList nameFilters();
+ const QStringList nameFilters() const;
+ /*!
+ * Returns a list of the suported protocols
+ */
+ const QStringList protocols() const;
+ /*!
+ * Returns \b true if \b file is supported and exists, otherwise returns \b false
+ */
+ bool supports(const QString &file) const;
/*!
* Returns a pointer to the MetaDataManager instance.
*/
diff --git a/src/qmmp/qmmpaudioengine.cpp b/src/qmmp/qmmpaudioengine.cpp
index 36debe448..0bbb639fe 100644
--- a/src/qmmp/qmmpaudioengine.cpp
+++ b/src/qmmp/qmmpaudioengine.cpp
@@ -100,17 +100,21 @@ bool QmmpAudioEngine::enqueue(InputSource *source)
}
mutex()->unlock();
- DecoderFactory *factory = Decoder::findByURL(source->url());
+ DecoderFactory *factory = 0;
- if(!factory && !source->url().contains("://"))
+ if(!source->url().contains("://"))
factory = Decoder::findByPath(source->url());
if(!factory && source->ioDevice())
factory = Decoder::findByContent(source->ioDevice());
+ //TODO mimetype
+ if(!factory && source->url().contains("://"))
+ factory = Decoder::findByProtocol(source->url().section("://",0,0));
if(!factory)
{
qWarning("QmmpAudioEngine: unsupported file format");
return FALSE;
}
+ qDebug("QmmpAudioEngine: selected decoder: %s",qPrintable(factory->properties().shortName));
if(factory->properties().noInput && source->ioDevice())
source->ioDevice()->close();
Decoder *decoder = factory->create(source->url(), source->ioDevice());
diff --git a/src/qmmpui/detailsdialog.cpp b/src/qmmpui/detailsdialog.cpp
index 6b5aa7032..d7fdb97e2 100644
--- a/src/qmmpui/detailsdialog.cpp
+++ b/src/qmmpui/detailsdialog.cpp
@@ -24,11 +24,8 @@
#include <QFileInfo>
#include <qmmp/metadatamanager.h>
-#include <qmmp/decoder.h>
-#include <qmmp/decoderfactory.h>
#include <qmmp/metadatamodel.h>
#include <qmmp/tagmodel.h>
-#include <qmmp/abstractengine.h>
#include "abstractplaylistitem.h"
#include "tageditor.h"
#include "detailsdialog.h"
@@ -48,15 +45,7 @@ DetailsDialog::DetailsDialog(AbstractPlaylistItem *item, QWidget *parent)
if(QFile::exists(item->url()))
{
- //TODO implement this inside MetaDataManager
- DecoderFactory *fact = Decoder::findByPath(item->url());
- EngineFactory *fact2 = AbstractEngine::findByPath(item->url());
- if(fact)
- m_metaDataModel = fact->createMetaDataModel(item->url(), this);
- else if (fact2)
- m_metaDataModel = fact2->createMetaDataModel(item->url(), this);
- else
- return;
+ m_metaDataModel = MetaDataManager::instance()->createMetaDataModel(item->url(), this);
if(!m_metaDataModel)
return;
diff --git a/src/qmmpui/mediaplayer.cpp b/src/qmmpui/mediaplayer.cpp
index 0170fc650..0d47dd257 100644
--- a/src/qmmpui/mediaplayer.cpp
+++ b/src/qmmpui/mediaplayer.cpp
@@ -204,7 +204,7 @@ void MediaPlayer::updateNextUrl()
{
m_core->play(m_model->nextItem()->url(), TRUE);
m_nextUrl = m_model->nextItem()->url();
- qDebug("next url");
+ qDebug("MediaPlayer: sending next url");
}
else
m_nextUrl.clear();
diff --git a/src/qmmpui/playlistmodel.cpp b/src/qmmpui/playlistmodel.cpp
index cdc407174..909f0399d 100644
--- a/src/qmmpui/playlistmodel.cpp
+++ b/src/qmmpui/playlistmodel.cpp
@@ -27,14 +27,10 @@
#include <QApplication>
#include <QTimer>
#include <QSettings>
-#include <QMessageBox>
#include <QBuffer>
-
+#include <QMetaType>
#include <time.h>
-
#include <qmmp/metadatamanager.h>
-#include <qmmp/decoderfactory.h>
-
#include "playlistparser.h"
#include "playlistformat.h"
#include "fileloader.h"
@@ -44,8 +40,6 @@
#include "detailsdialog.h"
#include "playlistsettings.h"
-#include <QMetaType>
-
#define INVALID_ROW -1
TagUpdater::TagUpdater(QObject* o,PlayListItem* item):m_observable(o),m_item(item)
@@ -997,8 +991,12 @@ void PlayListModel::clearInvalidItems()
{
foreach(PlayListItem *item, m_items)
{
- if(!item->url().contains("://") &&
- !(QFile::exists(item->url())))// && Decoder::supports(item->url())))
+ bool ok = FALSE;
+ if(!item->url().contains("://"))
+ ok = MetaDataManager::instance()->supports(item->url());
+ else
+ ok = MetaDataManager::instance()->protocols().contains(item->url().section("://",0,0));
+ if(!ok)
removeItem(item);
}
}