aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/aac/aacfile.cpp
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2008-10-31 20:30:38 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2008-10-31 20:30:38 +0000
commit9afdb33ec0ab2b4c8ad98ff7641999af45b315f2 (patch)
treed14c9a436f1b6130250b83c356e1e84f623498b5 /src/plugins/Input/aac/aacfile.cpp
parent311224cda472f8d308884353960cab6231bb769d (diff)
downloadqmmp-9afdb33ec0ab2b4c8ad98ff7641999af45b315f2.tar.gz
qmmp-9afdb33ec0ab2b4c8ad98ff7641999af45b315f2.tar.bz2
qmmp-9afdb33ec0ab2b4c8ad98ff7641999af45b315f2.zip
AAC plugin: added details dialog
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@607 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input/aac/aacfile.cpp')
-rw-r--r--src/plugins/Input/aac/aacfile.cpp77
1 files changed, 68 insertions, 9 deletions
diff --git a/src/plugins/Input/aac/aacfile.cpp b/src/plugins/Input/aac/aacfile.cpp
index 8df0592f5..1e78a9590 100644
--- a/src/plugins/Input/aac/aacfile.cpp
+++ b/src/plugins/Input/aac/aacfile.cpp
@@ -19,10 +19,11 @@
***************************************************************************/
#include <QIODevice>
+#include <QBuffer>
+#include <QTextCodec>
#include <neaacdec.h>
-#include "tagextractor.h"
#include "aacfile.h"
#define MAX_CHANNELS 6
@@ -30,12 +31,11 @@
static int adts_sample_rates[] = {96000,88200,64000,48000,44100,32000,24000,22050,16000,12000,11025,8000,7350,0,0,0};
-AACFile::AACFile(QIODevice *i)
+AACFile::AACFile(QIODevice *i, bool metaData)
{
m_isValid = FALSE;
m_length = 0;
m_bitrate = 0;
- m_ext = 0;
m_input = i;
uchar buf[AAC_BUFFER_SIZE];
qint64 buf_at = i->peek((char *) buf, AAC_BUFFER_SIZE);
@@ -55,9 +55,10 @@ AACFile::AACFile(QIODevice *i)
}
memmove (buf, buf + tag_size, buf_at - tag_size);
- m_ext = new TagExtractor(i);
+ if (metaData)
+ parseID3v2(); //parse id3v2 tags
}
- //try to determenate header type;
+ //try to determnate header type;
if (buf[0] == 0xff && ((buf[1] & 0xf6) == 0xf0))
{
qDebug("AACFile: ADTS header found");
@@ -96,6 +97,16 @@ quint32 AACFile::bitrate()
return m_bitrate;
}
+bool AACFile::isValid()
+{
+ return m_isValid;
+}
+
+const QMap<Qmmp::MetaData, QString> AACFile::metaData()
+{
+ return m_metaData;
+}
+
void AACFile::parseADTS()
{
uchar buf[FAAD_MIN_STREAMSIZE*MAX_CHANNELS];
@@ -165,12 +176,60 @@ void AACFile::parseADTS()
m_length = 1;
}
-bool AACFile::isValid()
+void AACFile::parseID3v2()
{
- return m_isValid;
+ QByteArray array = m_input->peek(2048);
+ int offset = array.indexOf("ID3");
+ if (offset < 0)
+ return;
+ ID3v2Tag taglib_tag(&array, offset);
+ if (taglib_tag.isEmpty())
+ return;
+
+ TagLib::String album = taglib_tag.album();
+ TagLib::String artist = taglib_tag.artist();
+ TagLib::String comment = taglib_tag.comment();
+ TagLib::String genre = taglib_tag.genre();
+ TagLib::String title = taglib_tag.title();
+
+ QTextCodec *codec = QTextCodec::codecForName ("UTF-8");
+ bool utf = TRUE;
+
+ m_metaData.insert(Qmmp::ALBUM,
+ codec->toUnicode(album.toCString(utf)).trimmed());
+ m_metaData.insert(Qmmp::ARTIST,
+ codec->toUnicode(artist.toCString(utf)).trimmed());
+ m_metaData.insert(Qmmp::COMMENT,
+ codec->toUnicode(comment.toCString(utf)).trimmed());
+ m_metaData.insert(Qmmp::GENRE,
+ codec->toUnicode(genre.toCString(utf)).trimmed());
+ m_metaData.insert(Qmmp::TITLE,
+ codec->toUnicode(title.toCString(utf)).trimmed());
+ m_metaData.insert(Qmmp::YEAR,
+ QString::number(taglib_tag.year()));
+ m_metaData.insert(Qmmp::TRACK,
+ QString::number(taglib_tag.track()));
}
-const QMap<Qmmp::MetaData, QString> AACFile::metaData()
+ID3v2Tag::ID3v2Tag(QByteArray *array, long offset) : TagLib::ID3v2::Tag()
+{
+ m_buf = new QBuffer(array);
+ m_buf->open(QIODevice::ReadOnly);
+ m_offset = offset;
+ read();
+}
+
+void ID3v2Tag::read ()
{
- return m_ext ? m_ext->id3v2tag() : QMap<Qmmp::MetaData, QString>();
+ m_buf->seek(m_offset);
+ uint to_read = TagLib::ID3v2::Header::size();
+ if (to_read > AAC_BUFFER_SIZE - uint(m_offset))
+ return;
+ header()->setData(TagLib::ByteVector(m_buf->read(to_read).data(), to_read));
+ to_read = header()->tagSize();
+ if (!to_read || AAC_BUFFER_SIZE < m_offset + TagLib::ID3v2::Header::size())
+ return;
+ QByteArray array = m_buf->read(to_read);
+ TagLib::ByteVector v(array.data(), array.size());
+ parse(v);
}