r1422 - in trunk: Metadata Tasks/EncoderTasks

7 views
Skip to first unread message

noti...@svn.sbooth.org

unread,
Sep 17, 2009, 10:26:08 PM9/17/09
to max-c...@googlegroups.com
Author: stephen_booth
Date: 2009-09-17 19:26:08 -0700 (Thu, 17 Sep 2009)
New Revision: 1422

Modified:
trunk/Metadata/AudioMetadata.mm
trunk/Tasks/EncoderTasks/CoreAudioEncoderTask.mm
Log:
Updated for mp4v2


Modified: trunk/Metadata/AudioMetadata.mm
===================================================================
--- trunk/Metadata/AudioMetadata.mm 2009-09-17 22:16:36 UTC (rev 1421)
+++ trunk/Metadata/AudioMetadata.mm 2009-09-18 02:26:08 UTC (rev 1422)
@@ -38,7 +38,7 @@
#include <taglib/aifffile.h> // TagLib::RIFF:AIFF::File
#include <taglib/wavfile.h> // TagLib::RIFF:WAVE::File

-#include <mp4v2/mp4.h> // MP4FileHandle
+#include <mp4v2/mp4v2.h> // MP4FileHandle

#include <mac/All.h>
#include <mac/MACLib.h>
@@ -707,81 +707,80 @@
MP4FileHandle mp4FileHandle = MP4Read([filename fileSystemRepresentation], 0);

if(MP4_INVALID_FILE_HANDLE != mp4FileHandle) {
- char *s = NULL;
- u_int16_t trackNumber, totalTracks;
- u_int16_t discNumber, discTotal;
- u_int8_t compilation;
- u_int64_t duration;
- u_int32_t artCount;
- u_int8_t *bytes = NULL;
- u_int32_t length = 0;
+ // Read the tags
+ const MP4Tags *tags = MP4TagsAlloc();
+ if(NULL == tags) {
+ [result release];
+ MP4Close(mp4FileHandle);
+ return nil;
+ }

+ MP4TagsFetch(tags, mp4FileHandle);
+
// Album title
- MP4GetMetadataAlbum(mp4FileHandle, &s);
- if(NULL != s)
- [result setAlbumTitle:[NSString stringWithUTF8String:s]];
-
+ if(tags->album)
+ [result setAlbumTitle:[NSString stringWithUTF8String:tags->album]];
+
// Artist
- MP4GetMetadataArtist(mp4FileHandle, &s);
- if(NULL != s)
- [result setAlbumArtist:[NSString stringWithUTF8String:s]];
+ if(tags->albumArtist)
+ [result setAlbumArtist:[NSString stringWithUTF8String:tags->albumArtist]];
+ else if(tags->artist)
+ [result setAlbumArtist:[NSString stringWithUTF8String:tags->artist]];

// Genre
- MP4GetMetadataGenre(mp4FileHandle, &s);
- if(NULL != s)
- [result setAlbumGenre:[NSString stringWithUTF8String:s]];
+ if(tags->genre)
+ [result setAlbumGenre:[NSString stringWithUTF8String:tags->genre]];

// Year
- MP4GetMetadataYear(mp4FileHandle, &s);
- if(NULL != s)
- [result setAlbumDate:[NSString stringWithUTF8String:s]];
+ if(tags->releaseDate)
+ [result setAlbumDate:[NSString stringWithUTF8String:tags->releaseDate]];

// Composer
- MP4GetMetadataWriter(mp4FileHandle, &s);
- if(NULL != s)
- [result setAlbumComposer:[NSString stringWithUTF8String:s]];
+ if(tags->composer)
+ [result setAlbumComposer:[NSString stringWithUTF8String:tags->composer]];

// Comment
- MP4GetMetadataComment(mp4FileHandle, &s);
- if(NULL != s)
- [result setAlbumComment:[NSString stringWithUTF8String:s]];
+ if(tags->comments)
+ [result setAlbumComment:[NSString stringWithUTF8String:tags->comments]];

// Track title
- MP4GetMetadataName(mp4FileHandle, &s);
- if(NULL != s)
- [result setTrackTitle:[NSString stringWithUTF8String:s]];
+ if(tags->name)
+ [result setTrackTitle:[NSString stringWithUTF8String:tags->name]];

// Track number
- MP4GetMetadataTrack(mp4FileHandle, &trackNumber, &totalTracks);
- if(0 != trackNumber)
- [result setTrackNumber:[NSNumber numberWithInt:trackNumber]];
- if(0 != totalTracks)
- [result setTrackTotal:[NSNumber numberWithInt:totalTracks]];
+ if(tags->track) {
+ if(tags->track->index)
+ [result setTrackNumber:[NSNumber numberWithUnsignedShort:tags->track->index]];
+ if(tags->track->total)
+ [result setTrackTotal:[NSNumber numberWithUnsignedShort:tags->track->total]];
+ }

// Disc number
- MP4GetMetadataDisk(mp4FileHandle, &discNumber, &discTotal);
- if(0 != discNumber)
- [result setDiscNumber:[NSNumber numberWithInt:discNumber]];
- if(0 != discTotal)
- [result setDiscTotal:[NSNumber numberWithInt:discTotal]];
+ if(tags->disk) {
+ if(tags->disk->index)
+ [result setDiscNumber:[NSNumber numberWithUnsignedShort:tags->disk->index]];
+ if(tags->disk->total)
+ [result setDiscTotal:[NSNumber numberWithUnsignedShort:tags->disk->total]];
+ }

// Compilation
- MP4GetMetadataCompilation(mp4FileHandle, &compilation);
- if(compilation)
- [result setCompilation:[NSNumber numberWithBool:YES]];
+ if(tags->compilation)
+ [result setCompilation:[NSNumber numberWithBool:*(tags->compilation)]];

// Length
- duration = MP4GetDuration(mp4FileHandle);
- if(0 != duration)
- [result setLength:[NSNumber numberWithUnsignedLong:(duration / MP4GetTimeScale(mp4FileHandle))]];
+ MP4Duration duration = MP4GetDuration(mp4FileHandle);
+ uint32_t timeScale = MP4GetTimeScale(mp4FileHandle);
+ if(duration)
+ [result setLength:[NSNumber numberWithUnsignedLong:(duration / timeScale)]];

// Album art
- artCount = MP4GetMetadataCoverArtCount(mp4FileHandle);
- if(0 < artCount) {
- MP4GetMetadataCoverArt(mp4FileHandle, &bytes, &length);
- [result setAlbumArt:[[[NSImage alloc] initWithData:[NSData dataWithBytes:bytes length:length]] autorelease]];
+ if(tags->artworkCount) {
+ MP4TagArtwork artwork = (tags->artwork)[0];
+ NSData *artworkData = [NSData dataWithBytes:artwork.data length:artwork.size];
+ [result setAlbumArt:[[[NSImage alloc] initWithData:artworkData] autorelease]];
}

+ MP4TagsFree(tags);
MP4Close(mp4FileHandle);
}

Modified: trunk/Tasks/EncoderTasks/CoreAudioEncoderTask.mm
===================================================================
--- trunk/Tasks/EncoderTasks/CoreAudioEncoderTask.mm 2009-09-17 22:16:36 UTC (rev 1421)
+++ trunk/Tasks/EncoderTasks/CoreAudioEncoderTask.mm 2009-09-18 02:26:08 UTC (rev 1422)
@@ -28,7 +28,7 @@
#include <AudioToolbox/AudioFile.h>
#include <AudioToolbox/AudioFormat.h>

-#include <mp4v2/mp4.h>
+#include <mp4v2/mp4v2.h>

#include <taglib/aifffile.h>
#include <taglib/wavfile.h>
@@ -256,32 +256,42 @@
NSData *data = nil;
NSString *tempFilename = NULL;

- mp4FileHandle = MP4Modify([[self outputFilename] fileSystemRepresentation], 0, 0);
+ // Open the file for modification
+ mp4FileHandle = MP4Modify([[self outputFilename] fileSystemRepresentation], MP4_DETAILS_ERROR, 0);
NSAssert(MP4_INVALID_FILE_HANDLE != mp4FileHandle, NSLocalizedStringFromTable(@"Unable to open the output file for tagging.", @"Exceptions", @""));

+ // Read the tags
+ const MP4Tags *tags = MP4TagsAlloc();
+ if(NULL == tags) {
+ MP4Close(mp4FileHandle);
+ return;
+ }
+
+ MP4TagsFetch(tags, mp4FileHandle);
+
// Album title
album = [metadata albumTitle];
if(nil != album)
- MP4SetMetadataAlbum(mp4FileHandle, [album UTF8String]);
+ MP4TagsSetAlbum(tags, [album UTF8String]);

// Artist
artist = [metadata trackArtist];
if(nil == artist)
artist = [metadata albumArtist];
if(nil != artist)
- MP4SetMetadataArtist(mp4FileHandle, [artist UTF8String]);
+ MP4TagsSetArtist(tags, [artist UTF8String]);

// Album artist
albumArtist = [metadata albumArtist];
if(nil != albumArtist)
- MP4SetMetadataAlbumArtist(mp4FileHandle, [albumArtist UTF8String]);
+ MP4TagsSetAlbumArtist(tags, [albumArtist UTF8String]);

// Composer
composer = [metadata trackComposer];
if(nil == composer)
composer = [metadata albumComposer];
if(nil != composer)
- MP4SetMetadataWriter(mp4FileHandle, [composer UTF8String]);
+ MP4TagsSetComposer(tags, [composer UTF8String]);

// Genre
if(nil != [[self taskInfo] inputTracks] && 1 == [[[self taskInfo] inputTracks] count])
@@ -289,14 +299,14 @@
if(nil == genre)
genre = [metadata albumGenre];
if(nil != genre)
- MP4SetMetadataGenre(mp4FileHandle, [genre UTF8String]);
+ MP4TagsSetGenre(tags, [genre UTF8String]);

// Year
year = [metadata trackDate];
if(nil == year)
year = [metadata albumDate];
if(nil != year)
- MP4SetMetadataYear(mp4FileHandle, [year UTF8String]);
+ MP4TagsSetReleaseDate(tags, [year UTF8String]);

// Comment
comment = [metadata albumComment];
@@ -306,53 +316,71 @@
if([[[[self taskInfo] settings] objectForKey:@"saveSettingsInComment"] boolValue])
comment = (nil == comment ? [self encoderSettingsString] : [NSString stringWithFormat:@"%@\n%@", comment, [self encoderSettingsString]]);
if(nil != comment)
- MP4SetMetadataComment(mp4FileHandle, [comment UTF8String]);
+ MP4TagsSetComments(tags, [comment UTF8String]);

// Track title
title = [metadata trackTitle];
if(nil != title)
- MP4SetMetadataName(mp4FileHandle, [title UTF8String]);
+ MP4TagsSetName(tags, [title UTF8String]);

// Track number
trackNumber = [metadata trackNumber];
trackTotal = [metadata trackTotal];
- if(nil != trackNumber && nil != trackTotal)
- MP4SetMetadataTrack(mp4FileHandle, [trackNumber intValue], [trackTotal intValue]);
+ MP4TagTrack trackInfo = { 0, 0 };
+ if(nil != trackNumber && nil != trackTotal) {
+ trackInfo.index = [trackNumber unsignedShortValue];
+ trackInfo.total = [trackTotal unsignedShortValue];
+ }
else if(nil != trackNumber)
- MP4SetMetadataTrack(mp4FileHandle, [trackNumber intValue], 0);
- else if(0 != trackTotal)
- MP4SetMetadataTrack(mp4FileHandle, 0, [trackTotal intValue]);
+ trackInfo.index = [trackNumber unsignedShortValue];
+ else if(nil != trackTotal)
+ trackInfo.total = [trackTotal unsignedShortValue];
+ MP4TagsSetTrack(tags, &trackInfo);

// Disc number
discNumber = [metadata discNumber];
discTotal = [metadata discTotal];
- if(nil != discNumber && nil != discTotal)
- MP4SetMetadataDisk(mp4FileHandle, [discNumber intValue], [discTotal intValue]);
- else if(0 != discNumber)
- MP4SetMetadataDisk(mp4FileHandle, [discNumber intValue], 0);
- else if(0 != discTotal)
- MP4SetMetadataDisk(mp4FileHandle, 0, [discTotal intValue]);
+ MP4TagDisk discInfo = { 0, 0 };
+ if(nil != discNumber && nil != discTotal) {
+ discInfo.index = [discNumber unsignedShortValue];
+ discInfo.total = [discTotal unsignedShortValue];
+ }
+ else if(nil != discNumber)
+ discInfo.index = [discNumber unsignedShortValue];
+ else if(nil != discTotal)
+ discInfo.total = [discTotal unsignedShortValue];
+ MP4TagsSetDisk(tags, &discInfo);

// Compilation
compilation = [metadata compilation];
if(nil != compilation) {
- MP4SetMetadataCompilation(mp4FileHandle, [compilation boolValue]);
+ u_int8_t isCompilation = [compilation boolValue];
+ MP4TagsSetCompilation(tags, &isCompilation);
}

// Album art
albumArt = [metadata albumArt];
if(nil != albumArt) {
- data = getPNGDataForImage(albumArt);
- MP4SetMetadataCoverArt(mp4FileHandle, (u_int8_t *)[data bytes], [data length]);
+ data = getPNGDataForImage(albumArt);
+
+ MP4TagArtwork artwork;
+ artwork.data = (void *)[data bytes];
+ artwork.size = [data length];
+ artwork.type = MP4_ART_PNG;
+
+ MP4TagsAddArtwork(tags, &artwork);
}

// Encoded by
bundleVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
versionString = [NSString stringWithFormat:@"Max %@", bundleVersion];
- MP4SetMetadataTool(mp4FileHandle, [versionString UTF8String]);
+ MP4TagsSetEncodedBy(tags, [versionString UTF8String]);

- MP4Close(mp4FileHandle);
-
+ // Save our changes
+ MP4TagsStore(tags, mp4FileHandle);
+ MP4TagsFree(tags);
+ MP4Close(mp4FileHandle);
+#if 0
// Optimize the atoms so the MP4 files will play on shared iTunes libraries
// mp4v2 creates a temp file in ., so use a custom file and manually rename it
tempFilename = generateTemporaryFilename([[[self taskInfo] settings] objectForKey:@"temporaryDirectory"], [self fileExtension]);
@@ -373,6 +401,7 @@
else {
[[LogController sharedController] logMessage:[NSString stringWithFormat:NSLocalizedStringFromTable(@"Unable to optimize file: %@", @"General", @""), [[NSFileManager defaultManager] displayNameAtPath:[self outputFilename]]]];
}
+#endif
}

-(void) writeAIFFTags

Reply all
Reply to author
Forward
0 new messages