From: <ny...@us...> - 2007-09-24 03:34:28
|
Revision: 415 http://pmplib.svn.sourceforge.net/pmplib/?rev=415&view=rev Author: nyaochi Date: 2007-09-23 20:34:31 -0700 (Sun, 23 Sep 2007) Log Message: ----------- - Fixed several bugs. - Support SmartPlaylist Data mhod type. - Read/write album_artist fields. 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/util.c Modified: trunk/pmplib/lib/pmp_ipod/ipod.c =================================================================== --- trunk/pmplib/lib/pmp_ipod/ipod.c 2007-09-17 13:00:32 UTC (rev 414) +++ trunk/pmplib/lib/pmp_ipod/ipod.c 2007-09-24 03:34:31 UTC (rev 415) @@ -359,6 +359,15 @@ } } + /* Construct an "mhod" chunk for album artist. */ + if (rec->artist && *rec->artist) { + 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; + } + } + /* Construct an "mhod" chunk for album. */ if (rec->album && *rec->album) { mhod = itunesdb_new_child(mhit); @@ -466,6 +475,8 @@ if (ret = itunesdb_get_mhod_string(mhod, &rec->title)) return ret; } else if (itunesdb_ischunk(mhod, "mhod", "artist")) { if (ret = itunesdb_get_mhod_string(mhod, &rec->artist)) return ret; + } else if (itunesdb_ischunk(mhod, "mhod", "album_artist")) { + if (ret = itunesdb_get_mhod_string(mhod, &rec->album_artist)) return ret; } else if (itunesdb_ischunk(mhod, "mhod", "album")) { if (ret = itunesdb_get_mhod_string(mhod, &rec->album)) return ret; } else if (itunesdb_ischunk(mhod, "mhod", "genre")) { Modified: trunk/pmplib/lib/pmp_ipod/itunesdb.c =================================================================== --- trunk/pmplib/lib/pmp_ipod/itunesdb.c 2007-09-17 13:00:32 UTC (rev 414) +++ trunk/pmplib/lib/pmp_ipod/itunesdb.c 2007-09-24 03:34:31 UTC (rev 415) @@ -331,6 +331,7 @@ if (ret = serialize_uint32le(sio, "unk38", "%u", &mhit->unk38)) return ret; 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; return 0; } @@ -478,6 +479,34 @@ return 0; } +static void mhod_smartplaylist_data_finish(itunesdb_chunk_t* chunk) +{ + itunesdb_mhod_t* mhod = (itunesdb_mhod_t*)chunk->data; + itunesdb_mhod_smartplaylist_data_t* spd = &mhod->data.spd; + memset(spd, 0, sizeof(*spd)); +} + +static int mhod_smartplaylist_data_serialize(itunesdb_chunk_t* chunk, const char *name, serializer_t* sio) +{ + int ret = 0; + itunesdb_mhod_t* mhod = (itunesdb_mhod_t*)chunk->data; + itunesdb_mhod_smartplaylist_data_t* spd = &mhod->data.spd; + + if (ret = serialize_uint8(sio, "live_update", "%d", &spd->live_update)) return ret; + if (ret = serialize_uint8(sio, "check_rules", "%d", &spd->check_rules)) return ret; + if (ret = serialize_uint8(sio, "check_limits", "%d", &spd->check_limits)) return ret; + if (ret = serialize_uint8(sio, "limit_type", "%d", &spd->limit_type)) return ret; + if (ret = serialize_uint8(sio, "limit_sort", "%d", &spd->limit_sort)) return ret; + if (ret = serialize_uint8(sio, "unknown1", "%d", &spd->unknown1)) return ret; + if (ret = serialize_uint8(sio, "unknown2", "%d", &spd->unknown2)) return ret; + if (ret = serialize_uint8(sio, "unknown3", "%d", &spd->unknown3)) return ret; + if (ret = serialize_uint32le(sio, "limit_value", "%d", &spd->limit_value)) return ret; + if (ret = serialize_uint8(sio, "match_checked_only", "%d", &spd->match_checked_only)) return ret; + if (ret = serialize_uint8(sio, "reverse_limit_sort", "%d", &spd->reverse_limit_sort)) return ret; + + return ret; +} + static void mhod_index_finish(itunesdb_chunk_t* chunk) { itunesdb_mhod_t* mhod = (itunesdb_mhod_t*)chunk->data; @@ -642,10 +671,13 @@ {14, "description", 0, mhod_string_finish, mhod_string_serialize}, {15, "podcast_enclosure_url", 0, mhod_url_finish, mhod_url_serialize}, {16, "podcast_rss_url", 0, mhod_url_finish, mhod_url_serialize}, + {22, "album_artist", 0, mhod_string_finish, mhod_string_serialize}, + {23, "sort_artist", 0, mhod_string_finish, mhod_string_serialize}, {27, "sort_title", 0, mhod_string_finish, mhod_string_serialize}, {28, "sort_album", 0, mhod_string_finish, mhod_string_serialize}, {29, "sort_albumartist", 0, mhod_string_finish, mhod_string_serialize}, {30, "sort_composer", 0, mhod_string_finish, mhod_string_serialize}, + {50, "smartplaylist_data", 0, mhod_smartplaylist_data_finish, mhod_smartplaylist_data_serialize}, {52, "index", 0, mhod_index_finish, mhod_index_serialize}, {53, "library_playlist_index", 0, mhod_library_playlist_index_finish, mhod_library_playlist_index_serialize}, {100, "playlist_column", 0x288, mhod_playlist_column_finish, mhod_playlist_column_serialize}, @@ -919,7 +951,7 @@ } /* Read children for this chunk. */ - if (strncmp(chunk->id, "mhlt", 4) == 0 || strncmp(chunk->id, "mhlp", 4) == 0) { + if (strncmp(chunk->id, "mhla", 4) == 0 || strncmp(chunk->id, "mhlt", 4) == 0 || strncmp(chunk->id, "mhlp", 4) == 0) { /* chunk->overall_size represents the number of children for "mhlt" and "mhlp" chunks */ chunk->num_children = chunk->overall_size; chunk->childlen = (itunesdb_chunk_t*)calloc(chunk->num_children, sizeof(itunesdb_chunk_t)); Modified: trunk/pmplib/lib/pmp_ipod/itunesdb.h =================================================================== --- trunk/pmplib/lib/pmp_ipod/itunesdb.h 2007-09-17 13:00:32 UTC (rev 414) +++ trunk/pmplib/lib/pmp_ipod/itunesdb.h 2007-09-24 03:34:31 UTC (rev 415) @@ -137,6 +137,7 @@ uint32_t unk38; uint16_t gapless_track; uint16_t gapless_album; + uint8_t unknown_hash[20]; } itunesdb_mhit_t; typedef struct { @@ -180,6 +181,20 @@ } itunesdb_mhod_url_t; typedef struct { + uint8_t live_update; + uint8_t check_rules; + uint8_t check_limits; + uint8_t limit_type; + uint8_t limit_sort; + uint8_t unknown1; + uint8_t unknown2; + uint8_t unknown3; + uint32_t limit_value; + uint8_t match_checked_only; + uint8_t reverse_limit_sort; +} itunesdb_mhod_smartplaylist_data_t; + +typedef struct { uint32_t type; uint32_t num_entries; uint8_t padding[40]; @@ -233,6 +248,7 @@ union { itunesdb_mhod_string_t str; itunesdb_mhod_url_t url; + itunesdb_mhod_smartplaylist_data_t spd; itunesdb_mhod_index_t index; itunesdb_mhod_playlist_column_t pc; itunesdb_mhod_playlist_order_t po; Modified: trunk/pmplib/lib/pmp_ipod/util.c =================================================================== --- trunk/pmplib/lib/pmp_ipod/util.c 2007-09-17 13:00:32 UTC (rev 414) +++ trunk/pmplib/lib/pmp_ipod/util.c 2007-09-24 03:34:31 UTC (rev 415) @@ -42,7 +42,7 @@ { size_t i; for (i = 0;i < size;i++) { - if (array[0] != value) { + if (array[i] != value) { return 0; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |