From: <ny...@us...> - 2007-01-17 19:24:48
|
Revision: 269 http://svn.sourceforge.net/pmplib/?rev=269&view=rev Author: nyaochi Date: 2007-01-17 11:24:46 -0800 (Wed, 17 Jan 2007) Log Message: ----------- Keep music records in pmp_music_internal_t structure. Modified Paths: -------------- trunk/pmplib/lib/pmp_iriverplus3/dat.c trunk/pmplib/lib/pmp_iriverplus3/dat.h trunk/pmplib/lib/pmp_iriverplus3/ip3db.c trunk/pmplib/lib/pmp_iriverplus3/ip3db.h trunk/pmplib/lib/pmp_iriverplus3/pmp_iriverplus3.c Modified: trunk/pmplib/lib/pmp_iriverplus3/dat.c =================================================================== --- trunk/pmplib/lib/pmp_iriverplus3/dat.c 2007-01-17 18:38:14 UTC (rev 268) +++ trunk/pmplib/lib/pmp_iriverplus3/dat.c 2007-01-17 19:24:46 UTC (rev 269) @@ -624,7 +624,7 @@ return p ? p+1 : NULL; } -void dat_set(dat_t* dat, dic_t* dic, const ip3db_music_record_t* records, int num_records) +void dat_set(dat_t* dat, dic_t* dic, const ip3db_music_record_t* records, int num_records, const ip3db_playlist_t* playlists, int num_playlists) { /* Procedure: * 1) Construct the object chunk and attach music records with Object UIDs. @@ -659,7 +659,7 @@ static const ucs2char_t ucs2cs_root[] = {'/', 0}; dat_list_t* dato = &dat->objects; dat_list_t* datm = &dat->musics; - uint32_t num_objects = num_records; + uint32_t num_objects = num_records + num_playlists; object_record_t *objects = (object_record_t*)malloc(sizeof(object_record_t) * num_objects); dircache_t dc; @@ -680,12 +680,18 @@ dircache_push(&dc, ucs2cs_root, uid_root); /* Sort the records in alphabetical order of their path names. */ - for (i = 0;i < num_objects;++i) { + for (i = 0;i < num_records;++i) { objects[i].filepath = records[i][IP3DBF_MUSIC_FILEPATH].value.str; objects[i].filename = records[i][IP3DBF_MUSIC_FILENAME].value.str; objects[i].filetype = 2; objects[i].index = i; } + for (i = 0;i < num_playlists;++i) { + objects[i+num_records].filepath = playlists[i].filepath; + objects[i+num_records].filename = playlists[i].filename; + objects[i+num_records].filetype = 4; + objects[i+num_records].index = i; + } qsort(objects, num_objects, sizeof(objects[0]), comp_pathname); /* Loop for the records. */ @@ -737,6 +743,7 @@ /* Create a new object for the file name (FileType = 2). */ if (objects[i].filetype == 2) { + /* Music file. */ const ip3db_variant_t* record = records[objects[i].index]; uid = dato->num_entries; @@ -754,6 +761,17 @@ ip3db_variant_clone(&entry->fields[j], &record[j]); } ip3db_variant_set_dword(&entry->fields[IP3DBF_MUSIC_UID], uid); + } else if (objects[i].filetype == 4) { + /* Playlist file. */ + const ip3db_playlist_t* playlist = &playlists[objects[i].index]; + + uid = dato->num_entries; + entry = dat_list_expand(dato); + dat_entry_init(entry, &dic->objects); + ip3db_variant_set_dword(&entry->fields[IP3DBF_OBJECTS_UID], uid); + ip3db_variant_set_dword(&entry->fields[IP3DBF_OBJECTS_PARENTUID], puid); + ip3db_variant_set_word(&entry->fields[IP3DBF_OBJECTS_FILETYPE], 4); + ip3db_variant_set_str(&entry->fields[IP3DBF_OBJECTS_OBJECTNAME], file); } } Modified: trunk/pmplib/lib/pmp_iriverplus3/dat.h =================================================================== --- trunk/pmplib/lib/pmp_iriverplus3/dat.h 2007-01-17 18:38:14 UTC (rev 268) +++ trunk/pmplib/lib/pmp_iriverplus3/dat.h 2007-01-17 19:24:46 UTC (rev 269) @@ -48,6 +48,6 @@ int dat_read(dat_t* dat, const dic_t* dic, FILE *fpi); int dat_write(dat_t* dat, dic_t* dic, FILE *fpo); void dat_dump(dat_t* dat, const dic_t* dic, FILE *fp); -void dat_set(dat_t* dat, dic_t* dic, const ip3db_music_record_t* records, int num_records); +void dat_set(dat_t* dat, dic_t* dic, const ip3db_music_record_t* records, int num_records, const ip3db_playlist_t* playlists, int num_playlists); #endif/*__IP3DB_DAT_H__*/ Modified: trunk/pmplib/lib/pmp_iriverplus3/ip3db.c =================================================================== --- trunk/pmplib/lib/pmp_iriverplus3/ip3db.c 2007-01-17 18:38:14 UTC (rev 268) +++ trunk/pmplib/lib/pmp_iriverplus3/ip3db.c 2007-01-17 19:24:46 UTC (rev 269) @@ -213,10 +213,10 @@ return 0; } -result_t ip3db_set(ip3db_t* db, const ip3db_music_record_t* records, int num_records) +result_t ip3db_set(ip3db_t* db, const ip3db_music_record_t* records, int num_records, const ip3db_playlist_t* playlists, int num_playlists) { /* Construct records in db->dat from the records. */ - dat_set(db->dat, db->dic, records, num_records); + dat_set(db->dat, db->dic, records, num_records, playlists, num_playlists); return 0; } @@ -238,3 +238,12 @@ ip3db_variant_init(&var[i], db->dic->music.fields[i].type); } } + +void ip3db_record_finish(ip3db_t* db, ip3db_music_record_t* record) +{ + int i; + ip3db_variant_t* var = (ip3db_variant_t*)record; + for (i = 0;i < IP3DBF_MUSIC_LAST;++i) { + ip3db_variant_finish(&var[i]); + } +} Modified: trunk/pmplib/lib/pmp_iriverplus3/ip3db.h =================================================================== --- trunk/pmplib/lib/pmp_iriverplus3/ip3db.h 2007-01-17 18:38:14 UTC (rev 268) +++ trunk/pmplib/lib/pmp_iriverplus3/ip3db.h 2007-01-17 19:24:46 UTC (rev 269) @@ -52,6 +52,11 @@ } value; } ip3db_variant_t; +typedef struct { + ucs2char_t* filepath; + ucs2char_t* filename; +} ip3db_playlist_t; + /** * Fields in a music record. */ @@ -180,7 +185,7 @@ void ip3db_finish(ip3db_t* db); result_t ip3db_read(ip3db_t* db, const ucs2char_t* datfn, const ucs2char_t* dicfn, const ucs2char_t* idxfn); result_t ip3db_write(ip3db_t* db, const ucs2char_t* datfn, const ucs2char_t* dicfn, const ucs2char_t* idxfn); -result_t ip3db_set(ip3db_t* db, const ip3db_music_record_t* records, int num_records); +result_t ip3db_set(ip3db_t* db, const ip3db_music_record_t* records, int num_records, const ip3db_playlist_t* playlists, int num_playlists); int ip3db_num_records(ip3db_t* db); ip3db_music_record_t* ip3db_get_record(ip3db_t* db, int i); result_t ip3db_dump(ip3db_t* db, FILE *fpo); @@ -193,5 +198,6 @@ ); void ip3db_record_init(ip3db_t* db, ip3db_music_record_t* record); +void ip3db_record_finish(ip3db_t* db, ip3db_music_record_t* record); #endif /*_IP3DB_IP3DB_H__*/ Modified: trunk/pmplib/lib/pmp_iriverplus3/pmp_iriverplus3.c =================================================================== --- trunk/pmplib/lib/pmp_iriverplus3/pmp_iriverplus3.c 2007-01-17 18:38:14 UTC (rev 268) +++ trunk/pmplib/lib/pmp_iriverplus3/pmp_iriverplus3.c 2007-01-17 19:24:46 UTC (rev 269) @@ -89,6 +89,14 @@ const ip3model_descriptor_t* decl; } pmp_internal_t; +typedef struct { + ip3db_t ip3db; + ip3db_music_record_t* records; + int num_records; + ip3db_playlist_t* playlists; + int num_playlists; +} pmp_music_internal_t; + static uint32_t pmp_add_ref(pmp_t* pmp); static uint32_t pmp_release(pmp_t* pmp); static result_t pmp_open(pmp_t* pmp, uint32_t flag); @@ -172,7 +180,7 @@ n++; } info->num_audio_extensions = n; - info->audio_extensions = (ucs2char_t*)ucs2malloc(sizeof(ucs2char_t*) * info->num_audio_extensions); + info->audio_extensions = (ucs2char_t**)ucs2malloc(sizeof(ucs2char_t*) * info->num_audio_extensions); for (n = 0, p = md->extensions;*p;p += (strlen(p)+1)) { info->audio_extensions[n++] = mbsdupucs2(p); } @@ -400,10 +408,10 @@ if (pmp->flag & PMPOF_MUSIC_DB_READ) { ucs2char_t dat[MAX_PATH], dic[MAX_PATH], idx[MAX_PATH]; - ip3db_t* ip3db = (ip3db_t*)pmp->music->instance; + pmp_music_internal_t* pmpmi = (pmp_music_internal_t*)pmp->music->instance; set_filenames(dat, dic, idx, pmp); - return ip3db_read(ip3db, dat, dic, idx); + return ip3db_read(&pmpmi->ip3db, dat, dic, idx); } return 0; } @@ -413,19 +421,21 @@ result_t ret = 0; if (pmp->flag & PMPOF_MUSIC_DB_WRITE) { ucs2char_t dat[MAX_PATH], dic[MAX_PATH], idx[MAX_PATH]; - ip3db_t* ip3db = (ip3db_t*)pmp->music->instance; + pmp_music_internal_t* pmpmi = (pmp_music_internal_t*)pmp->music->instance; + ip3db_set(&pmpmi->ip3db, pmpmi->records, pmpmi->num_records, pmpmi->playlists, pmpmi->num_playlists); + set_filenames(dat, dic, idx, pmp); - return ip3db_write(ip3db, dat, dic, idx); + return ip3db_write(&pmpmi->ip3db, dat, dic, idx); } return 0; } static result_t pmp_create_instance_music(pmp_t* pmp, pmp_music_t** ptr_music) { - ip3db_t* ip3db = NULL; pmp_music_t* music = NULL; pmp_internal_t* pmpi = (pmp_internal_t*)pmp->instance; + pmp_music_internal_t* pmpmi = NULL; *ptr_music = 0; @@ -434,19 +444,19 @@ return PMPDBE_OUTOFMEMORY; } - ip3db = calloc(1, sizeof(ip3db_t)); - if (!ip3db) { + pmpmi = calloc(1, sizeof(pmp_music_internal_t)); + if (!pmpmi) { free(music); return PMPDBE_OUTOFMEMORY; } - ip3db_init(ip3db); + ip3db_init(&pmpmi->ip3db); music->set_records = pmpmusic_set_records; music->get_records = pmpmusic_get_records; music->dump = pmpmusic_dump; music->set_playlists = pmpmusic_set_playlists; music->pmp = pmp; - music->instance = ip3db; + music->instance = pmpmi; *ptr_music = music; return 0; @@ -456,12 +466,14 @@ -static uint32_t pmpmusic_release(pmp_music_t* pmpmusic) +static uint32_t pmpmusic_release(pmp_music_t* music) { - ip3db_t* ip3db = (ip3db_t*)pmpmusic->instance; - ip3db_finish(ip3db); - free(pmpmusic->instance); - free(pmpmusic); + pmp_music_internal_t* pmpmi = (pmp_music_internal_t*)music->instance; + ip3db_finish(&pmpmi->ip3db); + free(pmpmi->records); + free(pmpmi->playlists); + free(pmpmi); + free(music); return 0; } @@ -479,15 +491,24 @@ { uint32_t i; pmp_t* pmp = pmpdb->pmp; - ip3db_t* ip3db = (ip3db_t*)pmpdb->instance; pmp_internal_t* pmpi = (pmp_internal_t*)pmpdb->pmp->instance; - ip3db_music_record_t* array = (ip3db_music_record_t*)malloc(sizeof(ip3db_music_record_t) * num_records); + pmp_music_internal_t* pmpmi = (pmp_music_internal_t*)pmpdb->instance; + /* Free records attached to pmpmi. */ + for (i = 0;i < (uint32_t)pmpmi->num_records;++i) { + ip3db_record_finish(&pmpmi->ip3db, &pmpmi->records[i]); + } + free(pmpmi->records); + + /* Allocate new records. */ + pmpmi->records = (ip3db_music_record_t*)malloc(sizeof(ip3db_music_record_t) * num_records); + pmpmi->num_records = num_records; + for (i = 0;i < num_records;++i) { const pmp_music_record_t* src = &records[i]; - ip3db_variant_t* dst = array[i]; + ip3db_variant_t* dst = pmpmi->records[i]; - ip3db_record_init(ip3db, &array[i]); + ip3db_record_init(&pmpmi->ip3db, &pmpmi->records[i]); ip3db_variant_set_str(&dst[IP3DBF_MUSIC_FILEPATH], filepath_skipdrive(src->filename, pmp->info.path_to_root)); filepath_remove_filespec(dst[IP3DBF_MUSIC_FILEPATH].value.str); filepath_addslash(dst[IP3DBF_MUSIC_FILEPATH].value.str); @@ -516,18 +537,16 @@ ip3db_variant_set_dword(&dst[IP3DBF_MUSIC_UID], (uint32_t)i+1); } - ip3db_set(ip3db, array, num_records); - free(array); return 0; } static result_t pmpmusic_get_records(pmp_music_t* pmpdb, pmp_music_record_t* records, uint32_t* num_records) { pmp_t* pmp = pmpdb->pmp; - ip3db_t* ip3db = (ip3db_t*)pmpdb->instance; pmp_internal_t* pmpi = (pmp_internal_t*)pmpdb->pmp->instance; + pmp_music_internal_t* pmpmi = (pmp_music_internal_t*)pmpdb->instance; ucs2char_t *path_to_root = alloca(sizeof(ucs2char_t) * (ucs2len(pmp->info.path_to_root)+1)); - int i, n = ip3db_num_records(ip3db); + int i, n = ip3db_num_records(&pmpmi->ip3db); if (!records) { *num_records = (uint32_t)n; @@ -535,7 +554,7 @@ } for (i = 0;i < n;++i) { - const ip3db_variant_t* src = (const ip3db_variant_t*)ip3db_get_record(ip3db, i); + const ip3db_variant_t* src = (const ip3db_variant_t*)ip3db_get_record(&pmpmi->ip3db, i); pmp_music_record_t* dst = &records[i]; size_t length = 0; @@ -575,14 +594,14 @@ return 0; } -static result_t pmpmusic_dump(pmp_music_t* pmpmusic, FILE *fp, int level) +static result_t pmpmusic_dump(pmp_music_t* music, FILE *fp, int level) { - ip3db_t* ip3db = (ip3db_t*)pmpmusic->instance; + pmp_music_internal_t* pmpmi = (pmp_music_internal_t*)music->instance; if (level > 0) { return PMP_NOTIMPLIMENTED; //return ip2db_repr(&pmpdbi->ip2db, fp); } else { - return ip3db_dump(ip3db, fp); + return ip3db_dump(&pmpmi->ip3db, fp); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |