From: <ny...@us...> - 2007-01-25 02:29:25
|
Revision: 275 http://svn.sourceforge.net/pmplib/?rev=275&view=rev Author: nyaochi Date: 2007-01-24 18:29:25 -0800 (Wed, 24 Jan 2007) Log Message: ----------- Synchronize pmp_iriverplus3 with the latest API spec. Modified Paths: -------------- trunk/pmplib/frontend/easypmp/common/database.c trunk/pmplib/include/pmp.h trunk/pmplib/lib/pmp/pmp.c trunk/pmplib/lib/pmp_iriverplus3/ip3db.c trunk/pmplib/lib/pmp_iriverplus3/pmp_iriverplus3.c Modified: trunk/pmplib/frontend/easypmp/common/database.c =================================================================== --- trunk/pmplib/frontend/easypmp/common/database.c 2007-01-24 23:07:42 UTC (rev 274) +++ trunk/pmplib/frontend/easypmp/common/database.c 2007-01-25 02:29:25 UTC (rev 275) @@ -211,7 +211,7 @@ if (begin + 1 == end) { // If the time stamps are identical, let us skip this file. if (old_records[begin].ts_update == timestamp) { - pmp_record_copy(record, &old_records[begin]); + pmp_record_clone(record, &old_records[begin]); is_skipping = 1; } } Modified: trunk/pmplib/include/pmp.h =================================================================== --- trunk/pmplib/include/pmp.h 2007-01-24 23:07:42 UTC (rev 274) +++ trunk/pmplib/include/pmp.h 2007-01-25 02:29:25 UTC (rev 275) @@ -416,7 +416,10 @@ PMPAPI void pmp_record_init(pmp_music_record_t* record); PMPAPI void pmp_record_finish(pmp_music_record_t* record); -PMPAPI result_t pmp_record_copy(pmp_music_record_t* dst, const pmp_music_record_t* src); +PMPAPI result_t pmp_record_clone(pmp_music_record_t* dst, const pmp_music_record_t* src); +PMPAPI void pmp_records_finish(pmp_music_record_t* records, int num_records); +PMPAPI result_t pmp_records_clone(pmp_music_record_t* dst, const pmp_music_record_t* src, int num_records); + PMPAPI uint32_t pmp_interlocked_increment(uint32_t* count); PMPAPI uint32_t pmp_interlocked_decrement(uint32_t* count); Modified: trunk/pmplib/lib/pmp/pmp.c =================================================================== --- trunk/pmplib/lib/pmp/pmp.c 2007-01-24 23:07:42 UTC (rev 274) +++ trunk/pmplib/lib/pmp/pmp.c 2007-01-25 02:29:25 UTC (rev 275) @@ -51,7 +51,7 @@ pmp_record_init(record); } -result_t pmp_record_copy(pmp_music_record_t* dst, const pmp_music_record_t* src) +result_t pmp_record_clone(pmp_music_record_t* dst, const pmp_music_record_t* src) { memcpy(dst, src, sizeof(*src)); dst->filename = src->filename ? ucs2dup(src->filename) : NULL; @@ -63,6 +63,23 @@ return 0; } +void pmp_records_finish(pmp_music_record_t* records, int num_records) +{ + int i; + for (i = 0;i < num_records;++i) { + pmp_record_finish(&records[i]); + } + ucs2free(records); +} + +result_t pmp_records_clone(pmp_music_record_t* dst, const pmp_music_record_t* src, int num_records) +{ + int i; + for (i = 0;i < num_records;++i) { + pmp_record_clone(&dst[i], &src[i]); + } +} + void pmp_playlist_init(pmp_playlist_t* playlist) { memset(playlist, 0, sizeof(*playlist)); Modified: trunk/pmplib/lib/pmp_iriverplus3/ip3db.c =================================================================== --- trunk/pmplib/lib/pmp_iriverplus3/ip3db.c 2007-01-24 23:07:42 UTC (rev 274) +++ trunk/pmplib/lib/pmp_iriverplus3/ip3db.c 2007-01-25 02:29:25 UTC (rev 275) @@ -36,7 +36,6 @@ #include "dic.h" #include "dat.h" #include "idx.h" -#include "plp.h" void ip3db_variant_init(ip3db_variant_t* var, int type) { Modified: trunk/pmplib/lib/pmp_iriverplus3/pmp_iriverplus3.c =================================================================== --- trunk/pmplib/lib/pmp_iriverplus3/pmp_iriverplus3.c 2007-01-24 23:07:42 UTC (rev 274) +++ trunk/pmplib/lib/pmp_iriverplus3/pmp_iriverplus3.c 2007-01-25 02:29:25 UTC (rev 275) @@ -91,7 +91,7 @@ typedef struct { ip3db_t ip3db; - ip3db_music_record_t* records; + pmp_music_record_t* records; int num_records; ip3db_playlist_t* playlists; int num_playlists; @@ -103,11 +103,13 @@ static result_t pmp_close(pmp_t* pmp); static result_t pmp_create_instance_music(pmp_t* pmp, pmp_music_t** ptr_pmpdb); -static uint32_t pmpmusic_release(pmp_music_t* pmpdb); -static result_t pmpmusic_set_records(pmp_music_t* pmpdb, const pmp_music_record_t* records, uint32_t num_records); -static result_t pmpmusic_get_records(pmp_music_t* pmpdb, pmp_music_record_t* records, uint32_t* num_records); -static result_t pmpmusic_dump(pmp_music_t* pmpdb, FILE *fp, int level); -static result_t pmpmusic_set_playlists(pmp_music_t* pmpdb, const pmp_playlist_t* playlists, uint32_t num_playlists); +static uint32_t pmpmusic_release(pmp_music_t* music); +static uint32_t pmpmusic_open(pmp_music_t* music); +static uint32_t pmpmusic_close(pmp_music_t* music); +static result_t pmpmusic_set_records(pmp_music_t* music, const pmp_music_record_t* records, uint32_t num_records); +static result_t pmpmusic_get_records(pmp_music_t* music, pmp_music_record_t* records, uint32_t* num_records); +static result_t pmpmusic_dump(pmp_music_t* music, FILE *fp, int level); +static result_t pmpmusic_set_playlists(pmp_music_t* music, const pmp_playlist_t* playlists, uint32_t num_playlists); #define COMP(a, b) ((a)>(b))-((a)<(b)) @@ -404,15 +406,16 @@ static result_t pmp_open(pmp_t* pmp, uint32_t flag) { result_t ret = 0; + + // Set the open flag. pmp->flag = flag; - if (pmp->flag & PMPOF_MUSIC_DB_READ) { - ucs2char_t dat[MAX_PATH], dic[MAX_PATH], idx[MAX_PATH]; - pmp_music_internal_t* pmpmi = (pmp_music_internal_t*)pmp->music->instance; + // Open the music database. + ret = pmpmusic_open(pmp->music); + if (ret) { + return ret; + } - set_filenames(dat, dic, idx, pmp); - return ip3db_read(&pmpmi->ip3db, dat, dic, idx); - } return 0; } @@ -420,23 +423,12 @@ { result_t ret = 0; - // Music database/playlist. - if (pmp->flag & PMPOF_MUSIC_DB_WRITE || pmp->flag & PMPOF_MUSIC_PL_WRITE) { - ucs2char_t dat[MAX_PATH], dic[MAX_PATH], idx[MAX_PATH]; - pmp_music_internal_t* pmpmi = (pmp_music_internal_t*)pmp->music->instance; + // Close the music database. + ret = pmpmusic_close(pmp->music); + if (ret) { + return ret; + } - // Register records (and playlists) to the database. - if (pmp->flag & PMPOF_MUSIC_PL_WRITE) { - ip3db_set(&pmpmi->ip3db, pmpmi->records, pmpmi->num_records, pmpmi->playlists, pmpmi->num_playlists); - } else { - ip3db_set(&pmpmi->ip3db, pmpmi->records, pmpmi->num_records, NULL, 0); - } - - // Write out the music database. - set_filenames(dat, dic, idx, pmp); - ret = ip3db_write(&pmpmi->ip3db, dat, dic, idx); - - } return 0; } @@ -474,18 +466,160 @@ - static uint32_t pmpmusic_release(pmp_music_t* music) { pmp_music_internal_t* pmpmi = (pmp_music_internal_t*)music->instance; ip3db_finish(&pmpmi->ip3db); - free(pmpmi->records); + pmp_records_finish(pmpmi->records, pmpmi->num_records); free(pmpmi->playlists); free(pmpmi); free(music); return 0; } +static uint32_t pmpmusic_open(pmp_music_t* music) +{ + result_t ret = 0; + pmp_t* pmp = music->pmp; + pmp_music_internal_t* pmpmi = (pmp_music_internal_t*)music->instance; + + // Free the existing records. + pmp_records_finish(pmpmi->records, pmpmi->num_records); + pmpmi->records = 0; + pmpmi->num_records = 0; + + // Open the music database if necessary. + if (pmp->flag & PMPOF_MUSIC_DB_READ) { + int i; + ucs2char_t dat[MAX_PATH], dic[MAX_PATH], idx[MAX_PATH]; + pmp_music_internal_t* pmpmi = (pmp_music_internal_t*)pmp->music->instance; + + // Read the music database. + set_filenames(dat, dic, idx, pmp); + ret = ip3db_read(&pmpmi->ip3db, dat, dic, idx); + if (ret) { + return ret; + } + + // The number of music records. + pmpmi->num_records = ip3db_num_records(&pmpmi->ip3db); + + // Allocate an array of the records. + pmpmi->records = (pmp_music_record_t*)malloc(sizeof(pmp_music_record_t) * pmpmi->num_records); + + // Convert IP3DB records to a pmp_music_record_t array. + for (i = 0;i < pmpmi->num_records;++i) { + const ip3db_variant_t* src = (const ip3db_variant_t*)ip3db_get_record(&pmpmi->ip3db, i); + pmp_music_record_t* dst = &pmpmi->records[i]; + size_t length = 0; + + pmp_record_init(dst); + + length = ucs2len(pmp->info.path_to_root); + length += ucs2len(src[IP3DBF_MUSIC_FILEPATH].value.str); + length += ucs2len(src[IP3DBF_MUSIC_FILENAME].value.str); + dst->filename = (ucs2char_t*)ucs2malloc(sizeof(ucs2char_t) * (length+1)); + ucs2cpy(dst->filename, pmp->info.path_to_root); + ucs2cat(dst->filename, src[IP3DBF_MUSIC_FILEPATH].value.str+1); + ucs2cat(dst->filename, src[IP3DBF_MUSIC_FILENAME].value.str); + filepath_backslash(dst->filename); + + dst->title = ucs2dup(src[IP3DBF_MUSIC_TITLE].value.str); + dst->artist = ucs2dup(src[IP3DBF_MUSIC_ARTIST].value.str); + dst->album = ucs2dup(src[IP3DBF_MUSIC_ALBUM].value.str); + dst->genre = ucs2dup(src[IP3DBF_MUSIC_GENRE].value.str); + dst->date = ucs2dup(src[IP3DBF_MUSIC_ORGRELEASEDATE].value.str); + switch (src[IP3DBF_MUSIC_FILEFORMAT].value.word) { + case 0: + dst->codec = PMPCODEC_MPEGLAYER3; + break; + case 3: + dst->codec = PMPCODEC_VORBIS; + break; + case 5: + dst->codec = PMPCODEC_WMA; + break; + } + dst->track_number = src[IP3DBF_MUSIC_TRACKNUMBER].value.word; + dst->bitrate = src[IP3DBF_MUSIC_BITRATE].value.dword; + dst->duration = src[IP3DBF_MUSIC_DURATION].value.dword; + dst->ts_update = src[IP3DBF_MUSIC_CLUSA].value.dword; + dst->rating = src[IP3DBF_MUSIC_RATING].value.word; + } + } + + return 0; +} + +static uint32_t pmpmusic_close(pmp_music_t* music) +{ + result_t ret = 0; + pmp_t* pmp = music->pmp; + pmp_music_internal_t* pmpmi = (pmp_music_internal_t*)music->instance; + + if (pmp->flag & PMPOF_MUSIC_DB_WRITE) { + int i; + ucs2char_t dat[MAX_PATH], dic[MAX_PATH], idx[MAX_PATH]; + ip3db_music_record_t* records = NULL; + + // Allocate an array of music records. + records = (ip3db_music_record_t*)malloc(sizeof(ip3db_music_record_t) * pmpmi->num_records); + + // Build an array of IP3DB records. + for (i = 0;i < pmpmi->num_records;++i) { + const pmp_music_record_t* src = &pmpmi->records[i]; + ip3db_variant_t* dst = records[i]; + + ip3db_record_init(&pmpmi->ip3db, &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); + filepath_slash(dst[IP3DBF_MUSIC_FILEPATH].value.str); + ip3db_variant_set_str(&dst[IP3DBF_MUSIC_FILENAME], filepath_skippath(src->filename)); + ip3db_variant_set_str(&dst[IP3DBF_MUSIC_ARTIST], src->artist); + ip3db_variant_set_str(&dst[IP3DBF_MUSIC_ALBUM], src->album); + ip3db_variant_set_str(&dst[IP3DBF_MUSIC_GENRE], src->genre); + ip3db_variant_set_str(&dst[IP3DBF_MUSIC_TITLE], src->title); + ip3db_variant_set_dword(&dst[IP3DBF_MUSIC_DURATION], src->duration); + ip3db_variant_set_word(&dst[IP3DBF_MUSIC_RATING], (uint16_t)src->rating); + switch (src->codec) { + case PMPCODEC_MPEGLAYER3: + ip3db_variant_set_word(&dst[IP3DBF_MUSIC_FILEFORMAT], 0); + break; + case PMPCODEC_VORBIS: + ip3db_variant_set_word(&dst[IP3DBF_MUSIC_FILEFORMAT], 3); + break; + case PMPCODEC_WMA: + ip3db_variant_set_word(&dst[IP3DBF_MUSIC_FILEFORMAT], 5); + break; + } + ip3db_variant_set_word(&dst[IP3DBF_MUSIC_TRACKNUMBER], (uint16_t)src->track_number); + ip3db_variant_set_dword(&dst[IP3DBF_MUSIC_BITRATE], src->bitrate); + ip3db_variant_set_dword(&dst[IP3DBF_MUSIC_CLUSA], src->ts_update); + ip3db_variant_set_dword(&dst[IP3DBF_MUSIC_UID], (uint32_t)i+1); + } + + // Register records (and playlists) to the database. + if (pmp->flag & PMPOF_MUSIC_PL_WRITE) { + ip3db_set(&pmpmi->ip3db, records, pmpmi->num_records, pmpmi->playlists, pmpmi->num_playlists); + } else { + ip3db_set(&pmpmi->ip3db, records, pmpmi->num_records, NULL, 0); + } + + // Write out the music database. + set_filenames(dat, dic, idx, pmp); + ret = ip3db_write(&pmpmi->ip3db, dat, dic, idx); + + // Free IP3DB records. + for (i = 0;i < pmpmi->num_records;++i) { + ip3db_record_finish(&pmpmi->ip3db, &records[i]); + } + free(records); + } + + return 0; +} + static ucs2char_t* _filepath_removeslash(ucs2char_t* path) { size_t length = ucs2len(path)-1; @@ -496,111 +630,36 @@ return (path + length); } -static result_t pmpmusic_set_records(pmp_music_t* pmpdb, const pmp_music_record_t* records, uint32_t num_records) +static result_t pmpmusic_set_records(pmp_music_t* music, const pmp_music_record_t* records, uint32_t num_records) { - uint32_t i; - pmp_t* pmp = pmpdb->pmp; - pmp_internal_t* pmpi = (pmp_internal_t*)pmpdb->pmp->instance; - pmp_music_internal_t* pmpmi = (pmp_music_internal_t*)pmpdb->instance; + pmp_t* pmp = music->pmp; + pmp_music_internal_t* pmpmi = (pmp_music_internal_t*)music->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); + pmp_records_finish(pmpmi->records, pmpmi->num_records); /* Allocate new records. */ - pmpmi->records = (ip3db_music_record_t*)malloc(sizeof(ip3db_music_record_t) * num_records); + pmpmi->records = (pmp_music_record_t*)ucs2malloc(sizeof(pmp_music_record_t) * num_records); pmpmi->num_records = num_records; + pmp_records_clone(pmpmi->records, records, num_records); - for (i = 0;i < num_records;++i) { - const pmp_music_record_t* src = &records[i]; - ip3db_variant_t* dst = pmpmi->records[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); - filepath_slash(dst[IP3DBF_MUSIC_FILEPATH].value.str); - ip3db_variant_set_str(&dst[IP3DBF_MUSIC_FILENAME], filepath_skippath(src->filename)); - ip3db_variant_set_str(&dst[IP3DBF_MUSIC_ARTIST], src->artist); - ip3db_variant_set_str(&dst[IP3DBF_MUSIC_ALBUM], src->album); - ip3db_variant_set_str(&dst[IP3DBF_MUSIC_GENRE], src->genre); - ip3db_variant_set_str(&dst[IP3DBF_MUSIC_TITLE], src->title); - ip3db_variant_set_dword(&dst[IP3DBF_MUSIC_DURATION], src->duration); - ip3db_variant_set_word(&dst[IP3DBF_MUSIC_RATING], (uint16_t)src->rating); - switch (src->codec) { - case PMPCODEC_MPEGLAYER3: - ip3db_variant_set_word(&dst[IP3DBF_MUSIC_FILEFORMAT], 0); - break; - case PMPCODEC_VORBIS: - ip3db_variant_set_word(&dst[IP3DBF_MUSIC_FILEFORMAT], 3); - break; - case PMPCODEC_WMA: - ip3db_variant_set_word(&dst[IP3DBF_MUSIC_FILEFORMAT], 5); - break; - } - ip3db_variant_set_word(&dst[IP3DBF_MUSIC_TRACKNUMBER], (uint16_t)src->track_number); - ip3db_variant_set_dword(&dst[IP3DBF_MUSIC_BITRATE], src->bitrate); - ip3db_variant_set_dword(&dst[IP3DBF_MUSIC_CLUSA], src->ts_update); - ip3db_variant_set_dword(&dst[IP3DBF_MUSIC_UID], (uint32_t)i+1); - - } return 0; } -static result_t pmpmusic_get_records(pmp_music_t* pmpdb, pmp_music_record_t* records, uint32_t* num_records) +static result_t pmpmusic_get_records(pmp_music_t* music, pmp_music_record_t* records, uint32_t* num_records) { - pmp_t* pmp = pmpdb->pmp; - 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(&pmpmi->ip3db); + pmp_t* pmp = music->pmp; + pmp_music_internal_t* pmpmi = (pmp_music_internal_t*)music->instance; if (!records) { - *num_records = (uint32_t)n; + *num_records = pmpmi->num_records; return 0; + } else if (*num_records == pmpmi->num_records) { + pmp_records_clone(records, pmpmi->records, pmpmi->num_records); + return 0; + } else { + return PMPDBE_INSUFFICIENT; } - - for (i = 0;i < n;++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; - - pmp_record_init(dst); - - length = ucs2len(pmp->info.path_to_root); - length += ucs2len(src[IP3DBF_MUSIC_FILEPATH].value.str); - length += ucs2len(src[IP3DBF_MUSIC_FILENAME].value.str); - dst->filename = (ucs2char_t*)ucs2malloc(sizeof(ucs2char_t) * (length+1)); - ucs2cpy(dst->filename, pmp->info.path_to_root); - ucs2cat(dst->filename, src[IP3DBF_MUSIC_FILEPATH].value.str+1); - ucs2cat(dst->filename, src[IP3DBF_MUSIC_FILENAME].value.str); - filepath_backslash(dst->filename); - - dst->title = ucs2dup(src[IP3DBF_MUSIC_TITLE].value.str); - dst->artist = ucs2dup(src[IP3DBF_MUSIC_ARTIST].value.str); - dst->album = ucs2dup(src[IP3DBF_MUSIC_ALBUM].value.str); - dst->genre = ucs2dup(src[IP3DBF_MUSIC_GENRE].value.str); - dst->date = ucs2dup(src[IP3DBF_MUSIC_ORGRELEASEDATE].value.str); - switch (src[IP3DBF_MUSIC_FILEFORMAT].value.word) { - case 0: - dst->codec = PMPCODEC_MPEGLAYER3; - break; - case 3: - dst->codec = PMPCODEC_VORBIS; - break; - case 5: - dst->codec = PMPCODEC_WMA; - break; - } - dst->track_number = src[IP3DBF_MUSIC_TRACKNUMBER].value.word; - dst->bitrate = src[IP3DBF_MUSIC_BITRATE].value.dword; - dst->duration = src[IP3DBF_MUSIC_DURATION].value.dword; - dst->ts_update = src[IP3DBF_MUSIC_CLUSA].value.dword; - dst->rating = src[IP3DBF_MUSIC_RATING].value.word; - } - return 0; } static result_t pmpmusic_dump(pmp_music_t* music, FILE *fp, int level) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |