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 | |
| 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
| -rw-r--r-- | src/plugins/Input/aac/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/plugins/Input/aac/aac.pro | 6 | ||||
| -rw-r--r-- | src/plugins/Input/aac/aacfile.cpp | 77 | ||||
| -rw-r--r-- | src/plugins/Input/aac/aacfile.h | 24 | ||||
| -rw-r--r-- | src/plugins/Input/aac/decoderaacfactory.cpp | 6 | ||||
| -rw-r--r-- | src/plugins/Input/aac/detailsdialog.cpp | 96 | ||||
| -rw-r--r-- | src/plugins/Input/aac/detailsdialog.h | 8 | ||||
| -rw-r--r-- | src/plugins/Input/aac/detailsdialog.ui | 24 | ||||
| -rw-r--r-- | src/plugins/Input/aac/tagextractor.cpp | 115 | ||||
| -rw-r--r-- | src/plugins/Input/aac/tagextractor.h | 68 |
10 files changed, 134 insertions, 292 deletions
diff --git a/src/plugins/Input/aac/CMakeLists.txt b/src/plugins/Input/aac/CMakeLists.txt index ae9d22b32..1da0221c8 100644 --- a/src/plugins/Input/aac/CMakeLists.txt +++ b/src/plugins/Input/aac/CMakeLists.txt @@ -39,7 +39,6 @@ SET(libaac_SRCS decoderaacfactory.cpp detailsdialog.cpp aacfile.cpp - tagextractor.cpp ) SET(libaac_MOC_HDRS @@ -47,7 +46,6 @@ SET(libaac_MOC_HDRS decoder_aac.h detailsdialog.h aacfile.h - tagextractor.h ) #SET(libaac_RCCS translations/translations.qrc) diff --git a/src/plugins/Input/aac/aac.pro b/src/plugins/Input/aac/aac.pro index 01e2bbff0..5bc0cb38a 100644 --- a/src/plugins/Input/aac/aac.pro +++ b/src/plugins/Input/aac/aac.pro @@ -4,13 +4,11 @@ FORMS += detailsdialog.ui HEADERS += decoderaacfactory.h \ decoder_aac.h \ detailsdialog.h \ - aacfile.h \ - tagextractor.h + aacfile.h SOURCES += decoder_aac.cpp \ decoderaacfactory.cpp \ detailsdialog.cpp \ - aacfile.cpp \ - tagextractor.cpp + aacfile.cpp TARGET =$$PLUGINS_PREFIX/Input/aac QMAKE_CLEAN =$$PLUGINS_PREFIX/Input/libaac.so 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); } diff --git a/src/plugins/Input/aac/aacfile.h b/src/plugins/Input/aac/aacfile.h index 3c9c2bf48..8e57b7588 100644 --- a/src/plugins/Input/aac/aacfile.h +++ b/src/plugins/Input/aac/aacfile.h @@ -24,10 +24,17 @@ #include <QMap> #include <QString> +#include <taglib/tag.h> +#include <taglib/fileref.h> +#include <taglib/id3v1tag.h> +#include <taglib/id3v2tag.h> +#include <taglib/id3v2header.h> + #include <qmmp/qmmp.h> class QIODevice; class TagExtractor; +class QBuffer; /** @author Ilya Kotov <forkotov02@hotmail.ru> @@ -35,7 +42,7 @@ class TagExtractor; class AACFile { public: - AACFile(QIODevice *i); + AACFile(QIODevice *i, bool metaData = TRUE); ~AACFile(); @@ -46,12 +53,25 @@ public: private: void parseADTS(); + void parseID3v2(); qint64 m_length; quint32 m_bitrate; QIODevice *m_input; bool m_isValid; QMap<Qmmp::MetaData, QString> m_metaData; - TagExtractor *m_ext; +}; + +class ID3v2Tag : public TagLib::ID3v2::Tag +{ +public: + ID3v2Tag(QByteArray *array, long offset); + +protected: + void read (); + +private: + QBuffer *m_buf; + long m_offset; }; #endif diff --git a/src/plugins/Input/aac/decoderaacfactory.cpp b/src/plugins/Input/aac/decoderaacfactory.cpp index 9b91f1d45..d55f64fdc 100644 --- a/src/plugins/Input/aac/decoderaacfactory.cpp +++ b/src/plugins/Input/aac/decoderaacfactory.cpp @@ -77,9 +77,9 @@ QList<FileInfo *> DecoderAACFactory::createPlayList(const QString &fileName) QObject* DecoderAACFactory::showDetails(QWidget *parent, const QString &path) { - /*DetailsDialog *d = new DetailsDialog(parent, path); - d -> show();*/ - return 0; + DetailsDialog *d = new DetailsDialog(parent, path); + d -> show(); + return d; } void DecoderAACFactory::showSettings(QWidget *) diff --git a/src/plugins/Input/aac/detailsdialog.cpp b/src/plugins/Input/aac/detailsdialog.cpp index 472046717..fbd6511c8 100644 --- a/src/plugins/Input/aac/detailsdialog.cpp +++ b/src/plugins/Input/aac/detailsdialog.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2007 by Ilya Kotov * + * Copyright (C) 2008 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -24,6 +24,7 @@ #include <QFile> #include <QFileInfo> +#include "aacfile.h" #include "detailsdialog.h" #define QStringToTString_qt4(s) TagLib::String(s.toUtf8().constData(), TagLib::String::UTF8) @@ -37,79 +38,44 @@ DetailsDialog::DetailsDialog(QWidget *parent, const QString &path) setWindowTitle (path.section('/',-1)); path.section('/',-1); ui.pathLineEdit->setText(m_path); - if(QFile::exists(m_path)) - { - loadMPCInfo(); - loadTag(); - } + if (QFile::exists(m_path)) + loadAACInfo(); } DetailsDialog::~DetailsDialog() {} -void DetailsDialog::loadMPCInfo() +void DetailsDialog::loadAACInfo() { - TagLib::MPC::File f (m_path.toLocal8Bit()); + QFile input(m_path); + if (!input.open(QIODevice::ReadOnly)) + return; + + AACFile f(&input); + QString text; - text = QString("%1").arg(f.audioProperties()->length()/60); - text +=":"+QString("%1").arg(f.audioProperties()->length()%60,2,10,QChar('0')); + text = QString("%1").arg(f.length()/60); + text +=":"+QString("%1").arg(f.length()%60,2,10,QChar('0')); ui.lengthLabel->setText(text); - text = QString("%1").arg(f.audioProperties()->sampleRate()); - ui.sampleRateLabel->setText(text+" "+tr("Hz")); - text = QString("%1").arg(f.audioProperties()->channels()); - ui.channelsLabel->setText(text); - text = QString("%1").arg(f.audioProperties()->bitrate()); - ui.bitrateLabel->setText(text+" "+tr("kbps")); - text = QString("%1").arg(f.audioProperties()->mpcVersion()); - ui.versionLabel->setText(text); - text = QString("%1 "+tr("KB")).arg(f.length()/1024); + /*text = QString("%1").arg(f.audioProperties()->sampleRate()); + ui.sampleRateLabel->setText(text+" "+tr("Hz"));*/ + /*text = QString("%1").arg(f.audioProperties()->channels()); + ui.channelsLabel->setText(text);*/ + text = QString("%1").arg(f.bitrate()); + ui.bitrateLabel->setText(text+" "+tr("kbps")); + /*text = QString("%1").arg(f.audioProperties()->mpcVersion()); + ui.versionLabel->setText(text);*/ + text = QString("%1 "+tr("KB")).arg(input.size()/1024); ui.fileSizeLabel->setText(text); -} - -void DetailsDialog::loadTag() -{ - TagLib::FileRef f (m_path.toLocal8Bit()); - - if (f.tag()) - { //TODO: load codec name from config - - TagLib::String title = f.tag()->title(); - TagLib::String artist = f.tag()->artist(); - TagLib::String album = f.tag()->album(); - TagLib::String comment = f.tag()->comment(); - TagLib::String genre = f.tag()->genre(); - QString string = QString::fromUtf8(title.toCString(TRUE)).trimmed(); - ui.titleLineEdit->setText(string); - string = QString::fromUtf8(artist.toCString(TRUE)).trimmed(); - ui.artistLineEdit->setText(string); - string = QString::fromUtf8(album.toCString(TRUE)).trimmed(); - ui.albumLineEdit->setText(string); - string = QString::fromUtf8(comment.toCString(TRUE)).trimmed(); - ui.commentLineEdit->setText(string); - string = QString("%1").arg(f.tag()->year()); - ui.yearLineEdit->setText(string); - string = QString("%1").arg(f.tag()->track()); - ui.trackLineEdit->setText(string); - string = QString::fromUtf8(genre.toCString(TRUE)).trimmed(); - ui.genreLineEdit->setText(string); - } - QFileInfo info(m_path); - ui.saveButton->setEnabled(info.isWritable()); - connect(ui.saveButton, SIGNAL(clicked()), SLOT(saveTag())); -} - -void DetailsDialog::saveTag() -{ - TagLib::FileRef f (m_path.toLocal8Bit()); - - f.tag()->setTitle(QStringToTString_qt4(ui.titleLineEdit->text())); - f.tag()->setArtist(QStringToTString_qt4(ui.artistLineEdit->text())); - f.tag()->setAlbum(QStringToTString_qt4(ui.albumLineEdit->text())); - f.tag()->setComment(QStringToTString_qt4(ui.commentLineEdit->text())); - f.tag()->setGenre(QStringToTString_qt4(ui.genreLineEdit->text())); - f.tag()->setYear(ui.yearLineEdit->text().toUInt()); - f.tag()->setTrack(ui.trackLineEdit->text().toUInt()); - f.save(); + //show metadata + ui.titleLineEdit->setText(f.metaData().value(Qmmp::TITLE)); + ui.artistLineEdit->setText(f.metaData().value(Qmmp::ARTIST)); + ui.albumLineEdit->setText(f.metaData().value(Qmmp::ALBUM)); + ui.commentLineEdit->setText(f.metaData().value(Qmmp::COMMENT)); + ui.yearLineEdit->setText(f.metaData().value(Qmmp::YEAR)); + ui.trackLineEdit->setText(f.metaData().value(Qmmp::TRACK)); + ui.genreLineEdit->setText(f.metaData().value(Qmmp::GENRE)); + input.close(); } diff --git a/src/plugins/Input/aac/detailsdialog.h b/src/plugins/Input/aac/detailsdialog.h index 70540bda1..7716b5181 100644 --- a/src/plugins/Input/aac/detailsdialog.h +++ b/src/plugins/Input/aac/detailsdialog.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2007 by Ilya Kotov * + * Copyright (C) 2008 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -35,12 +35,8 @@ public: ~DetailsDialog(); -private slots: - void saveTag(); - private: - void loadMPCInfo(); - void loadTag(); + void loadAACInfo(); Ui::DetailsDialog ui; QString m_path; diff --git a/src/plugins/Input/aac/detailsdialog.ui b/src/plugins/Input/aac/detailsdialog.ui index 618300c10..b461fa38b 100644 --- a/src/plugins/Input/aac/detailsdialog.ui +++ b/src/plugins/Input/aac/detailsdialog.ui @@ -39,25 +39,13 @@ </size> </property> <property name="title" > - <string>Musepack Info</string> + <string>AAC Info</string> </property> <layout class="QGridLayout" > - <property name="leftMargin" > + <property name="margin" > <number>8</number> </property> - <property name="topMargin" > - <number>8</number> - </property> - <property name="rightMargin" > - <number>8</number> - </property> - <property name="bottomMargin" > - <number>8</number> - </property> - <property name="horizontalSpacing" > - <number>6</number> - </property> - <property name="verticalSpacing" > + <property name="spacing" > <number>6</number> </property> <item row="6" column="0" > @@ -65,7 +53,7 @@ <property name="orientation" > <enum>Qt::Vertical</enum> </property> - <property name="sizeHint" > + <property name="sizeHint" stdset="0" > <size> <width>74</width> <height>151</height> @@ -196,7 +184,7 @@ </sizepolicy> </property> <property name="title" > - <string>APE Tag</string> + <string>ID3v2 Tag</string> </property> <layout class="QGridLayout" > <item row="0" column="0" > @@ -308,7 +296,7 @@ <property name="orientation" > <enum>Qt::Horizontal</enum> </property> - <property name="sizeHint" > + <property name="sizeHint" stdset="0" > <size> <width>111</width> <height>20</height> diff --git a/src/plugins/Input/aac/tagextractor.cpp b/src/plugins/Input/aac/tagextractor.cpp deleted file mode 100644 index 1385c8a85..000000000 --- a/src/plugins/Input/aac/tagextractor.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2008 by Ilya Kotov * - * forkotov02@hotmail.ru * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ - -#include <QIODevice> -#include <QSettings> -#include <QByteArray> -#include <QBuffer> -#include <QTextCodec> -#include <QSettings> -#include <QDir> -#include <stdlib.h> - -#include "tagextractor.h" - -TagExtractor::TagExtractor(QIODevice *d) -{ - m_d = d; -} - - -TagExtractor::~TagExtractor() -{ -} - -const QMap<Qmmp::MetaData, QString> TagExtractor::id3v2tag() -{ - QByteArray array = m_d->peek(2048); - int offset = array.indexOf("ID3"); - if (offset < 0) - return m_tag; - ID3v2Tag taglib_tag(&array, offset); - if (taglib_tag.isEmpty()) - return m_tag; - - 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(); - - QSettings settings(QDir::homePath()+"/.qmmp/qmmprc", QSettings::IniFormat); - settings.beginGroup("MAD"); - QByteArray name = settings.value("ID3v2_encoding","UTF-8").toByteArray (); - bool utf = FALSE; - QTextCodec *codec = 0; - if (name.contains("UTF")) - { - codec = QTextCodec::codecForName ("UTF-8"); - utf = TRUE; - } - else - codec = QTextCodec::codecForName(name); - settings.endGroup(); - - if (!codec) - codec = QTextCodec::codecForName ("UTF-8"); - - m_tag.insert(Qmmp::ALBUM, - codec->toUnicode(album.toCString(utf)).trimmed()); - m_tag.insert(Qmmp::ARTIST, - codec->toUnicode(artist.toCString(utf)).trimmed()); - m_tag.insert(Qmmp::COMMENT, - codec->toUnicode(comment.toCString(utf)).trimmed()); - m_tag.insert(Qmmp::GENRE, - codec->toUnicode(genre.toCString(utf)).trimmed()); - m_tag.insert(Qmmp::TITLE, - codec->toUnicode(title.toCString(utf)).trimmed()); - m_tag.insert(Qmmp::YEAR, - QString::number(taglib_tag.year())); - m_tag.insert(Qmmp::TRACK, - QString::number(taglib_tag.track())); - - return m_tag; - -} - -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 () -{ - m_buf->seek(m_offset); - uint to_read = TagLib::ID3v2::Header::size(); - if (to_read > 2048 - uint(m_offset)) - return; - header()->setData(TagLib::ByteVector(m_buf->read(to_read).data(), to_read)); - to_read = header()->tagSize(); - if (!to_read || 2048 < m_offset + TagLib::ID3v2::Header::size()) - return; - QByteArray array = m_buf->read(to_read); - TagLib::ByteVector v(array.data(), array.size()); - parse(v); -} diff --git a/src/plugins/Input/aac/tagextractor.h b/src/plugins/Input/aac/tagextractor.h deleted file mode 100644 index 707719535..000000000 --- a/src/plugins/Input/aac/tagextractor.h +++ /dev/null @@ -1,68 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2008 by Ilya Kotov * - * forkotov02@hotmail.ru * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ -#ifndef TAGEXTRACTOR_H -#define TAGEXTRACTOR_H - -#include <QMap> - -#include <taglib/tag.h> -#include <taglib/fileref.h> -#include <taglib/id3v1tag.h> -#include <taglib/id3v2tag.h> -#include <taglib/id3v2header.h> - -#include <qmmp/qmmp.h> - -class QIODevice; -class QBuffer; -class QByteArray; - -/** - @author Ilya Kotov <forkotov02@hotmail.ru> -*/ -class TagExtractor -{ -public: - TagExtractor(QIODevice *d); - - ~TagExtractor(); - - const QMap<Qmmp::MetaData, QString> id3v2tag(); - -private: - QMap<Qmmp::MetaData, QString> m_tag; - QIODevice *m_d; - -}; - -class ID3v2Tag : public TagLib::ID3v2::Tag -{ -public: - ID3v2Tag(QByteArray *array, long offset); - -protected: - void read (); - -private: - QBuffer *m_buf; - long m_offset; -}; - -#endif |
