From: <ny...@us...> - 2007-02-27 15:20:57
|
Revision: 400 http://svn.sourceforge.net/pmplib/?rev=400&view=rev Author: nyaochi Date: 2007-02-27 07:20:57 -0800 (Tue, 27 Feb 2007) Log Message: ----------- Implemented playlist conversion for iPod players. Modified Paths: -------------- trunk/pmplib/frontend/easypmp/cui/main.c trunk/pmplib/lib/pmp_ipod/ipod.c trunk/pmplib/lib/pmp_ipod/pmp_ipod.c Modified: trunk/pmplib/frontend/easypmp/cui/main.c =================================================================== --- trunk/pmplib/frontend/easypmp/cui/main.c 2007-02-27 14:29:36 UTC (rev 399) +++ trunk/pmplib/frontend/easypmp/cui/main.c 2007-02-27 15:20:57 UTC (rev 400) @@ -472,12 +472,7 @@ // Convert playlists. if (opt.verb & MODE_PLAYLIST) { - if (opt.verb & MODE_SETTLE) { - // Playlist referring to music_links. - easypmp_playlist(pmp, &playlists, &music_links, &opt, records, num_records, easypmp_progress, NULL); - } else { - easypmp_playlist(pmp, &playlists, &musics, &opt, records, num_records, easypmp_progress, NULL); - } + easypmp_playlist(pmp, &playlists, &musics, &opt, records, num_records, easypmp_progress, NULL); } // Dump the database if specified. Modified: trunk/pmplib/lib/pmp_ipod/ipod.c =================================================================== --- trunk/pmplib/lib/pmp_ipod/ipod.c 2007-02-27 14:29:36 UTC (rev 399) +++ trunk/pmplib/lib/pmp_ipod/ipod.c 2007-02-27 15:20:57 UTC (rev 400) @@ -434,6 +434,7 @@ itunesdb_chunk_t *mhod = NULL, *mhip = NULL; chunk_mhyp_t* mhyp_data = (chunk_mhyp_t*)mhyp->data; sorted_index_t* si = (sorted_index_t*)calloc(num_records, sizeof(sorted_index_t)); + const static ucs2char_t ucs2cs_master[] = {'M','a','s','t','e','r',0}; if (!si) { return 1; @@ -454,7 +455,7 @@ mhod = itunesdb_new_child(mhyp); if (mhod) { itunesdb_init(mhod, "mhod", "title"); - itunesdb_set_mhod_string(mhod, L"Nyaopod"); + itunesdb_set_mhod_string(mhod, ucs2cs_master); } /* Construct an "mhod" chunk for title index. */ @@ -526,6 +527,70 @@ return 0; } +static uint32_t get_record_index(const ucs2char_t* filename, const pmp_music_record_t* records, int num_records) +{ + uint32_t i; + + for (i = 0;i < num_records;++i) { + if (ucs2icmp(records[i].filename, filename) == 0) { + break; + } + } + return i; +} + +static int set_playlist(itunesdb_chunk_t* mhyp, const pmp_playlist_t* playlist, const pmp_music_record_t* records, int num_records) +{ + int i; + itunesdb_chunk_t *mhod = NULL, *mhip = NULL; + chunk_mhyp_t* mhyp_data = (chunk_mhyp_t*)mhyp->data; + + mhyp_data->flag_master = 0; + mhyp_data->id = 0x7520EA5FA870F9EA; + mhyp_data->unk3 = 0; + mhyp_data->unk4 = 1; + mhyp_data->sort_order = 1; + + /* Construct an "mhod" chunk for title. */ + mhod = itunesdb_new_child(mhyp); + if (mhod) { + itunesdb_init(mhod, "mhod", "title"); + itunesdb_set_mhod_string(mhod, playlist->name); + } + + /* End of "mhod" chunk(s). */ + mhyp_data->num_mhod = mhyp->num_children; + + /* */ + for (i = 0;i < playlist->num_entries;++i) { + uint32_t index = get_record_index(playlist->entries[i], records, num_records); + + if (index < num_records) { + mhip = itunesdb_new_child(mhyp); + if (mhip) { + chunk_mhip_t* mhip_data = NULL; + itunesdb_init(mhip, "mhip", NULL); + mhip_data = (chunk_mhip_t*)mhip->data; + + mhip_data->flag_podcast_group = 0; + mhip_data->track_id = index; + mhip_data->group_id = index + num_records; + + mhod = itunesdb_new_child(mhip); + if (mhod) { + itunesdb_init(mhod, "mhod", "playlist_order"); + itunesdb_set_mhod_playlist_order(mhod, i+1); + } + + mhip_data->num_mhod = mhip->num_children; + } + } + } + + mhyp_data->num_mhip = mhyp->num_children - mhyp_data->num_mhod; + return 0; +} + result_t ipod_set(ipod_t* ipod, const pmp_music_record_t* records, int num_records, const pmp_playlist_t* playlists, int num_playlists) { int i; @@ -582,19 +647,27 @@ if (mhlp) { itunesdb_init(mhlp, "mhlp", NULL); + /* Create a master playlist. */ mhyp = itunesdb_new_child(mhlp); if (mhyp) { chunk_mhyp_t* mhyp_data = NULL; itunesdb_init(mhyp, "mhyp", NULL); - mhyp_data = (chunk_mhyp_t*)mhyp->data; - set_master_playlist(mhyp, records, num_records); } + + /* Create user's playlists. */ + for (i = 0;i < num_playlists;++i) { + mhyp = itunesdb_new_child(mhlp); + if (mhyp) { + chunk_mhyp_t* mhyp_data = NULL; + itunesdb_init(mhyp, "mhyp", NULL); + set_playlist(mhyp, &playlists[i], records, num_records); + } + } } } mhbd_data->num_children = mhbd->num_children; - ipod->itunesdb = mhbd; return 0; } Modified: trunk/pmplib/lib/pmp_ipod/pmp_ipod.c =================================================================== --- trunk/pmplib/lib/pmp_ipod/pmp_ipod.c 2007-02-27 14:29:36 UTC (rev 399) +++ trunk/pmplib/lib/pmp_ipod/pmp_ipod.c 2007-02-27 15:20:57 UTC (rev 400) @@ -482,5 +482,15 @@ static result_t pmpmusic_set_playlists(pmp_music_t* music, const pmp_playlist_t* playlists, uint32_t num_playlists) { - return PMPERR_NOTIMPLIMENTED; + pmp_t* pmp = music->pmp; + pmp_music_internal_t* pmpmi = (pmp_music_internal_t*)music->instance; + + /* Free playlists attached to pmpmi. */ + pmplib_playlists_finish(pmpmi->playlists, pmpmi->num_playlists); + + /* Allocate new playlists. */ + pmpmi->playlists = (pmp_playlist_t*)ucs2malloc(sizeof(pmp_playlist_t) * num_playlists); + pmpmi->num_playlists = num_playlists; + pmplib_playlists_clone(pmpmi->playlists, playlists, num_playlists); + return 0;; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |