diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/qmmp/buffer.h | 5 | ||||
| -rw-r--r-- | src/qmmp/output.cpp | 5 | ||||
| -rw-r--r-- | src/qmmp/output.h | 7 | ||||
| -rw-r--r-- | src/qmmp/outputwriter.cpp | 10 | ||||
| -rw-r--r-- | src/qmmp/qmmpaudioengine.cpp | 6 | ||||
| -rw-r--r-- | src/qmmp/qmmpaudioengine_p.h | 4 |
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; |
