Hello all,

I'm getting further on my way to getting the svn-tree to compile again
on my idiosyncratic setup. Doing this, I had to handle some deprecations
in the mp4 metadata-extraction bits of Melodie. libmp4v2 (version 1.9.0
was relased last thursday, actually [0]) started marking the old
metadata API as deprecated in r231. Porting to the new tags convenience
API was pretty straightforward and I have attached a patch that does
just this in a manner that should not disturb the behaviour with older
versions of the library.
Unfortunately, the header file for the newer versions is no longer mp4.h
but mp4v2/mp4v2.h. So if you are using a newer version, you have to
change that manually. 
As for testing: I still seem to have problems with LanguageKit and
Smalltalk code such as Melodie is crashing on me [1]. So I put the
TLMusicFile class into a little tool and let it chomp on some mp4-files.
So far, everything seems to work as expected.

Cheers,


Niels
--
[0] http://code.google.com/p/mp4v2/
[1] I still need to take a systematic look at this one, but I'll keep
    you updated as soon as I get to it.
Index: Services/User/Melodie/TLMusicFile.m
===================================================================
--- Services/User/Melodie/TLMusicFile.m	(revision 4681)
+++ Services/User/Melodie/TLMusicFile.m	(working copy)
@@ -36,15 +36,39 @@
 
 
 #include <tag_c.h>
+
+//Newer versions need #include<mp4v2/mp4v2.h>.
 #include <mp4.h>
+
+/* 
+ * Since rev 231 the MP4(Get|Set)Metadata* functions are considered
+ * as deprecated. The tags convenience API shall be used instead.
+ */
+#if defined MP4V2_PROJECT_repo_rev && MP4V2_PROJECT_repo_rev >=  231
+	#define USE_MP4V2_TAGS_CONVENIENCE_API
+#else
+	#define USE_MP4V2_METADATA_API
+#endif
+
 #import "TLMusicFile.h"
 
 @implementation TLMusicFile
 
+
+#ifdef USE_MP4V2_METADATA_API
 #define MP4_GET_STRING(var, name) if(MP4GetMetadata ## name(hFile, &value))\
 {\
 	ASSIGN(var, [NSString stringWithUTF8String:value]);\
 }
+#endif
+
+#ifdef USE_MP4V2_TAGS_CONVENIENCE_API
+#define MP4_GET_STRING(var, name) if(tags->name)\
+{\
+	ASSIGN(var, [NSString stringWithUTF8String:tags->name]);\
+}
+#endif
+
 - (BOOL) mp4ReadTagsForFile: (NSString*) aPath
 {
 	MP4FileHandle hFile = MP4Read([aPath UTF8String], 0);
@@ -52,6 +76,8 @@
 	{
 		return NO;
 	}
+
+	#ifdef USE_MP4V2_METADATA_API
 	char *value = NULL;
 	MP4_GET_STRING(album, Album)
 	MP4_GET_STRING(title, Name)
@@ -79,7 +105,59 @@
 		if (cover != nil)
 			hasCover = YES;
 	} */
+	#endif
+	
+	#ifdef USE_MP4V2_TAGS_CONVENIENCE_API
+	/* Allocate a tag-structure */
+	const MP4Tags* tags = MP4TagsAlloc();
 
+	/* Populate it */
+	MP4TagsFetch(tags, hFile);
+	
+	MP4_GET_STRING(album, album)
+	MP4_GET_STRING(title, name)
+	MP4_GET_STRING(artist, artist)
+	MP4_GET_STRING(comment, comments)
+	MP4_GET_STRING(genre, genre)
+	if (tags->track) 
+	{
+		if (tags->track->index) 
+		{
+			track = tags->track->index;
+		}
+		if (tags->track->total)
+		{
+			totalTracks = tags->track->total;
+		}
+	}
+	if (tags->releaseDate)
+	{
+		year = strtol(tags->releaseDate, NULL, 10);
+	}
+	
+	/*
+	 * FIXME: There can be more than one artwork. The number is stored in 
+	 * tags->artworkCount and each successive artwork seems to be accessed
+	 * by incrementing the pointer returned by tags->artwork.
+	 * Cf. examples/itmf/tags.c in libmp4v2. 
+	 */
+        if (tags->artwork)
+	{
+		// FIXME: probably can use dataWithBytesNoCopy
+		cover = [[NSImage alloc] initWithData:
+		            [NSData dataWithBytes: tags->artwork->data
+		                           length: tags->artwork->size]];
+		if (cover != nil)
+		{
+			hasCover = YES;
+		}
+	}
+
+
+	/* Free the memory allocated for the tag-structure. */
+	MP4TagsFree(tags);
+	#endif
+	
 	MP4Close(hFile);
 	return YES;
 }
_______________________________________________
Etoile-dev mailing list
Etoile-dev@gna.org
https://mail.gna.org/listinfo/etoile-dev

Reply via email to