aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/qmmp/buffer.h5
-rw-r--r--src/qmmp/output.cpp5
-rw-r--r--src/qmmp/output.h7
-rw-r--r--src/qmmp/outputwriter.cpp10
-rw-r--r--src/qmmp/qmmpaudioengine.cpp6
-rw-r--r--src/qmmp/qmmpaudioengine_p.h4
6 files changed, 32 insertions, 5 deletions
diff --git a/src/qmmp/buffer.h b/src/qmmp/buffer.h
index aa209b1a3..20802afe9 100644
--- a/src/qmmp/buffer.h
+++ b/src/qmmp/buffer.h
@@ -7,8 +7,10 @@
#ifndef __buffer_h
#define __buffer_h
-#include <string.h>
+#include <QMap>
+#include <QSharedPointer>
#include <stddef.h>
+#include "qmmp.h"
#define QMMP_BLOCK_FRAMES 512
@@ -45,6 +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; /*!< Indicates that new metadata is available */
};
diff --git a/src/qmmp/output.cpp b/src/qmmp/output.cpp
index 12519d09e..4bbb59dcd 100644
--- a/src/qmmp/output.cpp
+++ b/src/qmmp/output.cpp
@@ -65,6 +65,11 @@ void Output::suspend()
void Output::resume()
{}
+void Output::setMetaData(const QMap<Qmmp::MetaData, QString> &metaData)
+{
+ Q_UNUSED(metaData);
+}
+
Output::~Output()
{}
diff --git a/src/qmmp/output.h b/src/qmmp/output.h
index dd791ba61..c937f5c05 100644
--- a/src/qmmp/output.h
+++ b/src/qmmp/output.h
@@ -10,6 +10,7 @@
#include <QList>
#include <QIODevice>
+#include <QMap>
#include "outputfactory.h"
#include "audioparameters.h"
#include "channelmap.h"
@@ -75,6 +76,12 @@ public:
*/
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);
+ /*!
* Returns selected audio parameters.
*/
AudioParameters audioParameters() const;
diff --git a/src/qmmp/outputwriter.cpp b/src/qmmp/outputwriter.cpp
index ce33a04db..fe156e4e8 100644
--- a/src/qmmp/outputwriter.cpp
+++ b/src/qmmp/outputwriter.cpp
@@ -310,9 +310,13 @@ void OutputWriter::run()
status();
if (!b)
{
- b = recycler()->next();
- if (b && b->rate)
- m_kbps = b->rate;
+ if((b = recycler()->next()))
+ {
+ if(b->rate)
+ m_kbps = b->rate;
+ if(b->metaData)
+ m_output->setMetaData(*b->metaData);
+ }
}
recycler()->cond()->wakeOne();
diff --git a/src/qmmp/qmmpaudioengine.cpp b/src/qmmp/qmmpaudioengine.cpp
index 1f50b7dfd..0c7a8a41b 100644
--- a/src/qmmp/qmmpaudioengine.cpp
+++ b/src/qmmp/qmmpaudioengine.cpp
@@ -301,6 +301,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();
size_t sz = size < m_bks ? size : m_bks;
size_t samples = sz / m_sample_size;
@@ -363,6 +365,7 @@ void QmmpAudioEngine::run()
{
mutex()->lock ();
m_next = false;
+ m_metaData.clear();
qint64 len = 0;
int delay = 0;
if(m_decoders.isEmpty())
@@ -399,12 +402,14 @@ void QmmpAudioEngine::run()
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));
}
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));
}
if(m_inputs[m_decoder]->hasStreamInfo())
StateHandler::instance()->dispatch(m_inputs[m_decoder]->takeStreamInfo());
@@ -610,6 +615,7 @@ void QmmpAudioEngine::sendMetaData()
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();
}
diff --git a/src/qmmp/qmmpaudioengine_p.h b/src/qmmp/qmmpaudioengine_p.h
index c84d36e71..f36f43748 100644
--- a/src/qmmp/qmmpaudioengine_p.h
+++ b/src/qmmp/qmmpaudioengine_p.h
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2009-2016 by Ilya Kotov *
+ * Copyright (C) 2009-2017 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -23,6 +23,7 @@
#include <QQueue>
#include <QHash>
+#include <QSharedPointer>
#include "abstractengine.h"
#include "audioparameters.h"
@@ -94,6 +95,7 @@ private:
AudioParameters m_ap;
bool m_next;
bool m_muted;
+ QSharedPointer<QMap<Qmmp::MetaData, QString> > m_metaData;
static QmmpAudioEngine *m_instance;
ReplayGain *m_replayGain;
QmmpSettings *m_settings;