Index: apps/metadata.c =================================================================== --- apps/metadata.c (revision 28205) +++ apps/metadata.c (working copy) @@ -273,6 +273,8 @@ */ bool get_metadata(struct mp3entry* id3, int fd, const char* trackname) { + bool retval = true; + /* Clear the mp3entry to avoid having bogus pointers appear */ memset(id3, 0, sizeof(struct mp3entry)); @@ -287,38 +289,43 @@ case AFMT_MPA_L3: if (!get_mp3_metadata(fd, id3, trackname)) { - return false; + DEBUGF("get_mp3_metadata error\n"); + retval = false; } - break; #if CONFIG_CODEC == SWCODEC case AFMT_FLAC: if (!get_flac_metadata(fd, id3)) { - return false; + DEBUGF("get_flac_metadata error\n"); + retval = false; } - break; case AFMT_WMA: if (!get_asf_metadata(fd, id3)) { - return false; + DEBUGF("get_asf_metadata error\n"); + retval = false; } break; case AFMT_APE: if (!get_monkeys_metadata(fd, id3)) { - return false; + DEBUGF("get_monkeys_metadata error\n"); + retval = false; } read_ape_tags(fd, id3); break; case AFMT_MPC: if (!get_musepack_metadata(fd, id3)) - return false; + { + DEBUGF("get_musepack_metadata error\n"); + retval = false; + } read_ape_tags(fd, id3); break; @@ -326,51 +333,51 @@ case AFMT_SPEEX: if (!get_ogg_metadata(fd, id3))/*detects and handles Ogg/Speex files*/ { - return false; + DEBUGF("get_ogg_metadata error\n"); + retval = false; } - break; case AFMT_PCM_WAV: if (!get_wave_metadata(fd, id3)) { - return false; + DEBUGF("get_wave_metadata error\n"); + retval = false; } - break; case AFMT_WAVPACK: if (!get_wavpack_metadata(fd, id3)) { - return false; + DEBUGF("get_wavpack_metadata error\n"); + retval = false; } - read_ape_tags(fd, id3); /* use any apetag info we find */ break; case AFMT_A52: if (!get_a52_metadata(fd, id3)) { - return false; + DEBUGF("get_a52_metadata error\n"); + retval = false; } - break; case AFMT_MP4_ALAC: case AFMT_MP4_AAC: if (!get_mp4_metadata(fd, id3)) { - return false; + DEBUGF("get_mp4_metadata error\n"); + retval = false; } - break; case AFMT_MOD: if (!get_mod_metadata(fd, id3)) { - return false; + DEBUGF("get_mod_metadata error\n"); + retval = false; } - break; case AFMT_SHN: @@ -378,7 +385,8 @@ id3->filesize = filesize(fd); if (!skip_id3v2(fd, id3)) { - return false; + DEBUGF("skip_id3v2 error\n"); + retval = false; } /* TODO: read the id3v2 header if it exists */ break; @@ -386,7 +394,8 @@ case AFMT_SID: if (!get_sid_metadata(fd, id3)) { - return false; + DEBUGF("get_sid_metadata error\n"); + retval = false; } break; @@ -394,7 +403,7 @@ if (!get_spc_metadata(fd, id3)) { DEBUGF("get_spc_metadata error\n"); - return false; + retval = false; } id3->filesize = filesize(fd); id3->genre_string = id3_get_num_genre(36); @@ -404,32 +413,31 @@ if (!get_adx_metadata(fd, id3)) { DEBUGF("get_adx_metadata error\n"); - return false; + retval = false; } - break; case AFMT_NSF: if (!get_nsf_metadata(fd, id3)) { DEBUGF("get_nsf_metadata error\n"); - return false; + retval = false; } break; case AFMT_AIFF: if (!get_aiff_metadata(fd, id3)) { - return false; + DEBUGF("get_aiff_metadata error\n"); + retval = false; } - break; case AFMT_SAP: if (!get_asap_metadata(fd, id3)) { DEBUGF("get_sap_metadata error\n"); - return false; + retval = false; } id3->filesize = filesize(fd); id3->genre_string = id3_get_num_genre(36); @@ -457,14 +465,14 @@ if (!get_rm_metadata(fd, id3)) { DEBUGF("get_rm_metadata error\n"); - return false; + retval = false; } break; case AFMT_OMA_ATRAC3: if (!get_oma_metadata(fd, id3)) { DEBUGF("get_oma_metadata error\n"); - return false; + retval = false; } break; @@ -472,7 +480,7 @@ if (!get_smaf_metadata(fd, id3)) { DEBUGF("get_smaf_metadata error\n"); - return false; + retval = false; } break; @@ -480,7 +488,7 @@ if (!get_au_metadata(fd, id3)) { DEBUGF("get_au_metadata error\n"); - return false; + retval = false; } break; @@ -488,7 +496,7 @@ if (!get_vox_metadata(fd, id3)) { DEBUGF("get_vox_metadata error\n"); - return false; + retval = false; } break; @@ -496,7 +504,7 @@ if (!get_wave64_metadata(fd, id3)) { DEBUGF("get_wave64_metadata error\n"); - return false; + retval = false; } break; @@ -504,25 +512,44 @@ if (!get_tta_metadata(fd, id3)) { DEBUGF("get_tta_metadata error\n"); - return false; + retval = false; } break; #endif /* CONFIG_CODEC == SWCODEC */ default: - /* If we don't know how to read the metadata, assume we can't play - the file */ - return false; + /* We do not how to read the metadata as the format is unknown. */ + DEBUGF("probe_file_format result unknown\n"); + retval = false; break; } - /* We have successfully read the metadata from the file */ - - lseek(fd, 0, SEEK_SET); - strlcpy(id3->path, trackname, sizeof(id3->path)); + if (false != retval) + { + /* We have successfully read the metadata from the file. */ + lseek(fd, 0, SEEK_SET); + strlcpy(id3->path, trackname, sizeof(id3->path)); + } + else + { + /* There was an error occuring during reading metadata or we do not + know how to read it. So, we assume we cannot play the file. */ +#if 0 + /* This would be the correct implementation. */ + DEBUGF("metadata error, delete mp3entry\n"); + memset(id3, 0, sizeof(struct mp3entry)); +#else + /* This implementation avoids an error in the playback engine and + keeps the AFMT-type and the filename. */ + DEBUGF("FIXME: metadata error, keep codectype and filename\n"); + unsigned int save_codectype = id3->codectype; + memset(id3 + MAX_PATH, 0, sizeof(struct mp3entry)-MAX_PATH); + id3->codectype = save_codectype; +#endif + } - return true; + return retval; } #ifndef __PCTOOL__ Index: apps/buffering.c =================================================================== --- apps/buffering.c (revision 28205) +++ apps/buffering.c (working copy) @@ -650,8 +650,8 @@ { if (!get_metadata((struct mp3entry *)(buffer + h->data), h->fd, h->path)) { - /* metadata parsing failed: clear the buffer. */ - memset(buffer + h->data, 0, sizeof(struct mp3entry)); + /* metadata parsing failed */ + logf("buffer_handle: metadata parsing failed."); } close(h->fd); h->fd = -1;