diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2008-10-31 20:30:38 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2008-10-31 20:30:38 +0000 |
| commit | 9afdb33ec0ab2b4c8ad98ff7641999af45b315f2 (patch) | |
| tree | d14c9a436f1b6130250b83c356e1e84f623498b5 /src/plugins/Input/aac/aacfile.cpp | |
| parent | 311224cda472f8d308884353960cab6231bb769d (diff) | |
| download | qmmp-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.cpp | 77 |
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); } |
