aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2008-09-26 19:30:27 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2008-09-26 19:30:27 +0000
commit55c166a5356dff281533ca455cfe633f2721bf17 (patch)
tree445b0ca9344cab165c5fa0b62e090d5d65ee8a64
parent742e513e91e8d6bd78365bec3da19f13e8cb8519 (diff)
downloadqmmp-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.txt2
-rw-r--r--src/plugins/Input/Input.pro2
-rw-r--r--src/plugins/Input/mad/decoder_mad.cpp15
-rw-r--r--src/plugins/Input/mad/decoder_mad.h4
-rw-r--r--src/plugins/Input/vorbis/decoder_vorbis.cpp113
-rw-r--r--src/plugins/Input/vorbis/decoder_vorbis.h8
-rw-r--r--src/plugins/Input/vorbis/decodervorbisfactory.cpp24
-rw-r--r--src/plugins/Input/vorbis/decodervorbisfactory.h6
-rw-r--r--src/plugins/Output/alsa/outputalsa.cpp2
-rw-r--r--src/plugins/Output/alsa/outputalsa.h4
-rw-r--r--src/qmmp/decoder.h2
-rw-r--r--src/qmmp/output.h2
-rw-r--r--src/qmmp/statehandler.cpp6
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;