X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Ftest_libFLAC%2B%2B%2Fmetadata_manip.cpp;h=ff024162c6bd75d0a9b3ab296984acf4664f877d;hb=f25b2602dce3c09098e3092bfad983e3ec7fdb4f;hp=a813813014bff2434930f1e4804441f5d312ac01;hpb=c0da196166f47e62654b95ec6f03c6bc42954cea;p=platform%2Fupstream%2Fflac.git diff --git a/src/test_libFLAC++/metadata_manip.cpp b/src/test_libFLAC++/metadata_manip.cpp index a813813..ff02416 100644 --- a/src/test_libFLAC++/metadata_manip.cpp +++ b/src/test_libFLAC++/metadata_manip.cpp @@ -1,5 +1,5 @@ /* test_libFLAC++ - Unit tester for libFLAC++ - * Copyright (C) 2002,2003,2004,2005,2006 Josh Coalson + * Copyright (C) 2002,2003,2004,2005,2006,2007,2008,2009 Josh Coalson * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -11,23 +11,25 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#if HAVE_CONFIG_H +# include +#endif + #include #include /* for malloc() */ #include /* for memcpy()/memset() */ -#if defined _MSC_VER || defined __MINGW32__ -#include /* for utime() */ -#include /* for chmod() */ -//@@@ [2G limit] hacks for MSVC6 -#define fseeko fseek -#define ftello ftell -#else #include /* some flavors of BSD (like OS X) require this to get time_t */ +#ifdef _MSC_VER +#include +#else #include /* for utime() */ +#endif +#if !defined _MSC_VER && !defined __MINGW32__ && !defined __EMX__ #include /* for chown(), unlink() */ #endif #include /* for stat(), maybe chmod() */ @@ -35,6 +37,8 @@ #include "FLAC++/decoder.h" #include "FLAC++/metadata.h" #include "share/grabbag.h" +#include "share/compat.h" +#include "share/macros.h" extern "C" { #include "test_libs_common/file_utils_flac.h" } @@ -67,14 +71,17 @@ struct OurMetadata { unsigned num_blocks; }; -static const char *flacfile_ = "metadata.flac"; - -/* our copy of the metadata in flacfile_ */ +/* our copy of the metadata in flacfilename() */ static OurMetadata our_metadata_; /* the current block number that corresponds to the position of the iterator we are testing */ static unsigned mc_our_block_number_ = 0; +static const char *flacfilename(bool is_ogg) +{ + return is_ogg? "metadata.oga" : "metadata.flac"; +} + static bool die_(const char *msg) { printf("ERROR: %s\n", msg); @@ -106,6 +113,16 @@ static void *malloc_or_die_(size_t size) return x; } +static char *strdup_or_die_(const char *s) +{ + char *x = strdup(s); + if(0 == x) { + fprintf(stderr, "ERROR: out of memory copying string \"%s\"\n", s); + exit(1); + } + return x; +} + /* functions for working with our metadata copy */ static bool replace_in_our_metadata_(FLAC::Metadata::Prototype *block, unsigned position, bool copy) @@ -260,8 +277,8 @@ void set_file_stats_(const char *filename, struct stat *stats) (void)chmod(filename, stats->st_mode); (void)utime(filename, &srctime); #if !defined _MSC_VER && !defined __MINGW32__ && !defined __EMX__ - (void)chown(filename, stats->st_uid, (gid_t)(-1)); - (void)chown(filename, (uid_t)(-1), stats->st_gid); + FLAC_CHECK_RETURN(chown(filename, stats->st_uid, (gid_t)(-1))); + FLAC_CHECK_RETURN(chown(filename, (uid_t)(-1), stats->st_gid)); #endif } @@ -278,7 +295,7 @@ static size_t chain_write_cb_(const void *ptr, size_t size, size_t nmemb, ::FLAC static int chain_seek_cb_(::FLAC__IOHandle handle, FLAC__int64 offset, int whence) { - off_t o = (off_t)offset; + FLAC__off_t o = (FLAC__off_t)offset; FLAC__ASSERT(offset == o); return fseeko((FILE*)handle, o, whence); } @@ -319,11 +336,11 @@ static bool write_chain_(FLAC::Metadata::Chain &chain, bool use_padding, bool pr return false; } if(0 == (file = fopen(filename, "rb"))) - return false; /*@@@ chain status still says OK though */ + return false; /*@@@@ chain status still says OK though */ if(!open_tempfile_(filename, &tempfile, &tempfilename)) { fclose(file); cleanup_tempfile_(&tempfile, &tempfilename); - return false; /*@@@ chain status still says OK though */ + return false; /*@@@@ chain status still says OK though */ } if(!chain.write(use_padding, (::FLAC__IOHandle)file, callbacks, (::FLAC__IOHandle)tempfile, callbacks)) { fclose(file); @@ -341,9 +358,11 @@ static bool write_chain_(FLAC::Metadata::Chain &chain, bool use_padding, bool pr else { FILE *file = fopen(filename, "r+b"); if(0 == file) - return false; /*@@@ chain status still says OK though */ - if(!chain.write(use_padding, (::FLAC__IOHandle)file, callbacks)) + return false; /*@@@@ chain status still says OK though */ + if(!chain.write(use_padding, (::FLAC__IOHandle)file, callbacks)) { + fclose(file); return false; + } fclose(file); } } @@ -351,10 +370,10 @@ static bool write_chain_(FLAC::Metadata::Chain &chain, bool use_padding, bool pr return true; } -static bool read_chain_(FLAC::Metadata::Chain &chain, const char *filename, bool filename_based) +static bool read_chain_(FLAC::Metadata::Chain &chain, const char *filename, bool filename_based, bool is_ogg) { if(filename_based) - return chain.read(filename); + return chain.read(filename, is_ogg); else { ::FLAC__IOCallbacks callbacks; @@ -367,8 +386,8 @@ static bool read_chain_(FLAC::Metadata::Chain &chain, const char *filename, bool bool ret; FILE *file = fopen(filename, "rb"); if(0 == file) - return false; /*@@@ chain status still says OK though */ - ret = chain.read((::FLAC__IOHandle)file, callbacks); + return false; /*@@@@ chain status still says OK though */ + ret = chain.read((::FLAC__IOHandle)file, callbacks, is_ogg); fclose(file); return ret; } @@ -474,13 +493,13 @@ void OurFileDecoder::error_callback(::FLAC__StreamDecoderErrorStatus status) printf("ERROR: got error callback, status = %s (%u)\n", FLAC__StreamDecoderErrorStatusString[status], (unsigned)status); } -static bool generate_file_(FLAC__bool include_cuesheet) +static bool generate_file_(bool include_extras, bool is_ogg) { - ::FLAC__StreamMetadata streaminfo, vorbiscomment, *cuesheet, padding; - ::FLAC__StreamMetadata *metadata[3]; + ::FLAC__StreamMetadata streaminfo, vorbiscomment, *cuesheet, picture, padding; + ::FLAC__StreamMetadata *metadata[4]; unsigned i = 0, n = 0; - printf("generating FLAC file for test\n"); + printf("generating %sFLAC file for test\n", is_ogg? "Ogg " : ""); while(our_metadata_.num_blocks > 0) delete_from_our_metadata_(0); @@ -524,41 +543,76 @@ static bool generate_file_(FLAC__bool include_cuesheet) return die_("priming our metadata"); } + { + picture.is_last = false; + picture.type = ::FLAC__METADATA_TYPE_PICTURE; + picture.length = + ( + FLAC__STREAM_METADATA_PICTURE_TYPE_LEN + + FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN + /* will add the length for the string later */ + FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN + /* will add the length for the string later */ + FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN + + FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN + + FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN + + FLAC__STREAM_METADATA_PICTURE_COLORS_LEN + + FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN /* will add the length for the data later */ + ) / 8 + ; + picture.data.picture.type = ::FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER; + picture.data.picture.mime_type = strdup_or_die_("image/jpeg"); + picture.length += strlen(picture.data.picture.mime_type); + picture.data.picture.description = (FLAC__byte*)strdup_or_die_("desc"); + picture.length += strlen((const char *)picture.data.picture.description); + picture.data.picture.width = 300; + picture.data.picture.height = 300; + picture.data.picture.depth = 24; + picture.data.picture.colors = 0; + picture.data.picture.data = (FLAC__byte*)strdup_or_die_("SOMEJPEGDATA"); + picture.data.picture.data_length = strlen((const char *)picture.data.picture.data); + picture.length += picture.data.picture.data_length; + } + padding.is_last = true; padding.type = ::FLAC__METADATA_TYPE_PADDING; padding.length = 1234; metadata[n++] = &vorbiscomment; - if (include_cuesheet) + if(include_extras) { metadata[n++] = cuesheet; + metadata[n++] = &picture; + } metadata[n++] = &padding; FLAC::Metadata::StreamInfo s(&streaminfo); FLAC::Metadata::VorbisComment v(&vorbiscomment); FLAC::Metadata::CueSheet c(cuesheet, /*copy=*/false); + FLAC::Metadata::Picture pi(&picture); FLAC::Metadata::Padding p(&padding); if( !insert_to_our_metadata_(&s, i++, /*copy=*/true) || !insert_to_our_metadata_(&v, i++, /*copy=*/true) || - (include_cuesheet && !insert_to_our_metadata_(&v, i++, /*copy=*/true)) || + (include_extras && !insert_to_our_metadata_(&c, i++, /*copy=*/true)) || + (include_extras && !insert_to_our_metadata_(&pi, i++, /*copy=*/true)) || !insert_to_our_metadata_(&p, i++, /*copy=*/true) ) return die_("priming our metadata"); - if(!file_utils__generate_flacfile(flacfile_, 0, 512 * 1024, &streaminfo, metadata, n)) + if(!file_utils__generate_flacfile(is_ogg, flacfilename(is_ogg), 0, 512 * 1024, &streaminfo, metadata, n)) return die_("creating the encoded file"); free(vorbiscomment.data.vorbis_comment.vendor_string.entry); + free(picture.data.picture.mime_type); + free(picture.data.picture.description); + free(picture.data.picture.data); return true; } -static bool test_file_(const char *filename, bool ignore_metadata) +static bool test_file_(bool is_ogg, bool ignore_metadata) { + const char *filename = flacfilename(is_ogg); OurFileDecoder decoder(ignore_metadata); - FLAC__ASSERT(0 != filename); - mc_our_block_number_ = 0; decoder.error_occurred_ = false; @@ -570,16 +624,16 @@ static bool test_file_(const char *filename, bool ignore_metadata) decoder.set_md5_checking(true); decoder.set_metadata_respond_all(); - if(decoder.init(filename) != ::FLAC__STREAM_DECODER_INIT_STATUS_OK) { - decoder.finish(); + if((is_ogg? decoder.init_ogg(filename) : decoder.init(filename)) != ::FLAC__STREAM_DECODER_INIT_STATUS_OK) { + (void)decoder.finish(); return die_("initializing decoder\n"); } if(!decoder.process_until_end_of_stream()) { - decoder.finish(); + (void)decoder.finish(); return die_("decoding file\n"); } - decoder.finish(); + (void)decoder.finish(); if(decoder.error_occurred_) return false; @@ -616,15 +670,15 @@ static bool test_level_0_() printf("\n\n++++++ testing level 0 interface\n"); - if(!generate_file_(/*include_cuesheet=*/true)) + if(!generate_file_(/*include_extras=*/true, /*is_ogg=*/false)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/true)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/true)) return false; printf("testing FLAC::Metadata::get_streaminfo()... "); - if(!FLAC::Metadata::get_streaminfo(flacfile_, streaminfo)) + if(!FLAC::Metadata::get_streaminfo(flacfilename(/*is_ogg=*/false), streaminfo)) return die_("during FLAC::Metadata::get_streaminfo()"); /* check to see if some basic data matches (c.f. generate_file_()) */ @@ -646,7 +700,7 @@ static bool test_level_0_() FLAC::Metadata::VorbisComment *tags = 0; - if(!FLAC::Metadata::get_tags(flacfile_, tags)) + if(!FLAC::Metadata::get_tags(flacfilename(/*is_ogg=*/false), tags)) return die_("during FLAC::Metadata::get_tags()"); /* check to see if some basic data matches (c.f. generate_file_()) */ @@ -663,7 +717,7 @@ static bool test_level_0_() FLAC::Metadata::VorbisComment tags; - if(!FLAC::Metadata::get_tags(flacfile_, tags)) + if(!FLAC::Metadata::get_tags(flacfilename(/*is_ogg=*/false), tags)) return die_("during FLAC::Metadata::get_tags()"); /* check to see if some basic data matches (c.f. generate_file_()) */ @@ -678,7 +732,7 @@ static bool test_level_0_() FLAC::Metadata::CueSheet *cuesheet = 0; - if(!FLAC::Metadata::get_cuesheet(flacfile_, cuesheet)) + if(!FLAC::Metadata::get_cuesheet(flacfilename(/*is_ogg=*/false), cuesheet)) return die_("during FLAC::Metadata::get_cuesheet()"); /* check to see if some basic data matches (c.f. generate_file_()) */ @@ -695,7 +749,7 @@ static bool test_level_0_() FLAC::Metadata::CueSheet cuesheet; - if(!FLAC::Metadata::get_cuesheet(flacfile_, cuesheet)) + if(!FLAC::Metadata::get_cuesheet(flacfilename(/*is_ogg=*/false), cuesheet)) return die_("during FLAC::Metadata::get_cuesheet()"); /* check to see if some basic data matches (c.f. generate_file_()) */ @@ -705,7 +759,39 @@ static bool test_level_0_() printf("OK\n"); } - if(!remove_file_(flacfile_)) + { + printf("testing FLAC::Metadata::get_picture(Picture *&)... "); + + FLAC::Metadata::Picture *picture = 0; + + if(!FLAC::Metadata::get_picture(flacfilename(/*is_ogg=*/false), picture, /*type=*/(::FLAC__StreamMetadata_Picture_Type)(-1), /*mime_type=*/0, /*description=*/0, /*max_width=*/(unsigned)(-1), /*max_height=*/(unsigned)(-1), /*max_depth=*/(unsigned)(-1), /*max_colors=*/(unsigned)(-1))) + return die_("during FLAC::Metadata::get_picture()"); + + /* check to see if some basic data matches (c.f. generate_file_()) */ + if(picture->get_type () != ::FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER) + return die_("mismatch in picture->get_type ()"); + + printf("OK\n"); + + delete picture; + } + + { + printf("testing FLAC::Metadata::get_picture(Picture &)... "); + + FLAC::Metadata::Picture picture; + + if(!FLAC::Metadata::get_picture(flacfilename(/*is_ogg=*/false), picture, /*type=*/(::FLAC__StreamMetadata_Picture_Type)(-1), /*mime_type=*/0, /*description=*/0, /*max_width=*/(unsigned)(-1), /*max_height=*/(unsigned)(-1), /*max_depth=*/(unsigned)(-1), /*max_colors=*/(unsigned)(-1))) + return die_("during FLAC::Metadata::get_picture()"); + + /* check to see if some basic data matches (c.f. generate_file_()) */ + if(picture.get_type () != ::FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER) + return die_("mismatch in picture->get_type ()"); + + printf("OK\n"); + } + + if(!remove_file_(flacfilename(/*is_ogg=*/false))) return false; return true; @@ -729,13 +815,13 @@ static bool test_level_1_() { printf("simple iterator on read-only file\n"); - if(!generate_file_(/*include_cuesheet=*/false)) + if(!generate_file_(/*include_extras=*/false, /*is_ogg=*/false)) return false; - if(!change_stats_(flacfile_, /*read_only=*/true)) + if(!change_stats_(flacfilename(/*is_ogg=*/false), /*read_only=*/true)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/true)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/true)) return false; FLAC::Metadata::SimpleIterator iterator; @@ -743,7 +829,7 @@ static bool test_level_1_() if(!iterator.is_valid()) return die_("iterator.is_valid() returned false"); - if(!iterator.init(flacfile_, /*read_only=*/false, /*preserve_file_stats=*/false)) + if(!iterator.init(flacfilename(/*is_ogg=*/false), /*read_only=*/false, /*preserve_file_stats=*/false)) return die_("iterator.init() returned false"); printf("is writable = %u\n", (unsigned)iterator.is_writable()); @@ -822,7 +908,7 @@ static bool test_level_1_() { printf("simple iterator on writable file\n"); - if(!change_stats_(flacfile_, /*read-only=*/false)) + if(!change_stats_(flacfilename(/*is_ogg=*/false), /*read-only=*/false)) return false; printf("creating APPLICATION block\n"); @@ -842,7 +928,7 @@ static bool test_level_1_() if(!iterator.is_valid()) return die_("iterator.is_valid() returned false"); - if(!iterator.init(flacfile_, /*read_only=*/false, /*preserve_file_stats=*/false)) + if(!iterator.init(flacfilename(/*is_ogg=*/false), /*read_only=*/false, /*preserve_file_stats=*/false)) return die_("iterator.init() returned false"); our_current_position = 0; @@ -888,7 +974,7 @@ static bool test_level_1_() if(!insert_to_our_metadata_(padding, ++our_current_position, /*copy=*/true)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[P]PP\tprev\n"); @@ -905,7 +991,7 @@ static bool test_level_1_() if(iterator.delete_block(false)) return die_ss_("iterator.delete_block(false) should have returned false", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("[S]VPPP\tnext\n"); @@ -933,7 +1019,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("S[V]PP\tnext\n"); @@ -951,7 +1037,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); our_current_position--; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[P]P\tnext\n"); @@ -964,7 +1050,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[P]\tprev\n"); @@ -989,7 +1075,7 @@ static bool test_level_1_() return die_ss_("iterator.set_block(block, false)", iterator); delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("[S]VP\tnext\n"); @@ -1005,7 +1091,7 @@ static bool test_level_1_() return false; add_to_padding_length_(our_current_position+1, -((int)(FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) + (int)app->get_length())); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]P\tnext\n"); @@ -1021,7 +1107,7 @@ static bool test_level_1_() return false; add_to_padding_length_(our_current_position+1, -((int)(FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) + (int)app->get_length())); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVA[A]P\tset APPLICATION (grow), don't expand into padding\n"); @@ -1033,7 +1119,7 @@ static bool test_level_1_() if(!iterator.set_block(app, false)) return die_ss_("iterator.set_block(app, false)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVA[A]P\tset APPLICATION (shrink), don't fill in with padding\n"); @@ -1045,7 +1131,7 @@ static bool test_level_1_() if(!iterator.set_block(app, false)) return die_ss_("iterator.set_block(app, false)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVA[A]P\tset APPLICATION (grow), expand into padding of exceeding size\n"); @@ -1058,7 +1144,7 @@ static bool test_level_1_() if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVA[A]P\tset APPLICATION (shrink), fill in with padding\n"); @@ -1073,7 +1159,7 @@ static bool test_level_1_() if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVA[A]PP\tnext\n"); @@ -1093,7 +1179,7 @@ static bool test_level_1_() if(!iterator.set_block(padding, false)) return die_ss_("iterator.set_block(padding, false)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVAAP[P]\tset APPLICATION (grow)\n"); @@ -1103,7 +1189,7 @@ static bool test_level_1_() if(!iterator.set_block(app, false)) return die_ss_("iterator.set_block(app, false)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVAAP[A]\tset PADDING (equal)\n"); @@ -1113,7 +1199,7 @@ static bool test_level_1_() if(!iterator.set_block(padding, false)) return die_ss_("iterator.set_block(padding, false)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVAAP[P]\tprev\n"); @@ -1126,7 +1212,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVA[A]P\tdelete (middle block), don't replace with padding\n"); @@ -1134,7 +1220,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]P\tnext\n"); @@ -1149,7 +1235,7 @@ static bool test_level_1_() if(!insert_to_our_metadata_(padding, ++our_current_position, /*copy=*/true)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVAP[P]\tprev\n"); @@ -1170,7 +1256,7 @@ static bool test_level_1_() if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]PP\tset APPLICATION (grow), try to expand into padding which is 'close' but still too small\n"); @@ -1181,7 +1267,7 @@ static bool test_level_1_() if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]PP\tset APPLICATION (grow), expand into padding which will leave 0-length pad\n"); @@ -1193,7 +1279,7 @@ static bool test_level_1_() if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]PP\tset APPLICATION (grow), expand into padding which is exactly consumed\n"); @@ -1205,7 +1291,7 @@ static bool test_level_1_() if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]P\tset APPLICATION (grow), expand into padding which is exactly consumed\n"); @@ -1218,7 +1304,7 @@ static bool test_level_1_() if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]\tset PADDING (equal size)\n"); @@ -1228,7 +1314,7 @@ static bool test_level_1_() if(!iterator.set_block(padding, true)) return die_ss_("iterator.set_block(padding, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[P]\tinsert PADDING after\n"); @@ -1237,7 +1323,7 @@ static bool test_level_1_() if(!insert_to_our_metadata_(padding, ++our_current_position, /*copy=*/true)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVP[P]\tinsert PADDING after\n"); @@ -1247,7 +1333,7 @@ static bool test_level_1_() if(!insert_to_our_metadata_(padding, ++our_current_position, /*copy=*/true)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SVPP[P]\tprev\n"); @@ -1273,7 +1359,7 @@ static bool test_level_1_() if(!iterator.insert_block_after(app, true)) return die_ss_("iterator.insert_block_after(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]PPP\tdelete (middle block), don't replace with padding\n"); @@ -1281,7 +1367,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("S[V]PPP\tinsert APPLICATION after, try to expand into padding which is 'close' but still too small\n"); @@ -1292,7 +1378,7 @@ static bool test_level_1_() if(!iterator.insert_block_after(app, true)) return die_ss_("iterator.insert_block_after(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]PPP\tdelete (middle block), don't replace with padding\n"); @@ -1300,7 +1386,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("S[V]PPP\tinsert APPLICATION after, expand into padding which is exactly consumed\n"); @@ -1312,7 +1398,7 @@ static bool test_level_1_() if(!iterator.insert_block_after(app, true)) return die_ss_("iterator.insert_block_after(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]PP\tdelete (middle block), don't replace with padding\n"); @@ -1320,7 +1406,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("S[V]PP\tinsert APPLICATION after, expand into padding which will leave 0-length pad\n"); @@ -1332,7 +1418,7 @@ static bool test_level_1_() if(!iterator.insert_block_after(app, true)) return die_ss_("iterator.insert_block_after(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("SV[A]PP\tdelete (middle block), don't replace with padding\n"); @@ -1340,7 +1426,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("S[V]PP\tnext\n"); @@ -1353,7 +1439,7 @@ static bool test_level_1_() return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; printf("S[V]P\tinsert APPLICATION after, expand into padding which is exactly consumed\n"); @@ -1365,20 +1451,20 @@ static bool test_level_1_() if(!iterator.insert_block_after(app, true)) return die_ss_("iterator.insert_block_after(app, true)", iterator); - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(/*is_ogg=*/false, /*ignore_metadata=*/false)) return false; } delete app; delete padding; - if(!remove_file_(flacfile_)) + if(!remove_file_(flacfilename(/*is_ogg=*/false))) return false; return true; } -static bool test_level_2_(bool filename_based) +static bool test_level_2_(bool filename_based, bool is_ogg) { FLAC::Metadata::Prototype *block; FLAC::Metadata::StreamInfo *streaminfo; @@ -1390,14 +1476,14 @@ static bool test_level_2_(bool filename_based) // initialize 'data' to avoid Valgrind errors memset(data, 0, sizeof(data)); - printf("\n\n++++++ testing level 2 interface (%s-based)\n", filename_based? "filename":"callback"); + printf("\n\n++++++ testing level 2 interface (%s-based, %s FLAC)\n", filename_based? "filename":"callback", is_ogg? "Ogg":"native"); printf("generate read-only file\n"); - if(!generate_file_(/*include_cuesheet=*/false)) + if(!generate_file_(/*include_extras=*/false, is_ogg)) return false; - if(!change_stats_(flacfile_, /*read_only=*/true)) + if(!change_stats_(flacfilename(is_ogg), /*read_only=*/true)) return false; printf("create chain\n"); @@ -1407,19 +1493,22 @@ static bool test_level_2_(bool filename_based) printf("read chain\n"); - if(!read_chain_(chain, flacfile_, filename_based)) + if(!read_chain_(chain, flacfilename(is_ogg), filename_based, is_ogg)) return die_c_("reading chain", chain.status()); printf("[S]VP\ttest initial metadata\n"); if(!compare_chain_(chain, 0, 0)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; + if(is_ogg) + goto end; + printf("switch file to read-write\n"); - if(!change_stats_(flacfile_, /*read-only=*/false)) + if(!change_stats_(flacfilename(is_ogg), /*read-only=*/false)) return false; printf("create iterator\n"); @@ -1446,13 +1535,13 @@ static bool test_level_2_(bool filename_based) return die_("copying object"); delete block; - if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/true, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/true, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(false, true)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("[S]VP\tnext\n"); @@ -1479,13 +1568,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(false, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]\tshrink APPLICATION, don't use padding\n"); @@ -1498,13 +1587,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(false, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]\tgrow APPLICATION, don't use padding\n"); @@ -1517,13 +1606,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(false, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]\tgrow APPLICATION, use padding, but last block is not padding\n"); @@ -1536,13 +1625,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(false, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]\tshrink APPLICATION, use padding, last block is not padding, but delta is too small for new PADDING block\n"); @@ -1555,13 +1644,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(true, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]\tshrink APPLICATION, use padding, last block is not padding, delta is enough for new PADDING block\n"); @@ -1579,13 +1668,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(true, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]P\tshrink APPLICATION, use padding, last block is padding\n"); @@ -1599,13 +1688,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(true, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]P\tgrow APPLICATION, use padding, last block is padding, but delta is too small\n"); @@ -1618,13 +1707,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(true, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]P\tgrow APPLICATION, use padding, last block is padding of exceeding size\n"); @@ -1638,13 +1727,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(true, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]P\tgrow APPLICATION, use padding, last block is padding of exact size\n"); @@ -1658,13 +1747,13 @@ static bool test_level_2_(bool filename_based) if(!iterator.set_block(app)) return die_c_("iterator.set_block(app)", chain.status()); - if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(true, false)", chain.status()); block = iterator.get_block(); if(!compare_chain_(chain, our_current_position, block)) return false; delete block; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV[A]\tprev\n"); @@ -1785,11 +1874,11 @@ static bool test_level_2_(bool filename_based) delete_from_our_metadata_(4); delete_from_our_metadata_(3); - if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(true, false)", chain.status()); if(!compare_chain_(chain, 0, 0)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SVPAP\tsort padding\n"); @@ -1797,11 +1886,11 @@ static bool test_level_2_(bool filename_based) add_to_padding_length_(4, FLAC__STREAM_METADATA_HEADER_LENGTH + our_metadata_.blocks[2]->get_length()); delete_from_our_metadata_(2); - if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/true, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(true, false)", chain.status()); if(!compare_chain_(chain, 0, 0)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("create iterator\n"); @@ -1907,30 +1996,31 @@ static bool test_level_2_(bool filename_based) printf("SV\tmerge padding\n"); chain.merge_padding(); - if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(false, false)", chain.status()); if(!compare_chain_(chain, 0, 0)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; printf("SV\tsort padding\n"); chain.sort_padding(); - if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfile_)) + if(!write_chain_(chain, /*use_padding=*/false, /*preserve_file_stats=*/false, filename_based, flacfilename(is_ogg))) return die_c_("during chain.write(false, false)", chain.status()); if(!compare_chain_(chain, 0, 0)) return false; - if(!test_file_(flacfile_, /*ignore_metadata=*/false)) + if(!test_file_(is_ogg, /*ignore_metadata=*/false)) return false; - if(!remove_file_(flacfile_)) +end: + if(!remove_file_(flacfilename(is_ogg))) return false; return true; } -static bool test_level_2_misc_() +static bool test_level_2_misc_(bool is_ogg) { ::FLAC__IOCallbacks callbacks; @@ -1949,7 +2039,7 @@ static bool test_level_2_misc_() printf("generate file\n"); - if(!generate_file_(/*include_cuesheet=*/false)) + if(!generate_file_(/*include_extras=*/false, is_ogg)) return false; printf("create chain\n"); @@ -1959,7 +2049,7 @@ static bool test_level_2_misc_() printf("read chain (filename-based)\n"); - if(!chain.read(flacfile_)) + if(!chain.read(flacfilename(is_ogg))) return die_c_("reading chain", chain.status()); printf("write chain with wrong method Chain::write(with callbacks)\n"); @@ -1973,7 +2063,7 @@ static bool test_level_2_misc_() printf("read chain (filename-based)\n"); - if(!chain.read(flacfile_)) + if(!chain.read(flacfilename(is_ogg))) return die_c_("reading chain", chain.status()); printf("write chain with wrong method Chain::write(with callbacks and tempfile)\n"); @@ -1987,7 +2077,7 @@ static bool test_level_2_misc_() printf("read chain (callback-based)\n"); { - FILE *file = fopen(flacfile_, "rb"); + FILE *file = fopen(flacfilename(is_ogg), "rb"); if(0 == file) return die_("opening file"); if(!chain.read((::FLAC__IOHandle)file, callbacks)) { @@ -2008,7 +2098,7 @@ static bool test_level_2_misc_() printf("read chain (callback-based)\n"); { - FILE *file = fopen(flacfile_, "rb"); + FILE *file = fopen(flacfilename(is_ogg), "rb"); if(0 == file) return die_("opening file"); if(!chain.read((::FLAC__IOHandle)file, callbacks)) { @@ -2036,7 +2126,7 @@ static bool test_level_2_misc_() printf("read chain (callback-based)\n"); { - FILE *file = fopen(flacfile_, "rb"); + FILE *file = fopen(flacfilename(is_ogg), "rb"); if(0 == file) return die_("opening file"); if(!chain.read((::FLAC__IOHandle)file, callbacks)) { @@ -2080,7 +2170,7 @@ static bool test_level_2_misc_() } // delete iterator - if(!remove_file_(flacfile_)) + if(!remove_file_(flacfilename(is_ogg))) return false; return true; @@ -2098,12 +2188,24 @@ bool test_metadata_file_manipulation() if(!test_level_1_()) return false; - if(!test_level_2_(/*filename_based=*/true)) /* filename-based */ + if(!test_level_2_(/*filename_based=*/true, /*is_ogg=*/false)) /* filename-based */ return false; - if(!test_level_2_(/*filename_based=*/false)) /* callback-based */ + if(!test_level_2_(/*filename_based=*/false, /*is_ogg=*/false)) /* callback-based */ return false; - if(!test_level_2_misc_()) + if(!test_level_2_misc_(/*is_ogg=*/false)) return false; + if(FLAC_API_SUPPORTS_OGG_FLAC) { + if(!test_level_2_(/*filename_based=*/true, /*is_ogg=*/true)) /* filename-based */ + return false; + if(!test_level_2_(/*filename_based=*/false, /*is_ogg=*/true)) /* callback-based */ + return false; +#if 0 + /* when ogg flac write is supported, will have to add this: */ + if(!test_level_2_misc_(/*is_ogg=*/true)) + return false; +#endif + } + return true; }