Index: configure.in =================================================================== RCS file: /cvs/gnome/muine/configure.in,v retrieving revision 1.102 diff -a -u -r1.102 configure.in --- configure.in 10 Jan 2005 17:59:26 -0000 1.102 +++ configure.in 15 Jan 2005 04:42:14 -0000 @@ -97,6 +97,10 @@ AC_CHECK_HEADER(FLAC/all.h, FLAC_LIBS="-lFLAC", AC_MSG_ERROR(You need FLAC)) AC_SUBST(FLAC_LIBS) +dnl Check for FAAD +AC_CHECK_HEADER(mp4.h, FAAD_LIBS="-lmp4v2", AC_MSG_ERROR(You need faad2)) +AC_SUBST(FAAD_LIBS) + dnl Check for Mono AC_PATH_PROG(MCS, mcs) AC_PATH_PROG(MONO, mono) Index: libmuine/Makefile.am =================================================================== RCS file: /cvs/gnome/muine/libmuine/Makefile.am,v retrieving revision 1.14 diff -a -u -r1.14 Makefile.am --- libmuine/Makefile.am 6 Jan 2005 11:04:24 -0000 1.14 +++ libmuine/Makefile.am 15 Jan 2005 04:42:17 -0000 @@ -52,4 +52,4 @@ mm-keys.c \ mm-keys.h -libmuine_la_LIBADD = id3-vfs/libid3-vfs.la egg/libegg.la $(MUINE_LIBS) $(OGG_LIBS) $(VORBIS_LIBS) $(VORBISFILE_LIBS) $(GDBM_LIBS) $(ID3TAG_LIBS) $(FLAC_LIBS) +libmuine_la_LIBADD = id3-vfs/libid3-vfs.la egg/libegg.la $(MUINE_LIBS) $(OGG_LIBS) $(VORBIS_LIBS) $(VORBISFILE_LIBS) $(GDBM_LIBS) $(ID3TAG_LIBS) $(FLAC_LIBS) $(FAAD_LIBS) Index: libmuine/metadata.c =================================================================== RCS file: /cvs/gnome/muine/libmuine/metadata.c,v retrieving revision 1.14 diff -a -u -r1.14 metadata.c --- libmuine/metadata.c 26 Dec 2004 11:00:28 -0000 1.14 +++ libmuine/metadata.c 15 Jan 2005 04:42:17 -0000 @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -373,6 +374,80 @@ return metadata; } +static Metadata * +assign_metadata_mp4 (const char *filename, + char **error_message_return) +{ + Metadata *m = NULL; + MP4FileHandle mp4_file_handle; + MP4TrackId mp4_track_id; + const char *mp4_track_type; + + mp4_file_handle = MP4Read(filename, 0); + if (mp4_file_handle == MP4_INVALID_FILE_HANDLE) + { + *error_message_return = g_strdup("Unable to open m4a file!"); + return NULL; + } + + mp4_track_id = MP4FindTrackId(mp4_file_handle, 0, NULL, 0); + mp4_track_type = MP4GetTrackType(mp4_file_handle, mp4_track_id); + + if (mp4_track_type && (strcmp(mp4_track_type, MP4_AUDIO_TRACK_TYPE) == 0)) + { + gchar *value; + guint16 numval, numval2; + MP4Duration mp4_duration; + m = g_new0 (Metadata, 1); + + if (MP4GetMetadataName(mp4_file_handle, &value) && value != NULL) + { + m->title = g_strdup(value); + g_free(value); + } + if (MP4GetMetadataArtist(mp4_file_handle, &value) && value != NULL) + { + m->artists = g_new (char *, 1); + m->artists[0] = g_strdup(value); + m->artists_count = 1; + g_free(value); + } + if (MP4GetMetadataYear(mp4_file_handle, &value) && value != NULL) + { + m->year = g_strdup(value); + g_free(value); + } + if (MP4GetMetadataAlbum(mp4_file_handle, &value) && value != NULL) + { + m->album = g_strdup(value); + g_free(value); + } + if (MP4GetMetadataTrack(mp4_file_handle, &numval, &numval2) && value != NULL) + { + m->track_number = numval; + } + if (MP4GetMetadataDisk(mp4_file_handle, &numval, &numval2) && value != NULL) + { + m->disc_number = numval; + } + mp4_duration = MP4GetTrackDuration (mp4_file_handle, mp4_track_id); + m->duration = + (int)MP4ConvertFromTrackDuration(mp4_file_handle, + mp4_track_id, + mp4_duration, + MP4_SECONDS_TIME_SCALE); + + } + else + { + *error_message_return = g_strdup ("Not an AAC music file"); + } + + MP4Close (mp4_file_handle); + + return m; +} + static ov_callbacks file_info_callbacks = { ogg_helper_read, @@ -693,6 +768,9 @@ else if (!strcmp (info->mime_type, "application/x-flac") || !strcmp (info->mime_type, "audio/x-flac")) m = assign_metadata_flac (escaped, error_message_return); + else if (!strcmp (info->mime_type, "application/x-m4a") || + !strcmp (info->mime_type, "audio/x-m4a")) + m = assign_metadata_mp4 (filename, error_message_return); else *error_message_return = g_strdup ("Unknown format");