|
|
|
@ -23,6 +23,8 @@ email : aumuell@reserv.at
|
|
|
|
|
* MA 02110-1301 USA *
|
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
|
|
#include "mp4file.h"
|
|
|
|
|
|
|
|
|
|
#include "mp4tag.h"
|
|
|
|
@ -34,7 +36,11 @@ email : aumuell@reserv.at
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_MP4V2_H
|
|
|
|
|
#define USE_ITMF_TAGS
|
|
|
|
|
#else
|
|
|
|
|
#define MP4V2_HAS_WRITE_BUG 1
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
namespace TagLib {
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
@ -102,6 +108,11 @@ bool MP4::File::save()
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef USE_ITMF_TAGS
|
|
|
|
|
const MP4Tags* filetags = MP4TagsAlloc();
|
|
|
|
|
MP4TagsFetch(filetags, handle);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef MP4V2_HAS_WRITE_BUG
|
|
|
|
|
/* according to gtkpod we have to delete all meta data before modifying it,
|
|
|
|
|
save the stuff we would not touch */
|
|
|
|
@ -117,7 +128,14 @@ bool MP4::File::save()
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef USE_ITMF_TAGS
|
|
|
|
|
MP4TagsSetName(filetags, mp4tag->title().isNull() ? "" : mp4tag->title().toCString(true));
|
|
|
|
|
MP4TagsSetArtist(filetags, mp4tag->artist().isNull() ? "" : mp4tag->artist().toCString(true));
|
|
|
|
|
MP4TagsSetAlbum(filetags, mp4tag->album().isNull() ? "" : mp4tag->album().toCString(true));
|
|
|
|
|
MP4TagsSetComments(filetags, mp4tag->comment().isNull() ? "" : mp4tag->comment().toCString(true));
|
|
|
|
|
MP4TagsSetGenre(filetags, mp4tag->genre().isNull() ? "" : mp4tag->genre().toCString(true));
|
|
|
|
|
MP4TagsSetComposer(filetags, mp4tag->composer().isNull() ? "" : mp4tag->composer().toCString(true));
|
|
|
|
|
#else
|
|
|
|
|
#define setmeta(val, tag) \
|
|
|
|
|
if(mp4tag->val().isNull()) { \
|
|
|
|
|
/*MP4DeleteMetadata##tag(handle);*/ \
|
|
|
|
@ -125,27 +143,65 @@ bool MP4::File::save()
|
|
|
|
|
} else { \
|
|
|
|
|
MP4SetMetadata##tag(handle, mp4tag->val().toCString(true)); \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setmeta(title, Name);
|
|
|
|
|
setmeta(artist, Artist);
|
|
|
|
|
setmeta(album, Album);
|
|
|
|
|
setmeta(comment, Comment);
|
|
|
|
|
setmeta(genre, Genre);
|
|
|
|
|
setmeta(composer, Writer);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
char buf[100] = "";
|
|
|
|
|
if(mp4tag->year())
|
|
|
|
|
snprintf(buf, sizeof(buf), "%u", mp4tag->year());
|
|
|
|
|
#ifdef USE_ITMF_TAGS
|
|
|
|
|
MP4TagsSetReleaseDate(filetags, buf);
|
|
|
|
|
#else
|
|
|
|
|
MP4SetMetadataYear(handle, buf);
|
|
|
|
|
#endif
|
|
|
|
|
u_int16_t t1, t2;
|
|
|
|
|
|
|
|
|
|
#ifdef USE_ITMF_TAGS
|
|
|
|
|
MP4TagTrack track = *filetags->track;
|
|
|
|
|
track.index = t1;
|
|
|
|
|
MP4TagsSetTrack(filetags, &track);
|
|
|
|
|
#else
|
|
|
|
|
MP4GetMetadataTrack(handle, &t1, &t2);
|
|
|
|
|
MP4SetMetadataTrack(handle, mp4tag->track(), t2);
|
|
|
|
|
if(mp4tag->bpm() != 0)
|
|
|
|
|
#endif
|
|
|
|
|
if(mp4tag->bpm() != 0) {
|
|
|
|
|
#ifdef USE_ITMF_TAGS
|
|
|
|
|
u_int16_t tempo = mp4tag->bpm();
|
|
|
|
|
MP4TagsSetTempo(filetags, &tempo);
|
|
|
|
|
#else
|
|
|
|
|
MP4SetMetadataTempo(handle, mp4tag->bpm());
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
if(mp4tag->compilation() != MP4::Tag::Undefined) {
|
|
|
|
|
#ifdef USE_ITMF_TAGS
|
|
|
|
|
u_int8_t compilation = mp4tag->compilation();
|
|
|
|
|
MP4TagsSetCompilation(filetags, &compilation);
|
|
|
|
|
#else
|
|
|
|
|
MP4SetMetadataCompilation(handle, mp4tag->compilation());
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef USE_ITMF_TAGS
|
|
|
|
|
if(mp4tag->cover().size()) {
|
|
|
|
|
MP4TagArtwork art;
|
|
|
|
|
art.size = mp4tag->cover().size();
|
|
|
|
|
art.data = mp4tag->cover().size() ? const_cast<u_int8_t *>( reinterpret_cast<const u_int8_t *>( mp4tag->cover().data() ) ) : 0;
|
|
|
|
|
art.type = MP4_ART_UNDEFINED; // delegate typing to libmp4v2
|
|
|
|
|
if(filetags->artworkCount > 0) {
|
|
|
|
|
MP4TagsSetArtwork(filetags, 0, &art);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
MP4TagsAddArtwork(filetags, &art);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
MP4SetMetadataCoverArt(handle, mp4tag->cover().size() ? const_cast<u_int8_t *>( reinterpret_cast<const u_int8_t *>( mp4tag->cover().data() ) ) : 0, mp4tag->cover().size());
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef MP4V2_HAS_WRITE_BUG
|
|
|
|
|
// set the saved data again
|
|
|
|
@ -159,6 +215,10 @@ bool MP4::File::save()
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef USE_ITMF_TAGS
|
|
|
|
|
MP4TagsStore(filetags, handle);
|
|
|
|
|
MP4TagsFree(filetags);
|
|
|
|
|
#endif
|
|
|
|
|
MP4Close(handle);
|
|
|
|
|
|
|
|
|
|
mp4file = MP4Read(name());
|
|
|
|
|