diff options
| -rw-r--r-- | src/qmmp/decoder.cpp | 26 | ||||
| -rw-r--r-- | src/qmmp/decoder.h | 9 | ||||
| -rw-r--r-- | src/qmmp/metadatamanager.cpp | 67 | ||||
| -rw-r--r-- | src/qmmp/metadatamanager.h | 22 | ||||
| -rw-r--r-- | src/qmmp/qmmpaudioengine.cpp | 8 | ||||
| -rw-r--r-- | src/qmmpui/detailsdialog.cpp | 13 | ||||
| -rw-r--r-- | src/qmmpui/mediaplayer.cpp | 2 | ||||
| -rw-r--r-- | src/qmmpui/playlistmodel.cpp | 16 |
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); } } |
