aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/CommandLineOptions/StatusOption/statusoption.cpp4
-rw-r--r--src/plugins/Effect/filewriter/filewriterplugin.cpp16
-rw-r--r--src/plugins/Effect/filewriter/filewriterplugin.h2
-rw-r--r--src/plugins/General/statusicon/statusicon.cpp20
-rw-r--r--src/plugins/General/statusicon/statusiconpopupwidget.cpp2
-rw-r--r--src/plugins/Output/shout/shoutoutput.cpp2
-rw-r--r--src/plugins/Output/shout/shoutoutput.h2
-rw-r--r--src/plugins/Transports/http/httpstreamreader.cpp2
-rw-r--r--src/plugins/Transports/mms/mmsstreamreader.cpp4
-rw-r--r--src/plugins/Ui/qsui/mainwindow.cpp2
-rw-r--r--src/plugins/Ui/skinned/mainwindow.cpp2
-rw-r--r--src/plugins/Ui/skinned/textscroller.cpp2
-rw-r--r--src/qmmp/buffer.h4
-rw-r--r--src/qmmp/output.cpp4
-rw-r--r--src/qmmp/output.h9
-rw-r--r--src/qmmp/outputwriter.cpp4
-rw-r--r--src/qmmp/qmmp.h3
-rw-r--r--src/qmmp/qmmpaudioengine.cpp29
-rw-r--r--src/qmmp/qmmpaudioengine_p.h3
-rw-r--r--src/qmmp/qmmpevents_p.h2
-rw-r--r--src/qmmp/statehandler.cpp36
-rw-r--r--src/qmmp/statehandler.h3
-rw-r--r--src/qmmp/trackinfo.cpp6
-rw-r--r--src/qmmpui/detailsdialog.cpp4
-rw-r--r--src/qmmpui/mediaplayer.cpp2
-rw-r--r--src/qmmpui/metadataformatter.cpp53
-rw-r--r--src/qmmpui/metadataformatter.h11
-rw-r--r--src/qmmpui/playlistparser.cpp16
-rw-r--r--src/qmmpui/playlisttask.cpp28
-rw-r--r--src/qmmpui/playlisttrack.cpp10
30 files changed, 168 insertions, 119 deletions
diff --git a/src/plugins/CommandLineOptions/StatusOption/statusoption.cpp b/src/plugins/CommandLineOptions/StatusOption/statusoption.cpp
index ecb0f8b37..79d2b64bd 100644
--- a/src/plugins/CommandLineOptions/StatusOption/statusoption.cpp
+++ b/src/plugins/CommandLineOptions/StatusOption/statusoption.cpp
@@ -71,7 +71,7 @@ QString StatusOption::executeCommand(const QString &opt_str, const QStringList &
out += "TRACK = %n\n";
out += "FILE = %f";
MetaDataFormatter formatter(out);
- out = formatter.format(core->metaData(), core->duration());
+ out = formatter.format(&core->trackInfo());
}
out += "\n";
}
@@ -79,7 +79,7 @@ QString StatusOption::executeCommand(const QString &opt_str, const QStringList &
{
QString t = args.join(" ");
MetaDataFormatter formatter(t);
- out = formatter.format(core->metaData(), core->duration());
+ out = formatter.format(&core->trackInfo());
out += "\n";
}
else if(opt_str == "--nowplaying-syntax")
diff --git a/src/plugins/Effect/filewriter/filewriterplugin.cpp b/src/plugins/Effect/filewriter/filewriterplugin.cpp
index f7646d0a4..ecc0d1ba7 100644
--- a/src/plugins/Effect/filewriter/filewriterplugin.cpp
+++ b/src/plugins/Effect/filewriter/filewriterplugin.cpp
@@ -40,13 +40,13 @@ void FileWriterPlugin::configure(quint32 srate, ChannelMap map)
{
Effect::configure(srate, map);
if(SoundCore::instance()->state() == Qmmp::Playing || SoundCore::instance()->state() == Qmmp::Paused)
- init(SoundCore::instance()->metaData());
+ init(SoundCore::instance()->trackInfo());
}
void FileWriterPlugin::applyEffect(Buffer *b)
{
- if(!b->metaData.isNull())
- init(*b->metaData);
+ if(!b->trackInfo.isNull())
+ init(*b->trackInfo);
if(!m_inited || !b->samples)
return;
@@ -110,7 +110,7 @@ void FileWriterPlugin::applyEffect(Buffer *b)
}
}
-void FileWriterPlugin::init(const QMap<Qmmp::MetaData, QString> &metaData)
+void FileWriterPlugin::init(const TrackInfo &info)
{
deinit();
@@ -120,10 +120,10 @@ void FileWriterPlugin::init(const QMap<Qmmp::MetaData, QString> &metaData)
outDir = settings.value("FileWriter/out_dir", outDir).toString();
QString fileName = settings.value("FileWriter/file_name", "%p%if(%p&%t, - ,)%t").toString();
if(fileName.isEmpty())
- fileName = metaData[Qmmp::URL].section("/", 1);
+ fileName = info.path().section("/", 1);
MetaDataFormatter formatter(fileName);
- fileName = formatter.format(metaData, SoundCore::instance()->duration());
+ fileName = formatter.format(&info);
if(!fileName.endsWith(".ogg", Qt::CaseInsensitive))
fileName.append(".ogg");
@@ -173,8 +173,8 @@ void FileWriterPlugin::init(const QMap<Qmmp::MetaData, QString> &metaData)
int i = 0;
while(tag_map[i].key != Qmmp::UNKNOWN)
{
- if(!metaData[tag_map[i].key].isEmpty())
- vorbis_comment_add_tag(&m_vc, tag_map[i].tag, metaData.value(tag_map[i].key).toUtf8().constData());
+ if(!info.value(tag_map[i].key).isEmpty())
+ vorbis_comment_add_tag(&m_vc, tag_map[i].tag, info.value(tag_map[i].key).toUtf8().constData());
i++;
}
diff --git a/src/plugins/Effect/filewriter/filewriterplugin.h b/src/plugins/Effect/filewriter/filewriterplugin.h
index ebf0c6f39..1ec1174bd 100644
--- a/src/plugins/Effect/filewriter/filewriterplugin.h
+++ b/src/plugins/Effect/filewriter/filewriterplugin.h
@@ -37,7 +37,7 @@ public:
void applyEffect(Buffer *b);
private:
- void init(const QMap<Qmmp::MetaData, QString> &metaData);
+ void init(const TrackInfo &info);
void deinit();
void sendHeader();
diff --git a/src/plugins/General/statusicon/statusicon.cpp b/src/plugins/General/statusicon/statusicon.cpp
index 86a260324..a4b96b7d3 100644
--- a/src/plugins/General/statusicon/statusicon.cpp
+++ b/src/plugins/General/statusicon/statusicon.cpp
@@ -124,21 +124,21 @@ void StatusIcon::setState(Qmmp::State state)
void StatusIcon::showMetaData()
{
- QMap<Qmmp::MetaData, QString> meta = m_core->metaData();
- if(m_splitFileName && meta[Qmmp::TITLE].isEmpty() && !meta[Qmmp::URL].contains("://"))
+ TrackInfo info = m_core->trackInfo();
+ if(m_splitFileName && info.value(Qmmp::TITLE).isEmpty() && !info.path().contains("://"))
{
- QString name = QFileInfo(meta[Qmmp::URL]).completeBaseName();
+ QString name = QFileInfo(info.path()).completeBaseName();
if(name.contains("-"))
{
- meta[Qmmp::TITLE] = name.section('-',1,1).trimmed();
- if(meta[Qmmp::ARTIST].isEmpty())
- meta[Qmmp::ARTIST] = name.section('-',0,0).trimmed();
+ info.setValue(Qmmp::TITLE, name.section('-',1,1).trimmed());
+ if(info.value(Qmmp::ARTIST).isEmpty())
+ info.setValue(Qmmp::ARTIST, name.section('-',0,0).trimmed());
}
}
- QString message = m_messageFormatter.format(meta, m_core->duration());
+ QString message = m_messageFormatter.format(&info);
if (message.isEmpty())
- message = meta[Qmmp::URL].section('/',-1);
+ message = info.path().section('/',-1);
if (m_showMessage)
m_tray->showMessage (tr("Now Playing"), message,
@@ -146,9 +146,9 @@ void StatusIcon::showMetaData()
if(m_showToolTip)
{
- message = m_toolTipFormatter.format(meta, m_core->duration());
+ message = m_toolTipFormatter.format(&info);
if(message.isEmpty())
- message = meta[Qmmp::URL].section('/',-1);
+ message = info.path().section('/',-1);
m_tray->setToolTip(message);
}
}
diff --git a/src/plugins/General/statusicon/statusiconpopupwidget.cpp b/src/plugins/General/statusicon/statusiconpopupwidget.cpp
index e219d4122..e74492fb0 100644
--- a/src/plugins/General/statusicon/statusiconpopupwidget.cpp
+++ b/src/plugins/General/statusicon/statusiconpopupwidget.cpp
@@ -100,7 +100,7 @@ void StatusIconPopupWidget::updateMetaData(const QString &message)
m_textLabel->setText(message);
if(core->state() == Qmmp::Playing || core->state() == Qmmp::Paused)
{
- QPixmap cover = MetaDataManager::instance()->getCover(core->metaData(Qmmp::URL));
+ QPixmap cover = MetaDataManager::instance()->getCover(core->trackInfo().path());
m_cover->show();
m_bar->show();
if(cover.isNull())
diff --git a/src/plugins/Output/shout/shoutoutput.cpp b/src/plugins/Output/shout/shoutoutput.cpp
index 15bafb570..6be627357 100644
--- a/src/plugins/Output/shout/shoutoutput.cpp
+++ b/src/plugins/Output/shout/shoutoutput.cpp
@@ -196,7 +196,7 @@ void ShoutOutput::drain()
void ShoutOutput::reset()
{}
-void ShoutOutput::setMetaData(const QMap<Qmmp::MetaData, QString> &metaData)
+void ShoutOutput::setTrackInfo(const QMap<Qmmp::MetaData, QString> &metaData)
{
vorbis_comment_clear(&m_vc);
diff --git a/src/plugins/Output/shout/shoutoutput.h b/src/plugins/Output/shout/shoutoutput.h
index 71ff2dea0..5c0bc6d2c 100644
--- a/src/plugins/Output/shout/shoutoutput.h
+++ b/src/plugins/Output/shout/shoutoutput.h
@@ -37,7 +37,7 @@ public:
qint64 writeAudio(unsigned char *data, qint64 maxSize);
void drain();
void reset();
- void setMetaData(const QMap<Qmmp::MetaData, QString> &metaData);
+ void setTrackInfo(const QMap<Qmmp::MetaData, QString> &metaData);
private:
void sendHeader();
diff --git a/src/plugins/Transports/http/httpstreamreader.cpp b/src/plugins/Transports/http/httpstreamreader.cpp
index be051a89b..25fa2729b 100644
--- a/src/plugins/Transports/http/httpstreamreader.cpp
+++ b/src/plugins/Transports/http/httpstreamreader.cpp
@@ -390,7 +390,6 @@ void HttpStreamReader::checkBuffer()
{
metaData.insert(Qmmp::TITLE, m_stream.header.value("icy-name"));
metaData.insert(Qmmp::GENRE, m_stream.header.value("icy-genre"));
- metaData.insert(Qmmp::URL, m_url);
m_parent->addMetaData(metaData);
}
sendStreamInfo(m_codec);
@@ -480,7 +479,6 @@ void HttpStreamReader::parseICYMetaData(char *data, qint64 size)
else
metaData.insert(Qmmp::TITLE, codec->toUnicode(m_stream.header.value("icy-name")));
metaData.insert(Qmmp::GENRE, codec->toUnicode(m_stream.header.value("icy-genre")));
- metaData.insert(Qmmp::URL, m_url);
m_parent->addMetaData(metaData);
sendStreamInfo(codec);
m_meta_sent = true;
diff --git a/src/plugins/Transports/mms/mmsstreamreader.cpp b/src/plugins/Transports/mms/mmsstreamreader.cpp
index 503879654..73bb1bdbb 100644
--- a/src/plugins/Transports/mms/mmsstreamreader.cpp
+++ b/src/plugins/Transports/mms/mmsstreamreader.cpp
@@ -199,9 +199,9 @@ void MMSStreamReader::checkBuffer()
{
m_ready = true;
qDebug("MMSStreamReader: ready");
- QMap<Qmmp::MetaData, QString> metaData;
+ /*QMap<Qmmp::MetaData, QString> metaData;
metaData.insert(Qmmp::URL, m_url);
- m_parent->addMetaData(metaData);
+ m_parent->addMetaData(metaData);*/
emit ready();
}
else if (!m_ready)
diff --git a/src/plugins/Ui/qsui/mainwindow.cpp b/src/plugins/Ui/qsui/mainwindow.cpp
index f872c7186..7fb0db61b 100644
--- a/src/plugins/Ui/qsui/mainwindow.cpp
+++ b/src/plugins/Ui/qsui/mainwindow.cpp
@@ -894,7 +894,7 @@ void MainWindow::showMetaData()
{
PlayListModel *model = m_pl_manager->currentPlayList();
PlayListTrack *track = model->currentTrack();
- if(track && track->path() == m_core->metaData().value(Qmmp::URL))
+ if(track && track->path() == m_core->trackInfo().path())
{
setWindowTitle(m_titleFormatter.format(track));
}
diff --git a/src/plugins/Ui/skinned/mainwindow.cpp b/src/plugins/Ui/skinned/mainwindow.cpp
index 388f1d71c..8229f8a53 100644
--- a/src/plugins/Ui/skinned/mainwindow.cpp
+++ b/src/plugins/Ui/skinned/mainwindow.cpp
@@ -203,7 +203,7 @@ void MainWindow::showState(Qmmp::State state)
void MainWindow::showMetaData()
{
PlayListTrack *track = m_pl_manager->currentPlayList()->currentTrack();
- if (track && track->path() == m_core->metaData().value(Qmmp::URL))
+ if (track && track->path() == m_core->trackInfo().path())
{
setWindowTitle(m_titleFormatter.format(track));
}
diff --git a/src/plugins/Ui/skinned/textscroller.cpp b/src/plugins/Ui/skinned/textscroller.cpp
index ffd69ad2e..5a22049b5 100644
--- a/src/plugins/Ui/skinned/textscroller.cpp
+++ b/src/plugins/Ui/skinned/textscroller.cpp
@@ -253,7 +253,7 @@ void TextScroller::processMetaData()
{
if(m_core->state() == Qmmp::Playing)
{
- m_titleText = m_formater.format(m_core->metaData(), m_core->duration());
+ m_titleText = m_formater.format(&m_core->trackInfo());
updateText();
}
}
diff --git a/src/qmmp/buffer.h b/src/qmmp/buffer.h
index cd49619a7..f9fe83f10 100644
--- a/src/qmmp/buffer.h
+++ b/src/qmmp/buffer.h
@@ -7,9 +7,9 @@
#ifndef __buffer_h
#define __buffer_h
-#include <QMap>
#include <QSharedPointer>
#include <stddef.h>
+#include "trackinfo.h"
#include "qmmp.h"
#define QMMP_BLOCK_FRAMES 512
@@ -47,7 +47,7 @@ public:
size_t samples; /*!< Audio data size in samples */
size_t size; /*!< Buffer size in samples */
unsigned int rate; /*!< Buffer bitrate */
- QSharedPointer<QMap<Qmmp::MetaData, QString> > metaData; /*!< A pointer to the new metadata if available */
+ QSharedPointer<TrackInfo> trackInfo;
};
diff --git a/src/qmmp/output.cpp b/src/qmmp/output.cpp
index 4bbb59dcd..faddeb2fb 100644
--- a/src/qmmp/output.cpp
+++ b/src/qmmp/output.cpp
@@ -65,9 +65,9 @@ void Output::suspend()
void Output::resume()
{}
-void Output::setMetaData(const QMap<Qmmp::MetaData, QString> &metaData)
+void Output::setTrackInfo(const TrackInfo &info)
{
- Q_UNUSED(metaData);
+ Q_UNUSED(info);
}
Output::~Output()
diff --git a/src/qmmp/output.h b/src/qmmp/output.h
index 880f256fa..8ab26b235 100644
--- a/src/qmmp/output.h
+++ b/src/qmmp/output.h
@@ -13,6 +13,7 @@
#include <QMap>
#include "outputfactory.h"
#include "audioparameters.h"
+#include "trackinfo.h"
#include "channelmap.h"
class QTimer;
@@ -75,12 +76,8 @@ public:
* Resumes processing audio data.
*/
virtual void resume();
- /*!
- * Sets metadata for output.
- * Default implementation does nothing.
- * Reimplement this function to receive metadata.
- */
- virtual void setMetaData(const QMap<Qmmp::MetaData, QString> &metaData);
+
+ virtual void setTrackInfo(const TrackInfo &info);
/*!
* Returns selected audio parameters.
*/
diff --git a/src/qmmp/outputwriter.cpp b/src/qmmp/outputwriter.cpp
index 373b065c6..ce3cd2036 100644
--- a/src/qmmp/outputwriter.cpp
+++ b/src/qmmp/outputwriter.cpp
@@ -315,8 +315,8 @@ void OutputWriter::run()
{
if(b->rate)
m_kbps = b->rate;
- if(b->metaData)
- m_output->setMetaData(*b->metaData);
+ if(b->trackInfo)
+ m_output->setTrackInfo(*b->trackInfo);
}
}
diff --git a/src/qmmp/qmmp.h b/src/qmmp/qmmp.h
index 34c09b905..f61856848 100644
--- a/src/qmmp/qmmp.h
+++ b/src/qmmp/qmmp.h
@@ -73,8 +73,7 @@ public:
COMPOSER, /*!< Composer */
YEAR, /*!< Year */
TRACK, /*!< Track number */
- DISCNUMBER,/*!< Disc number */
- URL /*!< Stream url or local file path */
+ DISCNUMBER /*!< Disc number */
};
/*!
* Track properties
diff --git a/src/qmmp/qmmpaudioengine.cpp b/src/qmmp/qmmpaudioengine.cpp
index 455771648..3cf6b5b18 100644
--- a/src/qmmp/qmmpaudioengine.cpp
+++ b/src/qmmp/qmmpaudioengine.cpp
@@ -283,8 +283,8 @@ void QmmpAudioEngine::stop()
qint64 QmmpAudioEngine::produceSound(unsigned char *data, qint64 size, quint32 brate)
{
Buffer *b = m_output->recycler()->get();
- b->metaData = m_metaData;
- m_metaData.clear();
+ b->trackInfo = m_trackInfo;
+ m_trackInfo.clear();
size_t sz = size < m_bks ? size : m_bks;
size_t samples = sz / m_sample_size;
@@ -345,7 +345,7 @@ void QmmpAudioEngine::run()
{
mutex()->lock ();
m_next = false;
- m_metaData.clear();
+ m_trackInfo.clear();
qint64 len = 0;
int delay = 0;
if(m_decoders.isEmpty())
@@ -380,16 +380,19 @@ void QmmpAudioEngine::run()
if(m_decoder->hasMetaData())
{
QMap<Qmmp::MetaData, QString> m = m_decoder->takeMetaData();
- m[Qmmp::URL] = m_inputs[m_decoder]->url();
- StateHandler::instance()->dispatch(m);
- m_metaData = QSharedPointer<QMap<Qmmp::MetaData, QString> >(new QMap<Qmmp::MetaData, QString>(m));
+ TrackInfo info(m_inputs[m_decoder]->url());
+ info.setValues(m);
+ StateHandler::instance()->dispatch(info);
+ m_trackInfo = QSharedPointer<TrackInfo>(new TrackInfo(info));
+
}
if(m_inputs[m_decoder]->hasMetaData())
{
QMap<Qmmp::MetaData, QString> m = m_inputs[m_decoder]->takeMetaData();
- m[Qmmp::URL] = m_inputs[m_decoder]->url();
- StateHandler::instance()->dispatch(m);
- m_metaData = QSharedPointer<QMap<Qmmp::MetaData, QString> >(new QMap<Qmmp::MetaData, QString>(m));
+ TrackInfo info(m_inputs[m_decoder]->url());
+ info.setValues(m);
+ StateHandler::instance()->dispatch(info);
+ m_trackInfo = QSharedPointer<TrackInfo>(new TrackInfo(info));
}
if(m_inputs[m_decoder]->hasStreamInfo())
StateHandler::instance()->dispatch(m_inputs[m_decoder]->takeStreamInfo());
@@ -599,10 +602,10 @@ void QmmpAudioEngine::sendMetaData()
QList <TrackInfo *> list = MetaDataManager::instance()->createPlayList(url, TrackInfo::MetaData);
if (!list.isEmpty())
{
- StateHandler::instance()->dispatch(list[0]->metaData());
- m_metaData = QSharedPointer<QMap<Qmmp::MetaData, QString> >(new QMap<Qmmp::MetaData, QString>(list[0]->metaData()));
- while (!list.isEmpty())
- delete list.takeFirst();
+ StateHandler::instance()->dispatch(*list.first());
+ m_trackInfo = QSharedPointer<TrackInfo>(list.first());
+ while(list.size() > 1)
+ delete list.takeLast();
}
}
}
diff --git a/src/qmmp/qmmpaudioengine_p.h b/src/qmmp/qmmpaudioengine_p.h
index 5efa831ab..a8eea6590 100644
--- a/src/qmmp/qmmpaudioengine_p.h
+++ b/src/qmmp/qmmpaudioengine_p.h
@@ -26,6 +26,7 @@
#include <atomic>
#include <QSharedPointer>
#include "abstractengine.h"
+#include "trackinfo.h"
#include "audioparameters.h"
class QIODevice;
@@ -96,7 +97,7 @@ private:
AudioParameters m_ap;
bool m_next;
bool m_muted;
- QSharedPointer<QMap<Qmmp::MetaData, QString> > m_metaData;
+ QSharedPointer<TrackInfo> m_trackInfo;
static QmmpAudioEngine *m_instance;
ReplayGain *m_replayGain;
QmmpSettings *m_settings;
diff --git a/src/qmmp/qmmpevents_p.h b/src/qmmp/qmmpevents_p.h
index 8fd316f70..63cbb0f40 100644
--- a/src/qmmp/qmmpevents_p.h
+++ b/src/qmmp/qmmpevents_p.h
@@ -90,7 +90,7 @@ private:
QHash<QString, QString> m_streamInfo;
};
-class TrackInfoEvent : QEvent
+class TrackInfoEvent : public QEvent
{
public:
TrackInfoEvent(const TrackInfo &info);
diff --git a/src/qmmp/statehandler.cpp b/src/qmmp/statehandler.cpp
index 716af2528..3a5fde734 100644
--- a/src/qmmp/statehandler.cpp
+++ b/src/qmmp/statehandler.cpp
@@ -92,7 +92,39 @@ void StateHandler::dispatch(qint64 length)
m_mutex.unlock();
}
-void StateHandler::dispatch(const QMap<Qmmp::MetaData, QString> &metaData)
+void StateHandler::dispatch(const TrackInfo &info)
+{
+ QMutexLocker locker(&m_mutex);
+ if(info.isEmpty())
+ {
+ qWarning("StateHandler: empty metadata");
+ return;
+ }
+ if(m_state != Qmmp::Playing && m_state != Qmmp::Paused)
+ {
+ qWarning("StateHandler: metadata is ignored");
+ return;
+ }
+
+ if(m_info.isEmpty() || m_info.path() == info.path())
+ {
+ TrackInfo tmp = m_info;
+ if(info.parts() & TrackInfo::MetaData)
+ tmp.setValues(info.metaData());
+ if(info.parts() & TrackInfo::Properties)
+ tmp.setValues(info.properties());
+ if(info.parts() & TrackInfo::ReplayGainInfo)
+ tmp.setValues(info.replayGainInfo());
+
+ if(m_info != tmp)
+ {
+ m_info = tmp;
+ qApp->postEvent(parent(), new TrackInfoEvent(m_info));
+ }
+ }
+}
+
+/*void StateHandler::dispatch(const QMap<Qmmp::MetaData, QString> &metaData)
{
m_mutex.lock();
QMap<Qmmp::MetaData, QString> tmp = metaData;
@@ -132,7 +164,7 @@ void StateHandler::dispatch(const QMap<Qmmp::MetaData, QString> &metaData)
}
m_mutex.unlock();
-}
+}*/
void StateHandler::dispatch(const QHash<QString, QString> &info)
{
diff --git a/src/qmmp/statehandler.h b/src/qmmp/statehandler.h
index a98be51f7..d41738134 100644
--- a/src/qmmp/statehandler.h
+++ b/src/qmmp/statehandler.h
@@ -63,7 +63,8 @@ public:
/*!
* Sends metadata \b metaData
*/
- void dispatch(const QMap<Qmmp::MetaData, QString> &metaData);
+ //void dispatch(const QMap<Qmmp::MetaData, QString> &metaData);
+ void dispatch(const TrackInfo &info);
/*!
* Sends stream information \b info
*/
diff --git a/src/qmmp/trackinfo.cpp b/src/qmmp/trackinfo.cpp
index 6183649dc..ed067077d 100644
--- a/src/qmmp/trackinfo.cpp
+++ b/src/qmmp/trackinfo.cpp
@@ -32,7 +32,6 @@ TrackInfo::TrackInfo(const QString &path)
m_path = path;
m_duration = 0;
m_parts = NoParts;
- m_metaData.insert(Qmmp::URL, path);
}
TrackInfo::TrackInfo(const TrackInfo &other)
@@ -56,7 +55,9 @@ TrackInfo &TrackInfo::operator=(const TrackInfo &info)
bool TrackInfo::operator==(const TrackInfo &info) const
{
- return m_metaData == info.metaData () &&
+ return m_duration == info.duration() &&
+ m_path == info.path() &&
+ m_metaData == info.metaData () &&
m_properties == info.properties() &&
m_replayGainInfo == info.replayGainInfo() &&
m_parts == info.parts();
@@ -201,7 +202,6 @@ void TrackInfo::updateValues(const QMap<Qmmp::ReplayGainKey, double> &replayGain
void TrackInfo::setPath(const QString &path)
{
m_path = path;
- m_metaData.insert(Qmmp::URL, path);
}
void TrackInfo::setParts(Parts parts)
diff --git a/src/qmmpui/detailsdialog.cpp b/src/qmmpui/detailsdialog.cpp
index 6d6676765..e87b44693 100644
--- a/src/qmmpui/detailsdialog.cpp
+++ b/src/qmmpui/detailsdialog.cpp
@@ -197,7 +197,7 @@ void DetailsDialog::printInfo()
if(m_metaData[Qmmp::DISCNUMBER] != "0")
formattedText += formatRow(tr("Disc number"), m_metaData[Qmmp::DISCNUMBER]);
//stream information
- if(core->state() == Qmmp::Playing && core->url() == m_metaData.value(Qmmp::URL))
+ /*if(core->state() == Qmmp::Playing && core->url() == m_metaData.value(Qmmp::URL))
{
if(!core->streamInfo().isEmpty())
{
@@ -210,7 +210,7 @@ void DetailsDialog::printInfo()
foreach(QString key, core->streamInfo().keys())
formattedText += formatRow(key, core->streamInfo().value(key));
}
- }
+ }*/
//audio info
if(!m_metaDataModel)
{
diff --git a/src/qmmpui/mediaplayer.cpp b/src/qmmpui/mediaplayer.cpp
index a2581e694..b4f72aa09 100644
--- a/src/qmmpui/mediaplayer.cpp
+++ b/src/qmmpui/mediaplayer.cpp
@@ -207,7 +207,7 @@ void MediaPlayer::updateMetaData()
qDebug("== end of metadata ==");
PlayListModel *pl = m_pl_manager->currentPlayList();
- if (pl->currentTrack() && pl->currentTrack()->path() == m_core->metaData().value(Qmmp::URL))
+ if (pl->currentTrack() && pl->currentTrack()->path() == m_core->trackInfo().path())
{
pl->currentTrack()->updateMetaData(m_core->metaData());
pl->updateMetaData();
diff --git a/src/qmmpui/metadataformatter.cpp b/src/qmmpui/metadataformatter.cpp
index bb019b442..2b1174cfd 100644
--- a/src/qmmpui/metadataformatter.cpp
+++ b/src/qmmpui/metadataformatter.cpp
@@ -59,7 +59,7 @@ MetaDataFormatter::MetaDataFormatter(const QString &pattern)
m_fieldNames.insert("y", Qmmp::YEAR);
m_fieldNames.insert("n", Qmmp::TRACK);
m_fieldNames.insert("D", Qmmp::DISCNUMBER);
- m_fieldNames.insert("F", Qmmp::URL);
+ m_fieldNames.insert("F", Param::PATH);
m_fieldNames.insert("NN", Param::TWO_DIGIT_TRACK);
m_fieldNames.insert("l", Param::DURATION);
m_fieldNames.insert("f", Param::FILE_NAME);
@@ -98,17 +98,17 @@ const QString MetaDataFormatter::pattern() const
QString MetaDataFormatter::format(const PlayListTrack *item) const
{
- return format(item->metaData(), item->duration(), item->trackIndex());
+ return format(item->metaData(), item->path(), item->duration(), item->trackIndex());
}
-QString MetaDataFormatter::format(const QMap<Qmmp::MetaData, QString> &metaData, qint64 duration, int track) const
+QString MetaDataFormatter::format(const QMap<Qmmp::MetaData, QString> &metaData, const QString &path, qint64 duration, int track) const
{
- return evalute(&m_nodes, &metaData, duration, track).trimmed();
+ return evalute(&m_nodes, &metaData, &path, duration, track).trimmed();
}
QString MetaDataFormatter::format(const TrackInfo *info, int track) const
{
- return format(info->metaData(), info->duration(), track);
+ return format(info->metaData(), info->path(), info->duration(), track);
}
QString MetaDataFormatter::formatDuration(qint64 duration, bool hideZero, bool showMs)
@@ -398,7 +398,8 @@ void MetaDataFormatter::parseEscape(QList<MetaDataFormatter::Node> *nodes, QStri
nodes->append(node);
}
-QString MetaDataFormatter::evalute(const QList<Node> *nodes, const QMap<Qmmp::MetaData, QString> *metaData, qint64 length, int track) const
+QString MetaDataFormatter::evalute(const QList<Node> *nodes, const QMap<Qmmp::MetaData, QString> *metaData,
+ const QString *path, qint64 length, int track) const
{
QString out;
for(int i = 0; i < nodes->count(); ++i)
@@ -407,56 +408,57 @@ QString MetaDataFormatter::evalute(const QList<Node> *nodes, const QMap<Qmmp::Me
if(node.command == Node::PRINT_TEXT)
{
Param p = node.params.first();
- out.append(printParam(&p, metaData, length, track));
+ out.append(printParam(&p, metaData, path, length, track));
}
else if(node.command == Node::IF_KEYWORD)
{
- QString var1 = printParam(&node.params[0], metaData, length, track);
+ QString var1 = printParam(&node.params[0], metaData, path, length, track);
if(var1.isEmpty() || var1 == "0")
- out.append(printParam(&node.params[2], metaData, length, track));
+ out.append(printParam(&node.params[2], metaData, path, length, track));
else
- out.append(printParam(&node.params[1], metaData, length, track));
+ out.append(printParam(&node.params[1], metaData, path, length, track));
}
else if(node.command == Node::AND_OPERATOR)
{
- QString var1 = printParam(&node.params[0], metaData, length, track);
- QString var2 = printParam(&node.params[1], metaData, length, track);
+ QString var1 = printParam(&node.params[0], metaData, path, length, track);
+ QString var2 = printParam(&node.params[1], metaData, path, length, track);
if(!var1.isEmpty() && !var2.isEmpty())
out.append("1");
}
else if(node.command == Node::OR_OPERATOR)
{
- QString var1 = printParam(&node.params[0], metaData, length, track);
+ QString var1 = printParam(&node.params[0], metaData, path, length, track);
if(!var1.isEmpty())
out.append("1");
else
{
- QString var2 = printParam(&node.params[1], metaData, length, track);
+ QString var2 = printParam(&node.params[1], metaData, path, length, track);
if(!var2.isEmpty())
out.append("1");
}
}
else if(node.command == Node::DIR_FUNCTION)
{
- out.append(metaData->value(Qmmp::URL).section('/', -node.params[0].number - 2, -node.params[0].number - 2));
+ out.append(path->section('/', -node.params[0].number - 2, -node.params[0].number - 2));
}
}
return out;
}
-QString MetaDataFormatter::printParam(MetaDataFormatter::Param *p, const QMap<Qmmp::MetaData, QString> *metaData, qint64 length, int track) const
+QString MetaDataFormatter::printParam(MetaDataFormatter::Param *p, const QMap<Qmmp::MetaData, QString> *metaData,
+ const QString *path, qint64 length, int track) const
{
switch (p->type)
{
case Param::FIELD:
- return printField(p->field, metaData, length, track);
+ return printField(p->field, metaData, path, length, track);
break;
case Param::TEXT:
return p->text;
break;
case Param::NODES:
- return evalute(&p->children, metaData, length, track);
+ return evalute(&p->children, metaData, path, length, track);
break;
default:
break;
@@ -464,26 +466,31 @@ QString MetaDataFormatter::printParam(MetaDataFormatter::Param *p, const QMap<Qm
return QString();
}
-QString MetaDataFormatter::printField(int field, const QMap<Qmmp::MetaData, QString> *metaData, qint64 length, int track) const
+QString MetaDataFormatter::printField(int field, const QMap<Qmmp::MetaData, QString> *metaData,
+ const QString *path, qint64 length, int track) const
{
- if(field >= Qmmp::TITLE && field <= Qmmp::URL)
+ if(field >= Qmmp::TITLE && field <= Qmmp::DISCNUMBER)
{
if(field == Qmmp::TITLE)
{
QString title = metaData->value(Qmmp::TITLE);
if(title.isEmpty()) //using file name if title is empty
{
- title = metaData->value(Qmmp::URL).section('/',-1);
+ title = path->section('/',-1);
title = title.left(title.lastIndexOf('.'));
}
if(title.isEmpty()) //using full path if file name is empty
- title = metaData->value(Qmmp::URL);
+ title = *path;
return title;
}
return metaData->value((Qmmp::MetaData) field);
}
+ else if(field == Param::PATH)
+ {
+ return *path;
+ }
else if(field == Param::TWO_DIGIT_TRACK)
{
return QString("%1").arg(metaData->value(Qmmp::TRACK),2,'0');
@@ -494,7 +501,7 @@ QString MetaDataFormatter::printField(int field, const QMap<Qmmp::MetaData, QStr
}
else if(field == Param::FILE_NAME)
{
- return metaData->value(Qmmp::URL).section('/',-1);
+ return path->section('/',-1);
}
else if(field == Param::TRACK_INDEX)
{
diff --git a/src/qmmpui/metadataformatter.h b/src/qmmpui/metadataformatter.h
index d0446183d..49e317be0 100644
--- a/src/qmmpui/metadataformatter.h
+++ b/src/qmmpui/metadataformatter.h
@@ -76,7 +76,7 @@ public:
* @param duration Duration in milliseconds seconds.
* @param track Index of track.
*/
- QString format(const QMap<Qmmp::MetaData, QString> &metaData, qint64 duration = 0, int track = 0) const;
+ QString format(const QMap<Qmmp::MetaData, QString> &metaData, const QString &path, qint64 duration = 0, int track = 0) const;
/*!
* Converts metadata of \b TrackInfo pointer \b info to one string using template.
* \param info pointer to \b TrackInfo object.
@@ -121,7 +121,8 @@ private:
//extra fields
enum
{
- TWO_DIGIT_TRACK = Qmmp::URL + 1,
+ PATH = Qmmp::DISCNUMBER + 1,
+ TWO_DIGIT_TRACK,
DURATION,
FILE_NAME,
TRACK_INDEX
@@ -139,9 +140,9 @@ private:
void parseText(QList<Node> *nodes, QString::const_iterator *i, QString::const_iterator end);
void parseEscape(QList<Node> *nodes, QString::const_iterator *i, QString::const_iterator end);
- QString evalute(const QList<Node> *nodes, const QMap<Qmmp::MetaData, QString> *metaData, qint64 length, int track) const;
- QString printParam(Param *p, const QMap<Qmmp::MetaData, QString> *metaData, qint64 length, int track) const;
- QString printField(int field, const QMap<Qmmp::MetaData, QString> *metaData, qint64 length, int track) const;
+ QString evalute(const QList<Node> *nodes, const QMap<Qmmp::MetaData, QString> *metaData, const QString *path, qint64 length, int track) const;
+ QString printParam(Param *p, const QMap<Qmmp::MetaData, QString> *metaData, const QString *path, qint64 length, int track) const;
+ QString printField(int field, const QMap<Qmmp::MetaData, QString> *metaData, const QString *path, qint64 length, int track) const;
QString dumpNode(Node node) const;
diff --git a/src/qmmpui/playlistparser.cpp b/src/qmmpui/playlistparser.cpp
index 3f72b4cbc..cb2f144ae 100644
--- a/src/qmmpui/playlistparser.cpp
+++ b/src/qmmpui/playlistparser.cpp
@@ -129,20 +129,20 @@ QList<PlayListTrack *> PlayListParser::loadPlaylist(const QString &f_name)
return tracks;
}
- QString url;
+ QString path;
foreach (PlayListTrack *t, tracks)
{
- url = t->value(Qmmp::URL);
+ path = t->path();
- if(url.contains("://"))
+ if(path.contains("://"))
continue;
- if(QFileInfo(url).isRelative())
- url.prepend(QFileInfo(f_name).canonicalPath () + "/");
+ if(QFileInfo(path).isRelative())
+ path.prepend(QFileInfo(f_name).canonicalPath () + "/");
- url.replace("\\","/");
- url.replace("//","/");
- t->setValue(Qmmp::URL, url);
+ path.replace("\\","/");
+ path.replace("//","/");
+ t->setPath(path);
}
return tracks;
}
diff --git a/src/qmmpui/playlisttask.cpp b/src/qmmpui/playlisttask.cpp
index 052f7006e..d43e6c9c1 100644
--- a/src/qmmpui/playlisttask.cpp
+++ b/src/qmmpui/playlisttask.cpp
@@ -116,12 +116,12 @@ PlayListTask::PlayListTask(QObject *parent) : QThread(parent)
m_sort_keys.insert(PlayListModel::ALBUM, Qmmp::ALBUM);
m_sort_keys.insert(PlayListModel::ARTIST, Qmmp::ARTIST);
m_sort_keys.insert(PlayListModel::ALBUMARTIST, Qmmp::ALBUMARTIST);
- m_sort_keys.insert(PlayListModel::FILENAME, Qmmp::URL);
- m_sort_keys.insert(PlayListModel::PATH_AND_FILENAME, Qmmp::URL);
+ m_sort_keys.insert(PlayListModel::FILENAME, Qmmp::UNKNOWN);
+ m_sort_keys.insert(PlayListModel::PATH_AND_FILENAME, Qmmp::UNKNOWN);
m_sort_keys.insert(PlayListModel::DATE, Qmmp::YEAR);
m_sort_keys.insert(PlayListModel::TRACK, Qmmp::TRACK);
- m_sort_keys.insert(PlayListModel::FILE_CREATION_DATE, Qmmp::URL);
- m_sort_keys.insert(PlayListModel::FILE_MODIFICATION_DATE, Qmmp::URL);
+ m_sort_keys.insert(PlayListModel::FILE_CREATION_DATE, Qmmp::UNKNOWN);
+ m_sort_keys.insert(PlayListModel::FILE_MODIFICATION_DATE, Qmmp::UNKNOWN);
}
PlayListTask::~PlayListTask()
@@ -146,7 +146,12 @@ void PlayListTask::sort(QList<PlayListTrack *> tracks, int mode)
{
TrackField *f = new TrackField;
f->track = t;
- f->value = (mode == PlayListModel::GROUP) ? t->groupName() : t->value(key);
+ if(mode == PlayListModel::GROUP)
+ f->value = t->groupName();
+ else if(key == Qmmp::UNKNOWN)
+ f->value = t->path();
+ else
+ f->value = t->value(key);
if(m_align_groups)
f->groupName = t->groupName();
m_fields.append(f);
@@ -174,7 +179,12 @@ void PlayListTask::sortSelection(QList<PlayListTrack *> tracks, int mode)
TrackField *f = new TrackField;
f->track = tracks[i];
- f->value = (mode == PlayListModel::GROUP) ? f->track->groupName() : f->track->value(key);
+ if(mode == PlayListModel::GROUP)
+ f->value = f->track->groupName();
+ else if(key == Qmmp::UNKNOWN)
+ f->value = f->track->path();
+ else
+ f->value = f->track->value(key);
m_fields.append(f);
m_indexes.append(i);
}
@@ -221,7 +231,7 @@ void PlayListTask::removeInvalidTracks(QList<PlayListTrack *> tracks, PlayListTr
{
TrackField *f = new TrackField;
f->track = tracks[i];
- f->value = f->track->value(Qmmp::URL);
+ f->value = f->track->path();
m_fields.append(f);
}
MetaDataManager::instance()->prepareForAnotherThread();
@@ -242,7 +252,7 @@ void PlayListTask::removeDuplicates(QList<PlayListTrack *> tracks, PlayListTrack
{
TrackField *f = new TrackField;
f->track = tracks[i];
- f->value = f->track->value(Qmmp::URL);
+ f->value = f->track->path();
m_fields.append(f);
}
MetaDataManager::instance()->prepareForAnotherThread();
@@ -263,7 +273,7 @@ void PlayListTask::refresh(QList<PlayListTrack *> tracks, PlayListTrack *current
{
TrackField *f = new TrackField;
f->track = tracks[i];
- f->value = f->track->value(Qmmp::URL);
+ f->value = f->track->path();
m_fields.append(f);
}
MetaDataManager::instance()->prepareForAnotherThread();
diff --git a/src/qmmpui/playlisttrack.cpp b/src/qmmpui/playlisttrack.cpp
index 6840ee62b..8e0a57df1 100644
--- a/src/qmmpui/playlisttrack.cpp
+++ b/src/qmmpui/playlisttrack.cpp
@@ -98,10 +98,10 @@ void PlayListTrack::updateMetaData(TrackInfo *info)
void PlayListTrack::updateMetaData()
{
- QList <TrackInfo *> list = MetaDataManager::instance()->createPlayList(value(Qmmp::URL));
- if(!list.isEmpty() && !list.at(0)->path().contains("://"))
+ QList <TrackInfo *> list = MetaDataManager::instance()->createPlayList(path());
+ if(!list.isEmpty() && !list.first()->path().contains("://"))
{
- TrackInfo *info = list.at(0);
+ TrackInfo *info = list.first();
updateMetaData(info);
}
qDeleteAll(list);
@@ -234,9 +234,9 @@ void PlayListTrack::formatTitle(int column)
if(m_formattedTitles.count() == 1)
{
if (m_formattedTitles[column].isEmpty())
- m_formattedTitles[column] = value(Qmmp::URL).section('/',-1);
+ m_formattedTitles[column] = path().section('/',-1);
if (m_formattedTitles[column].isEmpty())
- m_formattedTitles[column] = value(Qmmp::URL);
+ m_formattedTitles[column] = path();
}
if (m_settings->convertUnderscore())
m_formattedTitles[column].replace("_", " ");