Skip to content

Commit

Permalink
More options for MP4 file customization
Browse files Browse the repository at this point in the history
- Add own property for album
- Add gapless play option
- Add trackno/total tracks options
  • Loading branch information
gonzoua committed Jul 21, 2010
1 parent f8bea98 commit 27a4b2d
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 11 deletions.
2 changes: 2 additions & 0 deletions MP4Atom.h
Expand Up @@ -27,8 +27,10 @@

#import <Cocoa/Cocoa.h>

#define ITUNES_METADATA_IMPLICIT_CLASS 0x00
#define ITUNES_METADATA_STRING_CLASS 0x01
#define ITUNES_METADATA_IMAGE_CLASS 0x0e
#define ITUNES_METADATA_UINT8_CLASS 0x15

@interface MP4Atom : NSObject {
NSString *name;
Expand Down
6 changes: 6 additions & 0 deletions MP4File.h
Expand Up @@ -33,12 +33,18 @@
NSFileHandle *_fh;
NSString *artist;
NSString *title;
NSString *album;
NSString *coverFile;
unsigned short track, tracksTotal;
BOOL gaplessPlay;
}

@property (readwrite, copy) NSString *artist;
@property (readwrite, copy) NSString *album;
@property (readwrite, copy) NSString *title;
@property (readwrite, copy) NSString *coverFile;
@property (readwrite, assign) unsigned short track, tracksTotal;
@property (readwrite, assign) BOOL gaplessPlay;

-(void) dealloc;
-(id) initWithFileName: (NSString*)fileName;
Expand Down
47 changes: 36 additions & 11 deletions MP4File.m
Expand Up @@ -34,18 +34,22 @@

@implementation MP4File

@synthesize artist;
@synthesize title;
@synthesize coverFile;
@synthesize artist, album, title, coverFile;
@synthesize track, tracksTotal, gaplessPlay;


-(id) initWithFileName: (NSString*)fileName
{
[super init];

_fh = [NSFileHandle fileHandleForUpdatingAtPath:fileName];
self.artist = nil;
self.album = nil;
self.title = nil;
self.coverFile = nil;

track = tracksTotal = 0;
gaplessPlay = NO;

UInt64 pos = 0;
NSData *buffer;
Expand Down Expand Up @@ -142,21 +146,41 @@ -(BOOL) updateFile

NSMutableData *newAtomsData = [[NSMutableData alloc] init];
if (title != nil)
{
[newAtomsData appendData:[self encodeMetaDataAtom:@"©nam"
value:[title dataUsingEncoding:NSUTF8StringEncoding]
type:ITUNES_METADATA_STRING_CLASS]];

if (album != nil)
[newAtomsData appendData:[self encodeMetaDataAtom:@"©alb"
value:[title dataUsingEncoding:NSUTF8StringEncoding]
type:ITUNES_METADATA_STRING_CLASS]];
}

value:[album dataUsingEncoding:NSUTF8StringEncoding]
type:ITUNES_METADATA_STRING_CLASS]];
if (artist != nil)
[newAtomsData appendData:[self encodeMetaDataAtom:@"©ART"
value:[artist dataUsingEncoding:NSUTF8StringEncoding]
type:ITUNES_METADATA_STRING_CLASS]];


if (track) {
short bytes[4];
bytes[0] = bytes[3] = 0;
bytes[1] = htons(track);
bytes[2] = htons(tracksTotal);
NSData * data = [[NSData alloc] initWithBytes:bytes length:8];
[newAtomsData appendData:[self encodeMetaDataAtom:@"trkn"
value:data
type:ITUNES_METADATA_IMPLICIT_CLASS]];
[data release];
}

if (gaplessPlay) {
char pgap = 1;
NSData * data = [[NSData alloc] initWithBytes:&pgap length:1];
[newAtomsData appendData:[self encodeMetaDataAtom:@"pgap"
value:data
type:ITUNES_METADATA_UINT8_CLASS]];
[data release];
}

[newAtomsData appendData:[self encodeMetaDataAtom:@"©gen"
value:[@"Audiobooks" dataUsingEncoding:NSUTF8StringEncoding]
type:ITUNES_METADATA_STRING_CLASS]];
Expand Down Expand Up @@ -262,7 +286,8 @@ -(void) fixupAtom: (MP4Atom*)atom
* Encode iTunes metadata atoms
*/
-(NSData*) encodeMetaDataAtom: (NSString*)name value:(NSData*)value
type:(UInt32) type;
type:(UInt32)type

{
UInt32 dataAtomSize =
[value length] +
Expand All @@ -274,8 +299,8 @@ -(NSData*) encodeMetaDataAtom: (NSString*)name value:(NSData*)value
andLength:dataAtomSize];
[data appendData:[dataAtom encode]];
// version and flags
UInt32 flags = htonl(type);
[data appendBytes:&flags length:4];
type = htonl(type);
[data appendBytes:&type length:4];
// null data
UInt32 zeroData = 0;
[data appendBytes:&zeroData length:4];
Expand Down

0 comments on commit 27a4b2d

Please sign in to comment.