|
From: <ny...@us...> - 2007-09-30 15:57:52
|
Revision: 418
http://pmplib.svn.sourceforge.net/pmplib/?rev=418&view=rev
Author: nyaochi
Date: 2007-09-30 08:57:53 -0700 (Sun, 30 Sep 2007)
Log Message:
-----------
- PMPlib now works with iPod nano 3rd gen. Setting
dbid and/or dbid2 fields in "mhit" chunk made this
magic.
- Sync with the latest fields in "mhit" chunk although
I'm not sure these new fields are necessary to the
latest iPods.
- Generating prefix indices ("mhod" chunk type 53).
Modified Paths:
--------------
trunk/pmplib/lib/pmp_ipod/ipod.c
trunk/pmplib/lib/pmp_ipod/itunesdb.c
trunk/pmplib/lib/pmp_ipod/itunesdb.h
trunk/pmplib/lib/pmp_ipod/pmp_ipod.vcproj
Modified: trunk/pmplib/lib/pmp_ipod/ipod.c
===================================================================
--- trunk/pmplib/lib/pmp_ipod/ipod.c 2007-09-25 16:23:32 UTC (rev 417)
+++ trunk/pmplib/lib/pmp_ipod/ipod.c 2007-09-30 15:57:53 UTC (rev 418)
@@ -294,10 +294,11 @@
)
{
int ret = 0;
+ const ucs2char_t* value = NULL;
itunesdb_chunk_t* mhod = NULL;
itunesdb_mhit_t* mhit_data = (itunesdb_mhit_t*)mhit->data;
- mhit_data->uid = uid;
+ mhit_data->uid = 1008 + uid * 2;
mhit_data->visible = 1;
switch (rec->codec) {
case PMPCODEC_MPEGLAYER3:
@@ -306,12 +307,12 @@
mhit_data->type2 = rec->is_vbr ? 0x01 : 0x00;
break;
default:
- mhit_data->type1 = 0x01;
+ mhit_data->type1 = 0x00;
mhit_data->type2 = 0x01;
break;
}
mhit_data->compilation = rec->is_compilation ? 1 : 0;
- mhit_data->rating = rec->rating * 20;
+ mhit_data->rating = rec->rating + 1;
mhit_data->last_modified = (uint32_t)from_time((time_t)rec->ts_update);
mhit_data->filesize = rec->filesize;
mhit_data->duration = rec->duration;
@@ -323,7 +324,7 @@
mhit_data->disc_number = rec->disc_number;
mhit_data->total_discs = rec->total_discs;
mhit_data->date_added = (uint32_t)from_time((time_t)rec->ts_import);
- mhit_data->dbid = 0;
+ mhit_data->dbid = 0xFA14A98319EB2BBD + uid;
mhit_data->unk9 = 0xFFFF;
switch (rec->codec) {
case PMPCODEC_MPEGLAYER3:
@@ -338,10 +339,16 @@
break;
}
mhit_data->unk14_1 = 12;
- mhit_data->is_played = 2;
+ mhit_data->is_played = 1;
mhit_data->unk27 = 1;
mhit_data->media_type = 1;
mhit_data->num_samples = rec->num_samples;
+ mhit_data->dbid2 = 0xC6EEB59E19650E3C + uid;
+ mhit_data->unk40 = 1011;
+ mhit_data->newunk3 = 0xBCD054CD8C063208;
+ mhit_data->unk43 = 0x0000808080808080;
+ mhit_data->newunk5 = 106;
+ mhit_data->newunk7 = 32;
/* Construct an "mhod" chunk for title. */
if (rec->title && *rec->title) {
@@ -362,11 +369,12 @@
}
/* Construct an "mhod" chunk for album artist. */
- if (rec->album_artist && *rec->album_artist) {
+ value = (rec->album_artist && *rec->album_artist) ? rec->album_artist : rec->artist;
+ if (value && *value) {
mhod = itunesdb_new_child(mhit);
if (mhod) {
if (ret = itunesdb_init(mhod, "mhod", "album_artist")) return ret;
- if (ret = itunesdb_set_mhod_string(mhod, rec->album_artist)) return ret;
+ if (ret = itunesdb_set_mhod_string(mhod, value)) return ret;
}
}
@@ -520,8 +528,8 @@
static int comp_title(const void *_x, const void *_y)
{
- const sorted_index_t *xi = (const sorted_index_t*)_x;
- const sorted_index_t *yi = (const sorted_index_t*)_y;
+ const itunesdb_playlist_entry_t *xi = (const itunesdb_playlist_entry_t*)_x;
+ const itunesdb_playlist_entry_t *yi = (const itunesdb_playlist_entry_t*)_y;
const pmp_music_record_t* base = (const pmp_music_record_t*)xi->base;
const pmp_music_record_t* x = &base[xi->index];
const pmp_music_record_t* y = &base[yi->index];
@@ -529,11 +537,16 @@
return comp_string(x->title, y->title);
}
+static uint32_t prefix_title(const pmp_music_record_t* record)
+{
+ return ((record->title != NULL) ? record->title[0] : 0);
+}
+
static int comp_album(const void *_x, const void *_y)
{
int ret = 0;
- const sorted_index_t *xi = (const sorted_index_t*)_x;
- const sorted_index_t *yi = (const sorted_index_t*)_y;
+ const itunesdb_playlist_entry_t *xi = (const itunesdb_playlist_entry_t*)_x;
+ const itunesdb_playlist_entry_t *yi = (const itunesdb_playlist_entry_t*)_y;
const pmp_music_record_t* base = (const pmp_music_record_t*)xi->base;
const pmp_music_record_t* x = &base[xi->index];
const pmp_music_record_t* y = &base[yi->index];
@@ -551,11 +564,16 @@
return ret;
}
+static uint32_t prefix_album(const pmp_music_record_t* record)
+{
+ return ((record->album != NULL) ? record->album[0] : 0);
+}
+
static int comp_album_for_list(const void *_x, const void *_y)
{
int ret = 0;
- const sorted_index_t *xi = (const sorted_index_t*)_x;
- const sorted_index_t *yi = (const sorted_index_t*)_y;
+ const itunesdb_playlist_entry_t *xi = (const itunesdb_playlist_entry_t*)_x;
+ const itunesdb_playlist_entry_t *yi = (const itunesdb_playlist_entry_t*)_y;
const pmp_music_record_t* base = (const pmp_music_record_t*)xi->base;
const pmp_music_record_t* x = &base[xi->index];
const pmp_music_record_t* y = &base[yi->index];
@@ -570,8 +588,8 @@
static int comp_sortartist(const void *_x, const void *_y)
{
int ret = 0;
- const sorted_index_t *xi = (const sorted_index_t*)_x;
- const sorted_index_t *yi = (const sorted_index_t*)_y;
+ const itunesdb_playlist_entry_t *xi = (const itunesdb_playlist_entry_t*)_x;
+ const itunesdb_playlist_entry_t *yi = (const itunesdb_playlist_entry_t*)_y;
const pmp_music_record_t* base = (const pmp_music_record_t*)xi->base;
const pmp_music_record_t* x = &base[xi->index];
const pmp_music_record_t* y = &base[yi->index];
@@ -583,11 +601,16 @@
return ret;
}
+static uint32_t prefix_sortartist(const pmp_music_record_t* record)
+{
+ return ((record->artist != NULL) ? record->artist[0] : 0);
+}
+
static int comp_albumartist(const void *_x, const void *_y)
{
int ret = 0;
- const sorted_index_t *xi = (const sorted_index_t*)_x;
- const sorted_index_t *yi = (const sorted_index_t*)_y;
+ const itunesdb_playlist_entry_t *xi = (const itunesdb_playlist_entry_t*)_x;
+ const itunesdb_playlist_entry_t *yi = (const itunesdb_playlist_entry_t*)_y;
const pmp_music_record_t* base = (const pmp_music_record_t*)xi->base;
const pmp_music_record_t* x = &base[xi->index];
const pmp_music_record_t* y = &base[yi->index];
@@ -602,8 +625,8 @@
static int comp_albumartist_sortartist(const void *_x, const void *_y)
{
int ret = 0;
- const sorted_index_t *xi = (const sorted_index_t*)_x;
- const sorted_index_t *yi = (const sorted_index_t*)_y;
+ const itunesdb_playlist_entry_t *xi = (const itunesdb_playlist_entry_t*)_x;
+ const itunesdb_playlist_entry_t *yi = (const itunesdb_playlist_entry_t*)_y;
const pmp_music_record_t* base = (const pmp_music_record_t*)xi->base;
const pmp_music_record_t* x = &base[xi->index];
const pmp_music_record_t* y = &base[yi->index];
@@ -621,8 +644,8 @@
static int comp_genre(const void *_x, const void *_y)
{
int ret = 0;
- const sorted_index_t *xi = (const sorted_index_t*)_x;
- const sorted_index_t *yi = (const sorted_index_t*)_y;
+ const itunesdb_playlist_entry_t *xi = (const itunesdb_playlist_entry_t*)_x;
+ const itunesdb_playlist_entry_t *yi = (const itunesdb_playlist_entry_t*)_y;
const pmp_music_record_t* base = (const pmp_music_record_t*)xi->base;
const pmp_music_record_t* x = &base[xi->index];
const pmp_music_record_t* y = &base[yi->index];
@@ -634,11 +657,16 @@
return ret;
}
+static uint32_t prefix_genre(const pmp_music_record_t* record)
+{
+ return ((record->genre != NULL) ? record->genre[0] : 0);
+}
+
static int comp_composer(const void *_x, const void *_y)
{
int ret = 0;
- const sorted_index_t *xi = (const sorted_index_t*)_x;
- const sorted_index_t *yi = (const sorted_index_t*)_y;
+ const itunesdb_playlist_entry_t *xi = (const itunesdb_playlist_entry_t*)_x;
+ const itunesdb_playlist_entry_t *yi = (const itunesdb_playlist_entry_t*)_y;
const pmp_music_record_t* base = (const pmp_music_record_t*)xi->base;
const pmp_music_record_t* x = &base[xi->index];
const pmp_music_record_t* y = &base[yi->index];
@@ -650,6 +678,25 @@
return ret;
}
+static uint32_t prefix_composer(const pmp_music_record_t* record)
+{
+ return ((record->composer != NULL) ? record->composer[0] : 0);
+}
+
+
+typedef uint32_t (*prefix_func)(const pmp_music_record_t* record);
+
+static void set_prefix(itunesdb_playlist_entry_t* array, size_t n, prefix_func func)
+{
+ size_t i;
+
+ for (i = 0;i < n;++i) {
+ itunesdb_playlist_entry_t *x = &array[i];
+ const pmp_music_record_t* base = (const pmp_music_record_t*)x->base;
+ x->prefix = func(&base[x->index]);
+ }
+}
+
static int set_album_list(itunesdb_chunk_t* mhla, const pmp_music_record_t* records, int num_records)
{
int i;
@@ -658,7 +705,7 @@
const ucs2char_t* prev_artist = NULL;
itunesdb_chunk_t *mhod = NULL, *mhia = NULL;
itunesdb_mhia_t *mhia_data = NULL;
- sorted_index_t* si = (sorted_index_t*)calloc(num_records, sizeof(sorted_index_t));
+ itunesdb_playlist_entry_t* si = (itunesdb_playlist_entry_t*)calloc(num_records, sizeof(itunesdb_playlist_entry_t));
if (!si) {
return IPODE_OUTOFMEMORY;
@@ -715,7 +762,8 @@
int ret = 0;
itunesdb_chunk_t *mhod = NULL, *mhip = NULL;
itunesdb_mhyp_t* mhyp_data = (itunesdb_mhyp_t*)mhyp->data;
- sorted_index_t* si = (sorted_index_t*)calloc(num_records, sizeof(sorted_index_t));
+ itunesdb_playlist_entry_t* si =
+ (itunesdb_playlist_entry_t*)calloc(num_records, sizeof(itunesdb_playlist_entry_t));
const static ucs2char_t ucs2cs_master[] = {'M','a','s','t','e','r',0};
if (!si) {
@@ -744,7 +792,14 @@
if (mhod) {
if (ret = itunesdb_init(mhod, "mhod", "index")) return ret;
qsort(si, num_records, sizeof(si[0]), comp_title);
- if (ret = itunesdb_set_mhod_index(mhod, 0x03, si, num_records)) return ret;
+ if (ret = itunesdb_set_mhod_order(mhod, 0x03, si, num_records)) return ret;
+
+ mhod = itunesdb_new_child(mhyp);
+ if (mhod) {
+ if (ret = itunesdb_init(mhod, "mhod", "library_playlist_index")) return ret;
+ set_prefix(si, num_records, prefix_title);
+ if (ret = itunesdb_set_mhod_index(mhod, 0x03, si, num_records)) return ret;
+ }
}
/* Construct an "mhod" chunk for index: sortartist, disc/tracknumber, title. */
@@ -752,7 +807,14 @@
if (mhod) {
if (ret = itunesdb_init(mhod, "mhod", "index")) return ret;
qsort(si, num_records, sizeof(si[0]), comp_sortartist);
- if (ret = itunesdb_set_mhod_index(mhod, 0x05, si, num_records)) return ret;
+ if (ret = itunesdb_set_mhod_order(mhod, 0x05, si, num_records)) return ret;
+
+ mhod = itunesdb_new_child(mhyp);
+ if (mhod) {
+ if (ret = itunesdb_init(mhod, "mhod", "library_playlist_index")) return ret;
+ set_prefix(si, num_records, prefix_sortartist);
+ if (ret = itunesdb_set_mhod_index(mhod, 0x05, si, num_records)) return ret;
+ }
}
/* Construct an "mhod" chunk for index: album, disc/tracknumber, title. */
@@ -760,7 +822,14 @@
if (mhod) {
if (ret = itunesdb_init(mhod, "mhod", "index")) return ret;
qsort(si, num_records, sizeof(si[0]), comp_album);
- if (ret = itunesdb_set_mhod_index(mhod, 0x04, si, num_records)) return ret;
+ if (ret = itunesdb_set_mhod_order(mhod, 0x04, si, num_records)) return ret;
+
+ mhod = itunesdb_new_child(mhyp);
+ if (mhod) {
+ if (ret = itunesdb_init(mhod, "mhod", "library_playlist_index")) return ret;
+ set_prefix(si, num_records, prefix_album);
+ if (ret = itunesdb_set_mhod_index(mhod, 0x04, si, num_records)) return ret;
+ }
}
/* Construct an "mhod" chunk for index: genre, sortartist, album, disc/tracknumber, title */
@@ -768,7 +837,14 @@
if (mhod) {
if (ret = itunesdb_init(mhod, "mhod", "index")) return ret;
qsort(si, num_records, sizeof(si[0]), comp_genre);
- if (ret = itunesdb_set_mhod_index(mhod, 0x07, si, num_records)) return ret;
+ if (ret = itunesdb_set_mhod_order(mhod, 0x07, si, num_records)) return ret;
+
+ mhod = itunesdb_new_child(mhyp);
+ if (mhod) {
+ if (ret = itunesdb_init(mhod, "mhod", "library_playlist_index")) return ret;
+ set_prefix(si, num_records, prefix_genre);
+ if (ret = itunesdb_set_mhod_index(mhod, 0x07, si, num_records)) return ret;
+ }
}
/* Construct an "mhod" chunk for index: composer, title. */
@@ -776,7 +852,14 @@
if (mhod) {
if (ret = itunesdb_init(mhod, "mhod", "index")) return ret;
qsort(si, num_records, sizeof(si[0]), comp_composer);
- if (ret = itunesdb_set_mhod_index(mhod, 0x12, si, num_records)) return ret;
+ if (ret = itunesdb_set_mhod_order(mhod, 0x12, si, num_records)) return ret;
+
+ mhod = itunesdb_new_child(mhyp);
+ if (mhod) {
+ if (ret = itunesdb_init(mhod, "mhod", "library_playlist_index")) return ret;
+ set_prefix(si, num_records, prefix_composer);
+ if (ret = itunesdb_set_mhod_index(mhod, 0x12, si, num_records)) return ret;
+ }
}
/* Construct an "mhod" chunk for index: albumartist, sortartist, disc/tracknumber, title. */
@@ -784,7 +867,7 @@
if (mhod) {
if (ret = itunesdb_init(mhod, "mhod", "index")) return ret;
qsort(si, num_records, sizeof(si[0]), comp_albumartist_sortartist);
- if (ret = itunesdb_set_mhod_index(mhod, 0x23, si, num_records)) return ret;
+ if (ret = itunesdb_set_mhod_order(mhod, 0x23, si, num_records)) return ret;
}
/* Construct an "mhod" chunk for index: albumartist, album, disc/tracknumber, title*/
@@ -792,7 +875,7 @@
if (mhod) {
if (ret = itunesdb_init(mhod, "mhod", "index")) return ret;
qsort(si, num_records, sizeof(si[0]), comp_albumartist);
- if (ret = itunesdb_set_mhod_index(mhod, 0x24, si, num_records)) return ret;
+ if (ret = itunesdb_set_mhod_order(mhod, 0x24, si, num_records)) return ret;
}
/* Construct an "mhod" chunk for index: title?. */
@@ -800,7 +883,14 @@
if (mhod) {
if (ret = itunesdb_init(mhod, "mhod", "index")) return ret;
qsort(si, num_records, sizeof(si[0]), comp_title);
- if (ret = itunesdb_set_mhod_index(mhod, 0x1D, si, num_records)) return ret;
+ if (ret = itunesdb_set_mhod_order(mhod, 0x1D, si, num_records)) return ret;
+
+ mhod = itunesdb_new_child(mhyp);
+ if (mhod) {
+ if (ret = itunesdb_init(mhod, "mhod", "library_playlist_index")) return ret;
+ set_prefix(si, num_records, prefix_title);
+ if (ret = itunesdb_set_mhod_index(mhod, 0x1D, si, num_records)) return ret;
+ }
}
/* Construct an "mhod" chunk for index: title?. */
@@ -808,7 +898,7 @@
if (mhod) {
if (ret = itunesdb_init(mhod, "mhod", "index")) return ret;
qsort(si, num_records, sizeof(si[0]), comp_title);
- if (ret = itunesdb_set_mhod_index(mhod, 0x1E, si, num_records)) return ret;
+ if (ret = itunesdb_set_mhod_order(mhod, 0x1E, si, num_records)) return ret;
}
/* Construct an "mhod" chunk for index: title?. */
@@ -816,7 +906,7 @@
if (mhod) {
if (ret = itunesdb_init(mhod, "mhod", "index")) return ret;
qsort(si, num_records, sizeof(si[0]), comp_title);
- if (ret = itunesdb_set_mhod_index(mhod, 0x1F, si, num_records)) return ret;
+ if (ret = itunesdb_set_mhod_order(mhod, 0x1F, si, num_records)) return ret;
}
/* End of the series of "mhod" chunks. */
@@ -831,13 +921,13 @@
mhip_data = (itunesdb_mhip_t*)mhip->data;
mhip_data->flag_podcast_group = 0;
- mhip_data->track_id = i;
- mhip_data->group_id = i + num_records;
+ mhip_data->track_id = 1008 + i * 2;
+ mhip_data->group_id = 1008 + i * 2 + 1;
mhod = itunesdb_new_child(mhip);
if (mhod) {
if (ret = itunesdb_init(mhod, "mhod", "playlist_order")) return ret;
- if (ret = itunesdb_set_mhod_playlist_order(mhod, i+1)) return ret;
+ if (ret = itunesdb_set_mhod_playlist_order(mhod, 1008 + i * 2 + 1)) return ret;
} else {
return IPODE_OUTOFMEMORY;
}
@@ -946,6 +1036,7 @@
if (ret = itunesdb_init(mhbd, "mhbd", NULL)) return ret;
mhbd_data = (itunesdb_mhbd_t*)mhbd->data;
+#if 0
/* Construct "mhsd" chunk with album_list type (type = 4). */
mhsd = itunesdb_new_child(mhbd);
if (mhsd) {
@@ -965,6 +1056,7 @@
} else {
return IPODE_FAILEDNEWCHUNK;
}
+#endif
/* Construct "mhsd" chunk with track type (type = 1). */
mhsd = itunesdb_new_child(mhbd);
Modified: trunk/pmplib/lib/pmp_ipod/itunesdb.c
===================================================================
--- trunk/pmplib/lib/pmp_ipod/itunesdb.c 2007-09-25 16:23:32 UTC (rev 417)
+++ trunk/pmplib/lib/pmp_ipod/itunesdb.c 2007-09-30 15:57:53 UTC (rev 418)
@@ -332,6 +332,17 @@
if (ret = serialize_uint16le(sio, "gapless_track", "%u", &mhit->gapless_track)) return ret;
if (ret = serialize_uint16le(sio, "gapless_album", "%u", &mhit->gapless_album)) return ret;
if (ret = serialize_uint8_array(sio, "unknown_hash", "%02X ", mhit->unknown_hash, sizeof(mhit->unknown_hash))) return ret;
+ if (ret = serialize_uint32le(sio, "newunk1", "%u", &mhit->newunk1)) return ret;
+ if (ret = serialize_uint32le(sio, "newunk2", "%u", &mhit->newunk2)) return ret;
+ if (ret = serialize_uint32le(sio, "unk40", "%u", &mhit->unk40)) return ret;
+ if (ret = serialize_uint64le(sio, "newunk3", "%016llX", &mhit->newunk3)) return ret;
+ if (ret = serialize_uint32le(sio, "unk41", "%u", &mhit->unk41)) return ret;
+ if (ret = serialize_uint32le(sio, "unk42", "%u", &mhit->unk42)) return ret;
+ if (ret = serialize_uint64le(sio, "unk43", "%016llX", &mhit->unk43)) return ret;
+ if (ret = serialize_uint8_array(sio, "newunk4", "%02X ", mhit->newunk4, sizeof(mhit->newunk4))) return ret;
+ if (ret = serialize_uint32le(sio, "newunk5", "%u", &mhit->newunk5)) return ret;
+ if (ret = serialize_uint32le(sio, "newunk6", "%u", &mhit->newunk6)) return ret;
+ if (ret = serialize_uint32le(sio, "newunk7", "%u", &mhit->newunk7)) return ret;
return 0;
}
@@ -1099,7 +1110,7 @@
}
-int itunesdb_set_mhod_index(itunesdb_chunk_t* chunk, uint32_t type, sorted_index_t* si, uint32_t n)
+int itunesdb_set_mhod_order(itunesdb_chunk_t* chunk, uint32_t type, itunesdb_playlist_entry_t* si, uint32_t n)
{
uint32_t i;
itunesdb_mhod_t* mhod = (itunesdb_mhod_t*)chunk->data;
@@ -1123,6 +1134,51 @@
return 0;
}
+int itunesdb_set_mhod_index(itunesdb_chunk_t* chunk, uint32_t type, itunesdb_playlist_entry_t* si, uint32_t n)
+{
+ uint32_t i, m = 0, prev = 0;
+ itunesdb_mhod_t* mhod = (itunesdb_mhod_t*)chunk->data;
+ itunesdb_mhod_library_playlist_index_t* index = &mhod->data.lp_index;
+
+ /* Make sure this is an "mhod" chunk. */
+ if (strncmp(chunk->id, "mhod", 4) != 0) {
+ return IPODE_INCOMPATIBLECHUNK;
+ }
+
+ /* Store the index type. */
+ index->type = type;
+ /* Initialize the number of entries as zero. */
+ index->num_entries = 0;
+
+ /* Does nothing for an empty array. */
+ if (n <= 0) {
+ return 0;
+ }
+
+ /* Allocate the entry array with the maximum size. */
+ index->entries = (itunesdb_mhod_library_playlist_entry_t*)calloc(
+ n, sizeof(itunesdb_mhod_library_playlist_entry_t));
+ if (!index->entries) {
+ return IPODE_OUTOFMEMORY;
+ }
+
+ prev = si[0].prefix + 1;
+ for (i = 0;i < n;++i) {
+ if (prev != si[i].prefix) {
+ index->entries[m].value = si[i].prefix;
+ index->entries[m].begin = i;
+ index->entries[m].num = 1;
+ ++m;
+ } else {
+ ++index->entries[m-1].num;
+ }
+ prev = si[i].prefix;
+ }
+
+ index->num_entries = m;
+ return 0;
+}
+
int itunesdb_set_mhod_playlist_order(itunesdb_chunk_t* chunk, uint32_t order)
{
itunesdb_mhod_t* mhod = (itunesdb_mhod_t*)chunk->data;
Modified: trunk/pmplib/lib/pmp_ipod/itunesdb.h
===================================================================
--- trunk/pmplib/lib/pmp_ipod/itunesdb.h 2007-09-25 16:23:32 UTC (rev 417)
+++ trunk/pmplib/lib/pmp_ipod/itunesdb.h 2007-09-30 15:57:53 UTC (rev 418)
@@ -138,6 +138,17 @@
uint16_t gapless_track;
uint16_t gapless_album;
uint8_t unknown_hash[20];
+ uint32_t newunk1;
+ uint32_t newunk2;
+ uint32_t unk40;
+ uint64_t newunk3;
+ uint32_t unk41;
+ uint32_t unk42;
+ uint64_t unk43;
+ uint8_t newunk4[36];
+ uint32_t newunk5;
+ uint32_t newunk6;
+ uint32_t newunk7;
} itunesdb_mhit_t;
typedef struct {
@@ -289,9 +300,10 @@
} itunesdb_chunkdecl_t;
typedef struct {
- uint32_t index;
- const void* base;
-} sorted_index_t;
+ uint32_t index;
+ uint32_t prefix;
+ const void* base;
+} itunesdb_playlist_entry_t;
/**
* Initialize a chunk with identifier and subtype (for "mhod" chunk)
@@ -335,7 +347,8 @@
* @param n The number of entries in the sorted index.
* @retval int zero if succeeded, otherwise nonzero.
*/
-int itunesdb_set_mhod_index(itunesdb_chunk_t* chunk, uint32_t sort_order, sorted_index_t* si, uint32_t n);
+int itunesdb_set_mhod_order(itunesdb_chunk_t* chunk, uint32_t sort_order, itunesdb_playlist_entry_t* si, uint32_t n);
+int itunesdb_set_mhod_index(itunesdb_chunk_t* chunk, uint32_t sort_order, itunesdb_playlist_entry_t* si, uint32_t n);
/**
* Set ordinal value to "mhod" chunk.
Modified: trunk/pmplib/lib/pmp_ipod/pmp_ipod.vcproj
===================================================================
--- trunk/pmplib/lib/pmp_ipod/pmp_ipod.vcproj 2007-09-25 16:23:32 UTC (rev 417)
+++ trunk/pmplib/lib/pmp_ipod/pmp_ipod.vcproj 2007-09-30 15:57:53 UTC (rev 418)
@@ -40,7 +40,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(SolutionDir)include"
+ AdditionalIncludeDirectories="$(SolutionDir)include;win32"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;PMP_IPOD_EXPORTS"
MinimalRebuild="true"
BasicRuntimeChecks="3"
@@ -61,7 +61,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies=".\win32spti\ipodprop_win32spti.lib shlwapi.lib"
+ AdditionalDependencies=".\win32\usbinfo_win32.lib .\win32spti\ipodprop_win32spti.lib shlwapi.lib"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="2"
@@ -117,7 +117,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(SolutionDir)include"
+ AdditionalIncludeDirectories="$(SolutionDir)include;win32"
PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;PMP_IPOD_EXPORTS"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -136,7 +136,7 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies=".\win32spti\ipodprop_win32spti.lib shlwapi.lib"
+ AdditionalDependencies=".\win32\usbinfo_win32.lib .\win32spti\ipodprop_win32spti.lib shlwapi.lib"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="2"
@@ -187,6 +187,10 @@
>
</File>
<File
+ RelativePath=".\ipodserial_win32.c"
+ >
+ </File>
+ <File
RelativePath=".\itunesdb.c"
>
</File>
@@ -229,6 +233,10 @@
>
</File>
<File
+ RelativePath=".\ipodserial.h"
+ >
+ </File>
+ <File
RelativePath=".\itunesdb.h"
>
</File>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|