Praats/external/flac/READ_ME.TXT Paul Boersma, 20 August 2021 This file describes the adaptations to the FLAC 1.3.3 sources that are needed to make them compatible with Praat. The FLAC sources are distributed over multiple folders, which are in different deep branches of the FLAC root folder, as listed below. We flatten this hierarchy as shown. flac-1.3.3 config.cmake.h.in -> flac_config.h include FLAC all.h -> flac_FLAC_all.h assert.h -> flac_FLAC_assert.h callback.h -> flac_FLAC_callback.h export.h -> flac_FLAC_export.h format.h -> flac_FLAC_format.h metadata.h -> flac_FLAC_metadata.h ordinals.h -> flac_FLAC_ordinals.h stream_decoder.h -> flac_FLAC_stream_decoder.h stream_encoder.h -> flac_FLAC_stream_encoder.h share alloc.h -> flac_share_alloc.h compat.h -> flac_share_compat.h endswap.h -> flac_share_endswap.h macros.h -> flac_share_macros.h private.h -> flac_share_private.h safe_str.h -> flac_share_safe_str.h win_utf8_io.h -> flac_share_win_utf8_io.h src libFLAC bitmath.c -> flac_bitmath.c bitreader.c -> flac_bitreader.c bitwriter.c -> flac_bitwriter.c cpu.c -> flac_cpu.c crc.c -> flac_crc.c fixed.c -> flac_fixed.c float.c -> flac_float.c format.c -> flac_format.c include private all.h -> flac_private_all.h bitmath.h -> flac_private_bitmath.h bitreader.h -> flac_private_bitreader.h bitwriter.h -> flac_private_bitwriter.h cpu.h -> flac_private_cpu.h crc.h -> flac_private_crc.h fixed.h -> flac_private_fixed.h float.h -> flac_private_float.h format.h -> flac_private_format.h lpc.h -> flac_private_lpc.h macros.h -> flac_private_macros.h md5.h -> flac_private_md5.h memory.h -> flac_private_memory.h metadata.h -> flac_private_metadata.h ogg_decoder_aspect.h -> flac_private_ogg_decoder_aspect.h ogg_encoder_aspect.h -> flac_private_ogg_encoder_aspect.h ogg_helper.h -> flac_private_ogg_helper.h ogg_mapping.h -> flac_private_ogg_mapping.h stream_encoder_framing.h -> flac_private_stream_encoder_framing.h stream_encoder.h -> UNUSED window.h -> flac_private_window.h protected all.h -> flac_protected_all.h stream_decoder.h -> flac_protected_stream_decoder.h stream_encoder.h -> flac_protected_stream_encoder.h lpc.c -> flac_lpc.c md5.c -> flac_md5.c memory.c -> flac_memory.c metadata_iterators.c -> flac_metadata_iterators.c metadata_object.c -> flac_metadata_object.c ogg_decoder_aspect.c -> flac_ogg_decoder_aspect.c ogg_encoder_aspect.c -> flac_ogg_encoder_aspect.c ogg_helper.c -> flac_ogg_helper.c ogg_mapping.c -> flac_ogg_mapping.c stream_decoder.c -> flac_stream_decoder.c stream_encoder.c -> flac_stream_encoder.c stream_encoder_framing.c -> flac_stream_encoder_framing.c window.c -> flac_window.c windows_unicode_filenames.c -> flac_windows_unicode_filenames.c All these files are put into the single external/flac source folder. The #include statements are flattened, e.g. #include private/float.h becomes #include flac_private_float.h. Any Praat-specific declarations should go in flac_config.h, so we have to #include flac_config.h in most *.c files. Including the config file is done in FLAC inside #if HAVE_CONFIG_H, just as in many other libraries. This is appropriate for libraries that are compiled separately, but not for libraries that are included in a larger project as source code. So we remove all instances of #if HAVE_CONFIG_H. Specifically, we replace #if HAVE_CONFIG_H # include #endif with //ppgb #if HAVE_CONFIG_H #include "flac_config.h" //ppgb #endif in all *.c files. We have #ifdef NDEBUG in flac_FLAC_assert.h. That is fine, because Praat wants to keep assertions in its code. flac_FLAC_stream_decoder.h: typedef struct { struct FLAC__StreamDecoderProtected *protected_; /* avoid the C++ keyword 'protected' */ struct FLAC__StreamDecoderPrivate *private_; /* avoid the C++ keyword 'private' */ } FLAC__StreamDecoder; into typedef struct FLAC__StreamDecoder { //ppgb 20071120 struct FLAC__StreamDecoderProtected *protected_; /* avoid the C++ keyword 'protected' */ struct FLAC__StreamDecoderPrivate *private_; /* avoid the C++ keyword 'private' */ } FLAC__StreamDecoder; flac_FLAC_stream_encoder.h: typedef struct { struct FLAC__StreamEncoderProtected *protected_; /* avoid the C++ keyword 'protected' */ struct FLAC__StreamEncoderPrivate *private_; /* avoid the C++ keyword 'private' */ } FLAC__StreamEncoder; into typedef struct FLAC__StreamEncoder { //ppgb 20071120 struct FLAC__StreamEncoderProtected *protected_; /* avoid the C++ keyword 'protected' */ struct FLAC__StreamEncoderPrivate *private_; /* avoid the C++ keyword 'private' */ } FLAC__StreamEncoder; Before #including any FLAC header files, do #define FLAC__NO_DLL