📄 metadata_object.c
字号:
tr = &block->data.cue_sheet.tracks[track_num]; FLAC__ASSERT(pos <= tr->num_indices); tr_resize_(block, track_num, tr->num_indices+1); memmove(&tr->indices[pos+1], &tr->indices[pos], sizeof(FLAC__StreamMetadata_CueSheet_Index)*(tr->num_indices-1-pos)); tr_set_new_(block, track_num, pos, index); cs_calc_len_(block);}static void tr_delete_(FLAC__StreamMetadata *block, unsigned track_num, unsigned pos){ FLAC__StreamMetadata_CueSheet_Track *tr; FLAC__ASSERT(track_num < block->data.cue_sheet.num_tracks); tr = &block->data.cue_sheet.tracks[track_num]; FLAC__ASSERT(pos <= tr->num_indices); memmove(&tr->indices[pos], &tr->indices[pos+1], sizeof(FLAC__StreamMetadata_CueSheet_Index)*(tr->num_indices-pos-1)); tr_resize_(block, track_num, tr->num_indices-1); cs_calc_len_(block);}static void cs_resize_(FLAC__StreamMetadata *block, unsigned num){ FLAC__StreamMetadata_CueSheet *cs = &block->data.cue_sheet; if(cs->num_tracks != 0) { FLAC__ASSERT(0 != cs->tracks); if(num < cs->num_tracks) { unsigned i; for(i = num; i < cs->num_tracks; i++) { if(0 != cs->tracks[i].indices) free(cs->tracks[i].indices); } } } if(num == 0) { if(0 != cs->tracks) { free(cs->tracks); cs->tracks = 0; } } else { cs->tracks = (FLAC__StreamMetadata_CueSheet_Track*)realloc(cs->tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track)*num); FLAC__ASSERT(0 != cs->tracks); if(num > cs->num_tracks) memset(cs->tracks+cs->num_tracks, 0, sizeof(FLAC__StreamMetadata_CueSheet_Track)*(num-cs->num_tracks)); } cs->num_tracks = num; cs_calc_len_(block);}static void cs_set_new_(FLAC__StreamMetadata_CueSheet_Track *track, FLAC__StreamMetadata *block, unsigned pos, FLAC__uint64 offset, FLAC__byte number, const char *isrc, FLAC__bool data, FLAC__bool pre_em){ track_new_(track, offset, number, isrc, data, pre_em); block->data.cue_sheet.tracks[pos] = *track; cs_calc_len_(block);}static void cs_insert_new_(FLAC__StreamMetadata_CueSheet_Track *track, FLAC__StreamMetadata *block, unsigned pos, FLAC__uint64 offset, FLAC__byte number, const char *isrc, FLAC__bool data, FLAC__bool pre_em){ cs_resize_(block, block->data.cue_sheet.num_tracks+1); memmove(&block->data.cue_sheet.tracks[pos+1], &block->data.cue_sheet.tracks[pos], sizeof(FLAC__StreamMetadata_CueSheet_Track)*(block->data.cue_sheet.num_tracks-1-pos)); cs_set_new_(track, block, pos, offset, number, isrc, data, pre_em); cs_calc_len_(block);}static void cs_delete_(FLAC__StreamMetadata *block, unsigned pos){ if(0 != block->data.cue_sheet.tracks[pos].indices) free(block->data.cue_sheet.tracks[pos].indices); memmove(&block->data.cue_sheet.tracks[pos], &block->data.cue_sheet.tracks[pos+1], sizeof(FLAC__StreamMetadata_CueSheet_Track)*(block->data.cue_sheet.num_tracks-pos-1)); block->data.cue_sheet.tracks[block->data.cue_sheet.num_tracks-1].indices = 0; block->data.cue_sheet.tracks[block->data.cue_sheet.num_tracks-1].num_indices = 0; cs_resize_(block, block->data.cue_sheet.num_tracks-1); cs_calc_len_(block);}FLAC__bool test_metadata_object(){ FLAC__StreamMetadata *block, *blockcopy, *vorbiscomment, *cuesheet; FLAC__StreamMetadata_SeekPoint seekpoint_array[8]; FLAC__StreamMetadata_VorbisComment_Entry entry; FLAC__StreamMetadata_CueSheet_Index index; FLAC__StreamMetadata_CueSheet_Track track; unsigned i, expected_length, seekpoints; int j; static FLAC__byte dummydata[4] = { 'a', 'b', 'c', 'd' }; printf("\n+++ libFLAC unit test: metadata objects\n\n"); printf("testing STREAMINFO\n"); printf("testing FLAC__metadata_object_new()... "); block = FLAC__metadata_object_new(FLAC__METADATA_TYPE_STREAMINFO); if(0 == block) { printf("FAILED, returned NULL\n"); return false; } expected_length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH; if(block->length != expected_length) { printf("FAILED, bad length, expected %u, got %u\n", expected_length, block->length); return false; } printf("OK\n"); printf("testing FLAC__metadata_object_clone()... "); blockcopy = FLAC__metadata_object_clone(block); if(0 == blockcopy) { printf("FAILED, returned NULL\n"); return false; } if(!mutils__compare_block(block, blockcopy)) return false; printf("OK\n"); printf("testing FLAC__metadata_object_delete()... "); FLAC__metadata_object_delete(blockcopy); FLAC__metadata_object_delete(block); printf("OK\n"); printf("testing PADDING\n"); printf("testing FLAC__metadata_object_new()... "); block = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING); if(0 == block) { printf("FAILED, returned NULL\n"); return false; } expected_length = 0; if(block->length != expected_length) { printf("FAILED, bad length, expected %u, got %u\n", expected_length, block->length); return false; } printf("OK\n"); printf("testing FLAC__metadata_object_clone()... "); blockcopy = FLAC__metadata_object_clone(block); if(0 == blockcopy) { printf("FAILED, returned NULL\n"); return false; } if(!mutils__compare_block(block, blockcopy)) return false; printf("OK\n"); printf("testing FLAC__metadata_object_delete()... "); FLAC__metadata_object_delete(blockcopy); FLAC__metadata_object_delete(block); printf("OK\n"); printf("testing APPLICATION\n"); printf("testing FLAC__metadata_object_new()... "); block = FLAC__metadata_object_new(FLAC__METADATA_TYPE_APPLICATION); if(0 == block) { printf("FAILED, returned NULL\n"); return false; } expected_length = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8; if(block->length != expected_length) { printf("FAILED, bad length, expected %u, got %u\n", expected_length, block->length); return false; } printf("OK\n"); printf("testing FLAC__metadata_object_clone()... "); blockcopy = FLAC__metadata_object_clone(block); if(0 == blockcopy) { printf("FAILED, returned NULL\n"); return false; } if(!mutils__compare_block(block, blockcopy)) return false; printf("OK\n"); printf("testing FLAC__metadata_object_delete()... "); FLAC__metadata_object_delete(blockcopy); printf("OK\n"); printf("testing FLAC__metadata_object_application_set_data(copy)... "); if(!FLAC__metadata_object_application_set_data(block, dummydata, sizeof(dummydata), true/*copy*/)) { printf("FAILED, returned false\n"); return false; } expected_length = (FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8) + sizeof(dummydata); if(block->length != expected_length) { printf("FAILED, bad length, expected %u, got %u\n", expected_length, block->length); return false; } if(0 != memcmp(block->data.application.data, dummydata, sizeof(dummydata))) { printf("FAILED, data mismatch\n"); return false; } printf("OK\n"); printf("testing FLAC__metadata_object_clone()... "); blockcopy = FLAC__metadata_object_clone(block); if(0 == blockcopy) { printf("FAILED, returned NULL\n"); return false; } if(!mutils__compare_block(block, blockcopy)) return false; printf("OK\n"); printf("testing FLAC__metadata_object_delete()... "); FLAC__metadata_object_delete(blockcopy); printf("OK\n"); printf("testing FLAC__metadata_object_application_set_data(own)... "); if(!FLAC__metadata_object_application_set_data(block, make_dummydata_(dummydata, sizeof(dummydata)), sizeof(dummydata), false/*own*/)) { printf("FAILED, returned false\n"); return false; } expected_length = (FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8) + sizeof(dummydata); if(block->length != expected_length) { printf("FAILED, bad length, expected %u, got %u\n", expected_length, block->length); return false; } if(0 != memcmp(block->data.application.data, dummydata, sizeof(dummydata))) { printf("FAILED, data mismatch\n"); return false; } printf("OK\n"); printf("testing FLAC__metadata_object_clone()... "); blockcopy = FLAC__metadata_object_clone(block); if(0 == blockcopy) { printf("FAILED, returned NULL\n"); return false; } if(!mutils__compare_block(block, blockcopy)) return false; printf("OK\n"); printf("testing FLAC__metadata_object_delete()... "); FLAC__metadata_object_delete(blockcopy); FLAC__metadata_object_delete(block); printf("OK\n"); printf("testing SEEKTABLE\n"); for(i = 0; i < sizeof(seekpoint_array) / sizeof(FLAC__StreamMetadata_SeekPoint); i++) { seekpoint_array[i].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; seekpoint_array[i].stream_offset = 0; seekpoint_array[i].frame_samples = 0; } seekpoints = 0; printf("testing FLAC__metadata_object_new()... "); block = FLAC__metadata_object_new(FLAC__METADATA_TYPE_SEEKTABLE); if(0 == block) { printf("FAILED, returned NULL\n"); return false; } if(!check_seektable_(block, seekpoints, 0)) return false; printf("testing FLAC__metadata_object_clone()... "); blockcopy = FLAC__metadata_object_clone(block); if(0 == blockcopy) { printf("FAILED, returned NULL\n"); return false; } if(!mutils__compare_block(block, blockcopy)) return false; printf("OK\n"); printf("testing FLAC__metadata_object_delete()... "); FLAC__metadata_object_delete(blockcopy); printf("OK\n"); seekpoints = 2; printf("testing FLAC__metadata_object_seektable_resize_points(grow to %u)...", seekpoints); if(!FLAC__metadata_object_seektable_resize_points(block, seekpoints)) { printf("FAILED, returned false\n"); return false; } if(!check_seektable_(block, seekpoints, seekpoint_array)) return false; seekpoints = 1; printf("testing FLAC__metadata_object_seektable_resize_points(shrink to %u)...", seekpoints); if(!FLAC__metadata_object_seektable_resize_points(block, seekpoints)) { printf("FAILED, returned false\n"); return false; } if(!check_seektable_(block, seekpoints, seekpoint_array)) return false; printf("testing FLAC__metadata_object_seektable_is_legal()..."); if(!FLAC__metadata_object_seektable_is_legal(block)) { printf("FAILED, returned false\n"); return false; } printf("OK\n"); seekpoints = 0; printf("testing FLAC__metadata_object_seektable_resize_points(shrink to %u)...", seekpoints); if(!FLAC__metadata_object_seektable_resize_points(block, seekpoints)) { printf("FAILED, returned false\n"); return false; } if(!check_seektable_(block, seekpoints, 0)) return false; seekpoints++; printf("testing FLAC__metadata_object_seektable_insert_point() on empty array..."); if(!FLAC__metadata_object_seektable_insert_point(block, 0, seekpoint_array[0])) { printf("FAILED, returned false\n"); return false; } if(!check_seektable_(block, seekpoints, seekpoint_array)) return false; seekpoint_array[0].sample_number = 1; seekpoints++; printf("testing FLAC__metadata_object_seektable_insert_point() on beginning of non-empty array..."); if(!FLAC__metadata_object_seektable_insert_point(block, 0, seekpoint_array[0])) { printf("FAILED, returned false\n"); return false; } if(!check_seektable_(block, seekpoints, seekpoint_array)) return false; seekpoint_array[1].sample_number = 2; seekpoints++; printf("testing FLAC__metadata_object_seektable_insert_point() on middle of non-empty array..."); if(!FLAC__metadata_object_seektable_insert_point(block, 1, seekpoint_array[1])) { printf("FAILED, returned false\n"); return false; } if(!check_seektable_(block, seekpoints, seekpoint_array)) return false; seekpoint_array[3].sample_number = 3; seekpoints++; printf("testing FLAC__metadata_object_seektable_insert_point() on end of non-empty array..."); if(!FLAC__metadata_object_seektable_insert_point(block, 3, seekpoint_array[3])) { printf("FAILED, returned false\n"); return false; } if(!check_seektable_(block, seekpoints, seekpoint_array)) return false; printf("testing FLAC__metadata_object_clone()... "); blockcopy = FLAC__metadata_object_clone(block); if(0 == blockcopy) { printf("FAILED, returned NULL\n"); return false; } if(!mutils__compare_block(block, blockcopy)) return false; printf("OK\n"); printf("testing FLAC__metadata_object_delete()... "); FLAC__metadata_object_delete(blockcopy); printf("OK\n"); seekpoint_array[2].sample_number = seekpoint_array[3].sample_number; seekpoints--; printf("testing FLAC__metadata_object_seektable_delete_point() on middle of array..."); if(!FLAC__metadata_object_seektable_delete_point(block, 2)) { printf("FAILED, returned false\n"); return false; } if(!check_seektable_(block, seekpoints, seekpoint_array)) return false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -