diff --git a/himddump/himddump.c b/himddump/himddump.c index c209e2d..d13c7f8 100644 --- a/himddump/himddump.c +++ b/himddump/himddump.c @@ -768,7 +768,7 @@ void himd_writemp3(struct himd *h, const char *filepath) // struct trackinfo track; - memcpy(&track.key, key, 8); + memset(&track.key, 0, 8); /* use zero key on mp3 files */ track.title = idx_title; track.artist = idx_artist; track.album = idx_album; @@ -780,12 +780,25 @@ void himd_writemp3(struct himd *h, const char *filepath) track.seconds = duration.seconds; memset(&track.codecinfo, 0, 5); track.codecinfo[0] = 3; + + /* file dependent codec information, these values are for my test mp3 file only, */ + /* values fetched from trkidx file by downloading the same mp3 file with SonicStage */ + track.codecinfo[2] = 0xB0; /* mp3, stereo, 128kb/s@44k1Hz */ + track.codecinfo[3] = 0xD9; + track.codecinfo[4] = 0x10; + memset(&track.mac, 0, 8); - memset(&track.contentid, 0, 20); + memcpy(&track.contentid, cid, 20); memset(&track.recordingtime, 0, sizeof(struct tm)); memset(&track.starttime, 0, sizeof(struct tm)); memset(&track.endtime, 0, sizeof(struct tm)); + /* set DRM stuff correctly for compatibility reasons */ + track.Lt = 0x10; + track.Dest = 1; + track.Xcc = 1; + track.Cc = 0x40; + idx_track = himd_add_track_info(h, &track, &status); // END: Add track descriptor diff --git a/libhimd/himd.h b/libhimd/himd.h index e0b054b..887f4a9 100644 --- a/libhimd/himd.h +++ b/libhimd/himd.h @@ -80,6 +80,12 @@ struct trackinfo { unsigned char contentid[20]; int ekbnum; struct tm recordingtime, starttime, endtime; + char Lt; + char Dest; + char Xcc; + char Ct; + char Cc; + char Cn; }; /* a fragment in the audio file */ diff --git a/libhimd/trackindex.c b/libhimd/trackindex.c index 2993557..ffc905f 100644 --- a/libhimd/trackindex.c +++ b/libhimd/trackindex.c @@ -72,7 +72,7 @@ static void dos_settime(unsigned char * buffer, const struct tm * tm) static void settrack(struct trackinfo *t, unsigned char * trackbuffer) { dos_settime(trackbuffer+0, &t->recordingtime); - setbeword32(trackbuffer+4, 0x10012); + setbeword32(trackbuffer+4, t->ekbnum); setbeword16(trackbuffer+8, t->title); setbeword16(trackbuffer+10, t->artist); setbeword16(trackbuffer+12, t->album); @@ -92,6 +92,12 @@ static void settrack(struct trackinfo *t, unsigned char * trackbuffer) memcpy(trackbuffer+48, t->contentid, 20); dos_settime(trackbuffer+68, &t->starttime); dos_settime(trackbuffer+72, &t->endtime); + + /* DRM stuff */ + trackbuffer[42] = t->Lt; + trackbuffer[43] = t->Dest; + trackbuffer[76] = t->Xcc; + trackbuffer[78] = t->Cc; } static void setfrag(struct fraginfo *f, unsigned char * fragbuffer) @@ -160,6 +166,7 @@ int himd_add_track_info(struct himd * himd, struct trackinfo * t, struct himderr int idx_freeslot; unsigned char * linkbuffer; unsigned char * trackbuffer; + unsigned char * play_order_table = himd->tifdata+0x100; status = status; @@ -180,6 +187,11 @@ int himd_add_track_info(struct himd * himd, struct trackinfo * t, struct himderr /* copy trackinfo to slot */ settrack(t, trackbuffer); + /* increase track count */ + setbeword16(play_order_table, himd_track_count(himd)+1); + + /* add entry for new track in play order table */ + setbeword16(play_order_table+2*idx_freeslot, t->tracknum); return idx_freeslot; }