From 2d5abd46d22c32e6442ac98572323c31d126ffff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Lalinsk=C3=BD?= Date: Tue, 8 Oct 2013 17:41:09 +0200 Subject: [PATCH] Added TagLib::MP4::PropertyMap::codec() --- NEWS | 1 + taglib/mp4/mp4properties.cpp | 16 ++++++++++++---- taglib/mp4/mp4properties.h | 9 +++++++++ tests/test_mp4.cpp | 2 ++ 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 6f34d8c4..72d41fba 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ TagLib 1.9.1 (Oct 8, 2013) * Fixed constructing String from ByteVector. * Fixed compilation on MSVC with the /Zc:wchar_t- option. * Fixed detecting of RIFF files with invalid chunk sizes. + * Added TagLib::MP4::PropertyMap::codec(). TagLib 1.9 (Oct 6, 2013) ======================== diff --git a/taglib/mp4/mp4properties.cpp b/taglib/mp4/mp4properties.cpp index 058cc61c..5a41c081 100644 --- a/taglib/mp4/mp4properties.cpp +++ b/taglib/mp4/mp4properties.cpp @@ -34,7 +34,7 @@ using namespace TagLib; class MP4::Properties::PropertiesPrivate { public: - PropertiesPrivate() : length(0), bitrate(0), sampleRate(0), channels(0), bitsPerSample(0), encrypted(false) {} + PropertiesPrivate() : length(0), bitrate(0), sampleRate(0), channels(0), bitsPerSample(0), encrypted(false), codec(MP4::Properties::Unknown) {} int length; int bitrate; @@ -42,6 +42,7 @@ public: int channels; int bitsPerSample; bool encrypted; + Codec codec; }; MP4::Properties::Properties(File *file, MP4::Atoms *atoms, ReadStyle style) @@ -114,6 +115,7 @@ MP4::Properties::Properties(File *file, MP4::Atoms *atoms, ReadStyle style) file->seek(atom->offset); data = file->readBlock(atom->length); if(data.mid(20, 4) == "mp4a") { + d->codec = AAC; d->channels = data.toShort(40U); d->bitsPerSample = data.toShort(42U); d->sampleRate = data.toUInt(46U); @@ -135,10 +137,11 @@ MP4::Properties::Properties(File *file, MP4::Atoms *atoms, ReadStyle style) } else if (data.mid(20, 4) == "alac") { if (atom->length == 88 && data.mid(56, 4) == "alac") { + d->codec = ALAC; d->bitsPerSample = data.at(69); - d->channels = data.at(73); - d->bitrate = data.toUInt(80U) / 1000; - d->sampleRate = data.toUInt(84U); + d->channels = data.at(73); + d->bitrate = data.toUInt(80U) / 1000; + d->sampleRate = data.toUInt(84U); } } @@ -189,3 +192,8 @@ MP4::Properties::isEncrypted() const return d->encrypted; } +MP4::Properties::Codec MP4::Properties::codec() const +{ + return d->codec; +} + diff --git a/taglib/mp4/mp4properties.h b/taglib/mp4/mp4properties.h index 7906824d..2607c366 100644 --- a/taglib/mp4/mp4properties.h +++ b/taglib/mp4/mp4properties.h @@ -40,6 +40,12 @@ namespace TagLib { class TAGLIB_EXPORT Properties : public AudioProperties { public: + enum Codec { + Unknown = 0, + AAC, + ALAC + }; + Properties(File *file, Atoms *atoms, ReadStyle style = Average); virtual ~Properties(); @@ -50,6 +56,9 @@ namespace TagLib { virtual int bitsPerSample() const; bool isEncrypted() const; + //! Audio codec used in the MP4 file + Codec codec() const; + private: class PropertiesPrivate; PropertiesPrivate *d; diff --git a/tests/test_mp4.cpp b/tests/test_mp4.cpp index be7ad2c3..56b60525 100644 --- a/tests/test_mp4.cpp +++ b/tests/test_mp4.cpp @@ -39,6 +39,7 @@ public: CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(16, ((MP4::Properties *)f.audioProperties())->bitsPerSample()); + CPPUNIT_ASSERT_EQUAL(MP4::Properties::AAC, ((MP4::Properties *)f.audioProperties())->codec()); } void testPropertiesALAC() @@ -49,6 +50,7 @@ public: CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(16, ((MP4::Properties *)f.audioProperties())->bitsPerSample()); + CPPUNIT_ASSERT_EQUAL(MP4::Properties::ALAC, ((MP4::Properties *)f.audioProperties())->codec()); } void testCheckValid()