diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2008-09-26 19:30:27 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2008-09-26 19:30:27 +0000 |
| commit | 55c166a5356dff281533ca455cfe633f2721bf17 (patch) | |
| tree | 445b0ca9344cab165c5fa0b62e090d5d65ee8a64 | |
| parent | 742e513e91e8d6bd78365bec3da19f13e8cb8519 (diff) | |
| download | qmmp-55c166a5356dff281533ca455cfe633f2721bf17.tar.gz qmmp-55c166a5356dff281533ca455cfe633f2721bf17.tar.bz2 qmmp-55c166a5356dff281533ca455cfe633f2721bf17.zip | |
some api changes; enabled ogg vorbis plugin
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@565 90c681e8-e032-0410-971d-27865f9a5e38
| -rw-r--r-- | src/plugins/Input/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/plugins/Input/Input.pro | 2 | ||||
| -rw-r--r-- | src/plugins/Input/mad/decoder_mad.cpp | 15 | ||||
| -rw-r--r-- | src/plugins/Input/mad/decoder_mad.h | 4 | ||||
| -rw-r--r-- | src/plugins/Input/vorbis/decoder_vorbis.cpp | 113 | ||||
| -rw-r--r-- | src/plugins/Input/vorbis/decoder_vorbis.h | 8 | ||||
| -rw-r--r-- | src/plugins/Input/vorbis/decodervorbisfactory.cpp | 24 | ||||
| -rw-r--r-- | src/plugins/Input/vorbis/decodervorbisfactory.h | 6 | ||||
| -rw-r--r-- | src/plugins/Output/alsa/outputalsa.cpp | 2 | ||||
| -rw-r--r-- | src/plugins/Output/alsa/outputalsa.h | 4 | ||||
| -rw-r--r-- | src/qmmp/decoder.h | 2 | ||||
| -rw-r--r-- | src/qmmp/output.h | 2 | ||||
| -rw-r--r-- | src/qmmp/statehandler.cpp | 6 |
13 files changed, 84 insertions, 106 deletions
diff --git a/src/plugins/Input/CMakeLists.txt b/src/plugins/Input/CMakeLists.txt index 57df47d99..7a68dd8a3 100644 --- a/src/plugins/Input/CMakeLists.txt +++ b/src/plugins/Input/CMakeLists.txt @@ -21,7 +21,7 @@ IF(USE_FLAC AND TAGLIB_FOUND) ENDIF(USE_FLAC AND TAGLIB_FOUND) IF(USE_VORBIS AND TAGLIB_FOUND) -#add_subdirectory(vorbis) +add_subdirectory(vorbis) ENDIF(USE_VORBIS AND TAGLIB_FOUND) IF(USE_FFMPEG) diff --git a/src/plugins/Input/Input.pro b/src/plugins/Input/Input.pro index 6dff07146..1035f6484 100644 --- a/src/plugins/Input/Input.pro +++ b/src/plugins/Input/Input.pro @@ -1,6 +1,6 @@ include(../../../qmmp.pri) -SUBDIRS += mad# vorbis sndfile wavpack +SUBDIRS += mad vorbis # sndfile wavpack TEMPLATE = subdirs contains(CONFIG, MODPLUG_PLUGIN){ diff --git a/src/plugins/Input/mad/decoder_mad.cpp b/src/plugins/Input/mad/decoder_mad.cpp index 395506c33..0eeb912cf 100644 --- a/src/plugins/Input/mad/decoder_mad.cpp +++ b/src/plugins/Input/mad/decoder_mad.cpp @@ -102,8 +102,7 @@ bool DecoderMAD::initialize() { if (! input()->open(QIODevice::ReadOnly)) { - /*qWarning("DecoderMAD: Failed to open input. Error " + - QString::number(input()->isOpen()) + ".");*/ + qWarning("DecoderMAD: %s", qPrintable(input()->errorString ())); return FALSE; } } @@ -344,7 +343,7 @@ qint64 DecoderMAD::lengthInSeconds() return totalTime; } -void DecoderMAD::seek(double pos) +void DecoderMAD::seek(qint64 pos) { seekTime = pos; } @@ -403,13 +402,8 @@ void DecoderMAD::run() return; } - - //DecoderState::Type stat = DecoderState::Decoding; - mutex()->unlock(); - //dispatch(stat); - while (! done && ! m_finish && ! derror) { mutex()->lock(); @@ -533,14 +527,9 @@ void DecoderMAD::run() if (m_finish) finish(); -// stat = DecoderState::Finished; - //else if (user_stop) - // stat = DecoderState::Stopped; mutex()->unlock(); - //dispatch(stat); - if (input()) input()->close(); deinit(); diff --git a/src/plugins/Input/mad/decoder_mad.h b/src/plugins/Input/mad/decoder_mad.h index 55c662737..7de09b594 100644 --- a/src/plugins/Input/mad/decoder_mad.h +++ b/src/plugins/Input/mad/decoder_mad.h @@ -28,7 +28,7 @@ public: // standard decoder API bool initialize(); qint64 lengthInSeconds(); - void seek(double); + void seek(qint64); void stop(); private: @@ -44,7 +44,7 @@ private: bool findHeader(); bool findXingHeader(struct mad_bitptr, unsigned int); bool inited, user_stop, done, m_finish, derror, eof, useeq; - double totalTime, seekTime; + qint64 totalTime, seekTime; int channels; unsigned long bitrate; long freq, len; diff --git a/src/plugins/Input/vorbis/decoder_vorbis.cpp b/src/plugins/Input/vorbis/decoder_vorbis.cpp index 654a22619..2d3500559 100644 --- a/src/plugins/Input/vorbis/decoder_vorbis.cpp +++ b/src/plugins/Input/vorbis/decoder_vorbis.cpp @@ -9,7 +9,7 @@ #include <qmmp/buffer.h> #include <qmmp/output.h> #include <qmmp/recycler.h> -#include <qmmp/filetag.h> +#include <qmmp/fileinfo.h> #include <QObject> #include <QIODevice> @@ -85,7 +85,7 @@ DecoderVorbis::DecoderVorbis(QObject *parent, DecoderFactory *d, QIODevice *i, O output_at = 0; bks = 0; done = FALSE; - finish = FALSE; + m_finish = FALSE; len = 0; freq = 0; bitrate = 0; @@ -116,11 +116,11 @@ void DecoderVorbis::flush(bool final) { ulong min = final ? 0 : bks; - while ((! done && ! finish) && output_bytes > min) + while ((! done && ! m_finish) && output_bytes > min) { output()->recycler()->mutex()->lock (); - while ((! done && ! finish) && output()->recycler()->full()) + while ((! done && ! m_finish) && output()->recycler()->full()) { mutex()->unlock(); @@ -130,26 +130,13 @@ void DecoderVorbis::flush(bool final) done = user_stop; } - if (user_stop || finish) + if (user_stop || m_finish) { inited = FALSE; done = TRUE; } else { - /*ulong sz = output_bytes < bks ? output_bytes : bks; - Buffer *b = output()->recycler()->get(); - - memcpy(b->data, output_buf, sz); - if (sz != bks) memset(b->data + sz, 0, bks - sz); - - b->nbytes = bks; - b->rate = bitrate; - output_size += b->nbytes; - output()->recycler()->add(); - - output_bytes -= sz; - memmove(output_buf, output_buf + sz, output_bytes);*/ output_bytes -= produceSound(output_buf, output_bytes, bitrate, chan); output_size += bks; output_at = output_bytes; @@ -168,9 +155,9 @@ void DecoderVorbis::flush(bool final) bool DecoderVorbis::initialize() { qDebug("DecoderVorbis: initialize"); - bks = blockSize(); + bks = Buffer::size(); - inited = user_stop = done = finish = FALSE; + inited = user_stop = done = m_finish = FALSE; len = freq = bitrate = 0; stat = chan = 0; output_size = 0; @@ -199,12 +186,12 @@ bool DecoderVorbis::initialize() } ov_callbacks oggcb = - { - oggread, - oggseek, - oggclose, - oggtell - }; + { + oggread, + oggseek, + oggclose, + oggtell + }; if (ov_open_callbacks(this, &oggfile, NULL, 0, oggcb) < 0) { qWarning("DecoderVorbis: cannot open stream"); @@ -226,14 +213,14 @@ bool DecoderVorbis::initialize() chan = ogginfo->channels; } - configure(freq, chan, 16, bitrate); + configure(freq, chan, 16); inited = TRUE; return TRUE; } -double DecoderVorbis::lengthInSeconds() +qint64 DecoderVorbis::lengthInSeconds() { if (! inited) return 0; @@ -242,7 +229,7 @@ double DecoderVorbis::lengthInSeconds() } -void DecoderVorbis::seek(double pos) +void DecoderVorbis::seek(qint64 pos) { seekTime = pos; } @@ -252,7 +239,7 @@ void DecoderVorbis::deinit() { if (inited) ov_clear(&oggfile); - inited = user_stop = done = finish = FALSE; + inited = user_stop = done = m_finish = FALSE; len = freq = bitrate = 0; stat = chan = 0; output_size = 0; @@ -263,50 +250,49 @@ void DecoderVorbis::updateTags() int i; vorbis_comment *comments; - FileTag tag; + QMap <Qmmp::MetaData, QString> metaData; comments = ov_comment (&oggfile, -1); for (i = 0; i < comments->comments; i++) { if (!strncasecmp(comments->user_comments[i], "title=", strlen ("title="))) - tag.setValue(FileTag::TITLE, QString::fromUtf8(comments->user_comments[i] - + strlen ("title="))); + metaData.insert(Qmmp::TITLE, QString::fromUtf8(comments->user_comments[i] + + strlen ("title="))); else if (!strncasecmp(comments->user_comments[i], "artist=", strlen ("artist="))) - tag.setValue(FileTag::ARTIST, - QString::fromUtf8(comments->user_comments[i] - + strlen ("artist="))); + metaData.insert(Qmmp::ARTIST, + QString::fromUtf8(comments->user_comments[i] + + strlen ("artist="))); else if (!strncasecmp(comments->user_comments[i], "album=", strlen ("album="))) - tag.setValue(FileTag::ALBUM, - QString::fromUtf8(comments->user_comments[i] - + strlen ("album="))); + metaData.insert(Qmmp::ALBUM, + QString::fromUtf8(comments->user_comments[i] + + strlen ("album="))); else if (!strncasecmp(comments->user_comments[i], "comment=", strlen ("comment="))) - tag.setValue(FileTag::COMMENT, - QString::fromUtf8(comments->user_comments[i] - + strlen ("comment="))); + metaData.insert(Qmmp::COMMENT, + QString::fromUtf8(comments->user_comments[i] + + strlen ("comment="))); else if (!strncasecmp(comments->user_comments[i], "genre=", strlen ("genre="))) - tag.setValue(FileTag::GENRE, QString::fromUtf8 (comments->user_comments[i] - + strlen ("genre="))); + metaData.insert(Qmmp::GENRE, QString::fromUtf8 (comments->user_comments[i] + + strlen ("genre="))); else if (!strncasecmp(comments->user_comments[i], "tracknumber=", strlen ("tracknumber="))) - tag.setValue(FileTag::TRACK, atoi (comments->user_comments[i] - + strlen ("tracknumber="))); + metaData.insert(Qmmp::TRACK, QString::number(atoi(comments->user_comments[i] + + strlen ("tracknumber=")))); else if (!strncasecmp(comments->user_comments[i], "track=", strlen ("track="))) - tag.setValue(FileTag::TRACK, atoi (comments->user_comments[i] - + strlen ("track="))); + metaData.insert(Qmmp::TRACK, QString::number(atoi(comments->user_comments[i] + + strlen ("track=")))); else if (!strncasecmp(comments->user_comments[i], "date=", strlen ("date="))) - tag.setValue(FileTag::YEAR, atoi (comments->user_comments[i] - + strlen ("date="))); + metaData.insert(Qmmp::YEAR, QString::number(atoi(comments->user_comments[i] + + strlen ("date=")))); } - tag.setValue(FileTag::LENGTH, uint(totalTime)); - dispatch(tag); + StateHandler::instance()->dispatch(metaData); } void DecoderVorbis::run() @@ -321,14 +307,14 @@ void DecoderVorbis::run() } //stat = DecoderEvent::Decoding; - stat = DecoderState::Decoding; + //stat = DecoderState::Decoding; mutex()->unlock(); { //DecoderEvent e((DecoderEvent::Type) stat); //dispatch(e); //DecoderStatus st ((DecoderStatus::Type) stat); - dispatch(DecoderState ((DecoderState::Type) stat)); + //dispatch(DecoderState ((DecoderState::Type) stat)); //emit statusChanged(stat); } @@ -336,7 +322,7 @@ void DecoderVorbis::run() int section = 0; int last_section = -1; - while (! done && ! finish) + while (! done && ! m_finish) { mutex()->lock (); // decode @@ -389,16 +375,16 @@ void DecoderVorbis::run() done = TRUE; if (! user_stop) { - finish = TRUE; + m_finish = TRUE; } } else { // error in read - error("DecoderVorbis: Error while decoding stream, File appears to be " - "corrupted"); + //error("DecoderVorbis: Error while decoding stream, File appears to be " + // "corrupted"); - finish = TRUE; + m_finish = TRUE; } mutex()->unlock(); @@ -406,10 +392,11 @@ void DecoderVorbis::run() mutex()->lock (); - if (finish) - stat = DecoderState::Finished; + if (m_finish) + finish(); + /* stat = DecoderState::Finished; else if (user_stop) - stat = DecoderState::Stopped; + stat = DecoderState::Stopped;*/ mutex()->unlock(); @@ -418,7 +405,7 @@ void DecoderVorbis::run() dispatch(e);*/ //DecoderStatus st ((DecoderStatus::Type) stat); //emit statusChanged(st); - dispatch(DecoderState ((DecoderState::Type) stat)); + //dispatch(DecoderState ((DecoderState::Type) stat)); } deinit(); diff --git a/src/plugins/Input/vorbis/decoder_vorbis.h b/src/plugins/Input/vorbis/decoder_vorbis.h index 1d093f7cf..f9609cac7 100644 --- a/src/plugins/Input/vorbis/decoder_vorbis.h +++ b/src/plugins/Input/vorbis/decoder_vorbis.h @@ -20,8 +20,8 @@ public: // Standard Decoder API bool initialize(); - double lengthInSeconds(); - void seek(double); + qint64 lengthInSeconds(); + void seek(qint64); void stop(); // Equalizer @@ -52,11 +52,11 @@ private: OggVorbis_File oggfile; unsigned int bks; - bool done, finish; + bool done, m_finish; long len, freq, bitrate; int chan; unsigned long output_size; - double totalTime, seekTime; + qint64 totalTime, seekTime; }; diff --git a/src/plugins/Input/vorbis/decodervorbisfactory.cpp b/src/plugins/Input/vorbis/decodervorbisfactory.cpp index e40408a98..095f6b5ff 100644 --- a/src/plugins/Input/vorbis/decodervorbisfactory.cpp +++ b/src/plugins/Input/vorbis/decodervorbisfactory.cpp @@ -57,38 +57,38 @@ const DecoderProperties DecoderVorbisFactory::properties() const } Decoder *DecoderVorbisFactory::create(QObject *parent, QIODevice *input, - Output *output) + Output *output, const QString&) { return new DecoderVorbis(parent, this, input, output); } -FileTag *DecoderVorbisFactory::createTag(const QString &source) +FileInfo *DecoderVorbisFactory::getFileInfo(const QString &source) { - FileTag *ftag = new FileTag(); + FileInfo *info = new FileInfo(); TagLib::FileRef fileRef(source.toLocal8Bit ()); TagLib::Tag *tag = fileRef.tag(); if (tag && !tag->isEmpty()) { - ftag->setValue(FileTag::ALBUM, + info->setMetaData(Qmmp::ALBUM, QString::fromUtf8(tag->album().toCString(TRUE)).trimmed()); - ftag->setValue(FileTag::ARTIST, + info->setMetaData(Qmmp::ARTIST, QString::fromUtf8(tag->artist().toCString(TRUE)).trimmed()); - ftag->setValue(FileTag::COMMENT, + info->setMetaData(Qmmp::COMMENT, QString::fromUtf8(tag->comment().toCString(TRUE)).trimmed()); - ftag->setValue(FileTag::GENRE, + info->setMetaData(Qmmp::GENRE, QString::fromUtf8(tag->genre().toCString(TRUE)).trimmed()); - ftag->setValue(FileTag::TITLE, + info->setMetaData(Qmmp::TITLE, QString::fromUtf8(tag->title().toCString(TRUE)).trimmed()); - ftag->setValue(FileTag::YEAR, tag->year()); - ftag->setValue(FileTag::TRACK, tag->track()); + info->setMetaData(Qmmp::YEAR, tag->year()); + info->setMetaData(Qmmp::TRACK, tag->track()); } if (fileRef.audioProperties()) - ftag->setValue(FileTag::LENGTH, fileRef.audioProperties()->length()); + info->setLength(fileRef.audioProperties()->length()); - return ftag; + return info; } QObject* DecoderVorbisFactory::showDetails(QWidget *parent, const QString &path) diff --git a/src/plugins/Input/vorbis/decodervorbisfactory.h b/src/plugins/Input/vorbis/decodervorbisfactory.h index 5610faeb2..f2d42b695 100644 --- a/src/plugins/Input/vorbis/decodervorbisfactory.h +++ b/src/plugins/Input/vorbis/decodervorbisfactory.h @@ -28,7 +28,7 @@ #include <qmmp/decoder.h> #include <qmmp/output.h> #include <qmmp/decoderfactory.h> -#include <qmmp/filetag.h> +#include <qmmp/fileinfo.h> @@ -43,8 +43,8 @@ public: bool supports(const QString &source) const; bool canDecode(QIODevice *input) const; const DecoderProperties properties() const; - Decoder *create(QObject *, QIODevice *, Output *); - FileTag *createTag(const QString &source); + Decoder *create(QObject *, QIODevice *, Output *, const QString &); + FileInfo *getFileInfo(const QString &source); QObject* showDetails(QWidget *parent, const QString &path); void showSettings(QWidget *parent); void showAbout(QWidget *parent); diff --git a/src/plugins/Output/alsa/outputalsa.cpp b/src/plugins/Output/alsa/outputalsa.cpp index 2926b7455..5ec6b7748 100644 --- a/src/plugins/Output/alsa/outputalsa.cpp +++ b/src/plugins/Output/alsa/outputalsa.cpp @@ -91,7 +91,7 @@ qint64 OutputALSA::written() return m_totalWritten; } -void OutputALSA::seek(long pos) +void OutputALSA::seek(qint64 pos) { m_totalWritten = (pos * m_bps); m_currentSeconds = -1; diff --git a/src/plugins/Output/alsa/outputalsa.h b/src/plugins/Output/alsa/outputalsa.h index 7289a1ccd..a3bb817ee 100644 --- a/src/plugins/Output/alsa/outputalsa.h +++ b/src/plugins/Output/alsa/outputalsa.h @@ -47,7 +47,7 @@ public: void pause(); qint64 written(); qint64 latency(); - void seek(long); + void seek(qint64); void setVolume(int l, int r); void volume(int *l, int *r); @@ -61,7 +61,7 @@ private: long alsa_write(unsigned char *data, long size); bool m_inited, m_pause, m_play, m_userStop; - long m_totalWritten, m_currentSeconds, m_bps; + qint64 m_totalWritten, m_currentSeconds, m_bps; int m_rate, m_channels, m_precision; quint32 m_frequency; //alsa diff --git a/src/qmmp/decoder.h b/src/qmmp/decoder.h index 1a19452f2..75600a687 100644 --- a/src/qmmp/decoder.h +++ b/src/qmmp/decoder.h @@ -41,7 +41,7 @@ public: // Standard Decoder API virtual bool initialize() = 0; virtual qint64 lengthInSeconds() = 0; - virtual void seek(double) = 0; + virtual void seek(qint64) = 0; virtual void stop() = 0; //virtual void pause() = 0; //virtual void stop() = 0; diff --git a/src/qmmp/output.h b/src/qmmp/output.h index 3703519e6..2cd294af4 100644 --- a/src/qmmp/output.h +++ b/src/qmmp/output.h @@ -42,7 +42,7 @@ public: virtual void stop() = 0; virtual qint64 written() = 0; virtual qint64 latency() = 0; - virtual void seek(long) = 0; + virtual void seek(qint64) = 0; virtual void setVolume(int, int){}; virtual void volume(int *, int *){}; diff --git a/src/qmmp/statehandler.cpp b/src/qmmp/statehandler.cpp index ad71ea17a..3f2fe19b9 100644 --- a/src/qmmp/statehandler.cpp +++ b/src/qmmp/statehandler.cpp @@ -86,7 +86,7 @@ void StateHandler::dispatch(const QMap<Qmmp::MetaData, QString> &metaData) QMap<Qmmp::MetaData, QString> tmp = metaData; foreach(QString value, tmp.values()) //remove empty keys { - if (value.isEmpty()) + if (value.isEmpty() || value == "0") tmp.remove(tmp.key(value)); } if (m_metaData != tmp) @@ -109,7 +109,9 @@ void StateHandler::dispatch(const Qmmp::State &state) m_state = state; //clear - if (m_state != Qmmp::Playing || m_state != Qmmp::Paused || m_state != Qmmp::Buffering) + QList <Qmmp::State> clearStates; + clearStates << Qmmp::Stopped << Qmmp::NormalError << Qmmp::FatalError; + if (clearStates.contains(m_state)) { m_elapsed = -1; m_bitrate = 0; |
