From c6c5ce1612c4b6ccc00b715ba41bc32018ac9cb1 Mon Sep 17 00:00:00 2001 From: Kevin Chabowski Date: Sun, 28 Oct 2012 13:15:18 +0100 Subject: [PATCH 12/16] New function: himd_add:mp3_track_info Creates fragment descriptor and track entry for an mp3 track. --- himdcli/himdcli.c | 70 ++++------------------------------------------------ libhimd/himd.h | 2 ++ libhimd/trackindex.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 72 insertions(+), 66 deletions(-) diff --git a/himdcli/himdcli.c b/himdcli/himdcli.c index 6550434..fc28764 100644 --- a/himdcli/himdcli.c +++ b/himdcli/himdcli.c @@ -350,7 +350,6 @@ void himd_writemp3(struct himd *h, const char *filepath) unsigned long mp3size; gchar * mp3buffer; gchar * artist=NULL, * title=NULL, * album=NULL; - int i; unsigned char cid[20]; unsigned char mp3codecinfo[3]; @@ -374,10 +373,10 @@ void himd_writemp3(struct himd *h, const char *filepath) idx_track = himd_get_free_trackindex(h); if(himd_obtain_mp3key(h, idx_track, &key, &status) < 0) - { - printf("Cannot obtain mp3key\n"); - exit(1); - } + { + printf("Cannot obtain mp3key\n"); + exit(1); + } // END: Get track-key // @@ -398,66 +397,7 @@ void himd_writemp3(struct himd *h, const char *filepath) himd_writestream_close(&write_stream); // END: Write blocks to ATDATA - // - // Calculate blocknumber of the last written block - // - last_blockno = first_blockno + nblocks-1; - - // - // Add fragment descriptor, get back fragment number - // - struct fraginfo fragment; - gint idx_frag; - - fragment.firstblock = first_blockno; - fragment.lastblock = last_blockno; - memset(&fragment.key[0], 0, 8); /* use zero key on mp3 files */ - fragment.firstframe = 0; - fragment.lastframe = nframes; - fragment.fragtype = 1; - fragment.nextfrag = 0; - - idx_frag = himd_add_fragment_info(h, &fragment, &status); - // END: Add fragment - - // - // Add track descriptor, get trackno back. - // - struct trackinfo track; - - memset(&track.key, 0, 8); /* use zero key on mp3 files */ - track.title = 0; /* We'll set title, artist and album later */ - track.artist = 0; - track.album = 0; - track.firstfrag = idx_frag; - track.tracknum = 1; - track.ekbnum = 0; - track.trackinalbum = 1; - track.codec_info.codec_id = CODEC_ATRAC3PLUS_OR_MPEG; - track.seconds = seconds; - - track.codec_info.codecinfo[0] = 3; - track.codec_info.codecinfo[1] = 0; - track.codec_info.codecinfo[2] = mp3codecinfo[0]; - track.codec_info.codecinfo[3] = mp3codecinfo[1]; - track.codec_info.codecinfo[4] = mp3codecinfo[2]; - - memset(&track.mac, 0, 8); - memcpy(&track.contentid, cid, 20); - memset(&track.recordingtime, 0, sizeof(struct tm)); - memset(&track.licensestarttime, 0, sizeof(struct tm)); - memset(&track.licenseendtime, 0, sizeof(struct tm)); - - /* set DRM stuff correctly for compatibility reasons */ - track.lt = 0x10; - track.dest = 1; - track.xcc = 1; - track.ct = 0; - track.cc = 0x40; - track.cn = 0; - - idx_track = himd_add_track_info(h, &track, &status); - // END: Add track descriptor + idx_track = himd_add_mp3_track_info(h, first_blockno, nblocks, nframes, seconds, mp3codecinfo, cid, &status); // // Set track labels diff --git a/libhimd/himd.h b/libhimd/himd.h index 95d193a..4bc0745 100644 --- a/libhimd/himd.h +++ b/libhimd/himd.h @@ -202,6 +202,8 @@ int himd_add_fragment_info(struct himd * himd, struct fraginfo * f, struct himde unsigned int himd_trackinfo_framesperblock(const struct trackinfo * track); void himd_create_content_id(unsigned char* cid); +gint himd_add_mp3_track_info(struct himd * himd, unsigned int first_blockno, gint nblocks, gint nframes, + int seconds, unsigned char * mp3codecinfo, unsigned char *cid, struct himderrinfo * status); typedef unsigned char mp3key[4]; int himd_obtain_mp3key(struct himd * himd, int track, mp3key * key, struct himderrinfo * status); diff --git a/libhimd/trackindex.c b/libhimd/trackindex.c index 582f268..de5e1df 100644 --- a/libhimd/trackindex.c +++ b/libhimd/trackindex.c @@ -643,4 +643,68 @@ void himd_create_content_id(unsigned char* cid) for(i = 4; i <=19; i++) cid[i] = g_random_int_range(0,0xFF); -} \ No newline at end of file +} + +// Create fragment descriptor and track entry for an mp3 track and return the track index. +gint himd_add_mp3_track_info(struct himd * himd, unsigned int first_blockno, gint nblocks, gint nframes, + int seconds, unsigned char * mp3codecinfo, unsigned char *cid, struct himderrinfo * status) +{ + unsigned int last_blockno; + last_blockno = first_blockno + nblocks - 1; + + // + // Add fragment descriptor, get back fragment number + // + struct fraginfo fragment; + gint idx_frag; + + fragment.firstblock = first_blockno; + fragment.lastblock = last_blockno; + memset(&fragment.key[0], 0, 8); /* use zero key on mp3 files */ + fragment.firstframe = 0; + fragment.lastframe = nframes; + fragment.fragtype = 1; + fragment.nextfrag = 0; + + idx_frag = himd_add_fragment_info(himd, &fragment, &status); + // END: Add fragment + + // + // Add track descriptor, get trackno back. + // + struct trackinfo track; + + memset(&track.key, 0, 8); /* use zero key on mp3 files */ + track.title = 0; + track.artist = 0; + track.album = 0; + track.firstfrag = idx_frag; + track.tracknum = 1; + track.ekbnum = 0; + track.trackinalbum = 1; + track.codec_info.codec_id = CODEC_ATRAC3PLUS_OR_MPEG; + track.seconds = seconds; + + track.codec_info.codecinfo[0] = 3; + track.codec_info.codecinfo[1] = 0; + track.codec_info.codecinfo[2] = mp3codecinfo[0]; + track.codec_info.codecinfo[3] = mp3codecinfo[1]; + track.codec_info.codecinfo[4] = mp3codecinfo[2]; + + memset(&track.mac, 0, 8); + memcpy(&track.contentid, cid, 20); + memset(&track.recordingtime, 0, sizeof(struct tm)); + memset(&track.licensestarttime, 0, sizeof(struct tm)); + memset(&track.licenseendtime, 0, sizeof(struct tm)); + + /* set DRM stuff correctly for compatibility reasons */ + track.lt = 0x10; + track.dest = 1; + track.xcc = 1; + track.ct = 0; + track.cc = 0x40; + track.cn = 0; + + return himd_add_track_info(himd, &track, &status); + // END: Add track descriptor +} -- 1.8.0