From 98a99c921930e5904f3a6c2a52be8c79a9cb9f82 Mon Sep 17 00:00:00 2001 From: ctl-ly Date: Wed, 28 Dec 2022 18:21:11 +0800 Subject: [PATCH 1/3] xx --- libsndfile-1.0.31/AUTHORS | 235 + libsndfile-1.0.31/CMakeLists.txt | 1471 + libsndfile-1.0.31/COPYING | 503 + libsndfile-1.0.31/ChangeLog | 3 + libsndfile-1.0.31/Makefile.am | 535 + libsndfile-1.0.31/Makefile.in | 4199 +++ libsndfile-1.0.31/NEWS | 303 + libsndfile-1.0.31/Octave/Makefile.am | 79 + libsndfile-1.0.31/Octave/Makefile.in | 645 + libsndfile-1.0.31/Octave/PKG_ADD | 3 + libsndfile-1.0.31/Octave/octave_test.m | 52 + libsndfile-1.0.31/Octave/octave_test.sh | 81 + libsndfile-1.0.31/Octave/sndfile.cc | 405 + libsndfile-1.0.31/Octave/sndfile_load.m | 52 + libsndfile-1.0.31/Octave/sndfile_play.m | 59 + libsndfile-1.0.31/Octave/sndfile_save.m | 53 + libsndfile-1.0.31/README | 76 + .../Scripts/android-configure.sh | 96 + .../Scripts/build-test-tarball.mk.in | 61 + .../Scripts/linux-to-win-cross-configure.sh | 22 + .../Win32/README-precompiled-dll.txt | 40 + libsndfile-1.0.31/Win32/testprog.c | 16 + libsndfile-1.0.31/aclocal.m4 | 1796 + libsndfile-1.0.31/build-aux/ar-lib | 271 + libsndfile-1.0.31/build-aux/compile | 348 + libsndfile-1.0.31/build-aux/config.guess | 1701 + libsndfile-1.0.31/build-aux/config.sub | 1876 ++ libsndfile-1.0.31/build-aux/depcomp | 791 + libsndfile-1.0.31/build-aux/install-sh | 541 + libsndfile-1.0.31/build-aux/ltmain.sh | 11210 +++++++ libsndfile-1.0.31/build-aux/missing | 215 + libsndfile-1.0.31/cmake/CMakeAutoGen.cmake | 46 + .../cmake/CMakeAutoGenScript.cmake | 442 + libsndfile-1.0.31/cmake/CheckCPUArch.c.in | 7 + libsndfile-1.0.31/cmake/CheckCPUArch.cmake | 23 + libsndfile-1.0.31/cmake/ClipMode.cmake | 92 + libsndfile-1.0.31/cmake/FindFLAC.cmake | 67 + libsndfile-1.0.31/cmake/FindOgg.cmake | 61 + libsndfile-1.0.31/cmake/FindOpus.cmake | 67 + libsndfile-1.0.31/cmake/FindSndio.cmake | 61 + libsndfile-1.0.31/cmake/FindSpeex.cmake | 55 + libsndfile-1.0.31/cmake/FindVorbis.cmake | 210 + libsndfile-1.0.31/cmake/SndFileChecks.cmake | 276 + .../cmake/SndFileConfig.cmake.in | 32 + libsndfile-1.0.31/cmake/TestInline.c.in | 10 + libsndfile-1.0.31/cmake/TestInline.cmake | 54 + libsndfile-1.0.31/cmake/TestLargeFiles.cmake | 121 + .../cmake/sqlite/FindSQLite3.cmake | 56 + libsndfile-1.0.31/configure | 27027 ++++++++++++++++ libsndfile-1.0.31/configure.ac | 743 + libsndfile-1.0.31/docs/FAQ.md | 480 + libsndfile-1.0.31/docs/api.md | 736 + libsndfile-1.0.31/docs/bugs.md | 47 + libsndfile-1.0.31/docs/command.md | 1929 ++ libsndfile-1.0.31/docs/embedded_files.md | 21 + libsndfile-1.0.31/docs/formats.md | 52 + libsndfile-1.0.31/docs/index.md | 316 + libsndfile-1.0.31/docs/libsndfile.css | 101 + libsndfile-1.0.31/docs/libsndfile.jpg | Bin 0 -> 22043 bytes libsndfile-1.0.31/docs/lists.md | 27 + libsndfile-1.0.31/docs/new_file_type_howto.md | 134 + libsndfile-1.0.31/docs/octave.md | 71 + libsndfile-1.0.31/docs/print.css | 14 + libsndfile-1.0.31/docs/sndfile_info.md | 36 + libsndfile-1.0.31/docs/tutorial.md | 10 + libsndfile-1.0.31/docs/win32.md | 18 + libsndfile-1.0.31/examples/generate.c | 131 + libsndfile-1.0.31/examples/list_formats.c | 76 + libsndfile-1.0.31/examples/make_sine.c | 100 + libsndfile-1.0.31/examples/sfprocess.c | 142 + libsndfile-1.0.31/examples/sndfile-loopify.c | 180 + libsndfile-1.0.31/examples/sndfile-to-text.c | 156 + libsndfile-1.0.31/examples/sndfilehandle.cc | 84 + libsndfile-1.0.31/include/sndfile.h.in | 872 + libsndfile-1.0.31/include/sndfile.hh | 452 + libsndfile-1.0.31/libsndfile.spec.in | 69 + libsndfile-1.0.31/m4/ax_add_fortify_source.m4 | 53 + .../m4/ax_append_compile_flags.m4 | 67 + libsndfile-1.0.31/m4/ax_append_flag.m4 | 71 + libsndfile-1.0.31/m4/ax_append_link_flags.m4 | 65 + libsndfile-1.0.31/m4/ax_check_compile_flag.m4 | 74 + libsndfile-1.0.31/m4/ax_check_link_flag.m4 | 74 + libsndfile-1.0.31/m4/ax_compiler_vendor.m4 | 87 + libsndfile-1.0.31/m4/ax_compiler_version.m4 | 492 + libsndfile-1.0.31/m4/ax_recursive_eval.m4 | 56 + libsndfile-1.0.31/m4/ax_require_defined.m4 | 37 + libsndfile-1.0.31/m4/clip_mode.m4 | 124 + libsndfile-1.0.31/m4/extra_pkg.m4 | 105 + libsndfile-1.0.31/m4/libtool.m4 | 8387 +++++ libsndfile-1.0.31/m4/ltoptions.m4 | 437 + libsndfile-1.0.31/m4/ltsugar.m4 | 124 + libsndfile-1.0.31/m4/ltversion.m4 | 23 + libsndfile-1.0.31/m4/lt~obsolete.m4 | 99 + libsndfile-1.0.31/m4/mkoctfile_version.m4 | 38 + libsndfile-1.0.31/m4/octave.m4 | 143 + libsndfile-1.0.31/m4/stack_protect.m4 | 73 + libsndfile-1.0.31/man/sndfile-cmp.1 | 29 + libsndfile-1.0.31/man/sndfile-concat.1 | 28 + libsndfile-1.0.31/man/sndfile-convert.1 | 160 + libsndfile-1.0.31/man/sndfile-deinterleave.1 | 62 + libsndfile-1.0.31/man/sndfile-info.1 | 34 + libsndfile-1.0.31/man/sndfile-interleave.1 | 62 + libsndfile-1.0.31/man/sndfile-metadata-get.1 | 116 + libsndfile-1.0.31/man/sndfile-metadata-set.1 | 116 + libsndfile-1.0.31/man/sndfile-play.1 | 34 + libsndfile-1.0.31/man/sndfile-salvage.1 | 25 + libsndfile-1.0.31/ossfuzz/sndfile_fuzzer.cc | 155 + libsndfile-1.0.31/ossfuzz/standaloneengine.cc | 86 + libsndfile-1.0.31/ossfuzz/testinput.h | 3 + libsndfile-1.0.31/programs/common.c | 497 + libsndfile-1.0.31/programs/common.h | 82 + libsndfile-1.0.31/programs/sndfile-cmp.c | 155 + libsndfile-1.0.31/programs/sndfile-concat.c | 170 + libsndfile-1.0.31/programs/sndfile-convert.c | 407 + .../programs/sndfile-deinterleave.c | 210 + libsndfile-1.0.31/programs/sndfile-info.c | 527 + .../programs/sndfile-interleave.c | 202 + .../programs/sndfile-metadata-get.c | 197 + .../programs/sndfile-metadata-set.c | 295 + libsndfile-1.0.31/programs/sndfile-play.c | 860 + libsndfile-1.0.31/programs/sndfile-salvage.c | 283 + .../programs/test-sndfile-metadata-set.py | 198 + libsndfile-1.0.31/regtest/checksum.c | 117 + libsndfile-1.0.31/regtest/database.c | 542 + libsndfile-1.0.31/regtest/regtest.h | 38 + libsndfile-1.0.31/regtest/sndfile-regtest.c | 121 + libsndfile-1.0.31/sndfile.pc.in | 12 + libsndfile-1.0.31/src/ALAC/ALACAudioTypes.h | 206 + libsndfile-1.0.31/src/ALAC/ALACBitUtilities.c | 262 + libsndfile-1.0.31/src/ALAC/ALACBitUtilities.h | 89 + libsndfile-1.0.31/src/ALAC/EndianPortable.h | 39 + libsndfile-1.0.31/src/ALAC/ag_dec.c | 356 + libsndfile-1.0.31/src/ALAC/ag_enc.c | 350 + libsndfile-1.0.31/src/ALAC/aglib.h | 81 + libsndfile-1.0.31/src/ALAC/alac_codec.h | 104 + libsndfile-1.0.31/src/ALAC/alac_decoder.c | 652 + libsndfile-1.0.31/src/ALAC/alac_encoder.c | 1333 + libsndfile-1.0.31/src/ALAC/dp_dec.c | 379 + libsndfile-1.0.31/src/ALAC/dp_enc.c | 385 + libsndfile-1.0.31/src/ALAC/dplib.h | 61 + libsndfile-1.0.31/src/ALAC/matrix_dec.c | 330 + libsndfile-1.0.31/src/ALAC/matrix_enc.c | 275 + libsndfile-1.0.31/src/ALAC/matrixlib.h | 81 + libsndfile-1.0.31/src/ALAC/shift.h | 29 + libsndfile-1.0.31/src/G72x/ChangeLog | 50 + libsndfile-1.0.31/src/G72x/README | 0 libsndfile-1.0.31/src/G72x/README.original | 94 + libsndfile-1.0.31/src/G72x/g721.c | 155 + libsndfile-1.0.31/src/G72x/g723_16.c | 162 + libsndfile-1.0.31/src/G72x/g723_24.c | 139 + libsndfile-1.0.31/src/G72x/g723_40.c | 153 + libsndfile-1.0.31/src/G72x/g72x.c | 645 + libsndfile-1.0.31/src/G72x/g72x.h | 91 + libsndfile-1.0.31/src/G72x/g72x_priv.h | 127 + libsndfile-1.0.31/src/G72x/g72x_test.c | 220 + libsndfile-1.0.31/src/GSM610/COPYRIGHT | 16 + libsndfile-1.0.31/src/GSM610/ChangeLog | 56 + libsndfile-1.0.31/src/GSM610/README | 36 + libsndfile-1.0.31/src/GSM610/add.c | 243 + libsndfile-1.0.31/src/GSM610/code.c | 87 + libsndfile-1.0.31/src/GSM610/config.h | 26 + libsndfile-1.0.31/src/GSM610/decode.c | 58 + libsndfile-1.0.31/src/GSM610/gsm.h | 52 + libsndfile-1.0.31/src/GSM610/gsm610_priv.h | 335 + libsndfile-1.0.31/src/GSM610/gsm_create.c | 37 + libsndfile-1.0.31/src/GSM610/gsm_decode.c | 357 + libsndfile-1.0.31/src/GSM610/gsm_destroy.c | 25 + libsndfile-1.0.31/src/GSM610/gsm_encode.c | 448 + libsndfile-1.0.31/src/GSM610/gsm_option.c | 66 + libsndfile-1.0.31/src/GSM610/long_term.c | 932 + libsndfile-1.0.31/src/GSM610/lpc.c | 333 + libsndfile-1.0.31/src/GSM610/preprocess.c | 101 + libsndfile-1.0.31/src/GSM610/rpe.c | 460 + libsndfile-1.0.31/src/GSM610/short_term.c | 412 + libsndfile-1.0.31/src/GSM610/table.c | 60 + libsndfile-1.0.31/src/Symbols.darwin | 43 + libsndfile-1.0.31/src/Symbols.gnu-binutils | 49 + libsndfile-1.0.31/src/Symbols.os2 | 49 + libsndfile-1.0.31/src/Symbols.static | 41 + libsndfile-1.0.31/src/aiff.c | 1834 ++ libsndfile-1.0.31/src/alac.c | 997 + libsndfile-1.0.31/src/alaw.c | 553 + libsndfile-1.0.31/src/au.c | 454 + libsndfile-1.0.31/src/audio_detect.c | 107 + libsndfile-1.0.31/src/avr.c | 246 + .../src/binheader_writef_check.py | 114 + libsndfile-1.0.31/src/broadcast.c | 190 + libsndfile-1.0.31/src/caf.c | 1033 + libsndfile-1.0.31/src/cart.c | 101 + libsndfile-1.0.31/src/chanmap.c | 262 + libsndfile-1.0.31/src/chanmap.h | 32 + libsndfile-1.0.31/src/chunk.c | 256 + libsndfile-1.0.31/src/command.c | 400 + libsndfile-1.0.31/src/common.c | 1765 + libsndfile-1.0.31/src/common.h | 1144 + libsndfile-1.0.31/src/config.h.cmake | 314 + libsndfile-1.0.31/src/config.h.in | 326 + libsndfile-1.0.31/src/create_symbols_file.py | 181 + libsndfile-1.0.31/src/dither.c | 534 + libsndfile-1.0.31/src/double64.c | 1063 + libsndfile-1.0.31/src/dwd.c | 201 + libsndfile-1.0.31/src/dwvw.c | 674 + libsndfile-1.0.31/src/file_io.c | 1572 + libsndfile-1.0.31/src/flac.c | 1454 + libsndfile-1.0.31/src/float32.c | 1017 + libsndfile-1.0.31/src/g72x.c | 608 + libsndfile-1.0.31/src/gsm610.c | 629 + libsndfile-1.0.31/src/htk.c | 226 + libsndfile-1.0.31/src/id3.c | 59 + libsndfile-1.0.31/src/ima_adpcm.c | 1003 + libsndfile-1.0.31/src/ima_oki_adpcm.c | 297 + libsndfile-1.0.31/src/ima_oki_adpcm.h | 54 + libsndfile-1.0.31/src/interleave.c | 299 + libsndfile-1.0.31/src/ircam.c | 323 + libsndfile-1.0.31/src/libsndfile-1.def | 46 + libsndfile-1.0.31/src/macos.c | 51 + .../src/make-static-lib-hidden-privates.sh | 14 + libsndfile-1.0.31/src/mat4.c | 391 + libsndfile-1.0.31/src/mat5.c | 509 + libsndfile-1.0.31/src/mpc2k.c | 204 + libsndfile-1.0.31/src/ms_adpcm.c | 857 + libsndfile-1.0.31/src/nist.c | 372 + libsndfile-1.0.31/src/nms_adpcm.c | 1156 + libsndfile-1.0.31/src/ogg.c | 909 + libsndfile-1.0.31/src/ogg.h | 134 + libsndfile-1.0.31/src/ogg_opus.c | 1778 + libsndfile-1.0.31/src/ogg_pcm.c | 167 + libsndfile-1.0.31/src/ogg_speex.c | 428 + libsndfile-1.0.31/src/ogg_vcomment.c | 277 + libsndfile-1.0.31/src/ogg_vcomment.h | 45 + libsndfile-1.0.31/src/ogg_vorbis.c | 907 + libsndfile-1.0.31/src/paf.c | 818 + libsndfile-1.0.31/src/pcm.c | 2893 ++ libsndfile-1.0.31/src/pvf.c | 188 + libsndfile-1.0.31/src/raw.c | 111 + libsndfile-1.0.31/src/rf64.c | 894 + libsndfile-1.0.31/src/rx2.c | 318 + libsndfile-1.0.31/src/sd2.c | 619 + libsndfile-1.0.31/src/sds.c | 1022 + libsndfile-1.0.31/src/sf_unistd.h | 112 + libsndfile-1.0.31/src/sfconfig.h | 139 + libsndfile-1.0.31/src/sfendian.h | 378 + libsndfile-1.0.31/src/sndfile.c | 3360 ++ libsndfile-1.0.31/src/strings.c | 187 + libsndfile-1.0.31/src/svx.c | 401 + libsndfile-1.0.31/src/test_audio_detect.c | 113 + libsndfile-1.0.31/src/test_binheader_writef.c | 61 + libsndfile-1.0.31/src/test_broadcast_var.c | 119 + libsndfile-1.0.31/src/test_cart_var.c | 91 + libsndfile-1.0.31/src/test_conversions.c | 112 + libsndfile-1.0.31/src/test_endswap.c | 322 + libsndfile-1.0.31/src/test_endswap.def | 40 + libsndfile-1.0.31/src/test_endswap.tpl | 153 + libsndfile-1.0.31/src/test_file_io.c | 492 + libsndfile-1.0.31/src/test_float.c | 104 + libsndfile-1.0.31/src/test_ima_oki_adpcm.c | 157 + libsndfile-1.0.31/src/test_log_printf.c | 123 + libsndfile-1.0.31/src/test_main.c | 70 + libsndfile-1.0.31/src/test_main.h | 44 + libsndfile-1.0.31/src/test_nms_adpcm.c | 400 + libsndfile-1.0.31/src/test_strncpy_crlf.c | 59 + libsndfile-1.0.31/src/txw.c | 377 + libsndfile-1.0.31/src/ulaw.c | 1056 + libsndfile-1.0.31/src/version-metadata.rc | 31 + libsndfile-1.0.31/src/version-metadata.rc.in | 31 + libsndfile-1.0.31/src/voc.c | 883 + libsndfile-1.0.31/src/vox_adpcm.c | 400 + libsndfile-1.0.31/src/w64.c | 638 + libsndfile-1.0.31/src/wav.c | 1571 + libsndfile-1.0.31/src/wavlike.c | 1350 + libsndfile-1.0.31/src/wavlike.h | 358 + libsndfile-1.0.31/src/windows.c | 92 + libsndfile-1.0.31/src/wve.c | 209 + libsndfile-1.0.31/src/xi.c | 1230 + libsndfile-1.0.31/tests/aiff_rw_test.c | 169 + libsndfile-1.0.31/tests/alaw_test.c | 238 + libsndfile-1.0.31/tests/benchmark.c | 545 + libsndfile-1.0.31/tests/benchmark.def | 17 + libsndfile-1.0.31/tests/benchmark.tpl | 360 + libsndfile-1.0.31/tests/channel_test.c | 138 + libsndfile-1.0.31/tests/checksum_test.c | 129 + libsndfile-1.0.31/tests/chunk_test.c | 446 + libsndfile-1.0.31/tests/command_test.c | 1806 ++ .../tests/compression_size_test.c | 211 + libsndfile-1.0.31/tests/cpp_test.cc | 315 + libsndfile-1.0.31/tests/dft_cmp.c | 151 + libsndfile-1.0.31/tests/dft_cmp.h | 25 + libsndfile-1.0.31/tests/dither_test.c | 184 + libsndfile-1.0.31/tests/dwvw_test.c | 111 + libsndfile-1.0.31/tests/error_test.c | 287 + libsndfile-1.0.31/tests/external_libs_test.c | 204 + libsndfile-1.0.31/tests/fix_this.c | 334 + libsndfile-1.0.31/tests/floating_point_test.c | 737 + .../tests/floating_point_test.def | 32 + .../tests/floating_point_test.tpl | 365 + libsndfile-1.0.31/tests/format_check_test.c | 156 + libsndfile-1.0.31/tests/generate.c | 75 + libsndfile-1.0.31/tests/generate.h | 19 + libsndfile-1.0.31/tests/header_test.c | 785 + libsndfile-1.0.31/tests/header_test.def | 22 + libsndfile-1.0.31/tests/header_test.tpl | 583 + libsndfile-1.0.31/tests/headerless_test.c | 187 + libsndfile-1.0.31/tests/largefile_test.c | 85 + libsndfile-1.0.31/tests/locale_test.c | 169 + .../tests/long_read_write_test.c | 272 + libsndfile-1.0.31/tests/lossy_comp_test.c | 2617 ++ libsndfile-1.0.31/tests/misc_test.c | 533 + libsndfile-1.0.31/tests/multi_file_test.c | 238 + libsndfile-1.0.31/tests/ogg_opus_test.c | 424 + libsndfile-1.0.31/tests/ogg_test.c | 348 + libsndfile-1.0.31/tests/pcm_test.c | 1715 + libsndfile-1.0.31/tests/pcm_test.def | 34 + libsndfile-1.0.31/tests/pcm_test.tpl | 919 + libsndfile-1.0.31/tests/peak_chunk_test.c | 371 + .../tests/pedantic-header-test.sh.in | 58 + libsndfile-1.0.31/tests/pipe_test.c | 513 + libsndfile-1.0.31/tests/pipe_test.def | 14 + libsndfile-1.0.31/tests/pipe_test.tpl | 362 + libsndfile-1.0.31/tests/raw_test.c | 189 + libsndfile-1.0.31/tests/rdwr_test.c | 240 + libsndfile-1.0.31/tests/rdwr_test.def | 32 + libsndfile-1.0.31/tests/rdwr_test.tpl | 105 + libsndfile-1.0.31/tests/scale_clip_test.c | 1855 ++ libsndfile-1.0.31/tests/scale_clip_test.def | 56 + libsndfile-1.0.31/tests/scale_clip_test.tpl | 440 + libsndfile-1.0.31/tests/sfversion.c | 48 + libsndfile-1.0.31/tests/stdin_test.c | 206 + libsndfile-1.0.31/tests/stdio_test.c | 141 + libsndfile-1.0.31/tests/stdout_test.c | 169 + libsndfile-1.0.31/tests/string_test.c | 843 + libsndfile-1.0.31/tests/test_wrapper.sh.in | 371 + libsndfile-1.0.31/tests/ulaw_test.c | 259 + libsndfile-1.0.31/tests/utils.c | 1174 + libsndfile-1.0.31/tests/utils.def | 52 + libsndfile-1.0.31/tests/utils.h | 203 + libsndfile-1.0.31/tests/utils.tpl | 927 + libsndfile-1.0.31/tests/virtual_io_test.c | 237 + libsndfile-1.0.31/tests/win32_ordinal_test.c | 148 + libsndfile-1.0.31/tests/win32_test.c | 318 + libsndfile-1.0.31/tests/write_read_test.c | 4614 +++ libsndfile-1.0.31/tests/write_read_test.def | 75 + libsndfile-1.0.31/tests/write_read_test.tpl | 1204 + 342 files changed, 172966 insertions(+) create mode 100644 libsndfile-1.0.31/AUTHORS create mode 100644 libsndfile-1.0.31/CMakeLists.txt create mode 100644 libsndfile-1.0.31/COPYING create mode 100644 libsndfile-1.0.31/ChangeLog create mode 100644 libsndfile-1.0.31/Makefile.am create mode 100644 libsndfile-1.0.31/Makefile.in create mode 100644 libsndfile-1.0.31/NEWS create mode 100644 libsndfile-1.0.31/Octave/Makefile.am create mode 100644 libsndfile-1.0.31/Octave/Makefile.in create mode 100644 libsndfile-1.0.31/Octave/PKG_ADD create mode 100644 libsndfile-1.0.31/Octave/octave_test.m create mode 100755 libsndfile-1.0.31/Octave/octave_test.sh create mode 100644 libsndfile-1.0.31/Octave/sndfile.cc create mode 100644 libsndfile-1.0.31/Octave/sndfile_load.m create mode 100644 libsndfile-1.0.31/Octave/sndfile_play.m create mode 100644 libsndfile-1.0.31/Octave/sndfile_save.m create mode 100644 libsndfile-1.0.31/README create mode 100755 libsndfile-1.0.31/Scripts/android-configure.sh create mode 100644 libsndfile-1.0.31/Scripts/build-test-tarball.mk.in create mode 100755 libsndfile-1.0.31/Scripts/linux-to-win-cross-configure.sh create mode 100644 libsndfile-1.0.31/Win32/README-precompiled-dll.txt create mode 100644 libsndfile-1.0.31/Win32/testprog.c create mode 100644 libsndfile-1.0.31/aclocal.m4 create mode 100755 libsndfile-1.0.31/build-aux/ar-lib create mode 100755 libsndfile-1.0.31/build-aux/compile create mode 100755 libsndfile-1.0.31/build-aux/config.guess create mode 100755 libsndfile-1.0.31/build-aux/config.sub create mode 100755 libsndfile-1.0.31/build-aux/depcomp create mode 100755 libsndfile-1.0.31/build-aux/install-sh create mode 100644 libsndfile-1.0.31/build-aux/ltmain.sh create mode 100755 libsndfile-1.0.31/build-aux/missing create mode 100644 libsndfile-1.0.31/cmake/CMakeAutoGen.cmake create mode 100644 libsndfile-1.0.31/cmake/CMakeAutoGenScript.cmake create mode 100644 libsndfile-1.0.31/cmake/CheckCPUArch.c.in create mode 100644 libsndfile-1.0.31/cmake/CheckCPUArch.cmake create mode 100644 libsndfile-1.0.31/cmake/ClipMode.cmake create mode 100644 libsndfile-1.0.31/cmake/FindFLAC.cmake create mode 100644 libsndfile-1.0.31/cmake/FindOgg.cmake create mode 100644 libsndfile-1.0.31/cmake/FindOpus.cmake create mode 100644 libsndfile-1.0.31/cmake/FindSndio.cmake create mode 100644 libsndfile-1.0.31/cmake/FindSpeex.cmake create mode 100644 libsndfile-1.0.31/cmake/FindVorbis.cmake create mode 100644 libsndfile-1.0.31/cmake/SndFileChecks.cmake create mode 100644 libsndfile-1.0.31/cmake/SndFileConfig.cmake.in create mode 100644 libsndfile-1.0.31/cmake/TestInline.c.in create mode 100644 libsndfile-1.0.31/cmake/TestInline.cmake create mode 100644 libsndfile-1.0.31/cmake/TestLargeFiles.cmake create mode 100644 libsndfile-1.0.31/cmake/sqlite/FindSQLite3.cmake create mode 100755 libsndfile-1.0.31/configure create mode 100644 libsndfile-1.0.31/configure.ac create mode 100644 libsndfile-1.0.31/docs/FAQ.md create mode 100644 libsndfile-1.0.31/docs/api.md create mode 100644 libsndfile-1.0.31/docs/bugs.md create mode 100644 libsndfile-1.0.31/docs/command.md create mode 100644 libsndfile-1.0.31/docs/embedded_files.md create mode 100644 libsndfile-1.0.31/docs/formats.md create mode 100644 libsndfile-1.0.31/docs/index.md create mode 100644 libsndfile-1.0.31/docs/libsndfile.css create mode 100644 libsndfile-1.0.31/docs/libsndfile.jpg create mode 100644 libsndfile-1.0.31/docs/lists.md create mode 100644 libsndfile-1.0.31/docs/new_file_type_howto.md create mode 100644 libsndfile-1.0.31/docs/octave.md create mode 100644 libsndfile-1.0.31/docs/print.css create mode 100644 libsndfile-1.0.31/docs/sndfile_info.md create mode 100644 libsndfile-1.0.31/docs/tutorial.md create mode 100644 libsndfile-1.0.31/docs/win32.md create mode 100644 libsndfile-1.0.31/examples/generate.c create mode 100644 libsndfile-1.0.31/examples/list_formats.c create mode 100644 libsndfile-1.0.31/examples/make_sine.c create mode 100644 libsndfile-1.0.31/examples/sfprocess.c create mode 100644 libsndfile-1.0.31/examples/sndfile-loopify.c create mode 100644 libsndfile-1.0.31/examples/sndfile-to-text.c create mode 100644 libsndfile-1.0.31/examples/sndfilehandle.cc create mode 100644 libsndfile-1.0.31/include/sndfile.h.in create mode 100644 libsndfile-1.0.31/include/sndfile.hh create mode 100644 libsndfile-1.0.31/libsndfile.spec.in create mode 100644 libsndfile-1.0.31/m4/ax_add_fortify_source.m4 create mode 100644 libsndfile-1.0.31/m4/ax_append_compile_flags.m4 create mode 100644 libsndfile-1.0.31/m4/ax_append_flag.m4 create mode 100644 libsndfile-1.0.31/m4/ax_append_link_flags.m4 create mode 100644 libsndfile-1.0.31/m4/ax_check_compile_flag.m4 create mode 100644 libsndfile-1.0.31/m4/ax_check_link_flag.m4 create mode 100644 libsndfile-1.0.31/m4/ax_compiler_vendor.m4 create mode 100644 libsndfile-1.0.31/m4/ax_compiler_version.m4 create mode 100644 libsndfile-1.0.31/m4/ax_recursive_eval.m4 create mode 100644 libsndfile-1.0.31/m4/ax_require_defined.m4 create mode 100644 libsndfile-1.0.31/m4/clip_mode.m4 create mode 100644 libsndfile-1.0.31/m4/extra_pkg.m4 create mode 100644 libsndfile-1.0.31/m4/libtool.m4 create mode 100644 libsndfile-1.0.31/m4/ltoptions.m4 create mode 100644 libsndfile-1.0.31/m4/ltsugar.m4 create mode 100644 libsndfile-1.0.31/m4/ltversion.m4 create mode 100644 libsndfile-1.0.31/m4/lt~obsolete.m4 create mode 100644 libsndfile-1.0.31/m4/mkoctfile_version.m4 create mode 100644 libsndfile-1.0.31/m4/octave.m4 create mode 100644 libsndfile-1.0.31/m4/stack_protect.m4 create mode 100644 libsndfile-1.0.31/man/sndfile-cmp.1 create mode 100644 libsndfile-1.0.31/man/sndfile-concat.1 create mode 100644 libsndfile-1.0.31/man/sndfile-convert.1 create mode 100644 libsndfile-1.0.31/man/sndfile-deinterleave.1 create mode 100644 libsndfile-1.0.31/man/sndfile-info.1 create mode 100644 libsndfile-1.0.31/man/sndfile-interleave.1 create mode 100644 libsndfile-1.0.31/man/sndfile-metadata-get.1 create mode 100644 libsndfile-1.0.31/man/sndfile-metadata-set.1 create mode 100644 libsndfile-1.0.31/man/sndfile-play.1 create mode 100644 libsndfile-1.0.31/man/sndfile-salvage.1 create mode 100644 libsndfile-1.0.31/ossfuzz/sndfile_fuzzer.cc create mode 100644 libsndfile-1.0.31/ossfuzz/standaloneengine.cc create mode 100644 libsndfile-1.0.31/ossfuzz/testinput.h create mode 100644 libsndfile-1.0.31/programs/common.c create mode 100644 libsndfile-1.0.31/programs/common.h create mode 100644 libsndfile-1.0.31/programs/sndfile-cmp.c create mode 100644 libsndfile-1.0.31/programs/sndfile-concat.c create mode 100644 libsndfile-1.0.31/programs/sndfile-convert.c create mode 100644 libsndfile-1.0.31/programs/sndfile-deinterleave.c create mode 100644 libsndfile-1.0.31/programs/sndfile-info.c create mode 100644 libsndfile-1.0.31/programs/sndfile-interleave.c create mode 100644 libsndfile-1.0.31/programs/sndfile-metadata-get.c create mode 100644 libsndfile-1.0.31/programs/sndfile-metadata-set.c create mode 100644 libsndfile-1.0.31/programs/sndfile-play.c create mode 100644 libsndfile-1.0.31/programs/sndfile-salvage.c create mode 100755 libsndfile-1.0.31/programs/test-sndfile-metadata-set.py create mode 100644 libsndfile-1.0.31/regtest/checksum.c create mode 100644 libsndfile-1.0.31/regtest/database.c create mode 100644 libsndfile-1.0.31/regtest/regtest.h create mode 100644 libsndfile-1.0.31/regtest/sndfile-regtest.c create mode 100644 libsndfile-1.0.31/sndfile.pc.in create mode 100644 libsndfile-1.0.31/src/ALAC/ALACAudioTypes.h create mode 100644 libsndfile-1.0.31/src/ALAC/ALACBitUtilities.c create mode 100644 libsndfile-1.0.31/src/ALAC/ALACBitUtilities.h create mode 100644 libsndfile-1.0.31/src/ALAC/EndianPortable.h create mode 100644 libsndfile-1.0.31/src/ALAC/ag_dec.c create mode 100644 libsndfile-1.0.31/src/ALAC/ag_enc.c create mode 100644 libsndfile-1.0.31/src/ALAC/aglib.h create mode 100644 libsndfile-1.0.31/src/ALAC/alac_codec.h create mode 100644 libsndfile-1.0.31/src/ALAC/alac_decoder.c create mode 100644 libsndfile-1.0.31/src/ALAC/alac_encoder.c create mode 100644 libsndfile-1.0.31/src/ALAC/dp_dec.c create mode 100644 libsndfile-1.0.31/src/ALAC/dp_enc.c create mode 100644 libsndfile-1.0.31/src/ALAC/dplib.h create mode 100644 libsndfile-1.0.31/src/ALAC/matrix_dec.c create mode 100644 libsndfile-1.0.31/src/ALAC/matrix_enc.c create mode 100644 libsndfile-1.0.31/src/ALAC/matrixlib.h create mode 100644 libsndfile-1.0.31/src/ALAC/shift.h create mode 100644 libsndfile-1.0.31/src/G72x/ChangeLog create mode 100644 libsndfile-1.0.31/src/G72x/README create mode 100644 libsndfile-1.0.31/src/G72x/README.original create mode 100644 libsndfile-1.0.31/src/G72x/g721.c create mode 100644 libsndfile-1.0.31/src/G72x/g723_16.c create mode 100644 libsndfile-1.0.31/src/G72x/g723_24.c create mode 100644 libsndfile-1.0.31/src/G72x/g723_40.c create mode 100644 libsndfile-1.0.31/src/G72x/g72x.c create mode 100644 libsndfile-1.0.31/src/G72x/g72x.h create mode 100644 libsndfile-1.0.31/src/G72x/g72x_priv.h create mode 100644 libsndfile-1.0.31/src/G72x/g72x_test.c create mode 100644 libsndfile-1.0.31/src/GSM610/COPYRIGHT create mode 100644 libsndfile-1.0.31/src/GSM610/ChangeLog create mode 100644 libsndfile-1.0.31/src/GSM610/README create mode 100644 libsndfile-1.0.31/src/GSM610/add.c create mode 100644 libsndfile-1.0.31/src/GSM610/code.c create mode 100644 libsndfile-1.0.31/src/GSM610/config.h create mode 100644 libsndfile-1.0.31/src/GSM610/decode.c create mode 100644 libsndfile-1.0.31/src/GSM610/gsm.h create mode 100644 libsndfile-1.0.31/src/GSM610/gsm610_priv.h create mode 100644 libsndfile-1.0.31/src/GSM610/gsm_create.c create mode 100644 libsndfile-1.0.31/src/GSM610/gsm_decode.c create mode 100644 libsndfile-1.0.31/src/GSM610/gsm_destroy.c create mode 100644 libsndfile-1.0.31/src/GSM610/gsm_encode.c create mode 100644 libsndfile-1.0.31/src/GSM610/gsm_option.c create mode 100644 libsndfile-1.0.31/src/GSM610/long_term.c create mode 100644 libsndfile-1.0.31/src/GSM610/lpc.c create mode 100644 libsndfile-1.0.31/src/GSM610/preprocess.c create mode 100644 libsndfile-1.0.31/src/GSM610/rpe.c create mode 100644 libsndfile-1.0.31/src/GSM610/short_term.c create mode 100644 libsndfile-1.0.31/src/GSM610/table.c create mode 100644 libsndfile-1.0.31/src/Symbols.darwin create mode 100644 libsndfile-1.0.31/src/Symbols.gnu-binutils create mode 100644 libsndfile-1.0.31/src/Symbols.os2 create mode 100644 libsndfile-1.0.31/src/Symbols.static create mode 100644 libsndfile-1.0.31/src/aiff.c create mode 100644 libsndfile-1.0.31/src/alac.c create mode 100644 libsndfile-1.0.31/src/alaw.c create mode 100644 libsndfile-1.0.31/src/au.c create mode 100644 libsndfile-1.0.31/src/audio_detect.c create mode 100644 libsndfile-1.0.31/src/avr.c create mode 100755 libsndfile-1.0.31/src/binheader_writef_check.py create mode 100644 libsndfile-1.0.31/src/broadcast.c create mode 100644 libsndfile-1.0.31/src/caf.c create mode 100644 libsndfile-1.0.31/src/cart.c create mode 100644 libsndfile-1.0.31/src/chanmap.c create mode 100644 libsndfile-1.0.31/src/chanmap.h create mode 100644 libsndfile-1.0.31/src/chunk.c create mode 100644 libsndfile-1.0.31/src/command.c create mode 100644 libsndfile-1.0.31/src/common.c create mode 100644 libsndfile-1.0.31/src/common.h create mode 100644 libsndfile-1.0.31/src/config.h.cmake create mode 100644 libsndfile-1.0.31/src/config.h.in create mode 100644 libsndfile-1.0.31/src/create_symbols_file.py create mode 100644 libsndfile-1.0.31/src/dither.c create mode 100644 libsndfile-1.0.31/src/double64.c create mode 100644 libsndfile-1.0.31/src/dwd.c create mode 100644 libsndfile-1.0.31/src/dwvw.c create mode 100644 libsndfile-1.0.31/src/file_io.c create mode 100644 libsndfile-1.0.31/src/flac.c create mode 100644 libsndfile-1.0.31/src/float32.c create mode 100644 libsndfile-1.0.31/src/g72x.c create mode 100644 libsndfile-1.0.31/src/gsm610.c create mode 100644 libsndfile-1.0.31/src/htk.c create mode 100644 libsndfile-1.0.31/src/id3.c create mode 100644 libsndfile-1.0.31/src/ima_adpcm.c create mode 100644 libsndfile-1.0.31/src/ima_oki_adpcm.c create mode 100644 libsndfile-1.0.31/src/ima_oki_adpcm.h create mode 100644 libsndfile-1.0.31/src/interleave.c create mode 100644 libsndfile-1.0.31/src/ircam.c create mode 100644 libsndfile-1.0.31/src/libsndfile-1.def create mode 100644 libsndfile-1.0.31/src/macos.c create mode 100755 libsndfile-1.0.31/src/make-static-lib-hidden-privates.sh create mode 100644 libsndfile-1.0.31/src/mat4.c create mode 100644 libsndfile-1.0.31/src/mat5.c create mode 100644 libsndfile-1.0.31/src/mpc2k.c create mode 100644 libsndfile-1.0.31/src/ms_adpcm.c create mode 100644 libsndfile-1.0.31/src/nist.c create mode 100644 libsndfile-1.0.31/src/nms_adpcm.c create mode 100644 libsndfile-1.0.31/src/ogg.c create mode 100644 libsndfile-1.0.31/src/ogg.h create mode 100644 libsndfile-1.0.31/src/ogg_opus.c create mode 100644 libsndfile-1.0.31/src/ogg_pcm.c create mode 100644 libsndfile-1.0.31/src/ogg_speex.c create mode 100644 libsndfile-1.0.31/src/ogg_vcomment.c create mode 100644 libsndfile-1.0.31/src/ogg_vcomment.h create mode 100644 libsndfile-1.0.31/src/ogg_vorbis.c create mode 100644 libsndfile-1.0.31/src/paf.c create mode 100644 libsndfile-1.0.31/src/pcm.c create mode 100644 libsndfile-1.0.31/src/pvf.c create mode 100644 libsndfile-1.0.31/src/raw.c create mode 100644 libsndfile-1.0.31/src/rf64.c create mode 100644 libsndfile-1.0.31/src/rx2.c create mode 100644 libsndfile-1.0.31/src/sd2.c create mode 100644 libsndfile-1.0.31/src/sds.c create mode 100644 libsndfile-1.0.31/src/sf_unistd.h create mode 100644 libsndfile-1.0.31/src/sfconfig.h create mode 100644 libsndfile-1.0.31/src/sfendian.h create mode 100644 libsndfile-1.0.31/src/sndfile.c create mode 100644 libsndfile-1.0.31/src/strings.c create mode 100644 libsndfile-1.0.31/src/svx.c create mode 100644 libsndfile-1.0.31/src/test_audio_detect.c create mode 100644 libsndfile-1.0.31/src/test_binheader_writef.c create mode 100644 libsndfile-1.0.31/src/test_broadcast_var.c create mode 100644 libsndfile-1.0.31/src/test_cart_var.c create mode 100644 libsndfile-1.0.31/src/test_conversions.c create mode 100644 libsndfile-1.0.31/src/test_endswap.c create mode 100644 libsndfile-1.0.31/src/test_endswap.def create mode 100644 libsndfile-1.0.31/src/test_endswap.tpl create mode 100644 libsndfile-1.0.31/src/test_file_io.c create mode 100644 libsndfile-1.0.31/src/test_float.c create mode 100644 libsndfile-1.0.31/src/test_ima_oki_adpcm.c create mode 100644 libsndfile-1.0.31/src/test_log_printf.c create mode 100644 libsndfile-1.0.31/src/test_main.c create mode 100644 libsndfile-1.0.31/src/test_main.h create mode 100644 libsndfile-1.0.31/src/test_nms_adpcm.c create mode 100644 libsndfile-1.0.31/src/test_strncpy_crlf.c create mode 100644 libsndfile-1.0.31/src/txw.c create mode 100644 libsndfile-1.0.31/src/ulaw.c create mode 100644 libsndfile-1.0.31/src/version-metadata.rc create mode 100644 libsndfile-1.0.31/src/version-metadata.rc.in create mode 100644 libsndfile-1.0.31/src/voc.c create mode 100644 libsndfile-1.0.31/src/vox_adpcm.c create mode 100644 libsndfile-1.0.31/src/w64.c create mode 100644 libsndfile-1.0.31/src/wav.c create mode 100644 libsndfile-1.0.31/src/wavlike.c create mode 100644 libsndfile-1.0.31/src/wavlike.h create mode 100644 libsndfile-1.0.31/src/windows.c create mode 100644 libsndfile-1.0.31/src/wve.c create mode 100644 libsndfile-1.0.31/src/xi.c create mode 100644 libsndfile-1.0.31/tests/aiff_rw_test.c create mode 100644 libsndfile-1.0.31/tests/alaw_test.c create mode 100644 libsndfile-1.0.31/tests/benchmark.c create mode 100644 libsndfile-1.0.31/tests/benchmark.def create mode 100644 libsndfile-1.0.31/tests/benchmark.tpl create mode 100644 libsndfile-1.0.31/tests/channel_test.c create mode 100644 libsndfile-1.0.31/tests/checksum_test.c create mode 100644 libsndfile-1.0.31/tests/chunk_test.c create mode 100644 libsndfile-1.0.31/tests/command_test.c create mode 100644 libsndfile-1.0.31/tests/compression_size_test.c create mode 100644 libsndfile-1.0.31/tests/cpp_test.cc create mode 100644 libsndfile-1.0.31/tests/dft_cmp.c create mode 100644 libsndfile-1.0.31/tests/dft_cmp.h create mode 100644 libsndfile-1.0.31/tests/dither_test.c create mode 100644 libsndfile-1.0.31/tests/dwvw_test.c create mode 100644 libsndfile-1.0.31/tests/error_test.c create mode 100644 libsndfile-1.0.31/tests/external_libs_test.c create mode 100644 libsndfile-1.0.31/tests/fix_this.c create mode 100644 libsndfile-1.0.31/tests/floating_point_test.c create mode 100644 libsndfile-1.0.31/tests/floating_point_test.def create mode 100644 libsndfile-1.0.31/tests/floating_point_test.tpl create mode 100644 libsndfile-1.0.31/tests/format_check_test.c create mode 100644 libsndfile-1.0.31/tests/generate.c create mode 100644 libsndfile-1.0.31/tests/generate.h create mode 100644 libsndfile-1.0.31/tests/header_test.c create mode 100644 libsndfile-1.0.31/tests/header_test.def create mode 100644 libsndfile-1.0.31/tests/header_test.tpl create mode 100644 libsndfile-1.0.31/tests/headerless_test.c create mode 100644 libsndfile-1.0.31/tests/largefile_test.c create mode 100644 libsndfile-1.0.31/tests/locale_test.c create mode 100644 libsndfile-1.0.31/tests/long_read_write_test.c create mode 100644 libsndfile-1.0.31/tests/lossy_comp_test.c create mode 100644 libsndfile-1.0.31/tests/misc_test.c create mode 100644 libsndfile-1.0.31/tests/multi_file_test.c create mode 100644 libsndfile-1.0.31/tests/ogg_opus_test.c create mode 100644 libsndfile-1.0.31/tests/ogg_test.c create mode 100644 libsndfile-1.0.31/tests/pcm_test.c create mode 100644 libsndfile-1.0.31/tests/pcm_test.def create mode 100644 libsndfile-1.0.31/tests/pcm_test.tpl create mode 100644 libsndfile-1.0.31/tests/peak_chunk_test.c create mode 100644 libsndfile-1.0.31/tests/pedantic-header-test.sh.in create mode 100644 libsndfile-1.0.31/tests/pipe_test.c create mode 100644 libsndfile-1.0.31/tests/pipe_test.def create mode 100644 libsndfile-1.0.31/tests/pipe_test.tpl create mode 100644 libsndfile-1.0.31/tests/raw_test.c create mode 100644 libsndfile-1.0.31/tests/rdwr_test.c create mode 100644 libsndfile-1.0.31/tests/rdwr_test.def create mode 100644 libsndfile-1.0.31/tests/rdwr_test.tpl create mode 100644 libsndfile-1.0.31/tests/scale_clip_test.c create mode 100644 libsndfile-1.0.31/tests/scale_clip_test.def create mode 100644 libsndfile-1.0.31/tests/scale_clip_test.tpl create mode 100644 libsndfile-1.0.31/tests/sfversion.c create mode 100644 libsndfile-1.0.31/tests/stdin_test.c create mode 100644 libsndfile-1.0.31/tests/stdio_test.c create mode 100644 libsndfile-1.0.31/tests/stdout_test.c create mode 100644 libsndfile-1.0.31/tests/string_test.c create mode 100644 libsndfile-1.0.31/tests/test_wrapper.sh.in create mode 100644 libsndfile-1.0.31/tests/ulaw_test.c create mode 100644 libsndfile-1.0.31/tests/utils.c create mode 100644 libsndfile-1.0.31/tests/utils.def create mode 100644 libsndfile-1.0.31/tests/utils.h create mode 100644 libsndfile-1.0.31/tests/utils.tpl create mode 100644 libsndfile-1.0.31/tests/virtual_io_test.c create mode 100644 libsndfile-1.0.31/tests/win32_ordinal_test.c create mode 100644 libsndfile-1.0.31/tests/win32_test.c create mode 100644 libsndfile-1.0.31/tests/write_read_test.c create mode 100644 libsndfile-1.0.31/tests/write_read_test.def create mode 100644 libsndfile-1.0.31/tests/write_read_test.tpl diff --git a/libsndfile-1.0.31/AUTHORS b/libsndfile-1.0.31/AUTHORS new file mode 100644 index 0000000..9ef64da --- /dev/null +++ b/libsndfile-1.0.31/AUTHORS @@ -0,0 +1,235 @@ +Original author: + +The main author of libsndfile is Erik de Castro Lopo +apart from code in the following directories: + + - src/GSM610 : Written by Jutta Degener and Carsten + Bormann . They should not be contacted in relation to + libsndfile or the GSM 6.10 code that is part of libsndfile. Their original + code can be found at: + + http://kbs.cs.tu-berlin.de/~jutta/toast.html + + - src/G72x : Released by Sun Microsystems, Inc. to the public domain. Minor + modifications were required to integrate these files into libsndfile. The + changes are listed in src/G72x/ChangeLog. + +Current maintainers: + +After the release of version 1.0.30, @erikd transferred the project to +[the libsndfile team](https://github.com/libsndfile) consisting of: + +* Erik de Castro Lopo aka @erikd +* David Seifert aka @SoapGentoo +* Arthur Taylor aka @arthurt +* @evpobr + +Current releaser is David Seifert: + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v2 + +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 +=K3x+ +-----END PGP PUBLIC KEY BLOCK----- + +Previous releasers: + +Version 1.0.29-1.0.30 - @evpobr. + +The public GPG key: + +-----BEGIN PGP MESSAGE----- + +yMMwAnicrVJ7UFRVHF50SdiJ2AknHmYM19IhFrmPva91hnBKHMkcSyAyY7nn3nN3 +L7AP9qVoO5Lja1YUycgJ4iUFWYluTlE4Oi6PxdhpCkesIWiAQIbXqlSs1Ex1l7H/ +6r/OP2fOd77vm+/3za8nZqVCFVEfk/xkgPyrMiLgO+FUFIze8R5AgEUoR3QHkBK4 +fMFSAdod+hJJQHQIiqEYBzECYByBs4AnGBYDGIYDjqEYHMc4nKB5ntICkQSAxCke +RTEaJ3AthWJaWccItIhyiAYRJbMB2qw2yeyQbVmA8aKAQxbHCZbXApxhIIqTIiug +AiZiPA8IUhQZXhYaLfawQg4HODvcKFlkTH7ol+P9C/9/zu1cthMJlJG5NM+RFEUC +nsIomiJIBhMIUmAwNky0Q5uZM0GZDV1WC7Ahbg0iYy6Jh+FaH/4ZJIfRCf6L7yi3 +hoG9EOgfSvVAMgtyd7LCBW12yWJGdJjM5B1SWItpWQwjtBjOahC4zyrZoF4KM0ia +YlD5aBCrDbpkSxrwIkpwUO6YIHCUAjwOKEIUBFaAIsWKAJfrF7XyoJAGkIaUPD9g +aSBwIkUIOIqEhykzWxAdKcfkDLKlXTKYOYfTBhF3l2+PUhGhUjwSuSK8UwpVtPqf +TTv+gVoRyKt70PuZxj6oi7ZkZP481vcc2vJ6cV774dld3s3n3+3w+cXdW9YaVvc9 +ni8Nv6aOUqx5b/+Lexria1wn7c1DOxVnikYSV50eY0o7Lwatz3qqg6RHWVOVF3zm +lai7u7ud7r7vh5Lrm+95j06OeWN+29SbkNVeW9X1Vs651NsF9K1jV7xzkRdz6N4f +Vy+5B37qTr18Lclk9lx7o3cmP/+6Jbbl3qvj7w/PvTnVDyYiuxtSZlvtCZ2JT6yv +21rw8tLXnDHhwv0/7kfnpgSNXxKLA/tyPRsunLxp8tw4e6zx6PGbwsxKsTopg9u1 +dkdzBxWf+VVb/tbUzZNtUzUpj0l1fiSUtu1UaHxwdOnj2JlI4fdfdyAh/5GqvbY5 +7YKy0hgabi89Ffen+qUNtZ+f90258OevKhf6S+p+qelSRh/64ZOihg87D857slVZ +5wqttfExWb7LymH/oVjTpcWFt4u/uP3pC8YrwfY+ad2NpDuW5oqPZrKOFCoGzqgb +t1jSF1Vph1c0qtZUds+PaAqpp/Mqhjo0yavKiid91emBiPaeb3s2uW8d9J6YXZiu +T8p7tK+8yHp3ov4dcCk3lNY28s13ZePrW8ceVGc3zOT01/ibotLjdFZn9tmd67a3 +iCrDaJM7Y/9TY8XzHdPbTZ2wPG7bxFBg2LSx6WootqI1dF2fGutPzE0bzJzW/w3x +usYz +=XFTp +-----END PGP MESSAGE----- + +Versions before 1.0.29 - Erik de Castro Lopo. + +The public GPG key: + +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCAAdFiEEapGlzyLCTJmjXgE/z9z5H7JCrO0FAljgv0wACgkQz9z5H7JC +rO2RhxAAnIuHquhkhaY8CVsIOGImMxEF8RKDyFoioV9RnckNzBb592EYxU9hS0MM +cT6xPZU0bJa8CvmCxEABMlkk60JP4VmmOtWxD8EEyktbHGyao80mDR82yVKYv78L +zTRzz/JoTncgwWz/QataMbkAfy3KpxkwDW87az0kzkqGuSm3Jg3medt+t/iBe0Wm +jcxIexxEZCmIhty6VyaVEkGWax0zdJHe7aD9FK2C/R3DU5Byp4e9pcp/a8v74G1n +dgD4S3YlqvJGuU9S6QD4PzsoWD1X8f6pHzxpRP/OkqHAe11sSRo6sSYYCjsYi9Ca +IJSlVC1nMx9OUxxAA8ZqtnztOo7GZcJ5NAL5X3GNV6YfQ7Bqxvtr6QG26F06MB6i +p08UC7NC0bxFsD3f07wY22QnbnM052rniTn5sqQZv+GVls6t1b3u1iHzEjAjlgvi +eOjVVt/A8iaOzMbKC/3+SZ9/GYqbSAQOCIoWAXmhV9IaMQyQeLCIC1YD5NMGBXal +HPfSHV0hSUDbKjAYXFigJRzFU125bXTgg+v13Kd0KklIEjoaZYZLAYs0BupXdjBf +jSPv8pwUaXJkv9/bGH0Ot1fvwDqPDOlGFINQbGAWdxwsdhiYBeXMFeFNTEfiqEMz +BhhMxKa+Mfd9fkrX4NNigGW5QgRBS+FHNLf6ZfiXSnBGjjxMcbI= +=UUA0 +-----END PGP SIGNATURE----- + +Others: + + 2013-03-07 Michael Pruett + 2013-02-11 Chris Roberts c.roberts@csrfm.com + 2012-03-17 IOhannes m zmoelnig + 2013-02-21 Jan Starry + 2012-01-20 Bodo + 2011-06-23 Tim van der Molen + 2010-12-01 Tim Blechmann + 2010-10-04 Matti Nykyri + 2010-09-17 Brian Lewis + 2010-02-22 Robin Gareus + 2010-01-07 Christian Weisgerber and Jacob Meuserto + 2009-10-18 Olivier Tristan + 2009-10-14, 2009-08-30 Uli Franke + 2009-06-24, 2008-11-19, 2004-09-22, 2004-06-17, 2003-05-03, 2003-05-02 Conrad Parker + 2009-05-22 Lennart Poettering + 2008-07-03, 2006-10-22, 2006-10-18 Fons Adriaensen + 2008-04-19 David Yeo + 2008-01-20 Yair K. + 2007-12-03 Robs + 2007-07-12 Ed Schouten + 2007-06-07 Trent Apted + 2007-04-14, 2003-12-12 André Pang + 2007-04-14 Reuben Thomas + 2006-11-09 Jonathan Woithe + 2006-03-26 Diego 'Flameeyes' Pettenò + 2006-03-17 Paul Davis + 2006-03-09 Jesse Chappell + 2006-01-09, 2005-12-28 John ffitch + 2005-09-21 David A. van Leeuwen + 2005-08-15 Mo DeJong + 2005-04-30 David Viens + 2004-12-29 Steve Baker + 2004-09-05 Denis Cote + 2004-06-28 Stanko Juzbasic + 2004-02-14 Frank Neumann + 2003-08-15 Axel Röbel + 2003-08-06 Peter Miller + 2003-07-21 Tero Pelander + 2003-02-10 Antoine Mathys + 2002-12-30 Marek Peteraj diff --git a/libsndfile-1.0.31/CMakeLists.txt b/libsndfile-1.0.31/CMakeLists.txt new file mode 100644 index 0000000..de98145 --- /dev/null +++ b/libsndfile-1.0.31/CMakeLists.txt @@ -0,0 +1,1471 @@ +cmake_minimum_required (VERSION 3.1..3.18) + +# MSVC runtime library flags are selected by an abstraction, CMake >= 3.15 +# This policy still need to be set even with cmake_minimum_required() command above. +if (POLICY CMP0091) + if ((DEFINED ENABLE_STATIC_RUNTIME) AND (DEFINED CMAKE_MSVC_RUNTIME_LIBRARY)) + message (FATAL_ERROR "Both ENABLE_STATIC_RUNTIME and CMAKE_MSVC_RUNTIME_LIBRARY are set.") + return () + endif () + + if (DEFINED CMAKE_MSVC_RUNTIME_LIBRARY) + cmake_policy (SET CMP0091 NEW) + else () + cmake_policy (SET CMP0091 OLD) + endif () +endif () + +project(libsndfile VERSION 1.0.31) + +# +# Variables +# + +set (CMAKE_C_STANDARD 99) +set (CMAKE_C_STANDARD_REQUIRED TRUE) +set_property(GLOBAL PROPERTY USE_FOLDERS ON) + +set (PACKAGE_NAME ${PROJECT_NAME}) +set (CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) +set (CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) +set (CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH}) +set (CPACK_PACKAGE_VERSION_STAGE "") +set (CPACK_PACKAGE_VERSION_FULL "${PROJECT_VERSION}${CPACK_PACKAGE_VERSION_STAGE}") + +# +# System-wide includes +# + +include (GNUInstallDirs) +include (FeatureSummary) +include (CMakeDependentOption) +include (CTest) +include (CheckCCompilerFlag) + +# +# Options +# + +option (BUILD_SHARED_LIBS "Build shared libraries" OFF) +if (BUILD_SHARED_LIBS AND BUILD_TESTING) + set (BUILD_TESTING OFF) + message ("Build testing required static libraries. To prevent build errors BUILD_TESTING disabled.") +endif () +option (BUILD_PROGRAMS "Build programs" ON) +option (BUILD_EXAMPLES "Build examples" ON) +option (ENABLE_CPACK "Enable CPack support" ON) +option (ENABLE_EXPERIMENTAL "Enable experimental code" OFF) +option (ENABLE_BOW_DOCS "Enable black-on-white html docs" OFF) +if (MSVC AND (DEFINED ENABLE_STATIC_RUNTIME)) + option (ENABLE_STATIC_RUNTIME "Enable static runtime" ${ENABLE_STATIC_RUNTIME}) +elseif (MINGW) + option (ENABLE_STATIC_RUNTIME "Enable static runtime" OFF) +endif () +option (ENABLE_PACKAGE_CONFIG "Generate and install package config file" ON) +option (INSTALL_PKGCONFIG_MODULE "Generate and install pkg-config module" ON) + +list (APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +if (CMAKE_VERSION VERSION_LESS 3.14) + list (APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/sqlite") +endif () + +# +# Setup definitions +# + +include(SndFileChecks) + + +cmake_dependent_option (BUILD_REGTEST "Build regtest" ON "SQLITE3_FOUND" OFF) +cmake_dependent_option (ENABLE_EXTERNAL_LIBS "Enable FLAC, Vorbis, and Opus codecs" ON "Vorbis_FOUND;FLAC_FOUND;OPUS_FOUND" OFF) +cmake_dependent_option (ENABLE_CPU_CLIP "Enable tricky cpu specific clipper" ON "CPU_CLIPS_POSITIVE;CPU_CLIPS_NEGATIVE" OFF) +if (NOT ENABLE_CPU_CLIP) + set (CPU_CLIPS_POSITIVE FALSE) + set (CPU_CLIPS_NEGATIVE FALSE) +endif () +cmake_dependent_option (ENABLE_COMPATIBLE_LIBSNDFILE_NAME "Set DLL name to libsndfile-1.dll (canonical name), sndfile.dll otherwise" OFF "WIN32;BUILD_SHARED_LIBS" OFF) +cmake_dependent_option (INSTALL_MANPAGES "Install man pages for programs" ON "BUILD_PROGRAMS" OFF) + +if (NOT MSVC) + if (CPU_IS_X86) + check_c_compiler_flag (-msse2 HAVE_MSSE2_COMPILER_FLAG) + if (HAVE_MSSE2_COMPILER_FLAG) + cmake_dependent_option (ENABLE_SSE2 "Add SSE2 compiler flag" ON "HAVE_MSSE2_COMPILER_FLAG" OFF) + endif () + endif () +endif () +if (ENABLE_SSE2) + add_compile_options (-msse2) +endif () + +set (HAVE_EXTERNAL_XIPH_LIBS ${ENABLE_EXTERNAL_LIBS}) +set (HAVE_SQLITE3 ${BUILD_REGTEST}) +set (HAVE_ALSA_ASOUNDLIB_H ${ALSA_FOUND}) +set (HAVE_SNDIO_H ${SNDIO_FOUND}) + +set (ENABLE_EXPERIMENTAL_CODE ${ENABLE_EXPERIMENTAL}) +set (HAVE_SPEEX ${ENABLE_EXPERIMENTAL}) +set (HAVE_OPUS ${ENABLE_EXPERIMENTAL}) + +add_feature_info (BUILD_SHARED_LIBS BUILD_SHARED_LIBS "build shared libraries") +add_feature_info (ENABLE_EXTERNAL_LIBS ENABLE_EXTERNAL_LIBS "enable FLAC, Vorbis, and Opus codecs") +add_feature_info (ENABLE_EXPERIMENTAL ENABLE_EXPERIMENTAL "enable experimental code") +add_feature_info (BUILD_TESTING BUILD_TESTING "build tests") +add_feature_info (BUILD_REGTEST BUILD_REGTEST "build regtest") +add_feature_info (ENABLE_CPACK ENABLE_CPACK "enable CPack support") +add_feature_info (ENABLE_CPU_CLIP ENABLE_CPU_CLIP "Enable tricky cpu specific clipper") +add_feature_info (ENABLE_BOW_DOCS ENABLE_BOW_DOCS "enable black-on-white html docs") +add_feature_info (ENABLE_PACKAGE_CONFIG ENABLE_PACKAGE_CONFIG "generate and install package config file") +add_feature_info (INSTALL_PKGCONFIG_MODULE INSTALL_PKGCONFIG_MODULE "generate and install pkg-config module") +add_feature_info (INSTALL_MANPAGES INSTALL_MANPAGES "install man pages for programs") +if (WIN32 AND BUILD_SHARED_LIBS) + add_feature_info (ENABLE_COMPATIBLE_LIBSNDFILE_NAME ENABLE_COMPATIBLE_LIBSNDFILE_NAME "Set DLL name to libsndfile-1.dll (canonical name), sndfile.dll otherwise") +endif () + +if (HAVE_MSSE2_COMPILER_FLAG) + add_feature_info (ENABLE_SSE2 ENABLE_SSE2 "add SSE2 compiler flag") +endif () + + + + +set_package_properties (Ogg PROPERTIES + TYPE RECOMMENDED + URL "www.xiph.org/ogg/" + DESCRIPTION "library for manipulating ogg bitstreams" + PURPOSE "Required to enable Vorbis, Speex, and Opus support" + ) +set_package_properties (Vorbis PROPERTIES + TYPE RECOMMENDED + URL "www.vorbis.com/" + DESCRIPTION "open source lossy audio codec" + PURPOSE "Enables Vorbis support" + ) +set_package_properties (FLAC PROPERTIES + TYPE RECOMMENDED + URL "www.xiph.org/flac/" + DESCRIPTION "Free Lossless Audio Codec Library" + PURPOSE "Enables FLAC support" + ) +set_package_properties(Opus PROPERTIES + TYPE RECOMMENDED + URL "www.opus-codec.org/" + DESCRIPTION "Standardized open source low-latency fullband codec" + PURPOSE "Enables experimental Opus support" + ) +set_package_properties(Speex PROPERTIES TYPE OPTIONAL + URL "www.speex.org/" + DESCRIPTION "an audio codec tuned for speech" + PURPOSE "Enables experemental Speex support" + ) +set_package_properties (SQLite3 PROPERTIES + TYPE OPTIONAL + URL "www.sqlite.org/" + DESCRIPTION "light weight SQL database engine." + PURPOSE "Enables regtest" + ) +if (BUILD_SHARED_LIBS) + set_package_properties (PythonInterp PROPERTIES + TYPE REQUIRED + URL "www.python.org/" + DESCRIPTION "Python is a widely used high-level programming language." + PURPOSE "Required to build shared libraries" + ) +endif() + +feature_summary (WHAT ALL) + +# +# Setup configuration +# + +configure_file (src/config.h.cmake src/config.h) + +configure_file (include/sndfile.h.in include/sndfile.h) + +if (INSTALL_PKGCONFIG_MODULE) + + set (prefix ${CMAKE_INSTALL_PREFIX}) + set (exec_prefix "\$\{prefix\}") + set (libdir "\$\{prefix\}/${CMAKE_INSTALL_LIBDIR}") + set (includedir "\$\{prefix\}/${CMAKE_INSTALL_INCLUDEDIR}") + set (VERSION ${PROJECT_VERSION}) + if (ENABLE_EXTERNAL_LIBS) + set (EXTERNAL_XIPH_REQUIRE "flac ogg vorbis vorbisenc opus") + if (ENABLE_EXPERIMENTAL) + set (EXTERNAL_XIPH_REQUIRE "${EXTERNAL_XIPH_REQUIRE} speex") + endif () + endif () + + configure_file (sndfile.pc.in sndfile.pc @ONLY) + +endif () + +# +# libsndfile +# + +# Public libsndfile headers +set (sndfile_HDRS + include/sndfile.hh + ${CMAKE_CURRENT_BINARY_DIR}/include/sndfile.h + ) + +# +# libsndfile static library +# + +add_library (sndfile + src/sfconfig.h + src/sfendian.h + src/sf_unistd.h + src/common.h + src/common.c + src/file_io.c + src/command.c + src/pcm.c + src/ulaw.c + src/alaw.c + src/float32.c + src/double64.c + src/ima_adpcm.c + src/ms_adpcm.c + src/gsm610.c + src/dwvw.c + src/vox_adpcm.c + src/interleave.c + src/strings.c + src/dither.c + src/cart.c + src/broadcast.c + src/audio_detect.c + src/ima_oki_adpcm.c + src/ima_oki_adpcm.h + src/alac.c + src/chunk.c + src/ogg.h + src/ogg.c + src/chanmap.h + src/chanmap.c + src/id3.c + $<$:src/windows.c> + src/sndfile.c + src/aiff.c + src/au.c + src/avr.c + src/caf.c + src/dwd.c + src/flac.c + src/g72x.c + src/htk.c + src/ircam.c + src/macos.c + src/mat4.c + src/mat5.c + src/nist.c + src/paf.c + src/pvf.c + src/raw.c + src/rx2.c + src/sd2.c + src/sds.c + src/svx.c + src/txw.c + src/voc.c + src/wve.c + src/w64.c + src/wavlike.h + src/wavlike.c + src/wav.c + src/xi.c + src/mpc2k.c + src/rf64.c + src/ogg_vorbis.c + src/ogg_speex.c + src/ogg_pcm.c + src/ogg_opus.c + src/ogg_vcomment.c + src/nms_adpcm.c + src/GSM610/config.h + src/GSM610/gsm.h + src/GSM610/gsm610_priv.h + src/GSM610/add.c + src/GSM610/code.c + src/GSM610/decode.c + src/GSM610/gsm_create.c + src/GSM610/gsm_decode.c + src/GSM610/gsm_destroy.c + src/GSM610/gsm_encode.c + src/GSM610/gsm_option.c + src/GSM610/long_term.c + src/GSM610/lpc.c + src/GSM610/preprocess.c + src/GSM610/rpe.c + src/GSM610/short_term.c + src/GSM610/table.c + src/G72x/g72x.h + src/G72x/g72x_priv.h + src/G72x/g721.c + src/G72x/g723_16.c + src/G72x/g723_24.c + src/G72x/g723_40.c + src/G72x/g72x.c + src/ALAC/ALACAudioTypes.h + src/ALAC/ALACBitUtilities.h + src/ALAC/EndianPortable.h + src/ALAC/aglib.h + src/ALAC/dplib.h + src/ALAC/matrixlib.h + src/ALAC/alac_codec.h + src/ALAC/shift.h + src/ALAC/ALACBitUtilities.c + src/ALAC/ag_dec.c + src/ALAC/ag_enc.c + src/ALAC/dp_dec.c + src/ALAC/dp_enc.c + src/ALAC/matrix_dec.c + src/ALAC/matrix_enc.c + src/ALAC/alac_decoder.c + src/ALAC/alac_encoder.c + ${sndfile_HDRS} + ${CMAKE_CURRENT_BINARY_DIR}/src/config.h + ) + +add_library (SndFile::sndfile ALIAS sndfile) + +target_include_directories (sndfile + PUBLIC + $ + $ + $ + PRIVATE + src + $ + ) +target_link_libraries (sndfile + PRIVATE + $<$:m> + $<$:Vorbis::vorbisenc> + $<$:FLAC::FLAC> + $<$,$,$>:Speex::Speex> + $<$:Opus::opus> + ) +set_target_properties (sndfile PROPERTIES + PUBLIC_HEADER "${sndfile_HDRS}" + ) + +if (ENABLE_COMPATIBLE_LIBSNDFILE_NAME) + if (MINGW OR CYGWIN) + set_target_properties (sndfile PROPERTIES + RUNTIME_OUTPUT_NAME "sndfile-1" + ) + else () + set_target_properties (sndfile PROPERTIES + RUNTIME_OUTPUT_NAME "libsndfile-1" + ) + endif () +endif () + +if (BUILD_SHARED_LIBS) + + if (WIN32) + set (VERSION_MAJOR ${CPACK_PACKAGE_VERSION_MAJOR}) + set (GEN_TOOL cmake) + + set (WIN_RC_VERSION "${CPACK_PACKAGE_VERSION_MAJOR},${CPACK_PACKAGE_VERSION_MINOR},${CPACK_PACKAGE_VERSION_PATCH}") + set (CLEAN_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") + set (PACKAGE_VERSION ${CPACK_PACKAGE_VERSION}) + + configure_file (src/version-metadata.rc.in src/version-metadata.rc @ONLY) + target_sources (sndfile PRIVATE ${PROJECT_BINARY_DIR}/src/version-metadata.rc) + endif () + + set_target_properties (sndfile PROPERTIES + SOVERSION ${PROJECT_VERSION_MAJOR} + VERSION ${PROJECT_VERSION} + ) + + # Symbol files generation + + if (WIN32) + set (SYMBOL_FILENAME "sndfile.def") + set (SYMBOL_OS "win32") + elseif ((CMAKE_SYSTEM_NAME MATCHES "Darwin") OR (CMAKE_SYSTEM_NAME MATCHES "Rhapsody")) + set (SYMBOL_FILENAME "Symbols.darwin") + set (SYMBOL_OS "darwin") + elseif (CMAKE_SYSTEM_NAME MATCHES "OS2") + set (SYMBOL_FILENAME "Symbols.os2") + set (SYMBOL_OS "os2") + elseif (UNIX) + set (SYMBOL_FILENAME "Symbols.gnu-binutils") + set (SYMBOL_OS "linux") + endif () + + if (DEFINED SYMBOL_OS) + add_custom_command ( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME} + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/src/create_symbols_file.py ${SYMBOL_OS} ${PROJECT_VERSION} > ${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME} + COMMENT "Generating ${SYMBOL_FILENAME}..." + ) + + add_custom_target (GENFILES DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME}) + if (SYMBOL_OS MATCHES "win32") + target_sources (sndfile + PRIVATE + ${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME} + ) + elseif (SYMBOL_OS MATCHES "darwin") + add_dependencies (sndfile GENFILES) + if (CMAKE_VERSION VERSION_LESS 3.13) + set_property (TARGET sndfile APPEND_STRING PROPERTY + LINK_FLAGS "-Wl,-exported_symbols_list -Wl,${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME}" + ) + else () + target_link_options (sndfile PRIVATE "LINKER:-exported_symbols_list,${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME}") + endif() + elseif (SYMBOL_OS MATCHES "os") + add_dependencies (sndfile GENFILES) + if (CMAKE_VERSION VERSION_LESS 3.13) + set_property (TARGET sndfile APPEND_STRING PROPERTY + LINK_FLAGS "-Wl,-export-symbols ${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME}" + ) + else () + target_link_options (sndfile PRIVATE "LINKER:-export-symbols ${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME}") + endif() + elseif (UNIX) + add_dependencies (sndfile GENFILES) + if (CMAKE_VERSION VERSION_LESS 3.13) + set_property (TARGET sndfile APPEND_STRING PROPERTY + LINK_FLAGS "-Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME}" + ) + else () + target_link_options (sndfile PRIVATE "LINKER:--version-script,${CMAKE_CURRENT_BINARY_DIR}/src/${SYMBOL_FILENAME}") + endif() + endif() + endif() + +endif () + +# +# Programs +# + +if (BUILD_PROGRAMS) + +# sndfile-info + + add_executable (sndfile-info + programs/sndfile-info.c + programs/common.c + programs/common.h + ) + target_link_libraries (sndfile-info + PRIVATE + sndfile + $<$:m> + ) + +# sndfile-play + + add_executable (sndfile-play + $<$>:programs/sndfile-play.c> + $<$>:programs/common.c> + $<$>:programs/sndfile-play.c> + $<$:programs/sndfile-play-beos.cpp> + ) + target_include_directories (sndfile-play + PRIVATE + src + ${CMAKE_CURRENT_BINARY_DIR}/src + ) + target_link_libraries (sndfile-play PRIVATE $<$:m>) + target_link_libraries (sndfile-play PRIVATE sndfile) + if (WIN32) + target_link_libraries(sndfile-play PRIVATE winmm) + # Maybe ALSA & Sndio are present in BeOS. They are not required + # so skip them anyway. + elseif ((NOT BEOS) AND ALSA_FOUND) + target_include_directories (sndfile-play PRIVATE ${ALSA_INCLUDE_DIRS}) + target_link_libraries (sndfile-play PRIVATE ${ALSA_LIBRARIES}) + elseif (CMAKE_SYSTEM_NAME STREQUAL "OpenBSD") + target_link_libraries (sndfile-play PRIVATE Sndio::Sndio) + endif () + +# sndfile-convert + + add_executable (sndfile-convert + programs/sndfile-convert.c + programs/common.c + programs/common.h + ) + target_link_libraries (sndfile-convert PRIVATE sndfile $<$:m>) + +# sndfile-cmp + + add_executable (sndfile-cmp + programs/sndfile-cmp.c + programs/common.c + programs/common.h + ) + target_include_directories (sndfile-cmp + PUBLIC + src + ${CMAKE_CURRENT_BINARY_DIR}/src + ${CMAKE_CURRENT_BINARY_DIR}/tests + ) + target_link_libraries (sndfile-cmp PRIVATE sndfile $<$:m>) + +# sndfile-metadata-set + + add_executable (sndfile-metadata-set + programs/sndfile-metadata-set.c + programs/common.c + programs/common.h + ) + target_include_directories (sndfile-metadata-set + PUBLIC + src + ${CMAKE_CURRENT_BINARY_DIR}/src + ${CMAKE_CURRENT_BINARY_DIR}/tests + ) + target_link_libraries (sndfile-metadata-set PRIVATE sndfile $<$:m>) + +# sndfile-metadata-get + + add_executable (sndfile-metadata-get + programs/sndfile-metadata-get.c + programs/common.c + programs/common.h + ) + target_include_directories (sndfile-metadata-get + PUBLIC + src + ${CMAKE_CURRENT_BINARY_DIR}/src + ${CMAKE_CURRENT_BINARY_DIR}/tests + ) + target_link_libraries (sndfile-metadata-get PRIVATE sndfile $<$:m>) + +# sndfile-interleave + + add_executable (sndfile-interleave + programs/sndfile-interleave.c + programs/common.c + programs/common.h + ) + target_link_libraries (sndfile-interleave PRIVATE sndfile $<$:m>) + +# sndfile-deinterleave + + add_executable (sndfile-deinterleave + programs/sndfile-deinterleave.c + programs/common.c + programs/common.h + ) + target_link_libraries (sndfile-deinterleave PRIVATE sndfile $<$:m>) + +# sndfile-concat + + add_executable (sndfile-concat + programs/sndfile-concat.c + programs/common.c + programs/common.h + ) + target_link_libraries (sndfile-concat PRIVATE sndfile $<$:m>) + +# sndfile-salvage + + add_executable (sndfile-salvage + programs/sndfile-salvage.c + programs/common.c + programs/common.h + ) + target_include_directories (sndfile-salvage + PUBLIC + src + ${CMAKE_CURRENT_BINARY_DIR}/src + ${CMAKE_CURRENT_BINARY_DIR}/tests + ) + target_link_libraries (sndfile-salvage PRIVATE sndfile $<$:m>) + + set (SNDFILE_PROGRAM_TARGETS + sndfile-info + sndfile-play + sndfile-convert + sndfile-cmp + sndfile-metadata-set + sndfile-metadata-get + sndfile-interleave + sndfile-deinterleave + sndfile-concat + sndfile-salvage + ) + + set_target_properties(${SNDFILE_PROGRAM_TARGETS} PROPERTIES FOLDER Programs) + +endif () + +# +# Examples +# + +if (BUILD_EXAMPLES) + +# sndfile-to-text + + add_executable (sndfile-to-text examples/sndfile-to-text.c) + target_link_libraries (sndfile-to-text PRIVATE sndfile) + +# sndfile-loopify + + add_executable (sndfile-loopify examples/sndfile-loopify.c) + target_link_libraries (sndfile-loopify PRIVATE sndfile) + +# make_sine + + add_executable (make_sine examples/make_sine.c) + target_link_libraries (make_sine + PRIVATE + sndfile + $<$:m> + ) + +# sfprocess + + add_executable (sfprocess examples/sfprocess.c) + target_link_libraries (sfprocess + PRIVATE + sndfile + $<$:m> + ) + +# list_formats + + add_executable (list_formats examples/list_formats.c) + target_link_libraries (list_formats + PRIVATE + sndfile + $<$:m> + ) + +# sndfilehandle + + add_executable (sndfilehandle examples/sndfilehandle.cc) + target_link_libraries (sndfilehandle PUBLIC sndfile) + + set (SNDFILE_EXAMPLE_TARGETS + sndfile-to-text + sndfile-loopify + make_sine + sfprocess + list_formats + sndfilehandle + ) + + set_target_properties(${SNDFILE_EXAMPLE_TARGETS} PROPERTIES FOLDER Examples) + + +endif () + +# +# sndfile-regtest +# + +if (BUILD_REGTEST) + + add_executable (sndfile-regtest + regtest/sndfile-regtest.c + regtest/database.c + regtest/checksum.c + ) + target_include_directories (sndfile-regtest + PUBLIC + src + ${CMAKE_CURRENT_BINARY_DIR}/src + ${CMAKE_CURRENT_BINARY_DIR}/tests + ) + target_link_libraries(sndfile-regtest + PRIVATE + sndfile + SQLite::SQLite3 + $<$:m> + ) + +endif () + +# +# Installation +# + +if (ENABLE_PACKAGE_CONFIG) + + if (WIN32 AND (NOT MINGW) AND (NOT CYGWIN)) + set (CMAKE_INSTALL_PACKAGEDIR cmake) + else () + set (CMAKE_INSTALL_PACKAGEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/SndFile) + endif() + + install (TARGETS ${SNDFILE_PROGRAM_TARGETS} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ) + + install (TARGETS sndfile + EXPORT SndFileTargets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + ) + + include (CMakePackageConfigHelpers) + + if (ENABLE_EXTERNAL_LIBS) + set (SndFile_WITH_EXTERNAL_LIBS 1) + else () + set (SndFile_WITH_EXTERNAL_LIBS 0) + endif () + + set (INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}) + configure_package_config_file(cmake/SndFileConfig.cmake.in SndFileConfig.cmake + INSTALL_DESTINATION ${CMAKE_INSTALL_PACKAGEDIR} + PATH_VARS INCLUDE_INSTALL_DIR + ) + write_basic_package_version_file (SndFileConfigVersion.cmake COMPATIBILITY SameMajorVersion) + + install(EXPORT SndFileTargets + NAMESPACE SndFile:: + DESTINATION ${CMAKE_INSTALL_PACKAGEDIR} + ) + install( + FILES + ${CMAKE_CURRENT_BINARY_DIR}/SndFileConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/SndFileConfigVersion.cmake + DESTINATION ${CMAKE_INSTALL_PACKAGEDIR} + ) + +else () + + install (TARGETS sndfile ${sdnfile_PROGRAMS} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + +endif () + +if (INSTALL_MANPAGES) + + set (man_MANS + man/sndfile-info.1 + man/sndfile-play.1 + man/sndfile-convert.1 + man/sndfile-cmp.1 + man/sndfile-metadata-get.1 + man/sndfile-concat.1 + man/sndfile-interleave.1 + man/sndfile-salvage.1 + ) + install (FILES ${man_MANS} DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) + install (FILES man/sndfile-metadata-get.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 RENAME sndfile-metadata-set.1) + install (FILES man/sndfile-interleave.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 RENAME sndfile-deinterleave.1) +endif () + +if (ENABLE_BOW_DOCS) + set (HTML_BGCOLOUR "white") + set (HTML_FGCOLOUR "black") +else () + set (HTML_BGCOLOUR "black") + set (HTML_FGCOLOUR "white") +endif () +set (dist_doc_DATA + docs/index.md + docs/libsndfile.jpg + docs/libsndfile.css + docs/print.css + docs/api.md + docs/command.md + docs/bugs.md + docs/formats.md + docs/sndfile_info.md + docs/new_file_type_howto.md + docs/win32.md + docs/FAQ.md + docs/lists.md + docs/embedded_files.md + docs/octave.md + docs/tutorial.md + ) +install (FILES ${dist_doc_DATA} DESTINATION ${CMAKE_INSTALL_DOCDIR}) + +if (INSTALL_PKGCONFIG_MODULE) + install (FILES ${CMAKE_CURRENT_BINARY_DIR}/sndfile.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) +endif () + +# +# Testing +# + +if (BUILD_TESTING) + + enable_testing () + + include (CMakeAutoGen) + + # generate tests sources from autogen templates + lsf_autogen (tests benchmark c) + lsf_autogen (tests floating_point_test c) + lsf_autogen (tests header_test c) + lsf_autogen (tests pcm_test c) + lsf_autogen (tests pipe_test c) + lsf_autogen (tests rdwr_test c) + lsf_autogen (tests scale_clip_test c) + lsf_autogen (tests utils c h) + lsf_autogen (tests write_read_test c) + lsf_autogen (src test_endswap c) + + # utils static library + add_library(test_utils STATIC tests/utils.c) + target_include_directories (test_utils + PUBLIC + src + ${CMAKE_CURRENT_BINARY_DIR}/src + ${CMAKE_CURRENT_BINARY_DIR}/tests + ) + target_link_libraries(test_utils PRIVATE sndfile) + + ### test_main + + add_executable (test_main + src/test_main.c + src/test_main.h + src/test_conversions.c + src/test_float.c + src/test_endswap.c + src/test_audio_detect.c + src/test_log_printf.c + src/test_file_io.c + src/test_ima_oki_adpcm.c + src/test_strncpy_crlf.c + src/test_broadcast_var.c + src/test_cart_var.c + src/test_binheader_writef.c + src/test_nms_adpcm.c + ) + target_include_directories (test_main + PUBLIC + src + ${CMAKE_CURRENT_BINARY_DIR}/src + ${CMAKE_CURRENT_BINARY_DIR}/tests + ) + target_link_libraries (test_main PRIVATE sndfile) + if (MSVC) + target_compile_definitions (test_main PRIVATE _USE_MATH_DEFINES) + endif () + add_test (test_main test_main) + + ### sfversion_test + + add_executable (sfversion tests/sfversion.c) + target_include_directories (sfversion + PRIVATE + src + ${CMAKE_CURRENT_BINARY_DIR}/src + ) + target_link_libraries (sfversion sndfile) + add_test (sfversion sfversion) + set_tests_properties (sfversion PROPERTIES + PASS_REGULAR_EXPRESSION "${PACKAGE_NAME}-${CPACK_PACKAGE_VERSION_FULL}" + ) + + ### error_test + + add_executable (error_test tests/error_test.c) + target_link_libraries (error_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + add_test (error_test error_test) + + ### ulaw_test + add_executable (ulaw_test tests/ulaw_test.c) + target_link_libraries (ulaw_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + add_test (ulaw_test ulaw_test) + + ### alaw_test + add_executable (alaw_test tests/alaw_test.c) + target_link_libraries (alaw_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + add_test (alaw_test alaw_test) + + ### dwvw_test + + add_executable (dwvw_test tests/dwvw_test.c) + target_link_libraries (dwvw_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + add_test (dwvw_test dwvw_test) + + ### command_test + + add_executable (command_test tests/command_test.c) + target_link_libraries (command_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + add_test (command_test command_test all) + + ### floating_point_test + + add_executable (floating_point_test + tests/dft_cmp.c + tests/floating_point_test.c + ) + target_link_libraries (floating_point_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + target_include_directories (floating_point_test PRIVATE tests) + add_test (floating_point_test floating_point_test) + + ### checksum_test + + add_executable (checksum_test tests/checksum_test.c) + target_link_libraries (checksum_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + add_test (checksum_test checksum_test) + + ### scale_clip_test + + add_executable (scale_clip_test tests/scale_clip_test.c) + target_link_libraries (scale_clip_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + add_test (scale_clip_test scale_clip_test) + + ### headerless_test + + add_executable (headerless_test tests/headerless_test.c) + target_link_libraries (headerless_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + add_test (headerless_test headerless_test) + + ### rdwr_test + + add_executable (rdwr_test tests/rdwr_test.c) + target_link_libraries (rdwr_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + add_test (rdwr_test rdwr_test) + + ### locale_test + + add_executable (locale_test tests/locale_test.c) + target_link_libraries (locale_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + add_test (locale_test locale_test) + + ### win32_ordinal_test + +# Disabled because we cannot test with shared sndfile library +# if (WIN32 AND BUILD_SHARED_LIBS) +# add_executable (win32_ordinal_test tests/win32_ordinal_test.c) +# target_link_libraries (win32_ordinal_test PRIVATE sndfile test_utils) +# add_test (win32_ordinal_test win32_ordinal_test) +# endif () + + ### cpp_test + + add_executable (cpp_test tests/cpp_test.cc) + target_link_libraries (cpp_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + add_test (cpp_test cpp_test) + + ### external_libs_test + + add_executable (external_libs_test tests/external_libs_test.c) + target_link_libraries (external_libs_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + add_test (external_libs_test external_libs_test) + + ### format_check_test + + add_executable (format_check_test tests/format_check_test.c) + target_link_libraries (format_check_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + add_test (format_check_test format_check_test) + + ### channel_test + + add_executable (channel_test tests/channel_test.c) + target_link_libraries (channel_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + add_test (channel_test channel_test) + + ### pcm_test + + add_executable (pcm_test tests/pcm_test.c) + target_link_libraries (pcm_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + add_test (pcm_test pcm_test) + + ### common test executables + + add_executable (write_read_test + tests/generate.c + tests/write_read_test.c + ) + target_link_libraries (write_read_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + target_include_directories (write_read_test PRIVATE tests) + + add_executable (lossy_comp_test tests/lossy_comp_test.c) + target_link_libraries (lossy_comp_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + + add_executable (peak_chunk_test tests/peak_chunk_test.c) + target_link_libraries (peak_chunk_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + + add_executable (header_test tests/header_test.c) + target_link_libraries (header_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + + add_executable (misc_test tests/misc_test.c) + target_link_libraries (misc_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + + add_executable (string_test tests/string_test.c) + target_link_libraries (string_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + + add_executable (multi_file_test tests/multi_file_test.c) + target_link_libraries (multi_file_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + + add_executable (aiff_rw_test tests/aiff_rw_test.c) + target_link_libraries (aiff_rw_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + + add_executable (chunk_test tests/chunk_test.c) + target_link_libraries (chunk_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + + add_executable (long_read_write_test tests/long_read_write_test.c) + target_link_libraries (long_read_write_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + + add_executable (raw_test tests/raw_test.c) + target_link_libraries (raw_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + + add_executable (compression_size_test tests/compression_size_test.c) + target_link_libraries (compression_size_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + + add_executable (ogg_test tests/ogg_test.c) + target_link_libraries (ogg_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + + add_executable (ogg_opus_test tests/ogg_opus_test.c) + target_link_libraries (ogg_opus_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + + add_executable (stdin_test tests/stdin_test.c) + target_link_libraries (stdin_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + set_target_properties (stdin_test PROPERTIES RUNTIME_OUTPUT_DIRECTORY "tests") + + add_executable (stdout_test tests/stdout_test.c) + target_link_libraries (stdout_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + set_target_properties (stdout_test PROPERTIES RUNTIME_OUTPUT_DIRECTORY "tests") + + add_executable (stdio_test tests/stdio_test.c) + target_link_libraries (stdio_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + + add_executable (pipe_test tests/pipe_test.c) + target_link_libraries (pipe_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + + add_executable (virtual_io_test tests/virtual_io_test.c) + target_link_libraries (virtual_io_test + PRIVATE + sndfile + test_utils + $<$:m> + ) + + ### g72x_test + + add_executable (g72x_test src/G72x/g72x_test.c) + target_include_directories (g72x_test + PRIVATE + src + ${CMAKE_CURRENT_BINARY_DIR}/src + ) + target_link_libraries (g72x_test + PRIVATE + sndfile + $<$:m> + ) + add_test (g72x_test g72x_test all) + + ### aiff-tests + + add_test (write_read_test_aiff write_read_test aiff) + add_test (lossy_comp_test_aiff_ulaw lossy_comp_test aiff_ulaw) + add_test (lossy_comp_test_aiff_alaw lossy_comp_test aiff_alaw) + add_test (lossy_comp_test_aiff_gsm610 lossy_comp_test aiff_gsm610) + add_test (peak_chunk_test_aiff peak_chunk_test aiff) + add_test (header_test_aiff header_test aiff) + add_test (misc_test_aiff misc_test aiff) + add_test (string_test_aiff string_test aiff) + add_test (multi_file_test_aiff multi_file_test aiff) + add_test (aiff_rw_test aiff_rw_test) + + ### au-tests + + add_test (write_read_test_au write_read_test au) + add_test (lossy_comp_test_au_ulaw lossy_comp_test au_ulaw) + add_test (lossy_comp_test_au_alaw lossy_comp_test au_alaw) + add_test (lossy_comp_test_au_g721 lossy_comp_test au_g721) + add_test (lossy_comp_test_au_g723 lossy_comp_test au_g723) + add_test (header_test_au header_test au) + add_test (misc_test_au misc_test au) + add_test (multi_file_test_au multi_file_test au) + + ### caf-tests + + add_test (write_read_test_caf write_read_test caf) + add_test (lossy_comp_test_caf_ulaw lossy_comp_test caf_ulaw) + add_test (lossy_comp_test_caf_alaw lossy_comp_test caf_alaw) + add_test (header_test_caf header_test caf) + add_test (peak_chunk_test_caf peak_chunk_test caf) + add_test (misc_test_caf misc_test caf) + add_test (chunk_test_caf chunk_test caf) + add_test (string_test_caf string_test caf) + add_test (long_read_write_test_alac long_read_write_test alac) + + # wav-tests + add_test (write_read_test_wav write_read_test wav) + add_test (lossy_comp_test_wav_pcm lossy_comp_test wav_pcm) + add_test (lossy_comp_test_wav_ima lossy_comp_test wav_ima) + add_test (lossy_comp_test_wav_msadpcm lossy_comp_test wav_msadpcm) + add_test (lossy_comp_test_wav_ulaw lossy_comp_test wav_ulaw) + add_test (lossy_comp_test_wav_alaw lossy_comp_test wav_alaw) + add_test (lossy_comp_test_wav_gsm610 lossy_comp_test wav_gsm610) + add_test (lossy_comp_test_wav_g721 lossy_comp_test wav_g721) + add_test (lossy_comp_test_wav_nmsadpcm lossy_comp_test wav_nmsadpcm) + add_test (peak_chunk_test_wav peak_chunk_test wav) + add_test (header_test_wav header_test wav) + add_test (misc_test_wav misc_test wav) + add_test (string_test_wav string_test wav) + add_test (multi_file_test_wav multi_file_test wav) + add_test (chunk_test_wav chunk_test wav) + + ### w64-tests + + add_test (write_read_test_w64 write_read_test w64) + add_test (lossy_comp_test_w64_ima lossy_comp_test w64_ima) + add_test (lossy_comp_test_w64_msadpcm lossy_comp_test w64_msadpcm) + add_test (lossy_comp_test_w64_ulaw lossy_comp_test w64_ulaw) + add_test (lossy_comp_test_w64_alaw lossy_comp_test w64_alaw) + add_test (lossy_comp_test_w64_gsm610 lossy_comp_test w64_gsm610) + add_test (header_test_w64 header_test w64) + add_test (misc_test_w64 misc_test w64) + + ### rf64-tests + + add_test (write_read_test_rf64 write_read_test rf64) + add_test (header_test_rf64 header_test rf64) + add_test (misc_test_rf64 misc_test rf64) + add_test (string_test_rf64 string_test rf64) + add_test (peak_chunk_test_rf64 peak_chunk_test rf64) + add_test (chunk_test_rf64 chunk_test rf64) + + ### raw-tests + add_test (write_read_test_raw write_read_test raw) + add_test (lossy_comp_test_raw_ulaw lossy_comp_test raw_ulaw) + add_test (lossy_comp_test_raw_alaw lossy_comp_test raw_alaw) + add_test (lossy_comp_test_raw_gsm610 lossy_comp_test raw_gsm610) + add_test (lossy_comp_test_vox_adpcm lossy_comp_test vox_adpcm) + add_test (raw_test raw_test) + + ### paf-tests + add_test (write_read_test_paf write_read_test paf) + add_test (header_test_paf header_test paf) + add_test (misc_test_paf misc_test paf) + + ### svx-tests + add_test (write_read_test_svx write_read_test svx) + add_test (header_test_svx header_test svx) + add_test (misc_test_svx misc_test svx) + + ### nist-tests + add_test (write_read_test_nist write_read_test nist) + add_test (lossy_comp_test_nist_ulaw lossy_comp_test nist_ulaw) + add_test (lossy_comp_test_nist_alaw lossy_comp_test nist_alaw) + add_test (header_test_nist header_test nist) + add_test (misc_test_nist misc_test nist) + + ### ircam-tests + add_test (write_read_test_ircam write_read_test ircam) + add_test (lossy_comp_test_ircam_ulaw lossy_comp_test ircam_ulaw) + add_test (lossy_comp_test_ircam_alaw lossy_comp_test ircam_alaw) + add_test (header_test_ircam header_test ircam) + add_test (misc_test_ircam misc_test ircam) + + ### voc-tests + add_test (write_read_test_voc write_read_test voc) + add_test (lossy_comp_test_voc_ulaw lossy_comp_test voc_ulaw) + add_test (lossy_comp_test_voc_alaw lossy_comp_test voc_alaw) + add_test (header_test_voc header_test voc) + add_test (misc_test_voc misc_test voc) + + ### mat4-tests + add_test (write_read_test_mat4 write_read_test mat4) + add_test (header_test_mat4 header_test mat4) + add_test (misc_test_mat4 misc_test mat4) + + ### mat5-tests + add_test (write_read_test_mat5 write_read_test mat5) + add_test (header_test_mat5 header_test mat5) + add_test (misc_test_mat5 misc_test mat5) + + ### pvf-tests + add_test (write_read_test_pvf write_read_test pvf) + add_test (header_test_pvf header_test pvf) + add_test (misc_test_pvf misc_test pvf) + + ### xi-tests + add_test (lossy_comp_test_xi_dpcm lossy_comp_test xi_dpcm) + + ### htk-tests + add_test (write_read_test_htk write_read_test htk) + add_test (header_test_htk header_test htk) + add_test (misc_test_htk misc_test htk) + + ### avr-tests + add_test (write_read_test_avr write_read_test avr) + add_test (header_test_avr header_test avr) + add_test (misc_test_avr misc_test avr) + + ### sds-tests + add_test (write_read_test_sds write_read_test sds) + add_test (header_test_sds header_test sds) + add_test (misc_test_sds misc_test sds) + + # sd2-tests + add_test (write_read_test_sd2 write_read_test sd2) + + ### wve-tests + add_test (lossy_comp_test_wve lossy_comp_test wve) + + ### mpc2k-tests + add_test (write_read_test_mpc2k write_read_test mpc2k) + add_test (header_test_mpc2k header_test mpc2k) + add_test (misc_test_mpc2k misc_test mpc2k) + + ### flac-tests + add_test (write_read_test_flac write_read_test flac) + add_test (compression_size_test_flac compression_size_test flac) + add_test (string_test_flac string_test flac) + + ### vorbis-tests + add_test (ogg_test ogg_test) + add_test (compression_size_test_vorbis compression_size_test vorbis) + add_test (lossy_comp_test_ogg_vorbis lossy_comp_test ogg_vorbis) + add_test (string_test_ogg string_test ogg) + add_test (misc_test_ogg misc_test ogg) + + ### opus-tests ### + add_test (ogg_opus_test ogg_opus_test) + add_test (compression_size_test_opus compression_size_test opus) + add_test (lossy_comp_test_ogg_opus lossy_comp_test ogg_opus) + add_test (string_test_opus string_test opus) + + ### io-tests + add_test (stdio_test stdio_test) + add_test (pipe_test pipe_test) + add_test (virtual_io_test virtual_io_test) + + set (SNDFILE_TEST_TARGETS + test_utils + test_main + sfversion + error_test + ulaw_test + alaw_test + dwvw_test + command_test + floating_point_test + checksum_test + scale_clip_test + headerless_test + rdwr_test + locale_test + cpp_test + external_libs_test + format_check_test + channel_test + pcm_test + write_read_test + lossy_comp_test + peak_chunk_test + header_test + misc_test + string_test + multi_file_test + aiff_rw_test + chunk_test + long_read_write_test + raw_test + compression_size_test + ogg_test + stdin_test + stdout_test + stdio_test + pipe_test + virtual_io_test + g72x_test + ) + +# if (WIN32 AND BUILD_SHARED_LIBS) +# list (APPEND SNDFILE_TEST_TARGETS win32_ordinal_test) +# endif () + + set_target_properties(${SNDFILE_TEST_TARGETS} PROPERTIES FOLDER Tests) + +endif () + +if (ENABLE_CPACK) + include (CPack) +endif () diff --git a/libsndfile-1.0.31/COPYING b/libsndfile-1.0.31/COPYING new file mode 100644 index 0000000..c396169 --- /dev/null +++ b/libsndfile-1.0.31/COPYING @@ -0,0 +1,503 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + diff --git a/libsndfile-1.0.31/ChangeLog b/libsndfile-1.0.31/ChangeLog new file mode 100644 index 0000000..3843688 --- /dev/null +++ b/libsndfile-1.0.31/ChangeLog @@ -0,0 +1,3 @@ +For changes, please see the git commit history on github: + + https://github.com/libsndfile/libsndfile/commits/master diff --git a/libsndfile-1.0.31/Makefile.am b/libsndfile-1.0.31/Makefile.am new file mode 100644 index 0000000..0b8bfa1 --- /dev/null +++ b/libsndfile-1.0.31/Makefile.am @@ -0,0 +1,535 @@ +## Process this file with automake to produce Makefile.in + +AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/include -I$(top_builddir)/include $(OS_SPECIFIC_CFLAGS) + +DISTCHECK_CONFIGURE_FLAGS = --enable-werror + +CLEANFILES = programs/*.wav octave-workspace + +if FULL_SUITE +if BUILD_OCTAVE_MOD +SUBDIRS = Octave +endif +endif + +EXTRA_DIST = libsndfile.spec.in sndfile.pc.in Scripts/android-configure.sh \ + Scripts/linux-to-win-cross-configure.sh \ + CMakeLists.txt $(cmake_files) Win32 + +cmake_files = cmake/ClipMode.cmake cmake/FindFLAC.cmake \ + cmake/CMakeAutoGen.cmake cmake/CMakeAutoGenScript.cmake \ + cmake/FindOgg.cmake cmake/FindVorbis.cmake cmake/FindSndio.cmake \ + cmake/FindSpeex.cmake cmake/sqlite/FindSQLite3.cmake \ + cmake/SndFileChecks.cmake cmake/TestInline.cmake \ + cmake/TestLargeFiles.cmake cmake/TestInline.c.in \ + cmake/FindOpus.cmake cmake/SndFileConfig.cmake.in \ + cmake/CheckCPUArch.cmake cmake/CheckCPUArch.c.in + +pkgconfig_DATA = sndfile.pc + +noinst_PROGRAMS = + +#=============================================================================== + +test: check + +# Need this target to force building of test programs. +checkprograms: $(check_PROGRAMS) + +######## +# src/ # +######## + +BUILT_SOURCES = src/test_endswap.c + +SYMBOL_FILES = src/Symbols.gnu-binutils src/Symbols.darwin src/libsndfile-1.def src/Symbols.os2 src/Symbols.static + +EXTRA_DIST += include/sndfile.h.in src/config.h.in src/test_endswap.tpl src/test_endswap.def \ + $(SYMBOL_FILES) src/create_symbols_file.py src/binheader_writef_check.py \ + src/GSM610/README src/GSM610/COPYRIGHT src/GSM610/ChangeLog \ + src/G72x/README src/G72x/README.original src/G72x/ChangeLog \ + src/make-static-lib-hidden-privates.sh \ + src/config.h.cmake + +if USE_WIN_VERSION_FILE +WIN_VERSION_FILE = src/version-metadata.rc +else +WIN_VERSION_FILE = +endif + +#=============================================================================== + +lib_LTLIBRARIES = src/libsndfile.la +include_HEADERS = include/sndfile.hh +nodist_include_HEADERS = include/sndfile.h +src_libsndfile_la_CFLAGS = $(EXTERNAL_XIPH_CFLAGS) +# MinGW requires -no-undefined if a DLL is to be built. +src_libsndfile_la_LDFLAGS = -no-undefined -version-info $(SHARED_VERSION_INFO) $(SHLIB_VERSION_ARG) +src_libsndfile_la_SOURCES = src/sndfile.c src/aiff.c src/au.c src/avr.c src/caf.c src/dwd.c src/flac.c src/g72x.c src/htk.c src/ircam.c \ + src/macos.c src/mat4.c src/mat5.c src/nist.c src/paf.c src/pvf.c src/raw.c src/rx2.c src/sd2.c \ + src/sds.c src/svx.c src/txw.c src/voc.c src/wve.c src/w64.c src/wavlike.c src/wav.c src/xi.c src/mpc2k.c src/rf64.c \ + src/ogg_vorbis.c src/ogg_speex.c src/ogg_pcm.c src/ogg_opus.c src/ogg_vcomment.c \ + src/common.h src/sfconfig.h src/sfendian.h src/wavlike.h src/sf_unistd.h src/ogg.h src/chanmap.h src/ogg_vcomment.h +nodist_src_libsndfile_la_SOURCES = $(nodist_include_HEADERS) +src_libsndfile_la_LIBADD = src/GSM610/libgsm.la src/G72x/libg72x.la src/ALAC/libalac.la \ + src/libcommon.la $(EXTERNAL_XIPH_LIBS) -lm +EXTRA_src_libsndfile_la_DEPENDENCIES = $(SYMBOL_FILES) + +noinst_LTLIBRARIES = src/libcommon.la +src_libcommon_la_CFLAGS = $(EXTERNAL_XIPH_CFLAGS) +src_libcommon_la_SOURCES = src/common.c src/file_io.c src/command.c src/pcm.c src/ulaw.c src/alaw.c \ + src/float32.c src/double64.c src/ima_adpcm.c src/ms_adpcm.c src/gsm610.c src/dwvw.c src/vox_adpcm.c \ + src/interleave.c src/strings.c src/dither.c src/cart.c src/broadcast.c src/audio_detect.c \ + src/ima_oki_adpcm.c src/ima_oki_adpcm.h src/alac.c src/chunk.c src/ogg.c src/chanmap.c \ + src/windows.c src/id3.c src/nms_adpcm.c $(WIN_VERSION_FILE) + +check_PROGRAMS = src/test_main +src_test_main_SOURCES = src/test_main.c src/test_main.h src/test_conversions.c src/test_float.c src/test_endswap.c \ + src/test_audio_detect.c src/test_log_printf.c src/test_file_io.c src/test_ima_oki_adpcm.c \ + src/test_strncpy_crlf.c src/test_broadcast_var.c src/test_cart_var.c \ + src/test_binheader_writef.c src/test_nms_adpcm.c +src_test_main_LDADD = src/libcommon.la + +############## +# src/GSM610 # +############## + +noinst_LTLIBRARIES += src/GSM610/libgsm.la +src_GSM610_libgsm_la_SOURCES = src/GSM610/config.h src/GSM610/gsm.h src/GSM610/gsm610_priv.h \ + src/GSM610/add.c src/GSM610/code.c src/GSM610/decode.c src/GSM610/gsm_create.c \ + src/GSM610/gsm_decode.c src/GSM610/gsm_destroy.c src/GSM610/gsm_encode.c \ + src/GSM610/gsm_option.c src/GSM610/long_term.c src/GSM610/lpc.c src/GSM610/preprocess.c \ + src/GSM610/rpe.c src/GSM610/short_term.c src/GSM610/table.c + +############ +# src/G72x # +############ + +noinst_LTLIBRARIES += src/G72x/libg72x.la +src_G72x_libg72x_la_SOURCES = src/G72x/g72x.h src/G72x/g72x_priv.h \ + src/G72x/g721.c src/G72x/g723_16.c src/G72x/g723_24.c src/G72x/g723_40.c src/G72x/g72x.c + +check_PROGRAMS += src/G72x/g72x_test +src_G72x_g72x_test_SOURCES = src/G72x/g72x_test.c +src_G72x_g72x_test_LDADD = src/G72x/libg72x.la + +############ +# src/ALAC # +############ + +noinst_LTLIBRARIES += src/ALAC/libalac.la +src_ALAC_libalac_la_SOURCES = src/ALAC/ALACAudioTypes.h src/ALAC/ALACBitUtilities.h \ + src/ALAC/EndianPortable.h src/ALAC/aglib.h src/ALAC/dplib.h src/ALAC/matrixlib.h \ + src/ALAC/alac_codec.h src/ALAC/shift.h \ + src/ALAC/ALACBitUtilities.c src/ALAC/ag_dec.c \ + src/ALAC/ag_enc.c src/ALAC/dp_dec.c src/ALAC/dp_enc.c src/ALAC/matrix_dec.c \ + src/ALAC/matrix_enc.c src/ALAC/alac_decoder.c src/ALAC/alac_encoder.c + +#=============================================================================== +# Generate an OS specific Symbols files. This is done when the author +# builds the distribution tarball. There should be not need for the +# end user to create these files. + +# "$<" cannot portably be used in the recipe across Make implementations +# https://www.gnu.org/software/autoconf/manual/autoconf.html#g_t_0024_003c-in-Ordinary-Make-Rules +SYMBOL_SCRIPT = $(top_srcdir)/src/create_symbols_file.py + +src/Symbols.gnu-binutils: $(SYMBOL_SCRIPT) + $(PYTHON) $(SYMBOL_SCRIPT) linux $(VERSION) > $(top_srcdir)/$@ + +src/Symbols.darwin: $(SYMBOL_SCRIPT) + $(PYTHON) $(SYMBOL_SCRIPT) darwin $(VERSION) > $(top_srcdir)/$@ + +src/libsndfile-1.def: $(SYMBOL_SCRIPT) + $(PYTHON) $(SYMBOL_SCRIPT) win32 $(VERSION) > $(top_srcdir)/$@ + +src/Symbols.os2: $(SYMBOL_SCRIPT) + $(PYTHON) $(SYMBOL_SCRIPT) os2 $(VERSION) > $(top_srcdir)/$@ + +src/Symbols.static: $(SYMBOL_SCRIPT) + $(PYTHON) $(SYMBOL_SCRIPT) static $(VERSION) > $(top_srcdir)/$@ + +#=============================================================================== +# Building windows resource files (if needed). + +.rc.lo: + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --tag=RC --mode=compile $(RC) $(RCFLAGS) $< -o $@ + +#=============================================================================== +# Disable autoheader. +AUTOHEADER=echo + +######## +# docs/ # +######## + +if FULL_SUITE +dist_doc_DATA = docs/index.md docs/libsndfile.jpg docs/libsndfile.css docs/print.css docs/api.md \ + docs/command.md docs/bugs.md docs/formats.md docs/sndfile_info.md docs/new_file_type_howto.md \ + docs/win32.md docs/FAQ.md docs/lists.md docs/embedded_files.md docs/octave.md \ + docs/tutorial.md +endif + +############# +# examples/ # +############# + +check_PROGRAMS += examples/make_sine examples/sfprocess examples/list_formats examples/generate examples/sndfilehandle \ + examples/sndfile-to-text examples/sndfile-loopify + +examples_sndfile_to_text_SOURCES = examples/sndfile-to-text.c +examples_sndfile_to_text_LDADD = src/libsndfile.la + +examples_sndfile_loopify_SOURCES = examples/sndfile-loopify.c +examples_sndfile_loopify_LDADD = src/libsndfile.la + +examples_make_sine_SOURCES = examples/make_sine.c +examples_make_sine_LDADD = src/libsndfile.la + +examples_sfprocess_SOURCES = examples/sfprocess.c +examples_sfprocess_LDADD = src/libsndfile.la + +examples_list_formats_SOURCES = examples/list_formats.c +examples_list_formats_LDADD = src/libsndfile.la + +examples_generate_SOURCES = examples/generate.c +examples_generate_LDADD = src/libsndfile.la + +examples_sndfilehandle_SOURCES = examples/sndfilehandle.cc +examples_sndfilehandle_LDADD = src/libsndfile.la + +########## +# tests/ # +########## + +TESTS_ENVIRONMENT = $(SHELL) tests/test_wrapper.sh + +if ENABLE_TEST_COVERAGE +CPP_TEST = +else +CPP_TEST = tests/cpp_test +endif + +TESTS = tests/pedantic-header-test.sh + +check_PROGRAMS += tests/sfversion tests/floating_point_test tests/write_read_test \ + tests/lossy_comp_test tests/error_test tests/ulaw_test tests/alaw_test tests/dwvw_test \ + tests/peak_chunk_test tests/command_test tests/stdio_test \ + tests/pcm_test tests/headerless_test tests/pipe_test tests/header_test tests/misc_test \ + tests/raw_test tests/string_test tests/multi_file_test tests/chunk_test \ + tests/scale_clip_test tests/win32_test tests/aiff_rw_test tests/virtual_io_test \ + tests/locale_test tests/win32_ordinal_test tests/ogg_test tests/compression_size_test \ + tests/checksum_test tests/external_libs_test tests/rdwr_test tests/format_check_test $(CPP_TEST) \ + tests/channel_test tests/long_read_write_test tests/stdin_test tests/stdout_test \ + tests/dither_test tests/fix_this tests/largefile_test tests/benchmark tests/ogg_opus_test + +BUILT_SOURCES += \ + tests/write_read_test.c \ + tests/pcm_test.c \ + tests/header_test.c \ + tests/utils.c \ + tests/scale_clip_test.c \ + tests/pipe_test.c \ + tests/rdwr_test.c \ + tests/floating_point_test.c \ + tests/benchmark.c + +EXTRA_DIST += $(BUILT_SOURCES) \ + tests/write_read_test.tpl tests/write_read_test.def \ + tests/pcm_test.tpl tests/pcm_test.def \ + tests/header_test.tpl tests/header_test.def \ + tests/utils.tpl tests/utils.def \ + tests/scale_clip_test.tpl tests/scale_clip_test.def \ + tests/pipe_test.tpl tests/pipe_test.def \ + tests/rdwr_test.tpl tests/rdwr_test.def \ + tests/floating_point_test.tpl tests/floating_point_test.def \ + tests/benchmark.tpl tests/benchmark.def + +# If we're cross compiling from Linux to Windows and running the test suite +# under Wine, we need a symbolic link to the generated libsndfile DLL. + +if LINUX_MINGW_CROSS_TEST + +$(check_PROGRAMS) : libsndfile-1.dll + +libsndfile-1.dll : + $(LN_S) src/.libs/$@ $@ + +clean-local : + -rm -f libsndfile-1.dll + +endif + +#=============================================================================== + +tests_sfversion_SOURCES = tests/sfversion.c +tests_sfversion_LDADD = src/libsndfile.la + +tests_write_read_test_SOURCES = tests/utils.c tests/generate.c tests/generate.h tests/write_read_test.c tests/utils.h +tests_write_read_test_LDADD = src/libsndfile.la + +tests_lossy_comp_test_SOURCES = tests/utils.c tests/lossy_comp_test.c tests/utils.h +tests_lossy_comp_test_LDADD = src/libsndfile.la + +tests_fix_this_SOURCES = tests/utils.c tests/fix_this.c tests/utils.h +tests_fix_this_LDADD = src/libsndfile.la + +tests_error_test_SOURCES = tests/error_test.c tests/utils.c tests/utils.h +tests_error_test_LDADD = src/libsndfile.la + +tests_ulaw_test_SOURCES = tests/utils.c tests/ulaw_test.c tests/utils.h +tests_ulaw_test_LDADD = src/libsndfile.la + +tests_alaw_test_SOURCES = tests/utils.c tests/alaw_test.c tests/utils.h +tests_alaw_test_LDADD = src/libsndfile.la + +tests_aiff_rw_test_SOURCES = tests/utils.c tests/aiff_rw_test.c tests/utils.h +tests_aiff_rw_test_LDADD = src/libsndfile.la + +tests_command_test_SOURCES = tests/command_test.c tests/utils.c tests/utils.h +tests_command_test_LDADD = src/libsndfile.la + +tests_locale_test_SOURCES = tests/locale_test.c tests/utils.c tests/utils.h +tests_locale_test_LDADD = src/libsndfile.la + +tests_largefile_test_SOURCES = tests/largefile_test.c tests/utils.c tests/utils.h +tests_largefile_test_LDADD = src/libsndfile.la + +tests_pcm_test_SOURCES = tests/pcm_test.c tests/utils.c tests/utils.h +tests_pcm_test_LDADD = src/libsndfile.la + +tests_headerless_test_SOURCES = tests/utils.c tests/headerless_test.c tests/utils.h +tests_headerless_test_LDADD = src/libsndfile.la + +tests_stdin_test_SOURCES = tests/stdin_test.c tests/utils.c tests/utils.h +tests_stdin_test_LDADD = src/libsndfile.la + +tests_stdout_test_SOURCES = tests/stdout_test.c tests/utils.h +tests_stdout_test_LDADD = src/libsndfile.la + +tests_stdio_test_SOURCES = tests/stdio_test.c tests/utils.c tests/utils.h +tests_stdio_test_LDADD = src/libsndfile.la + +tests_pipe_test_SOURCES = tests/pipe_test.c tests/utils.c tests/utils.h +tests_pipe_test_LDADD = src/libsndfile.la + +tests_benchmark_SOURCES = tests/benchmark.c tests/utils.h +tests_benchmark_LDADD = src/libsndfile.la + +tests_header_test_SOURCES = tests/header_test.c tests/utils.c tests/utils.h +tests_header_test_LDADD = src/libsndfile.la + +tests_misc_test_SOURCES = tests/misc_test.c tests/utils.c tests/utils.h +tests_misc_test_LDADD = src/libsndfile.la + +tests_raw_test_SOURCES = tests/raw_test.c tests/utils.c tests/utils.h +tests_raw_test_LDADD = src/libsndfile.la + +tests_string_test_SOURCES = tests/string_test.c tests/utils.c tests/utils.h +tests_string_test_LDADD = src/libsndfile.la + +tests_dither_test_SOURCES = tests/dither_test.c tests/utils.c tests/utils.h +tests_dither_test_LDADD = src/libsndfile.la + +tests_chunk_test_SOURCES = tests/chunk_test.c tests/utils.c tests/utils.h +tests_chunk_test_LDADD = src/libsndfile.la + +tests_multi_file_test_SOURCES = tests/multi_file_test.c tests/utils.c tests/utils.h +tests_multi_file_test_LDADD = src/libsndfile.la + +tests_virtual_io_test_SOURCES = tests/virtual_io_test.c tests/utils.c tests/utils.h +tests_virtual_io_test_LDADD = src/libsndfile.la + +tests_ogg_test_SOURCES = tests/ogg_test.c tests/utils.c tests/utils.h +tests_ogg_test_LDADD = src/libsndfile.la + +tests_ogg_opus_test_SOURCES = tests/ogg_opus_test.c tests/utils.c tests/utils.h +tests_ogg_opus_test_LDADD = src/libsndfile.la + +tests_compression_size_test_SOURCES = tests/compression_size_test.c tests/utils.c tests/utils.h tests/dft_cmp.h +tests_compression_size_test_LDADD = src/libsndfile.la + +tests_rdwr_test_SOURCES = tests/rdwr_test.c tests/utils.c tests/utils.h +tests_rdwr_test_LDADD = src/libsndfile.la + +tests_win32_test_SOURCES = tests/win32_test.c +# Link lib here so that generating the testsuite tarball works correctly. +tests_win32_test_LDADD = src/libsndfile.la + +tests_win32_ordinal_test_SOURCES = tests/win32_ordinal_test.c tests/utils.c tests/utils.h +tests_win32_ordinal_test_LDADD = src/libsndfile.la + +tests_external_libs_test_SOURCES = tests/external_libs_test.c tests/utils.c tests/utils.h +tests_external_libs_test_LDADD = src/libsndfile.la + +tests_format_check_test_SOURCES = tests/format_check_test.c tests/utils.c tests/utils.h +tests_format_check_test_LDADD = src/libsndfile.la + +tests_channel_test_SOURCES = tests/channel_test.c tests/utils.c tests/utils.h +tests_channel_test_LDADD = src/libsndfile.la + +tests_long_read_write_test_SOURCES = tests/long_read_write_test.c tests/utils.c tests/utils.h tests/dft_cmp.h +tests_long_read_write_test_LDADD = src/libsndfile.la + +tests_cpp_test_SOURCES = tests/cpp_test.cc tests/utils.c tests/utils.h +tests_cpp_test_LDADD = src/libsndfile.la + +tests_checksum_test_SOURCES = tests/checksum_test.c tests/utils.c tests/utils.h +tests_checksum_test_LDADD = src/libsndfile.la + +# Lite remove start +tests_dwvw_test_SOURCES = tests/dwvw_test.c tests/utils.c tests/utils.h +tests_dwvw_test_LDADD = src/libsndfile.la + +tests_floating_point_test_SOURCES = tests/utils.c tests/utils.h tests/dft_cmp.c tests/dft_cmp.h tests/floating_point_test.c +tests_floating_point_test_LDADD = src/libsndfile.la + +tests_peak_chunk_test_SOURCES = tests/peak_chunk_test.c tests/utils.c tests/utils.h +tests_peak_chunk_test_LDADD = src/libsndfile.la + +tests_scale_clip_test_SOURCES = tests/scale_clip_test.c tests/utils.c tests/utils.h +tests_scale_clip_test_LDADD = src/libsndfile.la +# Lite remove end + +#=============================================================================== +# Autogen generated sources. +# Coerce the multiple inputs -> multiple outputs problem +# into suffix rules by "linearising" the dependency graph. +# Yes, this sucks, but GNU make patterns aren't portable, +# see also https://github.com/libsndfile/libsndfile/issues/369 + +SUFFIXES = .tpl .def + +.tpl.def: + touch $@ + +# unconditionally running touch on the .def +# files is necessary to keep all timestamps +# consistent, in order to prevent stale files +# from calling autogen in tarball releases. +.def.c: + $(MAKE) $(AM_MAKEFLAGS) $< + cd $(top_srcdir)/$(@D) && autogen --writable $(&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = $(am__EXEEXT_3) +check_PROGRAMS = src/test_main$(EXEEXT) src/G72x/g72x_test$(EXEEXT) \ + examples/make_sine$(EXEEXT) examples/sfprocess$(EXEEXT) \ + examples/list_formats$(EXEEXT) examples/generate$(EXEEXT) \ + examples/sndfilehandle$(EXEEXT) \ + examples/sndfile-to-text$(EXEEXT) \ + examples/sndfile-loopify$(EXEEXT) tests/sfversion$(EXEEXT) \ + tests/floating_point_test$(EXEEXT) \ + tests/write_read_test$(EXEEXT) tests/lossy_comp_test$(EXEEXT) \ + tests/error_test$(EXEEXT) tests/ulaw_test$(EXEEXT) \ + tests/alaw_test$(EXEEXT) tests/dwvw_test$(EXEEXT) \ + tests/peak_chunk_test$(EXEEXT) tests/command_test$(EXEEXT) \ + tests/stdio_test$(EXEEXT) tests/pcm_test$(EXEEXT) \ + tests/headerless_test$(EXEEXT) tests/pipe_test$(EXEEXT) \ + tests/header_test$(EXEEXT) tests/misc_test$(EXEEXT) \ + tests/raw_test$(EXEEXT) tests/string_test$(EXEEXT) \ + tests/multi_file_test$(EXEEXT) tests/chunk_test$(EXEEXT) \ + tests/scale_clip_test$(EXEEXT) tests/win32_test$(EXEEXT) \ + tests/aiff_rw_test$(EXEEXT) tests/virtual_io_test$(EXEEXT) \ + tests/locale_test$(EXEEXT) tests/win32_ordinal_test$(EXEEXT) \ + tests/ogg_test$(EXEEXT) tests/compression_size_test$(EXEEXT) \ + tests/checksum_test$(EXEEXT) tests/external_libs_test$(EXEEXT) \ + tests/rdwr_test$(EXEEXT) tests/format_check_test$(EXEEXT) \ + $(am__EXEEXT_1) tests/channel_test$(EXEEXT) \ + tests/long_read_write_test$(EXEEXT) tests/stdin_test$(EXEEXT) \ + tests/stdout_test$(EXEEXT) tests/dither_test$(EXEEXT) \ + tests/fix_this$(EXEEXT) tests/largefile_test$(EXEEXT) \ + tests/benchmark$(EXEEXT) tests/ogg_opus_test$(EXEEXT) \ + programs/sndfile-metadata-set$(EXEEXT) \ + programs/sndfile-metadata-get$(EXEEXT) $(am__EXEEXT_2) +@FULL_SUITE_TRUE@@USE_OSSFUZZERS_TRUE@am__append_1 = \ +@FULL_SUITE_TRUE@@USE_OSSFUZZERS_TRUE@ ossfuzz/sndfile_fuzzer + +@FULL_SUITE_TRUE@@USE_OSSFUZZERS_TRUE@am__append_2 = \ +@FULL_SUITE_TRUE@@USE_OSSFUZZERS_TRUE@ ossfuzz/libstandaloneengine.la + +@FULL_SUITE_TRUE@bin_PROGRAMS = programs/sndfile-info$(EXEEXT) \ +@FULL_SUITE_TRUE@ programs/sndfile-play$(EXEEXT) \ +@FULL_SUITE_TRUE@ programs/sndfile-convert$(EXEEXT) \ +@FULL_SUITE_TRUE@ programs/sndfile-cmp$(EXEEXT) \ +@FULL_SUITE_TRUE@ programs/sndfile-metadata-set$(EXEEXT) \ +@FULL_SUITE_TRUE@ programs/sndfile-metadata-get$(EXEEXT) \ +@FULL_SUITE_TRUE@ programs/sndfile-interleave$(EXEEXT) \ +@FULL_SUITE_TRUE@ programs/sndfile-deinterleave$(EXEEXT) \ +@FULL_SUITE_TRUE@ programs/sndfile-concat$(EXEEXT) \ +@FULL_SUITE_TRUE@ programs/sndfile-salvage$(EXEEXT) + +############ +# regtest/ # +############ +@HAVE_SQLITE3_TRUE@am__append_3 = regtest/sndfile-regtest +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_add_fortify_source.m4 \ + $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_append_link_flags.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_check_link_flag.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_compiler_version.m4 \ + $(top_srcdir)/m4/ax_recursive_eval.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/clip_mode.m4 $(top_srcdir)/m4/extra_pkg.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/mkoctfile_version.m4 \ + $(top_srcdir)/m4/octave.m4 $(top_srcdir)/m4/stack_protect.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__dist_doc_DATA_DIST) \ + $(include_HEADERS) $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = src/version-metadata.rc include/sndfile.h \ + tests/test_wrapper.sh tests/pedantic-header-test.sh \ + libsndfile.spec sndfile.pc Scripts/build-test-tarball.mk +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" \ + "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(docdir)" \ + "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)" \ + "$(DESTDIR)$(includedir)" +@ENABLE_TEST_COVERAGE_FALSE@am__EXEEXT_1 = tests/cpp_test$(EXEEXT) +@HAVE_SQLITE3_TRUE@am__EXEEXT_2 = regtest/sndfile-regtest$(EXEEXT) +@FULL_SUITE_TRUE@@USE_OSSFUZZERS_TRUE@am__EXEEXT_3 = ossfuzz/sndfile_fuzzer$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) +ossfuzz_libstandaloneengine_la_LIBADD = +am__ossfuzz_libstandaloneengine_la_SOURCES_DIST = \ + ossfuzz/standaloneengine.cc ossfuzz/testinput.h +am__dirstamp = $(am__leading_dot)dirstamp +@FULL_SUITE_TRUE@am_ossfuzz_libstandaloneengine_la_OBJECTS = ossfuzz/libstandaloneengine_la-standaloneengine.lo +ossfuzz_libstandaloneengine_la_OBJECTS = \ + $(am_ossfuzz_libstandaloneengine_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +ossfuzz_libstandaloneengine_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(ossfuzz_libstandaloneengine_la_CXXFLAGS) $(CXXFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +@FULL_SUITE_TRUE@@USE_OSSFUZZERS_TRUE@am_ossfuzz_libstandaloneengine_la_rpath = +src_ALAC_libalac_la_LIBADD = +am_src_ALAC_libalac_la_OBJECTS = src/ALAC/ALACBitUtilities.lo \ + src/ALAC/ag_dec.lo src/ALAC/ag_enc.lo src/ALAC/dp_dec.lo \ + src/ALAC/dp_enc.lo src/ALAC/matrix_dec.lo \ + src/ALAC/matrix_enc.lo src/ALAC/alac_decoder.lo \ + src/ALAC/alac_encoder.lo +src_ALAC_libalac_la_OBJECTS = $(am_src_ALAC_libalac_la_OBJECTS) +src_G72x_libg72x_la_LIBADD = +am_src_G72x_libg72x_la_OBJECTS = src/G72x/g721.lo src/G72x/g723_16.lo \ + src/G72x/g723_24.lo src/G72x/g723_40.lo src/G72x/g72x.lo +src_G72x_libg72x_la_OBJECTS = $(am_src_G72x_libg72x_la_OBJECTS) +src_GSM610_libgsm_la_LIBADD = +am_src_GSM610_libgsm_la_OBJECTS = src/GSM610/add.lo src/GSM610/code.lo \ + src/GSM610/decode.lo src/GSM610/gsm_create.lo \ + src/GSM610/gsm_decode.lo src/GSM610/gsm_destroy.lo \ + src/GSM610/gsm_encode.lo src/GSM610/gsm_option.lo \ + src/GSM610/long_term.lo src/GSM610/lpc.lo \ + src/GSM610/preprocess.lo src/GSM610/rpe.lo \ + src/GSM610/short_term.lo src/GSM610/table.lo +src_GSM610_libgsm_la_OBJECTS = $(am_src_GSM610_libgsm_la_OBJECTS) +src_libcommon_la_LIBADD = +am__src_libcommon_la_SOURCES_DIST = src/common.c src/file_io.c \ + src/command.c src/pcm.c src/ulaw.c src/alaw.c src/float32.c \ + src/double64.c src/ima_adpcm.c src/ms_adpcm.c src/gsm610.c \ + src/dwvw.c src/vox_adpcm.c src/interleave.c src/strings.c \ + src/dither.c src/cart.c src/broadcast.c src/audio_detect.c \ + src/ima_oki_adpcm.c src/ima_oki_adpcm.h src/alac.c src/chunk.c \ + src/ogg.c src/chanmap.c src/windows.c src/id3.c \ + src/nms_adpcm.c src/version-metadata.rc +@USE_WIN_VERSION_FILE_TRUE@am__objects_1 = src/version-metadata.lo +am_src_libcommon_la_OBJECTS = src/libcommon_la-common.lo \ + src/libcommon_la-file_io.lo src/libcommon_la-command.lo \ + src/libcommon_la-pcm.lo src/libcommon_la-ulaw.lo \ + src/libcommon_la-alaw.lo src/libcommon_la-float32.lo \ + src/libcommon_la-double64.lo src/libcommon_la-ima_adpcm.lo \ + src/libcommon_la-ms_adpcm.lo src/libcommon_la-gsm610.lo \ + src/libcommon_la-dwvw.lo src/libcommon_la-vox_adpcm.lo \ + src/libcommon_la-interleave.lo src/libcommon_la-strings.lo \ + src/libcommon_la-dither.lo src/libcommon_la-cart.lo \ + src/libcommon_la-broadcast.lo src/libcommon_la-audio_detect.lo \ + src/libcommon_la-ima_oki_adpcm.lo src/libcommon_la-alac.lo \ + src/libcommon_la-chunk.lo src/libcommon_la-ogg.lo \ + src/libcommon_la-chanmap.lo src/libcommon_la-windows.lo \ + src/libcommon_la-id3.lo src/libcommon_la-nms_adpcm.lo \ + $(am__objects_1) +src_libcommon_la_OBJECTS = $(am_src_libcommon_la_OBJECTS) +src_libcommon_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(src_libcommon_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +am__DEPENDENCIES_1 = +src_libsndfile_la_DEPENDENCIES = src/GSM610/libgsm.la \ + src/G72x/libg72x.la src/ALAC/libalac.la src/libcommon.la \ + $(am__DEPENDENCIES_1) +am_src_libsndfile_la_OBJECTS = src/libsndfile_la-sndfile.lo \ + src/libsndfile_la-aiff.lo src/libsndfile_la-au.lo \ + src/libsndfile_la-avr.lo src/libsndfile_la-caf.lo \ + src/libsndfile_la-dwd.lo src/libsndfile_la-flac.lo \ + src/libsndfile_la-g72x.lo src/libsndfile_la-htk.lo \ + src/libsndfile_la-ircam.lo src/libsndfile_la-macos.lo \ + src/libsndfile_la-mat4.lo src/libsndfile_la-mat5.lo \ + src/libsndfile_la-nist.lo src/libsndfile_la-paf.lo \ + src/libsndfile_la-pvf.lo src/libsndfile_la-raw.lo \ + src/libsndfile_la-rx2.lo src/libsndfile_la-sd2.lo \ + src/libsndfile_la-sds.lo src/libsndfile_la-svx.lo \ + src/libsndfile_la-txw.lo src/libsndfile_la-voc.lo \ + src/libsndfile_la-wve.lo src/libsndfile_la-w64.lo \ + src/libsndfile_la-wavlike.lo src/libsndfile_la-wav.lo \ + src/libsndfile_la-xi.lo src/libsndfile_la-mpc2k.lo \ + src/libsndfile_la-rf64.lo src/libsndfile_la-ogg_vorbis.lo \ + src/libsndfile_la-ogg_speex.lo src/libsndfile_la-ogg_pcm.lo \ + src/libsndfile_la-ogg_opus.lo \ + src/libsndfile_la-ogg_vcomment.lo +am__objects_2 = +nodist_src_libsndfile_la_OBJECTS = $(am__objects_2) +src_libsndfile_la_OBJECTS = $(am_src_libsndfile_la_OBJECTS) \ + $(nodist_src_libsndfile_la_OBJECTS) +src_libsndfile_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(src_libsndfile_la_CFLAGS) $(CFLAGS) \ + $(src_libsndfile_la_LDFLAGS) $(LDFLAGS) -o $@ +am_examples_generate_OBJECTS = examples/generate.$(OBJEXT) +examples_generate_OBJECTS = $(am_examples_generate_OBJECTS) +examples_generate_DEPENDENCIES = src/libsndfile.la +am_examples_list_formats_OBJECTS = examples/list_formats.$(OBJEXT) +examples_list_formats_OBJECTS = $(am_examples_list_formats_OBJECTS) +examples_list_formats_DEPENDENCIES = src/libsndfile.la +am_examples_make_sine_OBJECTS = examples/make_sine.$(OBJEXT) +examples_make_sine_OBJECTS = $(am_examples_make_sine_OBJECTS) +examples_make_sine_DEPENDENCIES = src/libsndfile.la +am_examples_sfprocess_OBJECTS = examples/sfprocess.$(OBJEXT) +examples_sfprocess_OBJECTS = $(am_examples_sfprocess_OBJECTS) +examples_sfprocess_DEPENDENCIES = src/libsndfile.la +am_examples_sndfile_loopify_OBJECTS = \ + examples/sndfile-loopify.$(OBJEXT) +examples_sndfile_loopify_OBJECTS = \ + $(am_examples_sndfile_loopify_OBJECTS) +examples_sndfile_loopify_DEPENDENCIES = src/libsndfile.la +am_examples_sndfile_to_text_OBJECTS = \ + examples/sndfile-to-text.$(OBJEXT) +examples_sndfile_to_text_OBJECTS = \ + $(am_examples_sndfile_to_text_OBJECTS) +examples_sndfile_to_text_DEPENDENCIES = src/libsndfile.la +am_examples_sndfilehandle_OBJECTS = examples/sndfilehandle.$(OBJEXT) +examples_sndfilehandle_OBJECTS = $(am_examples_sndfilehandle_OBJECTS) +examples_sndfilehandle_DEPENDENCIES = src/libsndfile.la +am__ossfuzz_sndfile_fuzzer_SOURCES_DIST = ossfuzz/sndfile_fuzzer.cc +@FULL_SUITE_TRUE@am_ossfuzz_sndfile_fuzzer_OBJECTS = ossfuzz/sndfile_fuzzer-sndfile_fuzzer.$(OBJEXT) +ossfuzz_sndfile_fuzzer_OBJECTS = $(am_ossfuzz_sndfile_fuzzer_OBJECTS) +@FULL_SUITE_TRUE@@USE_OSSFUZZ_FLAG_FALSE@@USE_OSSFUZZ_STATIC_FALSE@am__DEPENDENCIES_2 = libstandaloneengine.la +@FULL_SUITE_TRUE@@USE_OSSFUZZ_FLAG_FALSE@@USE_OSSFUZZ_STATIC_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) +@FULL_SUITE_TRUE@ossfuzz_sndfile_fuzzer_DEPENDENCIES = \ +@FULL_SUITE_TRUE@ src/libsndfile.la $(am__DEPENDENCIES_2) +ossfuzz_sndfile_fuzzer_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(ossfuzz_sndfile_fuzzer_CXXFLAGS) $(CXXFLAGS) \ + $(ossfuzz_sndfile_fuzzer_LDFLAGS) $(LDFLAGS) -o $@ +am_programs_sndfile_cmp_OBJECTS = programs/sndfile-cmp.$(OBJEXT) \ + programs/common.$(OBJEXT) +programs_sndfile_cmp_OBJECTS = $(am_programs_sndfile_cmp_OBJECTS) +programs_sndfile_cmp_DEPENDENCIES = src/libsndfile.la +am_programs_sndfile_concat_OBJECTS = \ + programs/sndfile-concat.$(OBJEXT) programs/common.$(OBJEXT) +programs_sndfile_concat_OBJECTS = \ + $(am_programs_sndfile_concat_OBJECTS) +programs_sndfile_concat_DEPENDENCIES = src/libsndfile.la +am_programs_sndfile_convert_OBJECTS = \ + programs/sndfile-convert.$(OBJEXT) programs/common.$(OBJEXT) +programs_sndfile_convert_OBJECTS = \ + $(am_programs_sndfile_convert_OBJECTS) +programs_sndfile_convert_DEPENDENCIES = src/libsndfile.la +am_programs_sndfile_deinterleave_OBJECTS = \ + programs/sndfile-deinterleave.$(OBJEXT) \ + programs/common.$(OBJEXT) +programs_sndfile_deinterleave_OBJECTS = \ + $(am_programs_sndfile_deinterleave_OBJECTS) +programs_sndfile_deinterleave_DEPENDENCIES = src/libsndfile.la +am_programs_sndfile_info_OBJECTS = programs/sndfile-info.$(OBJEXT) \ + programs/common.$(OBJEXT) +programs_sndfile_info_OBJECTS = $(am_programs_sndfile_info_OBJECTS) +programs_sndfile_info_DEPENDENCIES = src/libsndfile.la +am_programs_sndfile_interleave_OBJECTS = \ + programs/sndfile-interleave.$(OBJEXT) \ + programs/common.$(OBJEXT) +programs_sndfile_interleave_OBJECTS = \ + $(am_programs_sndfile_interleave_OBJECTS) +programs_sndfile_interleave_DEPENDENCIES = src/libsndfile.la +am_programs_sndfile_metadata_get_OBJECTS = \ + programs/sndfile-metadata-get.$(OBJEXT) \ + programs/common.$(OBJEXT) +programs_sndfile_metadata_get_OBJECTS = \ + $(am_programs_sndfile_metadata_get_OBJECTS) +programs_sndfile_metadata_get_DEPENDENCIES = src/libsndfile.la +am_programs_sndfile_metadata_set_OBJECTS = \ + programs/sndfile-metadata-set.$(OBJEXT) \ + programs/common.$(OBJEXT) +programs_sndfile_metadata_set_OBJECTS = \ + $(am_programs_sndfile_metadata_set_OBJECTS) +programs_sndfile_metadata_set_DEPENDENCIES = src/libsndfile.la +am_programs_sndfile_play_OBJECTS = programs/sndfile-play.$(OBJEXT) \ + programs/common.$(OBJEXT) +programs_sndfile_play_OBJECTS = $(am_programs_sndfile_play_OBJECTS) +programs_sndfile_play_DEPENDENCIES = src/libsndfile.la \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_programs_sndfile_salvage_OBJECTS = \ + programs/sndfile-salvage.$(OBJEXT) programs/common.$(OBJEXT) +programs_sndfile_salvage_OBJECTS = \ + $(am_programs_sndfile_salvage_OBJECTS) +programs_sndfile_salvage_DEPENDENCIES = src/libsndfile.la +am_regtest_sndfile_regtest_OBJECTS = \ + regtest/sndfile-regtest.$(OBJEXT) regtest/database.$(OBJEXT) \ + regtest/checksum.$(OBJEXT) +regtest_sndfile_regtest_OBJECTS = \ + $(am_regtest_sndfile_regtest_OBJECTS) +regtest_sndfile_regtest_DEPENDENCIES = src/libsndfile.la \ + $(am__DEPENDENCIES_1) +am_src_G72x_g72x_test_OBJECTS = src/G72x/g72x_test.$(OBJEXT) +src_G72x_g72x_test_OBJECTS = $(am_src_G72x_g72x_test_OBJECTS) +src_G72x_g72x_test_DEPENDENCIES = src/G72x/libg72x.la +am_src_test_main_OBJECTS = src/test_main.$(OBJEXT) \ + src/test_conversions.$(OBJEXT) src/test_float.$(OBJEXT) \ + src/test_endswap.$(OBJEXT) src/test_audio_detect.$(OBJEXT) \ + src/test_log_printf.$(OBJEXT) src/test_file_io.$(OBJEXT) \ + src/test_ima_oki_adpcm.$(OBJEXT) \ + src/test_strncpy_crlf.$(OBJEXT) \ + src/test_broadcast_var.$(OBJEXT) src/test_cart_var.$(OBJEXT) \ + src/test_binheader_writef.$(OBJEXT) \ + src/test_nms_adpcm.$(OBJEXT) +src_test_main_OBJECTS = $(am_src_test_main_OBJECTS) +src_test_main_DEPENDENCIES = src/libcommon.la +am_tests_aiff_rw_test_OBJECTS = tests/utils.$(OBJEXT) \ + tests/aiff_rw_test.$(OBJEXT) +tests_aiff_rw_test_OBJECTS = $(am_tests_aiff_rw_test_OBJECTS) +tests_aiff_rw_test_DEPENDENCIES = src/libsndfile.la +am_tests_alaw_test_OBJECTS = tests/utils.$(OBJEXT) \ + tests/alaw_test.$(OBJEXT) +tests_alaw_test_OBJECTS = $(am_tests_alaw_test_OBJECTS) +tests_alaw_test_DEPENDENCIES = src/libsndfile.la +am_tests_benchmark_OBJECTS = tests/benchmark.$(OBJEXT) +tests_benchmark_OBJECTS = $(am_tests_benchmark_OBJECTS) +tests_benchmark_DEPENDENCIES = src/libsndfile.la +am_tests_channel_test_OBJECTS = tests/channel_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_channel_test_OBJECTS = $(am_tests_channel_test_OBJECTS) +tests_channel_test_DEPENDENCIES = src/libsndfile.la +am_tests_checksum_test_OBJECTS = tests/checksum_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_checksum_test_OBJECTS = $(am_tests_checksum_test_OBJECTS) +tests_checksum_test_DEPENDENCIES = src/libsndfile.la +am_tests_chunk_test_OBJECTS = tests/chunk_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_chunk_test_OBJECTS = $(am_tests_chunk_test_OBJECTS) +tests_chunk_test_DEPENDENCIES = src/libsndfile.la +am_tests_command_test_OBJECTS = tests/command_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_command_test_OBJECTS = $(am_tests_command_test_OBJECTS) +tests_command_test_DEPENDENCIES = src/libsndfile.la +am_tests_compression_size_test_OBJECTS = \ + tests/compression_size_test.$(OBJEXT) tests/utils.$(OBJEXT) +tests_compression_size_test_OBJECTS = \ + $(am_tests_compression_size_test_OBJECTS) +tests_compression_size_test_DEPENDENCIES = src/libsndfile.la +am_tests_cpp_test_OBJECTS = tests/cpp_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_cpp_test_OBJECTS = $(am_tests_cpp_test_OBJECTS) +tests_cpp_test_DEPENDENCIES = src/libsndfile.la +am_tests_dither_test_OBJECTS = tests/dither_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_dither_test_OBJECTS = $(am_tests_dither_test_OBJECTS) +tests_dither_test_DEPENDENCIES = src/libsndfile.la +am_tests_dwvw_test_OBJECTS = tests/dwvw_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_dwvw_test_OBJECTS = $(am_tests_dwvw_test_OBJECTS) +tests_dwvw_test_DEPENDENCIES = src/libsndfile.la +am_tests_error_test_OBJECTS = tests/error_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_error_test_OBJECTS = $(am_tests_error_test_OBJECTS) +tests_error_test_DEPENDENCIES = src/libsndfile.la +am_tests_external_libs_test_OBJECTS = \ + tests/external_libs_test.$(OBJEXT) tests/utils.$(OBJEXT) +tests_external_libs_test_OBJECTS = \ + $(am_tests_external_libs_test_OBJECTS) +tests_external_libs_test_DEPENDENCIES = src/libsndfile.la +am_tests_fix_this_OBJECTS = tests/utils.$(OBJEXT) \ + tests/fix_this.$(OBJEXT) +tests_fix_this_OBJECTS = $(am_tests_fix_this_OBJECTS) +tests_fix_this_DEPENDENCIES = src/libsndfile.la +am_tests_floating_point_test_OBJECTS = tests/utils.$(OBJEXT) \ + tests/dft_cmp.$(OBJEXT) tests/floating_point_test.$(OBJEXT) +tests_floating_point_test_OBJECTS = \ + $(am_tests_floating_point_test_OBJECTS) +tests_floating_point_test_DEPENDENCIES = src/libsndfile.la +am_tests_format_check_test_OBJECTS = \ + tests/format_check_test.$(OBJEXT) tests/utils.$(OBJEXT) +tests_format_check_test_OBJECTS = \ + $(am_tests_format_check_test_OBJECTS) +tests_format_check_test_DEPENDENCIES = src/libsndfile.la +am_tests_header_test_OBJECTS = tests/header_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_header_test_OBJECTS = $(am_tests_header_test_OBJECTS) +tests_header_test_DEPENDENCIES = src/libsndfile.la +am_tests_headerless_test_OBJECTS = tests/utils.$(OBJEXT) \ + tests/headerless_test.$(OBJEXT) +tests_headerless_test_OBJECTS = $(am_tests_headerless_test_OBJECTS) +tests_headerless_test_DEPENDENCIES = src/libsndfile.la +am_tests_largefile_test_OBJECTS = tests/largefile_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_largefile_test_OBJECTS = $(am_tests_largefile_test_OBJECTS) +tests_largefile_test_DEPENDENCIES = src/libsndfile.la +am_tests_locale_test_OBJECTS = tests/locale_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_locale_test_OBJECTS = $(am_tests_locale_test_OBJECTS) +tests_locale_test_DEPENDENCIES = src/libsndfile.la +am_tests_long_read_write_test_OBJECTS = \ + tests/long_read_write_test.$(OBJEXT) tests/utils.$(OBJEXT) +tests_long_read_write_test_OBJECTS = \ + $(am_tests_long_read_write_test_OBJECTS) +tests_long_read_write_test_DEPENDENCIES = src/libsndfile.la +am_tests_lossy_comp_test_OBJECTS = tests/utils.$(OBJEXT) \ + tests/lossy_comp_test.$(OBJEXT) +tests_lossy_comp_test_OBJECTS = $(am_tests_lossy_comp_test_OBJECTS) +tests_lossy_comp_test_DEPENDENCIES = src/libsndfile.la +am_tests_misc_test_OBJECTS = tests/misc_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_misc_test_OBJECTS = $(am_tests_misc_test_OBJECTS) +tests_misc_test_DEPENDENCIES = src/libsndfile.la +am_tests_multi_file_test_OBJECTS = tests/multi_file_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_multi_file_test_OBJECTS = $(am_tests_multi_file_test_OBJECTS) +tests_multi_file_test_DEPENDENCIES = src/libsndfile.la +am_tests_ogg_opus_test_OBJECTS = tests/ogg_opus_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_ogg_opus_test_OBJECTS = $(am_tests_ogg_opus_test_OBJECTS) +tests_ogg_opus_test_DEPENDENCIES = src/libsndfile.la +am_tests_ogg_test_OBJECTS = tests/ogg_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_ogg_test_OBJECTS = $(am_tests_ogg_test_OBJECTS) +tests_ogg_test_DEPENDENCIES = src/libsndfile.la +am_tests_pcm_test_OBJECTS = tests/pcm_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_pcm_test_OBJECTS = $(am_tests_pcm_test_OBJECTS) +tests_pcm_test_DEPENDENCIES = src/libsndfile.la +am_tests_peak_chunk_test_OBJECTS = tests/peak_chunk_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_peak_chunk_test_OBJECTS = $(am_tests_peak_chunk_test_OBJECTS) +tests_peak_chunk_test_DEPENDENCIES = src/libsndfile.la +am_tests_pipe_test_OBJECTS = tests/pipe_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_pipe_test_OBJECTS = $(am_tests_pipe_test_OBJECTS) +tests_pipe_test_DEPENDENCIES = src/libsndfile.la +am_tests_raw_test_OBJECTS = tests/raw_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_raw_test_OBJECTS = $(am_tests_raw_test_OBJECTS) +tests_raw_test_DEPENDENCIES = src/libsndfile.la +am_tests_rdwr_test_OBJECTS = tests/rdwr_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_rdwr_test_OBJECTS = $(am_tests_rdwr_test_OBJECTS) +tests_rdwr_test_DEPENDENCIES = src/libsndfile.la +am_tests_scale_clip_test_OBJECTS = tests/scale_clip_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_scale_clip_test_OBJECTS = $(am_tests_scale_clip_test_OBJECTS) +tests_scale_clip_test_DEPENDENCIES = src/libsndfile.la +am_tests_sfversion_OBJECTS = tests/sfversion.$(OBJEXT) +tests_sfversion_OBJECTS = $(am_tests_sfversion_OBJECTS) +tests_sfversion_DEPENDENCIES = src/libsndfile.la +am_tests_stdin_test_OBJECTS = tests/stdin_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_stdin_test_OBJECTS = $(am_tests_stdin_test_OBJECTS) +tests_stdin_test_DEPENDENCIES = src/libsndfile.la +am_tests_stdio_test_OBJECTS = tests/stdio_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_stdio_test_OBJECTS = $(am_tests_stdio_test_OBJECTS) +tests_stdio_test_DEPENDENCIES = src/libsndfile.la +am_tests_stdout_test_OBJECTS = tests/stdout_test.$(OBJEXT) +tests_stdout_test_OBJECTS = $(am_tests_stdout_test_OBJECTS) +tests_stdout_test_DEPENDENCIES = src/libsndfile.la +am_tests_string_test_OBJECTS = tests/string_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_string_test_OBJECTS = $(am_tests_string_test_OBJECTS) +tests_string_test_DEPENDENCIES = src/libsndfile.la +am_tests_ulaw_test_OBJECTS = tests/utils.$(OBJEXT) \ + tests/ulaw_test.$(OBJEXT) +tests_ulaw_test_OBJECTS = $(am_tests_ulaw_test_OBJECTS) +tests_ulaw_test_DEPENDENCIES = src/libsndfile.la +am_tests_virtual_io_test_OBJECTS = tests/virtual_io_test.$(OBJEXT) \ + tests/utils.$(OBJEXT) +tests_virtual_io_test_OBJECTS = $(am_tests_virtual_io_test_OBJECTS) +tests_virtual_io_test_DEPENDENCIES = src/libsndfile.la +am_tests_win32_ordinal_test_OBJECTS = \ + tests/win32_ordinal_test.$(OBJEXT) tests/utils.$(OBJEXT) +tests_win32_ordinal_test_OBJECTS = \ + $(am_tests_win32_ordinal_test_OBJECTS) +tests_win32_ordinal_test_DEPENDENCIES = src/libsndfile.la +am_tests_win32_test_OBJECTS = tests/win32_test.$(OBJEXT) +tests_win32_test_OBJECTS = $(am_tests_win32_test_OBJECTS) +tests_win32_test_DEPENDENCIES = src/libsndfile.la +am_tests_write_read_test_OBJECTS = tests/utils.$(OBJEXT) \ + tests/generate.$(OBJEXT) tests/write_read_test.$(OBJEXT) +tests_write_read_test_OBJECTS = $(am_tests_write_read_test_OBJECTS) +tests_write_read_test_DEPENDENCIES = src/libsndfile.la +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src +depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = examples/$(DEPDIR)/generate.Po \ + examples/$(DEPDIR)/list_formats.Po \ + examples/$(DEPDIR)/make_sine.Po \ + examples/$(DEPDIR)/sfprocess.Po \ + examples/$(DEPDIR)/sndfile-loopify.Po \ + examples/$(DEPDIR)/sndfile-to-text.Po \ + examples/$(DEPDIR)/sndfilehandle.Po \ + ossfuzz/$(DEPDIR)/libstandaloneengine_la-standaloneengine.Plo \ + ossfuzz/$(DEPDIR)/sndfile_fuzzer-sndfile_fuzzer.Po \ + programs/$(DEPDIR)/common.Po programs/$(DEPDIR)/sndfile-cmp.Po \ + programs/$(DEPDIR)/sndfile-concat.Po \ + programs/$(DEPDIR)/sndfile-convert.Po \ + programs/$(DEPDIR)/sndfile-deinterleave.Po \ + programs/$(DEPDIR)/sndfile-info.Po \ + programs/$(DEPDIR)/sndfile-interleave.Po \ + programs/$(DEPDIR)/sndfile-metadata-get.Po \ + programs/$(DEPDIR)/sndfile-metadata-set.Po \ + programs/$(DEPDIR)/sndfile-play.Po \ + programs/$(DEPDIR)/sndfile-salvage.Po \ + regtest/$(DEPDIR)/checksum.Po regtest/$(DEPDIR)/database.Po \ + regtest/$(DEPDIR)/sndfile-regtest.Po \ + src/$(DEPDIR)/libcommon_la-alac.Plo \ + src/$(DEPDIR)/libcommon_la-alaw.Plo \ + src/$(DEPDIR)/libcommon_la-audio_detect.Plo \ + src/$(DEPDIR)/libcommon_la-broadcast.Plo \ + src/$(DEPDIR)/libcommon_la-cart.Plo \ + src/$(DEPDIR)/libcommon_la-chanmap.Plo \ + src/$(DEPDIR)/libcommon_la-chunk.Plo \ + src/$(DEPDIR)/libcommon_la-command.Plo \ + src/$(DEPDIR)/libcommon_la-common.Plo \ + src/$(DEPDIR)/libcommon_la-dither.Plo \ + src/$(DEPDIR)/libcommon_la-double64.Plo \ + src/$(DEPDIR)/libcommon_la-dwvw.Plo \ + src/$(DEPDIR)/libcommon_la-file_io.Plo \ + src/$(DEPDIR)/libcommon_la-float32.Plo \ + src/$(DEPDIR)/libcommon_la-gsm610.Plo \ + src/$(DEPDIR)/libcommon_la-id3.Plo \ + src/$(DEPDIR)/libcommon_la-ima_adpcm.Plo \ + src/$(DEPDIR)/libcommon_la-ima_oki_adpcm.Plo \ + src/$(DEPDIR)/libcommon_la-interleave.Plo \ + src/$(DEPDIR)/libcommon_la-ms_adpcm.Plo \ + src/$(DEPDIR)/libcommon_la-nms_adpcm.Plo \ + src/$(DEPDIR)/libcommon_la-ogg.Plo \ + src/$(DEPDIR)/libcommon_la-pcm.Plo \ + src/$(DEPDIR)/libcommon_la-strings.Plo \ + src/$(DEPDIR)/libcommon_la-ulaw.Plo \ + src/$(DEPDIR)/libcommon_la-vox_adpcm.Plo \ + src/$(DEPDIR)/libcommon_la-windows.Plo \ + src/$(DEPDIR)/libsndfile_la-aiff.Plo \ + src/$(DEPDIR)/libsndfile_la-au.Plo \ + src/$(DEPDIR)/libsndfile_la-avr.Plo \ + src/$(DEPDIR)/libsndfile_la-caf.Plo \ + src/$(DEPDIR)/libsndfile_la-dwd.Plo \ + src/$(DEPDIR)/libsndfile_la-flac.Plo \ + src/$(DEPDIR)/libsndfile_la-g72x.Plo \ + src/$(DEPDIR)/libsndfile_la-htk.Plo \ + src/$(DEPDIR)/libsndfile_la-ircam.Plo \ + src/$(DEPDIR)/libsndfile_la-macos.Plo \ + src/$(DEPDIR)/libsndfile_la-mat4.Plo \ + src/$(DEPDIR)/libsndfile_la-mat5.Plo \ + src/$(DEPDIR)/libsndfile_la-mpc2k.Plo \ + src/$(DEPDIR)/libsndfile_la-nist.Plo \ + src/$(DEPDIR)/libsndfile_la-ogg_opus.Plo \ + src/$(DEPDIR)/libsndfile_la-ogg_pcm.Plo \ + src/$(DEPDIR)/libsndfile_la-ogg_speex.Plo \ + src/$(DEPDIR)/libsndfile_la-ogg_vcomment.Plo \ + src/$(DEPDIR)/libsndfile_la-ogg_vorbis.Plo \ + src/$(DEPDIR)/libsndfile_la-paf.Plo \ + src/$(DEPDIR)/libsndfile_la-pvf.Plo \ + src/$(DEPDIR)/libsndfile_la-raw.Plo \ + src/$(DEPDIR)/libsndfile_la-rf64.Plo \ + src/$(DEPDIR)/libsndfile_la-rx2.Plo \ + src/$(DEPDIR)/libsndfile_la-sd2.Plo \ + src/$(DEPDIR)/libsndfile_la-sds.Plo \ + src/$(DEPDIR)/libsndfile_la-sndfile.Plo \ + src/$(DEPDIR)/libsndfile_la-svx.Plo \ + src/$(DEPDIR)/libsndfile_la-txw.Plo \ + src/$(DEPDIR)/libsndfile_la-voc.Plo \ + src/$(DEPDIR)/libsndfile_la-w64.Plo \ + src/$(DEPDIR)/libsndfile_la-wav.Plo \ + src/$(DEPDIR)/libsndfile_la-wavlike.Plo \ + src/$(DEPDIR)/libsndfile_la-wve.Plo \ + src/$(DEPDIR)/libsndfile_la-xi.Plo \ + src/$(DEPDIR)/test_audio_detect.Po \ + src/$(DEPDIR)/test_binheader_writef.Po \ + src/$(DEPDIR)/test_broadcast_var.Po \ + src/$(DEPDIR)/test_cart_var.Po \ + src/$(DEPDIR)/test_conversions.Po \ + src/$(DEPDIR)/test_endswap.Po src/$(DEPDIR)/test_file_io.Po \ + src/$(DEPDIR)/test_float.Po \ + src/$(DEPDIR)/test_ima_oki_adpcm.Po \ + src/$(DEPDIR)/test_log_printf.Po src/$(DEPDIR)/test_main.Po \ + src/$(DEPDIR)/test_nms_adpcm.Po \ + src/$(DEPDIR)/test_strncpy_crlf.Po \ + src/ALAC/$(DEPDIR)/ALACBitUtilities.Plo \ + src/ALAC/$(DEPDIR)/ag_dec.Plo src/ALAC/$(DEPDIR)/ag_enc.Plo \ + src/ALAC/$(DEPDIR)/alac_decoder.Plo \ + src/ALAC/$(DEPDIR)/alac_encoder.Plo \ + src/ALAC/$(DEPDIR)/dp_dec.Plo src/ALAC/$(DEPDIR)/dp_enc.Plo \ + src/ALAC/$(DEPDIR)/matrix_dec.Plo \ + src/ALAC/$(DEPDIR)/matrix_enc.Plo src/G72x/$(DEPDIR)/g721.Plo \ + src/G72x/$(DEPDIR)/g723_16.Plo src/G72x/$(DEPDIR)/g723_24.Plo \ + src/G72x/$(DEPDIR)/g723_40.Plo src/G72x/$(DEPDIR)/g72x.Plo \ + src/G72x/$(DEPDIR)/g72x_test.Po src/GSM610/$(DEPDIR)/add.Plo \ + src/GSM610/$(DEPDIR)/code.Plo src/GSM610/$(DEPDIR)/decode.Plo \ + src/GSM610/$(DEPDIR)/gsm_create.Plo \ + src/GSM610/$(DEPDIR)/gsm_decode.Plo \ + src/GSM610/$(DEPDIR)/gsm_destroy.Plo \ + src/GSM610/$(DEPDIR)/gsm_encode.Plo \ + src/GSM610/$(DEPDIR)/gsm_option.Plo \ + src/GSM610/$(DEPDIR)/long_term.Plo \ + src/GSM610/$(DEPDIR)/lpc.Plo \ + src/GSM610/$(DEPDIR)/preprocess.Plo \ + src/GSM610/$(DEPDIR)/rpe.Plo \ + src/GSM610/$(DEPDIR)/short_term.Plo \ + src/GSM610/$(DEPDIR)/table.Plo tests/$(DEPDIR)/aiff_rw_test.Po \ + tests/$(DEPDIR)/alaw_test.Po tests/$(DEPDIR)/benchmark.Po \ + tests/$(DEPDIR)/channel_test.Po \ + tests/$(DEPDIR)/checksum_test.Po tests/$(DEPDIR)/chunk_test.Po \ + tests/$(DEPDIR)/command_test.Po \ + tests/$(DEPDIR)/compression_size_test.Po \ + tests/$(DEPDIR)/cpp_test.Po tests/$(DEPDIR)/dft_cmp.Po \ + tests/$(DEPDIR)/dither_test.Po tests/$(DEPDIR)/dwvw_test.Po \ + tests/$(DEPDIR)/error_test.Po \ + tests/$(DEPDIR)/external_libs_test.Po \ + tests/$(DEPDIR)/fix_this.Po \ + tests/$(DEPDIR)/floating_point_test.Po \ + tests/$(DEPDIR)/format_check_test.Po \ + tests/$(DEPDIR)/generate.Po tests/$(DEPDIR)/header_test.Po \ + tests/$(DEPDIR)/headerless_test.Po \ + tests/$(DEPDIR)/largefile_test.Po \ + tests/$(DEPDIR)/locale_test.Po \ + tests/$(DEPDIR)/long_read_write_test.Po \ + tests/$(DEPDIR)/lossy_comp_test.Po \ + tests/$(DEPDIR)/misc_test.Po \ + tests/$(DEPDIR)/multi_file_test.Po \ + tests/$(DEPDIR)/ogg_opus_test.Po tests/$(DEPDIR)/ogg_test.Po \ + tests/$(DEPDIR)/pcm_test.Po tests/$(DEPDIR)/peak_chunk_test.Po \ + tests/$(DEPDIR)/pipe_test.Po tests/$(DEPDIR)/raw_test.Po \ + tests/$(DEPDIR)/rdwr_test.Po \ + tests/$(DEPDIR)/scale_clip_test.Po \ + tests/$(DEPDIR)/sfversion.Po tests/$(DEPDIR)/stdin_test.Po \ + tests/$(DEPDIR)/stdio_test.Po tests/$(DEPDIR)/stdout_test.Po \ + tests/$(DEPDIR)/string_test.Po tests/$(DEPDIR)/ulaw_test.Po \ + tests/$(DEPDIR)/utils.Po tests/$(DEPDIR)/virtual_io_test.Po \ + tests/$(DEPDIR)/win32_ordinal_test.Po \ + tests/$(DEPDIR)/win32_test.Po \ + tests/$(DEPDIR)/write_read_test.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(ossfuzz_libstandaloneengine_la_SOURCES) \ + $(src_ALAC_libalac_la_SOURCES) $(src_G72x_libg72x_la_SOURCES) \ + $(src_GSM610_libgsm_la_SOURCES) $(src_libcommon_la_SOURCES) \ + $(src_libsndfile_la_SOURCES) \ + $(nodist_src_libsndfile_la_SOURCES) \ + $(examples_generate_SOURCES) $(examples_list_formats_SOURCES) \ + $(examples_make_sine_SOURCES) $(examples_sfprocess_SOURCES) \ + $(examples_sndfile_loopify_SOURCES) \ + $(examples_sndfile_to_text_SOURCES) \ + $(examples_sndfilehandle_SOURCES) \ + $(ossfuzz_sndfile_fuzzer_SOURCES) \ + $(programs_sndfile_cmp_SOURCES) \ + $(programs_sndfile_concat_SOURCES) \ + $(programs_sndfile_convert_SOURCES) \ + $(programs_sndfile_deinterleave_SOURCES) \ + $(programs_sndfile_info_SOURCES) \ + $(programs_sndfile_interleave_SOURCES) \ + $(programs_sndfile_metadata_get_SOURCES) \ + $(programs_sndfile_metadata_set_SOURCES) \ + $(programs_sndfile_play_SOURCES) \ + $(programs_sndfile_salvage_SOURCES) \ + $(regtest_sndfile_regtest_SOURCES) \ + $(src_G72x_g72x_test_SOURCES) $(src_test_main_SOURCES) \ + $(tests_aiff_rw_test_SOURCES) $(tests_alaw_test_SOURCES) \ + $(tests_benchmark_SOURCES) $(tests_channel_test_SOURCES) \ + $(tests_checksum_test_SOURCES) $(tests_chunk_test_SOURCES) \ + $(tests_command_test_SOURCES) \ + $(tests_compression_size_test_SOURCES) \ + $(tests_cpp_test_SOURCES) $(tests_dither_test_SOURCES) \ + $(tests_dwvw_test_SOURCES) $(tests_error_test_SOURCES) \ + $(tests_external_libs_test_SOURCES) $(tests_fix_this_SOURCES) \ + $(tests_floating_point_test_SOURCES) \ + $(tests_format_check_test_SOURCES) \ + $(tests_header_test_SOURCES) $(tests_headerless_test_SOURCES) \ + $(tests_largefile_test_SOURCES) $(tests_locale_test_SOURCES) \ + $(tests_long_read_write_test_SOURCES) \ + $(tests_lossy_comp_test_SOURCES) $(tests_misc_test_SOURCES) \ + $(tests_multi_file_test_SOURCES) \ + $(tests_ogg_opus_test_SOURCES) $(tests_ogg_test_SOURCES) \ + $(tests_pcm_test_SOURCES) $(tests_peak_chunk_test_SOURCES) \ + $(tests_pipe_test_SOURCES) $(tests_raw_test_SOURCES) \ + $(tests_rdwr_test_SOURCES) $(tests_scale_clip_test_SOURCES) \ + $(tests_sfversion_SOURCES) $(tests_stdin_test_SOURCES) \ + $(tests_stdio_test_SOURCES) $(tests_stdout_test_SOURCES) \ + $(tests_string_test_SOURCES) $(tests_ulaw_test_SOURCES) \ + $(tests_virtual_io_test_SOURCES) \ + $(tests_win32_ordinal_test_SOURCES) \ + $(tests_win32_test_SOURCES) $(tests_write_read_test_SOURCES) +DIST_SOURCES = $(am__ossfuzz_libstandaloneengine_la_SOURCES_DIST) \ + $(src_ALAC_libalac_la_SOURCES) $(src_G72x_libg72x_la_SOURCES) \ + $(src_GSM610_libgsm_la_SOURCES) \ + $(am__src_libcommon_la_SOURCES_DIST) \ + $(src_libsndfile_la_SOURCES) $(examples_generate_SOURCES) \ + $(examples_list_formats_SOURCES) $(examples_make_sine_SOURCES) \ + $(examples_sfprocess_SOURCES) \ + $(examples_sndfile_loopify_SOURCES) \ + $(examples_sndfile_to_text_SOURCES) \ + $(examples_sndfilehandle_SOURCES) \ + $(am__ossfuzz_sndfile_fuzzer_SOURCES_DIST) \ + $(programs_sndfile_cmp_SOURCES) \ + $(programs_sndfile_concat_SOURCES) \ + $(programs_sndfile_convert_SOURCES) \ + $(programs_sndfile_deinterleave_SOURCES) \ + $(programs_sndfile_info_SOURCES) \ + $(programs_sndfile_interleave_SOURCES) \ + $(programs_sndfile_metadata_get_SOURCES) \ + $(programs_sndfile_metadata_set_SOURCES) \ + $(programs_sndfile_play_SOURCES) \ + $(programs_sndfile_salvage_SOURCES) \ + $(regtest_sndfile_regtest_SOURCES) \ + $(src_G72x_g72x_test_SOURCES) $(src_test_main_SOURCES) \ + $(tests_aiff_rw_test_SOURCES) $(tests_alaw_test_SOURCES) \ + $(tests_benchmark_SOURCES) $(tests_channel_test_SOURCES) \ + $(tests_checksum_test_SOURCES) $(tests_chunk_test_SOURCES) \ + $(tests_command_test_SOURCES) \ + $(tests_compression_size_test_SOURCES) \ + $(tests_cpp_test_SOURCES) $(tests_dither_test_SOURCES) \ + $(tests_dwvw_test_SOURCES) $(tests_error_test_SOURCES) \ + $(tests_external_libs_test_SOURCES) $(tests_fix_this_SOURCES) \ + $(tests_floating_point_test_SOURCES) \ + $(tests_format_check_test_SOURCES) \ + $(tests_header_test_SOURCES) $(tests_headerless_test_SOURCES) \ + $(tests_largefile_test_SOURCES) $(tests_locale_test_SOURCES) \ + $(tests_long_read_write_test_SOURCES) \ + $(tests_lossy_comp_test_SOURCES) $(tests_misc_test_SOURCES) \ + $(tests_multi_file_test_SOURCES) \ + $(tests_ogg_opus_test_SOURCES) $(tests_ogg_test_SOURCES) \ + $(tests_pcm_test_SOURCES) $(tests_peak_chunk_test_SOURCES) \ + $(tests_pipe_test_SOURCES) $(tests_raw_test_SOURCES) \ + $(tests_rdwr_test_SOURCES) $(tests_scale_clip_test_SOURCES) \ + $(tests_sfversion_SOURCES) $(tests_stdin_test_SOURCES) \ + $(tests_stdio_test_SOURCES) $(tests_stdout_test_SOURCES) \ + $(tests_string_test_SOURCES) $(tests_ulaw_test_SOURCES) \ + $(tests_virtual_io_test_SOURCES) \ + $(tests_win32_ordinal_test_SOURCES) \ + $(tests_win32_test_SOURCES) $(tests_write_read_test_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(dist_man_MANS) +am__dist_doc_DATA_DIST = docs/index.md docs/libsndfile.jpg \ + docs/libsndfile.css docs/print.css docs/api.md docs/command.md \ + docs/bugs.md docs/formats.md docs/sndfile_info.md \ + docs/new_file_type_howto.md docs/win32.md docs/FAQ.md \ + docs/lists.md docs/embedded_files.md docs/octave.md \ + docs/tutorial.md +DATA = $(dist_doc_DATA) $(pkgconfig_DATA) +HEADERS = $(include_HEADERS) $(nodist_include_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope distdir distdir-am dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +DIST_SUBDIRS = Octave +am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \ + $(srcdir)/libsndfile.spec.in $(srcdir)/sndfile.pc.in \ + $(top_srcdir)/Scripts/build-test-tarball.mk.in \ + $(top_srcdir)/build-aux/ar-lib $(top_srcdir)/build-aux/compile \ + $(top_srcdir)/build-aux/config.guess \ + $(top_srcdir)/build-aux/config.sub \ + $(top_srcdir)/build-aux/depcomp \ + $(top_srcdir)/build-aux/install-sh \ + $(top_srcdir)/build-aux/ltmain.sh \ + $(top_srcdir)/build-aux/missing \ + $(top_srcdir)/include/sndfile.h.in \ + $(top_srcdir)/src/config.h.in \ + $(top_srcdir)/src/version-metadata.rc.in \ + $(top_srcdir)/tests/pedantic-header-test.sh.in \ + $(top_srcdir)/tests/test_wrapper.sh.in AUTHORS COPYING \ + ChangeLog NEWS README build-aux/ar-lib build-aux/compile \ + build-aux/config.guess build-aux/config.sub build-aux/depcomp \ + build-aux/install-sh build-aux/ltmain.sh build-aux/missing +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +GZIP_ENV = --best +DIST_ARCHIVES = $(distdir).tar.bz2 +DIST_TARGETS = dist-bzip2 +# Exists only to be overridden by the user if desired. +AM_DISTCHECK_DVI_TARGET = dvi +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ + +#=============================================================================== +# Disable autoheader. +AUTOHEADER = echo +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLEAN_VERSION = @CLEAN_VERSION@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +EXTERNAL_XIPH_CFLAGS = @EXTERNAL_XIPH_CFLAGS@ +EXTERNAL_XIPH_LIBS = @EXTERNAL_XIPH_LIBS@ +EXTERNAL_XIPH_REQUIRE = @EXTERNAL_XIPH_REQUIRE@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GEN_TOOL = @GEN_TOOL@ +GREP = @GREP@ +HAVE_AUTOGEN = @HAVE_AUTOGEN@ +HAVE_EXTERNAL_XIPH_LIBS = @HAVE_EXTERNAL_XIPH_LIBS@ +HAVE_MKOCTFILE = @HAVE_MKOCTFILE@ +HAVE_OCTAVE = @HAVE_OCTAVE@ +HAVE_OCTAVE_CONFIG = @HAVE_OCTAVE_CONFIG@ +HAVE_WINE = @HAVE_WINE@ +HAVE_XCODE_SELECT = @HAVE_XCODE_SELECT@ +HOST_TRIPLET = @HOST_TRIPLET@ +HTML_BGCOLOUR = @HTML_BGCOLOUR@ +HTML_FGCOLOUR = @HTML_FGCOLOUR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_FUZZING_ENGINE = @LIB_FUZZING_ENGINE@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MKOCTFILE = @MKOCTFILE@ +MKOCTFILE_VERSION = @MKOCTFILE_VERSION@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCTAVE = @OCTAVE@ +OCTAVE_CONFIG = @OCTAVE_CONFIG@ +OCTAVE_CONFIG_VERSION = @OCTAVE_CONFIG_VERSION@ +OCTAVE_DEST_MDIR = @OCTAVE_DEST_MDIR@ +OCTAVE_DEST_ODIR = @OCTAVE_DEST_ODIR@ +OCTAVE_VERSION = @OCTAVE_VERSION@ +OGG_CFLAGS = @OGG_CFLAGS@ +OGG_LIBS = @OGG_LIBS@ +OPUS_CFLAGS = @OPUS_CFLAGS@ +OPUS_LIBS = @OPUS_LIBS@ +OS_SPECIFIC_CFLAGS = @OS_SPECIFIC_CFLAGS@ +OS_SPECIFIC_LINKS = @OS_SPECIFIC_LINKS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RC = @RC@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SF_COUNT_MAX = @SF_COUNT_MAX@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SHLIB_VERSION_ARG = @SHLIB_VERSION_ARG@ +SIZEOF_SF_COUNT_T = @SIZEOF_SF_COUNT_T@ +SNDIO_LIBS = @SNDIO_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +SQLITE3_CFLAGS = @SQLITE3_CFLAGS@ +SQLITE3_LIBS = @SQLITE3_LIBS@ +SRC_BINDIR = @SRC_BINDIR@ +STRIP = @STRIP@ +TEST_BINDIR = @TEST_BINDIR@ +TYPEOF_SF_COUNT_T = @TYPEOF_SF_COUNT_T@ +VERSION = @VERSION@ +VERSION_MAJOR = @VERSION_MAJOR@ +VORBISENC_CFLAGS = @VORBISENC_CFLAGS@ +VORBISENC_LIBS = @VORBISENC_LIBS@ +VORBIS_CFLAGS = @VORBIS_CFLAGS@ +VORBIS_LIBS = @VORBIS_LIBS@ +WIN_RC_VERSION = @WIN_RC_VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgconfigdir = @pkgconfigdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/include -I$(top_builddir)/include $(OS_SPECIFIC_CFLAGS) +DISTCHECK_CONFIGURE_FLAGS = --enable-werror +CLEANFILES = programs/*.wav octave-workspace +@BUILD_OCTAVE_MOD_TRUE@@FULL_SUITE_TRUE@SUBDIRS = Octave +EXTRA_DIST = libsndfile.spec.in sndfile.pc.in \ + Scripts/android-configure.sh \ + Scripts/linux-to-win-cross-configure.sh CMakeLists.txt \ + $(cmake_files) Win32 include/sndfile.h.in src/config.h.in \ + src/test_endswap.tpl src/test_endswap.def $(SYMBOL_FILES) \ + src/create_symbols_file.py src/binheader_writef_check.py \ + src/GSM610/README src/GSM610/COPYRIGHT src/GSM610/ChangeLog \ + src/G72x/README src/G72x/README.original src/G72x/ChangeLog \ + src/make-static-lib-hidden-privates.sh src/config.h.cmake \ + $(BUILT_SOURCES) tests/write_read_test.tpl \ + tests/write_read_test.def tests/pcm_test.tpl \ + tests/pcm_test.def tests/header_test.tpl tests/header_test.def \ + tests/utils.tpl tests/utils.def tests/scale_clip_test.tpl \ + tests/scale_clip_test.def tests/pipe_test.tpl \ + tests/pipe_test.def tests/rdwr_test.tpl tests/rdwr_test.def \ + tests/floating_point_test.tpl tests/floating_point_test.def \ + tests/benchmark.tpl tests/benchmark.def \ + programs/test-sndfile-metadata-set.py +cmake_files = cmake/ClipMode.cmake cmake/FindFLAC.cmake \ + cmake/CMakeAutoGen.cmake cmake/CMakeAutoGenScript.cmake \ + cmake/FindOgg.cmake cmake/FindVorbis.cmake cmake/FindSndio.cmake \ + cmake/FindSpeex.cmake cmake/sqlite/FindSQLite3.cmake \ + cmake/SndFileChecks.cmake cmake/TestInline.cmake \ + cmake/TestLargeFiles.cmake cmake/TestInline.c.in \ + cmake/FindOpus.cmake cmake/SndFileConfig.cmake.in \ + cmake/CheckCPUArch.cmake cmake/CheckCPUArch.c.in + +pkgconfig_DATA = sndfile.pc + +######## +# src/ # +######## +BUILT_SOURCES = src/test_endswap.c tests/write_read_test.c \ + tests/pcm_test.c tests/header_test.c tests/utils.c \ + tests/scale_clip_test.c tests/pipe_test.c tests/rdwr_test.c \ + tests/floating_point_test.c tests/benchmark.c +SYMBOL_FILES = src/Symbols.gnu-binutils src/Symbols.darwin src/libsndfile-1.def src/Symbols.os2 src/Symbols.static +@USE_WIN_VERSION_FILE_FALSE@WIN_VERSION_FILE = +@USE_WIN_VERSION_FILE_TRUE@WIN_VERSION_FILE = src/version-metadata.rc + +#=============================================================================== +lib_LTLIBRARIES = src/libsndfile.la +include_HEADERS = include/sndfile.hh +nodist_include_HEADERS = include/sndfile.h +src_libsndfile_la_CFLAGS = $(EXTERNAL_XIPH_CFLAGS) +# MinGW requires -no-undefined if a DLL is to be built. +src_libsndfile_la_LDFLAGS = -no-undefined -version-info $(SHARED_VERSION_INFO) $(SHLIB_VERSION_ARG) +src_libsndfile_la_SOURCES = src/sndfile.c src/aiff.c src/au.c src/avr.c src/caf.c src/dwd.c src/flac.c src/g72x.c src/htk.c src/ircam.c \ + src/macos.c src/mat4.c src/mat5.c src/nist.c src/paf.c src/pvf.c src/raw.c src/rx2.c src/sd2.c \ + src/sds.c src/svx.c src/txw.c src/voc.c src/wve.c src/w64.c src/wavlike.c src/wav.c src/xi.c src/mpc2k.c src/rf64.c \ + src/ogg_vorbis.c src/ogg_speex.c src/ogg_pcm.c src/ogg_opus.c src/ogg_vcomment.c \ + src/common.h src/sfconfig.h src/sfendian.h src/wavlike.h src/sf_unistd.h src/ogg.h src/chanmap.h src/ogg_vcomment.h + +nodist_src_libsndfile_la_SOURCES = $(nodist_include_HEADERS) +src_libsndfile_la_LIBADD = src/GSM610/libgsm.la src/G72x/libg72x.la src/ALAC/libalac.la \ + src/libcommon.la $(EXTERNAL_XIPH_LIBS) -lm + +EXTRA_src_libsndfile_la_DEPENDENCIES = $(SYMBOL_FILES) + +############## +# src/GSM610 # +############## + +############ +# src/G72x # +############ + +############ +# src/ALAC # +############ +noinst_LTLIBRARIES = src/libcommon.la src/GSM610/libgsm.la \ + src/G72x/libg72x.la src/ALAC/libalac.la $(am__append_2) +src_libcommon_la_CFLAGS = $(EXTERNAL_XIPH_CFLAGS) +src_libcommon_la_SOURCES = src/common.c src/file_io.c src/command.c src/pcm.c src/ulaw.c src/alaw.c \ + src/float32.c src/double64.c src/ima_adpcm.c src/ms_adpcm.c src/gsm610.c src/dwvw.c src/vox_adpcm.c \ + src/interleave.c src/strings.c src/dither.c src/cart.c src/broadcast.c src/audio_detect.c \ + src/ima_oki_adpcm.c src/ima_oki_adpcm.h src/alac.c src/chunk.c src/ogg.c src/chanmap.c \ + src/windows.c src/id3.c src/nms_adpcm.c $(WIN_VERSION_FILE) + +src_test_main_SOURCES = src/test_main.c src/test_main.h src/test_conversions.c src/test_float.c src/test_endswap.c \ + src/test_audio_detect.c src/test_log_printf.c src/test_file_io.c src/test_ima_oki_adpcm.c \ + src/test_strncpy_crlf.c src/test_broadcast_var.c src/test_cart_var.c \ + src/test_binheader_writef.c src/test_nms_adpcm.c + +src_test_main_LDADD = src/libcommon.la +src_GSM610_libgsm_la_SOURCES = src/GSM610/config.h src/GSM610/gsm.h src/GSM610/gsm610_priv.h \ + src/GSM610/add.c src/GSM610/code.c src/GSM610/decode.c src/GSM610/gsm_create.c \ + src/GSM610/gsm_decode.c src/GSM610/gsm_destroy.c src/GSM610/gsm_encode.c \ + src/GSM610/gsm_option.c src/GSM610/long_term.c src/GSM610/lpc.c src/GSM610/preprocess.c \ + src/GSM610/rpe.c src/GSM610/short_term.c src/GSM610/table.c + +src_G72x_libg72x_la_SOURCES = src/G72x/g72x.h src/G72x/g72x_priv.h \ + src/G72x/g721.c src/G72x/g723_16.c src/G72x/g723_24.c src/G72x/g723_40.c src/G72x/g72x.c + +src_G72x_g72x_test_SOURCES = src/G72x/g72x_test.c +src_G72x_g72x_test_LDADD = src/G72x/libg72x.la +src_ALAC_libalac_la_SOURCES = src/ALAC/ALACAudioTypes.h src/ALAC/ALACBitUtilities.h \ + src/ALAC/EndianPortable.h src/ALAC/aglib.h src/ALAC/dplib.h src/ALAC/matrixlib.h \ + src/ALAC/alac_codec.h src/ALAC/shift.h \ + src/ALAC/ALACBitUtilities.c src/ALAC/ag_dec.c \ + src/ALAC/ag_enc.c src/ALAC/dp_dec.c src/ALAC/dp_enc.c src/ALAC/matrix_dec.c \ + src/ALAC/matrix_enc.c src/ALAC/alac_decoder.c src/ALAC/alac_encoder.c + + +#=============================================================================== +# Generate an OS specific Symbols files. This is done when the author +# builds the distribution tarball. There should be not need for the +# end user to create these files. + +# "$<" cannot portably be used in the recipe across Make implementations +# https://www.gnu.org/software/autoconf/manual/autoconf.html#g_t_0024_003c-in-Ordinary-Make-Rules +SYMBOL_SCRIPT = $(top_srcdir)/src/create_symbols_file.py + +######## +# docs/ # +######## +@FULL_SUITE_TRUE@dist_doc_DATA = docs/index.md docs/libsndfile.jpg docs/libsndfile.css docs/print.css docs/api.md \ +@FULL_SUITE_TRUE@ docs/command.md docs/bugs.md docs/formats.md docs/sndfile_info.md docs/new_file_type_howto.md \ +@FULL_SUITE_TRUE@ docs/win32.md docs/FAQ.md docs/lists.md docs/embedded_files.md docs/octave.md \ +@FULL_SUITE_TRUE@ docs/tutorial.md + +examples_sndfile_to_text_SOURCES = examples/sndfile-to-text.c +examples_sndfile_to_text_LDADD = src/libsndfile.la +examples_sndfile_loopify_SOURCES = examples/sndfile-loopify.c +examples_sndfile_loopify_LDADD = src/libsndfile.la +examples_make_sine_SOURCES = examples/make_sine.c +examples_make_sine_LDADD = src/libsndfile.la +examples_sfprocess_SOURCES = examples/sfprocess.c +examples_sfprocess_LDADD = src/libsndfile.la +examples_list_formats_SOURCES = examples/list_formats.c +examples_list_formats_LDADD = src/libsndfile.la +examples_generate_SOURCES = examples/generate.c +examples_generate_LDADD = src/libsndfile.la +examples_sndfilehandle_SOURCES = examples/sndfilehandle.cc +examples_sndfilehandle_LDADD = src/libsndfile.la + +########## +# tests/ # +########## +TESTS_ENVIRONMENT = $(SHELL) tests/test_wrapper.sh +@ENABLE_TEST_COVERAGE_FALSE@CPP_TEST = tests/cpp_test +@ENABLE_TEST_COVERAGE_TRUE@CPP_TEST = +TESTS = tests/pedantic-header-test.sh + +#=============================================================================== +tests_sfversion_SOURCES = tests/sfversion.c +tests_sfversion_LDADD = src/libsndfile.la +tests_write_read_test_SOURCES = tests/utils.c tests/generate.c tests/generate.h tests/write_read_test.c tests/utils.h +tests_write_read_test_LDADD = src/libsndfile.la +tests_lossy_comp_test_SOURCES = tests/utils.c tests/lossy_comp_test.c tests/utils.h +tests_lossy_comp_test_LDADD = src/libsndfile.la +tests_fix_this_SOURCES = tests/utils.c tests/fix_this.c tests/utils.h +tests_fix_this_LDADD = src/libsndfile.la +tests_error_test_SOURCES = tests/error_test.c tests/utils.c tests/utils.h +tests_error_test_LDADD = src/libsndfile.la +tests_ulaw_test_SOURCES = tests/utils.c tests/ulaw_test.c tests/utils.h +tests_ulaw_test_LDADD = src/libsndfile.la +tests_alaw_test_SOURCES = tests/utils.c tests/alaw_test.c tests/utils.h +tests_alaw_test_LDADD = src/libsndfile.la +tests_aiff_rw_test_SOURCES = tests/utils.c tests/aiff_rw_test.c tests/utils.h +tests_aiff_rw_test_LDADD = src/libsndfile.la +tests_command_test_SOURCES = tests/command_test.c tests/utils.c tests/utils.h +tests_command_test_LDADD = src/libsndfile.la +tests_locale_test_SOURCES = tests/locale_test.c tests/utils.c tests/utils.h +tests_locale_test_LDADD = src/libsndfile.la +tests_largefile_test_SOURCES = tests/largefile_test.c tests/utils.c tests/utils.h +tests_largefile_test_LDADD = src/libsndfile.la +tests_pcm_test_SOURCES = tests/pcm_test.c tests/utils.c tests/utils.h +tests_pcm_test_LDADD = src/libsndfile.la +tests_headerless_test_SOURCES = tests/utils.c tests/headerless_test.c tests/utils.h +tests_headerless_test_LDADD = src/libsndfile.la +tests_stdin_test_SOURCES = tests/stdin_test.c tests/utils.c tests/utils.h +tests_stdin_test_LDADD = src/libsndfile.la +tests_stdout_test_SOURCES = tests/stdout_test.c tests/utils.h +tests_stdout_test_LDADD = src/libsndfile.la +tests_stdio_test_SOURCES = tests/stdio_test.c tests/utils.c tests/utils.h +tests_stdio_test_LDADD = src/libsndfile.la +tests_pipe_test_SOURCES = tests/pipe_test.c tests/utils.c tests/utils.h +tests_pipe_test_LDADD = src/libsndfile.la +tests_benchmark_SOURCES = tests/benchmark.c tests/utils.h +tests_benchmark_LDADD = src/libsndfile.la +tests_header_test_SOURCES = tests/header_test.c tests/utils.c tests/utils.h +tests_header_test_LDADD = src/libsndfile.la +tests_misc_test_SOURCES = tests/misc_test.c tests/utils.c tests/utils.h +tests_misc_test_LDADD = src/libsndfile.la +tests_raw_test_SOURCES = tests/raw_test.c tests/utils.c tests/utils.h +tests_raw_test_LDADD = src/libsndfile.la +tests_string_test_SOURCES = tests/string_test.c tests/utils.c tests/utils.h +tests_string_test_LDADD = src/libsndfile.la +tests_dither_test_SOURCES = tests/dither_test.c tests/utils.c tests/utils.h +tests_dither_test_LDADD = src/libsndfile.la +tests_chunk_test_SOURCES = tests/chunk_test.c tests/utils.c tests/utils.h +tests_chunk_test_LDADD = src/libsndfile.la +tests_multi_file_test_SOURCES = tests/multi_file_test.c tests/utils.c tests/utils.h +tests_multi_file_test_LDADD = src/libsndfile.la +tests_virtual_io_test_SOURCES = tests/virtual_io_test.c tests/utils.c tests/utils.h +tests_virtual_io_test_LDADD = src/libsndfile.la +tests_ogg_test_SOURCES = tests/ogg_test.c tests/utils.c tests/utils.h +tests_ogg_test_LDADD = src/libsndfile.la +tests_ogg_opus_test_SOURCES = tests/ogg_opus_test.c tests/utils.c tests/utils.h +tests_ogg_opus_test_LDADD = src/libsndfile.la +tests_compression_size_test_SOURCES = tests/compression_size_test.c tests/utils.c tests/utils.h tests/dft_cmp.h +tests_compression_size_test_LDADD = src/libsndfile.la +tests_rdwr_test_SOURCES = tests/rdwr_test.c tests/utils.c tests/utils.h +tests_rdwr_test_LDADD = src/libsndfile.la +tests_win32_test_SOURCES = tests/win32_test.c +# Link lib here so that generating the testsuite tarball works correctly. +tests_win32_test_LDADD = src/libsndfile.la +tests_win32_ordinal_test_SOURCES = tests/win32_ordinal_test.c tests/utils.c tests/utils.h +tests_win32_ordinal_test_LDADD = src/libsndfile.la +tests_external_libs_test_SOURCES = tests/external_libs_test.c tests/utils.c tests/utils.h +tests_external_libs_test_LDADD = src/libsndfile.la +tests_format_check_test_SOURCES = tests/format_check_test.c tests/utils.c tests/utils.h +tests_format_check_test_LDADD = src/libsndfile.la +tests_channel_test_SOURCES = tests/channel_test.c tests/utils.c tests/utils.h +tests_channel_test_LDADD = src/libsndfile.la +tests_long_read_write_test_SOURCES = tests/long_read_write_test.c tests/utils.c tests/utils.h tests/dft_cmp.h +tests_long_read_write_test_LDADD = src/libsndfile.la +tests_cpp_test_SOURCES = tests/cpp_test.cc tests/utils.c tests/utils.h +tests_cpp_test_LDADD = src/libsndfile.la +tests_checksum_test_SOURCES = tests/checksum_test.c tests/utils.c tests/utils.h +tests_checksum_test_LDADD = src/libsndfile.la + +# Lite remove start +tests_dwvw_test_SOURCES = tests/dwvw_test.c tests/utils.c tests/utils.h +tests_dwvw_test_LDADD = src/libsndfile.la +tests_floating_point_test_SOURCES = tests/utils.c tests/utils.h tests/dft_cmp.c tests/dft_cmp.h tests/floating_point_test.c +tests_floating_point_test_LDADD = src/libsndfile.la +tests_peak_chunk_test_SOURCES = tests/peak_chunk_test.c tests/utils.c tests/utils.h +tests_peak_chunk_test_LDADD = src/libsndfile.la +tests_scale_clip_test_SOURCES = tests/scale_clip_test.c tests/utils.c tests/utils.h +tests_scale_clip_test_LDADD = src/libsndfile.la +# Lite remove end + +#=============================================================================== +# Autogen generated sources. +# Coerce the multiple inputs -> multiple outputs problem +# into suffix rules by "linearising" the dependency graph. +# Yes, this sucks, but GNU make patterns aren't portable, +# see also https://github.com/libsndfile/libsndfile/issues/369 +SUFFIXES = .tpl .def + +######## +# man/ # +######## +@FULL_SUITE_TRUE@dist_man_MANS = man/sndfile-info.1 man/sndfile-play.1 man/sndfile-convert.1 man/sndfile-cmp.1 \ +@FULL_SUITE_TRUE@ man/sndfile-metadata-get.1 man/sndfile-metadata-set.1 man/sndfile-concat.1 \ +@FULL_SUITE_TRUE@ man/sndfile-interleave.1 man/sndfile-deinterleave.1 man/sndfile-salvage.1 + +@FULL_SUITE_TRUE@@USE_OSSFUZZ_FLAG_FALSE@@USE_OSSFUZZ_STATIC_FALSE@FUZZ_FLAG = +@FULL_SUITE_TRUE@@USE_OSSFUZZ_FLAG_FALSE@@USE_OSSFUZZ_STATIC_TRUE@FUZZ_FLAG = + +############ +# ossfuzz/ # +############ +@FULL_SUITE_TRUE@@USE_OSSFUZZ_FLAG_TRUE@FUZZ_FLAG = $(LIB_FUZZING_ENGINE) +@FULL_SUITE_TRUE@@USE_OSSFUZZ_FLAG_FALSE@@USE_OSSFUZZ_STATIC_FALSE@FUZZ_LDADD = libstandaloneengine.la +@FULL_SUITE_TRUE@@USE_OSSFUZZ_FLAG_FALSE@@USE_OSSFUZZ_STATIC_TRUE@FUZZ_LDADD = $(LIB_FUZZING_ENGINE) +@FULL_SUITE_TRUE@@USE_OSSFUZZ_FLAG_TRUE@FUZZ_LDADD = +@FULL_SUITE_TRUE@ossfuzz_sndfile_fuzzer_SOURCES = ossfuzz/sndfile_fuzzer.cc +@FULL_SUITE_TRUE@ossfuzz_sndfile_fuzzer_CXXFLAGS = $(AM_CXXFLAGS) $(FUZZ_FLAG) +@FULL_SUITE_TRUE@ossfuzz_sndfile_fuzzer_LDFLAGS = $(AM_LDFLAGS) -static +@FULL_SUITE_TRUE@ossfuzz_sndfile_fuzzer_LDADD = src/libsndfile.la $(FUZZ_LDADD) +@FULL_SUITE_TRUE@ossfuzz_libstandaloneengine_la_SOURCES = ossfuzz/standaloneengine.cc ossfuzz/testinput.h +@FULL_SUITE_TRUE@ossfuzz_libstandaloneengine_la_CXXFLAGS = $(AM_CXXFLAGS) +programs_sndfile_info_SOURCES = programs/sndfile-info.c programs/common.c programs/common.h +programs_sndfile_info_LDADD = src/libsndfile.la +programs_sndfile_play_SOURCES = programs/sndfile-play.c programs/common.c programs/common.h +programs_sndfile_play_LDADD = src/libsndfile.la $(OS_SPECIFIC_LINKS) $(ALSA_LIBS) $(SNDIO_LIBS) +programs_sndfile_convert_SOURCES = programs/sndfile-convert.c programs/common.c programs/common.h +programs_sndfile_convert_LDADD = src/libsndfile.la +programs_sndfile_cmp_SOURCES = programs/sndfile-cmp.c programs/common.c programs/common.h +programs_sndfile_cmp_LDADD = src/libsndfile.la +programs_sndfile_metadata_set_SOURCES = programs/sndfile-metadata-set.c programs/common.c programs/common.h +programs_sndfile_metadata_set_LDADD = src/libsndfile.la +programs_sndfile_metadata_get_SOURCES = programs/sndfile-metadata-get.c programs/common.c programs/common.h +programs_sndfile_metadata_get_LDADD = src/libsndfile.la +programs_sndfile_interleave_SOURCES = programs/sndfile-interleave.c programs/common.c programs/common.h +programs_sndfile_interleave_LDADD = src/libsndfile.la +programs_sndfile_deinterleave_SOURCES = programs/sndfile-deinterleave.c programs/common.c programs/common.h +programs_sndfile_deinterleave_LDADD = src/libsndfile.la +programs_sndfile_concat_SOURCES = programs/sndfile-concat.c programs/common.c programs/common.h +programs_sndfile_concat_LDADD = src/libsndfile.la +programs_sndfile_salvage_SOURCES = programs/sndfile-salvage.c programs/common.c programs/common.h +programs_sndfile_salvage_LDADD = src/libsndfile.la +regtest_sndfile_regtest_SOURCES = regtest/regtest.h regtest/sndfile-regtest.c regtest/database.c regtest/checksum.c +regtest_sndfile_CPPFLAGS = -I$(top_srcdir)/src $(SQLITE3_CFLAGS) $(OS_SPECIFIC_CFLAGS) +regtest_sndfile_regtest_LDADD = src/libsndfile.la $(SQLITE3_LIBS) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .tpl .def .c .cc .lo .o .obj .rc +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +src/config.h: src/stamp-h1 + @test -f $@ || rm -f src/stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) src/stamp-h1 + +src/stamp-h1: $(top_srcdir)/src/config.h.in $(top_builddir)/config.status + @rm -f src/stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status src/config.h +$(top_srcdir)/src/config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f src/stamp-h1 + touch $@ + +distclean-hdr: + -rm -f src/config.h src/stamp-h1 +src/version-metadata.rc: $(top_builddir)/config.status $(top_srcdir)/src/version-metadata.rc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +include/sndfile.h: $(top_builddir)/config.status $(top_srcdir)/include/sndfile.h.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +tests/test_wrapper.sh: $(top_builddir)/config.status $(top_srcdir)/tests/test_wrapper.sh.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +tests/pedantic-header-test.sh: $(top_builddir)/config.status $(top_srcdir)/tests/pedantic-header-test.sh.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +libsndfile.spec: $(top_builddir)/config.status $(srcdir)/libsndfile.spec.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sndfile.pc: $(top_builddir)/config.status $(srcdir)/sndfile.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +Scripts/build-test-tarball.mk: $(top_builddir)/config.status $(top_srcdir)/Scripts/build-test-tarball.mk.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } +ossfuzz/$(am__dirstamp): + @$(MKDIR_P) ossfuzz + @: > ossfuzz/$(am__dirstamp) +ossfuzz/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ossfuzz/$(DEPDIR) + @: > ossfuzz/$(DEPDIR)/$(am__dirstamp) +ossfuzz/libstandaloneengine_la-standaloneengine.lo: \ + ossfuzz/$(am__dirstamp) ossfuzz/$(DEPDIR)/$(am__dirstamp) + +ossfuzz/libstandaloneengine.la: $(ossfuzz_libstandaloneengine_la_OBJECTS) $(ossfuzz_libstandaloneengine_la_DEPENDENCIES) $(EXTRA_ossfuzz_libstandaloneengine_la_DEPENDENCIES) ossfuzz/$(am__dirstamp) + $(AM_V_CXXLD)$(ossfuzz_libstandaloneengine_la_LINK) $(am_ossfuzz_libstandaloneengine_la_rpath) $(ossfuzz_libstandaloneengine_la_OBJECTS) $(ossfuzz_libstandaloneengine_la_LIBADD) $(LIBS) +src/ALAC/$(am__dirstamp): + @$(MKDIR_P) src/ALAC + @: > src/ALAC/$(am__dirstamp) +src/ALAC/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/ALAC/$(DEPDIR) + @: > src/ALAC/$(DEPDIR)/$(am__dirstamp) +src/ALAC/ALACBitUtilities.lo: src/ALAC/$(am__dirstamp) \ + src/ALAC/$(DEPDIR)/$(am__dirstamp) +src/ALAC/ag_dec.lo: src/ALAC/$(am__dirstamp) \ + src/ALAC/$(DEPDIR)/$(am__dirstamp) +src/ALAC/ag_enc.lo: src/ALAC/$(am__dirstamp) \ + src/ALAC/$(DEPDIR)/$(am__dirstamp) +src/ALAC/dp_dec.lo: src/ALAC/$(am__dirstamp) \ + src/ALAC/$(DEPDIR)/$(am__dirstamp) +src/ALAC/dp_enc.lo: src/ALAC/$(am__dirstamp) \ + src/ALAC/$(DEPDIR)/$(am__dirstamp) +src/ALAC/matrix_dec.lo: src/ALAC/$(am__dirstamp) \ + src/ALAC/$(DEPDIR)/$(am__dirstamp) +src/ALAC/matrix_enc.lo: src/ALAC/$(am__dirstamp) \ + src/ALAC/$(DEPDIR)/$(am__dirstamp) +src/ALAC/alac_decoder.lo: src/ALAC/$(am__dirstamp) \ + src/ALAC/$(DEPDIR)/$(am__dirstamp) +src/ALAC/alac_encoder.lo: src/ALAC/$(am__dirstamp) \ + src/ALAC/$(DEPDIR)/$(am__dirstamp) + +src/ALAC/libalac.la: $(src_ALAC_libalac_la_OBJECTS) $(src_ALAC_libalac_la_DEPENDENCIES) $(EXTRA_src_ALAC_libalac_la_DEPENDENCIES) src/ALAC/$(am__dirstamp) + $(AM_V_CCLD)$(LINK) $(src_ALAC_libalac_la_OBJECTS) $(src_ALAC_libalac_la_LIBADD) $(LIBS) +src/G72x/$(am__dirstamp): + @$(MKDIR_P) src/G72x + @: > src/G72x/$(am__dirstamp) +src/G72x/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/G72x/$(DEPDIR) + @: > src/G72x/$(DEPDIR)/$(am__dirstamp) +src/G72x/g721.lo: src/G72x/$(am__dirstamp) \ + src/G72x/$(DEPDIR)/$(am__dirstamp) +src/G72x/g723_16.lo: src/G72x/$(am__dirstamp) \ + src/G72x/$(DEPDIR)/$(am__dirstamp) +src/G72x/g723_24.lo: src/G72x/$(am__dirstamp) \ + src/G72x/$(DEPDIR)/$(am__dirstamp) +src/G72x/g723_40.lo: src/G72x/$(am__dirstamp) \ + src/G72x/$(DEPDIR)/$(am__dirstamp) +src/G72x/g72x.lo: src/G72x/$(am__dirstamp) \ + src/G72x/$(DEPDIR)/$(am__dirstamp) + +src/G72x/libg72x.la: $(src_G72x_libg72x_la_OBJECTS) $(src_G72x_libg72x_la_DEPENDENCIES) $(EXTRA_src_G72x_libg72x_la_DEPENDENCIES) src/G72x/$(am__dirstamp) + $(AM_V_CCLD)$(LINK) $(src_G72x_libg72x_la_OBJECTS) $(src_G72x_libg72x_la_LIBADD) $(LIBS) +src/GSM610/$(am__dirstamp): + @$(MKDIR_P) src/GSM610 + @: > src/GSM610/$(am__dirstamp) +src/GSM610/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/GSM610/$(DEPDIR) + @: > src/GSM610/$(DEPDIR)/$(am__dirstamp) +src/GSM610/add.lo: src/GSM610/$(am__dirstamp) \ + src/GSM610/$(DEPDIR)/$(am__dirstamp) +src/GSM610/code.lo: src/GSM610/$(am__dirstamp) \ + src/GSM610/$(DEPDIR)/$(am__dirstamp) +src/GSM610/decode.lo: src/GSM610/$(am__dirstamp) \ + src/GSM610/$(DEPDIR)/$(am__dirstamp) +src/GSM610/gsm_create.lo: src/GSM610/$(am__dirstamp) \ + src/GSM610/$(DEPDIR)/$(am__dirstamp) +src/GSM610/gsm_decode.lo: src/GSM610/$(am__dirstamp) \ + src/GSM610/$(DEPDIR)/$(am__dirstamp) +src/GSM610/gsm_destroy.lo: src/GSM610/$(am__dirstamp) \ + src/GSM610/$(DEPDIR)/$(am__dirstamp) +src/GSM610/gsm_encode.lo: src/GSM610/$(am__dirstamp) \ + src/GSM610/$(DEPDIR)/$(am__dirstamp) +src/GSM610/gsm_option.lo: src/GSM610/$(am__dirstamp) \ + src/GSM610/$(DEPDIR)/$(am__dirstamp) +src/GSM610/long_term.lo: src/GSM610/$(am__dirstamp) \ + src/GSM610/$(DEPDIR)/$(am__dirstamp) +src/GSM610/lpc.lo: src/GSM610/$(am__dirstamp) \ + src/GSM610/$(DEPDIR)/$(am__dirstamp) +src/GSM610/preprocess.lo: src/GSM610/$(am__dirstamp) \ + src/GSM610/$(DEPDIR)/$(am__dirstamp) +src/GSM610/rpe.lo: src/GSM610/$(am__dirstamp) \ + src/GSM610/$(DEPDIR)/$(am__dirstamp) +src/GSM610/short_term.lo: src/GSM610/$(am__dirstamp) \ + src/GSM610/$(DEPDIR)/$(am__dirstamp) +src/GSM610/table.lo: src/GSM610/$(am__dirstamp) \ + src/GSM610/$(DEPDIR)/$(am__dirstamp) + +src/GSM610/libgsm.la: $(src_GSM610_libgsm_la_OBJECTS) $(src_GSM610_libgsm_la_DEPENDENCIES) $(EXTRA_src_GSM610_libgsm_la_DEPENDENCIES) src/GSM610/$(am__dirstamp) + $(AM_V_CCLD)$(LINK) $(src_GSM610_libgsm_la_OBJECTS) $(src_GSM610_libgsm_la_LIBADD) $(LIBS) +src/$(am__dirstamp): + @$(MKDIR_P) src + @: > src/$(am__dirstamp) +src/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/$(DEPDIR) + @: > src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-common.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-file_io.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-command.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-pcm.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-ulaw.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-alaw.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-float32.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-double64.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-ima_adpcm.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-ms_adpcm.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-gsm610.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-dwvw.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-vox_adpcm.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-interleave.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-strings.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-dither.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-cart.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-broadcast.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-audio_detect.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-ima_oki_adpcm.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-alac.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-chunk.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-ogg.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-chanmap.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-windows.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-id3.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libcommon_la-nms_adpcm.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/version-metadata.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) + +src/libcommon.la: $(src_libcommon_la_OBJECTS) $(src_libcommon_la_DEPENDENCIES) $(EXTRA_src_libcommon_la_DEPENDENCIES) src/$(am__dirstamp) + $(AM_V_CCLD)$(src_libcommon_la_LINK) $(src_libcommon_la_OBJECTS) $(src_libcommon_la_LIBADD) $(LIBS) +src/libsndfile_la-sndfile.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-aiff.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-au.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-avr.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-caf.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-dwd.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-flac.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-g72x.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-htk.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-ircam.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-macos.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-mat4.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-mat5.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-nist.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-paf.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-pvf.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-raw.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-rx2.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-sd2.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-sds.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-svx.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-txw.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-voc.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-wve.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-w64.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-wavlike.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-wav.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-xi.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-mpc2k.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-rf64.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-ogg_vorbis.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-ogg_speex.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-ogg_pcm.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-ogg_opus.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/libsndfile_la-ogg_vcomment.lo: src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) + +src/libsndfile.la: $(src_libsndfile_la_OBJECTS) $(src_libsndfile_la_DEPENDENCIES) $(EXTRA_src_libsndfile_la_DEPENDENCIES) src/$(am__dirstamp) + $(AM_V_CCLD)$(src_libsndfile_la_LINK) -rpath $(libdir) $(src_libsndfile_la_OBJECTS) $(src_libsndfile_la_LIBADD) $(LIBS) +examples/$(am__dirstamp): + @$(MKDIR_P) examples + @: > examples/$(am__dirstamp) +examples/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) examples/$(DEPDIR) + @: > examples/$(DEPDIR)/$(am__dirstamp) +examples/generate.$(OBJEXT): examples/$(am__dirstamp) \ + examples/$(DEPDIR)/$(am__dirstamp) + +examples/generate$(EXEEXT): $(examples_generate_OBJECTS) $(examples_generate_DEPENDENCIES) $(EXTRA_examples_generate_DEPENDENCIES) examples/$(am__dirstamp) + @rm -f examples/generate$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(examples_generate_OBJECTS) $(examples_generate_LDADD) $(LIBS) +examples/list_formats.$(OBJEXT): examples/$(am__dirstamp) \ + examples/$(DEPDIR)/$(am__dirstamp) + +examples/list_formats$(EXEEXT): $(examples_list_formats_OBJECTS) $(examples_list_formats_DEPENDENCIES) $(EXTRA_examples_list_formats_DEPENDENCIES) examples/$(am__dirstamp) + @rm -f examples/list_formats$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(examples_list_formats_OBJECTS) $(examples_list_formats_LDADD) $(LIBS) +examples/make_sine.$(OBJEXT): examples/$(am__dirstamp) \ + examples/$(DEPDIR)/$(am__dirstamp) + +examples/make_sine$(EXEEXT): $(examples_make_sine_OBJECTS) $(examples_make_sine_DEPENDENCIES) $(EXTRA_examples_make_sine_DEPENDENCIES) examples/$(am__dirstamp) + @rm -f examples/make_sine$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(examples_make_sine_OBJECTS) $(examples_make_sine_LDADD) $(LIBS) +examples/sfprocess.$(OBJEXT): examples/$(am__dirstamp) \ + examples/$(DEPDIR)/$(am__dirstamp) + +examples/sfprocess$(EXEEXT): $(examples_sfprocess_OBJECTS) $(examples_sfprocess_DEPENDENCIES) $(EXTRA_examples_sfprocess_DEPENDENCIES) examples/$(am__dirstamp) + @rm -f examples/sfprocess$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(examples_sfprocess_OBJECTS) $(examples_sfprocess_LDADD) $(LIBS) +examples/sndfile-loopify.$(OBJEXT): examples/$(am__dirstamp) \ + examples/$(DEPDIR)/$(am__dirstamp) + +examples/sndfile-loopify$(EXEEXT): $(examples_sndfile_loopify_OBJECTS) $(examples_sndfile_loopify_DEPENDENCIES) $(EXTRA_examples_sndfile_loopify_DEPENDENCIES) examples/$(am__dirstamp) + @rm -f examples/sndfile-loopify$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(examples_sndfile_loopify_OBJECTS) $(examples_sndfile_loopify_LDADD) $(LIBS) +examples/sndfile-to-text.$(OBJEXT): examples/$(am__dirstamp) \ + examples/$(DEPDIR)/$(am__dirstamp) + +examples/sndfile-to-text$(EXEEXT): $(examples_sndfile_to_text_OBJECTS) $(examples_sndfile_to_text_DEPENDENCIES) $(EXTRA_examples_sndfile_to_text_DEPENDENCIES) examples/$(am__dirstamp) + @rm -f examples/sndfile-to-text$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(examples_sndfile_to_text_OBJECTS) $(examples_sndfile_to_text_LDADD) $(LIBS) +examples/sndfilehandle.$(OBJEXT): examples/$(am__dirstamp) \ + examples/$(DEPDIR)/$(am__dirstamp) + +examples/sndfilehandle$(EXEEXT): $(examples_sndfilehandle_OBJECTS) $(examples_sndfilehandle_DEPENDENCIES) $(EXTRA_examples_sndfilehandle_DEPENDENCIES) examples/$(am__dirstamp) + @rm -f examples/sndfilehandle$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(examples_sndfilehandle_OBJECTS) $(examples_sndfilehandle_LDADD) $(LIBS) +ossfuzz/sndfile_fuzzer-sndfile_fuzzer.$(OBJEXT): \ + ossfuzz/$(am__dirstamp) ossfuzz/$(DEPDIR)/$(am__dirstamp) + +ossfuzz/sndfile_fuzzer$(EXEEXT): $(ossfuzz_sndfile_fuzzer_OBJECTS) $(ossfuzz_sndfile_fuzzer_DEPENDENCIES) $(EXTRA_ossfuzz_sndfile_fuzzer_DEPENDENCIES) ossfuzz/$(am__dirstamp) + @rm -f ossfuzz/sndfile_fuzzer$(EXEEXT) + $(AM_V_CXXLD)$(ossfuzz_sndfile_fuzzer_LINK) $(ossfuzz_sndfile_fuzzer_OBJECTS) $(ossfuzz_sndfile_fuzzer_LDADD) $(LIBS) +programs/$(am__dirstamp): + @$(MKDIR_P) programs + @: > programs/$(am__dirstamp) +programs/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) programs/$(DEPDIR) + @: > programs/$(DEPDIR)/$(am__dirstamp) +programs/sndfile-cmp.$(OBJEXT): programs/$(am__dirstamp) \ + programs/$(DEPDIR)/$(am__dirstamp) +programs/common.$(OBJEXT): programs/$(am__dirstamp) \ + programs/$(DEPDIR)/$(am__dirstamp) + +programs/sndfile-cmp$(EXEEXT): $(programs_sndfile_cmp_OBJECTS) $(programs_sndfile_cmp_DEPENDENCIES) $(EXTRA_programs_sndfile_cmp_DEPENDENCIES) programs/$(am__dirstamp) + @rm -f programs/sndfile-cmp$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(programs_sndfile_cmp_OBJECTS) $(programs_sndfile_cmp_LDADD) $(LIBS) +programs/sndfile-concat.$(OBJEXT): programs/$(am__dirstamp) \ + programs/$(DEPDIR)/$(am__dirstamp) + +programs/sndfile-concat$(EXEEXT): $(programs_sndfile_concat_OBJECTS) $(programs_sndfile_concat_DEPENDENCIES) $(EXTRA_programs_sndfile_concat_DEPENDENCIES) programs/$(am__dirstamp) + @rm -f programs/sndfile-concat$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(programs_sndfile_concat_OBJECTS) $(programs_sndfile_concat_LDADD) $(LIBS) +programs/sndfile-convert.$(OBJEXT): programs/$(am__dirstamp) \ + programs/$(DEPDIR)/$(am__dirstamp) + +programs/sndfile-convert$(EXEEXT): $(programs_sndfile_convert_OBJECTS) $(programs_sndfile_convert_DEPENDENCIES) $(EXTRA_programs_sndfile_convert_DEPENDENCIES) programs/$(am__dirstamp) + @rm -f programs/sndfile-convert$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(programs_sndfile_convert_OBJECTS) $(programs_sndfile_convert_LDADD) $(LIBS) +programs/sndfile-deinterleave.$(OBJEXT): programs/$(am__dirstamp) \ + programs/$(DEPDIR)/$(am__dirstamp) + +programs/sndfile-deinterleave$(EXEEXT): $(programs_sndfile_deinterleave_OBJECTS) $(programs_sndfile_deinterleave_DEPENDENCIES) $(EXTRA_programs_sndfile_deinterleave_DEPENDENCIES) programs/$(am__dirstamp) + @rm -f programs/sndfile-deinterleave$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(programs_sndfile_deinterleave_OBJECTS) $(programs_sndfile_deinterleave_LDADD) $(LIBS) +programs/sndfile-info.$(OBJEXT): programs/$(am__dirstamp) \ + programs/$(DEPDIR)/$(am__dirstamp) + +programs/sndfile-info$(EXEEXT): $(programs_sndfile_info_OBJECTS) $(programs_sndfile_info_DEPENDENCIES) $(EXTRA_programs_sndfile_info_DEPENDENCIES) programs/$(am__dirstamp) + @rm -f programs/sndfile-info$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(programs_sndfile_info_OBJECTS) $(programs_sndfile_info_LDADD) $(LIBS) +programs/sndfile-interleave.$(OBJEXT): programs/$(am__dirstamp) \ + programs/$(DEPDIR)/$(am__dirstamp) + +programs/sndfile-interleave$(EXEEXT): $(programs_sndfile_interleave_OBJECTS) $(programs_sndfile_interleave_DEPENDENCIES) $(EXTRA_programs_sndfile_interleave_DEPENDENCIES) programs/$(am__dirstamp) + @rm -f programs/sndfile-interleave$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(programs_sndfile_interleave_OBJECTS) $(programs_sndfile_interleave_LDADD) $(LIBS) +programs/sndfile-metadata-get.$(OBJEXT): programs/$(am__dirstamp) \ + programs/$(DEPDIR)/$(am__dirstamp) + +programs/sndfile-metadata-get$(EXEEXT): $(programs_sndfile_metadata_get_OBJECTS) $(programs_sndfile_metadata_get_DEPENDENCIES) $(EXTRA_programs_sndfile_metadata_get_DEPENDENCIES) programs/$(am__dirstamp) + @rm -f programs/sndfile-metadata-get$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(programs_sndfile_metadata_get_OBJECTS) $(programs_sndfile_metadata_get_LDADD) $(LIBS) +programs/sndfile-metadata-set.$(OBJEXT): programs/$(am__dirstamp) \ + programs/$(DEPDIR)/$(am__dirstamp) + +programs/sndfile-metadata-set$(EXEEXT): $(programs_sndfile_metadata_set_OBJECTS) $(programs_sndfile_metadata_set_DEPENDENCIES) $(EXTRA_programs_sndfile_metadata_set_DEPENDENCIES) programs/$(am__dirstamp) + @rm -f programs/sndfile-metadata-set$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(programs_sndfile_metadata_set_OBJECTS) $(programs_sndfile_metadata_set_LDADD) $(LIBS) +programs/sndfile-play.$(OBJEXT): programs/$(am__dirstamp) \ + programs/$(DEPDIR)/$(am__dirstamp) + +programs/sndfile-play$(EXEEXT): $(programs_sndfile_play_OBJECTS) $(programs_sndfile_play_DEPENDENCIES) $(EXTRA_programs_sndfile_play_DEPENDENCIES) programs/$(am__dirstamp) + @rm -f programs/sndfile-play$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(programs_sndfile_play_OBJECTS) $(programs_sndfile_play_LDADD) $(LIBS) +programs/sndfile-salvage.$(OBJEXT): programs/$(am__dirstamp) \ + programs/$(DEPDIR)/$(am__dirstamp) + +programs/sndfile-salvage$(EXEEXT): $(programs_sndfile_salvage_OBJECTS) $(programs_sndfile_salvage_DEPENDENCIES) $(EXTRA_programs_sndfile_salvage_DEPENDENCIES) programs/$(am__dirstamp) + @rm -f programs/sndfile-salvage$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(programs_sndfile_salvage_OBJECTS) $(programs_sndfile_salvage_LDADD) $(LIBS) +regtest/$(am__dirstamp): + @$(MKDIR_P) regtest + @: > regtest/$(am__dirstamp) +regtest/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) regtest/$(DEPDIR) + @: > regtest/$(DEPDIR)/$(am__dirstamp) +regtest/sndfile-regtest.$(OBJEXT): regtest/$(am__dirstamp) \ + regtest/$(DEPDIR)/$(am__dirstamp) +regtest/database.$(OBJEXT): regtest/$(am__dirstamp) \ + regtest/$(DEPDIR)/$(am__dirstamp) +regtest/checksum.$(OBJEXT): regtest/$(am__dirstamp) \ + regtest/$(DEPDIR)/$(am__dirstamp) + +regtest/sndfile-regtest$(EXEEXT): $(regtest_sndfile_regtest_OBJECTS) $(regtest_sndfile_regtest_DEPENDENCIES) $(EXTRA_regtest_sndfile_regtest_DEPENDENCIES) regtest/$(am__dirstamp) + @rm -f regtest/sndfile-regtest$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(regtest_sndfile_regtest_OBJECTS) $(regtest_sndfile_regtest_LDADD) $(LIBS) +src/G72x/g72x_test.$(OBJEXT): src/G72x/$(am__dirstamp) \ + src/G72x/$(DEPDIR)/$(am__dirstamp) + +src/G72x/g72x_test$(EXEEXT): $(src_G72x_g72x_test_OBJECTS) $(src_G72x_g72x_test_DEPENDENCIES) $(EXTRA_src_G72x_g72x_test_DEPENDENCIES) src/G72x/$(am__dirstamp) + @rm -f src/G72x/g72x_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(src_G72x_g72x_test_OBJECTS) $(src_G72x_g72x_test_LDADD) $(LIBS) +src/test_main.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/test_conversions.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/test_float.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/test_endswap.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/test_audio_detect.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/test_log_printf.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/test_file_io.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/test_ima_oki_adpcm.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/test_strncpy_crlf.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/test_broadcast_var.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/test_cart_var.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/test_binheader_writef.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/test_nms_adpcm.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) + +src/test_main$(EXEEXT): $(src_test_main_OBJECTS) $(src_test_main_DEPENDENCIES) $(EXTRA_src_test_main_DEPENDENCIES) src/$(am__dirstamp) + @rm -f src/test_main$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(src_test_main_OBJECTS) $(src_test_main_LDADD) $(LIBS) +tests/$(am__dirstamp): + @$(MKDIR_P) tests + @: > tests/$(am__dirstamp) +tests/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) tests/$(DEPDIR) + @: > tests/$(DEPDIR)/$(am__dirstamp) +tests/utils.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) +tests/aiff_rw_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/aiff_rw_test$(EXEEXT): $(tests_aiff_rw_test_OBJECTS) $(tests_aiff_rw_test_DEPENDENCIES) $(EXTRA_tests_aiff_rw_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/aiff_rw_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_aiff_rw_test_OBJECTS) $(tests_aiff_rw_test_LDADD) $(LIBS) +tests/alaw_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/alaw_test$(EXEEXT): $(tests_alaw_test_OBJECTS) $(tests_alaw_test_DEPENDENCIES) $(EXTRA_tests_alaw_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/alaw_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_alaw_test_OBJECTS) $(tests_alaw_test_LDADD) $(LIBS) +tests/benchmark.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/benchmark$(EXEEXT): $(tests_benchmark_OBJECTS) $(tests_benchmark_DEPENDENCIES) $(EXTRA_tests_benchmark_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/benchmark$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_benchmark_OBJECTS) $(tests_benchmark_LDADD) $(LIBS) +tests/channel_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/channel_test$(EXEEXT): $(tests_channel_test_OBJECTS) $(tests_channel_test_DEPENDENCIES) $(EXTRA_tests_channel_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/channel_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_channel_test_OBJECTS) $(tests_channel_test_LDADD) $(LIBS) +tests/checksum_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/checksum_test$(EXEEXT): $(tests_checksum_test_OBJECTS) $(tests_checksum_test_DEPENDENCIES) $(EXTRA_tests_checksum_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/checksum_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_checksum_test_OBJECTS) $(tests_checksum_test_LDADD) $(LIBS) +tests/chunk_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/chunk_test$(EXEEXT): $(tests_chunk_test_OBJECTS) $(tests_chunk_test_DEPENDENCIES) $(EXTRA_tests_chunk_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/chunk_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_chunk_test_OBJECTS) $(tests_chunk_test_LDADD) $(LIBS) +tests/command_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/command_test$(EXEEXT): $(tests_command_test_OBJECTS) $(tests_command_test_DEPENDENCIES) $(EXTRA_tests_command_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/command_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_command_test_OBJECTS) $(tests_command_test_LDADD) $(LIBS) +tests/compression_size_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/compression_size_test$(EXEEXT): $(tests_compression_size_test_OBJECTS) $(tests_compression_size_test_DEPENDENCIES) $(EXTRA_tests_compression_size_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/compression_size_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_compression_size_test_OBJECTS) $(tests_compression_size_test_LDADD) $(LIBS) +tests/cpp_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/cpp_test$(EXEEXT): $(tests_cpp_test_OBJECTS) $(tests_cpp_test_DEPENDENCIES) $(EXTRA_tests_cpp_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/cpp_test$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(tests_cpp_test_OBJECTS) $(tests_cpp_test_LDADD) $(LIBS) +tests/dither_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/dither_test$(EXEEXT): $(tests_dither_test_OBJECTS) $(tests_dither_test_DEPENDENCIES) $(EXTRA_tests_dither_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/dither_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_dither_test_OBJECTS) $(tests_dither_test_LDADD) $(LIBS) +tests/dwvw_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/dwvw_test$(EXEEXT): $(tests_dwvw_test_OBJECTS) $(tests_dwvw_test_DEPENDENCIES) $(EXTRA_tests_dwvw_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/dwvw_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_dwvw_test_OBJECTS) $(tests_dwvw_test_LDADD) $(LIBS) +tests/error_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/error_test$(EXEEXT): $(tests_error_test_OBJECTS) $(tests_error_test_DEPENDENCIES) $(EXTRA_tests_error_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/error_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_error_test_OBJECTS) $(tests_error_test_LDADD) $(LIBS) +tests/external_libs_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/external_libs_test$(EXEEXT): $(tests_external_libs_test_OBJECTS) $(tests_external_libs_test_DEPENDENCIES) $(EXTRA_tests_external_libs_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/external_libs_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_external_libs_test_OBJECTS) $(tests_external_libs_test_LDADD) $(LIBS) +tests/fix_this.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/fix_this$(EXEEXT): $(tests_fix_this_OBJECTS) $(tests_fix_this_DEPENDENCIES) $(EXTRA_tests_fix_this_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/fix_this$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_fix_this_OBJECTS) $(tests_fix_this_LDADD) $(LIBS) +tests/dft_cmp.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) +tests/floating_point_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/floating_point_test$(EXEEXT): $(tests_floating_point_test_OBJECTS) $(tests_floating_point_test_DEPENDENCIES) $(EXTRA_tests_floating_point_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/floating_point_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_floating_point_test_OBJECTS) $(tests_floating_point_test_LDADD) $(LIBS) +tests/format_check_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/format_check_test$(EXEEXT): $(tests_format_check_test_OBJECTS) $(tests_format_check_test_DEPENDENCIES) $(EXTRA_tests_format_check_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/format_check_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_format_check_test_OBJECTS) $(tests_format_check_test_LDADD) $(LIBS) +tests/header_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/header_test$(EXEEXT): $(tests_header_test_OBJECTS) $(tests_header_test_DEPENDENCIES) $(EXTRA_tests_header_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/header_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_header_test_OBJECTS) $(tests_header_test_LDADD) $(LIBS) +tests/headerless_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/headerless_test$(EXEEXT): $(tests_headerless_test_OBJECTS) $(tests_headerless_test_DEPENDENCIES) $(EXTRA_tests_headerless_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/headerless_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_headerless_test_OBJECTS) $(tests_headerless_test_LDADD) $(LIBS) +tests/largefile_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/largefile_test$(EXEEXT): $(tests_largefile_test_OBJECTS) $(tests_largefile_test_DEPENDENCIES) $(EXTRA_tests_largefile_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/largefile_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_largefile_test_OBJECTS) $(tests_largefile_test_LDADD) $(LIBS) +tests/locale_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/locale_test$(EXEEXT): $(tests_locale_test_OBJECTS) $(tests_locale_test_DEPENDENCIES) $(EXTRA_tests_locale_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/locale_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_locale_test_OBJECTS) $(tests_locale_test_LDADD) $(LIBS) +tests/long_read_write_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/long_read_write_test$(EXEEXT): $(tests_long_read_write_test_OBJECTS) $(tests_long_read_write_test_DEPENDENCIES) $(EXTRA_tests_long_read_write_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/long_read_write_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_long_read_write_test_OBJECTS) $(tests_long_read_write_test_LDADD) $(LIBS) +tests/lossy_comp_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/lossy_comp_test$(EXEEXT): $(tests_lossy_comp_test_OBJECTS) $(tests_lossy_comp_test_DEPENDENCIES) $(EXTRA_tests_lossy_comp_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/lossy_comp_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_lossy_comp_test_OBJECTS) $(tests_lossy_comp_test_LDADD) $(LIBS) +tests/misc_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/misc_test$(EXEEXT): $(tests_misc_test_OBJECTS) $(tests_misc_test_DEPENDENCIES) $(EXTRA_tests_misc_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/misc_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_misc_test_OBJECTS) $(tests_misc_test_LDADD) $(LIBS) +tests/multi_file_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/multi_file_test$(EXEEXT): $(tests_multi_file_test_OBJECTS) $(tests_multi_file_test_DEPENDENCIES) $(EXTRA_tests_multi_file_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/multi_file_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_multi_file_test_OBJECTS) $(tests_multi_file_test_LDADD) $(LIBS) +tests/ogg_opus_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/ogg_opus_test$(EXEEXT): $(tests_ogg_opus_test_OBJECTS) $(tests_ogg_opus_test_DEPENDENCIES) $(EXTRA_tests_ogg_opus_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/ogg_opus_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_ogg_opus_test_OBJECTS) $(tests_ogg_opus_test_LDADD) $(LIBS) +tests/ogg_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/ogg_test$(EXEEXT): $(tests_ogg_test_OBJECTS) $(tests_ogg_test_DEPENDENCIES) $(EXTRA_tests_ogg_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/ogg_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_ogg_test_OBJECTS) $(tests_ogg_test_LDADD) $(LIBS) +tests/pcm_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/pcm_test$(EXEEXT): $(tests_pcm_test_OBJECTS) $(tests_pcm_test_DEPENDENCIES) $(EXTRA_tests_pcm_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/pcm_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_pcm_test_OBJECTS) $(tests_pcm_test_LDADD) $(LIBS) +tests/peak_chunk_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/peak_chunk_test$(EXEEXT): $(tests_peak_chunk_test_OBJECTS) $(tests_peak_chunk_test_DEPENDENCIES) $(EXTRA_tests_peak_chunk_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/peak_chunk_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_peak_chunk_test_OBJECTS) $(tests_peak_chunk_test_LDADD) $(LIBS) +tests/pipe_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/pipe_test$(EXEEXT): $(tests_pipe_test_OBJECTS) $(tests_pipe_test_DEPENDENCIES) $(EXTRA_tests_pipe_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/pipe_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_pipe_test_OBJECTS) $(tests_pipe_test_LDADD) $(LIBS) +tests/raw_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/raw_test$(EXEEXT): $(tests_raw_test_OBJECTS) $(tests_raw_test_DEPENDENCIES) $(EXTRA_tests_raw_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/raw_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_raw_test_OBJECTS) $(tests_raw_test_LDADD) $(LIBS) +tests/rdwr_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/rdwr_test$(EXEEXT): $(tests_rdwr_test_OBJECTS) $(tests_rdwr_test_DEPENDENCIES) $(EXTRA_tests_rdwr_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/rdwr_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_rdwr_test_OBJECTS) $(tests_rdwr_test_LDADD) $(LIBS) +tests/scale_clip_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/scale_clip_test$(EXEEXT): $(tests_scale_clip_test_OBJECTS) $(tests_scale_clip_test_DEPENDENCIES) $(EXTRA_tests_scale_clip_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/scale_clip_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_scale_clip_test_OBJECTS) $(tests_scale_clip_test_LDADD) $(LIBS) +tests/sfversion.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/sfversion$(EXEEXT): $(tests_sfversion_OBJECTS) $(tests_sfversion_DEPENDENCIES) $(EXTRA_tests_sfversion_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/sfversion$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_sfversion_OBJECTS) $(tests_sfversion_LDADD) $(LIBS) +tests/stdin_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/stdin_test$(EXEEXT): $(tests_stdin_test_OBJECTS) $(tests_stdin_test_DEPENDENCIES) $(EXTRA_tests_stdin_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/stdin_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_stdin_test_OBJECTS) $(tests_stdin_test_LDADD) $(LIBS) +tests/stdio_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/stdio_test$(EXEEXT): $(tests_stdio_test_OBJECTS) $(tests_stdio_test_DEPENDENCIES) $(EXTRA_tests_stdio_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/stdio_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_stdio_test_OBJECTS) $(tests_stdio_test_LDADD) $(LIBS) +tests/stdout_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/stdout_test$(EXEEXT): $(tests_stdout_test_OBJECTS) $(tests_stdout_test_DEPENDENCIES) $(EXTRA_tests_stdout_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/stdout_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_stdout_test_OBJECTS) $(tests_stdout_test_LDADD) $(LIBS) +tests/string_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/string_test$(EXEEXT): $(tests_string_test_OBJECTS) $(tests_string_test_DEPENDENCIES) $(EXTRA_tests_string_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/string_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_string_test_OBJECTS) $(tests_string_test_LDADD) $(LIBS) +tests/ulaw_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/ulaw_test$(EXEEXT): $(tests_ulaw_test_OBJECTS) $(tests_ulaw_test_DEPENDENCIES) $(EXTRA_tests_ulaw_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/ulaw_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_ulaw_test_OBJECTS) $(tests_ulaw_test_LDADD) $(LIBS) +tests/virtual_io_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/virtual_io_test$(EXEEXT): $(tests_virtual_io_test_OBJECTS) $(tests_virtual_io_test_DEPENDENCIES) $(EXTRA_tests_virtual_io_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/virtual_io_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_virtual_io_test_OBJECTS) $(tests_virtual_io_test_LDADD) $(LIBS) +tests/win32_ordinal_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/win32_ordinal_test$(EXEEXT): $(tests_win32_ordinal_test_OBJECTS) $(tests_win32_ordinal_test_DEPENDENCIES) $(EXTRA_tests_win32_ordinal_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/win32_ordinal_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_win32_ordinal_test_OBJECTS) $(tests_win32_ordinal_test_LDADD) $(LIBS) +tests/win32_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/win32_test$(EXEEXT): $(tests_win32_test_OBJECTS) $(tests_win32_test_DEPENDENCIES) $(EXTRA_tests_win32_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/win32_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_win32_test_OBJECTS) $(tests_win32_test_LDADD) $(LIBS) +tests/generate.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) +tests/write_read_test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +tests/write_read_test$(EXEEXT): $(tests_write_read_test_OBJECTS) $(tests_write_read_test_DEPENDENCIES) $(EXTRA_tests_write_read_test_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/write_read_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tests_write_read_test_OBJECTS) $(tests_write_read_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f examples/*.$(OBJEXT) + -rm -f ossfuzz/*.$(OBJEXT) + -rm -f ossfuzz/*.lo + -rm -f programs/*.$(OBJEXT) + -rm -f regtest/*.$(OBJEXT) + -rm -f src/*.$(OBJEXT) + -rm -f src/*.lo + -rm -f src/ALAC/*.$(OBJEXT) + -rm -f src/ALAC/*.lo + -rm -f src/G72x/*.$(OBJEXT) + -rm -f src/G72x/*.lo + -rm -f src/GSM610/*.$(OBJEXT) + -rm -f src/GSM610/*.lo + -rm -f tests/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@examples/$(DEPDIR)/generate.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@examples/$(DEPDIR)/list_formats.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@examples/$(DEPDIR)/make_sine.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@examples/$(DEPDIR)/sfprocess.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@examples/$(DEPDIR)/sndfile-loopify.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@examples/$(DEPDIR)/sndfile-to-text.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@examples/$(DEPDIR)/sndfilehandle.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ossfuzz/$(DEPDIR)/libstandaloneengine_la-standaloneengine.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ossfuzz/$(DEPDIR)/sndfile_fuzzer-sndfile_fuzzer.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@programs/$(DEPDIR)/common.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@programs/$(DEPDIR)/sndfile-cmp.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@programs/$(DEPDIR)/sndfile-concat.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@programs/$(DEPDIR)/sndfile-convert.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@programs/$(DEPDIR)/sndfile-deinterleave.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@programs/$(DEPDIR)/sndfile-info.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@programs/$(DEPDIR)/sndfile-interleave.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@programs/$(DEPDIR)/sndfile-metadata-get.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@programs/$(DEPDIR)/sndfile-metadata-set.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@programs/$(DEPDIR)/sndfile-play.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@programs/$(DEPDIR)/sndfile-salvage.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@regtest/$(DEPDIR)/checksum.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@regtest/$(DEPDIR)/database.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@regtest/$(DEPDIR)/sndfile-regtest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-alac.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-alaw.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-audio_detect.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-broadcast.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-cart.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-chanmap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-chunk.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-command.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-common.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-dither.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-double64.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-dwvw.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-file_io.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-float32.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-gsm610.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-id3.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-ima_adpcm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-ima_oki_adpcm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-interleave.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-ms_adpcm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-nms_adpcm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-ogg.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-pcm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-strings.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-ulaw.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-vox_adpcm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libcommon_la-windows.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-aiff.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-au.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-avr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-caf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-dwd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-flac.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-g72x.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-htk.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-ircam.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-macos.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-mat4.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-mat5.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-mpc2k.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-nist.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-ogg_opus.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-ogg_pcm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-ogg_speex.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-ogg_vcomment.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-ogg_vorbis.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-paf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-pvf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-raw.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-rf64.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-rx2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-sd2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-sds.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-sndfile.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-svx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-txw.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-voc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-w64.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-wav.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-wavlike.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-wve.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsndfile_la-xi.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/test_audio_detect.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/test_binheader_writef.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/test_broadcast_var.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/test_cart_var.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/test_conversions.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/test_endswap.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/test_file_io.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/test_float.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/test_ima_oki_adpcm.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/test_log_printf.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/test_main.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/test_nms_adpcm.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/test_strncpy_crlf.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/ALAC/$(DEPDIR)/ALACBitUtilities.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/ALAC/$(DEPDIR)/ag_dec.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/ALAC/$(DEPDIR)/ag_enc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/ALAC/$(DEPDIR)/alac_decoder.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/ALAC/$(DEPDIR)/alac_encoder.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/ALAC/$(DEPDIR)/dp_dec.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/ALAC/$(DEPDIR)/dp_enc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/ALAC/$(DEPDIR)/matrix_dec.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/ALAC/$(DEPDIR)/matrix_enc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/G72x/$(DEPDIR)/g721.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/G72x/$(DEPDIR)/g723_16.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/G72x/$(DEPDIR)/g723_24.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/G72x/$(DEPDIR)/g723_40.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/G72x/$(DEPDIR)/g72x.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/G72x/$(DEPDIR)/g72x_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/GSM610/$(DEPDIR)/add.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/GSM610/$(DEPDIR)/code.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/GSM610/$(DEPDIR)/decode.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/GSM610/$(DEPDIR)/gsm_create.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/GSM610/$(DEPDIR)/gsm_decode.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/GSM610/$(DEPDIR)/gsm_destroy.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/GSM610/$(DEPDIR)/gsm_encode.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/GSM610/$(DEPDIR)/gsm_option.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/GSM610/$(DEPDIR)/long_term.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/GSM610/$(DEPDIR)/lpc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/GSM610/$(DEPDIR)/preprocess.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/GSM610/$(DEPDIR)/rpe.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/GSM610/$(DEPDIR)/short_term.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/GSM610/$(DEPDIR)/table.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/aiff_rw_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/alaw_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/benchmark.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/channel_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/checksum_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/chunk_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/command_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/compression_size_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/cpp_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/dft_cmp.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/dither_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/dwvw_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/error_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/external_libs_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/fix_this.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/floating_point_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/format_check_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/generate.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/header_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/headerless_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/largefile_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/locale_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/long_read_write_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/lossy_comp_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/misc_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/multi_file_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/ogg_opus_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/ogg_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/pcm_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/peak_chunk_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/pipe_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/raw_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/rdwr_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/scale_clip_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/sfversion.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/stdin_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/stdio_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/stdout_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/string_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/ulaw_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/utils.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/virtual_io_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/win32_ordinal_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/win32_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/write_read_test.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +src/libcommon_la-common.lo: src/common.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-common.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-common.Tpo -c -o src/libcommon_la-common.lo `test -f 'src/common.c' || echo '$(srcdir)/'`src/common.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-common.Tpo src/$(DEPDIR)/libcommon_la-common.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/common.c' object='src/libcommon_la-common.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-common.lo `test -f 'src/common.c' || echo '$(srcdir)/'`src/common.c + +src/libcommon_la-file_io.lo: src/file_io.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-file_io.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-file_io.Tpo -c -o src/libcommon_la-file_io.lo `test -f 'src/file_io.c' || echo '$(srcdir)/'`src/file_io.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-file_io.Tpo src/$(DEPDIR)/libcommon_la-file_io.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/file_io.c' object='src/libcommon_la-file_io.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-file_io.lo `test -f 'src/file_io.c' || echo '$(srcdir)/'`src/file_io.c + +src/libcommon_la-command.lo: src/command.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-command.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-command.Tpo -c -o src/libcommon_la-command.lo `test -f 'src/command.c' || echo '$(srcdir)/'`src/command.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-command.Tpo src/$(DEPDIR)/libcommon_la-command.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/command.c' object='src/libcommon_la-command.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-command.lo `test -f 'src/command.c' || echo '$(srcdir)/'`src/command.c + +src/libcommon_la-pcm.lo: src/pcm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-pcm.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-pcm.Tpo -c -o src/libcommon_la-pcm.lo `test -f 'src/pcm.c' || echo '$(srcdir)/'`src/pcm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-pcm.Tpo src/$(DEPDIR)/libcommon_la-pcm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/pcm.c' object='src/libcommon_la-pcm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-pcm.lo `test -f 'src/pcm.c' || echo '$(srcdir)/'`src/pcm.c + +src/libcommon_la-ulaw.lo: src/ulaw.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-ulaw.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-ulaw.Tpo -c -o src/libcommon_la-ulaw.lo `test -f 'src/ulaw.c' || echo '$(srcdir)/'`src/ulaw.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-ulaw.Tpo src/$(DEPDIR)/libcommon_la-ulaw.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/ulaw.c' object='src/libcommon_la-ulaw.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-ulaw.lo `test -f 'src/ulaw.c' || echo '$(srcdir)/'`src/ulaw.c + +src/libcommon_la-alaw.lo: src/alaw.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-alaw.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-alaw.Tpo -c -o src/libcommon_la-alaw.lo `test -f 'src/alaw.c' || echo '$(srcdir)/'`src/alaw.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-alaw.Tpo src/$(DEPDIR)/libcommon_la-alaw.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/alaw.c' object='src/libcommon_la-alaw.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-alaw.lo `test -f 'src/alaw.c' || echo '$(srcdir)/'`src/alaw.c + +src/libcommon_la-float32.lo: src/float32.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-float32.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-float32.Tpo -c -o src/libcommon_la-float32.lo `test -f 'src/float32.c' || echo '$(srcdir)/'`src/float32.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-float32.Tpo src/$(DEPDIR)/libcommon_la-float32.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/float32.c' object='src/libcommon_la-float32.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-float32.lo `test -f 'src/float32.c' || echo '$(srcdir)/'`src/float32.c + +src/libcommon_la-double64.lo: src/double64.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-double64.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-double64.Tpo -c -o src/libcommon_la-double64.lo `test -f 'src/double64.c' || echo '$(srcdir)/'`src/double64.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-double64.Tpo src/$(DEPDIR)/libcommon_la-double64.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/double64.c' object='src/libcommon_la-double64.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-double64.lo `test -f 'src/double64.c' || echo '$(srcdir)/'`src/double64.c + +src/libcommon_la-ima_adpcm.lo: src/ima_adpcm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-ima_adpcm.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-ima_adpcm.Tpo -c -o src/libcommon_la-ima_adpcm.lo `test -f 'src/ima_adpcm.c' || echo '$(srcdir)/'`src/ima_adpcm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-ima_adpcm.Tpo src/$(DEPDIR)/libcommon_la-ima_adpcm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/ima_adpcm.c' object='src/libcommon_la-ima_adpcm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-ima_adpcm.lo `test -f 'src/ima_adpcm.c' || echo '$(srcdir)/'`src/ima_adpcm.c + +src/libcommon_la-ms_adpcm.lo: src/ms_adpcm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-ms_adpcm.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-ms_adpcm.Tpo -c -o src/libcommon_la-ms_adpcm.lo `test -f 'src/ms_adpcm.c' || echo '$(srcdir)/'`src/ms_adpcm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-ms_adpcm.Tpo src/$(DEPDIR)/libcommon_la-ms_adpcm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/ms_adpcm.c' object='src/libcommon_la-ms_adpcm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-ms_adpcm.lo `test -f 'src/ms_adpcm.c' || echo '$(srcdir)/'`src/ms_adpcm.c + +src/libcommon_la-gsm610.lo: src/gsm610.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-gsm610.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-gsm610.Tpo -c -o src/libcommon_la-gsm610.lo `test -f 'src/gsm610.c' || echo '$(srcdir)/'`src/gsm610.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-gsm610.Tpo src/$(DEPDIR)/libcommon_la-gsm610.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/gsm610.c' object='src/libcommon_la-gsm610.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-gsm610.lo `test -f 'src/gsm610.c' || echo '$(srcdir)/'`src/gsm610.c + +src/libcommon_la-dwvw.lo: src/dwvw.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-dwvw.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-dwvw.Tpo -c -o src/libcommon_la-dwvw.lo `test -f 'src/dwvw.c' || echo '$(srcdir)/'`src/dwvw.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-dwvw.Tpo src/$(DEPDIR)/libcommon_la-dwvw.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/dwvw.c' object='src/libcommon_la-dwvw.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-dwvw.lo `test -f 'src/dwvw.c' || echo '$(srcdir)/'`src/dwvw.c + +src/libcommon_la-vox_adpcm.lo: src/vox_adpcm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-vox_adpcm.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-vox_adpcm.Tpo -c -o src/libcommon_la-vox_adpcm.lo `test -f 'src/vox_adpcm.c' || echo '$(srcdir)/'`src/vox_adpcm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-vox_adpcm.Tpo src/$(DEPDIR)/libcommon_la-vox_adpcm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/vox_adpcm.c' object='src/libcommon_la-vox_adpcm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-vox_adpcm.lo `test -f 'src/vox_adpcm.c' || echo '$(srcdir)/'`src/vox_adpcm.c + +src/libcommon_la-interleave.lo: src/interleave.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-interleave.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-interleave.Tpo -c -o src/libcommon_la-interleave.lo `test -f 'src/interleave.c' || echo '$(srcdir)/'`src/interleave.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-interleave.Tpo src/$(DEPDIR)/libcommon_la-interleave.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/interleave.c' object='src/libcommon_la-interleave.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-interleave.lo `test -f 'src/interleave.c' || echo '$(srcdir)/'`src/interleave.c + +src/libcommon_la-strings.lo: src/strings.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-strings.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-strings.Tpo -c -o src/libcommon_la-strings.lo `test -f 'src/strings.c' || echo '$(srcdir)/'`src/strings.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-strings.Tpo src/$(DEPDIR)/libcommon_la-strings.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/strings.c' object='src/libcommon_la-strings.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-strings.lo `test -f 'src/strings.c' || echo '$(srcdir)/'`src/strings.c + +src/libcommon_la-dither.lo: src/dither.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-dither.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-dither.Tpo -c -o src/libcommon_la-dither.lo `test -f 'src/dither.c' || echo '$(srcdir)/'`src/dither.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-dither.Tpo src/$(DEPDIR)/libcommon_la-dither.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/dither.c' object='src/libcommon_la-dither.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-dither.lo `test -f 'src/dither.c' || echo '$(srcdir)/'`src/dither.c + +src/libcommon_la-cart.lo: src/cart.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-cart.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-cart.Tpo -c -o src/libcommon_la-cart.lo `test -f 'src/cart.c' || echo '$(srcdir)/'`src/cart.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-cart.Tpo src/$(DEPDIR)/libcommon_la-cart.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/cart.c' object='src/libcommon_la-cart.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-cart.lo `test -f 'src/cart.c' || echo '$(srcdir)/'`src/cart.c + +src/libcommon_la-broadcast.lo: src/broadcast.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-broadcast.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-broadcast.Tpo -c -o src/libcommon_la-broadcast.lo `test -f 'src/broadcast.c' || echo '$(srcdir)/'`src/broadcast.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-broadcast.Tpo src/$(DEPDIR)/libcommon_la-broadcast.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/broadcast.c' object='src/libcommon_la-broadcast.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-broadcast.lo `test -f 'src/broadcast.c' || echo '$(srcdir)/'`src/broadcast.c + +src/libcommon_la-audio_detect.lo: src/audio_detect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-audio_detect.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-audio_detect.Tpo -c -o src/libcommon_la-audio_detect.lo `test -f 'src/audio_detect.c' || echo '$(srcdir)/'`src/audio_detect.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-audio_detect.Tpo src/$(DEPDIR)/libcommon_la-audio_detect.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/audio_detect.c' object='src/libcommon_la-audio_detect.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-audio_detect.lo `test -f 'src/audio_detect.c' || echo '$(srcdir)/'`src/audio_detect.c + +src/libcommon_la-ima_oki_adpcm.lo: src/ima_oki_adpcm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-ima_oki_adpcm.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-ima_oki_adpcm.Tpo -c -o src/libcommon_la-ima_oki_adpcm.lo `test -f 'src/ima_oki_adpcm.c' || echo '$(srcdir)/'`src/ima_oki_adpcm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-ima_oki_adpcm.Tpo src/$(DEPDIR)/libcommon_la-ima_oki_adpcm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/ima_oki_adpcm.c' object='src/libcommon_la-ima_oki_adpcm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-ima_oki_adpcm.lo `test -f 'src/ima_oki_adpcm.c' || echo '$(srcdir)/'`src/ima_oki_adpcm.c + +src/libcommon_la-alac.lo: src/alac.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-alac.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-alac.Tpo -c -o src/libcommon_la-alac.lo `test -f 'src/alac.c' || echo '$(srcdir)/'`src/alac.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-alac.Tpo src/$(DEPDIR)/libcommon_la-alac.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/alac.c' object='src/libcommon_la-alac.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-alac.lo `test -f 'src/alac.c' || echo '$(srcdir)/'`src/alac.c + +src/libcommon_la-chunk.lo: src/chunk.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-chunk.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-chunk.Tpo -c -o src/libcommon_la-chunk.lo `test -f 'src/chunk.c' || echo '$(srcdir)/'`src/chunk.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-chunk.Tpo src/$(DEPDIR)/libcommon_la-chunk.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/chunk.c' object='src/libcommon_la-chunk.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-chunk.lo `test -f 'src/chunk.c' || echo '$(srcdir)/'`src/chunk.c + +src/libcommon_la-ogg.lo: src/ogg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-ogg.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-ogg.Tpo -c -o src/libcommon_la-ogg.lo `test -f 'src/ogg.c' || echo '$(srcdir)/'`src/ogg.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-ogg.Tpo src/$(DEPDIR)/libcommon_la-ogg.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/ogg.c' object='src/libcommon_la-ogg.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-ogg.lo `test -f 'src/ogg.c' || echo '$(srcdir)/'`src/ogg.c + +src/libcommon_la-chanmap.lo: src/chanmap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-chanmap.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-chanmap.Tpo -c -o src/libcommon_la-chanmap.lo `test -f 'src/chanmap.c' || echo '$(srcdir)/'`src/chanmap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-chanmap.Tpo src/$(DEPDIR)/libcommon_la-chanmap.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/chanmap.c' object='src/libcommon_la-chanmap.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-chanmap.lo `test -f 'src/chanmap.c' || echo '$(srcdir)/'`src/chanmap.c + +src/libcommon_la-windows.lo: src/windows.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-windows.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-windows.Tpo -c -o src/libcommon_la-windows.lo `test -f 'src/windows.c' || echo '$(srcdir)/'`src/windows.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-windows.Tpo src/$(DEPDIR)/libcommon_la-windows.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/windows.c' object='src/libcommon_la-windows.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-windows.lo `test -f 'src/windows.c' || echo '$(srcdir)/'`src/windows.c + +src/libcommon_la-id3.lo: src/id3.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-id3.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-id3.Tpo -c -o src/libcommon_la-id3.lo `test -f 'src/id3.c' || echo '$(srcdir)/'`src/id3.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-id3.Tpo src/$(DEPDIR)/libcommon_la-id3.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/id3.c' object='src/libcommon_la-id3.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-id3.lo `test -f 'src/id3.c' || echo '$(srcdir)/'`src/id3.c + +src/libcommon_la-nms_adpcm.lo: src/nms_adpcm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -MT src/libcommon_la-nms_adpcm.lo -MD -MP -MF src/$(DEPDIR)/libcommon_la-nms_adpcm.Tpo -c -o src/libcommon_la-nms_adpcm.lo `test -f 'src/nms_adpcm.c' || echo '$(srcdir)/'`src/nms_adpcm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libcommon_la-nms_adpcm.Tpo src/$(DEPDIR)/libcommon_la-nms_adpcm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/nms_adpcm.c' object='src/libcommon_la-nms_adpcm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libcommon_la_CFLAGS) $(CFLAGS) -c -o src/libcommon_la-nms_adpcm.lo `test -f 'src/nms_adpcm.c' || echo '$(srcdir)/'`src/nms_adpcm.c + +src/libsndfile_la-sndfile.lo: src/sndfile.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-sndfile.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-sndfile.Tpo -c -o src/libsndfile_la-sndfile.lo `test -f 'src/sndfile.c' || echo '$(srcdir)/'`src/sndfile.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-sndfile.Tpo src/$(DEPDIR)/libsndfile_la-sndfile.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/sndfile.c' object='src/libsndfile_la-sndfile.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-sndfile.lo `test -f 'src/sndfile.c' || echo '$(srcdir)/'`src/sndfile.c + +src/libsndfile_la-aiff.lo: src/aiff.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-aiff.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-aiff.Tpo -c -o src/libsndfile_la-aiff.lo `test -f 'src/aiff.c' || echo '$(srcdir)/'`src/aiff.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-aiff.Tpo src/$(DEPDIR)/libsndfile_la-aiff.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/aiff.c' object='src/libsndfile_la-aiff.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-aiff.lo `test -f 'src/aiff.c' || echo '$(srcdir)/'`src/aiff.c + +src/libsndfile_la-au.lo: src/au.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-au.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-au.Tpo -c -o src/libsndfile_la-au.lo `test -f 'src/au.c' || echo '$(srcdir)/'`src/au.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-au.Tpo src/$(DEPDIR)/libsndfile_la-au.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/au.c' object='src/libsndfile_la-au.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-au.lo `test -f 'src/au.c' || echo '$(srcdir)/'`src/au.c + +src/libsndfile_la-avr.lo: src/avr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-avr.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-avr.Tpo -c -o src/libsndfile_la-avr.lo `test -f 'src/avr.c' || echo '$(srcdir)/'`src/avr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-avr.Tpo src/$(DEPDIR)/libsndfile_la-avr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/avr.c' object='src/libsndfile_la-avr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-avr.lo `test -f 'src/avr.c' || echo '$(srcdir)/'`src/avr.c + +src/libsndfile_la-caf.lo: src/caf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-caf.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-caf.Tpo -c -o src/libsndfile_la-caf.lo `test -f 'src/caf.c' || echo '$(srcdir)/'`src/caf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-caf.Tpo src/$(DEPDIR)/libsndfile_la-caf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/caf.c' object='src/libsndfile_la-caf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-caf.lo `test -f 'src/caf.c' || echo '$(srcdir)/'`src/caf.c + +src/libsndfile_la-dwd.lo: src/dwd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-dwd.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-dwd.Tpo -c -o src/libsndfile_la-dwd.lo `test -f 'src/dwd.c' || echo '$(srcdir)/'`src/dwd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-dwd.Tpo src/$(DEPDIR)/libsndfile_la-dwd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/dwd.c' object='src/libsndfile_la-dwd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-dwd.lo `test -f 'src/dwd.c' || echo '$(srcdir)/'`src/dwd.c + +src/libsndfile_la-flac.lo: src/flac.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-flac.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-flac.Tpo -c -o src/libsndfile_la-flac.lo `test -f 'src/flac.c' || echo '$(srcdir)/'`src/flac.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-flac.Tpo src/$(DEPDIR)/libsndfile_la-flac.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/flac.c' object='src/libsndfile_la-flac.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-flac.lo `test -f 'src/flac.c' || echo '$(srcdir)/'`src/flac.c + +src/libsndfile_la-g72x.lo: src/g72x.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-g72x.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-g72x.Tpo -c -o src/libsndfile_la-g72x.lo `test -f 'src/g72x.c' || echo '$(srcdir)/'`src/g72x.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-g72x.Tpo src/$(DEPDIR)/libsndfile_la-g72x.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/g72x.c' object='src/libsndfile_la-g72x.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-g72x.lo `test -f 'src/g72x.c' || echo '$(srcdir)/'`src/g72x.c + +src/libsndfile_la-htk.lo: src/htk.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-htk.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-htk.Tpo -c -o src/libsndfile_la-htk.lo `test -f 'src/htk.c' || echo '$(srcdir)/'`src/htk.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-htk.Tpo src/$(DEPDIR)/libsndfile_la-htk.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/htk.c' object='src/libsndfile_la-htk.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-htk.lo `test -f 'src/htk.c' || echo '$(srcdir)/'`src/htk.c + +src/libsndfile_la-ircam.lo: src/ircam.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-ircam.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-ircam.Tpo -c -o src/libsndfile_la-ircam.lo `test -f 'src/ircam.c' || echo '$(srcdir)/'`src/ircam.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-ircam.Tpo src/$(DEPDIR)/libsndfile_la-ircam.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/ircam.c' object='src/libsndfile_la-ircam.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-ircam.lo `test -f 'src/ircam.c' || echo '$(srcdir)/'`src/ircam.c + +src/libsndfile_la-macos.lo: src/macos.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-macos.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-macos.Tpo -c -o src/libsndfile_la-macos.lo `test -f 'src/macos.c' || echo '$(srcdir)/'`src/macos.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-macos.Tpo src/$(DEPDIR)/libsndfile_la-macos.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/macos.c' object='src/libsndfile_la-macos.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-macos.lo `test -f 'src/macos.c' || echo '$(srcdir)/'`src/macos.c + +src/libsndfile_la-mat4.lo: src/mat4.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-mat4.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-mat4.Tpo -c -o src/libsndfile_la-mat4.lo `test -f 'src/mat4.c' || echo '$(srcdir)/'`src/mat4.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-mat4.Tpo src/$(DEPDIR)/libsndfile_la-mat4.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/mat4.c' object='src/libsndfile_la-mat4.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-mat4.lo `test -f 'src/mat4.c' || echo '$(srcdir)/'`src/mat4.c + +src/libsndfile_la-mat5.lo: src/mat5.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-mat5.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-mat5.Tpo -c -o src/libsndfile_la-mat5.lo `test -f 'src/mat5.c' || echo '$(srcdir)/'`src/mat5.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-mat5.Tpo src/$(DEPDIR)/libsndfile_la-mat5.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/mat5.c' object='src/libsndfile_la-mat5.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-mat5.lo `test -f 'src/mat5.c' || echo '$(srcdir)/'`src/mat5.c + +src/libsndfile_la-nist.lo: src/nist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-nist.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-nist.Tpo -c -o src/libsndfile_la-nist.lo `test -f 'src/nist.c' || echo '$(srcdir)/'`src/nist.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-nist.Tpo src/$(DEPDIR)/libsndfile_la-nist.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/nist.c' object='src/libsndfile_la-nist.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-nist.lo `test -f 'src/nist.c' || echo '$(srcdir)/'`src/nist.c + +src/libsndfile_la-paf.lo: src/paf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-paf.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-paf.Tpo -c -o src/libsndfile_la-paf.lo `test -f 'src/paf.c' || echo '$(srcdir)/'`src/paf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-paf.Tpo src/$(DEPDIR)/libsndfile_la-paf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/paf.c' object='src/libsndfile_la-paf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-paf.lo `test -f 'src/paf.c' || echo '$(srcdir)/'`src/paf.c + +src/libsndfile_la-pvf.lo: src/pvf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-pvf.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-pvf.Tpo -c -o src/libsndfile_la-pvf.lo `test -f 'src/pvf.c' || echo '$(srcdir)/'`src/pvf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-pvf.Tpo src/$(DEPDIR)/libsndfile_la-pvf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/pvf.c' object='src/libsndfile_la-pvf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-pvf.lo `test -f 'src/pvf.c' || echo '$(srcdir)/'`src/pvf.c + +src/libsndfile_la-raw.lo: src/raw.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-raw.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-raw.Tpo -c -o src/libsndfile_la-raw.lo `test -f 'src/raw.c' || echo '$(srcdir)/'`src/raw.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-raw.Tpo src/$(DEPDIR)/libsndfile_la-raw.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/raw.c' object='src/libsndfile_la-raw.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-raw.lo `test -f 'src/raw.c' || echo '$(srcdir)/'`src/raw.c + +src/libsndfile_la-rx2.lo: src/rx2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-rx2.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-rx2.Tpo -c -o src/libsndfile_la-rx2.lo `test -f 'src/rx2.c' || echo '$(srcdir)/'`src/rx2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-rx2.Tpo src/$(DEPDIR)/libsndfile_la-rx2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/rx2.c' object='src/libsndfile_la-rx2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-rx2.lo `test -f 'src/rx2.c' || echo '$(srcdir)/'`src/rx2.c + +src/libsndfile_la-sd2.lo: src/sd2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-sd2.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-sd2.Tpo -c -o src/libsndfile_la-sd2.lo `test -f 'src/sd2.c' || echo '$(srcdir)/'`src/sd2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-sd2.Tpo src/$(DEPDIR)/libsndfile_la-sd2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/sd2.c' object='src/libsndfile_la-sd2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-sd2.lo `test -f 'src/sd2.c' || echo '$(srcdir)/'`src/sd2.c + +src/libsndfile_la-sds.lo: src/sds.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-sds.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-sds.Tpo -c -o src/libsndfile_la-sds.lo `test -f 'src/sds.c' || echo '$(srcdir)/'`src/sds.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-sds.Tpo src/$(DEPDIR)/libsndfile_la-sds.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/sds.c' object='src/libsndfile_la-sds.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-sds.lo `test -f 'src/sds.c' || echo '$(srcdir)/'`src/sds.c + +src/libsndfile_la-svx.lo: src/svx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-svx.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-svx.Tpo -c -o src/libsndfile_la-svx.lo `test -f 'src/svx.c' || echo '$(srcdir)/'`src/svx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-svx.Tpo src/$(DEPDIR)/libsndfile_la-svx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/svx.c' object='src/libsndfile_la-svx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-svx.lo `test -f 'src/svx.c' || echo '$(srcdir)/'`src/svx.c + +src/libsndfile_la-txw.lo: src/txw.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-txw.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-txw.Tpo -c -o src/libsndfile_la-txw.lo `test -f 'src/txw.c' || echo '$(srcdir)/'`src/txw.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-txw.Tpo src/$(DEPDIR)/libsndfile_la-txw.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/txw.c' object='src/libsndfile_la-txw.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-txw.lo `test -f 'src/txw.c' || echo '$(srcdir)/'`src/txw.c + +src/libsndfile_la-voc.lo: src/voc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-voc.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-voc.Tpo -c -o src/libsndfile_la-voc.lo `test -f 'src/voc.c' || echo '$(srcdir)/'`src/voc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-voc.Tpo src/$(DEPDIR)/libsndfile_la-voc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/voc.c' object='src/libsndfile_la-voc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-voc.lo `test -f 'src/voc.c' || echo '$(srcdir)/'`src/voc.c + +src/libsndfile_la-wve.lo: src/wve.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-wve.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-wve.Tpo -c -o src/libsndfile_la-wve.lo `test -f 'src/wve.c' || echo '$(srcdir)/'`src/wve.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-wve.Tpo src/$(DEPDIR)/libsndfile_la-wve.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/wve.c' object='src/libsndfile_la-wve.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-wve.lo `test -f 'src/wve.c' || echo '$(srcdir)/'`src/wve.c + +src/libsndfile_la-w64.lo: src/w64.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-w64.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-w64.Tpo -c -o src/libsndfile_la-w64.lo `test -f 'src/w64.c' || echo '$(srcdir)/'`src/w64.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-w64.Tpo src/$(DEPDIR)/libsndfile_la-w64.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/w64.c' object='src/libsndfile_la-w64.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-w64.lo `test -f 'src/w64.c' || echo '$(srcdir)/'`src/w64.c + +src/libsndfile_la-wavlike.lo: src/wavlike.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-wavlike.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-wavlike.Tpo -c -o src/libsndfile_la-wavlike.lo `test -f 'src/wavlike.c' || echo '$(srcdir)/'`src/wavlike.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-wavlike.Tpo src/$(DEPDIR)/libsndfile_la-wavlike.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/wavlike.c' object='src/libsndfile_la-wavlike.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-wavlike.lo `test -f 'src/wavlike.c' || echo '$(srcdir)/'`src/wavlike.c + +src/libsndfile_la-wav.lo: src/wav.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-wav.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-wav.Tpo -c -o src/libsndfile_la-wav.lo `test -f 'src/wav.c' || echo '$(srcdir)/'`src/wav.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-wav.Tpo src/$(DEPDIR)/libsndfile_la-wav.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/wav.c' object='src/libsndfile_la-wav.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-wav.lo `test -f 'src/wav.c' || echo '$(srcdir)/'`src/wav.c + +src/libsndfile_la-xi.lo: src/xi.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-xi.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-xi.Tpo -c -o src/libsndfile_la-xi.lo `test -f 'src/xi.c' || echo '$(srcdir)/'`src/xi.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-xi.Tpo src/$(DEPDIR)/libsndfile_la-xi.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/xi.c' object='src/libsndfile_la-xi.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-xi.lo `test -f 'src/xi.c' || echo '$(srcdir)/'`src/xi.c + +src/libsndfile_la-mpc2k.lo: src/mpc2k.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-mpc2k.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-mpc2k.Tpo -c -o src/libsndfile_la-mpc2k.lo `test -f 'src/mpc2k.c' || echo '$(srcdir)/'`src/mpc2k.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-mpc2k.Tpo src/$(DEPDIR)/libsndfile_la-mpc2k.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/mpc2k.c' object='src/libsndfile_la-mpc2k.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-mpc2k.lo `test -f 'src/mpc2k.c' || echo '$(srcdir)/'`src/mpc2k.c + +src/libsndfile_la-rf64.lo: src/rf64.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-rf64.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-rf64.Tpo -c -o src/libsndfile_la-rf64.lo `test -f 'src/rf64.c' || echo '$(srcdir)/'`src/rf64.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-rf64.Tpo src/$(DEPDIR)/libsndfile_la-rf64.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/rf64.c' object='src/libsndfile_la-rf64.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-rf64.lo `test -f 'src/rf64.c' || echo '$(srcdir)/'`src/rf64.c + +src/libsndfile_la-ogg_vorbis.lo: src/ogg_vorbis.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-ogg_vorbis.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-ogg_vorbis.Tpo -c -o src/libsndfile_la-ogg_vorbis.lo `test -f 'src/ogg_vorbis.c' || echo '$(srcdir)/'`src/ogg_vorbis.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-ogg_vorbis.Tpo src/$(DEPDIR)/libsndfile_la-ogg_vorbis.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/ogg_vorbis.c' object='src/libsndfile_la-ogg_vorbis.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-ogg_vorbis.lo `test -f 'src/ogg_vorbis.c' || echo '$(srcdir)/'`src/ogg_vorbis.c + +src/libsndfile_la-ogg_speex.lo: src/ogg_speex.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-ogg_speex.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-ogg_speex.Tpo -c -o src/libsndfile_la-ogg_speex.lo `test -f 'src/ogg_speex.c' || echo '$(srcdir)/'`src/ogg_speex.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-ogg_speex.Tpo src/$(DEPDIR)/libsndfile_la-ogg_speex.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/ogg_speex.c' object='src/libsndfile_la-ogg_speex.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-ogg_speex.lo `test -f 'src/ogg_speex.c' || echo '$(srcdir)/'`src/ogg_speex.c + +src/libsndfile_la-ogg_pcm.lo: src/ogg_pcm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-ogg_pcm.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-ogg_pcm.Tpo -c -o src/libsndfile_la-ogg_pcm.lo `test -f 'src/ogg_pcm.c' || echo '$(srcdir)/'`src/ogg_pcm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-ogg_pcm.Tpo src/$(DEPDIR)/libsndfile_la-ogg_pcm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/ogg_pcm.c' object='src/libsndfile_la-ogg_pcm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-ogg_pcm.lo `test -f 'src/ogg_pcm.c' || echo '$(srcdir)/'`src/ogg_pcm.c + +src/libsndfile_la-ogg_opus.lo: src/ogg_opus.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-ogg_opus.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-ogg_opus.Tpo -c -o src/libsndfile_la-ogg_opus.lo `test -f 'src/ogg_opus.c' || echo '$(srcdir)/'`src/ogg_opus.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-ogg_opus.Tpo src/$(DEPDIR)/libsndfile_la-ogg_opus.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/ogg_opus.c' object='src/libsndfile_la-ogg_opus.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-ogg_opus.lo `test -f 'src/ogg_opus.c' || echo '$(srcdir)/'`src/ogg_opus.c + +src/libsndfile_la-ogg_vcomment.lo: src/ogg_vcomment.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -MT src/libsndfile_la-ogg_vcomment.lo -MD -MP -MF src/$(DEPDIR)/libsndfile_la-ogg_vcomment.Tpo -c -o src/libsndfile_la-ogg_vcomment.lo `test -f 'src/ogg_vcomment.c' || echo '$(srcdir)/'`src/ogg_vcomment.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsndfile_la-ogg_vcomment.Tpo src/$(DEPDIR)/libsndfile_la-ogg_vcomment.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/ogg_vcomment.c' object='src/libsndfile_la-ogg_vcomment.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_libsndfile_la_CFLAGS) $(CFLAGS) -c -o src/libsndfile_la-ogg_vcomment.lo `test -f 'src/ogg_vcomment.c' || echo '$(srcdir)/'`src/ogg_vcomment.c + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +ossfuzz/libstandaloneengine_la-standaloneengine.lo: ossfuzz/standaloneengine.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ossfuzz_libstandaloneengine_la_CXXFLAGS) $(CXXFLAGS) -MT ossfuzz/libstandaloneengine_la-standaloneengine.lo -MD -MP -MF ossfuzz/$(DEPDIR)/libstandaloneengine_la-standaloneengine.Tpo -c -o ossfuzz/libstandaloneengine_la-standaloneengine.lo `test -f 'ossfuzz/standaloneengine.cc' || echo '$(srcdir)/'`ossfuzz/standaloneengine.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ossfuzz/$(DEPDIR)/libstandaloneengine_la-standaloneengine.Tpo ossfuzz/$(DEPDIR)/libstandaloneengine_la-standaloneengine.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ossfuzz/standaloneengine.cc' object='ossfuzz/libstandaloneengine_la-standaloneengine.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ossfuzz_libstandaloneengine_la_CXXFLAGS) $(CXXFLAGS) -c -o ossfuzz/libstandaloneengine_la-standaloneengine.lo `test -f 'ossfuzz/standaloneengine.cc' || echo '$(srcdir)/'`ossfuzz/standaloneengine.cc + +ossfuzz/sndfile_fuzzer-sndfile_fuzzer.o: ossfuzz/sndfile_fuzzer.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ossfuzz_sndfile_fuzzer_CXXFLAGS) $(CXXFLAGS) -MT ossfuzz/sndfile_fuzzer-sndfile_fuzzer.o -MD -MP -MF ossfuzz/$(DEPDIR)/sndfile_fuzzer-sndfile_fuzzer.Tpo -c -o ossfuzz/sndfile_fuzzer-sndfile_fuzzer.o `test -f 'ossfuzz/sndfile_fuzzer.cc' || echo '$(srcdir)/'`ossfuzz/sndfile_fuzzer.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ossfuzz/$(DEPDIR)/sndfile_fuzzer-sndfile_fuzzer.Tpo ossfuzz/$(DEPDIR)/sndfile_fuzzer-sndfile_fuzzer.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ossfuzz/sndfile_fuzzer.cc' object='ossfuzz/sndfile_fuzzer-sndfile_fuzzer.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ossfuzz_sndfile_fuzzer_CXXFLAGS) $(CXXFLAGS) -c -o ossfuzz/sndfile_fuzzer-sndfile_fuzzer.o `test -f 'ossfuzz/sndfile_fuzzer.cc' || echo '$(srcdir)/'`ossfuzz/sndfile_fuzzer.cc + +ossfuzz/sndfile_fuzzer-sndfile_fuzzer.obj: ossfuzz/sndfile_fuzzer.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ossfuzz_sndfile_fuzzer_CXXFLAGS) $(CXXFLAGS) -MT ossfuzz/sndfile_fuzzer-sndfile_fuzzer.obj -MD -MP -MF ossfuzz/$(DEPDIR)/sndfile_fuzzer-sndfile_fuzzer.Tpo -c -o ossfuzz/sndfile_fuzzer-sndfile_fuzzer.obj `if test -f 'ossfuzz/sndfile_fuzzer.cc'; then $(CYGPATH_W) 'ossfuzz/sndfile_fuzzer.cc'; else $(CYGPATH_W) '$(srcdir)/ossfuzz/sndfile_fuzzer.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ossfuzz/$(DEPDIR)/sndfile_fuzzer-sndfile_fuzzer.Tpo ossfuzz/$(DEPDIR)/sndfile_fuzzer-sndfile_fuzzer.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ossfuzz/sndfile_fuzzer.cc' object='ossfuzz/sndfile_fuzzer-sndfile_fuzzer.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ossfuzz_sndfile_fuzzer_CXXFLAGS) $(CXXFLAGS) -c -o ossfuzz/sndfile_fuzzer-sndfile_fuzzer.obj `if test -f 'ossfuzz/sndfile_fuzzer.cc'; then $(CYGPATH_W) 'ossfuzz/sndfile_fuzzer.cc'; else $(CYGPATH_W) '$(srcdir)/ossfuzz/sndfile_fuzzer.cc'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + -rm -rf examples/.libs examples/_libs + -rm -rf ossfuzz/.libs ossfuzz/_libs + -rm -rf programs/.libs programs/_libs + -rm -rf regtest/.libs regtest/_libs + -rm -rf src/.libs src/_libs + -rm -rf src/ALAC/.libs src/ALAC/_libs + -rm -rf src/G72x/.libs src/G72x/_libs + -rm -rf src/GSM610/.libs src/GSM610/_libs + -rm -rf tests/.libs tests/_libs + +distclean-libtool: + -rm -f libtool config.lt +install-man1: $(dist_man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(dist_man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) +install-dist_docDATA: $(dist_doc_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ + done + +uninstall-dist_docDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) +install-nodist_includeHEADERS: $(nodist_include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-nodist_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + $(am__tty_colors); \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + col=$$red; res=XPASS; \ + ;; \ + *) \ + col=$$grn; res=PASS; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xfail=`expr $$xfail + 1`; \ + col=$$lgn; res=XFAIL; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + col=$$red; res=FAIL; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + col=$$blu; res=SKIP; \ + fi; \ + echo "$${col}$$res$${std}: $$tst"; \ + done; \ + if test "$$all" -eq 1; then \ + tests="test"; \ + All=""; \ + else \ + tests="tests"; \ + All="All "; \ + fi; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="$$All$$all $$tests passed"; \ + else \ + if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ + banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all $$tests failed"; \ + else \ + if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ + banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + if test "$$skip" -eq 1; then \ + skipped="($$skip test was not run)"; \ + else \ + skipped="($$skip tests were not run)"; \ + fi; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + if test "$$failed" -eq 0; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + fi; \ + echo "$${col}$$dashes$${std}"; \ + echo "$${col}$$banner$${std}"; \ + test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ + test -z "$$report" || echo "$${col}$$report$${std}"; \ + echo "$${col}$$dashes$${std}"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz + $(am__post_remove_distdir) +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-zstd: distdir + tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + *.tar.zst*) \ + zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(MANS) $(DATA) $(HEADERS) +install-binPROGRAMS: install-libLTLIBRARIES + +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f examples/$(DEPDIR)/$(am__dirstamp) + -rm -f examples/$(am__dirstamp) + -rm -f ossfuzz/$(DEPDIR)/$(am__dirstamp) + -rm -f ossfuzz/$(am__dirstamp) + -rm -f programs/$(DEPDIR)/$(am__dirstamp) + -rm -f programs/$(am__dirstamp) + -rm -f regtest/$(DEPDIR)/$(am__dirstamp) + -rm -f regtest/$(am__dirstamp) + -rm -f src/$(DEPDIR)/$(am__dirstamp) + -rm -f src/$(am__dirstamp) + -rm -f src/ALAC/$(DEPDIR)/$(am__dirstamp) + -rm -f src/ALAC/$(am__dirstamp) + -rm -f src/G72x/$(DEPDIR)/$(am__dirstamp) + -rm -f src/G72x/$(am__dirstamp) + -rm -f src/GSM610/$(DEPDIR)/$(am__dirstamp) + -rm -f src/GSM610/$(am__dirstamp) + -rm -f tests/$(DEPDIR)/$(am__dirstamp) + -rm -f tests/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +@LINUX_MINGW_CROSS_TEST_FALSE@clean-local: +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-local \ + clean-noinstLTLIBRARIES clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f examples/$(DEPDIR)/generate.Po + -rm -f examples/$(DEPDIR)/list_formats.Po + -rm -f examples/$(DEPDIR)/make_sine.Po + -rm -f examples/$(DEPDIR)/sfprocess.Po + -rm -f examples/$(DEPDIR)/sndfile-loopify.Po + -rm -f examples/$(DEPDIR)/sndfile-to-text.Po + -rm -f examples/$(DEPDIR)/sndfilehandle.Po + -rm -f ossfuzz/$(DEPDIR)/libstandaloneengine_la-standaloneengine.Plo + -rm -f ossfuzz/$(DEPDIR)/sndfile_fuzzer-sndfile_fuzzer.Po + -rm -f programs/$(DEPDIR)/common.Po + -rm -f programs/$(DEPDIR)/sndfile-cmp.Po + -rm -f programs/$(DEPDIR)/sndfile-concat.Po + -rm -f programs/$(DEPDIR)/sndfile-convert.Po + -rm -f programs/$(DEPDIR)/sndfile-deinterleave.Po + -rm -f programs/$(DEPDIR)/sndfile-info.Po + -rm -f programs/$(DEPDIR)/sndfile-interleave.Po + -rm -f programs/$(DEPDIR)/sndfile-metadata-get.Po + -rm -f programs/$(DEPDIR)/sndfile-metadata-set.Po + -rm -f programs/$(DEPDIR)/sndfile-play.Po + -rm -f programs/$(DEPDIR)/sndfile-salvage.Po + -rm -f regtest/$(DEPDIR)/checksum.Po + -rm -f regtest/$(DEPDIR)/database.Po + -rm -f regtest/$(DEPDIR)/sndfile-regtest.Po + -rm -f src/$(DEPDIR)/libcommon_la-alac.Plo + -rm -f src/$(DEPDIR)/libcommon_la-alaw.Plo + -rm -f src/$(DEPDIR)/libcommon_la-audio_detect.Plo + -rm -f src/$(DEPDIR)/libcommon_la-broadcast.Plo + -rm -f src/$(DEPDIR)/libcommon_la-cart.Plo + -rm -f src/$(DEPDIR)/libcommon_la-chanmap.Plo + -rm -f src/$(DEPDIR)/libcommon_la-chunk.Plo + -rm -f src/$(DEPDIR)/libcommon_la-command.Plo + -rm -f src/$(DEPDIR)/libcommon_la-common.Plo + -rm -f src/$(DEPDIR)/libcommon_la-dither.Plo + -rm -f src/$(DEPDIR)/libcommon_la-double64.Plo + -rm -f src/$(DEPDIR)/libcommon_la-dwvw.Plo + -rm -f src/$(DEPDIR)/libcommon_la-file_io.Plo + -rm -f src/$(DEPDIR)/libcommon_la-float32.Plo + -rm -f src/$(DEPDIR)/libcommon_la-gsm610.Plo + -rm -f src/$(DEPDIR)/libcommon_la-id3.Plo + -rm -f src/$(DEPDIR)/libcommon_la-ima_adpcm.Plo + -rm -f src/$(DEPDIR)/libcommon_la-ima_oki_adpcm.Plo + -rm -f src/$(DEPDIR)/libcommon_la-interleave.Plo + -rm -f src/$(DEPDIR)/libcommon_la-ms_adpcm.Plo + -rm -f src/$(DEPDIR)/libcommon_la-nms_adpcm.Plo + -rm -f src/$(DEPDIR)/libcommon_la-ogg.Plo + -rm -f src/$(DEPDIR)/libcommon_la-pcm.Plo + -rm -f src/$(DEPDIR)/libcommon_la-strings.Plo + -rm -f src/$(DEPDIR)/libcommon_la-ulaw.Plo + -rm -f src/$(DEPDIR)/libcommon_la-vox_adpcm.Plo + -rm -f src/$(DEPDIR)/libcommon_la-windows.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-aiff.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-au.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-avr.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-caf.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-dwd.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-flac.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-g72x.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-htk.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-ircam.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-macos.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-mat4.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-mat5.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-mpc2k.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-nist.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-ogg_opus.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-ogg_pcm.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-ogg_speex.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-ogg_vcomment.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-ogg_vorbis.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-paf.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-pvf.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-raw.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-rf64.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-rx2.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-sd2.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-sds.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-sndfile.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-svx.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-txw.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-voc.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-w64.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-wav.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-wavlike.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-wve.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-xi.Plo + -rm -f src/$(DEPDIR)/test_audio_detect.Po + -rm -f src/$(DEPDIR)/test_binheader_writef.Po + -rm -f src/$(DEPDIR)/test_broadcast_var.Po + -rm -f src/$(DEPDIR)/test_cart_var.Po + -rm -f src/$(DEPDIR)/test_conversions.Po + -rm -f src/$(DEPDIR)/test_endswap.Po + -rm -f src/$(DEPDIR)/test_file_io.Po + -rm -f src/$(DEPDIR)/test_float.Po + -rm -f src/$(DEPDIR)/test_ima_oki_adpcm.Po + -rm -f src/$(DEPDIR)/test_log_printf.Po + -rm -f src/$(DEPDIR)/test_main.Po + -rm -f src/$(DEPDIR)/test_nms_adpcm.Po + -rm -f src/$(DEPDIR)/test_strncpy_crlf.Po + -rm -f src/ALAC/$(DEPDIR)/ALACBitUtilities.Plo + -rm -f src/ALAC/$(DEPDIR)/ag_dec.Plo + -rm -f src/ALAC/$(DEPDIR)/ag_enc.Plo + -rm -f src/ALAC/$(DEPDIR)/alac_decoder.Plo + -rm -f src/ALAC/$(DEPDIR)/alac_encoder.Plo + -rm -f src/ALAC/$(DEPDIR)/dp_dec.Plo + -rm -f src/ALAC/$(DEPDIR)/dp_enc.Plo + -rm -f src/ALAC/$(DEPDIR)/matrix_dec.Plo + -rm -f src/ALAC/$(DEPDIR)/matrix_enc.Plo + -rm -f src/G72x/$(DEPDIR)/g721.Plo + -rm -f src/G72x/$(DEPDIR)/g723_16.Plo + -rm -f src/G72x/$(DEPDIR)/g723_24.Plo + -rm -f src/G72x/$(DEPDIR)/g723_40.Plo + -rm -f src/G72x/$(DEPDIR)/g72x.Plo + -rm -f src/G72x/$(DEPDIR)/g72x_test.Po + -rm -f src/GSM610/$(DEPDIR)/add.Plo + -rm -f src/GSM610/$(DEPDIR)/code.Plo + -rm -f src/GSM610/$(DEPDIR)/decode.Plo + -rm -f src/GSM610/$(DEPDIR)/gsm_create.Plo + -rm -f src/GSM610/$(DEPDIR)/gsm_decode.Plo + -rm -f src/GSM610/$(DEPDIR)/gsm_destroy.Plo + -rm -f src/GSM610/$(DEPDIR)/gsm_encode.Plo + -rm -f src/GSM610/$(DEPDIR)/gsm_option.Plo + -rm -f src/GSM610/$(DEPDIR)/long_term.Plo + -rm -f src/GSM610/$(DEPDIR)/lpc.Plo + -rm -f src/GSM610/$(DEPDIR)/preprocess.Plo + -rm -f src/GSM610/$(DEPDIR)/rpe.Plo + -rm -f src/GSM610/$(DEPDIR)/short_term.Plo + -rm -f src/GSM610/$(DEPDIR)/table.Plo + -rm -f tests/$(DEPDIR)/aiff_rw_test.Po + -rm -f tests/$(DEPDIR)/alaw_test.Po + -rm -f tests/$(DEPDIR)/benchmark.Po + -rm -f tests/$(DEPDIR)/channel_test.Po + -rm -f tests/$(DEPDIR)/checksum_test.Po + -rm -f tests/$(DEPDIR)/chunk_test.Po + -rm -f tests/$(DEPDIR)/command_test.Po + -rm -f tests/$(DEPDIR)/compression_size_test.Po + -rm -f tests/$(DEPDIR)/cpp_test.Po + -rm -f tests/$(DEPDIR)/dft_cmp.Po + -rm -f tests/$(DEPDIR)/dither_test.Po + -rm -f tests/$(DEPDIR)/dwvw_test.Po + -rm -f tests/$(DEPDIR)/error_test.Po + -rm -f tests/$(DEPDIR)/external_libs_test.Po + -rm -f tests/$(DEPDIR)/fix_this.Po + -rm -f tests/$(DEPDIR)/floating_point_test.Po + -rm -f tests/$(DEPDIR)/format_check_test.Po + -rm -f tests/$(DEPDIR)/generate.Po + -rm -f tests/$(DEPDIR)/header_test.Po + -rm -f tests/$(DEPDIR)/headerless_test.Po + -rm -f tests/$(DEPDIR)/largefile_test.Po + -rm -f tests/$(DEPDIR)/locale_test.Po + -rm -f tests/$(DEPDIR)/long_read_write_test.Po + -rm -f tests/$(DEPDIR)/lossy_comp_test.Po + -rm -f tests/$(DEPDIR)/misc_test.Po + -rm -f tests/$(DEPDIR)/multi_file_test.Po + -rm -f tests/$(DEPDIR)/ogg_opus_test.Po + -rm -f tests/$(DEPDIR)/ogg_test.Po + -rm -f tests/$(DEPDIR)/pcm_test.Po + -rm -f tests/$(DEPDIR)/peak_chunk_test.Po + -rm -f tests/$(DEPDIR)/pipe_test.Po + -rm -f tests/$(DEPDIR)/raw_test.Po + -rm -f tests/$(DEPDIR)/rdwr_test.Po + -rm -f tests/$(DEPDIR)/scale_clip_test.Po + -rm -f tests/$(DEPDIR)/sfversion.Po + -rm -f tests/$(DEPDIR)/stdin_test.Po + -rm -f tests/$(DEPDIR)/stdio_test.Po + -rm -f tests/$(DEPDIR)/stdout_test.Po + -rm -f tests/$(DEPDIR)/string_test.Po + -rm -f tests/$(DEPDIR)/ulaw_test.Po + -rm -f tests/$(DEPDIR)/utils.Po + -rm -f tests/$(DEPDIR)/virtual_io_test.Po + -rm -f tests/$(DEPDIR)/win32_ordinal_test.Po + -rm -f tests/$(DEPDIR)/win32_test.Po + -rm -f tests/$(DEPDIR)/write_read_test.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-dist_docDATA install-includeHEADERS \ + install-man install-nodist_includeHEADERS \ + install-pkgconfigDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-libLTLIBRARIES + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f examples/$(DEPDIR)/generate.Po + -rm -f examples/$(DEPDIR)/list_formats.Po + -rm -f examples/$(DEPDIR)/make_sine.Po + -rm -f examples/$(DEPDIR)/sfprocess.Po + -rm -f examples/$(DEPDIR)/sndfile-loopify.Po + -rm -f examples/$(DEPDIR)/sndfile-to-text.Po + -rm -f examples/$(DEPDIR)/sndfilehandle.Po + -rm -f ossfuzz/$(DEPDIR)/libstandaloneengine_la-standaloneengine.Plo + -rm -f ossfuzz/$(DEPDIR)/sndfile_fuzzer-sndfile_fuzzer.Po + -rm -f programs/$(DEPDIR)/common.Po + -rm -f programs/$(DEPDIR)/sndfile-cmp.Po + -rm -f programs/$(DEPDIR)/sndfile-concat.Po + -rm -f programs/$(DEPDIR)/sndfile-convert.Po + -rm -f programs/$(DEPDIR)/sndfile-deinterleave.Po + -rm -f programs/$(DEPDIR)/sndfile-info.Po + -rm -f programs/$(DEPDIR)/sndfile-interleave.Po + -rm -f programs/$(DEPDIR)/sndfile-metadata-get.Po + -rm -f programs/$(DEPDIR)/sndfile-metadata-set.Po + -rm -f programs/$(DEPDIR)/sndfile-play.Po + -rm -f programs/$(DEPDIR)/sndfile-salvage.Po + -rm -f regtest/$(DEPDIR)/checksum.Po + -rm -f regtest/$(DEPDIR)/database.Po + -rm -f regtest/$(DEPDIR)/sndfile-regtest.Po + -rm -f src/$(DEPDIR)/libcommon_la-alac.Plo + -rm -f src/$(DEPDIR)/libcommon_la-alaw.Plo + -rm -f src/$(DEPDIR)/libcommon_la-audio_detect.Plo + -rm -f src/$(DEPDIR)/libcommon_la-broadcast.Plo + -rm -f src/$(DEPDIR)/libcommon_la-cart.Plo + -rm -f src/$(DEPDIR)/libcommon_la-chanmap.Plo + -rm -f src/$(DEPDIR)/libcommon_la-chunk.Plo + -rm -f src/$(DEPDIR)/libcommon_la-command.Plo + -rm -f src/$(DEPDIR)/libcommon_la-common.Plo + -rm -f src/$(DEPDIR)/libcommon_la-dither.Plo + -rm -f src/$(DEPDIR)/libcommon_la-double64.Plo + -rm -f src/$(DEPDIR)/libcommon_la-dwvw.Plo + -rm -f src/$(DEPDIR)/libcommon_la-file_io.Plo + -rm -f src/$(DEPDIR)/libcommon_la-float32.Plo + -rm -f src/$(DEPDIR)/libcommon_la-gsm610.Plo + -rm -f src/$(DEPDIR)/libcommon_la-id3.Plo + -rm -f src/$(DEPDIR)/libcommon_la-ima_adpcm.Plo + -rm -f src/$(DEPDIR)/libcommon_la-ima_oki_adpcm.Plo + -rm -f src/$(DEPDIR)/libcommon_la-interleave.Plo + -rm -f src/$(DEPDIR)/libcommon_la-ms_adpcm.Plo + -rm -f src/$(DEPDIR)/libcommon_la-nms_adpcm.Plo + -rm -f src/$(DEPDIR)/libcommon_la-ogg.Plo + -rm -f src/$(DEPDIR)/libcommon_la-pcm.Plo + -rm -f src/$(DEPDIR)/libcommon_la-strings.Plo + -rm -f src/$(DEPDIR)/libcommon_la-ulaw.Plo + -rm -f src/$(DEPDIR)/libcommon_la-vox_adpcm.Plo + -rm -f src/$(DEPDIR)/libcommon_la-windows.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-aiff.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-au.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-avr.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-caf.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-dwd.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-flac.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-g72x.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-htk.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-ircam.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-macos.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-mat4.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-mat5.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-mpc2k.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-nist.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-ogg_opus.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-ogg_pcm.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-ogg_speex.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-ogg_vcomment.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-ogg_vorbis.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-paf.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-pvf.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-raw.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-rf64.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-rx2.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-sd2.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-sds.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-sndfile.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-svx.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-txw.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-voc.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-w64.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-wav.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-wavlike.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-wve.Plo + -rm -f src/$(DEPDIR)/libsndfile_la-xi.Plo + -rm -f src/$(DEPDIR)/test_audio_detect.Po + -rm -f src/$(DEPDIR)/test_binheader_writef.Po + -rm -f src/$(DEPDIR)/test_broadcast_var.Po + -rm -f src/$(DEPDIR)/test_cart_var.Po + -rm -f src/$(DEPDIR)/test_conversions.Po + -rm -f src/$(DEPDIR)/test_endswap.Po + -rm -f src/$(DEPDIR)/test_file_io.Po + -rm -f src/$(DEPDIR)/test_float.Po + -rm -f src/$(DEPDIR)/test_ima_oki_adpcm.Po + -rm -f src/$(DEPDIR)/test_log_printf.Po + -rm -f src/$(DEPDIR)/test_main.Po + -rm -f src/$(DEPDIR)/test_nms_adpcm.Po + -rm -f src/$(DEPDIR)/test_strncpy_crlf.Po + -rm -f src/ALAC/$(DEPDIR)/ALACBitUtilities.Plo + -rm -f src/ALAC/$(DEPDIR)/ag_dec.Plo + -rm -f src/ALAC/$(DEPDIR)/ag_enc.Plo + -rm -f src/ALAC/$(DEPDIR)/alac_decoder.Plo + -rm -f src/ALAC/$(DEPDIR)/alac_encoder.Plo + -rm -f src/ALAC/$(DEPDIR)/dp_dec.Plo + -rm -f src/ALAC/$(DEPDIR)/dp_enc.Plo + -rm -f src/ALAC/$(DEPDIR)/matrix_dec.Plo + -rm -f src/ALAC/$(DEPDIR)/matrix_enc.Plo + -rm -f src/G72x/$(DEPDIR)/g721.Plo + -rm -f src/G72x/$(DEPDIR)/g723_16.Plo + -rm -f src/G72x/$(DEPDIR)/g723_24.Plo + -rm -f src/G72x/$(DEPDIR)/g723_40.Plo + -rm -f src/G72x/$(DEPDIR)/g72x.Plo + -rm -f src/G72x/$(DEPDIR)/g72x_test.Po + -rm -f src/GSM610/$(DEPDIR)/add.Plo + -rm -f src/GSM610/$(DEPDIR)/code.Plo + -rm -f src/GSM610/$(DEPDIR)/decode.Plo + -rm -f src/GSM610/$(DEPDIR)/gsm_create.Plo + -rm -f src/GSM610/$(DEPDIR)/gsm_decode.Plo + -rm -f src/GSM610/$(DEPDIR)/gsm_destroy.Plo + -rm -f src/GSM610/$(DEPDIR)/gsm_encode.Plo + -rm -f src/GSM610/$(DEPDIR)/gsm_option.Plo + -rm -f src/GSM610/$(DEPDIR)/long_term.Plo + -rm -f src/GSM610/$(DEPDIR)/lpc.Plo + -rm -f src/GSM610/$(DEPDIR)/preprocess.Plo + -rm -f src/GSM610/$(DEPDIR)/rpe.Plo + -rm -f src/GSM610/$(DEPDIR)/short_term.Plo + -rm -f src/GSM610/$(DEPDIR)/table.Plo + -rm -f tests/$(DEPDIR)/aiff_rw_test.Po + -rm -f tests/$(DEPDIR)/alaw_test.Po + -rm -f tests/$(DEPDIR)/benchmark.Po + -rm -f tests/$(DEPDIR)/channel_test.Po + -rm -f tests/$(DEPDIR)/checksum_test.Po + -rm -f tests/$(DEPDIR)/chunk_test.Po + -rm -f tests/$(DEPDIR)/command_test.Po + -rm -f tests/$(DEPDIR)/compression_size_test.Po + -rm -f tests/$(DEPDIR)/cpp_test.Po + -rm -f tests/$(DEPDIR)/dft_cmp.Po + -rm -f tests/$(DEPDIR)/dither_test.Po + -rm -f tests/$(DEPDIR)/dwvw_test.Po + -rm -f tests/$(DEPDIR)/error_test.Po + -rm -f tests/$(DEPDIR)/external_libs_test.Po + -rm -f tests/$(DEPDIR)/fix_this.Po + -rm -f tests/$(DEPDIR)/floating_point_test.Po + -rm -f tests/$(DEPDIR)/format_check_test.Po + -rm -f tests/$(DEPDIR)/generate.Po + -rm -f tests/$(DEPDIR)/header_test.Po + -rm -f tests/$(DEPDIR)/headerless_test.Po + -rm -f tests/$(DEPDIR)/largefile_test.Po + -rm -f tests/$(DEPDIR)/locale_test.Po + -rm -f tests/$(DEPDIR)/long_read_write_test.Po + -rm -f tests/$(DEPDIR)/lossy_comp_test.Po + -rm -f tests/$(DEPDIR)/misc_test.Po + -rm -f tests/$(DEPDIR)/multi_file_test.Po + -rm -f tests/$(DEPDIR)/ogg_opus_test.Po + -rm -f tests/$(DEPDIR)/ogg_test.Po + -rm -f tests/$(DEPDIR)/pcm_test.Po + -rm -f tests/$(DEPDIR)/peak_chunk_test.Po + -rm -f tests/$(DEPDIR)/pipe_test.Po + -rm -f tests/$(DEPDIR)/raw_test.Po + -rm -f tests/$(DEPDIR)/rdwr_test.Po + -rm -f tests/$(DEPDIR)/scale_clip_test.Po + -rm -f tests/$(DEPDIR)/sfversion.Po + -rm -f tests/$(DEPDIR)/stdin_test.Po + -rm -f tests/$(DEPDIR)/stdio_test.Po + -rm -f tests/$(DEPDIR)/stdout_test.Po + -rm -f tests/$(DEPDIR)/string_test.Po + -rm -f tests/$(DEPDIR)/ulaw_test.Po + -rm -f tests/$(DEPDIR)/utils.Po + -rm -f tests/$(DEPDIR)/virtual_io_test.Po + -rm -f tests/$(DEPDIR)/win32_ordinal_test.Po + -rm -f tests/$(DEPDIR)/win32_test.Po + -rm -f tests/$(DEPDIR)/write_read_test.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-dist_docDATA \ + uninstall-includeHEADERS uninstall-libLTLIBRARIES \ + uninstall-man uninstall-nodist_includeHEADERS \ + uninstall-pkgconfigDATA + +uninstall-man: uninstall-man1 + +.MAKE: $(am__recursive_targets) all check check-am install install-am \ + install-exec install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--depfiles am--refresh check check-TESTS check-am clean \ + clean-binPROGRAMS clean-checkPROGRAMS clean-cscope \ + clean-generic clean-libLTLIBRARIES clean-libtool clean-local \ + clean-noinstLTLIBRARIES clean-noinstPROGRAMS cscope \ + cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ + dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ + dist-zstd distcheck distclean distclean-compile \ + distclean-generic distclean-hdr distclean-libtool \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am \ + install-dist_docDATA install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am \ + install-includeHEADERS install-info install-info-am \ + install-libLTLIBRARIES install-man install-man1 \ + install-nodist_includeHEADERS install-pdf install-pdf-am \ + install-pkgconfigDATA install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-dist_docDATA \ + uninstall-includeHEADERS uninstall-libLTLIBRARIES \ + uninstall-man uninstall-man1 uninstall-nodist_includeHEADERS \ + uninstall-pkgconfigDATA + +.PRECIOUS: Makefile + + +#=============================================================================== + +test: check + +# Need this target to force building of test programs. +checkprograms: $(check_PROGRAMS) + +src/Symbols.gnu-binutils: $(SYMBOL_SCRIPT) + $(PYTHON) $(SYMBOL_SCRIPT) linux $(VERSION) > $(top_srcdir)/$@ + +src/Symbols.darwin: $(SYMBOL_SCRIPT) + $(PYTHON) $(SYMBOL_SCRIPT) darwin $(VERSION) > $(top_srcdir)/$@ + +src/libsndfile-1.def: $(SYMBOL_SCRIPT) + $(PYTHON) $(SYMBOL_SCRIPT) win32 $(VERSION) > $(top_srcdir)/$@ + +src/Symbols.os2: $(SYMBOL_SCRIPT) + $(PYTHON) $(SYMBOL_SCRIPT) os2 $(VERSION) > $(top_srcdir)/$@ + +src/Symbols.static: $(SYMBOL_SCRIPT) + $(PYTHON) $(SYMBOL_SCRIPT) static $(VERSION) > $(top_srcdir)/$@ + +#=============================================================================== +# Building windows resource files (if needed). + +.rc.lo: + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --tag=RC --mode=compile $(RC) $(RCFLAGS) $< -o $@ + +# If we're cross compiling from Linux to Windows and running the test suite +# under Wine, we need a symbolic link to the generated libsndfile DLL. + +@LINUX_MINGW_CROSS_TEST_TRUE@$(check_PROGRAMS) : libsndfile-1.dll + +@LINUX_MINGW_CROSS_TEST_TRUE@libsndfile-1.dll : +@LINUX_MINGW_CROSS_TEST_TRUE@ $(LN_S) src/.libs/$@ $@ + +@LINUX_MINGW_CROSS_TEST_TRUE@clean-local : +@LINUX_MINGW_CROSS_TEST_TRUE@ -rm -f libsndfile-1.dll + +.tpl.def: + touch $@ + +# unconditionally running touch on the .def +# files is necessary to keep all timestamps +# consistent, in order to prevent stale files +# from calling autogen in tarball releases. +.def.c: + $(MAKE) $(AM_MAKEFLAGS) $< + cd $(top_srcdir)/$(@D) && autogen --writable $(= 3.15 without error. + * You can use your our method to set MSVC runtime library flags if none of + ENABLE_STATIC_RUNTIME and CMAKE_MSVC_RUNTIME_LIBRARY were set. + Advanced information: + * If this option is defined (set to ON or OFF), set CMP0091 policy to OLD + (we handle MSVC runtime library flags using compiler flags), set + corresponding compiler flags for user. + * NEW: If this option is not defined, set CMP0091 policy to OLD (we handle + MSVC runtime library flags using compiler flags), don't touch compiler + options, allow user to set it manually. + * NEW: If new CMake option CMAKE_MSVC_RUNTIME_LIBRARY is set, change + CMP0091 policy to NEW (we handle MSVC runtime library flags using that + option), don't touch compiler flags. + * NEW: If both ENABLE_STATIC_RUNTIME and CMAKE_MSVC_RUNTIME_LIBRARY are set, + terminate configuration with fatal error. + * For MinGW toolchain this option is experimental. If you enabled it and + then disabled again, you need to clear CMake cache (delete + CMakeCache.txt). + * Make CMake clip test faster. + * Fix CMake bug with sndio library dependency, thanks to @drhenault. + * Fix memory leak in wav_read_smpl_chunk() function, credit to OSS-Fuzz. + * Fix aiff_read_header() memory leak(), credit to OSS-Fuzz. + * Fix leak in wav_read_header(), credit to OSS-Fuzz. + * Fix leak in wavlike_read_cart_chunk(), credit to OSS-Fuzz. + * Fix memory leak in wav_read_acid_chunk(), credit to OSS-Fuzz. + * Fix memory leak in aiff_read_basc_chunk(), credit to OSS-Fuzz. + * Fix memory leak in wavlike_read_peak_chunk(), credit to OSS-Fuzz. + * Fix memory leak in aiff_read_header(), credit to OSS-Fuzz. + * Fix use of uninitialized value in exif_subchunk_parse(), credit to OSS-Fuzz. + * Fix use of uninitialized value in endswap_int64_t_array(), credit to + OSS-Fuzz. + * Fix up the fuzzer so that it can't under or overseek, + thanks to Max Dymond . + * Fix Autotools configure on macOS, thanks to @tmcguire and @nwh. + * Exclude repository-configuration from git-archive, thanks to @umlaeute. + * Use version-script when compiling with clang on Unix with Autotools, thanks + to @tstellar. + * Improve handling of SMPL chunks in WAV files, thanks to @zodf0055980. + +Version 1.0.30 (2020-09-18) + + * Fix critical CMake bug with broken ABI of shared libsndfile library. + * CMake build system considered to be stable. + * Move sndfile.h.in from src/ to include/ directory. To avoid problems, + delete old generated sndfile.h from $(top_builddir)/src. + * Huge documentation update. + * Fix opus test failures on BE platforms, thanks to + Arthur Taylor . + * Fix bug when sf_open_fd() function sometimes leaves filehandle open, even + if `close_desc` parameter is TRUE, thanks to @umläute. + * Fix infinite loops on some pathological SD2 files, thanks to + Jeremy Friesner . + * Switch to GitHub Actions for continuous integration. + * Add OSS-Fuzz tests to GitHub Actions workflow, thanks to + Max Dymond . + * Fix memory leak in wavlike_read_bext_chunk() function, credit to OSS-Fuzz. + * Fix undefined behavior in avr-read_header() function, credit to OSS-Fuzz. + * Add INSTALL_PKGCONFIG_MODULE CMake option to control sndfile.pc file + installation, see README.md for details. + * Add INSTALL_MANPAGES CMake option, see README.md for details. + * Fix ENABLE_COMPATIBLE_LIBSNDFILE_NAME CMake option, now it works on MinGW + platform too. + * Fix ENABLE_CPACK CMake option, see README.md for details. + * Fix ENABLE_STATIC_RUNTIME and CMAKE_MSVC_RUNTIME_LIBRARY behavior, see + README.md for details. + * Fix CMake man pages installation bug when sndfile-deinterleave.1 and + sndfile-metadata-set.1 were not installed. + * Fix sndfile-regtest paths handling on Windows platform, thanks to + Gisle Vanem . + +Version 1.0.29 (2020-08-15) + * Add support for Opus files. + * Autotool build system improvements. + * CMake build system improvements. + * Fixes for: CVE-2017-12562, CVE-2017-17456, CVE-2017-17457, CVE-2018-19661, + CVE-2018-19662, CVE-2018-19758 and CVE-2019-3832. + * Add BWF v2 loudness parameters. + * Wave64: Permit and skip arbitrary chunks prior to the data chunk. + * Fix ASAN crash in wavlike_ima_seek(). + * Fix IMA-ADPCM encoding for AIFF files. + * sndfile-convert: Handle gsm, vox and opus extensions the same way. + * Add SFC_SET_OGG_PAGE_LATENCY_MS command to get Ogg page latency for Ogg Opus + files. + * Fix parsing of some SD2 files. + * Documentation updates. + * Minor bug fixes and improvements. + +Version 1.0.28 (2017-04-02) + * Fix buffer overruns in FLAC and ID3 handling code. + * Move to variable length header storage. + * Fix detection of Large File Support for 32 bit systems. + * Remove large stack allocations in ALAC handling code. + * Remove all use of Variable Length Arrays. + * Minor bug fixes and improvements. + +Version 1.0.27 (2016-06-19) + * Fix an SF_INFO seekable flag regression introduced in 1.0.26. + * Fix potential infinite loops on malformed input files. + * Add string metadata read/write for CAF and RF64. + * Add handling of CUE chunks. + * Fix endian-ness issues in PAF files. + * Minor bug fixes and improvements. + +Version 1.0.26 (2015-11-22) + * Fix for CVE-2014-9496, SD2 buffer read overflow. + * Fix for CVE-2014-9756, file_io.c divide by zero. + * Fix for CVE-2015-7805, AIFF heap write overflow. + * Add support for ALAC encoder in a CAF container. + * Add support for Cart chunks in WAV files. + * Minor bug fixes and improvements. + +Version 1.0.25 (2011-07-13) + * Fix for Secunia Advisory SA45125, heap overflow in PAF file handler. + * Accept broken WAV files with blockalign == 0. + * Minor bug fixes and improvements. + +Version 1.0.24 (2011-03-23) + * WAV files now have an 18 byte u-law and A-law fmt chunk. + * Document virtual I/O functionality. + * Two new methods rawHandle() and takeOwnership() in sndfile.hh. + * AIFF fix for non-zero offset value in SSND chunk. + * Minor bug fixes and improvements. + +Version 1.0.23 (2010-10-10) + * Add version metadata to Windows DLL. + * Add a missing 'inline' to sndfile.hh. + * Update docs. + * Minor bug fixes and improvements. + +Version 1.0.22 (2010-10-04) + * Couple of fixes for SDS file writer. + * Fixes arising from static analysis. + * Handle FLAC files with ID3 meta data at start of file. + * Handle FLAC files which report zero length. + * Other minor bug fixes and improvements. + +Version 1.0.21 (2009-12-13) + * Add a couple of new binary programs to programs/ dir. + * Remove sndfile-jackplay (now in sndfile-tools package). + * Add windows only function sf_wchar_open(). + * Bunch of minor bug fixes. + +Version 1.0.20 (2009-05-14) + * Fix potential heap overflow in VOC file parser (Tobias Klein, http://www.trapkit.de/). + +Version 1.0.19 (2009-03-02) + * Fix for CVE-2009-0186 (Alin Rad Pop, Secunia Research). + * Huge number of minor bug fixes as a result of static analysis. + +Version 1.0.18 (2009-02-07) + * Add Ogg/Vorbis support (thanks to John ffitch). + * Remove captive FLAC library. + * Many new features and bug fixes. + * Generate Win32 and Win64 pre-compiled binaries. + +Version 1.0.17 (2006-08-31) + * Add sndfile.hh C++ wrapper. + * Update Win32 MinGW build instructions. + * Minor bug fixes and cleanups. + +Version 1.0.16 (2006-04-30) + * Add support for Broadcast (BEXT) chunks in WAV files. + * Implement new commands SFC_GET_SIGNAL_MAX and SFC_GET_MAX_ALL_CHANNELS. + * Add support for RIFX (big endian WAV variant). + * Fix configure script bugs. + * Fix bug in INST and MARK chunk writing for AIFF files. + +Version 1.0.15 (2006-03-16) + * Fix some ia64 issues. + * Fix precompiled DLL. + * Minor bug fixes. + +Version 1.0.14 (2006-02-19) + * Really fix MinGW compile problems. + * Minor bug fixes. + +Version 1.0.13 (2006-01-21) + * Fix for MinGW compiler problems. + * Allow readin/write of instrument chunks from WAV and AIFF files. + * Compile problem fix for Solaris compiler. + * Minor cleanups and bug fixes. + +Version 1.0.12 (2005-09-30) + * Add support for FLAC and Apple's Core Audio Format (CAF). + * Add virtual I/O interface (still needs docs). + * Cygwin and other Win32 fixes. + * Minor bug fixes and cleanups. + +Version 1.0.11 (2004-11-15) + * Add support for SD2 files. + * Add read support for loop info in WAV and AIFF files. + * Add more tests. + * Improve type safety. + * Minor optimisations and bug fixes. + +Version 1.0.10 (2004-06-15) + * Fix AIFF read/write mode bugs. + * Add support for compiling Win32 DLLS using MinGW. + * Fix problems resulting in failed compiles with gcc-2.95. + * Improve test suite. + * Minor bug fixes. + +Version 1.0.9 (2004-03-30) + * Add handling of AVR (Audio Visual Research) files. + * Improve handling of WAVEFORMATEXTENSIBLE WAV files. + * Fix for using pipes on Win32. + +Version 1.0.8 (2004-03-14) + * Correct peak chunk handing for files with > 16 tracks. + * Fix for WAV files with huge number of CUE chunks. + +Version 1.0.7 (2004-02-25) + * Fix clip mode detection on ia64, MIPS and other CPUs. + * Fix two MacOSX build problems. + +Version 1.0.6 (2004-02-08) + * Added support for native Win32 file access API (Ross Bencina). + * New mode to add clippling then a converting from float/double to integer + would otherwise wrap around. + * Fixed a bug in reading/writing files > 2Gig on Linux, Solaris and others. + * Many minor bug fixes. + * Other random fixes for Win32. + +Version 1.0.5 (2003-05-03) + * Added support for HTK files. + * Added new function sf_open_fd() to allow for secure opening of temporary + files as well as reading/writing sound files embedded within larger + container files. + * Added string support for AIFF files. + * Minor bug fixes and code cleanups. + +Version 1.0.4 (2003-02-02) + * Added suport of PVF and XI files. + * Added functionality for setting and retreiving strings from sound files. + * Minor code cleanups and bug fixes. + +Version 1.0.3 (2002-12-09) + * Minor bug fixes. + +Version 1.0.2 (2002-11-24) + * Added support for VOX ADPCM. + * Improved error reporting. + * Added version scripting on Linux and Solaris. + * Minor bug fixes. + +Version 1.0.1 (2002-09-14) + * Added MAT and MAT5 file formats. + * Minor bug fixes. + +Version 1.0.0 (2002-08-16) + * Final release for 1.0.0. + +Version 1.0.0rc6 (2002-08-14) + * Release candidate 6 for the 1.0.0 series. + * MacOS9 fixes. + +Version 1.0.0rc5 (2002-08-10) + * Release candidate 5 for the 1.0.0 series. + * Changed the definition of sf_count_t which was causing problems when + libsndfile was compiled with other libraries (ie WxWindows). + * Minor bug fixes. + * Documentation cleanup. + +Version 1.0.0rc4 (2002-08-03) + * Release candidate 4 for the 1.0.0 series. + * Minor bug fixes. + * Fix broken Win32 "make check". + +Version 1.0.0rc3 (2002-08-02) + * Release candidate 3 for the 1.0.0 series. + * Fix bug where libsndfile was reading beyond the end of the data chunk. + * Added on-the-fly header updates on write. + * Fix a couple of documentation issues. + +Version 1.0.0rc2 (2002-06-24) + * Release candidate 2 for the 1.0.0 series. + * Fix compile problem for Win32. + +Version 1.0.0rc1 (2002-06-24) + * Release candidate 1 for the 1.0.0 series. + +Version 0.0.28 (2002-04-27) + * Last offical release of 0.0.X series of the library. + +Version 0.0.8 (1999-02-16) + * First offical release. diff --git a/libsndfile-1.0.31/Octave/Makefile.am b/libsndfile-1.0.31/Octave/Makefile.am new file mode 100644 index 0000000..3f0078e --- /dev/null +++ b/libsndfile-1.0.31/Octave/Makefile.am @@ -0,0 +1,79 @@ +## Process this file with automake to produce Makefile.in + +# Prevent any extension. +EXEEXT = + +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ + +EXTRA_DIST = sndfile_load.m sndfile_save.m sndfile_play.m \ + octave_test.m octave_test.sh $(oct_module_srcs) PKG_ADD + +octconfigdir = $(exec_prefix)/share/octave/site/m +octconfig_DATA = sndfile_load.m sndfile_save.m sndfile_play.m + +OCTAVE_DEST_MDIR = @OCTAVE_DEST_MDIR@ +OCTAVE_DEST_ODIR = @OCTAVE_DEST_ODIR@/sndfile + +OCT_CXXFLAGS = @OCT_CXXFLAGS@ +OCT_LIB_DIR = @OCT_LIB_DIR@ +OCT_LIBS = @OCT_LIBS@ + +SNDFILEDIR = $(top_builddir)/src +AM_CPPFLAGS = -I$(SNDFILEDIR) + +oct_module_srcs = sndfile.cc +oct_module_files = sndfile.oct PKG_ADD + +# Make these noinst so they can be installed manually. +noinst_DATA = $(oct_module_files) + + +# Used by shave which cleans up automake generated Makefile output. +V = @ +Q = $(V:1=) +QUIET_GEN = $(Q:@=@echo ' GEN '$@;) + + +# Use Octave's mkoctfile to do all the heavy lifting. Unfortunately, its +# a little dumb so we need to guide it carefully. +sndfile.oct : sndfile.o + $(QUIET_GEN) $(MKOCTFILE) -v $(INCLUDES) $(top_builddir)/Octave/$+ -L$(SNDFILEDIR)/.libs -L$(SNDFILEDIR) -lsndfile -o $(top_builddir)/Octave/$@ > /dev/null + +sndfile.o : sndfile.cc + $(QUIET_GEN) $(MKOCTFILE) -v $(INCLUDES) -c $+ -o $(top_builddir)/Octave/$@ > /dev/null + +# Allow for the test being run in the build dir, but the test script +# being located in the source dir. +check : + octave_src_dir=$(srcdir) $(srcdir)/octave_test.sh + + +# Since the octave modules are installed in a special location, a custom install +# and uninstall routine must be specified. +install-exec-local : $(oct_module_files) + @$(NORMAL_INSTALL) + test -z "$(OCTAVE_DEST_ODIR)" || $(mkdir_p) "$(DESTDIR)$(OCTAVE_DEST_ODIR)" + @list='$(oct_module_files)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + || test -f $$p1 \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(INSTALL) '$$p' '$(DESTDIR)$(OCTAVE_DEST_ODIR)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(INSTALL) "$$p" "$(DESTDIR)$(OCTAVE_DEST_ODIR)/$$f" || exit 1; \ + else :; fi; \ + done + +uninstall-local : + @$(NORMAL_UNINSTALL) + @list='$(oct_module_files)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(OCTAVE_DEST_ODIR)/$$f'"; \ + rm -f "$(DESTDIR)$(OCTAVE_DEST_ODIR)/$$f"; \ + done + +clean-local : + rm -f sndfile.o sndfile.oct + @if test $(abs_builddir) != $(abs_srcdir) ; then rm -f PKG_ADD ; fi diff --git a/libsndfile-1.0.31/Octave/Makefile.in b/libsndfile-1.0.31/Octave/Makefile.in new file mode 100644 index 0000000..9013814 --- /dev/null +++ b/libsndfile-1.0.31/Octave/Makefile.in @@ -0,0 +1,645 @@ +# Makefile.in generated by automake 1.16.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2020 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = Octave +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_add_fortify_source.m4 \ + $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_append_link_flags.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_check_link_flag.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_compiler_version.m4 \ + $(top_srcdir)/m4/ax_recursive_eval.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/clip_mode.m4 $(top_srcdir)/m4/extra_pkg.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/mkoctfile_version.m4 \ + $(top_srcdir)/m4/octave.m4 $(top_srcdir)/m4/stack_protect.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(octconfigdir)" +DATA = $(noinst_DATA) $(octconfig_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLEAN_VERSION = @CLEAN_VERSION@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ + +# Prevent any extension. +EXEEXT = +EXTERNAL_XIPH_CFLAGS = @EXTERNAL_XIPH_CFLAGS@ +EXTERNAL_XIPH_LIBS = @EXTERNAL_XIPH_LIBS@ +EXTERNAL_XIPH_REQUIRE = @EXTERNAL_XIPH_REQUIRE@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GEN_TOOL = @GEN_TOOL@ +GREP = @GREP@ +HAVE_AUTOGEN = @HAVE_AUTOGEN@ +HAVE_EXTERNAL_XIPH_LIBS = @HAVE_EXTERNAL_XIPH_LIBS@ +HAVE_MKOCTFILE = @HAVE_MKOCTFILE@ +HAVE_OCTAVE = @HAVE_OCTAVE@ +HAVE_OCTAVE_CONFIG = @HAVE_OCTAVE_CONFIG@ +HAVE_WINE = @HAVE_WINE@ +HAVE_XCODE_SELECT = @HAVE_XCODE_SELECT@ +HOST_TRIPLET = @HOST_TRIPLET@ +HTML_BGCOLOUR = @HTML_BGCOLOUR@ +HTML_FGCOLOUR = @HTML_FGCOLOUR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_FUZZING_ENGINE = @LIB_FUZZING_ENGINE@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MKOCTFILE = @MKOCTFILE@ +MKOCTFILE_VERSION = @MKOCTFILE_VERSION@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCTAVE = @OCTAVE@ +OCTAVE_CONFIG = @OCTAVE_CONFIG@ +OCTAVE_CONFIG_VERSION = @OCTAVE_CONFIG_VERSION@ +OCTAVE_DEST_MDIR = @OCTAVE_DEST_MDIR@ +OCTAVE_DEST_ODIR = @OCTAVE_DEST_ODIR@/sndfile +OCTAVE_VERSION = @OCTAVE_VERSION@ +OGG_CFLAGS = @OGG_CFLAGS@ +OGG_LIBS = @OGG_LIBS@ +OPUS_CFLAGS = @OPUS_CFLAGS@ +OPUS_LIBS = @OPUS_LIBS@ +OS_SPECIFIC_CFLAGS = @OS_SPECIFIC_CFLAGS@ +OS_SPECIFIC_LINKS = @OS_SPECIFIC_LINKS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RC = @RC@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SF_COUNT_MAX = @SF_COUNT_MAX@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SHLIB_VERSION_ARG = @SHLIB_VERSION_ARG@ +SIZEOF_SF_COUNT_T = @SIZEOF_SF_COUNT_T@ +SNDIO_LIBS = @SNDIO_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +SQLITE3_CFLAGS = @SQLITE3_CFLAGS@ +SQLITE3_LIBS = @SQLITE3_LIBS@ +SRC_BINDIR = @SRC_BINDIR@ +STRIP = @STRIP@ +TEST_BINDIR = @TEST_BINDIR@ +TYPEOF_SF_COUNT_T = @TYPEOF_SF_COUNT_T@ +VERSION = @VERSION@ +VERSION_MAJOR = @VERSION_MAJOR@ +VORBISENC_CFLAGS = @VORBISENC_CFLAGS@ +VORBISENC_LIBS = @VORBISENC_LIBS@ +VORBIS_CFLAGS = @VORBIS_CFLAGS@ +VORBIS_LIBS = @VORBIS_LIBS@ +WIN_RC_VERSION = @WIN_RC_VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgconfigdir = @pkgconfigdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ + +EXTRA_DIST = sndfile_load.m sndfile_save.m sndfile_play.m \ + octave_test.m octave_test.sh $(oct_module_srcs) PKG_ADD + +octconfigdir = $(exec_prefix)/share/octave/site/m +octconfig_DATA = sndfile_load.m sndfile_save.m sndfile_play.m +OCT_CXXFLAGS = @OCT_CXXFLAGS@ +OCT_LIB_DIR = @OCT_LIB_DIR@ +OCT_LIBS = @OCT_LIBS@ +SNDFILEDIR = $(top_builddir)/src +AM_CPPFLAGS = -I$(SNDFILEDIR) +oct_module_srcs = sndfile.cc +oct_module_files = sndfile.oct PKG_ADD + +# Make these noinst so they can be installed manually. +noinst_DATA = $(oct_module_files) + +# Used by shave which cleans up automake generated Makefile output. +V = @ +Q = $(V:1=) +QUIET_GEN = $(Q:@=@echo ' GEN '$@;) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Octave/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Octave/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-octconfigDATA: $(octconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(octconfig_DATA)'; test -n "$(octconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(octconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(octconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(octconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(octconfigdir)" || exit $$?; \ + done + +uninstall-octconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(octconfig_DATA)'; test -n "$(octconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(octconfigdir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(octconfigdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-local mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-octconfigDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-exec-local + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-local uninstall-octconfigDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + clean-local cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-exec-local \ + install-html install-html-am install-info install-info-am \ + install-man install-octconfigDATA install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am uninstall-local uninstall-octconfigDATA + +.PRECIOUS: Makefile + + +# Use Octave's mkoctfile to do all the heavy lifting. Unfortunately, its +# a little dumb so we need to guide it carefully. +sndfile.oct : sndfile.o + $(QUIET_GEN) $(MKOCTFILE) -v $(INCLUDES) $(top_builddir)/Octave/$+ -L$(SNDFILEDIR)/.libs -L$(SNDFILEDIR) -lsndfile -o $(top_builddir)/Octave/$@ > /dev/null + +sndfile.o : sndfile.cc + $(QUIET_GEN) $(MKOCTFILE) -v $(INCLUDES) -c $+ -o $(top_builddir)/Octave/$@ > /dev/null + +# Allow for the test being run in the build dir, but the test script +# being located in the source dir. +check : + octave_src_dir=$(srcdir) $(srcdir)/octave_test.sh + +# Since the octave modules are installed in a special location, a custom install +# and uninstall routine must be specified. +install-exec-local : $(oct_module_files) + @$(NORMAL_INSTALL) + test -z "$(OCTAVE_DEST_ODIR)" || $(mkdir_p) "$(DESTDIR)$(OCTAVE_DEST_ODIR)" + @list='$(oct_module_files)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + || test -f $$p1 \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(INSTALL) '$$p' '$(DESTDIR)$(OCTAVE_DEST_ODIR)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(INSTALL) "$$p" "$(DESTDIR)$(OCTAVE_DEST_ODIR)/$$f" || exit 1; \ + else :; fi; \ + done + +uninstall-local : + @$(NORMAL_UNINSTALL) + @list='$(oct_module_files)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(OCTAVE_DEST_ODIR)/$$f'"; \ + rm -f "$(DESTDIR)$(OCTAVE_DEST_ODIR)/$$f"; \ + done + +clean-local : + rm -f sndfile.o sndfile.oct + @if test $(abs_builddir) != $(abs_srcdir) ; then rm -f PKG_ADD ; fi + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libsndfile-1.0.31/Octave/PKG_ADD b/libsndfile-1.0.31/Octave/PKG_ADD new file mode 100644 index 0000000..3efd688 --- /dev/null +++ b/libsndfile-1.0.31/Octave/PKG_ADD @@ -0,0 +1,3 @@ +autoload ("sfread", "sndfile.oct"); +autoload ("sfversion", "sndfile.oct"); +autoload ("sfwrite", "sndfile.oct"); diff --git a/libsndfile-1.0.31/Octave/octave_test.m b/libsndfile-1.0.31/Octave/octave_test.m new file mode 100644 index 0000000..25a922e --- /dev/null +++ b/libsndfile-1.0.31/Octave/octave_test.m @@ -0,0 +1,52 @@ +# Copyright (C) 2007-2011 Erik de Castro Lopo +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser 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. + +# These tests are nowhere near comprehensive. + +printf (" Running Octave tests : ") ; +fflush (stdout) ; + +filename = "whatever" ; +srate_out = 32000 ; +fmt_out = "wav-float" ; + +t = (2 * pi / srate_out * (0:srate_out-1))' ; +data_out = sin (440.0 * t) ; + +# Write out a file. +sfwrite (filename, data_out, srate_out, fmt_out) ; + +# Read it back in again. +[ data_in, srate_in, fmt_in ] = sfread (filename) ; + +if (srate_in != srate_out) + error ("\n\nSample rate mismatch : %d -> %d.\n\n", srate_out, srate_in) ; + endif + +# Octave strcmp return 1 for the same. +if (strcmp (fmt_in, fmt_out) != 1) + error ("\n\nFormat error : '%s' -> '%s'.\n\n", fmt_out, fmt_in) ; + endif + +err = max (abs (data_out - data_in)) ; + +if (err > 1e-7) + error ("err : %g\n", err) ; + endif + +printf ("ok") ; + +unlink (filename) ; diff --git a/libsndfile-1.0.31/Octave/octave_test.sh b/libsndfile-1.0.31/Octave/octave_test.sh new file mode 100755 index 0000000..3c6f36e --- /dev/null +++ b/libsndfile-1.0.31/Octave/octave_test.sh @@ -0,0 +1,81 @@ +#!/bin/bash + + +# Check where we're being run from. +if test -d Octave ; then + cd Octave + octave_src_dir=$(pwd) +elif test -z "$octave_src_dir" ; then + echo + echo "Error : \$octave_src_dir is undefined." + echo + exit 1 +else + octave_src_dir=$(cd $octave_src_dir && pwd) + fi + +# Find libsndfile shared object. +libsndfile_lib_location="" + +if test -f "../src/.libs/libsndfile.so" ; then + libsndfile_lib_location="../src/.libs/" +elif test -f "../src/libsndfile.so" ; then + libsndfile_lib_location="../src/" +elif test -f "../src/.libs/libsndfile.dylib" ; then + libsndfile_lib_location="../src/.libs/" +elif test -f "../src/libsndfile.dylib" ; then + libsndfile_lib_location="../src/" +else + echo + echo "Not able to find the libsndfile shared lib we've just built." + echo "This may cause the following test to fail." + echo + fi + +libsndfile_lib_location=`(cd $libsndfile_lib_location && pwd)` + + +# Find sndfile.oct +sndfile_oct_location="" + +if test -f .libs/sndfile.oct ; then + sndfile_oct_location=".libs" +elif test -f sndfile.oct ; then + sndfile_oct_location="." +else + echo "Not able to find the sndfile.oct binaries we've just built." + exit 1 + fi + +case `file -b $sndfile_oct_location/sndfile.oct` in + ELF*) + ;; + Mach*) + echo "Tests don't work on this platform." + exit 0 + ;; + *) + echo "Not able to find the sndfile.oct binary we just built." + exit 1 + ;; + esac + + +# Make sure the TERM environment variable doesn't contain anything wrong. +unset TERM +# echo "octave_src_dir : $octave_src_dir" +# echo "libsndfile_lib_location : $libsndfile_lib_location" +# echo "sndfile_oct_location : $sndfile_oct_location" + +if test ! -f PKG_ADD ; then + cp $octave_src_dir/PKG_ADD . + fi + +export LD_LIBRARY_PATH="$libsndfile_lib_location:$LD_LIBRARY_PATH" + +octave_script="$octave_src_dir/octave_test.m" + +(cd $sndfile_oct_location && octave -qH $octave_script) +res=$? +echo +exit $res diff --git a/libsndfile-1.0.31/Octave/sndfile.cc b/libsndfile-1.0.31/Octave/sndfile.cc new file mode 100644 index 0000000..6e9cd44 --- /dev/null +++ b/libsndfile-1.0.31/Octave/sndfile.cc @@ -0,0 +1,405 @@ +/* +** Copyright (C) 2007-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include + +#include "sndfile.h" + +#define FOUR_GIG (0x100000000LL) +#define BUFFER_FRAMES 8192 + + +static int format_of_str (const std::string & fmt) ; +static void string_of_format (std::string & fmt, int format) ; + + +DEFUN_DLD (sfversion, args, nargout , +"-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {@var{version} =} sfversion ()\n\ +@cindex Reading sound files\n\ +Return a string containing the libsndfile version.\n\ +@seealso{sfread, sfwrite}\n\ +@end deftypefn") +{ char buffer [256] ; + octave_value_list retval ; + + /* Bail out if the input parameters are bad. */ + if (args.length () != 0 || nargout > 1) + { print_usage () ; + return retval ; + } ; + + sf_command (NULL, SFC_GET_LIB_VERSION, buffer, sizeof (buffer)) ; + + std::string version (buffer) ; + + retval.append (version) ; + return retval ; +} /* sfversion */ + + +DEFUN_DLD (sfread, args, nargout , +"-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {@var{data},@var{srate},@var{format} =} sfread (@var{filename})\n\ +@cindex Reading sound files\n\ +Read a sound file from disk using libsndfile.\n\ +@seealso{sfversion, sfwrite}\n\ +@end deftypefn") +{ SNDFILE * file ; + SF_INFO sfinfo ; + + octave_value_list retval ; + + int nargin = args.length () ; + + /* Bail out if the input parameters are bad. */ + if ((nargin != 1) || !args (0) .is_string () || nargout < 1 || nargout > 3) + { print_usage () ; + return retval ; + } ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + std::string filename = args (0).string_value () ; + + if ((file = sf_open (filename.c_str (), SFM_READ, &sfinfo)) == NULL) + { error ("sfread: couldn't open file %s : %s", filename.c_str (), sf_strerror (NULL)) ; + return retval ; + } ; + + if (sfinfo.frames > FOUR_GIG) + printf ("This is a really huge file (%lld frames).\nYou may run out of memory trying to load it.\n", (long long) sfinfo.frames) ; + + dim_vector dim = dim_vector () ; + dim.resize (2) ; + dim (0) = sfinfo.frames ; + dim (1) = sfinfo.channels ; + + /* Should I be using Matrix instead? */ + NDArray out (dim, 0.0) ; + + float buffer [BUFFER_FRAMES * sfinfo.channels] ; + int readcount ; + sf_count_t total = 0 ; + + do + { readcount = sf_readf_float (file, buffer, BUFFER_FRAMES) ; + + /* Make sure we don't read more frames than we allocated. */ + if (total + readcount > sfinfo.frames) + readcount = sfinfo.frames - total ; + + for (int ch = 0 ; ch < sfinfo.channels ; ch++) + { for (int k = 0 ; k < readcount ; k++) + out (total + k, ch) = buffer [k * sfinfo.channels + ch] ; + } ; + + total += readcount ; + } while (readcount > 0 && total < sfinfo.frames) ; + + retval.append (out.squeeze ()) ; + + if (nargout >= 2) + retval.append ((octave_uint32) sfinfo.samplerate) ; + + if (nargout >= 3) + { std::string fmt ("") ; + string_of_format (fmt, sfinfo.format) ; + retval.append (fmt) ; + } ; + + /* Clean up. */ + sf_close (file) ; + + return retval ; +} /* sfread */ + +DEFUN_DLD (sfwrite, args, nargout , +"-*- texinfo -*-\n\ +@deftypefn {Function File} sfwrite (@var{filename},@var{data},@var{srate},@var{format})\n\ +Write a sound file to disk using libsndfile.\n\ +@seealso{sfread, sfversion}\n\ +@end deftypefn\n\ +") +{ SNDFILE * file ; + SF_INFO sfinfo ; + + octave_value_list retval ; + + int nargin = args.length () ; + + /* Bail out if the input parameters are bad. */ + if (nargin != 4 || !args (0).is_string () || !args (1).is_real_matrix () + || !args (2).is_real_scalar () || !args (3).is_string () + || nargout != 0) + { print_usage () ; + return retval ; + } ; + + std::string filename = args (0).string_value () ; + std::string format = args (3).string_value () ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + sfinfo.format = format_of_str (format) ; + if (sfinfo.format == 0) + { error ("Bad format '%s'", format.c_str ()) ; + return retval ; + } ; + + sfinfo.samplerate = lrint (args (2).scalar_value ()) ; + if (sfinfo.samplerate < 1) + { error ("Bad sample rate : %d.\n", sfinfo.samplerate) ; + return retval ; + } ; + + Matrix data = args (1).matrix_value () ; + long rows = args (1).rows () ; + long cols = args (1).columns () ; + + if (cols > rows) + { error ("Audio data should have one column per channel, but supplied data " + "has %ld rows and %ld columns.\n", rows, cols) ; + return retval ; + } ; + + sfinfo.channels = cols ; + + if ((file = sf_open (filename.c_str (), SFM_WRITE, &sfinfo)) == NULL) + { error ("Couldn't open file %s : %s", filename.c_str (), sf_strerror (NULL)) ; + return retval ; + } ; + + float buffer [BUFFER_FRAMES * sfinfo.channels] ; + int writecount ; + long total = 0 ; + + do + { + writecount = BUFFER_FRAMES ; + + /* Make sure we don't read more frames than we allocated. */ + if (total + writecount > rows) + writecount = rows - total ; + + for (int ch = 0 ; ch < sfinfo.channels ; ch++) + { for (int k = 0 ; k < writecount ; k++) + buffer [k * sfinfo.channels + ch] = data (total + k, ch) ; + } ; + + if (writecount > 0) + sf_writef_float (file, buffer, writecount) ; + + total += writecount ; + } while (writecount > 0 && total < rows) ; + + /* Clean up. */ + sf_close (file) ; + + return retval ; +} /* sfwrite */ + + +static void +str_split (const std::string & str, const std::string & delim, std::vector & output) +{ + unsigned int offset = 0 ; + size_t delim_index = 0 ; + + delim_index = str.find (delim, offset) ; + + while (delim_index != std::string::npos) + { + output.push_back (str.substr(offset, delim_index - offset)) ; + offset += delim_index - offset + delim.length () ; + delim_index = str.find (delim, offset) ; + } + + output.push_back (str.substr (offset)) ; +} /* str_split */ + +static int +hash_of_str (const std::string & str) +{ + int hash = 0 ; + + for (unsigned k = 0 ; k < str.length () ; k++) + hash = (hash * 3) + tolower (str [k]) ; + + return hash ; +} /* hash_of_str */ + +static int +major_format_of_hash (const std::string & str) +{ int hash ; + + hash = hash_of_str (str) ; + + switch (hash) + { + case 0x5c8 : /* 'wav' */ return SF_FORMAT_WAV ; + case 0xf84 : /* 'aiff' */ return SF_FORMAT_AIFF ; + case 0x198 : /* 'au' */ return SF_FORMAT_AU ; + case 0x579 : /* 'paf' */ return SF_FORMAT_PAF ; + case 0x5e5 : /* 'svx' */ return SF_FORMAT_SVX ; + case 0x1118 : /* 'nist' */ return SF_FORMAT_NIST ; + case 0x5d6 : /* 'voc' */ return SF_FORMAT_VOC ; + case 0x324a : /* 'ircam' */ return SF_FORMAT_IRCAM ; + case 0x505 : /* 'w64' */ return SF_FORMAT_W64 ; + case 0x1078 : /* 'mat4' */ return SF_FORMAT_MAT4 ; + case 0x1079 : /* 'mat5' */ return SF_FORMAT_MAT5 ; + case 0x5b8 : /* 'pvf' */ return SF_FORMAT_PVF ; + case 0x1d1 : /* 'xi' */ return SF_FORMAT_XI ; + case 0x56f : /* 'htk' */ return SF_FORMAT_HTK ; + case 0x5aa : /* 'sds' */ return SF_FORMAT_SDS ; + case 0x53d : /* 'avr' */ return SF_FORMAT_AVR ; + case 0x11d0 : /* 'wavx' */ return SF_FORMAT_WAVEX ; + case 0x569 : /* 'sd2' */ return SF_FORMAT_SD2 ; + case 0x1014 : /* 'flac' */ return SF_FORMAT_FLAC ; + case 0x504 : /* 'caf' */ return SF_FORMAT_CAF ; + case 0x5f6 : /* 'wve' */ return SF_FORMAT_WVE ; + default : break ; + } ; + + printf ("%s : hash '%s' -> 0x%x\n", __func__, str.c_str (), hash) ; + + return 0 ; +} /* major_format_of_hash */ + +static int +minor_format_of_hash (const std::string & str) +{ int hash ; + + hash = hash_of_str (str) ; + + switch (hash) + { + case 0x1085 : /* 'int8' */ return SF_FORMAT_PCM_S8 ; + case 0x358a : /* 'uint8' */ return SF_FORMAT_PCM_U8 ; + case 0x31b0 : /* 'int16' */ return SF_FORMAT_PCM_16 ; + case 0x31b1 : /* 'int24' */ return SF_FORMAT_PCM_24 ; + case 0x31b2 : /* 'int32' */ return SF_FORMAT_PCM_32 ; + case 0x3128 : /* 'float' */ return SF_FORMAT_FLOAT ; + case 0x937d : /* 'double' */ return SF_FORMAT_DOUBLE ; + case 0x11bd : /* 'ulaw' */ return SF_FORMAT_ULAW ; + case 0xfa1 : /* 'alaw' */ return SF_FORMAT_ALAW ; + case 0xfc361 : /* 'ima_adpcm' */ return SF_FORMAT_IMA_ADPCM ; + case 0x5739a : /* 'ms_adpcm' */ return SF_FORMAT_MS_ADPCM ; + case 0x9450 : /* 'gsm610' */ return SF_FORMAT_GSM610 ; + case 0x172a3 : /* 'g721_32' */ return SF_FORMAT_G721_32 ; + case 0x172d8 : /* 'g723_24' */ return SF_FORMAT_G723_24 ; + case 0x172da : /* 'g723_40' */ return SF_FORMAT_G723_40 ; + default : break ; + } ; + + printf ("%s : hash '%s' -> 0x%x\n", __func__, str.c_str (), hash) ; + + return 0 ; +} /* minor_format_of_hash */ + + +static const char * +string_of_major_format (int format) +{ + switch (format & SF_FORMAT_TYPEMASK) + { + case SF_FORMAT_WAV : return "wav" ; + case SF_FORMAT_AIFF : return "aiff" ; + case SF_FORMAT_AU : return "au" ; + case SF_FORMAT_PAF : return "paf" ; + case SF_FORMAT_SVX : return "svx" ; + case SF_FORMAT_NIST : return "nist" ; + case SF_FORMAT_VOC : return "voc" ; + case SF_FORMAT_IRCAM : return "ircam" ; + case SF_FORMAT_W64 : return "w64" ; + case SF_FORMAT_MAT4 : return "mat4" ; + case SF_FORMAT_MAT5 : return "mat5" ; + case SF_FORMAT_PVF : return "pvf" ; + case SF_FORMAT_XI : return "xi" ; + case SF_FORMAT_HTK : return "htk" ; + case SF_FORMAT_SDS : return "sds" ; + case SF_FORMAT_AVR : return "avr" ; + case SF_FORMAT_WAVEX : return "wavx" ; + case SF_FORMAT_SD2 : return "sd2" ; + case SF_FORMAT_FLAC : return "flac" ; + case SF_FORMAT_CAF : return "caf" ; + case SF_FORMAT_WVE : return "wfe" ; + default : break ; + } ; + + return "unknown" ; +} /* string_of_major_format */ + +static const char * +string_of_minor_format (int format) +{ + switch (format & SF_FORMAT_SUBMASK) + { + case SF_FORMAT_PCM_S8 : return "int8" ; + case SF_FORMAT_PCM_U8 : return "uint8" ; + case SF_FORMAT_PCM_16 : return "int16" ; + case SF_FORMAT_PCM_24 : return "int24" ; + case SF_FORMAT_PCM_32 : return "int32" ; + case SF_FORMAT_FLOAT : return "float" ; + case SF_FORMAT_DOUBLE : return "double" ; + case SF_FORMAT_ULAW : return "ulaw" ; + case SF_FORMAT_ALAW : return "alaw" ; + case SF_FORMAT_IMA_ADPCM : return "ima_adpcm" ; + case SF_FORMAT_MS_ADPCM : return "ms_adpcm" ; + case SF_FORMAT_GSM610 : return "gsm610" ; + case SF_FORMAT_G721_32 : return "g721_32" ; + case SF_FORMAT_G723_24 : return "g723_24" ; + case SF_FORMAT_G723_40 : return "g723_40" ; + default : break ; + } ; + + return "unknown" ; +} /* string_of_minor_format */ + +static int +format_of_str (const std::string & fmt) +{ + std::vector split ; + + str_split (fmt, "-", split) ; + + if (split.size () != 2) + return 0 ; + + int major_fmt = major_format_of_hash (split.at (0)) ; + if (major_fmt == 0) + return 0 ; + + int minor_fmt = minor_format_of_hash (split.at (1)) ; + if (minor_fmt == 0) + return 0 ; + + return major_fmt | minor_fmt ; +} /* format_of_str */ + +static void +string_of_format (std::string & fmt, int format) +{ + char buffer [64] ; + + snprintf (buffer, sizeof (buffer), "%s-%s", string_of_major_format (format), string_of_minor_format (format)) ; + + fmt = buffer ; + + return ; +} /* string_of_format */ diff --git a/libsndfile-1.0.31/Octave/sndfile_load.m b/libsndfile-1.0.31/Octave/sndfile_load.m new file mode 100644 index 0000000..c66198f --- /dev/null +++ b/libsndfile-1.0.31/Octave/sndfile_load.m @@ -0,0 +1,52 @@ +## Copyright (C) 2002-2011 Erik de Castro Lopo +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2, or (at your option) +## any later version. +## +## This program is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## 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 file. If not, write to the Free Software Foundation, +## 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +## -*- texinfo -*- +## @deftypefn {Function File} {} sndfile_load (@var{filename}) +## Load data from the file given by @var{filename}. +## @end deftypefn + +## Author: Erik de Castro Lopo +## Description: Load the sound data from the given file name + +function [data fs] = sndfile_load (filename) + +if (nargin != 1), + error ("Need an input filename") ; + endif + +samplerate = -1 ; +samplingrate = -1 ; +wavedata = -1 ; + + +eval (sprintf ('load -f %s', filename)) ; + +if (samplerate > 0), + fs = samplerate ; +elseif (samplingrate > 0), + fs = samplingrate ; +else + error ("Not able to find sample rate.") ; + endif + +if (max (size (wavedata)) > 1), + data = wavedata ; +else + error ("Not able to find waveform data.") ; + endif + +endfunction diff --git a/libsndfile-1.0.31/Octave/sndfile_play.m b/libsndfile-1.0.31/Octave/sndfile_play.m new file mode 100644 index 0000000..e8a34a7 --- /dev/null +++ b/libsndfile-1.0.31/Octave/sndfile_play.m @@ -0,0 +1,59 @@ +## Copyright (C) 2002-2011 Erik de Castro Lopo +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2, or (at your option) +## any later version. +## +## This program is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## 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 file. If not, write to the Free Software Foundation, +## 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +## -*- texinfo -*- +## @deftypefn {Function File} {} sndfile_play (@var{data, fs}) +## Play @var{data} at sample rate @var{fs} using the sndfile-play +## program. +## @end deftypefn + +## Author: Erik de Castro Lopo +## Description: Play the given data as a sound file + +function sndfile_play (data, fs) + +if nargin != 2, + error ("Need two input arguments: data and fs.") ; + endif + +if (max (size (fs)) > 1), + error ("Second parameter fs must be a single value.") ; + endif + +[nr nc] = size (data) ; + +if (nr > nc), + data = data' ; + endif + +samplerate = fs ; +wavedata = data ; + +filename = tmpnam () ; + +cmd = sprintf ("save -mat-binary %s fs data", filename) ; + +eval (cmd) ; + +cmd = sprintf ("sndfile-play %s", filename) ; + +[output, status] = system (cmd) ; + +if (status), + disp (outout) ; + endif + +endfunction diff --git a/libsndfile-1.0.31/Octave/sndfile_save.m b/libsndfile-1.0.31/Octave/sndfile_save.m new file mode 100644 index 0000000..5b7e7c7 --- /dev/null +++ b/libsndfile-1.0.31/Octave/sndfile_save.m @@ -0,0 +1,53 @@ +## Copyright (C) 2002-2011 Erik de Castro Lopo +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2, or (at your option) +## any later version. +## +## This program is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## 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 file. If not, write to the Free Software Foundation, +## 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +## -*- texinfo -*- +## @deftypefn {Function File} {} sndfile_save (@var{filename, data, fs}) +## Save the given @var{data} as audio data to the given at @var{fs}. Set +## the sample rate to @var{fs}. +## @end deftypefn + +## Author: Erik de Castro Lopo +## Description: Save data as a sound file + +function sndfile_save (filename, data, fs) + +if nargin != 3, + error ("Need three input arguments: filename, data and fs.") ; + endif + +if (! isstr (filename)), + error ("First parameter 'filename' is must be a string.") ; + endif + +if (max (size (fs)) > 1), + error ("Second parameter 'fs' must be a single value, not an array or matrix.") ; + endif + +[nr nc] = size (data) ; + +if (nr > nc), + data = data' ; + endif + +samplerate = fs ; +wavedata = data ; + +str = sprintf ("save -mat-binary %s samplerate wavedata", filename) ; + +eval (str) ; + +endfunction diff --git a/libsndfile-1.0.31/README b/libsndfile-1.0.31/README new file mode 100644 index 0000000..93b4b29 --- /dev/null +++ b/libsndfile-1.0.31/README @@ -0,0 +1,76 @@ +This is libsndfile, 1.0.29 + +libsndfile is a library of C routines for reading and writing +files containing sampled audio data. + +The src/ directory contains the source code for library itself. + +The doc/ directory contains the libsndfile documentation. + +The examples/ directory contains examples of how to write code using +libsndfile. + +The tests/ directory contains programs which link against libsndfile +and test its functionality. + +The src/GSM610 directory contains code written by Jutta Degener and Carsten +Bormann. Their original code can be found at : + http://kbs.cs.tu-berlin.de/~jutta/toast.html + +The src/G72x directory contains code written and released by Sun Microsystems +under a suitably free license. + +The src/ALAC directory contains code written and released by Apple Inc and +released under the Apache license. + + +LINUX +----- +Whereever possible, you should use the packages supplied by your Linux +distribution. + +If you really do need to compile from source it should be as easy as: + + ./configure + make + make install + +Since libsndfile optionally links against libFLAC, libogg, libvorbis and +libopus, you will need to install appropriate versions of these libraries +before running configure as above. + +You can use CMake now to build under Linux, also under Windows and MacOS, see +README.md for details. CMake toolchain is usable, but still exterimental. + + +UNIX +---- +Compile as for Linux. + + +Win32/Win64 +----------- + +Official Windows binaries are compiled with Autotools and MinGW, but you can use +CMake to generate solution for Visual Studio. Details are described in +README.md. + +It is still recommended to use the libsndfile binaries available on the +libsndfile web site. + +MacOSX +------ +Building on MacOSX should be the same as building it on any other Unix. + + +CONTACTS +-------- + +libsndfile was written by Erik de Castro Lopo (erikd AT mega-nerd DOT com). +The libsndfile home page is at : + + http://libsndfile.github.io/libsndfile/ + +Bugs and support questions can be raised at : + + https://github.com/libsndfile/libsndfile/issues diff --git a/libsndfile-1.0.31/Scripts/android-configure.sh b/libsndfile-1.0.31/Scripts/android-configure.sh new file mode 100755 index 0000000..accb386 --- /dev/null +++ b/libsndfile-1.0.31/Scripts/android-configure.sh @@ -0,0 +1,96 @@ +#!/bin/bash -e + +# Copyright (C) 2013-2016 Erik de Castro Lopo +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Neither the author nor the names of any contributors may be used +# to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Android NDK version number; eg r10, r10b etc +ANDROID_NDK_VER=${ANDROID_NDK_VER:-r10} + +# Android NDK gcc version; eg 4.8, 4.9 etc. +ANDROID_GCC_VER=${ANDROID_GCC_VER:-4.9} + +# Android API version; eg 14 (Android 4.0), 21 (Android 5.0) etc. +ANDROID_API_VER=${ANDROID_API_VER:-14} + +ANDROID_TARGET=${ANDROID_TARGET:-arm-linux-androideabi} + +if test -z ${ANDROID_TOOLCHAIN_HOME} ; then + echo "Environment variable ANDROID_TOOLCHAIN_HOME not defined." + echo "This should point to the directory containing the Android NDK." + exit 1 + fi + +#------------------------------------------------------------------------------- +# No more user config beyond here. + +BUILD_MACHINE=$(uname -s | tr 'A-Z' 'a-z')-$(uname -m) + +function die_with { + echo $1 + exit 1 +} + +export CROSS_COMPILE=${ANDROID_TARGET} + +# Don't forget to adjust this to your NDK path +export ANDROID_NDK=${ANDROID_TOOLCHAIN_HOME}/android-ndk-${ANDROID_NDK_VER} +test -d ${ANDROID_NDK} || die_with "Error : ANDROID_NDK '$ANDROID_NDK' does not exist." + +export ANDROID_PREFIX=${ANDROID_NDK}/toolchains/arm-linux-androideabi-${ANDROID_GCC_VER}/prebuilt/${BUILD_MACHINE} +test -d ${ANDROID_PREFIX} || die_with "Error : ANDROID_PREFIX '$ANDROID_PREFIX' does not exist." + +export SYSROOT=${ANDROID_NDK}/platforms/android-${ANDROID_API_VER}/arch-arm +test -d ${SYSROOT} || die_with "Error : SYSROOT '$SYSROOT' does not exist." + +export CROSS_PREFIX=${ANDROID_PREFIX}/bin/${CROSS_COMPILE} +test -f ${CROSS_PREFIX}-gcc || die_with "Error : CROSS_PREFIX compiler '${CROSS_PREFIX}-gcc' does not exist." + + +# Non-exhaustive lists of compiler + binutils +# Depending on what you compile, you might need more binutils than that +export CPP=${CROSS_PREFIX}-cpp +export AR=${CROSS_PREFIX}-ar +export AS=${CROSS_PREFIX}-as +export NM=${CROSS_PREFIX}-nm +export CC=${CROSS_PREFIX}-gcc +export CXX=${CROSS_PREFIX}-g++ +export LD=${CROSS_PREFIX}-ld +export RANLIB=${CROSS_PREFIX}-ranlib + +# Don't mix up .pc files from your host and build target +export PKG_CONFIG_PATH=${PREFIX}/lib/pkgconfig + +# Set up the needed FLAGS. +export CFLAGS="${CFLAGS} -gstabs --sysroot=${SYSROOT} -I${SYSROOT}/usr/include -I${ANDROID_PREFIX}/include" +export CXXFLAGS="${CXXFLAGS} -gstabs -fno-exceptions --sysroot=${SYSROOT} -I${SYSROOT}/usr/include -I${ANDROID_PREFIX}/include -I${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_GCC_VER}/include/ -I${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_GCC_VER}/libs/armeabi/include" + +export CPPFLAGS="${CFLAGS}" +export LDFLAGS="${LDFLAGS} -L${SYSROOT}/usr/lib -L${ANDROID_PREFIX}/lib" + +# Create a symlink to the gdbclient. +test -h gdbclient || ln -s ${ANDROID_PREFIX}/bin/arm-linux-androideabi-gdb gdbclient + +./configure --host=${CROSS_COMPILE} --with-sysroot=${SYSROOT} "$@" diff --git a/libsndfile-1.0.31/Scripts/build-test-tarball.mk.in b/libsndfile-1.0.31/Scripts/build-test-tarball.mk.in new file mode 100644 index 0000000..5dac9d9 --- /dev/null +++ b/libsndfile-1.0.31/Scripts/build-test-tarball.mk.in @@ -0,0 +1,61 @@ +#!/usr/bin/make -f + +# This is probably only going to work with GNU Make. +# This in a separate file instead of in Makefile.am because Automake complains +# about the GNU Make-isms. + +EXEEXT = @EXEEXT@ + +PACKAGE_VERSION = @PACKAGE_VERSION@ + +HOST_TRIPLET = @HOST_TRIPLET@ + +SRC_BINDIR = @SRC_BINDIR@ +TEST_BINDIR = @TEST_BINDIR@ + +LIBRARY := $(SRC_BINDIR)libsndfile.so.$(LIB_VERSION) + +LIB_VERSION := $(shell echo $(PACKAGE_VERSION) | sed -e 's/[a-z].*//') + +TESTNAME = libsndfile-testsuite-$(HOST_TRIPLET)-$(PACKAGE_VERSION) + +TARBALL = $(TESTNAME).tar.gz + +# Find the test programs by grepping the script for the programs it executes. +testprogs := $(shell grep '^\./' tests/test_wrapper.sh | sed -e "s|./||" -e "s/ .*//" | sort | uniq) +# Also add the programs not found by the above. +testprogs += tests/sfversion$(EXEEXT) tests/stdin_test$(EXEEXT) tests/stdout_test$(EXEEXT) \ + tests/cpp_test$(EXEEXT) tests/win32_test$(EXEEXT) + +libfiles := $(shell if test ! -z $(EXEEXT) ; then echo "src/libsndfile-1.def src/.libs/libsndfile-1.dll" ; elif test -f $(LIBRARY) ; then echo $(LIBRARY) ; fi ; fi) + +testbins := $(testprogs) $(libfiles) + +all : $(TARBALL) + +clean : + rm -rf $(TARBALL) $(TESTNAME)/ + +check : $(TESTNAME)/test_wrapper.sh + (cd ./$(TESTNAME)/ && ./test_wrapper.sh) + +$(TARBALL) : $(TESTNAME)/test_wrapper.sh + tar zcf $@ $(TESTNAME) + rm -rf $(TESTNAME) + @echo + @echo "Created : $(TARBALL)" + @echo + +$(TESTNAME)/test_wrapper.sh : tests/test_wrapper.sh tests/pedantic-header-test.sh + rm -rf $(TESTNAME) + mkdir -p $(TESTNAME)/tests/ + echo + echo $(testbins) + echo + cp $(testbins) $(TESTNAME)/tests/ + cp tests/test_wrapper.sh $(TESTNAME)/ + cp tests/pedantic-header-test.sh $(TESTNAME)/tests/ + chmod u+x $@ + +tests/test_wrapper.sh : tests/test_wrapper.sh.in + make $@ diff --git a/libsndfile-1.0.31/Scripts/linux-to-win-cross-configure.sh b/libsndfile-1.0.31/Scripts/linux-to-win-cross-configure.sh new file mode 100755 index 0000000..c1fdc07 --- /dev/null +++ b/libsndfile-1.0.31/Scripts/linux-to-win-cross-configure.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +case "$1" in + w32) + compiler_name=i686-w64-mingw32 + ;; + w64) + compiler_name=x86_64-w64-mingw32 + ;; + *) + echo "$0 (w32|w64) " + exit 0 + ;; + esac + +shift + +build_cpu=$(dpkg-architecture -qDEB_BUILD_GNU_CPU) +build_host=$build_cpu-linux + +./configure --host=$compiler_name --target=$compiler_name --build=$build_host \ + --program-prefix='' --disable-sqlite --disable-static $@ diff --git a/libsndfile-1.0.31/Win32/README-precompiled-dll.txt b/libsndfile-1.0.31/Win32/README-precompiled-dll.txt new file mode 100644 index 0000000..bde8124 --- /dev/null +++ b/libsndfile-1.0.31/Win32/README-precompiled-dll.txt @@ -0,0 +1,40 @@ +Notes on Using the Pre-compiled libsndfile DLL. +=============================================== + +In order to use this pre-compiled DLL with Visual Studio, you will need to +generate a .LIB file from the DLL. + +This can be achieved as follows: + + 1) In a CMD window, change to the directory containing this file and + run the command: + + lib /machine:i386 /def:libsndfile-1.def + +You now have two files: + + libsndfile-1.dll + libsndfile-1.lib + +to be used with VisualStudio. + +If the lib command fails with a command saying "'lib' is not recognized as +an internal or external command, operable program or batch file", you need +to find the location of "lib.exe" and add that directory to your PATH +environment variable. Another alternative is to use the "Visual Studio 2005 +Command Prompt" Start menu item: + + Start -> + All Programs -> + Visual Studio 2005 -> + Visual Studio Tools -> + Visual Studio 2005 Command Prompt + +If for some reason these instructions don't work for you or you are still +not able to use the libsndfile DLL with you project, please do not contact +the main author of libsndfile. Instead, join the libsndfile-users mailing +list : + + http://www.mega-nerd.com/libsndfile/lists.html + +and ask a question there. diff --git a/libsndfile-1.0.31/Win32/testprog.c b/libsndfile-1.0.31/Win32/testprog.c new file mode 100644 index 0000000..d26d844 --- /dev/null +++ b/libsndfile-1.0.31/Win32/testprog.c @@ -0,0 +1,16 @@ +/* Simple test program to make sure that Win32 linking to libsndfile is +** working. +*/ + +#include + +#include "sndfile.h" + +int +main (void) +{ static char strbuffer [256] ; + sf_command (NULL, SFC_GET_LIB_VERSION, strbuffer, sizeof (strbuffer)) ; + puts (strbuffer) ; + return 0 ; +} + diff --git a/libsndfile-1.0.31/aclocal.m4 b/libsndfile-1.0.31/aclocal.m4 new file mode 100644 index 0000000..5b3b69c --- /dev/null +++ b/libsndfile-1.0.31/aclocal.m4 @@ -0,0 +1,1796 @@ +# generated automatically by aclocal 1.16.3 -*- Autoconf -*- + +# Copyright (C) 1996-2020 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 11 (pkg-config-0.29.1) + +dnl Copyright © 2004 Scott James Remnant . +dnl Copyright © 2012-2015 Dan Nicholson +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +dnl 02111-1307, USA. +dnl +dnl As a special exception to the GNU General Public License, if you +dnl distribute this file as part of a program that contains a +dnl configuration script generated by Autoconf, you may include it under +dnl the same distribution terms that you use for the rest of that +dnl program. + +dnl PKG_PREREQ(MIN-VERSION) +dnl ----------------------- +dnl Since: 0.29 +dnl +dnl Verify that the version of the pkg-config macros are at least +dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's +dnl installed version of pkg-config, this checks the developer's version +dnl of pkg.m4 when generating configure. +dnl +dnl To ensure that this macro is defined, also add: +dnl m4_ifndef([PKG_PREREQ], +dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) +dnl +dnl See the "Since" comment for each macro you use to see what version +dnl of the macros you require. +m4_defun([PKG_PREREQ], +[m4_define([PKG_MACROS_VERSION], [0.29.1]) +m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, + [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) +])dnl PKG_PREREQ + +dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) +dnl ---------------------------------- +dnl Since: 0.16 +dnl +dnl Search for the pkg-config tool and set the PKG_CONFIG variable to +dnl first found in the path. Checks that the version of pkg-config found +dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is +dnl used since that's the first version where most current features of +dnl pkg-config existed. +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])dnl PKG_PROG_PKG_CONFIG + +dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------------------------------- +dnl Since: 0.18 +dnl +dnl Check to see whether a particular set of modules exists. Similar to +dnl PKG_CHECK_MODULES(), but does not set variables or print errors. +dnl +dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +dnl only at the first occurence in configure.ac, so if the first place +dnl it's called might be skipped (such as if it is within an "if", you +dnl have to call PKG_CHECK_EXISTS manually +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +dnl --------------------------------------------- +dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting +dnl pkg_failed based on the result. +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])dnl _PKG_CONFIG + +dnl _PKG_SHORT_ERRORS_SUPPORTED +dnl --------------------------- +dnl Internal check to see if pkg-config supports short errors. +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])dnl _PKG_SHORT_ERRORS_SUPPORTED + + +dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl -------------------------------------------------------------- +dnl Since: 0.4.0 +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES might not happen, you should be sure to include an +dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])dnl PKG_CHECK_MODULES + + +dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl --------------------------------------------------------------------- +dnl Since: 0.29 +dnl +dnl Checks for existence of MODULES and gathers its build flags with +dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags +dnl and VARIABLE-PREFIX_LIBS from --libs. +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to +dnl include an explicit call to PKG_PROG_PKG_CONFIG in your +dnl configure.ac. +AC_DEFUN([PKG_CHECK_MODULES_STATIC], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +_save_PKG_CONFIG=$PKG_CONFIG +PKG_CONFIG="$PKG_CONFIG --static" +PKG_CHECK_MODULES($@) +PKG_CONFIG=$_save_PKG_CONFIG[]dnl +])dnl PKG_CHECK_MODULES_STATIC + + +dnl PKG_INSTALLDIR([DIRECTORY]) +dnl ------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable pkgconfigdir as the location where a module +dnl should install pkg-config .pc files. By default the directory is +dnl $libdir/pkgconfig, but the default can be changed by passing +dnl DIRECTORY. The user can override through the --with-pkgconfigdir +dnl parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_INSTALLDIR + + +dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) +dnl -------------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable noarch_pkgconfigdir as the location where a +dnl module should install arch-independent pkg-config .pc files. By +dnl default the directory is $datadir/pkgconfig, but the default can be +dnl changed by passing DIRECTORY. The user can override through the +dnl --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_NOARCH_INSTALLDIR + + +dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------- +dnl Since: 0.28 +dnl +dnl Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])dnl PKG_CHECK_VAR + +dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------ +dnl +dnl Prepare a "--with-" configure option using the lowercase +dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and +dnl PKG_CHECK_MODULES in a single macro. +AC_DEFUN([PKG_WITH_MODULES], +[ +m4_pushdef([with_arg], m4_tolower([$1])) + +m4_pushdef([description], + [m4_default([$5], [build with ]with_arg[ support])]) + +m4_pushdef([def_arg], [m4_default([$6], [auto])]) +m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) +m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) + +m4_case(def_arg, + [yes],[m4_pushdef([with_without], [--without-]with_arg)], + [m4_pushdef([with_without],[--with-]with_arg)]) + +AC_ARG_WITH(with_arg, + AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, + [AS_TR_SH([with_]with_arg)=def_arg]) + +AS_CASE([$AS_TR_SH([with_]with_arg)], + [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], + [auto],[PKG_CHECK_MODULES([$1],[$2], + [m4_n([def_action_if_found]) $3], + [m4_n([def_action_if_not_found]) $4])]) + +m4_popdef([with_arg]) +m4_popdef([description]) +m4_popdef([def_arg]) + +])dnl PKG_WITH_MODULES + +dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ----------------------------------------------- +dnl +dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES +dnl check._[VARIABLE-PREFIX] is exported as make variable. +AC_DEFUN([PKG_HAVE_WITH_MODULES], +[ +PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) + +AM_CONDITIONAL([HAVE_][$1], + [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) +])dnl PKG_HAVE_WITH_MODULES + +dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------------------ +dnl +dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after +dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make +dnl and preprocessor variable. +AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], +[ +PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) + +AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], + [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) +])dnl PKG_HAVE_DEFINE_WITH_MODULES + +# Copyright (C) 2002-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.16' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.16.3], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.16.3])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# Copyright (C) 2011-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_AR([ACT-IF-FAIL]) +# ------------------------- +# Try to determine the archiver interface, and trigger the ar-lib wrapper +# if it is needed. If the detection of archiver interface fails, run +# ACT-IF-FAIL (default is to abort configure with a proper error message). +AC_DEFUN([AM_PROG_AR], +[AC_BEFORE([$0], [LT_INIT])dnl +AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([ar-lib])dnl +AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) +: ${AR=ar} + +AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], + [AC_LANG_PUSH([C]) + am_cv_ar_interface=ar + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], + [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + ]) + AC_LANG_POP([C])]) + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + m4_default([$1], + [AC_MSG_ERROR([could not determine $AR interface])]) + ;; +esac +AC_SUBST([AR])dnl +]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + AS_CASE([$CONFIG_FILES], + [*\'*], [eval set x "$CONFIG_FILES"], + [*], [set x $CONFIG_FILES]) + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`AS_DIRNAME(["$am_mf"])` + am_filepart=`AS_BASENAME(["$am_mf"])` + AM_RUN_LOG([cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles]) || am_rc=$? + done + if test $am_rc -ne 0; then + AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE="gmake" (or whatever is + necessary). You can also try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking).]) + fi + AS_UNSET([am_dirpart]) + AS_UNSET([am_filepart]) + AS_UNSET([am_mf]) + AS_UNSET([am_rc]) + rm -f conftest-deps.mk +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking is enabled. +# This creates each '.Po' and '.Plo' makefile fragment that we'll need in +# order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check whether make has an 'include' directive that can support all +# the idioms we need for our automatic dependency tracking code. +AC_DEFUN([AM_MAKE_INCLUDE], +[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) + AS_CASE([$?:`cat confinc.out 2>/dev/null`], + ['0:this is the am__doit target'], + [AS_CASE([$s], + [BSD], [am__include='.include' am__quote='"'], + [am__include='include' am__quote=''])]) + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +AC_MSG_RESULT([${_am_result}]) +AC_SUBST([am__include])]) +AC_SUBST([am__quote])]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + MISSING="\${SHELL} '$am_aux_dir/missing'" +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 1999-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# --------------------------------------------------------------------------- +# Adds support for distributing Python modules and packages. To +# install modules, copy them to $(pythondir), using the python_PYTHON +# automake variable. To install a package with the same name as the +# automake package, install to $(pkgpythondir), or use the +# pkgpython_PYTHON automake variable. +# +# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as +# locations to install python extension modules (shared libraries). +# Another macro is required to find the appropriate flags to compile +# extension modules. +# +# If your package is configured with a different prefix to python, +# users will have to add the install directory to the PYTHONPATH +# environment variable, or create a .pth file (see the python +# documentation for details). +# +# If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will +# cause an error if the version of python installed on the system +# doesn't meet the requirement. MINIMUM-VERSION should consist of +# numbers and dots only. +AC_DEFUN([AM_PATH_PYTHON], + [ + dnl Find a Python interpreter. Python versions prior to 2.0 are not + dnl supported. (2.0 was released on October 16, 2000). + m4_define_default([_AM_PYTHON_INTERPRETER_LIST], +[python python2 python3 dnl + python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 dnl + python3.2 python3.1 python3.0 dnl + python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 dnl + python2.0]) + + AC_ARG_VAR([PYTHON], [the Python interpreter]) + + m4_if([$1],[],[ + dnl No version check is needed. + # Find any Python interpreter. + if test -z "$PYTHON"; then + AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) + fi + am_display_PYTHON=python + ], [ + dnl A version check is needed. + if test -n "$PYTHON"; then + # If the user set $PYTHON, use it and don't search something else. + AC_MSG_CHECKING([whether $PYTHON version is >= $1]) + AM_PYTHON_CHECK_VERSION([$PYTHON], [$1], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AC_MSG_ERROR([Python interpreter is too old])]) + am_display_PYTHON=$PYTHON + else + # Otherwise, try each interpreter until we find one that satisfies + # VERSION. + AC_CACHE_CHECK([for a Python interpreter with version >= $1], + [am_cv_pathless_PYTHON],[ + for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do + test "$am_cv_pathless_PYTHON" = none && break + AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) + done]) + # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. + if test "$am_cv_pathless_PYTHON" = none; then + PYTHON=: + else + AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) + fi + am_display_PYTHON=$am_cv_pathless_PYTHON + fi + ]) + + if test "$PYTHON" = :; then + dnl Run any user-specified action, or abort. + m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) + else + + dnl Query Python for its version number. Although site.py simply uses + dnl sys.version[:3], printing that failed with Python 3.10, since the + dnl trailing zero was eliminated. So now we output just the major + dnl and minor version numbers, as numbers. Apparently the tertiary + dnl version is not of interest. + + AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], + [am_cv_python_version=`$PYTHON -c "import sys; print('%u.%u' % sys.version_info[[:2]])"`]) + AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) + + dnl Use the values of $prefix and $exec_prefix for the corresponding + dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made + dnl distinct variables so they can be overridden if need be. However, + dnl general consensus is that you shouldn't need this ability. + + AC_SUBST([PYTHON_PREFIX], ['${prefix}']) + AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}']) + + dnl At times (like when building shared libraries) you may want + dnl to know which OS platform Python thinks this is. + + AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], + [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`]) + AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) + + # Just factor out some code duplication. + am_python_setup_sysconfig="\ +import sys +# Prefer sysconfig over distutils.sysconfig, for better compatibility +# with python 3.x. See automake bug#10227. +try: + import sysconfig +except ImportError: + can_use_sysconfig = 0 +else: + can_use_sysconfig = 1 +# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: +# +try: + from platform import python_implementation + if python_implementation() == 'CPython' and sys.version[[:3]] == '2.7': + can_use_sysconfig = 0 +except ImportError: + pass" + + dnl Set up 4 directories: + + dnl pythondir -- where to install python scripts. This is the + dnl site-packages directory, not the python standard library + dnl directory like in previous automake betas. This behavior + dnl is more consistent with lispdir.m4 for example. + dnl Query distutils for this directory. + AC_CACHE_CHECK([for $am_display_PYTHON script directory], + [am_cv_python_pythondir], + [if test "x$prefix" = xNONE + then + am_py_prefix=$ac_default_prefix + else + am_py_prefix=$prefix + fi + am_cv_python_pythondir=`$PYTHON -c " +$am_python_setup_sysconfig +if can_use_sysconfig: + sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) +else: + from distutils import sysconfig + sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') +sys.stdout.write(sitedir)"` + case $am_cv_python_pythondir in + $am_py_prefix*) + am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` + am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` + ;; + *) + case $am_py_prefix in + /usr|/System*) ;; + *) + am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages + ;; + esac + ;; + esac + ]) + AC_SUBST([pythondir], [$am_cv_python_pythondir]) + + dnl pkgpythondir -- $PACKAGE directory under pythondir. Was + dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is + dnl more consistent with the rest of automake. + + AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) + + dnl pyexecdir -- directory for installing python extension modules + dnl (shared libraries) + dnl Query distutils for this directory. + AC_CACHE_CHECK([for $am_display_PYTHON extension module directory], + [am_cv_python_pyexecdir], + [if test "x$exec_prefix" = xNONE + then + am_py_exec_prefix=$am_py_prefix + else + am_py_exec_prefix=$exec_prefix + fi + am_cv_python_pyexecdir=`$PYTHON -c " +$am_python_setup_sysconfig +if can_use_sysconfig: + sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'}) +else: + from distutils import sysconfig + sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix') +sys.stdout.write(sitedir)"` + case $am_cv_python_pyexecdir in + $am_py_exec_prefix*) + am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` + am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` + ;; + *) + case $am_py_exec_prefix in + /usr|/System*) ;; + *) + am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages + ;; + esac + ;; + esac + ]) + AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) + + dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE) + + AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) + + dnl Run any user-specified action. + $2 + fi + +]) + + +# AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) +# --------------------------------------------------------------------------- +# Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION. +# Run ACTION-IF-FALSE otherwise. +# This test uses sys.hexversion instead of the string equivalent (first +# word of sys.version), in order to cope with versions such as 2.2c1. +# This supports Python 2.0 or higher. (2.0 was released on October 16, 2000). +AC_DEFUN([AM_PYTHON_CHECK_VERSION], + [prog="import sys +# split strings by '.' and convert to numeric. Append some zeros +# because we need at least 4 digits for the hex conversion. +# map returns an iterator in Python 3.0 and a list in 2.x +minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]] +minverhex = 0 +# xrange is not present in Python 3.0 and range returns an iterator +for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]] +sys.exit(sys.hexversion < minverhex)" + AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) + +# Copyright (C) 2001-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2020 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/ax_add_fortify_source.m4]) +m4_include([m4/ax_append_compile_flags.m4]) +m4_include([m4/ax_append_flag.m4]) +m4_include([m4/ax_append_link_flags.m4]) +m4_include([m4/ax_check_compile_flag.m4]) +m4_include([m4/ax_check_link_flag.m4]) +m4_include([m4/ax_compiler_vendor.m4]) +m4_include([m4/ax_compiler_version.m4]) +m4_include([m4/ax_recursive_eval.m4]) +m4_include([m4/ax_require_defined.m4]) +m4_include([m4/clip_mode.m4]) +m4_include([m4/extra_pkg.m4]) +m4_include([m4/libtool.m4]) +m4_include([m4/ltoptions.m4]) +m4_include([m4/ltsugar.m4]) +m4_include([m4/ltversion.m4]) +m4_include([m4/lt~obsolete.m4]) +m4_include([m4/mkoctfile_version.m4]) +m4_include([m4/octave.m4]) +m4_include([m4/stack_protect.m4]) diff --git a/libsndfile-1.0.31/build-aux/ar-lib b/libsndfile-1.0.31/build-aux/ar-lib new file mode 100755 index 0000000..1e9388e --- /dev/null +++ b/libsndfile-1.0.31/build-aux/ar-lib @@ -0,0 +1,271 @@ +#! /bin/sh +# Wrapper for Microsoft lib.exe + +me=ar-lib +scriptversion=2019-07-04.01; # UTC + +# Copyright (C) 2010-2020 Free Software Foundation, Inc. +# Written by Peter Rosin . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + + +# func_error message +func_error () +{ + echo "$me: $1" 1>&2 + exit 1 +} + +file_conv= + +# func_file_conv build_file +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN* | MSYS*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv in + mingw) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin | msys) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_at_file at_file operation archive +# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE +# for each of them. +# When interpreting the content of the @FILE, do NOT use func_file_conv, +# since the user would need to supply preconverted file names to +# binutils ar, at least for MinGW. +func_at_file () +{ + operation=$2 + archive=$3 + at_file_contents=`cat "$1"` + eval set x "$at_file_contents" + shift + + for member + do + $AR -NOLOGO $operation:"$member" "$archive" || exit $? + done +} + +case $1 in + '') + func_error "no command. Try '$0 --help' for more information." + ;; + -h | --h*) + cat <. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN* | MSYS*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/* | msys/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/libsndfile-1.0.31/build-aux/config.guess b/libsndfile-1.0.31/build-aux/config.guess new file mode 100755 index 0000000..f772702 --- /dev/null +++ b/libsndfile-1.0.31/build-aux/config.guess @@ -0,0 +1,1701 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2021 Free Software Foundation, Inc. + +timestamp='2021-01-01' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# 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, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess +# +# Please send patches to . + + +me=$(echo "$0" | sed -e 's,.*/,,') + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2021 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039 + { tmp=$( (umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null) && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$driver" + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if test -f /.attbin/uname ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=$( (uname -m) 2>/dev/null) || UNAME_MACHINE=unknown +UNAME_RELEASE=$( (uname -r) 2>/dev/null) || UNAME_RELEASE=unknown +UNAME_SYSTEM=$( (uname -s) 2>/dev/null) || UNAME_SYSTEM=unknown +UNAME_VERSION=$( (uname -v) 2>/dev/null) || UNAME_VERSION=unknown + +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) + LIBC=unknown + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #elif defined(__GLIBC__) + LIBC=gnu + #else + #include + /* First heuristic to detect musl libc. */ + #ifdef __DEFINED_va_list + LIBC=musl + #endif + #endif + EOF + eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g')" + + # Second heuristic to detect musl libc. + if [ "$LIBC" = unknown ] && + command -v ldd >/dev/null && + ldd --version 2>&1 | grep -q ^musl; then + LIBC=musl + fi + + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + if [ "$LIBC" = unknown ]; then + LIBC=gnu + fi + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=$( (uname -p 2>/dev/null || \ + "/sbin/$sysctl" 2>/dev/null || \ + "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)) + case "$UNAME_MACHINE_ARCH" in + aarch64eb) machine=aarch64_be-unknown ;; + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=$(echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,') + endian=$(echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p') + machine="${arch}${endian}"-unknown + ;; + *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=$(echo "$UNAME_MACHINE_ARCH" | sed -e "$expr") + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "$UNAME_VERSION" in + Debian*) + release='-gnu' + ;; + *) + release=$(echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2) + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "$machine-${os}${release}${abi-}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=$(arch | sed 's/Bitrig.//') + echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=$(arch | sed 's/OpenBSD.//') + echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=$(arch | sed 's/^.*BSD\.//') + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" + exit ;; + *:ekkoBSD:*:*) + echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" + exit ;; + *:SolidBSD:*:*) + echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" + exit ;; + *:OS108:*:*) + echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE" + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:MirBSD:*:*) + echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix + exit ;; + *:Twizzler:*:*) + echo "$UNAME_MACHINE"-unknown-twizzler + exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $3}') + ;; + *5.*) + UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $4}') + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=$(/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1) + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo "$UNAME_MACHINE"-dec-osf"$(echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)" + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix"$UNAME_RELEASE" + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "$( (/bin/universe) 2>/dev/null)" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case $(/usr/bin/uname -p) in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo "$UNAME_MACHINE"-ibm-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')" + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')" + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux"$UNAME_RELEASE" + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + echo "$SUN_ARCH"-pc-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" + exit ;; + sun4*:SunOS:*:*) + case "$(/usr/bin/arch -k)" in + Series*|S4*) + UNAME_RELEASE=$(uname -v) + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/')" + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos"$UNAME_RELEASE" + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=$( (sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null) + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case "$(/bin/arch)" in + sun3) + echo m68k-sun-sunos"$UNAME_RELEASE" + ;; + sun4) + echo sparc-sun-sunos"$UNAME_RELEASE" + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos"$UNAME_RELEASE" + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint"$UNAME_RELEASE" + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint"$UNAME_RELEASE" + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint"$UNAME_RELEASE" + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten"$UNAME_RELEASE" + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten"$UNAME_RELEASE" + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix"$UNAME_RELEASE" + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix"$UNAME_RELEASE" + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix"$UNAME_RELEASE" + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=$(echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p') && + SYSTEM_NAME=$("$dummy" "$dummyarg") && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos"$UNAME_RELEASE" + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=$(/usr/bin/uname -p) + if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 + then + if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ + test "$TARGET_BINARY_INTERFACE"x = x + then + echo m88k-dg-dgux"$UNAME_RELEASE" + else + echo m88k-dg-dguxbcs"$UNAME_RELEASE" + fi + else + echo i586-dg-dgux"$UNAME_RELEASE" + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/g')" + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'$(uname -s)'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if test -x /usr/bin/oslevel ; then + IBM_REV=$(/usr/bin/oslevel) + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy") + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=$(/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }') + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if test -x /usr/bin/lslpp ; then + IBM_REV=$(/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/) + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$IBM_ARCH"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//') + case "$UNAME_MACHINE" in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if test -x /usr/bin/getconf; then + sc_cpu_version=$(/usr/bin/getconf SC_CPU_VERSION 2>/dev/null) + sc_kernel_bits=$(/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null) + case "$sc_cpu_version" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "$sc_kernel_bits" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if test "$HP_ARCH" = ""; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=$("$dummy") + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if test "$HP_ARCH" = hppa2.0w + then + set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo "$HP_ARCH"-hp-hpux"$HPUX_REV" + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//') + echo ia64-hp-hpux"$HPUX_REV" + exit ;; + 3050*:HI-UX:*:*) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy") && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if test -x /usr/sbin/sysversion ; then + echo "$UNAME_MACHINE"-unknown-osf1mk + else + echo "$UNAME_MACHINE"-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=$(uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz) + FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///') + FUJITSU_REL=$(echo "$UNAME_RELEASE" | sed -e 's/ /_/') + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///') + FUJITSU_REL=$(echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/') + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:BSD/OS:*:*) + echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" + exit ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=$(uname -p) + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabi + else + echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabihf + fi + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=$(/usr/bin/uname -p) + case "$UNAME_PROCESSOR" in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')" + exit ;; + i*:CYGWIN*:*) + echo "$UNAME_MACHINE"-pc-cygwin + exit ;; + *:MINGW64*:*) + echo "$UNAME_MACHINE"-pc-mingw64 + exit ;; + *:MINGW*:*) + echo "$UNAME_MACHINE"-pc-mingw32 + exit ;; + *:MSYS*:*) + echo "$UNAME_MACHINE"-pc-msys + exit ;; + i*:PW*:*) + echo "$UNAME_MACHINE"-pc-pw32 + exit ;; + *:Interix*:*) + case "$UNAME_MACHINE" in + x86) + echo i586-pc-interix"$UNAME_RELEASE" + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix"$UNAME_RELEASE" + exit ;; + IA64) + echo ia64-unknown-interix"$UNAME_RELEASE" + exit ;; + esac ;; + i*:UWIN*:*) + echo "$UNAME_MACHINE"-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-pc-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" + exit ;; + *:GNU:*:*) + # the GNU system + echo "$(echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,')-unknown-$LIBC$(echo "$UNAME_RELEASE"|sed -e 's,/.*$,,')" + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo "$UNAME_MACHINE-unknown-$(echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]")$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')-$LIBC" + exit ;; + *:Minix:*:*) + echo "$UNAME_MACHINE"-unknown-minix + exit ;; + aarch64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + alpha:Linux:*:*) + case $(sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null) in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arm*:Linux:*:*) + set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + else + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + cris:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + crisv32:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + frv:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + hexagon:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + ia64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m32r*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m68*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + MIPS_ENDIAN=el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + MIPS_ENDIAN= + #else + MIPS_ENDIAN= + #endif + #endif +EOF + eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI')" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-"$LIBC" + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-"$LIBC" + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case $(grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2) in + PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; + PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; + *) echo hppa-unknown-linux-"$LIBC" ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-"$LIBC" + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-"$LIBC" + exit ;; + riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" + exit ;; + sh64*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sh*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + tile*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + vax:Linux:*:*) + echo "$UNAME_MACHINE"-dec-linux-"$LIBC" + exit ;; + x86_64:Linux:*:*) + set_cc_for_build + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_X32 >/dev/null + then + LIBCABI="$LIBC"x32 + fi + fi + echo "$UNAME_MACHINE"-pc-linux-"$LIBCABI" + exit ;; + xtensa*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo "$UNAME_MACHINE"-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo "$UNAME_MACHINE"-unknown-stop + exit ;; + i*86:atheos:*:*) + echo "$UNAME_MACHINE"-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo "$UNAME_MACHINE"-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos"$UNAME_RELEASE" + exit ;; + i*86:*DOS:*:*) + echo "$UNAME_MACHINE"-pc-msdosdjgpp + exit ;; + i*86:*:4.*:*) + UNAME_REL=$(echo "$UNAME_RELEASE" | sed 's/\/MP$//') + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case $(/bin/uname -X | grep "^Machine") in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}" + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=$(sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=$( (/bin/uname -X|grep Release|sed -e 's/.*= //')) + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos"$UNAME_RELEASE" + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos"$UNAME_RELEASE" + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv"$UNAME_RELEASE" + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=$( (uname -p) 2>/dev/null) + echo "$UNAME_MACHINE"-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo "$UNAME_MACHINE"-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux"$UNAME_RELEASE" + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if test -d /usr/nec; then + echo mips-nec-sysv"$UNAME_RELEASE" + else + echo mips-unknown-sysv"$UNAME_RELEASE" + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux"$UNAME_RELEASE" + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux"$UNAME_RELEASE" + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux"$UNAME_RELEASE" + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux"$UNAME_RELEASE" + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux"$UNAME_RELEASE" + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Rhapsody:*:*) + echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" + exit ;; + arm64:Darwin:*:*) + echo aarch64-apple-darwin"$UNAME_RELEASE" + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=$(uname -p) + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build + fi + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE + fi + echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=$(uname -p) + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk"$UNAME_RELEASE" + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + # shellcheck disable=SC2154 + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo "$UNAME_MACHINE"-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux"$UNAME_RELEASE" + exit ;; + *:DragonFly:*:*) + echo "$UNAME_MACHINE"-unknown-dragonfly"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')" + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=$( (uname -p) 2>/dev/null) + case "$UNAME_MACHINE" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo "$UNAME_MACHINE"-pc-skyos"$(echo "$UNAME_RELEASE" | sed -e 's/ .*$//')" + exit ;; + i*86:rdos:*:*) + echo "$UNAME_MACHINE"-pc-rdos + exit ;; + i*86:AROS:*:*) + echo "$UNAME_MACHINE"-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo "$UNAME_MACHINE"-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; + *:Unleashed:*:*) + echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE" + exit ;; +esac + +# No uname command or uname output not recognized. +set_cc_for_build +cat > "$dummy.c" < +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=$( (hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null); + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); +#endif + +#if defined (vax) +#if !defined (ultrix) +#include +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=$($dummy) && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } + +echo "$0: unable to guess system type" >&2 + +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 <&2 </dev/null || echo unknown) +uname -r = $( (uname -r) 2>/dev/null || echo unknown) +uname -s = $( (uname -s) 2>/dev/null || echo unknown) +uname -v = $( (uname -v) 2>/dev/null || echo unknown) + +/usr/bin/uname -p = $( (/usr/bin/uname -p) 2>/dev/null) +/bin/uname -X = $( (/bin/uname -X) 2>/dev/null) + +hostinfo = $( (hostinfo) 2>/dev/null) +/bin/universe = $( (/bin/universe) 2>/dev/null) +/usr/bin/arch -k = $( (/usr/bin/arch -k) 2>/dev/null) +/bin/arch = $( (/bin/arch) 2>/dev/null) +/usr/bin/oslevel = $( (/usr/bin/oslevel) 2>/dev/null) +/usr/convex/getsysinfo = $( (/usr/convex/getsysinfo) 2>/dev/null) + +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" +EOF +fi + +exit 1 + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/libsndfile-1.0.31/build-aux/config.sub b/libsndfile-1.0.31/build-aux/config.sub new file mode 100755 index 0000000..4d89efe --- /dev/null +++ b/libsndfile-1.0.31/build-aux/config.sub @@ -0,0 +1,1876 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2021 Free Software Foundation, Inc. + +timestamp='2021-01-07' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# 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, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=$(echo "$0" | sed -e 's,.*/,,') + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2021 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Split fields of configuration type +# shellcheck disable=SC2162 +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 + ;; + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 + ;; + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac + ;; + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + basic_os= + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac + ;; + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + basic_os=bsd + ;; + convex-c2) + basic_machine=c2-convex + basic_os=bsd + ;; + convex-c32) + basic_machine=c32-convex + basic_os=bsd + ;; + convex-c34) + basic_machine=c34-convex + basic_os=bsd + ;; + convex-c38) + basic_machine=c38-convex + basic_os=bsd + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac + ;; +esac + +# Decode 1-component or ad-hoc basic machines +case $basic_machine in + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond + ;; + op50n) + cpu=hppa1.1 + vendor=oki + ;; + op60c) + cpu=hppa1.1 + vendor=oki + ;; + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + basic_os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + basic_os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + basic_os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + basic_os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=$(echo "$1" | sed -e 's/86.*/86/') + vendor=pc + basic_os=sysv32 + ;; + i*86v4*) + cpu=$(echo "$1" | sed -e 's/86.*/86/') + vendor=pc + basic_os=sysv4 + ;; + i*86v) + cpu=$(echo "$1" | sed -e 's/86.*/86/') + vendor=pc + basic_os=sysv + ;; + i*86sol2) + cpu=$(echo "$1" | sed -e 's/86.*/86/') + vendor=pc + basic_os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $basic_os in + irix*) + ;; + *) + basic_os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint + ;; + mipsEE* | ee) + cpu=mips64r5900el + vendor=scei + case $os in + linux*) + ;; + *) + os=elf + ;; + esac + ;; + iop) + cpu=mipsel + vendor=scei + os=irx + ;; + dvp) + cpu=dvp + vendor=scei + os=elf + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + basic_os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $basic_os in + openstep*) + ;; + nextstep*) + ;; + ns2*) + basic_os=nextstep2 + ;; + *) + basic_os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + basic_os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=$(echo "$basic_machine" | sed 's/-.*//') + ;; + + *-*) + # shellcheck disable=SC2162 + IFS="-" read cpu vendor <&2 + exit 1 + ;; + esac + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $vendor in + digital*) + vendor=dec + ;; + commodore*) + vendor=cbm + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if test x$basic_os != x +then + +# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just +# set os. +case $basic_os in + gnu/linux*) + kernel=linux + os=$(echo $basic_os | sed -e 's|gnu/linux|gnu|') + ;; + os2-emx) + kernel=os2 + os=$(echo $basic_os | sed -e 's|os2-emx|emx|') + ;; + nto-qnx*) + kernel=nto + os=$(echo $basic_os | sed -e 's|nto-qnx|qnx|') + ;; + *-*) + # shellcheck disable=SC2162 + IFS="-" read kernel os <&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os in + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* ) + ;; + uclinux-uclibc* ) + ;; + -dietlibc* | -newlib* | -musl* | -uclibc* ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + kfreebsd*-gnu* | kopensolaris*-gnu*) + ;; + nto-qnx*) + ;; + os2-emx) + ;; + *-eabi* | *-gnueabi*) + ;; + -*) + # Blank kernel with real OS is always fine. + ;; + *-*) + echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + exit 1 + ;; +esac + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +case $vendor in + unknown) + case $cpu-$os in + *-riscix*) + vendor=acorn + ;; + *-sunos*) + vendor=sun + ;; + *-cnk* | *-aix*) + vendor=ibm + ;; + *-beos*) + vendor=be + ;; + *-hpux*) + vendor=hp + ;; + *-mpeix*) + vendor=hp + ;; + *-hiux*) + vendor=hitachi + ;; + *-unos*) + vendor=crds + ;; + *-dgux*) + vendor=dg + ;; + *-luna*) + vendor=omron + ;; + *-genix*) + vendor=ns + ;; + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) + vendor=ibm + ;; + *-os400*) + vendor=ibm + ;; + s390-* | s390x-*) + vendor=ibm + ;; + *-ptx*) + vendor=sequent + ;; + *-tpf*) + vendor=ibm + ;; + *-vxsim* | *-vxworks* | *-windiss*) + vendor=wrs + ;; + *-aux*) + vendor=apple + ;; + *-hms*) + vendor=hitachi + ;; + *-mpw* | *-macos*) + vendor=apple + ;; + *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) + vendor=atari + ;; + *-vos*) + vendor=stratus + ;; + esac + ;; +esac + +echo "$cpu-$vendor-${kernel:+$kernel-}$os" +exit + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/libsndfile-1.0.31/build-aux/depcomp b/libsndfile-1.0.31/build-aux/depcomp new file mode 100755 index 0000000..6b39162 --- /dev/null +++ b/libsndfile-1.0.31/build-aux/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1999-2020 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/libsndfile-1.0.31/build-aux/install-sh b/libsndfile-1.0.31/build-aux/install-sh new file mode 100755 index 0000000..ec298b5 --- /dev/null +++ b/libsndfile-1.0.31/build-aux/install-sh @@ -0,0 +1,541 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2020-11-14.01; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +# Create dirs (including intermediate dirs) using mode 755. +# This is like GNU 'install' as of coreutils 8.32 (2020). +mkdir_umask=22 + +backupsuffix= +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -p pass -p to $cpprog. + -s $stripprog installed files. + -S SUFFIX attempt to back up existing files, with suffix SUFFIX. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG + +By default, rm is invoked with -f; when overridden with RMPROG, +it's up to you to specify -f if you want it. + +If -S is not specified, no backups are attempted. + +Email bug reports to bug-automake@gnu.org. +Automake home page: https://www.gnu.org/software/automake/ +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -p) cpprog="$cpprog -p";; + + -s) stripcmd=$stripprog;; + + -S) backupsuffix="$2" + shift;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + # Don't chown directories that already exist. + if test $dstdir_status = 0; then + chowncmd="" + fi + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dstbase=`basename "$src"` + case $dst in + */) dst=$dst$dstbase;; + *) dst=$dst/$dstbase;; + esac + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + case $dstdir in + */) dstdirslash=$dstdir;; + *) dstdirslash=$dstdir/;; + esac + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + # The $RANDOM variable is not portable (e.g., dash). Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + + trap ' + ret=$? + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null + exit $ret + ' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p'. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=${dstdirslash}_inst.$$_ + rmtmp=${dstdirslash}_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && + { test -z "$stripcmd" || { + # Create $dsttmp read-write so that cp doesn't create it read-only, + # which would cause strip to fail. + if test -z "$doit"; then + : >"$dsttmp" # No need to fork-exec 'touch'. + else + $doit touch "$dsttmp" + fi + } + } && + $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # If $backupsuffix is set, and the file being installed + # already exists, attempt a backup. Don't worry if it fails, + # e.g., if mv doesn't support -f. + if test -n "$backupsuffix" && test -f "$dst"; then + $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null + fi + + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/libsndfile-1.0.31/build-aux/ltmain.sh b/libsndfile-1.0.31/build-aux/ltmain.sh new file mode 100644 index 0000000..e774ddf --- /dev/null +++ b/libsndfile-1.0.31/build-aux/ltmain.sh @@ -0,0 +1,11210 @@ +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2014-01-03.01 + +# libtool (GNU libtool) 2.4.6 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# 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, see . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4.6 +package_revision=2.4.6 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2015-10-04.22; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# As a special exception to the GNU General Public License, if you distribute +# this file as part of a program or library that is built using GNU Libtool, +# you may include this file under the same distribution terms that you use +# for the rest of that program. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES 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, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote ARG +# -------------- +# Aesthetically quote one ARG, store the result into $func_quote_result. Note +# that we keep attention to performance here (so far O(N) complexity as long as +# func_append is O(1)). +func_quote () +{ + $debug_cmd + + func_quote_result=$1 + + case $func_quote_result in + *[\\\`\"\$]*) + case $func_quote_result in + *[\[\*\?]*) + func_quote_result=`$ECHO "$func_quote_result" | $SED "$sed_quote_subst"` + return 0 + ;; + esac + + func_quote_old_IFS=$IFS + for _G_char in '\' '`' '"' '$' + do + # STATE($1) PREV($2) SEPARATOR($3) + set start "" "" + func_quote_result=dummy"$_G_char$func_quote_result$_G_char"dummy + IFS=$_G_char + for _G_part in $func_quote_result + do + case $1 in + quote) + func_append func_quote_result "$3$2" + set quote "$_G_part" "\\$_G_char" + ;; + start) + set first "" "" + func_quote_result= + ;; + first) + set quote "$_G_part" "" + ;; + esac + done + IFS=$func_quote_old_IFS + done + ;; + *) ;; + esac +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + func_quote "$1" + _G_unquoted_arg=$func_quote_result + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# func_quote_for_expand ARG +# ------------------------- +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2014-01-07.03; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# 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, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + eval $_G_hook '"$@"' + + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + done + + func_quote_for_eval ${1+"$@"} + func_run_hooks_result=$func_quote_for_eval_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, remove any +# options that you action, and then pass back the remaining unprocessed +# options in '_result', escaped suitably for +# 'eval'. Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# +# func_quote_for_eval ${1+"$@"} +# my_options_prep_result=$func_quote_for_eval_result +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# ;; +# *) set dummy "$_G_opt" "$*"; shift; break ;; +# esac +# done +# +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# func_quote_for_eval ${1+"$@"} +# my_option_validation_result=$func_quote_for_eval_result +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll alse need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + func_options_prep ${1+"$@"} + eval func_parse_options \ + ${func_options_prep_result+"$func_options_prep_result"} + eval func_validate_options \ + ${func_parse_options_result+"$func_parse_options_result"} + + eval func_run_hooks func_options \ + ${func_validate_options_result+"$func_validate_options_result"} + + # save modified positional parameters for caller + func_options_result=$func_run_hooks_result +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propogate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + + # Adjust func_parse_options positional parameters to match + eval set dummy "$func_run_hooks_result"; shift + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + test $# = 0 && func_missing_arg $_G_opt && break + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.6' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname (GNU libtool) 2.4.6 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func__fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + case $host in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote_for_eval ${1+"$@"} + libtool_validate_options_result=$func_quote_for_eval_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# 'FILE.' does not work on cygwin managed mounts. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # Get the compilation command and the source file. + base_compile= + srcfile=$nonopt # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg=$arg + arg_mode=normal + ;; + + target ) + libobj=$arg + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg=$srcfile + srcfile=$arg + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a 'standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to '-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the '--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the 'install' or 'cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with '-') are ignored. + +Every other argument is treated as a filename. Files ending in '.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in '.la', then a libtool library is created, +only library objects ('.lo' files) may be specified, and '-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created +using 'ar' and 'ranlib', or on Windows using 'lib'. + +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir=$absdir + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic=$magic + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the '-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the '$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the '$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the '$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try 'ln -sf' first, because the 'ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext= + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + win32_libid_type=unknown + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" + cd "$darwin_curdir" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + func_quote "$ECHO" + qECHO=$func_quote_result + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + \$ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined HAVE_DOS_BASED_FILE_SYSTEM + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined HAVE_DOS_BASED_FILE_SYSTEM + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = (size_t) (q - p); + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg=$1 + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg=$arg + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test X-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + + # As we are forced to pass -nostdlib to g++ during linking, the option + # -pthread{,s} is not in effect; add the -lpthread to $deplist + # explicitly to link correctly. + if test "$tagname" = CXX -a x"$with_gcc" = xyes; then + case "$arg" in + -pthread*) func_append deplibs " -lpthread" ;; + esac + fi + + continue + ;; + + -multi_module) + single_module=$wl-multi_module + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -os2dllname) + prev=os2dllname + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -specs=* GCC specs files + # -stdlib=* select c++ std lib with clang + # -fsanitize=* Clang/GCC memory and address sanitizer + # -fuse-ld=* Linker select flags for GCC + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ + -specs=*|-fsanitize=*|-fuse-ld=*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the '$prevarg' option requires an argument" + + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname=$func_basename_result + libobjs_save=$libobjs + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=false + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test lib,link = "$linkmode,$pass"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs=$tmp_deplibs + fi + + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib=$searchdir/lib$name$search_ext + if test -f "$lib"; then + if test .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll=$l + done + if test "X$ll" = "X$old_library"; then # only static version available + found=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "'$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir=$func_dirname_result + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + + # This library was specified with -dlopen. + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of '$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir=$ladir + fi + ;; + esac + func_basename "$lib" + laname=$func_basename_result + + # Find the relevant object directory and library name. + if test yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir=$ladir + absdir=$abs_ladir + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then + # Make sure the rpath contains only unique directories. + case $temp_rpath: in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule= + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule=$dlpremoduletest + break + fi + done + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname=$1 + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname=$dlname + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc* | *os2*) + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + esac + eval soname=\"$soname_spec\" + else + soname=$realname + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot=$soname + func_basename "$soroot" + soname=$func_basename_result + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from '$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for '$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; then + add=$dir/$linklib + case $host in + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir=-L$dir ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we cannot + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library"; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add=$dir/$old_library + fi + elif test -n "$old_library"; then + add=$dir/$old_library + fi + fi + esac + elif test no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib + else + add=$libdir/$linklib + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir=-L$libdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test prog = "$linkmode"; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test unsupported != "$hardcode_direct"; then + test -n "$old_library" && linklib=$old_library + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system cannot link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test yes = "$module"; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names"; then + for tmp in $deplibrary_names; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" + path= + fi + fi + ;; + *) + path=-L$absdir/$objdir + ;; + esac + else + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "'$deplib' seems to be moved" + + path=-L$absdir + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=deplibs + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i= + ;; + esac + if test -n "$i"; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "'-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "'-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs=$output + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form 'libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; then + # Building a libtool convenience library. + # Some compilers have problems with a '.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "'-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs=$IFS; IFS=: + set dummy $vinfo 0 0 0 + shift + IFS=$save_ifs + + test -n "$7" && \ + func_fatal_help "too many parameters to '-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major=$1 + number_minor=$2 + number_revision=$3 + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|qnx|sunos) + current=$number_major + revision=$number_minor + age=0 + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_minor + lt_irix_increment=no + ;; + esac + ;; + no) + current=$1 + revision=$2 + age=$3 + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring=$verstring_prefix$major.$revision + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test 0 -ne "$loop"; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring_prefix$major.$iface:$verstring + done + + # Before this point, $major must not contain '.'. + major=.$major + versuffix=$major.$revision + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision + + # Add in all the interfaces that we are compatible with. + loop=$age + while test 0 -ne "$loop"; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring:$iface.0 + done + + # Make executables depend on our current version. + func_append verstring ":$current.0" + ;; + + qnx) + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + + *) + func_fatal_configuration "unknown library version type '$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring=0.0 + ;; + esac + if test no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles=$dlfiles + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles=$dlprefiles + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test yes = "$build_libtool_need_lc"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release= + versuffix= + major= + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib=$potent_lib + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | $SED 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; + *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib=$potent_lib # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test no = "$allow_undefined"; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs=$new_libs + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname=$1 + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname=$realname + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib=$output_objdir/$realname + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + func_dll_def_p "$export_symbols" || { + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols=$export_symbols + export_symbols= + always_export_symbols=yes + } + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs=$IFS; IFS='~' + for cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test : != "$skipped_export" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-$k.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test -z "$objlist" || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-$k.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-$k.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + } + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs=$IFS; IFS='~' + for cmd in $concat_cmds; do + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + ${skipped_export-false} && { + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + } + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "'-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object '$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj=$output + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + output=$obj + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + test yes = "$build_libtool_libs" || { + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + } + + if test -n "$pic_flag" || test default != "$pic_mode"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output=$libobj + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "'-release' is ignored for programs" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath=$rpath + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath=$rpath + + if test -n "$libobjs" && test yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=$compile_command$compile_rpath + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' + fi + + exit $exit_status + } + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; then + # We don't need to create a wrapper script. + link_command=$compile_var$compile_command$compile_rpath + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + func_quote "(cd `pwd`; $relink_command)" + relink_command=$func_quote_result + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource=$output_path/$objdir/lt-$output_name.c + cwrapper=$output_path/$output_name.exe + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host"; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase=$func_basename_result + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj"; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test -z "$oldobjs"; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test yes = "$build_old_libs" && old_library=$libname.$libext + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + func_quote "$relink_command" + relink_command=$func_quote_result + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; then + if test -z "$install_libdir"; then + break + fi + output=$output_objdir/${outputname}i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name=$func_basename_result + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs=$newdependency_libs + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles=$newdlprefiles + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test no,yes = "$installed,$need_relink"; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif $rmforce; then + continue + fi + + rmfiles=$file + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && test none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the $objdir's in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# where we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/libsndfile-1.0.31/build-aux/missing b/libsndfile-1.0.31/build-aux/missing new file mode 100755 index 0000000..8d0eaad --- /dev/null +++ b/libsndfile-1.0.31/build-aux/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1996-2020 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=https://www.perl.org/ +flex_URL=https://github.com/westes/flex +gnu_software_URL=https://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/libsndfile-1.0.31/cmake/CMakeAutoGen.cmake b/libsndfile-1.0.31/cmake/CMakeAutoGen.cmake new file mode 100644 index 0000000..f82dc13 --- /dev/null +++ b/libsndfile-1.0.31/cmake/CMakeAutoGen.cmake @@ -0,0 +1,46 @@ +# CMake implementation of AutoGen +# Copyright (C) 2017 Anonymous Maarten + +set(AUTOGEN_SCRIPT "${CMAKE_MODULE_PATH}/CMakeAutoGenScript.cmake") + +function(lsf_autogen DIR_REL NAME_WE) + set(EXTS ${ARGN}) + set(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/${DIR_REL}/${NAME_WE}.def") + set(OUTPUTS) + foreach(EXT ${EXTS}) + list(APPEND OUTPUTS "${NAME_WE}.${EXT}") + endforeach() + add_autogen_target("${INPUT}" "${CMAKE_CURRENT_BINARY_DIR}/${DIR_REL}" ${OUTPUTS}) +endfunction() + +function(add_autogen_target INPUT OUTPUTDIR) + set(OUTPUTFILES "${ARGN}") + + if (OUTPUTDIR) + set(PREFIX "${OUTPUTDIR}/") + else() + set(PREFIX "") + endif() + + set(ARTIFACTS) + foreach(OUTPUTFILE ${OUTPUTFILES}) + list(APPEND ARTIFACTS "${PREFIX}${OUTPUTFILE}") + endforeach() + + set(EXTRA_ARGS) + if (AUTOGEN_DEBUG) + list(APPEND EXTRA_ARGS "-DDEBUG=1") + endif() + if (OUTPUTDIR) + list(APPEND EXTRA_ARGS "-DOUTPUTDIR=${OUTPUTDIR}") + endif() + + add_custom_command( + OUTPUT ${ARTIFACTS} + COMMAND ${CMAKE_COMMAND} "-DDEFINITION=${INPUT}" ${EXTRA_ARGS} -P "${AUTOGEN_SCRIPT}" + MAIN_DEPENDENCY "${INPUT}" + DEPENDS "${AUTOGEN_SCRIPT}" + COMMENT "CMakeAutoGen: generating ${OUTPUTFILES}" + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" + ) +endfunction() diff --git a/libsndfile-1.0.31/cmake/CMakeAutoGenScript.cmake b/libsndfile-1.0.31/cmake/CMakeAutoGenScript.cmake new file mode 100644 index 0000000..ade53e1 --- /dev/null +++ b/libsndfile-1.0.31/cmake/CMakeAutoGenScript.cmake @@ -0,0 +1,442 @@ +# CMake implementation of AutoGen +# Copyright (C) 2017 Anonymous Maarten + +set(WS " \t\r\n") + +function(cutoff_first_occurrence TEXT OCCURRENCE RESULT) + string(FIND "${TEXT}" "${OCCURRENCE}" OCCURRENCE_INDEX) + if (OCCURRENCE_INDEX EQUAL -1) + set(${TEXT} "" PARENT_SCOPE) + return() + endif() + + string(LENGTH "${OCCURRENCE}" OCCURRENCE_LENGTH) + math(EXPR CUTOFF_INDEX "${OCCURRENCE_INDEX}+${OCCURRENCE_LENGTH}") + string(SUBSTRING "${TEXT}" ${CUTOFF_INDEX} -1 TEXT_REMAINDER) + set(${RESULT} "${TEXT_REMAINDER}" PARENT_SCOPE) + + endfunction() + +function(read_definition DEFINITION_FILENAME TEMPLATE_FILENAME DATA) + file(READ "${DEFINITION_FILENAME}" DEFINITION_CONTENTS) + + string(REGEX MATCH "autogen definitions ([a-zA-Z\\._-]+);[${WS}]*" TEMPLATE_MATCH "${DEFINITION_CONTENTS}") + if (NOT TEMPLATE_MATCH) + message(FATAL_ERROR "${DEFINITION_FILENAME} doest not contain an AutoGen definition.") + endif() + + get_filename_component(DEFINITION_DIR "${DEFINITION_FILENAME}" PATH) + set(${TEMPLATE_FILENAME} "${DEFINITION_DIR}/${CMAKE_MATCH_1}" PARENT_SCOPE) + if (DEBUG) + message("found: TEMPLATE_FILENAME=${CMAKE_MATCH_1}") + endif() + + cutoff_first_occurrence("${DEFINITION_CONTENTS}" "${TEMPLATE_MATCH}" DEFINITION_CONTENTS) + + set(DEFINITION "") + + while (1) + string(REGEX MATCH "([a-zA-Z_][a-zA-Z0-9_]*)[${WS}]*=[${WS}]*{[${WS}]*" GROUPSTART_MATCH "${DEFINITION_CONTENTS}") + if (NOT GROUPSTART_MATCH) + break() + endif() + set(GROUPNAME "${CMAKE_MATCH_1}") + cutoff_first_occurrence("${DEFINITION_CONTENTS}" "${GROUPSTART_MATCH}" DEFINITION_CONTENTS) + if (DEBUG) + message("found: GROUPNAME=${GROUPNAME}") + endif() + set(NBKEYS 0) + set(GROUP_KEY_VALUES "") + while (1) + string(REGEX MATCH "^([a-zA-Z_][a-zA-Z0-9_]*)[${WS}]*=[${WS}]*(([\"']([${WS}a-zA-Z0-9_%\\\"<>\(\)\\.*+/?:,\\-]+)[\"'])|([a-zA-Z0-9_%\\]+))[${WS}]*;[${WS}]*" KEY_VALUE_MATCH "${DEFINITION_CONTENTS}") + if (NOT KEY_VALUE_MATCH) + break() + endif() + set(KEY "${CMAKE_MATCH_1}") + if ("${CMAKE_MATCH_4}" STREQUAL "") + set(VALUE "${CMAKE_MATCH_5}") + else() + string(REPLACE "\\\"" "\"" VALUE "${CMAKE_MATCH_4}") + #set(VALUE "${CMAKE_MATCH_4}") + endif() + + if (DEBUG) + message("found: KEY=${KEY}, VALUE=${VALUE}") + endif() + math(EXPR NBKEYS "${NBKEYS}+1") + list(APPEND GROUP_KEY_VALUES "${KEY}" "${VALUE}") + cutoff_first_occurrence("${DEFINITION_CONTENTS}" "${KEY_VALUE_MATCH}" DEFINITION_CONTENTS) + endwhile() + string(REGEX MATCH "^[${WS}]*}[${WS}]*;[${WS}]*" GROUPEND_MATCH "${DEFINITION_CONTENTS}") + if (NOT GROUPEND_MATCH) + message(FATAL_ERROR "Group ${GROUPNAME} did not finish.") + endif() + cutoff_first_occurrence("${DEFINITION_CONTENTS}" "${GROUPEND_MATCH}" DEFINITION_CONTENTS) + list(APPEND DEFINITION "${GROUPNAME}" ${NBKEYS} ${GROUP_KEY_VALUES}) + endwhile() + set(${DATA} "${DEFINITION}" PARENT_SCOPE) +endfunction() + +function(match_autogen_group TEXT START POS0 POS1 MATCH FOUND) + string(SUBSTRING "${TEXT}" "${START}" -1 TEXT) + string(REGEX MATCH "\\[\\+[${WS}]*([ a-zA-Z0-9=_$%\\(\\)\"\\+\\-]+)[${WS}]*\\+\\]" MATCH_GROUP "${TEXT}") + if ("${MATCH_GROUP}" STREQUAL "") + set(${FOUND} 0 PARENT_SCOPE) + return() + endif() + string(FIND "${TEXT}" "${MATCH_GROUP}" START_TEXT) + math(EXPR POS0_var "${START}+${START_TEXT}") + string(LENGTH "${MATCH_GROUP}" MATCH_LENGTH) + math(EXPR POS1_var "${POS0_var}+${MATCH_LENGTH}") + set(${POS0} "${POS0_var}" PARENT_SCOPE) + set(${POS1} "${POS1_var}" PARENT_SCOPE) + set(${FOUND} 1 PARENT_SCOPE) + string(STRIP "${CMAKE_MATCH_1}" CONTENT) + set("${MATCH}" "${CONTENT}" PARENT_SCOPE) +endfunction() + +function(append_output SUFFICES_FILENAMES TEXT POS0 POS1 FILTER) + math(EXPR POS_LENGTH "${POS1}-${POS0}") + string(LENGTH "${TEXT}" TEXT_LENGTH) + string(SUBSTRING "${TEXT}" "${POS0}" "${POS_LENGTH}" TEXT_APPEND) + if (DEBUG) + message("appending ${POS0}:${POS1}, length=${POS_LENGTH}") + endif() + append_output_text("${SUFFICES_FILENAMES}" "${TEXT_APPEND}" "${FILTER}") +endfunction() + +function(append_output_text SUFFICES_FILENAMES TEXT_APPEND FILTER) + string(LENGTH "${TEXT_APPEND}" TEXT_LENGTH) + list(LENGTH SUFFICES_FILENAMES NB) + math(EXPR NB_END "${NB}-1") + foreach(INDEX RANGE 0 ${NB_END} 3) + math(EXPR INDEX_1 "${INDEX}+1") + math(EXPR INDEX_2 "${INDEX}+2") + list(GET SUFFICES_FILENAMES ${INDEX} SUFFIX) + list(GET SUFFICES_FILENAMES ${INDEX_1} FILENAME) + list(GET SUFFICES_FILENAMES ${INDEX_2} TEMPFILENAME) + set(WRITE_OK 1) + if (FILTER) + if (NOT "${SUFFIX}" STREQUAL "${FILTER}") + set(WRITE_OK 0) + endif() + endif() + if (WRITE_OK) + if (DEBUG) + message("Write: ${TEXT_LENGTH} characters to ${FILENAME}") + endif() + file(APPEND "${TEMPFILENAME}" "${TEXT_APPEND}") + endif() + endforeach() +endfunction() + +function(output_finish SUFFICES_FILENAMES) + list(LENGTH SUFFICES_FILENAMES NB) + math(EXPR NB_END "${NB}-1") + foreach(INDEX RANGE 0 ${NB_END} 3) + math(EXPR INDEX_1 "${INDEX}+1") + math(EXPR INDEX_2 "${INDEX}+2") + list(GET SUFFICES_FILENAMES ${INDEX_1} FILENAME) + list(GET SUFFICES_FILENAMES ${INDEX_2} TEMPFILENAME) + file(RENAME "${TEMPFILENAME}" "${FILENAME}") + endforeach() +endfunction() + +function(stack_push STACK_ARG) + set(STACK_LIST "${${STACK_ARG}}") + string(REPLACE ";" " " NEWITEM "${ARGN}") + if (DEBUG) + list(LENGTH STACK_LIST STACK_LENGTH) + message("Pushing \"${NEWITEM}\" onto stack (length=${STACK_LENGTH})") + endif() + list(APPEND STACK_LIST "${NEWITEM}") + set(${STACK_ARG} "${STACK_LIST}" PARENT_SCOPE) +endfunction() + +function(stack_pop STACK_ARG ITEM) + set(STACK_LIST "${${STACK_ARG}}") + list(LENGTH STACK_LIST STACK_LENGTH) + if (STACK_LENGTH EQUAL 0) + message(FATAL_ERROR "ENDFOR: stack is empty") + endif() + math(EXPR LAST_ITEM_INDEX "${STACK_LENGTH}-1") + list(GET STACK_LIST "${LAST_ITEM_INDEX}" LAST_ITEM) + list(REMOVE_AT STACK_LIST "${LAST_ITEM_INDEX}") + string(REPLACE " " ";" LAST_ITEM_LIST "${LAST_ITEM}") + if (DEBUG) + message("Popping \"${LAST_ITEM}\" from stack (length=${STACK_LENGTH})") + endif() + set(${ITEM} "${LAST_ITEM_LIST}" PARENT_SCOPE) + set(${STACK_ARG} "${STACK_LIST}" PARENT_SCOPE) +endfunction() + +function(stack_top STACK_ARG ITEM) + set(STACK_LIST "${${STACK_ARG}}") + list(LENGTH STACK_LIST STACK_LENGTH) + if (STACK_LENGTH EQUAL 0) + message(FATAL_ERROR "ENDFOR: stack is empty") + endif() + math(EXPR LAST_ITEM_INDEX "${STACK_LENGTH}-1") + list(GET STACK_LIST "${LAST_ITEM_INDEX}" LAST_ITEM) + string(REPLACE " " ";" LAST_ITEM_LIST "${LAST_ITEM}") + if (DEBUG) + message("Top of stack: \"${LAST_ITEM}\" from stack (length=${STACK_LENGTH})") + endif() + set(${ITEM} "${LAST_ITEM_LIST}" PARENT_SCOPE) +endfunction() + +function(stack_find_key STACK_LIST TEMPLATE_PARAMETERS KEY VALUE) + list(REVERSE STACK_LIST) + foreach(STACK_ITEM ${STACK_LIST}) + string(REPLACE " " ";" STACK_ITEM_LIST "${STACK_ITEM}") + list(GET STACK_ITEM_LIST 3 TP_INDEX) + math(EXPR TP_SIZE_INDEX "${TP_INDEX}+1") + list(GET TEMPLATE_PARAMETERS ${TP_SIZE_INDEX} TP_SIZE) + math(EXPR TP_KV_INDEX_START "${TP_INDEX}+2") + math(EXPR TP_KV_INDEX_END "${TP_KV_INDEX_START}+2*${TP_SIZE}-1") + foreach(TP_KV_INDEX RANGE ${TP_KV_INDEX_START} ${TP_KV_INDEX_END} 2) + list(GET TEMPLATE_PARAMETERS ${TP_KV_INDEX} TP_KEY) + if("${TP_KEY}" STREQUAL "${KEY}") + math(EXPR TP_VALUE_INDEX "${TP_KV_INDEX}+1") + list(GET TEMPLATE_PARAMETERS ${TP_VALUE_INDEX} TP_VALUE) + set(${VALUE} "${TP_VALUE}" PARENT_SCOPE) + return() + endif() + endforeach() + endforeach() + message(FATAL_ERROR "Unknown KEY=${KEY}") +endfunction() + +function(template_parameters_find_next_groupname_index TEMPLATE_PARAMETERS GROUPNAME INDEX_LAST INDEX_NEXT) + if (${INDEX_LAST} LESS 0) + set(INDEX 0) + else () + math(EXPR INDEX_1 "1+(${INDEX_LAST})") + list(GET TEMPLATE_PARAMETERS ${INDEX_1} GROUPNAME_INDEX_SIZE) + math(EXPR INDEX "${INDEX_LAST}+1+2*${GROUPNAME_INDEX_SIZE}+1") + endif() + list(LENGTH TEMPLATE_PARAMETERS PARAMETERS_LENGTH) + while (${INDEX} LESS ${PARAMETERS_LENGTH}) + list(GET TEMPLATE_PARAMETERS ${INDEX} GROUPNAME_AT_INDEX) + if ("${GROUPNAME}" STREQUAL "${GROUPNAME_AT_INDEX}") + set("${INDEX_NEXT}" ${INDEX} PARENT_SCOPE) + return() + endif() + math(EXPR INDEX_1 "${INDEX}+1") + list(GET TEMPLATE_PARAMETERS ${INDEX_1} GROUPNAME_INDEX_SIZE) + math(EXPR INDEX "${INDEX}+1+2*${GROUPNAME_INDEX_SIZE}+1") + endwhile() + set("${INDEX_NEXT}" -1 PARENT_SCOPE) +endfunction() + +function(calculate_line_number TEXT POSITION LINENUMBER_ARG) + #math(EXPR INDEX_MAX "${POSITION}-1") + string(SUBSTRING "${TEXT}" 0 ${POSITION} SUBTEXT) + string(REGEX MATCHALL "\n" MATCH_NEWLINES "${SUBTEXT}") + list(LENGTH MATCH_NEWLINES NBLINES) + math(EXPR NBLINES "${NBLINES}+1") + set(${LINENUMBER_ARG} ${NBLINES} PARENT_SCOPE) +endfunction() + +function(parse_template TEMPLATE_FILENAME OUTPUT_DIR TEMPLATE_PARAMETERS) + file(READ ${TEMPLATE_FILENAME} TEMPLATE_CONTENTS) + set(POSITION 0) + match_autogen_group("${TEMPLATE_CONTENTS}" "${POSITION}" POS0 POS1 AUTOGEN FOUND) + if (NOT FOUND) + message(FATAL_ERROR "Header of template not found") + endif() + string(REGEX MATCH "AutoGen5 template ([ a-zA-Z0-9]*)" SUFFICES_MATCH "${AUTOGEN}") + if (NOT SUFFICES_MATCH) + message(FATAL_ERROR "No output suffices found") + endif() + string(STRIP "${CMAKE_MATCH_1}" SUFFICES) + string(REPLACE " " ";" SUFFICES "${SUFFICES}") + set(SUFFICES_FILENAMES "") + get_filename_component(TEMPLATE_NAME_WE "${TEMPLATE_FILENAME}" NAME_WE) + foreach(SUFFIX ${SUFFICES}) + if ("${OUTPUT_DIR}" STREQUAL "") + set(DIR_PREFIX "") + else() + set(DIR_PREFIX "${OUTPUT_DIR}/") + endif() + string(RANDOM LENGTH 64 RANDOMSTRING) + set(FILENAME "${DIR_PREFIX}${TEMPLATE_NAME_WE}.${SUFFIX}") + set(TEMPFILENAME "${DIR_PREFIX}${TEMPLATE_NAME_WE}${RANDOMSTRING}.${SUFFIX}") + list(APPEND SUFFICES_FILENAMES "${SUFFIX}" "${FILENAME}" "${TEMPFILENAME}") + file(WRITE "${FILENAME}" "") + endforeach() + if (DEBUG) + message("Output files: ${SUFFICES_FILENAMES}") + endif() + set(WRITE_FILTER "") + append_output("${SUFFICES_FILENAMES}" "${TEMPLATE_CONTENTS}" 0 "${POS0}" "${WRITE_FILTER}") + math(EXPR POS1 "${POS1}+1") + set(POSITION "${POS1}") + if (DEBUG) + message("Output: ${SUFFICES_FILENAMES}") + endif() + + set(STACK "") + while (1) + match_autogen_group("${TEMPLATE_CONTENTS}" "${POSITION}" POS0 POS1 GROUP_MATCH FOUND) + if (NOT FOUND) + if (DEBUG) + message("No group found. Dumping rest of file.") + endif() + if (NOT "${STACK}" STREQUAL "") + message(FATAL_ERROR "Stack not empty at end of file") + endif() + string(LENGTH "${TEMPLATE_CONTENTS}" TEXT_LENGTH) + append_output("${SUFFICES_FILENAMES}" "${TEMPLATE_CONTENTS}" ${POSITION} ${TEXT_LENGTH} "${WRITE_FILTER}") + break() + endif() + append_output("${SUFFICES_FILENAMES}" "${TEMPLATE_CONTENTS}" ${POSITION} ${POS0} "${WRITE_FILTER}") + set(POSITION "${POS1}") + + if (GROUP_MATCH MATCHES "^FOR") + string(REPLACE " " ";" GROUP_MATCH_LIST "${GROUP_MATCH}") + list(GET GROUP_MATCH_LIST 1 FOR_KEY) + template_parameters_find_next_groupname_index("${TEMPLATE_PARAMETERS}" "${FOR_KEY}" -1 FOR_INDEX) + if (DEBUG) + message("FOR_KEY: ${FOR_KEY}") + message("FOR_INDEX: ${FOR_INDEX}") + endif() + if (${FOR_KEY} LESS 0) + message(FATAL_ERROR "FOR has key with empty list. Not implemented yet..") + endif() + stack_push(STACK FOR ${POSITION} ${FOR_KEY} ${FOR_INDEX}) + elseif (GROUP_MATCH MATCHES "^ENDFOR") + string(REPLACE " " ";" GROUP_MATCH_LIST "${GROUP_MATCH}") + list(GET GROUP_MATCH_LIST 1 ENDFOR_KEY) + stack_pop(STACK FOR_ITEM) + list(GET FOR_ITEM 0 FOR_FOR) + if (NOT "${FOR_FOR}" STREQUAL "FOR") + message(FATAL_ERROR "ENDFOR does not match last item: ${FOR_FOR}") + endif() + list(GET FOR_ITEM 1 FOR_POSITION) + list(GET FOR_ITEM 2 FOR_KEY) + if (NOT "${FOR_KEY}" STREQUAL "${ENDFOR_KEY}") + calculate_line_number("${TEMPLATE_CONTENTS}" "${POSITION}" LINENUMBER) + message("FOR and ENDFOR do not match. (line number ${LINENUMBER}) (FOR:${FOR_KEY}, ENDFOR:${ENDFOR_KEY})") + endif() + list(GET FOR_ITEM 3 FOR_INDEX_PREV) + template_parameters_find_next_groupname_index("${TEMPLATE_PARAMETERS}" "${FOR_KEY}" ${FOR_INDEX_PREV} FOR_INDEX) + if (DEBUG) + message("FOR_INDEX was ${FOR_INDEX_PREV}, is now ${FOR_INDEX}") + endif() + if (${FOR_INDEX} LESS 0) + if (DEBUG) + message("ENDFOR: FOR_INDEX < 0 (no more key) ==> Continue") + endif() + else() + set(POSITION ${FOR_POSITION}) + stack_push(STACK FOR ${FOR_POSITION} ${FOR_KEY} ${FOR_INDEX}) + if (DEBUG) + message("ENDFOR: FOR_INDEX >= 0 (more keys available) ==> Back to position=${FOR_POSITION}") + endif() + endif() + elseif (GROUP_MATCH MATCHES "^CASE") + string(REGEX MATCH "^CASE[${WS}]+\\(([a-zA-Z]+)\\)" CASE_MATCH "${GROUP_MATCH}") + if ("${CASE_MATCH}" STREQUAL "") + message(FATAL_ERROR "Wrong CASE syntax") + endif() + set(CASE_KEY "${CMAKE_MATCH_1}") + if (DEBUG) + message("CASE: KEY=${CASE_KEY}") + endif() + stack_push(STACK CASE "${CASE_KEY}" ${POSITION}) + elseif (GROUP_MATCH MATCHES "^==") + math(EXPR POSITION "${POSITION}+1") + string(REGEX MATCH "^==[${WS}]+([a-zA-Z_][a-zA-Z0-9_]*)" CASE_MATCH "${GROUP_MATCH}") + if ("${CASE_MATCH}" STREQUAL "") + message(FATAL_ERROR "Wrong == syntax") + endif() + stack_top(STACK CASE_ITEM) + list(GET CASE_ITEM 0 CASE_CASE) + if(NOT "${CASE_CASE}" STREQUAL "CASE") + message(FATAL_ERROR "== block must be in CASE. Top of stack=${CASE_CASE}") + endif() + set(CASE_VALUE "${CMAKE_MATCH_1}") + if (DEBUG) + message("case: == VALUE=${CASE_VALUE}") + endif() + list(GET CASE_ITEM 1 CASE_KEY) + if ("${CASE_KEY}" STREQUAL "suffix") + if (DEBUG) + message("Setting write filter to ${CASE_VALUE}") + endif() + set(WRITE_FILTER "${CASE_VALUE}") + else() + message(FATAL_ERROR "CASE: unsupported argument ${CASE_KEY}") + endif() + elseif (GROUP_MATCH MATCHES "^ESAC") + stack_pop(STACK CASE_ITEM) + if (DEBUG) + message("ESAC") + endif() + list(GET CASE_ITEM 0 CASE_CASE) + if (NOT "${CASE_CASE}" STREQUAL "CASE") + message(FATAL_ERROR "ESAC does not match last item: ${CASE_CASE}") + endif() + if ("${CASE_KEY}" STREQUAL "suffix") + if (DEBUG) + message("Removing write filter") + endif() + set(WRITE_FILTER "") + else() + message(FATAL_ERROR "CASE: unsupported argument ${CASE_KEY}") + endif() + else() + string(REGEX MATCH "\\(([a-zA-Z0-9_$%\"${WS}\\+\\-]+)\\)" PARENTHESE_MATCH "${GROUP_MATCH}") + if (NOT "${PARENTHESE_MATCH}" STREQUAL "") + set(PARENTHESE_CONTENT "${CMAKE_MATCH_1}") + string(REPLACE " " ";" PARENTHESE_LIST "${PARENTHESE_CONTENT}") + list(GET PARENTHESE_LIST 0 PARENTHESE_COMMAND) + if ("${PARENTHESE_COMMAND}" STREQUAL "get") + list(GET PARENTHESE_LIST 1 KEY_QUOTED) + string(REGEX MATCH "\\\"([a-zA-Z_${WS}]+)\\\"" KEY_MATCH "${KEY_QUOTED}") + if ("${KEY_MATCH}" STREQUAL "") + message(FATAL_ERROR "get: empty key") + endif() + set(KEY "${CMAKE_MATCH_1}") + if (DEBUG) + message("Get: key=${KEY}") + endif() + stack_find_key("${STACK}" "${TEMPLATE_PARAMETERS}" "${KEY}" VALUE) + if (DEBUG) + message("Get key=${KEY} ==> value=${VALUE}") + endif() + append_output_text("${SUFFICES_FILENAMES}" "${VALUE}" "${WRITE_FILTER}") + elseif("${PARENTHESE_COMMAND}" STREQUAL "tpl-file-line") + list(GET PARENTHESE_LIST 1 FORMAT_LINE) + calculate_line_number("${TEMPLATE_CONTENTS}" "${POSITION}" LINENUMBER) + append_output_text("${SUFFICES_FILENAMES}" "${LINENUMBER}" "${WRITE_FILTER}") + else() + message(FATAL_ERROR "Unknown parenthese command: ${PARENTHESE_COMMAND}") + endif() + else() + message(FATAL_ERROR "Unknown command: ${GROUP_MATCH}") + endif() + endif() + + endwhile() + if (NOT "${STACK}" STREQUAL "") + message(FATAL_ERROR "STACK was not empty at EOF") + endif() + output_finish("${SUFFICES_FILENAMES}") +endfunction() + +if ("${DEFINITION}" STREQUAL "") + message(FATAL_ERROR "Need definition file") +endif() +if (NOT EXISTS "${DEFINITION}") + message(FATAL_ERROR "Definition file does not exist (${DEFINITION})") +endif() + +read_definition("${DEFINITION}" TEMPLATE_FILENAME DATA) +if (DEBUG) + message("${TEMPLATE_FILENAME}") + message("${DATA}") +endif() + +parse_template("${TEMPLATE_FILENAME}" "${OUTPUTDIR}" "${DATA}") diff --git a/libsndfile-1.0.31/cmake/CheckCPUArch.c.in b/libsndfile-1.0.31/cmake/CheckCPUArch.c.in new file mode 100644 index 0000000..5493139 --- /dev/null +++ b/libsndfile-1.0.31/cmake/CheckCPUArch.c.in @@ -0,0 +1,7 @@ +int main(void) { +#if @CHECK_CPU_ARCH_DEFINES@ + return 0; +#else + fail +#endif +} diff --git a/libsndfile-1.0.31/cmake/CheckCPUArch.cmake b/libsndfile-1.0.31/cmake/CheckCPUArch.cmake new file mode 100644 index 0000000..1fdb3c8 --- /dev/null +++ b/libsndfile-1.0.31/cmake/CheckCPUArch.cmake @@ -0,0 +1,23 @@ +macro (_CHECK_CPU_ARCH ARCH ARCH_DEFINES VARIABLE) + if (NOT DEFINED HAVE_${VARIABLE}) + message (STATUS "Check CPU architecture is ${ARCH}") + set (CHECK_CPU_ARCH_DEFINES ${ARCH_DEFINES}) + configure_file (${PROJECT_SOURCE_DIR}/cmake/CheckCPUArch.c.in ${PROJECT_BINARY_DIR}/CMakeFiles/CMakeTmp/CheckCPUArch.c @ONLY) + try_compile (HAVE_${VARIABLE} "${PROJECT_BINARY_DIR}" + "${PROJECT_BINARY_DIR}/CMakeFiles/CMakeTmp/CheckCPUArch.c") + if(HAVE_${VARIABLE}) + message (STATUS "Check CPU architecture is ${ARCH} - yes") + set (${VARIABLE} 1 CACHE INTERNAL "Result of CHECK_CPU_ARCH_X64" FORCE) + else () + message (STATUS "Check CPU architecture is ${ARCH} - no") + endif () + endif () +endmacro (_CHECK_CPU_ARCH) + +macro (CHECK_CPU_ARCH_X64 VARIABLE) + _CHECK_CPU_ARCH (x64 "defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)" ${VARIABLE}) +endmacro (CHECK_CPU_ARCH_X64) + +macro (CHECK_CPU_ARCH_X86 VARIABLE) + _CHECK_CPU_ARCH (x86 "defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) ||defined( __i386) || defined(_M_IX86)" ${VARIABLE}) +endmacro (CHECK_CPU_ARCH_X86) diff --git a/libsndfile-1.0.31/cmake/ClipMode.cmake b/libsndfile-1.0.31/cmake/ClipMode.cmake new file mode 100644 index 0000000..0241e03 --- /dev/null +++ b/libsndfile-1.0.31/cmake/ClipMode.cmake @@ -0,0 +1,92 @@ +include (CheckCSourceRuns) +include (CMakePushCheckState) + +macro (CLIP_MODE) + if ((NOT DEFINED CPU_CLIPS_NEGATIVE) AND (NOT DEFINED CPU_CLIPS_POSITIVE)) + set (CLIP_MODE_POSITIVE_MESSAGE "Target processor clips on positive float to int conversion") + set (CLIP_MODE_NEGATIVE_MESSAGE "Target processor clips on negative float to int conversion") + + message (STATUS "Checking processor clipping capabilities...") + + if (CMAKE_CROSSCOMPILING) + + set (CLIP_MSG "disabled") + set (CPU_CLIPS_POSITIVE FALSE CACHE BOOL ${CLIP_MODE_POSITIVE_MESSAGE}) + set (CPU_CLIPS_NEGATIVE FALSE CACHE BOOL ${CLIP_MODE_NEGATIVE_MESSAGE}) + + else (NOT CMAKE_CROSSCOMPILING) + + cmake_push_check_state () + + set (CMAKE_REQUIRED_QUIET TRUE) + if (LIBM_REQUIRED) + set (CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${M_LIBRARY}) + endif () + + check_c_source_runs ( + " + #define _ISOC9X_SOURCE 1 + #define _ISOC99_SOURCE 1 + #define __USE_ISOC99 1 + #define __USE_ISOC9X 1 + #include + int main (void) + { double fval ; + int k, ival ; + + fval = 1.0 * 0x7FFFFFFF ; + for (k = 0 ; k < 100 ; k++) + { ival = (lrint (fval)) >> 24 ; + if (ival != 127) + return 1 ; + + fval *= 1.2499999 ; + } ; + + return 0 ; + } + " + CPU_CLIPS_POSITIVE) + + check_c_source_runs ( + " + #define _ISOC9X_SOURCE 1 + #define _ISOC99_SOURCE 1 + #define __USE_ISOC99 1 + #define __USE_ISOC9X 1 + #include + int main (void) + { double fval ; + int k, ival ; + + fval = -8.0 * 0x10000000 ; + for (k = 0 ; k < 100 ; k++) + { ival = (lrint (fval)) >> 24 ; + if (ival != -128) + return 1 ; + + fval *= 1.2499999 ; + } ; + + return 0 ; + } + " + CPU_CLIPS_NEGATIVE) + + cmake_pop_check_state () + + if (CPU_CLIPS_POSITIVE AND (NOT CPU_CLIPS_NEGATIVE)) + set (CLIP_MSG "positive") + elseif (CPU_CLIPS_NEGATIVE AND (NOT CPU_CLIPS_POSITIVE)) + set (CLIP_MSG "negative") + elseif (CPU_CLIPS_POSITIVE AND CPU_CLIPS_NEGATIVE) + set (CLIP_MSG "both") + else () + set (CLIP_MSG "none") + endif () + + endif (CMAKE_CROSSCOMPILING) + + message (STATUS "Checking processor clipping capabilities... ${CLIP_MSG}") + endif () +endmacro (CLIP_MODE) diff --git a/libsndfile-1.0.31/cmake/FindFLAC.cmake b/libsndfile-1.0.31/cmake/FindFLAC.cmake new file mode 100644 index 0000000..3491706 --- /dev/null +++ b/libsndfile-1.0.31/cmake/FindFLAC.cmake @@ -0,0 +1,67 @@ +# - Find FLAC +# Find the native FLAC includes and libraries +# +# FLAC_INCLUDE_DIRS - where to find FLAC headers. +# FLAC_LIBRARIES - List of libraries when using libFLAC. +# FLAC_FOUND - True if libFLAC found. +# FLAC_DEFINITIONS - FLAC compile definitons + +if (FLAC_INCLUDE_DIR) + # Already in cache, be silent + set (FLAC_FIND_QUIETLY TRUE) +endif () + +find_package (Ogg QUIET) + +find_package (PkgConfig QUIET) +pkg_check_modules(PC_FLAC QUIET flac) + +set(FLAC_VERSION ${PC_FLAC_VERSION}) + +find_path (FLAC_INCLUDE_DIR FLAC/stream_decoder.h + HINTS + ${PC_FLAC_INCLUDEDIR} + ${PC_FLAC_INCLUDE_DIRS} + ${FLAC_ROOT} + ) + +# MSVC built libraries can name them *_static, which is good as it +# distinguishes import libraries from static libraries with the same extension. +find_library (FLAC_LIBRARY + NAMES + FLAC + libFLAC + libFLAC_dynamic + libFLAC_static + HINTS + ${PC_FLAC_LIBDIR} + ${PC_FLAC_LIBRARY_DIRS} + ${FLAC_ROOT} + ) + +# Handle the QUIETLY and REQUIRED arguments and set FLAC_FOUND to TRUE if +# all listed variables are TRUE. +include (FindPackageHandleStandardArgs) +find_package_handle_standard_args (FLAC + REQUIRED_VARS + FLAC_LIBRARY + FLAC_INCLUDE_DIR + Ogg_FOUND + VERSION_VAR + FLAC_VERSION + ) + +if (FLAC_FOUND) + set (FLAC_INCLUDE_DIRS ${FLAC_INCLUDE_DIR}) + set (FLAC_LIBRARIES ${FLAC_LIBRARY} ${OGG_LIBRARIES}) + if (NOT TARGET FLAC::FLAC) + add_library(FLAC::FLAC UNKNOWN IMPORTED) + set_target_properties(FLAC::FLAC PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${FLAC_INCLUDE_DIR}" + IMPORTED_LOCATION "${FLAC_LIBRARY}" + INTERFACE_LINK_LIBRARIES Ogg::ogg + ) + endif () +endif () + +mark_as_advanced(FLAC_INCLUDE_DIR FLAC_LIBRARY) diff --git a/libsndfile-1.0.31/cmake/FindOgg.cmake b/libsndfile-1.0.31/cmake/FindOgg.cmake new file mode 100644 index 0000000..9cf5ce4 --- /dev/null +++ b/libsndfile-1.0.31/cmake/FindOgg.cmake @@ -0,0 +1,61 @@ +# - Find ogg +# Find the native ogg includes and libraries +# +# OGG_INCLUDE_DIRS - where to find ogg.h, etc. +# OGG_LIBRARIES - List of libraries when using ogg. +# OGG_FOUND - True if ogg found. + +if (OGG_INCLUDE_DIR) + # Already in cache, be silent + set(OGG_FIND_QUIETLY TRUE) +endif () + +find_package (PkgConfig QUIET) +pkg_check_modules (PC_OGG QUIET ogg>=1.3.0) + +set (OGG_VERSION ${PC_OGG_VERSION}) + +find_path (OGG_INCLUDE_DIR ogg/ogg.h + HINTS + ${PC_OGG_INCLUDEDIR} + ${PC_OGG_INCLUDE_DIRS} + ${OGG_ROOT} + ) +# MSVC built ogg may be named ogg_static. +# The provided project files name the library with the lib prefix. +find_library (OGG_LIBRARY + NAMES + ogg + ogg_static + libogg + libogg_static + HINTS + ${PC_OGG_LIBDIR} + ${PC_OGG_LIBRARY_DIRS} + ${OGG_ROOT} + ) +# Handle the QUIETLY and REQUIRED arguments and set OGG_FOUND +# to TRUE if all listed variables are TRUE. +include (FindPackageHandleStandardArgs) +find_package_handle_standard_args (Ogg + REQUIRED_VARS + OGG_LIBRARY + OGG_INCLUDE_DIR + VERSION_VAR + OGG_VERSION + ) + +if (OGG_FOUND) + set (OGG_LIBRARIES ${OGG_LIBRARY}) + set (OGG_INCLUDE_DIRS ${OGG_INCLUDE_DIR}) + + if(NOT TARGET Ogg::ogg) + add_library(Ogg::ogg UNKNOWN IMPORTED) + set_target_properties(Ogg::ogg PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${OGG_INCLUDE_DIRS}" + IMPORTED_LOCATION "${OGG_LIBRARIES}" + ) + endif () +endif () + +mark_as_advanced (OGG_INCLUDE_DIR OGG_LIBRARY) diff --git a/libsndfile-1.0.31/cmake/FindOpus.cmake b/libsndfile-1.0.31/cmake/FindOpus.cmake new file mode 100644 index 0000000..a83686b --- /dev/null +++ b/libsndfile-1.0.31/cmake/FindOpus.cmake @@ -0,0 +1,67 @@ +# - Find opus +# Find the native opus includes and libraries +# +# OPUS_INCLUDE_DIRS - where to find opus.h, etc. +# OPUS_LIBRARIES - List of libraries when using opus. +# OPUS_FOUND - True if Opus found. + +if (OPUS_INCLUDE_DIR) + # Already in cache, be silent + set(OPUS_FIND_QUIETLY TRUE) +endif () + +find_package (Ogg QUIET) + +find_package (PkgConfig QUIET) +pkg_check_modules(PC_OPUS QUIET opus>=1.1) + +set (OPUS_VERSION ${PC_OPUS_VERSION}) + +find_path (OPUS_INCLUDE_DIR opus/opus.h + HINTS + ${PC_OPUS_INCLUDEDIR} + ${PC_OPUS_INCLUDE_DIRS} + ${OPUS_ROOT} + ) + +# MSVC built opus may be named opus_static. +# The provided project files name the library with the lib prefix. + +find_library (OPUS_LIBRARY + NAMES + opus + opus_static + libopus + libopus_static + HINTS + ${PC_OPUS_LIBDIR} + ${PC_OPUS_LIBRARY_DIRS} + ${OPUS_ROOT} + ) + +# Handle the QUIETLY and REQUIRED arguments and set OPUS_FOUND +# to TRUE if all listed variables are TRUE. +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args (Opus + REQUIRED_VARS + OPUS_LIBRARY + OPUS_INCLUDE_DIR + OGG_FOUND + VERSION_VAR + OPUS_VERSION + ) + +if (OPUS_FOUND) + set (OPUS_LIBRARIES ${OPUS_LIBRARY}) + set (OPUS_INCLUDE_DIRS ${OPUS_INCLUDE_DIR}) + + if (NOT TARGET Opus::opus) + add_library (Opus::opus UNKNOWN IMPORTED) + set_target_properties (Opus::opus PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${OPUS_INCLUDE_DIRS}" + IMPORTED_LOCATION "${OPUS_LIBRARIES}" + ) + endif () +endif () + +mark_as_advanced(OPUS_INCLUDE_DIR OPUS_LIBRARY) diff --git a/libsndfile-1.0.31/cmake/FindSndio.cmake b/libsndfile-1.0.31/cmake/FindSndio.cmake new file mode 100644 index 0000000..6b9b409 --- /dev/null +++ b/libsndfile-1.0.31/cmake/FindSndio.cmake @@ -0,0 +1,61 @@ +# - Find SoundIO (sndio) includes and libraries +# +# SNDIO_FOUND - True if SNDIO_INCLUDE_DIR & SNDIO_LIBRARY are +# found +# SNDIO_LIBRARIES - Set when SNDIO_LIBRARY is found +# SNDIO_INCLUDE_DIRS - Set when SNDIO_INCLUDE_DIR is found +# +# SNDIO_INCLUDE_DIR - where to find sndio.h, etc. +# SNDIO_LIBRARY - the sndio library +# + +if (SNDIO_INCLUDE_DIR) + # Already in cache, be silent + set (SNDIO_FIND_QUIETLY TRUE) +endif () + +find_package (PkgConfig QUIET) +pkg_check_modules (PC_SNDIO QUIET sndio) + +set (SNDIO_VERSION ${PC_SNDIO_VERSION}) + +find_path (SNDIO_INCLUDE_DIR + NAMES + sndio.h + HINTS + ${PC_SNDIO_INCLUDEDIR} + ${PC_SNDIO_INCLUDE_DIRS} + ${SNDIO_ROOT} + ) + +find_library (SNDIO_LIBRARY + NAMES + sndio + HINTS + ${PC_SNDIO_LIBDIR} + ${PC_SNDIO_LIBRARY_DIRS} + ${SNDIO_ROOT} + ) + +include (FindPackageHandleStandardArgs) +find_package_handle_standard_args (Sndio + REQUIRED_VARS + SNDIO_LIBRARY + SNDIO_INCLUDE_DIR + VERSION_VAR + SNDIO_VERSION + ) + +if (SNDIO_FOUND) + set (SNDIO_LIBRARIES ${SNDIO_LIBRARY}) + set (SNDIO_INCLUDE_DIRS ${SNDIO_INCLUDE_DIR}) + if (NOT TARGET Sndio::Sndio) + add_library (Sndio::Sndio UNKNOWN IMPORTED) + set_target_properties (Sndio::Sndio PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${SNDIO_INCLUDE_DIRS}" + IMPORTED_LOCATION "${SNDIO_LIBRARIES}" + ) + endif() +endif() + +mark_as_advanced (SNDIO_INCLUDE_DIR SNDIO_LIBRARY) diff --git a/libsndfile-1.0.31/cmake/FindSpeex.cmake b/libsndfile-1.0.31/cmake/FindSpeex.cmake new file mode 100644 index 0000000..c28fe60 --- /dev/null +++ b/libsndfile-1.0.31/cmake/FindSpeex.cmake @@ -0,0 +1,55 @@ +# - Find Speex +# Find the native Speex includes and libraries +# +# SPEEX_INCLUDE_DIRS - where to find speex.h, etc. +# SPEEX_LIBRARIES - List of libraries when using Speex. +# SPEEX_FOUND - True if Speex found. + +if (SPEEX_INCLUDE_DIR) + set (SPEEX_FIND_QUIETLY TRUE) +endif () + +find_package (PkgConfig QUIET) +pkg_check_modules (PC_SPEEX QUIET speex) + +set (SPEEX_VERSION ${PC_SPEEX_VERSION}) + +find_path (SPEEX_INCLUDE_DIR speex/speex.h + HINTS + ${PC_SPEEX_INCLUDEDIR} + ${PC_SPEEX_INCLUDE_DIRS} + ${SPEEX_ROOT} + ) +find_library (SPEEX_LIBRARY + NAMES + speex + libspeex + HINTS + ${PC_SPEEX_LIBDIR} + ${PC_SPEEX_LIBRARY_DIRS} + ${SPEEX_ROOT} + ) + +include (FindPackageHandleStandardArgs) +find_package_handle_standard_args (Speex + REQUIRED_VARS + SPEEX_LIBRARY + SPEEX_INCLUDE_DIR + VERSION_VAR + SPEEX_VERSION + ) + +if (SPEEX_FOUND) + set (SPEEX_LIBRARIES ${SPEEX_LIBRARY}) + set (SPEEX_INCLUDE_DIRS ${SPEEX_INCLUDE_DIR}) + + if (NOT TARGET Speex::Speex) + add_library (Speex::Speex UNKNOWN IMPORTED) + set_target_properties (Speex::Speex PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${SPEEX_INCLUDE_DIRS}" + IMPORTED_LOCATION "${SPEEX_LIBRARIES}" + ) + endif () +endif () + +mark_as_advanced (SPEEX_INCLUDE_DIR SPEEX_LIBRARY) diff --git a/libsndfile-1.0.31/cmake/FindVorbis.cmake b/libsndfile-1.0.31/cmake/FindVorbis.cmake new file mode 100644 index 0000000..57e6055 --- /dev/null +++ b/libsndfile-1.0.31/cmake/FindVorbis.cmake @@ -0,0 +1,210 @@ +#[=======================================================================[.rst: +FindVorbis +---------- + +Finds the native vorbis, vorbisenc amd vorbisfile includes and libraries. + +Imported Targets +^^^^^^^^^^^^^^^^ + +This module provides the following imported targets, if found: + +``Vorbis::vorbis`` + The Vorbis library +``Vorbis::vorbisenc`` + The VorbisEnc library +``Vorbis::vorbisfile`` + The VorbisFile library + +Result Variables +^^^^^^^^^^^^^^^^ + +This will define the following variables: + +``Vorbis_Vorbis_INCLUDE_DIRS`` + List of include directories when using vorbis. +``Vorbis_Enc_INCLUDE_DIRS`` + List of include directories when using vorbisenc. +``Vorbis_File_INCLUDE_DIRS`` + List of include directories when using vorbisfile. +``Vorbis_Vorbis_LIBRARIES`` + List of libraries when using vorbis. +``Vorbis_Enc_LIBRARIES`` + List of libraries when using vorbisenc. +``Vorbis_File_LIBRARIES`` + List of libraries when using vorbisfile. +``Vorbis_FOUND`` + True if vorbis and requested components found. +``Vorbis_Vorbis_FOUND`` + True if vorbis found. +``Vorbis_Enc_FOUND`` + True if vorbisenc found. +``Vorbis_Enc_FOUND`` + True if vorbisfile found. + +Cache variables +^^^^^^^^^^^^^^^ + +The following cache variables may also be set: + +``Vorbis_Vorbis_INCLUDE_DIR`` + The directory containing ``vorbis/vorbis.h``. +``Vorbis_Enc_INCLUDE_DIR`` + The directory containing ``vorbis/vorbisenc.h``. +``Vorbis_File_INCLUDE_DIR`` + The directory containing ``vorbis/vorbisenc.h``. +``Vorbis_Vorbis_LIBRARY`` + The path to the vorbis library. +``Vorbis_Enc_LIBRARY`` + The path to the vorbisenc library. +``Vorbis_File_LIBRARY`` + The path to the vorbisfile library. + +Hints +^^^^^ + +A user may set ``Vorbis_ROOT`` to a vorbis installation root to tell this module where to look. + +#]=======================================================================] + +if (Vorbis_Vorbis_INCLUDE_DIR) + # Already in cache, be silent + set (Vorbis_FIND_QUIETLY TRUE) +endif () + +set (Vorbis_Vorbis_FIND_QUIETLY TRUE) +set (Vorbis_Enc_FIND_QUIETLY TRUE) +set (Vorbis_File_FIND_QUIETLY TRUE) + +find_package (Ogg QUIET) + +find_package (PkgConfig QUIET) +pkg_check_modules (PC_Vorbis_Vorbis QUIET vorbis) +pkg_check_modules (PC_Vorbis_Enc QUIET vorbisenc) +pkg_check_modules (PC_Vorbis_File QUIET vorbisfile) + +set (Vorbis_VERSION ${PC_Vorbis_Vorbis_VERSION}) + +find_path (Vorbis_Vorbis_INCLUDE_DIR vorbis/codec.h + HINTS + ${PC_Vorbis_Vorbis_INCLUDEDIR} + ${PC_Vorbis_Vorbis_INCLUDE_DIRS} + ${Vorbis_ROOT} + ) + +find_path (Vorbis_Enc_INCLUDE_DIR vorbis/vorbisenc.h + HINTS + ${PC_Vorbis_Enc_INCLUDEDIR} + ${PC_Vorbis_Enc_INCLUDE_DIRS} + ${Vorbis_ROOT} + ) + +find_path (Vorbis_File_INCLUDE_DIR vorbis/vorbisfile.h + HINTS + ${PC_Vorbis_File_INCLUDEDIR} + ${PC_Vorbis_File_INCLUDE_DIRS} + ${Vorbis_ROOT} + ) + +find_library (Vorbis_Vorbis_LIBRARY + NAMES + vorbis + vorbis_static + libvorbis + libvorbis_static + HINTS + ${PC_Vorbis_Vorbis_LIBDIR} + ${PC_Vorbis_Vorbis_LIBRARY_DIRS} + ${Vorbis_ROOT} + ) + +find_library (Vorbis_Enc_LIBRARY + NAMES + vorbisenc + vorbisenc_static + libvorbisenc + libvorbisenc_static + HINTS + ${PC_Vorbis_Enc_LIBDIR} + ${PC_Vorbis_Enc_LIBRARY_DIRS} + ${Vorbis_ROOT} + ) + +find_library (Vorbis_File_LIBRARY + NAMES + vorbisfile + vorbisfile_static + libvorbisfile + libvorbisfile_static + HINTS + ${PC_Vorbis_File_LIBDIR} + ${PC_Vorbis_File_LIBRARY_DIRS} + ${Vorbis_ROOT} + ) + +include (FindPackageHandleStandardArgs) + +if (Vorbis_Vorbis_LIBRARY AND Vorbis_Vorbis_INCLUDE_DIR AND Ogg_FOUND) + set (Vorbis_Vorbis_FOUND TRUE) +endif () + +if (Vorbis_Enc_LIBRARY AND Vorbis_Enc_INCLUDE_DIR AND Vorbis_Vorbis_FOUND) + set (Vorbis_Enc_FOUND TRUE) +endif () + +if (Vorbis_Vorbis_FOUND AND Vorbis_File_LIBRARY AND Vorbis_File_INCLUDE_DIR) + set (Vorbis_File_FOUND TRUE) +endif () + +find_package_handle_standard_args (Vorbis + REQUIRED_VARS + Vorbis_Vorbis_LIBRARY + Vorbis_Vorbis_INCLUDE_DIR + Ogg_FOUND + HANDLE_COMPONENTS + VERSION_VAR Vorbis_VERSION) + + +if (Vorbis_Vorbis_FOUND) + set (Vorbis_Vorbis_INCLUDE_DIRS ${VORBIS_INCLUDE_DIR}) + set (Vorbis_Vorbis_LIBRARIES ${VORBIS_LIBRARY} ${OGG_LIBRARIES}) + if (NOT TARGET Vorbis::vorbis) + add_library (Vorbis::vorbis UNKNOWN IMPORTED) + set_target_properties (Vorbis::vorbis PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Vorbis_Vorbis_INCLUDE_DIR}" + IMPORTED_LOCATION "${Vorbis_Vorbis_LIBRARY}" + INTERFACE_LINK_LIBRARIES Ogg::ogg + ) + endif () + + if (Vorbis_Enc_FOUND) + set (Vorbis_Enc_INCLUDE_DIRS ${Vorbis_Enc_INCLUDE_DIR}) + set (Vorbis_Enc_LIBRARIES ${Vorbis_Enc_LIBRARY} ${Vorbis_Enc_LIBRARIES}) + if (NOT TARGET Vorbis::vorbisenc) + add_library (Vorbis::vorbisenc UNKNOWN IMPORTED) + set_target_properties (Vorbis::vorbisenc PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Vorbis_Enc_INCLUDE_DIR}" + IMPORTED_LOCATION "${Vorbis_Enc_LIBRARY}" + INTERFACE_LINK_LIBRARIES Vorbis::vorbis + ) + endif () + endif () + + if (Vorbis_File_FOUND) + set (Vorbis_File_INCLUDE_DIRS ${Vorbis_File_INCLUDE_DIR}) + set (Vorbis_File_LIBRARIES ${Vorbis_File_LIBRARY} ${Vorbis_File_LIBRARIES}) + if (NOT TARGET Vorbis::vorbisfile) + add_library (Vorbis::vorbisfile UNKNOWN IMPORTED) + set_target_properties (Vorbis::vorbisfile PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Vorbis_File_INCLUDE_DIR}" + IMPORTED_LOCATION "${Vorbis_File_LIBRARY}" + INTERFACE_LINK_LIBRARIES Vorbis::vorbis + ) + endif () + endif () + +endif () + +mark_as_advanced (Vorbis_Vorbis_INCLUDE_DIR Vorbis_Vorbis_LIBRARY) +mark_as_advanced (Vorbis_Enc_INCLUDE_DIR Vorbis_Enc_LIBRARY) +mark_as_advanced (Vorbis_File_INCLUDE_DIR Vorbis_File_LIBRARY) diff --git a/libsndfile-1.0.31/cmake/SndFileChecks.cmake b/libsndfile-1.0.31/cmake/SndFileChecks.cmake new file mode 100644 index 0000000..9b52d15 --- /dev/null +++ b/libsndfile-1.0.31/cmake/SndFileChecks.cmake @@ -0,0 +1,276 @@ +include (CheckFunctionExists) +include (CheckIncludeFile) +include (CheckLibraryExists) +include (CheckSymbolExists) +include (CheckTypeSize) +include (TestBigEndian) + +include (TestInline) +include (ClipMode) +include (TestLargeFiles) +include (CheckCPUArch) + +test_large_files (_LARGEFILES) + +if (LARGE_FILES_DEFINITIONS) + add_definitions(${LARGE_FILES_DEFINITIONS}) +endif () + +if (WIN32) + set(TYPEOF_SF_COUNT_T __int64) +else () + set(TYPEOF_SF_COUNT_T int64_t) +endif () +set (SF_COUNT_MAX 0x7fffffffffffffffll) + +if (CMAKE_SYSTEM_NAME STREQUAL "OpenBSD") + find_package (Sndio) +elseif (NOT WIN32) + find_package (ALSA) +endif () + +if (VCPKG_TOOLCHAIN AND (NOT CMAKE_VERSION VERSION_LESS 3.15)) + set (CMAKE_FIND_PACKAGE_PREFER_CONFIG ON) +endif () + +if (CMAKE_FIND_PACKAGE_PREFER_CONFIG) + find_package (Ogg 1.3 CONFIG) + find_package (Vorbis CONFIG COMPONENTS Enc) + find_package (FLAC CONFIG) + find_package (Opus CONFIG) + + include (FindPackageHandleStandardArgs) + find_package_handle_standard_args (Ogg CONFIG_MODE) + find_package_handle_standard_args (Vorbis CONFIG_MODE) + find_package_handle_standard_args (FLAC CONFIG_MODE) + find_package_handle_standard_args (Opus CONFIG_MODE) +else () + find_package (Ogg 1.3) + find_package (Vorbis COMPONENTS Enc) + find_package (FLAC) + find_package (Opus) +endif () +if (Vorbis_FOUND AND FLAC_FOUND AND Opus_FOUND) + set (HAVE_EXTERNAL_XIPH_LIBS 1) +else () + set (HAVE_EXTERNAL_XIPH_LIBS 0) +endif () + +find_package (Speex) +find_package (SQLite3) + +check_include_file (byteswap.h HAVE_BYTESWAP_H) +check_include_file (dlfcn.h HAVE_DLFCN_H) +check_include_file (direct.h HAVE_DIRECT_H) +check_include_file (endian.h HAVE_ENDIAN_H) +check_include_file (inttypes.h HAVE_INTTYPES_H) +check_include_file (io.h HAVE_IO_H) +check_include_file (stdint.h HAVE_STDINT_H) +check_include_file (sys/time.h HAVE_SYS_TIME_H) +check_include_file (sys/types.h HAVE_SYS_TYPES_H) +check_include_file (unistd.h HAVE_UNISTD_H) +check_include_file (immintrin.h HAVE_IMMINTRIN_H) + +check_cpu_arch_x86 (CPU_IS_X86) +check_cpu_arch_x64 (CPU_IS_X64) +if ((CPU_IS_X86 OR CPU_IS_X64) AND HAVE_IMMINTRIN_H) + set (HAVE_SSE2 1) +endif () + +# Never checked +# check_include_file (stdlib.h HAVE_STDLIB_H) +# check_include_file (string.h HAVE_STRING_H) +# check_include_file (strings.h HAVE_STRINGS_H) +# check_include_file (sys/stat.h HAVE_SYS_STAT_H) +# check_include_file (memory.h HAVE_MEMORY_H) + +if (BUILD_TESTING) + check_include_file (locale.h HAVE_LOCALE_H) + check_include_file (sys/wait.h HAVE_SYS_WAIT_H) +endif () + +check_type_size (int64_t SIZEOF_INT64_T) +check_type_size (long SIZEOF_LONG) +check_type_size (long\ long SIZEOF_LONG_LONG) +check_type_size (ssize_t SIZEOF_SSIZE_T) +check_type_size (wchar_t SIZEOF_WCHAR_T) + +# Never used +# check_type_size (loff_t SIZEOF_LOFF_T) +# check_type_size (offt64_t SIZEOF_OFF64_T) + +# Never checked +# check_type_size (size_t SIZEOF_SIZE_T) + +# Used in configre.ac +# check_type_size (double SIZEOF_DOUBLE) +# check_type_size (float SIZEOF_FLOAT) +# check_type_size (int SIZEOF_INT) +# check_type_size (short SIZEOF_SHORT) + +if (ENABLE_TESTING) + check_type_size (void* SIZEOF_VOIDP) +endif() + +if ((SIZEOF_OFF_T EQUAL 8) OR (SIZEOF_LOFF_T EQUAL 8) OR (SIZEOF_OFF64_T EQUAL 8)) + set (TYPEOF_SF_COUNT_T "int64_t") + set (SF_COUNT_MAX "0x7FFFFFFFFFFFFFFFLL") + set (SIZEOF_SF_COUNT_T 8) +else () + if (WIN32) + set (TYPEOF_SF_COUNT_T "__int64") + set (SF_COUNT_MAX "0x7FFFFFFFFFFFFFFFLL") + set (SIZEOF_SF_COUNT_T 8) + else () + message ("") + message ("*** The configure process has determined that this system is capable") + message ("*** of Large File Support but has not been able to find a type which") + message ("*** is an unambiguous 64 bit file offset.") + message ("*** Please contact the author to help resolve this problem.") + message ("") + message (FATAL_ERROR "Bad file offset type.") + endif () +endif () + +check_type_size (${TYPEOF_SF_COUNT_T} SIZEOF_SF_COUNT_T) + +if (NOT WIN32) + check_library_exists (m floor "" LIBM_REQUIRED) + if (LIBM_REQUIRED) + list (APPEND CMAKE_REQUIRED_LIBRARIES m) + endif () +endif () + +check_library_exists (sqlite3 sqlite3_close "" HAVE_SQLITE3) + +check_function_exists (fstat HAVE_FSTAT) +check_function_exists (fstat64 HAVE_FSTAT64) +check_function_exists (gettimeofday HAVE_GETTIMEOFDAY) +check_function_exists (gmtime HAVE_GMTIME) +check_function_exists (gmtime_r HAVE_GMTIME_R) +check_function_exists (localtime HAVE_LOCALTIME) +check_function_exists (localtime_r HAVE_LOCALTIME_R) +check_function_exists (lseek HAVE_LSEEK) +check_function_exists (open HAVE_OPEN) +check_function_exists (read HAVE_READ) +check_function_exists (write HAVE_WRITE) +check_function_exists (lrint HAVE_LRINT) +check_function_exists (lrintf HAVE_LRINTF) + +if (NOT WIN32) + check_function_exists (ftruncate HAVE_FTRUNCATE) + check_function_exists (fsync HAVE_FSYNC) +endif () + +if (BUILD_TESTING) + check_function_exists (pipe HAVE_PIPE) + check_function_exists (setlocale HAVE_SETLOCALE) + check_function_exists (waitpid HAVE_WAITPID) +endif () + +# Never checked +# check_function_exists (calloc HAVE_CALLOC) +# check_function_exists (free HAVE_FREE) +# check_function_exists (getpagesize HAVE_GETPAGESIZE) +# check_function_exists (malloc HAVE_MALLOC) +# check_function_exists (realloc HAVE_REALLOC) +# check_function_exists (snprintf HAVE_SNPRINTF) +# check_function_exists (vsnprintf HAVE_VSNPRINTF) +# check_function_exists (floor HAVE_FLOOR) +# check_function_exists (fmod HAVE_FMOD) + +# Never used +# check_function_exists (mmap HAVE_MMAP) +# check_function_exists (ceil HAVE_CEIL) +# check_function_exists (lround HAVE_LROUND) +# check_function_exists (lseek64 HAVE_LSEEK64) + + +check_symbol_exists (S_IRGRP sys/stat.h HAVE_DECL_S_IRGRP) + +test_big_endian (WORDS_BIGENDIAN) +if (WORDS_BIGENDIAN) + set (CPU_IS_BIG_ENDIAN 1) +else () + set (CPU_IS_LITTLE_ENDIAN 1) +endif () + +if (WIN32) + set (OS_IS_WIN32 1) + set (USE_WINDOWS_API 1) + if (BUILD_SHARED_LIBS) + set (WIN32_TARGET_DLL 1) + endif () + if (MINGW) + add_definitions (-D__USE_MINGW_ANSI_STDIO=1) + endif () +endif () + +if (CMAKE_SYSTEM_NAME STREQUAL "OpenBSD") + set (OS_IS_OPENBSD 1) +endif () + + +if (CMAKE_COMPILER_IS_GNUCC OR (CMAKE_C_COMPILER_ID MATCHES "Clang")) + set (COMPILER_IS_GCC 1) +endif () + +test_inline () +clip_mode () + +if (MSVC) + add_definitions (-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE) +endif (MSVC) + +if (DEFINED ENABLE_STATIC_RUNTIME) + if (MSVC) + if (ENABLE_STATIC_RUNTIME) + foreach (flag_var + CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE + CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO + CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE + CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO + ) + if (${flag_var} MATCHES "/MD") + string (REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") + endif () + endforeach (flag_var) + else () + foreach (flag_var + CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE + CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO + CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE + CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO + ) + if (${flag_var} MATCHES "/MT") + string (REGEX REPLACE "/MT" "/MD" ${flag_var} "${${flag_var}}") + endif (${flag_var} MATCHES "/MT") + endforeach (flag_var) + endif ( ) + elseif (MINGW) + if (ENABLE_STATIC_RUNTIME) + if (CMAKE_C_COMPILER_ID STREQUAL GNU) + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static-libgcc") + set (CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "${CMAKE_SHARED_LIBRARY_LINK_C_FLAGS} -static-libgcc -s") + endif () + if (CMAKE_CXX_COMPILER_ID STREQUAL GNU) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++") + set (CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "${CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS} -static-libgcc -static-libstdc++ -s") + endif () + if (CMAKE_C_COMPILER_ID STREQUAL Clang) + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static") + set (CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "${CMAKE_SHARED_LIBRARY_LINK_C_FLAGS} -static") + endif () + if (CMAKE_CXX_COMPILER_ID STREQUAL Clang) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static") + set (CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "${CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS} -static") + endif () + endif () + else () + message (AUTHOR_WARNING "ENABLE_STATIC_RUNTIME option is for MSVC or MinGW only.") + endif () +endif () + +if (BUILD_SHARED_LIBS) + find_package (PythonInterp REQUIRED) +endif() diff --git a/libsndfile-1.0.31/cmake/SndFileConfig.cmake.in b/libsndfile-1.0.31/cmake/SndFileConfig.cmake.in new file mode 100644 index 0000000..e33c56b --- /dev/null +++ b/libsndfile-1.0.31/cmake/SndFileConfig.cmake.in @@ -0,0 +1,32 @@ +set(SndFile_VERSION @PROJECT_VERSION@) +set(SndFile_VERSION_MAJOR @PROJECT_VERSION_MAJOR@) +set(SndFile_VERSION_MINOR @PROJECT_VERSION_MINOR@) +set(SndFile_VERSION_PATCH @PROJECT_VERSION_PATCH@) + +set (SndFile_WITH_EXTERNAL_LIBS @SndFile_WITH_EXTERNAL_LIBS@) + +@PACKAGE_INIT@ + +include (CMakeFindDependencyMacro) + +if (SndFile_WITH_EXTERNAL_LIBS AND NOT @BUILD_SHARED_LIBS@) + find_dependency (Ogg 1.3) + find_dependency (Vorbis) + find_dependency (FLAC) + find_dependency (Opus) +endif () + +include (${CMAKE_CURRENT_LIST_DIR}/SndFileTargets.cmake) + +set_and_check (SndFile_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@") +set (SNDFILE_INCLUDE_DIR ${SndFile_INCLUDE_DIR}) + +set (SndFile_LIBRARY SndFile::sndfile) +set (SNDFILE_LIBRARY SndFile::sndfile) +set (SndFile_LIBRARIES SndFile::sndfile) +set (SNDFILE_LIBRARIES SndFile::sndfile) + + +check_required_components(SndFile) + +set (SNDFILE_FOUND 1) diff --git a/libsndfile-1.0.31/cmake/TestInline.c.in b/libsndfile-1.0.31/cmake/TestInline.c.in new file mode 100644 index 0000000..2aed643 --- /dev/null +++ b/libsndfile-1.0.31/cmake/TestInline.c.in @@ -0,0 +1,10 @@ +static @INLINE_KEYWORD@ void test_inline(void) +{ + return; +} + +int main (void) +{ + test_inline (); + return 0; +} diff --git a/libsndfile-1.0.31/cmake/TestInline.cmake b/libsndfile-1.0.31/cmake/TestInline.cmake new file mode 100644 index 0000000..ef15c07 --- /dev/null +++ b/libsndfile-1.0.31/cmake/TestInline.cmake @@ -0,0 +1,54 @@ +macro (TEST_INLINE) + if (NOT DEFINED INLINE_CODE) + message (STATUS "Checking for inline...") + set (INLINE_KEYWORD "inline") + configure_file (cmake/TestInline.c.in ${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/TestInline.c) + try_compile (HAVE_INLINE "${CMAKE_CURRENT_BINARY_DIR}" + "${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/TestInline.c") + if (HAVE_INLINE) + message (STATUS "Checking for inline... supported") + else () + message (STATUS "Checking for inline... not supported") + + message (STATUS "Checking for __inline...") + set (INLINE_KEYWORD "__inline") + configure_file (cmake/TestInline.c.in ${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/TestInline.c) + try_compile (HAVE___INLINE "${CMAKE_CURRENT_BINARY_DIR}" + "${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/TestInline.c") + if (HAVE___INLINE) + message (STATUS "Checking for __inline... supported") + else () + message (STATUS "Checking for __inline... not supported") + + message (STATUS "Checking for __inline__...") + set (INLINE_KEYWORD "__inline__") + configure_file (cmake/TestInline.c.in ${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/TestInline.c) + try_compile (HAVE___INLINE "${CMAKE_CURRENT_BINARY_DIR}" + "${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/TestInline.c") + if (HAVE___INLINE) + message (STATUS "Checking for __inline__... supported") + + message (STATUS "Checking for __inline__...") + set (INLINE_KEYWORD "__inline__") + configure_file (cmake/TestInline.c.in ${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/cmake/TestInline.c) + try_compile (HAVE___INLINE__ "${CMAKE_CURRENT_BINARY_DIR}" + "${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/TestInline.c") + else () + message (STATUS "Checking for __inline__... not supported") + set (INLINE_KEYWORD "") + endif () + + endif () + endif () + + if (HAVE_INLINE) + set (INLINE_CODE "/* #undef inline */" CACHE INTERNAL "") + elseif (HAVE___INLINE) + set (INLINE_CODE "#define inline __inline" CACHE INTERNAL "") + elseif (HAVE___INLINE__) + set (INLINE_CODE "#define inline __inline__" CACHE INTERNAL "") + else () + set (INLINE_CODE "#define inline " CACHE INTERNAL "") + endif () + endif () +endmacro (TEST_INLINE) diff --git a/libsndfile-1.0.31/cmake/TestLargeFiles.cmake b/libsndfile-1.0.31/cmake/TestLargeFiles.cmake new file mode 100644 index 0000000..075407b --- /dev/null +++ b/libsndfile-1.0.31/cmake/TestLargeFiles.cmake @@ -0,0 +1,121 @@ +include (CheckIncludeFile) +include (CheckTypeSize) +include (CMakePushCheckState) + +macro (TEST_LARGE_FILES VARIABLE) + +if (NOT DEFINED ${VARIABLE}) + + cmake_push_check_state() + + message (STATUS "") + message (STATUS "") + message (STATUS "Checking large files support...") + + if (WIN32) + set (${VARIABLE} 1 CACHE INTERNAL "Result of tests for large file support" FORCE) + message (STATUS "") + message (STATUS "Result of checking large files support: supported with WinAPI") + else () + + message (STATUS "") + check_include_file(sys/types.h HAVE_SYS_TYPES_H) + check_include_file(stdint.h HAVE_STDINT_H) + check_include_file(stddef.h HAVE_STDDEF_H) + message (STATUS "") + + message (STATUS "Checking size of off_t without any definitions:") + check_type_size (off_t SIZEOF_OFF_T) + message (STATUS "Checking of off_t without any definitions: ${SIZEOF_OFF_T}") + if (SIZEOF_OFF_T EQUAL 8) + set (LARGE_FILES_DEFINITIONS "" CACHE INTERNAL "64-bit off_t required definitions") + set (FILE64 TRUE) + else () + unset (HAVE_SIZEOF_OFF_T CACHE) + unset (SIZEOF_OFF_T CACHE) + unset (SIZEOF_OFF_T_CODE CACHE) + cmake_pop_check_state() + set (FILE64 FALSE) + endif () + + if (NOT FILE64) + set (CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} /D_FILE_OFFSET_BITS=64) + message (STATUS "") + message (STATUS "Checking size of off_t with _FILE_OFFSET_BITS=64:") + check_type_size (off_t SIZEOF_OFF_T) + message (STATUS "Checking size of off_t with _FILE_OFFSET_BITS=64: ${SIZEOF_OFF_T}") + if (SIZEOF_OFF_T EQUAL 8) + set (_FILE_OFFSET_BITS 64 CACHE INTERNAL "") + set (_FILE_OFFSET_BITS_CODE "#define _FILE_OFFSET_BITS 64" CACHE INTERNAL "") + set (LARGE_FILES_DEFINITIONS ${LARGE_FILES_DEFINITIONS} "/D_FILE_OFFSET_BITS=64" CACHE INTERNAL "64-bit off_t required definitions") + set (FILE64 TRUE) + else () + set (_FILE_OFFSET_BITS_CODE "" CACHE INTERNAL "") + unset (HAVE_SIZEOF_OFF_T CACHE) + unset (SIZEOF_OFF_T CACHE) + unset (SIZEOF_OFF_T_CODE CACHE) + cmake_pop_check_state() + set (FILE64 FALSE) + endif () + endif () + + if (NOT FILE64) + set (CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} /D_LARGE_FILES) + message (STATUS "") + message (STATUS "Checking size of off_t with _LARGE_FILES:") + check_type_size (off_t SIZEOF_OFF_T) + message (STATUS "Checking size of off_t with _LARGE_FILES: ${SIZEOF_OFF_T}") + if (SIZEOF_OFF_T EQUAL 8) + set (_LARGE_FILES 1 CACHE INTERNAL "") + set (LARGE_FILES_DEFINITIONS ${LARGE_FILES_DEFINITIONS} "/D_LARGE_FILES" CACHE INTERNAL "64-bit off_t required definitions") + set (FILE64 TRUE) + else () + unset (HAVE_SIZEOF_OFF_T CACHE) + unset (SIZEOF_OFF_T CACHE) + unset (SIZEOF_OFF_T_CODE CACHE) + cmake_pop_check_state() + set (FILE64 FALSE) + endif () + endif () + + if (NOT FILE64) + set (CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} /D_LARGEFILE_SOURCE) + unset (HAVE_SIZEOF_OFF_T CACHE) + unset (SIZEOF_OFF_T CACHE) + unset (SIZEOF_OFF_T_CODE CACHE) + message (STATUS "") + message (STATUS "Checking size of off_t with _LARGEFILE_SOURCE:") + check_type_size (off_t SIZEOF_OFF_T) + message (STATUS "Checking size of off_t with _LARGEFILE_SOURCE: ${SIZEOF_OFF_T}") + if (SIZEOF_OFF_T EQUAL 8) + set (_LARGEFILE_SOURCE 1 CACHE INTERNAL "") + set (LARGE_FILES_DEFINITIONS ${LARGE_FILES_DEFINITIONS} "/D_LARGEFILE_SOURCE" CACHE INTERNAL "64-bit off_t required definitions") + set (FILE64 TRUE) + else () + cmake_pop_check_state() + set (FILE64 FALSE) + endif () + endif () + + message (STATUS "") + if (FILE64) + set (${VARIABLE} 1 CACHE INTERNAL "Result of tests for large file support" FORCE) + if (NOT SIZEOF_OFF_T_REQURED_DEFINITIONS) + message (STATUS "Result of checking large files support: supported") + else () + message (STATUS "Result of checking large files support: supported with ${LARGE_FILES_DEFINITIONS}") + message (STATUS "Add LARGE_FILES_DEFINITIONS to your compiler definitions or configure with _FILE_OFFSET_BITS,") + message (STATUS "_FILE_OFFSET_BITS_CODE, _LARGE_FILES and _LARGEFILE_SOURCE variables.") + endif () + else () + message ("Result of checking large files support: not supported") + set (${VARIABLE} 0 CACHE INTERNAL "Result of test for large file support" FORCE) + endif () + message ("") + message ("") + + endif () + +endif (NOT DEFINED ${VARIABLE}) + +endmacro (TEST_LARGE_FILES VARIABLE) diff --git a/libsndfile-1.0.31/cmake/sqlite/FindSQLite3.cmake b/libsndfile-1.0.31/cmake/sqlite/FindSQLite3.cmake new file mode 100644 index 0000000..a0385ca --- /dev/null +++ b/libsndfile-1.0.31/cmake/sqlite/FindSQLite3.cmake @@ -0,0 +1,56 @@ +# - Find SQLite3 +# Find the native SQLite3 includes and libraries +# +# SQLite3_INCLUDE_DIRS - where to find sqlite3.h, etc. +# SQLite3_LIBRARIES - List of libraries when using SQLite3. +# SQLite3_FOUND - True if SQLite3 found. + +if (SQLite3_INCLUDE_DIR) + # Already in cache, be silent + set (SQLite3_FIND_QUIETLY TRUE) +endif () + +find_package (PkgConfig QUIET) +pkg_check_modules (PC_SQLite3 QUIET sqlite3) + +set (SQLite3_VERSION ${PC_SQLite3_VERSION}) + +find_path (SQLite3_INCLUDE_DIR sqlite3.h + HINTS + ${PC_SQLite3_INCLUDEDIR} + ${PC_SQLite3_INCLUDE_DIRS} + ${SQLite3_ROOT} + ) + +find_library (SQLite3_LIBRARY + NAMES + sqlite3 + HINTS + ${PC_SQLite3_LIBDIR} + ${PC_SQLite3_LIBRARY_DIRS} + ${SQLite3_ROOT} + ) + +include (FindPackageHandleStandardArgs) + +find_package_handle_standard_args (SQLite3 + REQUIRED_VARS + SQLite3_LIBRARY + SQLite3_INCLUDE_DIR + VERSION_VAR + SQLite3_VERSION + ) + +if (SQLite3_FOUND) + set (SQLite3_INCLUDE_DIRS ${SQLite3_INCLUDE_DIR}) + set (SQLite3_LIBRARIES ${SQLite3_LIBRARY}) + if (NOT TARGET SQLite::SQLite3) + add_library (SQLite::SQLite3 UNKNOWN IMPORTED) + set_target_properties (SQLite::SQLite3 PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${SQLite3_INCLUDE_DIRS}" + IMPORTED_LOCATION "${SQLite3_LIBRARIES}" + ) + endif () +endif () + +mark_as_advanced (SQLite3_INCLUDE_DIR SQLite3_LIBRARY) diff --git a/libsndfile-1.0.31/configure b/libsndfile-1.0.31/configure new file mode 100755 index 0000000..d4682ce --- /dev/null +++ b/libsndfile-1.0.31/configure @@ -0,0 +1,27027 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for libsndfile 1.0.31. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: sndfile@mega-nerd.com about your system, including any +$0: error possibly output before this message. Then install +$0: a modern shell, or manually run the script under such a +$0: shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='libsndfile' +PACKAGE_TARNAME='libsndfile' +PACKAGE_VERSION='1.0.31' +PACKAGE_STRING='libsndfile 1.0.31' +PACKAGE_BUGREPORT='sndfile@mega-nerd.com' +PACKAGE_URL='http://libsndfile.github.io/libsndfile/' + +ac_unique_file="src/sndfile.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +TEST_BINDIR +SRC_BINDIR +EXTERNAL_XIPH_REQUIRE +EXTERNAL_XIPH_LIBS +EXTERNAL_XIPH_CFLAGS +SNDIO_LIBS +OS_SPECIFIC_LINKS +OS_SPECIFIC_CFLAGS +HAVE_EXTERNAL_XIPH_LIBS +WIN_RC_VERSION +GEN_TOOL +VERSION_MAJOR +CLEAN_VERSION +SHARED_VERSION_INFO +SHLIB_VERSION_ARG +HTML_FGCOLOUR +HTML_BGCOLOUR +HOST_TRIPLET +ALSA_LIBS +ALSA_CFLAGS +USE_WIN_VERSION_FILE_FALSE +USE_WIN_VERSION_FILE_TRUE +HAVE_SQLITE3_FALSE +HAVE_SQLITE3_TRUE +SQLITE3_LIBS +SQLITE3_CFLAGS +OPUS_LIBS +OPUS_CFLAGS +VORBISENC_LIBS +VORBISENC_CFLAGS +VORBIS_LIBS +VORBIS_CFLAGS +SPEEX_LIBS +SPEEX_CFLAGS +OGG_LIBS +OGG_CFLAGS +FLAC_LIBS +FLAC_CFLAGS +pkgconfigdir +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG +OCTAVE_DEST_MDIR +OCTAVE_DEST_ODIR +OCTAVE_CONFIG_VERSION +OCTAVE_CONFIG +HAVE_OCTAVE_CONFIG +MKOCTFILE_VERSION +MKOCTFILE +HAVE_MKOCTFILE +OCTAVE +OCTAVE_VERSION +HAVE_OCTAVE +BUILD_OCTAVE_MOD_FALSE +BUILD_OCTAVE_MOD_TRUE +SF_COUNT_MAX +SIZEOF_SF_COUNT_T +TYPEOF_SF_COUNT_T +USE_OSSFUZZ_STATIC_FALSE +USE_OSSFUZZ_STATIC_TRUE +USE_OSSFUZZ_FLAG_FALSE +USE_OSSFUZZ_FLAG_TRUE +LIB_FUZZING_ENGINE +USE_OSSFUZZERS_FALSE +USE_OSSFUZZERS_TRUE +ENABLE_TEST_COVERAGE_FALSE +ENABLE_TEST_COVERAGE_TRUE +FULL_SUITE_FALSE +FULL_SUITE_TRUE +LINUX_MINGW_CROSS_TEST_FALSE +LINUX_MINGW_CROSS_TEST_TRUE +HAVE_XCODE_SELECT +HAVE_WINE +HAVE_AUTOGEN +pkgpyexecdir +pyexecdir +pkgpythondir +pythondir +PYTHON_PLATFORM +PYTHON_EXEC_PREFIX +PYTHON_PREFIX +PYTHON_VERSION +PYTHON +RC +CXXCPP +LT_SYS_LIBRARY_PATH +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +LIBTOOL +OBJDUMP +DLLTOOL +AS +ac_ct_AR +AR +SED +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +EGREP +GREP +CPP +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL +am__quote' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_aix_soname +with_gnu_ld +with_sysroot +enable_libtool_lock +enable_experimental +enable_werror +enable_stack_smash_protection +enable_cpu_clip +enable_bow_docs +enable_sqlite +enable_alsa +enable_external_libs +enable_octave +enable_full_suite +enable_test_coverage +enable_ossfuzzers +enable_largefile +with_octave +with_mkoctfile +with_octave_config +with_pkgconfigdir +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +CXX +CXXFLAGS +CCC +LT_SYS_LIBRARY_PATH +CXXCPP +PYTHON +PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR +FLAC_CFLAGS +FLAC_LIBS +OGG_CFLAGS +OGG_LIBS +SPEEX_CFLAGS +SPEEX_LIBS +VORBIS_CFLAGS +VORBIS_LIBS +VORBISENC_CFLAGS +VORBISENC_LIBS +OPUS_CFLAGS +OPUS_LIBS +SQLITE3_CFLAGS +SQLITE3_LIBS +ALSA_CFLAGS +ALSA_LIBS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures libsndfile 1.0.31 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/libsndfile] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of libsndfile 1.0.31:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-experimental enable experimental code + --enable-werror enable -Werror in all Makefiles + --enable-stack-smash-protection + Enable GNU GCC stack smash protection + --disable-cpu-clip disable tricky cpu specific clipper + --enable-bow-docs enable black-on-white html docs + --disable-sqlite disable use of sqlite + --disable-alsa disable ALSA support (default=autodetect) + --disable-external-libs disable use of FLAC, Ogg and Vorbis [[default=no]] + --enable-octave enable building of GNU Octave module + --disable-full-suite disable building and installing programs, + documentation, only build library [[default=no]] + --enable-test-coverage enable test coverage + --enable-ossfuzzers Whether to generate the fuzzers for OSS-Fuzz + --disable-largefile omit support for large files + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, [default=aix]. + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot[=DIR] Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + --with-octave choose the octave version + --with-mkoctfile choose the mkoctfile version + --with-octave-config choose the octave-config version + --with-pkgconfigdir pkg-config installation directory + ['${libdir}/pkgconfig'] + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + CXXCPP C++ preprocessor + PYTHON the Python interpreter + PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path + FLAC_CFLAGS C compiler flags for FLAC, overriding pkg-config + FLAC_LIBS linker flags for FLAC, overriding pkg-config + OGG_CFLAGS C compiler flags for OGG, overriding pkg-config + OGG_LIBS linker flags for OGG, overriding pkg-config + SPEEX_CFLAGS + C compiler flags for SPEEX, overriding pkg-config + SPEEX_LIBS linker flags for SPEEX, overriding pkg-config + VORBIS_CFLAGS + C compiler flags for VORBIS, overriding pkg-config + VORBIS_LIBS linker flags for VORBIS, overriding pkg-config + VORBISENC_CFLAGS + C compiler flags for VORBISENC, overriding pkg-config + VORBISENC_LIBS + linker flags for VORBISENC, overriding pkg-config + OPUS_CFLAGS C compiler flags for OPUS, overriding pkg-config + OPUS_LIBS linker flags for OPUS, overriding pkg-config + SQLITE3_CFLAGS + C compiler flags for SQLITE3, overriding pkg-config + SQLITE3_LIBS + linker flags for SQLITE3, overriding pkg-config + ALSA_CFLAGS C compiler flags for ALSA, overriding pkg-config + ALSA_LIBS linker flags for ALSA, overriding pkg-config + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +libsndfile home page: . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +libsndfile configure 1.0.31 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ------------------------------------ ## +## Report this to sndfile@mega-nerd.com ## +## ------------------------------------ ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +# -------------------------------------------- +# Tries to find the compile-time value of EXPR in a program that includes +# INCLUDES, setting VAR accordingly. Returns whether the value could be +# computed +ac_fn_c_compute_int () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid; break +else + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) < 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=$ac_mid; break +else + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + ac_lo= ac_hi= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid +else + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in #(( +?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +'') ac_retval=1 ;; +esac + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +static long int longval () { return $2; } +static unsigned long int ulongval () { return $2; } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (($2) < 0) + { + long int i = longval (); + if (i != ($2)) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ($2)) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + echo >>conftest.val; read $3 &5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_run + +# ac_fn_cxx_compute_int LINENO EXPR VAR INCLUDES +# ---------------------------------------------- +# Tries to find the compile-time value of EXPR in a program that includes +# INCLUDES, setting VAR accordingly. Returns whether the value could be +# computed +ac_fn_cxx_compute_int () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_hi=$ac_mid; break +else + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) < 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_lo=$ac_mid; break +else + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + ac_lo= ac_hi= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_hi=$ac_mid +else + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in #(( +?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +'') ac_retval=1 ;; +esac + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +static long int longval () { return $2; } +static unsigned long int ulongval () { return $2; } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (($2) < 0) + { + long int i = longval (); + if (i != ($2)) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ($2)) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_run "$LINENO"; then : + echo >>conftest.val; read $3 &5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_cpp + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link + +# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES +# --------------------------------------------- +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. +ac_fn_c_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_decl + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by libsndfile $as_me 1.0.31, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether configure should try to set CFLAGS/CXXFLAGS/CPPFLAGS/LDFLAGS" >&5 +$as_echo_n "checking whether configure should try to set CFLAGS/CXXFLAGS/CPPFLAGS/LDFLAGS... " >&6; } +if test "x${CFLAGS+set}" = "xset" || test "x${CXXFLAGS+set}" = "xset" || test "x${CPPFLAGS+set}" = "xset" || test "x${LDFLAGS+set}" = "xset"; then : + + enable_flags_setting=no + : ${CFLAGS=""} + : ${CXXFLAGS=""} + +else + + enable_flags_setting=yes + CFLAGS="" + CXXFLAGS="" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${enable_flags_setting}" >&5 +$as_echo "${enable_flags_setting}" >&6; } + +ac_aux_dir= +for ac_dir in build-aux "$srcdir"/build-aux; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + + + +ac_config_headers="$ac_config_headers src/config.h" + + +am__api_version='1.16' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +if test x"${MISSING+set}" != xset; then + MISSING="\${SHELL} '$am_aux_dir/missing'" +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='libsndfile' + VERSION='1.0.31' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 + (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + case $?:`cat confinc.out 2>/dev/null` in #( + '0:this is the am__doit target') : + case $s in #( + BSD) : + am__include='.include' am__quote='"' ;; #( + *) : + am__include='include' am__quote='' ;; +esac ;; #( + *) : + ;; +esac + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +$as_echo "${_am_result}" >&6; } + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 +$as_echo_n "checking for $CC option to accept ISO C99... " >&6; } +if ${ac_cv_prog_cc_c99+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +#include + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +#define debug(...) fprintf (stderr, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + your preprocessor is broken; +#endif +#if BIG_OK +#else + your preprocessor is broken; +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\0'; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static void +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str; + int number; + float fnumber; + + while (*format) + { + switch (*format++) + { + case 's': // string + str = va_arg (args_copy, const char *); + break; + case 'd': // int + number = va_arg (args_copy, int); + break; + case 'f': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); +} + +int +main () +{ + + // Check bool. + _Bool success = false; + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + test_varargs ("s, d' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' + || dynamic_array[ni.number - 1] != 543); + + ; + return 0; +} +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c99" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c99" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +$as_echo "$ac_cv_prog_cc_c99" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c99" != xno; then : + +fi + + + +if test "x$ac_cv_prog_cc_c99" = "xno"; then : + + as_fn_error $? "libsndfile requires a C99 capable compiler!" "$LINENO" 5 + +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" +if test "x$ac_cv_header_minix_config_h" = xyes; then : + MINIX=yes +else + MINIX= +fi + + + if test "$MINIX" = yes; then + +$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h + + +$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h + + +$as_echo "#define _MINIX 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 +$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } +if ${ac_cv_safe_to_define___extensions__+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# define __EXTENSIONS__ 1 + $ac_includes_default +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_safe_to_define___extensions__=yes +else + ac_cv_safe_to_define___extensions__=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 +$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } + test $ac_cv_safe_to_define___extensions__ = yes && + $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h + + $as_echo "#define _ALL_SOURCE 1" >>confdefs.h + + $as_echo "#define _GNU_SOURCE 1" >>confdefs.h + + $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + + $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5 +$as_echo_n "checking for C compiler vendor... " >&6; } +if ${ax_cv_c_compiler_vendor+:} false; then : + $as_echo_n "(cached) " >&6 +else + # note: don't check for gcc first since some other compilers define __GNUC__ + vendors="intel: __ICC,__ECC,__INTEL_COMPILER + ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__ + pathscale: __PATHCC__,__PATHSCALE__ + clang: __clang__ + cray: _CRAYC + fujitsu: __FUJITSU + gnu: __GNUC__ + sun: __SUNPRO_C,__SUNPRO_CC + hp: __HP_cc,__HP_aCC + dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER + borland: __BORLANDC__,__CODEGEARC__,__TURBOC__ + comeau: __COMO__ + kai: __KCC + lcc: __LCC__ + sgi: __sgi,sgi + microsoft: _MSC_VER + metrowerks: __MWERKS__ + watcom: __WATCOMC__ + portland: __PGI + tcc: __TINYC__ + unknown: UNKNOWN" + for ventest in $vendors; do + case $ventest in + *:) vendor=$ventest; continue ;; + *) vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;; + esac + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + #if !($vencpp) + thisisanerror; + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done + ax_cv_c_compiler_vendor=`echo $vendor | cut -d: -f1` + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_vendor" >&5 +$as_echo "$ax_cv_c_compiler_vendor" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +$as_echo_n "checking for C compiler version... " >&6; } +if ${ax_cv_c_compiler_version+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ax_cv_c_compiler_vendor in #( + intel) : + if ac_fn_c_compute_int "$LINENO" "__INTEL_COMPILER/100" "_ax_c_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_INTEL unknown intel compiler version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "(__INTEL_COMPILER%100)/10" "_ax_c_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_INTEL unknown intel compiler version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "(__INTEL_COMPILER%10)" "_ax_c_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_INTEL unknown intel compiler version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" + ;; #( + ibm) : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ + + #if defined(__COMPILER_VER__) + choke me; + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + if ac_fn_c_compute_int "$LINENO" "__xlC__/100" "_ax_c_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "__xlC__%100" "_ax_c_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "__xlC_ver__/0x100" "_ax_c_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler patch version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "__xlC_ver__%0x100" "_ax_c_compiler_version_build" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler build version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch.$_ax_c_compiler_version_build" + +else + + if ac_fn_c_compute_int "$LINENO" "__xlC__%1000" "_ax_c_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler patch version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "(__xlC__/10000)%10" "_ax_c_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "(__xlC__/100000)%10" "_ax_c_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ;; #( + pathscale) : + + if ac_fn_c_compute_int "$LINENO" "__PATHCC__" "_ax_c_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_PATHSCALE unknown pathscale major +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "__PATHCC_MINOR__" "_ax_c_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_PATHSCALE unknown pathscale minor +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "__PATHCC_PATCHLEVEL__" "_ax_c_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_PATHSCALE unknown pathscale patch level +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" + ;; #( + clang) : + + if ac_fn_c_compute_int "$LINENO" "__clang_major__" "_ax_c_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_CLANG unknown clang major +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "__clang_minor__" "_ax_c_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_CLANG unknown clang minor +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "__clang_patchlevel__" "_ax_c_compiler_version_patch" ""; then : + +else + 0 +fi + + ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" + ;; #( + cray) : + + if ac_fn_c_compute_int "$LINENO" "_RELEASE" "_ax_c_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_CRAY unknown crayc release +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "_RELEASE_MINOR" "_ax_c_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_CRAY unknown crayc minor +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor" + ;; #( + fujitsu) : + + if ac_fn_c_compute_int "$LINENO" "__FCC_VERSION" "ax_cv_c_compiler_version" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_FUJITSUunknown fujitsu release +See \`config.log' for more details" "$LINENO" 5; } +fi + + ;; #( + gnu) : + + if ac_fn_c_compute_int "$LINENO" "__GNUC__" "_ax_c_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_GNU unknown gcc major +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "__GNUC_MINOR__" "_ax_c_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_GNU unknown gcc minor +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "__GNUC_PATCHLEVEL__" "_ax_c_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_GNU unknown gcc patch level +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" + ;; #( + sun) : + + + if ac_fn_c_compute_int "$LINENO" "!!( + #if defined(__SUNPRO_CC) + __SUNPRO_CC + #else + __SUNPRO_C + #endif + < 0x1000)" "_ax_c_compiler_version_until59" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun release version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if test "X$_ax_c_compiler_version_until59" = X1; then : + if ac_fn_c_compute_int "$LINENO" " + #if defined(__SUNPRO_CC) + __SUNPRO_CC + #else + __SUNPRO_C + #endif + % 0x10" "_ax_c_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun patch version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "( + #if defined(__SUNPRO_CC) + __SUNPRO_CC + #else + __SUNPRO_C + #endif + / 0x10) % 0x10" "_ax_c_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "( + #if defined(__SUNPRO_CC) + __SUNPRO_CC + #else + __SUNPRO_C + #endif + / 0x100)" "_ax_c_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + +else + if ac_fn_c_compute_int "$LINENO" " + #if defined(__SUNPRO_CC) + __SUNPRO_CC + #else + __SUNPRO_C + #endif + % 0x10" "_ax_c_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun patch version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "( + #if defined(__SUNPRO_CC) + __SUNPRO_CC + #else + __SUNPRO_C + #endif + / 0x100) % 0x100" "_ax_c_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "( + #if defined(__SUNPRO_CC) + __SUNPRO_CC + #else + __SUNPRO_C + #endif + / 0x1000)" "_ax_c_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + +fi + ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" + ;; #( + hp) : + + + if ac_fn_c_compute_int "$LINENO" "!!( + #if defined(__HP_cc) + __HP_cc + #else + __HP_aCC + #endif + <= 1)" "_ax_c_compiler_version_untilA0121" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_HP unknown hp release version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if test "X$_ax_c_compiler_version_untilA0121" = X1; then : + ax_cv_c_compiler_version="01.21.00" + +else + if ac_fn_c_compute_int "$LINENO" "( + #if defined(__HP_cc) + __HP_cc + #else + __HP_aCC + #endif + % 100)" "_ax_c_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_HP unknown hp release version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "(( + #if defined(__HP_cc) + __HP_cc + #else + __HP_aCC + #endif + / 100)%100)" "_ax_c_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_HP unknown hp minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "(( + #if defined(__HP_cc) + __HP_cc + #else + __HP_aCC + #endif + / 10000)%100)" "_ax_c_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_HP unknown hp major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" + +fi + ;; #( + dec) : + + if ac_fn_c_compute_int "$LINENO" "( + #if defined(__DECC_VER) + __DECC_VER + #else + __DECCXX_VER + #endif + % 10000)" "_ax_c_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_DEC unknown dec release version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "(( + #if defined(__DECC_VER) + __DECC_VER + #else + __DECCXX_VER + #endif + / 100000UL)%100)" "_ax_c_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_DEC unknown dec minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "(( + #if defined(__DECC_VER) + __DECC_VER + #else + __DECCXX_VER + #endif + / 10000000UL)%100)" "_ax_c_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_DEC unknown dec major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" + ;; #( + borland) : + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + #if defined(__TURBOC__) + __TURBOC__ + #else + choke me + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + if ac_fn_c_compute_int "$LINENO" " + #if defined(__TURBOC__) + __TURBOC__ + #else + choke me + #endif + " "_ax_c_compiler_version_turboc_raw" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_BORLAND unknown turboc version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if test $_ax_c_compiler_version_turboc_raw -lt 661 || test $_ax_c_compiler_version_turboc_raw -gt 1023; then : + if ac_fn_c_compute_int "$LINENO" " + #if defined(__TURBOC__) + __TURBOC__ + #else + choke me + #endif + % 0x100" "_ax_c_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_BORLAND unknown turboc minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "( + #if defined(__TURBOC__) + __TURBOC__ + #else + choke me + #endif + /0x100)%0x100" "_ax_c_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_BORLAND unknown turboc major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_c_compiler_version="0turboc:$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor" +else + case $_ax_c_compiler_version_turboc_raw in #( + 661) : + ax_cv_c_compiler_version="0turboc:1.00" ;; #( + 662) : + ax_cv_c_compiler_version="0turboc:1.01" ;; #( + 663) : + ax_cv_c_compiler_version="0turboc:2.00" ;; #( + *) : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: [_AX_COMPILER_VERSION_BORLAND] unknown turboc version between 0x295 and 0x400 please report bug" >&5 +$as_echo "$as_me: WARNING: [_AX_COMPILER_VERSION_BORLAND] unknown turboc version between 0x295 and 0x400 please report bug" >&2;} + ax_cv_c_compiler_version="" + ;; +esac + +fi + +else + # borlandc + + if ac_fn_c_compute_int "$LINENO" " + #if defined(__BORLANDC__) + __BORLANDC__ + #else + __CODEGEARC__ + #endif + " "_ax_c_compiler_version_borlandc_raw" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_BORLAND unknown borlandc version +See \`config.log' for more details" "$LINENO" 5; } +fi + + case $_ax_c_compiler_version_borlandc_raw in #( + 512 ) : + ax_cv_c_compiler_version="1borlanc:2.00" ;; #( + 1024) : + ax_cv_c_compiler_version="1borlanc:3.00" ;; #( + 1024) : + ax_cv_c_compiler_version="1borlanc:3.00" ;; #( + 1040) : + ax_cv_c_compiler_version="1borlanc:3.1" ;; #( + 1106) : + ax_cv_c_compiler_version="1borlanc:4.0" ;; #( + 1280) : + ax_cv_c_compiler_version="1borlanc:5.0" ;; #( + 1312) : + ax_cv_c_compiler_version="1borlanc:5.02" ;; #( + 1328) : + ax_cv_c_compiler_version="2cppbuilder:3.0" ;; #( + 1344) : + ax_cv_c_compiler_version="2cppbuilder:4.0" ;; #( + 1360) : + ax_cv_c_compiler_version="3borlancpp:5.5" ;; #( + 1361) : + ax_cv_c_compiler_version="3borlancpp:5.51" ;; #( + 1378) : + ax_cv_c_compiler_version="3borlancpp:5.6.4" ;; #( + 1392) : + ax_cv_c_compiler_version="4cppbuilder:2006" ;; #( + 1424) : + ax_cv_c_compiler_version="4cppbuilder:2007" ;; #( + 1555) : + ax_cv_c_compiler_version="4cppbuilder:2009" ;; #( + 1569) : + ax_cv_c_compiler_version="4cppbuilder:2010" ;; #( + 1584) : + ax_cv_c_compiler_version="5xe" ;; #( + 1600) : + ax_cv_c_compiler_version="5xe:2" ;; #( + 1616) : + ax_cv_c_compiler_version="5xe:3" ;; #( + 1632) : + ax_cv_c_compiler_version="5xe:4" ;; #( + *) : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: [_AX_COMPILER_VERSION_BORLAND] Unknown borlandc compiler version $_ax_c_compiler_version_borlandc_raw please report bug" >&5 +$as_echo "$as_me: WARNING: [_AX_COMPILER_VERSION_BORLAND] Unknown borlandc compiler version $_ax_c_compiler_version_borlandc_raw please report bug" >&2;} + ;; +esac + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ;; #( + comeau) : + if ac_fn_c_compute_int "$LINENO" "__COMO_VERSION__%100" "_ax_c_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_COMEAU unknown comeau compiler minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "(__COMO_VERSION__/100)%10" "_ax_c_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_COMEAU unknown comeau compiler major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor" + ;; #( + kai) : + + if ac_fn_c_compute_int "$LINENO" "__KCC_VERSION%100" "_ax_c_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_KAI unknown kay compiler patch version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "(__KCC_VERSION/100)%10" "_ax_c_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_KAI unknown kay compiler minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "(__KCC_VERSION/1000)%10" "_ax_c_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_KAI unknown kay compiler major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" + ;; #( + sgi) : + + + if ac_fn_c_compute_int "$LINENO" " + #if defined(_COMPILER_VERSION) + _COMPILER_VERSION + #else + _SGI_COMPILER_VERSION + #endif + %10" "_ax_c_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SGI unknown SGI compiler patch version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "( + #if defined(_COMPILER_VERSION) + _COMPILER_VERSION + #else + _SGI_COMPILER_VERSION + #endif + /10)%10" "_ax_c_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SGI unknown SGI compiler minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "( + #if defined(_COMPILER_VERSION) + _COMPILER_VERSION + #else + _SGI_COMPILER_VERSION + #endif + /100)%10" "_ax_c_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SGI unknown SGI compiler major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" + ;; #( + microsoft) : + + if ac_fn_c_compute_int "$LINENO" "_MSC_VER%100" "_ax_c_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_MICROSOFT unknown microsoft compiler minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "(_MSC_VER/100)%100" "_ax_c_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_MICROSOFT unknown microsoft compiler major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + _ax_c_compiler_version_patch=0 + _ax_c_compiler_version_build=0 + # special case for version 6 + if test "X$_ax_c_compiler_version_major" = "X12"; then : + if ac_fn_c_compute_int "$LINENO" "_MSC_FULL_VER%1000" "_ax_c_compiler_version_patch" ""; then : + +else + _ax_c_compiler_version_patch=0 +fi + +fi + # for version 7 + if test "X$_ax_c_compiler_version_major" = "X13"; then : + if ac_fn_c_compute_int "$LINENO" "_MSC_FULL_VER%1000" "_ax_c_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_MICROSOFT unknown microsoft compiler patch version +See \`config.log' for more details" "$LINENO" 5; } +fi + + +fi + # for version > 8 + if test $_ax_c_compiler_version_major -ge 14; then : + if ac_fn_c_compute_int "$LINENO" "_MSC_FULL_VER%10000" "_ax_c_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_MICROSOFT unknown microsoft compiler patch version +See \`config.log' for more details" "$LINENO" 5; } +fi + + +fi + if test $_ax_c_compiler_version_major -ge 15; then : + if ac_fn_c_compute_int "$LINENO" "_MSC_BUILD" "_ax_c_compiler_version_build" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_MICROSOFT unknown microsoft compiler build version +See \`config.log' for more details" "$LINENO" 5; } +fi + + +fi + ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch.$_ax_c_compiler_version_build" + ;; #( + metrowerks) : + if ac_fn_c_compute_int "$LINENO" "__MWERKS__%0x100" "_ax_c_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_METROWERKS unknown metrowerks compiler patch version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "(__MWERKS__/0x100)%0x10" "_ax_c_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_METROWERKS unknown metrowerks compiler minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "(__MWERKS__/0x1000)%0x10" "_ax_c_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_METROWERKS unknown metrowerks compiler major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" + ;; #( + watcom) : + if ac_fn_c_compute_int "$LINENO" "__WATCOMC__%100" "_ax_c_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_WATCOM unknown watcom compiler minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "(__WATCOMC__/100)%100" "_ax_c_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_WATCOM unknown watcom compiler major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor" + ;; #( + portland) : + + if ac_fn_c_compute_int "$LINENO" "__PGIC__" "_ax_c_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_PORTLAND unknown pgi major +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "__PGIC_MINOR__" "_ax_c_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_PORTLAND unknown pgi minor +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_c_compute_int "$LINENO" "__PGIC_PATCHLEVEL__" "_ax_c_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_PORTLAND unknown pgi patch level +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" + ;; #( + tcc) : + + ax_cv_c_compiler_version=`tcc -v | $SED 's/^[ ]*tcc[ ]\+version[ ]\+\([0-9.]\+\).*/\1/g'` + ;; #( + *) : + ax_cv_c_compiler_version="" ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_version" >&5 +$as_echo "$ax_cv_c_compiler_version" >&6; } + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler vendor" >&5 +$as_echo_n "checking for C++ compiler vendor... " >&6; } +if ${ax_cv_cxx_compiler_vendor+:} false; then : + $as_echo_n "(cached) " >&6 +else + # note: don't check for gcc first since some other compilers define __GNUC__ + vendors="intel: __ICC,__ECC,__INTEL_COMPILER + ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__ + pathscale: __PATHCC__,__PATHSCALE__ + clang: __clang__ + cray: _CRAYC + fujitsu: __FUJITSU + gnu: __GNUC__ + sun: __SUNPRO_C,__SUNPRO_CC + hp: __HP_cc,__HP_aCC + dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER + borland: __BORLANDC__,__CODEGEARC__,__TURBOC__ + comeau: __COMO__ + kai: __KCC + lcc: __LCC__ + sgi: __sgi,sgi + microsoft: _MSC_VER + metrowerks: __MWERKS__ + watcom: __WATCOMC__ + portland: __PGI + tcc: __TINYC__ + unknown: UNKNOWN" + for ventest in $vendors; do + case $ventest in + *:) vendor=$ventest; continue ;; + *) vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;; + esac + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + #if !($vencpp) + thisisanerror; + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done + ax_cv_cxx_compiler_vendor=`echo $vendor | cut -d: -f1` + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compiler_vendor" >&5 +$as_echo "$ax_cv_cxx_compiler_vendor" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +$as_echo_n "checking for C++ compiler version... " >&6; } +if ${ax_cv_cxx_compiler_version+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ax_cv_cxx_compiler_vendor in #( + intel) : + if ac_fn_cxx_compute_int "$LINENO" "__INTEL_COMPILER/100" "_ax_cxx_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_INTEL unknown intel compiler version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "(__INTEL_COMPILER%100)/10" "_ax_cxx_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_INTEL unknown intel compiler version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "(__INTEL_COMPILER%10)" "_ax_cxx_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_INTEL unknown intel compiler version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_cxx_compiler_version="$_ax_cxx_compiler_version_major.$_ax_cxx_compiler_version_minor.$_ax_cxx_compiler_version_patch" + ;; #( + ibm) : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ + + #if defined(__COMPILER_VER__) + choke me; + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + + if ac_fn_cxx_compute_int "$LINENO" "__xlC__/100" "_ax_cxx_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "__xlC__%100" "_ax_cxx_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "__xlC_ver__/0x100" "_ax_cxx_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler patch version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "__xlC_ver__%0x100" "_ax_cxx_compiler_version_build" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler build version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_cxx_compiler_version="$_ax_cxx_compiler_version_major.$_ax_cxx_compiler_version_minor.$_ax_cxx_compiler_version_patch.$_ax_cxx_compiler_version_build" + +else + + if ac_fn_cxx_compute_int "$LINENO" "__xlC__%1000" "_ax_cxx_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler patch version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "(__xlC__/10000)%10" "_ax_cxx_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "(__xlC__/100000)%10" "_ax_cxx_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_cxx_compiler_version="$_ax_cxx_compiler_version_major.$_ax_cxx_compiler_version_minor.$_ax_cxx_compiler_version_patch" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ;; #( + pathscale) : + + if ac_fn_cxx_compute_int "$LINENO" "__PATHCC__" "_ax_cxx_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_PATHSCALE unknown pathscale major +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "__PATHCC_MINOR__" "_ax_cxx_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_PATHSCALE unknown pathscale minor +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "__PATHCC_PATCHLEVEL__" "_ax_cxx_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_PATHSCALE unknown pathscale patch level +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_cxx_compiler_version="$_ax_cxx_compiler_version_major.$_ax_cxx_compiler_version_minor.$_ax_cxx_compiler_version_patch" + ;; #( + clang) : + + if ac_fn_cxx_compute_int "$LINENO" "__clang_major__" "_ax_cxx_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_CLANG unknown clang major +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "__clang_minor__" "_ax_cxx_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_CLANG unknown clang minor +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "__clang_patchlevel__" "_ax_cxx_compiler_version_patch" ""; then : + +else + 0 +fi + + ax_cv_cxx_compiler_version="$_ax_cxx_compiler_version_major.$_ax_cxx_compiler_version_minor.$_ax_cxx_compiler_version_patch" + ;; #( + cray) : + + if ac_fn_cxx_compute_int "$LINENO" "_RELEASE" "_ax_cxx_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_CRAY unknown crayc release +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "_RELEASE_MINOR" "_ax_cxx_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_CRAY unknown crayc minor +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_cxx_compiler_version="$_ax_cxx_compiler_version_major.$_ax_cxx_compiler_version_minor" + ;; #( + fujitsu) : + + if ac_fn_cxx_compute_int "$LINENO" "__FCC_VERSION" "ax_cv_cxx_compiler_version" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_FUJITSUunknown fujitsu release +See \`config.log' for more details" "$LINENO" 5; } +fi + + ;; #( + gnu) : + + if ac_fn_cxx_compute_int "$LINENO" "__GNUC__" "_ax_cxx_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_GNU unknown gcc major +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "__GNUC_MINOR__" "_ax_cxx_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_GNU unknown gcc minor +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "__GNUC_PATCHLEVEL__" "_ax_cxx_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_GNU unknown gcc patch level +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_cxx_compiler_version="$_ax_cxx_compiler_version_major.$_ax_cxx_compiler_version_minor.$_ax_cxx_compiler_version_patch" + ;; #( + sun) : + + + if ac_fn_cxx_compute_int "$LINENO" "!!( + #if defined(__SUNPRO_CC) + __SUNPRO_CC + #else + __SUNPRO_C + #endif + < 0x1000)" "_ax_cxx_compiler_version_until59" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun release version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if test "X$_ax_cxx_compiler_version_until59" = X1; then : + if ac_fn_cxx_compute_int "$LINENO" " + #if defined(__SUNPRO_CC) + __SUNPRO_CC + #else + __SUNPRO_C + #endif + % 0x10" "_ax_cxx_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun patch version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "( + #if defined(__SUNPRO_CC) + __SUNPRO_CC + #else + __SUNPRO_C + #endif + / 0x10) % 0x10" "_ax_cxx_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "( + #if defined(__SUNPRO_CC) + __SUNPRO_CC + #else + __SUNPRO_C + #endif + / 0x100)" "_ax_cxx_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + +else + if ac_fn_cxx_compute_int "$LINENO" " + #if defined(__SUNPRO_CC) + __SUNPRO_CC + #else + __SUNPRO_C + #endif + % 0x10" "_ax_cxx_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun patch version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "( + #if defined(__SUNPRO_CC) + __SUNPRO_CC + #else + __SUNPRO_C + #endif + / 0x100) % 0x100" "_ax_cxx_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "( + #if defined(__SUNPRO_CC) + __SUNPRO_CC + #else + __SUNPRO_C + #endif + / 0x1000)" "_ax_cxx_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + +fi + ax_cv_cxx_compiler_version="$_ax_cxx_compiler_version_major.$_ax_cxx_compiler_version_minor.$_ax_cxx_compiler_version_patch" + ;; #( + hp) : + + + if ac_fn_cxx_compute_int "$LINENO" "!!( + #if defined(__HP_cc) + __HP_cc + #else + __HP_aCC + #endif + <= 1)" "_ax_cxx_compiler_version_untilA0121" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_HP unknown hp release version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if test "X$_ax_cxx_compiler_version_untilA0121" = X1; then : + ax_cv_cxx_compiler_version="01.21.00" + +else + if ac_fn_cxx_compute_int "$LINENO" "( + #if defined(__HP_cc) + __HP_cc + #else + __HP_aCC + #endif + % 100)" "_ax_cxx_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_HP unknown hp release version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "(( + #if defined(__HP_cc) + __HP_cc + #else + __HP_aCC + #endif + / 100)%100)" "_ax_cxx_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_HP unknown hp minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "(( + #if defined(__HP_cc) + __HP_cc + #else + __HP_aCC + #endif + / 10000)%100)" "_ax_cxx_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_HP unknown hp major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_cxx_compiler_version="$_ax_cxx_compiler_version_major.$_ax_cxx_compiler_version_minor.$_ax_cxx_compiler_version_patch" + +fi + ;; #( + dec) : + + if ac_fn_cxx_compute_int "$LINENO" "( + #if defined(__DECC_VER) + __DECC_VER + #else + __DECCXX_VER + #endif + % 10000)" "_ax_cxx_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_DEC unknown dec release version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "(( + #if defined(__DECC_VER) + __DECC_VER + #else + __DECCXX_VER + #endif + / 100000UL)%100)" "_ax_cxx_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_DEC unknown dec minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "(( + #if defined(__DECC_VER) + __DECC_VER + #else + __DECCXX_VER + #endif + / 10000000UL)%100)" "_ax_cxx_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_DEC unknown dec major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_cxx_compiler_version="$_ax_cxx_compiler_version_major.$_ax_cxx_compiler_version_minor.$_ax_cxx_compiler_version_patch" + ;; #( + borland) : + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + #if defined(__TURBOC__) + __TURBOC__ + #else + choke me + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + if ac_fn_cxx_compute_int "$LINENO" " + #if defined(__TURBOC__) + __TURBOC__ + #else + choke me + #endif + " "_ax_cxx_compiler_version_turboc_raw" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_BORLAND unknown turboc version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if test $_ax_cxx_compiler_version_turboc_raw -lt 661 || test $_ax_cxx_compiler_version_turboc_raw -gt 1023; then : + if ac_fn_cxx_compute_int "$LINENO" " + #if defined(__TURBOC__) + __TURBOC__ + #else + choke me + #endif + % 0x100" "_ax_cxx_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_BORLAND unknown turboc minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "( + #if defined(__TURBOC__) + __TURBOC__ + #else + choke me + #endif + /0x100)%0x100" "_ax_cxx_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_BORLAND unknown turboc major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_cxx_compiler_version="0turboc:$_ax_cxx_compiler_version_major.$_ax_cxx_compiler_version_minor" +else + case $_ax_cxx_compiler_version_turboc_raw in #( + 661) : + ax_cv_cxx_compiler_version="0turboc:1.00" ;; #( + 662) : + ax_cv_cxx_compiler_version="0turboc:1.01" ;; #( + 663) : + ax_cv_cxx_compiler_version="0turboc:2.00" ;; #( + *) : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: [_AX_COMPILER_VERSION_BORLAND] unknown turboc version between 0x295 and 0x400 please report bug" >&5 +$as_echo "$as_me: WARNING: [_AX_COMPILER_VERSION_BORLAND] unknown turboc version between 0x295 and 0x400 please report bug" >&2;} + ax_cv_cxx_compiler_version="" + ;; +esac + +fi + +else + # borlandc + + if ac_fn_cxx_compute_int "$LINENO" " + #if defined(__BORLANDC__) + __BORLANDC__ + #else + __CODEGEARC__ + #endif + " "_ax_cxx_compiler_version_borlandc_raw" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_BORLAND unknown borlandc version +See \`config.log' for more details" "$LINENO" 5; } +fi + + case $_ax_cxx_compiler_version_borlandc_raw in #( + 512 ) : + ax_cv_cxx_compiler_version="1borlanc:2.00" ;; #( + 1024) : + ax_cv_cxx_compiler_version="1borlanc:3.00" ;; #( + 1024) : + ax_cv_cxx_compiler_version="1borlanc:3.00" ;; #( + 1040) : + ax_cv_cxx_compiler_version="1borlanc:3.1" ;; #( + 1106) : + ax_cv_cxx_compiler_version="1borlanc:4.0" ;; #( + 1280) : + ax_cv_cxx_compiler_version="1borlanc:5.0" ;; #( + 1312) : + ax_cv_cxx_compiler_version="1borlanc:5.02" ;; #( + 1328) : + ax_cv_cxx_compiler_version="2cppbuilder:3.0" ;; #( + 1344) : + ax_cv_cxx_compiler_version="2cppbuilder:4.0" ;; #( + 1360) : + ax_cv_cxx_compiler_version="3borlancpp:5.5" ;; #( + 1361) : + ax_cv_cxx_compiler_version="3borlancpp:5.51" ;; #( + 1378) : + ax_cv_cxx_compiler_version="3borlancpp:5.6.4" ;; #( + 1392) : + ax_cv_cxx_compiler_version="4cppbuilder:2006" ;; #( + 1424) : + ax_cv_cxx_compiler_version="4cppbuilder:2007" ;; #( + 1555) : + ax_cv_cxx_compiler_version="4cppbuilder:2009" ;; #( + 1569) : + ax_cv_cxx_compiler_version="4cppbuilder:2010" ;; #( + 1584) : + ax_cv_cxx_compiler_version="5xe" ;; #( + 1600) : + ax_cv_cxx_compiler_version="5xe:2" ;; #( + 1616) : + ax_cv_cxx_compiler_version="5xe:3" ;; #( + 1632) : + ax_cv_cxx_compiler_version="5xe:4" ;; #( + *) : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: [_AX_COMPILER_VERSION_BORLAND] Unknown borlandc compiler version $_ax_cxx_compiler_version_borlandc_raw please report bug" >&5 +$as_echo "$as_me: WARNING: [_AX_COMPILER_VERSION_BORLAND] Unknown borlandc compiler version $_ax_cxx_compiler_version_borlandc_raw please report bug" >&2;} + ;; +esac + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ;; #( + comeau) : + if ac_fn_cxx_compute_int "$LINENO" "__COMO_VERSION__%100" "_ax_cxx_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_COMEAU unknown comeau compiler minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "(__COMO_VERSION__/100)%10" "_ax_cxx_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_COMEAU unknown comeau compiler major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_cxx_compiler_version="$_ax_cxx_compiler_version_major.$_ax_cxx_compiler_version_minor" + ;; #( + kai) : + + if ac_fn_cxx_compute_int "$LINENO" "__KCC_VERSION%100" "_ax_cxx_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_KAI unknown kay compiler patch version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "(__KCC_VERSION/100)%10" "_ax_cxx_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_KAI unknown kay compiler minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "(__KCC_VERSION/1000)%10" "_ax_cxx_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_KAI unknown kay compiler major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_cxx_compiler_version="$_ax_cxx_compiler_version_major.$_ax_cxx_compiler_version_minor.$_ax_cxx_compiler_version_patch" + ;; #( + sgi) : + + + if ac_fn_cxx_compute_int "$LINENO" " + #if defined(_COMPILER_VERSION) + _COMPILER_VERSION + #else + _SGI_COMPILER_VERSION + #endif + %10" "_ax_cxx_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SGI unknown SGI compiler patch version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "( + #if defined(_COMPILER_VERSION) + _COMPILER_VERSION + #else + _SGI_COMPILER_VERSION + #endif + /10)%10" "_ax_cxx_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SGI unknown SGI compiler minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "( + #if defined(_COMPILER_VERSION) + _COMPILER_VERSION + #else + _SGI_COMPILER_VERSION + #endif + /100)%10" "_ax_cxx_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_SGI unknown SGI compiler major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_cxx_compiler_version="$_ax_cxx_compiler_version_major.$_ax_cxx_compiler_version_minor.$_ax_cxx_compiler_version_patch" + ;; #( + microsoft) : + + if ac_fn_cxx_compute_int "$LINENO" "_MSC_VER%100" "_ax_cxx_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_MICROSOFT unknown microsoft compiler minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "(_MSC_VER/100)%100" "_ax_cxx_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_MICROSOFT unknown microsoft compiler major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + _ax_cxx_compiler_version_patch=0 + _ax_cxx_compiler_version_build=0 + # special case for version 6 + if test "X$_ax_cxx_compiler_version_major" = "X12"; then : + if ac_fn_cxx_compute_int "$LINENO" "_MSC_FULL_VER%1000" "_ax_cxx_compiler_version_patch" ""; then : + +else + _ax_cxx_compiler_version_patch=0 +fi + +fi + # for version 7 + if test "X$_ax_cxx_compiler_version_major" = "X13"; then : + if ac_fn_cxx_compute_int "$LINENO" "_MSC_FULL_VER%1000" "_ax_cxx_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_MICROSOFT unknown microsoft compiler patch version +See \`config.log' for more details" "$LINENO" 5; } +fi + + +fi + # for version > 8 + if test $_ax_cxx_compiler_version_major -ge 14; then : + if ac_fn_cxx_compute_int "$LINENO" "_MSC_FULL_VER%10000" "_ax_cxx_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_MICROSOFT unknown microsoft compiler patch version +See \`config.log' for more details" "$LINENO" 5; } +fi + + +fi + if test $_ax_cxx_compiler_version_major -ge 15; then : + if ac_fn_cxx_compute_int "$LINENO" "_MSC_BUILD" "_ax_cxx_compiler_version_build" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_MICROSOFT unknown microsoft compiler build version +See \`config.log' for more details" "$LINENO" 5; } +fi + + +fi + ax_cv_cxx_compiler_version="$_ax_cxx_compiler_version_major.$_ax_cxx_compiler_version_minor.$_ax_cxx_compiler_version_patch.$_ax_cxx_compiler_version_build" + ;; #( + metrowerks) : + if ac_fn_cxx_compute_int "$LINENO" "__MWERKS__%0x100" "_ax_cxx_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_METROWERKS unknown metrowerks compiler patch version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "(__MWERKS__/0x100)%0x10" "_ax_cxx_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_METROWERKS unknown metrowerks compiler minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "(__MWERKS__/0x1000)%0x10" "_ax_cxx_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_METROWERKS unknown metrowerks compiler major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_cxx_compiler_version="$_ax_cxx_compiler_version_major.$_ax_cxx_compiler_version_minor.$_ax_cxx_compiler_version_patch" + ;; #( + watcom) : + if ac_fn_cxx_compute_int "$LINENO" "__WATCOMC__%100" "_ax_cxx_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_WATCOM unknown watcom compiler minor version +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "(__WATCOMC__/100)%100" "_ax_cxx_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_WATCOM unknown watcom compiler major version +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_cxx_compiler_version="$_ax_cxx_compiler_version_major.$_ax_cxx_compiler_version_minor" + ;; #( + portland) : + + if ac_fn_cxx_compute_int "$LINENO" "__PGIC__" "_ax_cxx_compiler_version_major" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_PORTLAND unknown pgi major +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "__PGIC_MINOR__" "_ax_cxx_compiler_version_minor" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_PORTLAND unknown pgi minor +See \`config.log' for more details" "$LINENO" 5; } +fi + + if ac_fn_cxx_compute_int "$LINENO" "__PGIC_PATCHLEVEL__" "_ax_cxx_compiler_version_patch" ""; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "_AX_COMPILER_VERSION_PORTLAND unknown pgi patch level +See \`config.log' for more details" "$LINENO" 5; } +fi + + ax_cv_cxx_compiler_version="$_ax_cxx_compiler_version_major.$_ax_cxx_compiler_version_minor.$_ax_cxx_compiler_version_patch" + ;; #( + tcc) : + + ax_cv_cxx_compiler_version=`tcc -v | $SED 's/^[ ]*tcc[ ]\+version[ ]\+\([0-9.]\+\).*/\1/g'` + ;; #( + *) : + ax_cv_cxx_compiler_version="" ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compiler_version" >&5 +$as_echo "$ax_cv_cxx_compiler_version" >&6; } + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar lib "link -lib" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar lib "link -lib" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 +$as_echo_n "checking the archiver ($AR) interface... " >&6; } +if ${am_cv_ar_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + am_cv_ar_interface=ar + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int some_variable = 0; +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 +$as_echo "$am_cv_ar_interface" >&6; } + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + as_fn_error $? "could not determine $AR interface" "$LINENO" 5 + ;; +esac + + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.6' +macro_revision='2.4.6' + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case $ECHO in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n "$lt_cv_sys_max_cmd_len"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +$as_echo "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +$as_echo_n "checking for a working dd... " >&6; } +if ${ac_cv_path_lt_DD+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in dd; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +$as_echo "$ac_cv_path_lt_DD" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +$as_echo_n "checking how to truncate binary pipes... " >&6; } +if ${lt_cv_truncate_bin+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +$as_echo "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*|powerpc64le-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[012][,.]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*|11.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + +func_stripname_cnf () +{ + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; + esac +} # func_stripname_cnf + + + + + +# Set options +enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AS="${ac_tool_prefix}as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +$as_echo "$AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AS="as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +$as_echo "$ac_ct_AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AS" = x; then + AS="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AS=$ac_ct_AS + fi +else + AS="$ac_cv_prog_AS" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + + ;; +esac + +test -z "$AS" && AS=as + + + + + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + enable_dlopen=no + + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + pic_mode=default +fi + + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } + +# Check whether --with-aix-soname was given. +if test "${with_aix_soname+set}" = set; then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else + if ${lt_cv_with_aix_soname+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +$as_echo "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/${ac_tool_prefix}file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC=$CC +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works"; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='$wl--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test no = "$ld_shlibs"; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + else + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='$wl-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='$wl-z,text' + allow_undefined_flag='$wl-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$versuffix$shared_ext $libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .bundle || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + # Handle Gentoo/FreeBSD as it was Linux + case $host_vendor in + gentoo) + version_type=linux ;; + *) + version_type=freebsd-$objformat ;; + esac + + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + linux) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + need_lib_prefix=no + need_version=no + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen=shl_load +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen=dlopen +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report what library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC + + if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct_CXX=no + hardcode_direct_absolute_CXX=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec_CXX='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + no_undefined_flag_CXX='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' $wl-bernotok' + allow_undefined_flag_CXX=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='$wl--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + if test yes != "$lt_cv_apple_cc_single_mod"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + os2*) + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_minus_L_CXX=yes + allow_undefined_flag_CXX=unsupported + shrext_cmds=.dll + archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes_CXX=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='$wl-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='$wl-E' + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + no_undefined_flag_CXX=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='$wl-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='$wl-z,text' + allow_undefined_flag_CXX='$wl-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } + test no = "$ld_shlibs_CXX" && can_build_shared=no + + GCC_CXX=$GXX + LD_CXX=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX=$prev$p + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX=$prev$p + else + postdeps_CXX="${postdeps_CXX} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX=$p + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX=$p + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + lt_prog_compiler_pic_CXX='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static_CXX='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test no = "$ld_shlibs_CXX" && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$versuffix$shared_ext $libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .bundle || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + # Handle Gentoo/FreeBSD as it was Linux + case $host_vendor in + gentoo) + version_type=linux ;; + *) + version_type=freebsd-$objformat ;; + esac + + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + linux) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + need_lib_prefix=no + need_version=no + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec_CXX='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test yes = "$hardcode_automatic_CXX"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct_CXX" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && + test no != "$hardcode_minus_L_CXX"; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test relink = "$hardcode_action_CXX" || + test yes = "$inherit_rpath_CXX"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. +set dummy ${ac_tool_prefix}windres; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RC"; then + ac_cv_prog_RC="$RC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RC="${ac_tool_prefix}windres" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RC=$ac_cv_prog_RC +if test -n "$RC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RC" >&5 +$as_echo "$RC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RC"; then + ac_ct_RC=$RC + # Extract the first word of "windres", so it can be a program name with args. +set dummy windres; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RC"; then + ac_cv_prog_ac_ct_RC="$ac_ct_RC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RC="windres" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RC=$ac_cv_prog_ac_ct_RC +if test -n "$ac_ct_RC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RC" >&5 +$as_echo "$ac_ct_RC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RC" = x; then + RC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RC=$ac_ct_RC + fi +else + RC="$ac_cv_prog_RC" +fi + + + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +objext_RC=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code=$lt_simple_compile_test_code + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +compiler_RC=$CC +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + +lt_cv_prog_compiler_c_o_RC=yes + +if test -n "$compiler"; then + : + + + +fi + +GCC=$lt_save_GCC +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + + + + + + + + + # Find any Python interpreter. + if test -z "$PYTHON"; then + for ac_prog in python python2 python3 python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PYTHON+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PYTHON in + [\\/]* | ?:[\\/]*) + ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PYTHON=$ac_cv_path_PYTHON +if test -n "$PYTHON"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 +$as_echo "$PYTHON" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$PYTHON" && break +done +test -n "$PYTHON" || PYTHON=":" + + fi + am_display_PYTHON=python + + + if test "$PYTHON" = :; then + as_fn_error $? "no suitable Python interpreter found" "$LINENO" 5 + else + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5 +$as_echo_n "checking for $am_display_PYTHON version... " >&6; } +if ${am_cv_python_version+:} false; then : + $as_echo_n "(cached) " >&6 +else + am_cv_python_version=`$PYTHON -c "import sys; print('%u.%u' % sys.version_info[:2])"` +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5 +$as_echo "$am_cv_python_version" >&6; } + PYTHON_VERSION=$am_cv_python_version + + + + PYTHON_PREFIX='${prefix}' + + PYTHON_EXEC_PREFIX='${exec_prefix}' + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5 +$as_echo_n "checking for $am_display_PYTHON platform... " >&6; } +if ${am_cv_python_platform+:} false; then : + $as_echo_n "(cached) " >&6 +else + am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"` +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5 +$as_echo "$am_cv_python_platform" >&6; } + PYTHON_PLATFORM=$am_cv_python_platform + + + # Just factor out some code duplication. + am_python_setup_sysconfig="\ +import sys +# Prefer sysconfig over distutils.sysconfig, for better compatibility +# with python 3.x. See automake bug#10227. +try: + import sysconfig +except ImportError: + can_use_sysconfig = 0 +else: + can_use_sysconfig = 1 +# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: +# +try: + from platform import python_implementation + if python_implementation() == 'CPython' and sys.version[:3] == '2.7': + can_use_sysconfig = 0 +except ImportError: + pass" + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory" >&5 +$as_echo_n "checking for $am_display_PYTHON script directory... " >&6; } +if ${am_cv_python_pythondir+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$prefix" = xNONE + then + am_py_prefix=$ac_default_prefix + else + am_py_prefix=$prefix + fi + am_cv_python_pythondir=`$PYTHON -c " +$am_python_setup_sysconfig +if can_use_sysconfig: + sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) +else: + from distutils import sysconfig + sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') +sys.stdout.write(sitedir)"` + case $am_cv_python_pythondir in + $am_py_prefix*) + am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` + am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` + ;; + *) + case $am_py_prefix in + /usr|/System*) ;; + *) + am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages + ;; + esac + ;; + esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5 +$as_echo "$am_cv_python_pythondir" >&6; } + pythondir=$am_cv_python_pythondir + + + + pkgpythondir=\${pythondir}/$PACKAGE + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory" >&5 +$as_echo_n "checking for $am_display_PYTHON extension module directory... " >&6; } +if ${am_cv_python_pyexecdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$exec_prefix" = xNONE + then + am_py_exec_prefix=$am_py_prefix + else + am_py_exec_prefix=$exec_prefix + fi + am_cv_python_pyexecdir=`$PYTHON -c " +$am_python_setup_sysconfig +if can_use_sysconfig: + sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'}) +else: + from distutils import sysconfig + sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix') +sys.stdout.write(sitedir)"` + case $am_cv_python_pyexecdir in + $am_py_exec_prefix*) + am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` + am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` + ;; + *) + case $am_py_exec_prefix in + /usr|/System*) ;; + *) + am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages + ;; + esac + ;; + esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5 +$as_echo "$am_cv_python_pyexecdir" >&6; } + pyexecdir=$am_cv_python_pyexecdir + + + + pkgpyexecdir=\${pyexecdir}/$PACKAGE + + + + fi + + + +# Extract the first word of "autogen", so it can be a program name with args. +set dummy autogen; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_HAVE_AUTOGEN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$HAVE_AUTOGEN"; then + ac_cv_prog_HAVE_AUTOGEN="$HAVE_AUTOGEN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_HAVE_AUTOGEN="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_HAVE_AUTOGEN" && ac_cv_prog_HAVE_AUTOGEN="no" +fi +fi +HAVE_AUTOGEN=$ac_cv_prog_HAVE_AUTOGEN +if test -n "$HAVE_AUTOGEN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_AUTOGEN" >&5 +$as_echo "$HAVE_AUTOGEN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "wine", so it can be a program name with args. +set dummy wine; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_HAVE_WINE+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$HAVE_WINE"; then + ac_cv_prog_HAVE_WINE="$HAVE_WINE" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_HAVE_WINE="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_HAVE_WINE" && ac_cv_prog_HAVE_WINE="no" +fi +fi +HAVE_WINE=$ac_cv_prog_HAVE_WINE +if test -n "$HAVE_WINE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_WINE" >&5 +$as_echo "$HAVE_WINE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "xcode-select", so it can be a program name with args. +set dummy xcode-select; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_HAVE_XCODE_SELECT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$HAVE_XCODE_SELECT"; then + ac_cv_prog_HAVE_XCODE_SELECT="$HAVE_XCODE_SELECT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_HAVE_XCODE_SELECT="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_HAVE_XCODE_SELECT" && ac_cv_prog_HAVE_XCODE_SELECT="no" +fi +fi +HAVE_XCODE_SELECT=$ac_cv_prog_HAVE_XCODE_SELECT +if test -n "$HAVE_XCODE_SELECT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_XCODE_SELECT" >&5 +$as_echo "$HAVE_XCODE_SELECT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +SHARED_VERSION_INFO="1:31:0" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + + +for ac_header in endian.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "endian.h" "ac_cv_header_endian_h" "$ac_includes_default" +if test "x$ac_cv_header_endian_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ENDIAN_H 1 +_ACEOF + +fi + +done + +for ac_header in byteswap.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "byteswap.h" "ac_cv_header_byteswap_h" "$ac_includes_default" +if test "x$ac_cv_header_byteswap_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_BYTESWAP_H 1 +_ACEOF + +fi + +done + +for ac_header in locale.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" +if test "x$ac_cv_header_locale_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LOCALE_H 1 +_ACEOF + +fi + +done + +for ac_header in sys/time.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_time_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_TIME_H 1 +_ACEOF + +fi + +done + +for ac_header in immintrin.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "immintrin.h" "ac_cv_header_immintrin_h" "$ac_includes_default" +if test "x$ac_cv_header_immintrin_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_IMMINTRIN_H 1 +_ACEOF + +fi + +done + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5 +$as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } +if ${ac_cv_header_sys_wait_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#ifndef WEXITSTATUS +# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) +#endif +#ifndef WIFEXITED +# define WIFEXITED(stat_val) (((stat_val) & 255) == 0) +#endif + +int +main () +{ + int s; + wait (&s); + s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_sys_wait_h=yes +else + ac_cv_header_sys_wait_h=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5 +$as_echo "$ac_cv_header_sys_wait_h" >&6; } +if test $ac_cv_header_sys_wait_h = yes; then + +$as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_decl "$LINENO" "S_IRGRP" "ac_cv_have_decl_S_IRGRP" "$ac_includes_default" +if test "x$ac_cv_have_decl_S_IRGRP" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_S_IRGRP $ac_have_decl +_ACEOF + +if test "x$ac_cv_have_decl_S_IRGRP" = "xyes"; then : + + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_S_IRGRP 1 +_ACEOF + + +else + + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_S_IRGRP 0 +_ACEOF + + +fi + + if test "x${build_os}:${host_os}:${HAVE_WINE}" = "xlinux-gnu:mingw32msvc:yes"; then + LINUX_MINGW_CROSS_TEST_TRUE= + LINUX_MINGW_CROSS_TEST_FALSE='#' +else + LINUX_MINGW_CROSS_TEST_TRUE='#' + LINUX_MINGW_CROSS_TEST_FALSE= +fi + + + +SHLIB_VERSION_ARG="" + + +# Check whether --enable-experimental was given. +if test "${enable_experimental+set}" = set; then : + enableval=$enable_experimental; +fi + + +if test "x$enable_experimental" = "xyes"; then : + + EXPERIMENTAL_CODE=1 + +else + + EXPERIMENTAL_CODE=0 + +fi + +cat >>confdefs.h <<_ACEOF +#define ENABLE_EXPERIMENTAL_CODE ${EXPERIMENTAL_CODE} +_ACEOF + + +# Check whether --enable-werror was given. +if test "${enable_werror+set}" = set; then : + enableval=$enable_werror; +fi + + +# Check whether --enable-stack-smash-protection was given. +if test "${enable_stack_smash_protection+set}" = set; then : + enableval=$enable_stack_smash_protection; +fi + + +# Check whether --enable-cpu-clip was given. +if test "${enable_cpu_clip+set}" = set; then : + enableval=$enable_cpu_clip; +fi + + +# Check whether --enable-bow-docs was given. +if test "${enable_bow_docs+set}" = set; then : + enableval=$enable_bow_docs; +fi + + +# Check whether --enable-sqlite was given. +if test "${enable_sqlite+set}" = set; then : + enableval=$enable_sqlite; +fi + + +# Check whether --enable-alsa was given. +if test "${enable_alsa+set}" = set; then : + enableval=$enable_alsa; +else + enable_alsa=auto +fi + + +# Check whether --enable-external-libs was given. +if test "${enable_external_libs+set}" = set; then : + enableval=$enable_external_libs; +fi + + +# Check whether --enable-octave was given. +if test "${enable_octave+set}" = set; then : + enableval=$enable_octave; +fi + + +# Check whether --enable-full-suite was given. +if test "${enable_full_suite+set}" = set; then : + enableval=$enable_full_suite; +fi + + if test "x$enable_full_suite" != "xno"; then + FULL_SUITE_TRUE= + FULL_SUITE_FALSE='#' +else + FULL_SUITE_TRUE='#' + FULL_SUITE_FALSE= +fi + + +# Check whether --enable-test-coverage was given. +if test "${enable_test_coverage+set}" = set; then : + enableval=$enable_test_coverage; +fi + + if test "x$enable_test_coverage" = "xyes"; then + ENABLE_TEST_COVERAGE_TRUE= + ENABLE_TEST_COVERAGE_FALSE='#' +else + ENABLE_TEST_COVERAGE_TRUE='#' + ENABLE_TEST_COVERAGE_FALSE= +fi + + +# Check whether --enable-ossfuzzers was given. +if test "${enable_ossfuzzers+set}" = set; then : + enableval=$enable_ossfuzzers; have_ossfuzzers=yes +else + have_ossfuzzers=no +fi + + if test "x$have_ossfuzzers" = "xyes"; then + USE_OSSFUZZERS_TRUE= + USE_OSSFUZZERS_FALSE='#' +else + USE_OSSFUZZERS_TRUE='#' + USE_OSSFUZZERS_FALSE= +fi + + + + if test "x$LIB_FUZZING_ENGINE" = "x-fsanitize=fuzzer"; then + USE_OSSFUZZ_FLAG_TRUE= + USE_OSSFUZZ_FLAG_FALSE='#' +else + USE_OSSFUZZ_FLAG_TRUE='#' + USE_OSSFUZZ_FLAG_FALSE= +fi + + if test -f "$LIB_FUZZING_ENGINE"; then + USE_OSSFUZZ_STATIC_TRUE= + USE_OSSFUZZ_STATIC_FALSE='#' +else + USE_OSSFUZZ_STATIC_TRUE='#' + USE_OSSFUZZ_STATIC_FALSE= +fi + + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of wchar_t" >&5 +$as_echo_n "checking size of wchar_t... " >&6; } +if ${ac_cv_sizeof_wchar_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (wchar_t))" "ac_cv_sizeof_wchar_t" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_wchar_t" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (wchar_t) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_wchar_t=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_wchar_t" >&5 +$as_echo "$ac_cv_sizeof_wchar_t" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_WCHAR_T $ac_cv_sizeof_wchar_t +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 +$as_echo_n "checking size of short... " >&6; } +if ${ac_cv_sizeof_short+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_short" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (short) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_short=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 +$as_echo "$ac_cv_sizeof_short" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SHORT $ac_cv_sizeof_short +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 +$as_echo_n "checking size of int... " >&6; } +if ${ac_cv_sizeof_int+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_int" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (int) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_int=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 +$as_echo "$ac_cv_sizeof_int" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_INT $ac_cv_sizeof_int +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 +$as_echo_n "checking size of long... " >&6; } +if ${ac_cv_sizeof_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 +$as_echo "$ac_cv_sizeof_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG $ac_cv_sizeof_long +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5 +$as_echo_n "checking size of float... " >&6; } +if ${ac_cv_sizeof_float+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_float" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (float) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_float=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_float" >&5 +$as_echo "$ac_cv_sizeof_float" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_FLOAT $ac_cv_sizeof_float +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5 +$as_echo_n "checking size of double... " >&6; } +if ${ac_cv_sizeof_double+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_double" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (double) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_double=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5 +$as_echo "$ac_cv_sizeof_double" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_DOUBLE $ac_cv_sizeof_double +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void*" >&5 +$as_echo_n "checking size of void*... " >&6; } +if ${ac_cv_sizeof_voidp+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ac_cv_sizeof_voidp" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_voidp" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (void*) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_voidp=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_voidp" >&5 +$as_echo "$ac_cv_sizeof_voidp" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_VOIDP $ac_cv_sizeof_voidp +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5 +$as_echo_n "checking size of size_t... " >&6; } +if ${ac_cv_sizeof_size_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_size_t" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (size_t) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_size_t=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_size_t" >&5 +$as_echo "$ac_cv_sizeof_size_t" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int64_t" >&5 +$as_echo_n "checking size of int64_t... " >&6; } +if ${ac_cv_sizeof_int64_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int64_t))" "ac_cv_sizeof_int64_t" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_int64_t" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (int64_t) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_int64_t=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int64_t" >&5 +$as_echo "$ac_cv_sizeof_int64_t" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_INT64_T $ac_cv_sizeof_int64_t +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 +$as_echo_n "checking size of long long... " >&6; } +if ${ac_cv_sizeof_long_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_long_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (long long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 +$as_echo "$ac_cv_sizeof_long_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long +_ACEOF + + + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of off_t" >&5 +$as_echo_n "checking size of off_t... " >&6; } +if ${ac_cv_sizeof_off_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (off_t))" "ac_cv_sizeof_off_t" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_off_t" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (off_t) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_off_t=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_off_t" >&5 +$as_echo "$ac_cv_sizeof_off_t" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_OFF_T $ac_cv_sizeof_off_t +_ACEOF + + + +if test "x$enable_largefile:$ac_cv_sizeof_off_t" = "xno:8"; then : + + as_fn_error $? "\"Error : Cannot disable large file support because sizeof (off_t) == 8.\"" "$LINENO" 5 + +fi + +case $host_os in #( + mingw32*) : + + TYPEOF_SF_COUNT_T="__int64" + SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL" + SIZEOF_SF_COUNT_T=8 + +$as_echo "#define __USE_MINGW_ANSI_STDIO 1" >>confdefs.h + + ;; #( + linux-android*) : + + TYPEOF_SF_COUNT_T="int64_t" + SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL" + SIZEOF_SF_COUNT_T=8 + ;; #( + *) : + + SIZEOF_SF_COUNT_T=0 + if test "x$ac_cv_sizeof_off_t" = "x8"; then : + + TYPEOF_SF_COUNT_T="int64_t" + SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL" + SIZEOF_SF_COUNT_T=8 + +else + + pre_largefile_sizeof_off_t=$ac_cv_sizeof_off_t + unset ac_cv_sizeof_off_t + + # Check whether --enable-largefile was given. +if test "${enable_largefile+set}" = set; then : + enableval=$enable_largefile; +fi + +if test "$enable_largefile" != no; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +$as_echo_n "checking for special C compiler options needed for large files... " >&6; } +if ${ac_cv_sys_largefile_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext + CC="$CC -n32" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_largefile_CC=' -n32'; break +fi +rm -f core conftest.err conftest.$ac_objext + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +$as_echo "$ac_cv_sys_largefile_CC" >&6; } + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if ${ac_cv_sys_file_offset_bits+:} false; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _FILE_OFFSET_BITS 64 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=64; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_file_offset_bits=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +$as_echo "$ac_cv_sys_file_offset_bits" >&6; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits +_ACEOF +;; +esac +rm -rf conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } +if ${ac_cv_sys_large_files+:} false; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGE_FILES 1 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=1; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_large_files=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +$as_echo "$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _LARGE_FILES $ac_cv_sys_large_files +_ACEOF +;; +esac +rm -rf conftest* + fi + + +fi + + if test "x$ac_cv_sys_largefile_CFLAGS" = "xno"; then : + + ac_cv_sys_largefile_CFLAGS="" + +fi + if test "x$ac_cv_sys_largefile_LDFLAGS" = "xno"; then : + + ac_cv_sys_largefile_LDFLAGS="" + +fi + if test "x$ac_cv_sys_largefile_LIBS" = "xno"; then : + + ac_cv_sys_largefile_LIBS="" + +fi + + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of off_t" >&5 +$as_echo_n "checking size of off_t... " >&6; } +if ${ac_cv_sizeof_off_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (off_t))" "ac_cv_sizeof_off_t" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_off_t" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (off_t) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_off_t=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_off_t" >&5 +$as_echo "$ac_cv_sizeof_off_t" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_OFF_T $ac_cv_sizeof_off_t +_ACEOF + + + + if test "x$ac_cv_sizeof_off_t" = "x8"; then : + + TYPEOF_SF_COUNT_T="int64_t" + SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL" + SIZEOF_SF_COUNT_T=8 + +elif test "x$TYPEOF_SF_COUNT_T" = "xunknown"; then : + + $as_echo "" + $as_echo "*** The configure process has determined that this system is capable" + $as_echo "*** of Large File Support but has not been able to find a type which" + $as_echo "*** is an unambiguous 64 bit file offset." + $as_echo "*** Please contact the author to help resolve this problem." + $as_echo "" + as_fn_error $? "Bad file offset type." "$LINENO" 5 + +fi + +fi + ;; +esac + +case $host_vendor in #( + vita) : + + TYPEOF_SF_COUNT_T="int64_t" + SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL" + SIZEOF_SF_COUNT_T=8 + ;; #( + *) : + ;; +esac + +if test "x$SIZEOF_SF_COUNT_T" = "x4"; then : + + SF_COUNT_MAX="0x7FFFFFFF" + +fi + + +cat >>confdefs.h <<_ACEOF +#define TYPEOF_SF_COUNT_T ${TYPEOF_SF_COUNT_T} +_ACEOF + + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SF_COUNT_T ${SIZEOF_SF_COUNT_T} +_ACEOF + + + + +cat >>confdefs.h <<_ACEOF +#define SF_COUNT_MAX ${SF_COUNT_MAX} +_ACEOF + + + +ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" +if test "x$ac_cv_type_ssize_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define ssize_t int +_ACEOF + +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +if ${ac_cv_c_bigendian+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes; then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main () +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_bigendian=no +else + ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +$as_echo "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + + ac_cv_c_big_endian=1 + ac_cv_c_little_endian=0 + ;; #( + no) + + ac_cv_c_big_endian=0 + ac_cv_c_little_endian=1 + ;; #( + universal) + +$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) + as_fn_error $? "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + + + +cat >>confdefs.h <<_ACEOF +#define CPU_IS_BIG_ENDIAN ${ac_cv_c_big_endian} +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define CPU_IS_LITTLE_ENDIAN ${ac_cv_c_little_endian} +_ACEOF + + + +for ac_func in malloc calloc realloc free +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +for ac_func in open read write lseek lseek64 +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +for ac_func in fstat fstat64 ftruncate fsync +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +for ac_func in snprintf vsnprintf +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +for ac_func in gmtime gmtime_r localtime localtime_r gettimeofday +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +for ac_func in mmap getpagesize +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +for ac_func in setlocale +do : + ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale" +if test "x$ac_cv_func_setlocale" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SETLOCALE 1 +_ACEOF + +fi +done + +for ac_func in pipe waitpid +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing floor" >&5 +$as_echo_n "checking for library containing floor... " >&6; } +if ${ac_cv_search_floor+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char floor (); +int +main () +{ +return floor (); + ; + return 0; +} +_ACEOF +for ac_lib in '' m; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_floor=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_floor+:} false; then : + break +fi +done +if ${ac_cv_search_floor+:} false; then : + +else + ac_cv_search_floor=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_floor" >&5 +$as_echo "$ac_cv_search_floor" >&6; } +ac_res=$ac_cv_search_floor +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +else + + as_fn_error $? "unable to find the floor() function!" "$LINENO" 5 + +fi + +for ac_func in floor ceil fmod lrint lrintf +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + +if test "x$cross_compiling" = "xno"; then : + + if test "x$enable_octave" = "xno"; then : + + if false; then + BUILD_OCTAVE_MOD_TRUE= + BUILD_OCTAVE_MOD_FALSE='#' +else + BUILD_OCTAVE_MOD_TRUE='#' + BUILD_OCTAVE_MOD_FALSE= +fi + + +else + + + +OCTAVE_BUILD=no + + + + +# Check whether --with-octave was given. +if test "${with_octave+set}" = set; then : + withval=$with_octave; with_octave=$withval +fi + + +test -z "$with_octave" && with_octave=octave + +# Extract the first word of "$with_octave", so it can be a program name with args. +set dummy $with_octave; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_HAVE_OCTAVE+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$HAVE_OCTAVE"; then + ac_cv_prog_HAVE_OCTAVE="$HAVE_OCTAVE" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_HAVE_OCTAVE="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_HAVE_OCTAVE" && ac_cv_prog_HAVE_OCTAVE="no" +fi +fi +HAVE_OCTAVE=$ac_cv_prog_HAVE_OCTAVE +if test -n "$HAVE_OCTAVE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_OCTAVE" >&5 +$as_echo "$HAVE_OCTAVE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +if test "x$ac_cv_prog_HAVE_OCTAVE" = "xyes" ; then + OCTAVE=$with_octave + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OCTAVE_VERSION in $OCTAVE" >&5 +$as_echo_n "checking for OCTAVE_VERSION in $OCTAVE... " >&6; } +OCTAVE_VERSION=`TERM=;$OCTAVE -qfH --eval "disp(OCTAVE_VERSION)"` +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCTAVE_VERSION" >&5 +$as_echo "$OCTAVE_VERSION" >&6; } + + + fi + + + + + + + + + +# Check whether --with-mkoctfile was given. +if test "${with_mkoctfile+set}" = set; then : + withval=$with_mkoctfile; with_mkoctfile=$withval +fi + + +test -z "$with_mkoctfile" && with_mkoctfile=mkoctfile + +# Extract the first word of "$with_mkoctfile", so it can be a program name with args. +set dummy $with_mkoctfile; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_HAVE_MKOCTFILE+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$HAVE_MKOCTFILE"; then + ac_cv_prog_HAVE_MKOCTFILE="$HAVE_MKOCTFILE" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_HAVE_MKOCTFILE="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_HAVE_MKOCTFILE" && ac_cv_prog_HAVE_MKOCTFILE="no" +fi +fi +HAVE_MKOCTFILE=$ac_cv_prog_HAVE_MKOCTFILE +if test -n "$HAVE_MKOCTFILE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_MKOCTFILE" >&5 +$as_echo "$HAVE_MKOCTFILE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +if test "x$ac_cv_prog_HAVE_MKOCTFILE" = "xyes" ; then + MKOCTFILE=$with_mkoctfile + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for version of $MKOCTFILE" >&5 +$as_echo_n "checking for version of $MKOCTFILE... " >&6; } + MKOCTFILE_VERSION=`$with_mkoctfile --version 2>&1 | sed 's/mkoctfile, version //g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKOCTFILE_VERSION" >&5 +$as_echo "$MKOCTFILE_VERSION" >&6; } + fi + + + + + + + + +# Check whether --with-octave-config was given. +if test "${with_octave_config+set}" = set; then : + withval=$with_octave_config; with_octave_config=$withval +fi + + +test -z "$with_octave_config" && with_octave_config=octave-config + +# Extract the first word of "$with_octave_config", so it can be a program name with args. +set dummy $with_octave_config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_HAVE_OCTAVE_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$HAVE_OCTAVE_CONFIG"; then + ac_cv_prog_HAVE_OCTAVE_CONFIG="$HAVE_OCTAVE_CONFIG" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_HAVE_OCTAVE_CONFIG="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_HAVE_OCTAVE_CONFIG" && ac_cv_prog_HAVE_OCTAVE_CONFIG="no" +fi +fi +HAVE_OCTAVE_CONFIG=$ac_cv_prog_HAVE_OCTAVE_CONFIG +if test -n "$HAVE_OCTAVE_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_OCTAVE_CONFIG" >&5 +$as_echo "$HAVE_OCTAVE_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +if test "x$ac_cv_prog_HAVE_OCTAVE_CONFIG" = "xyes" ; then + OCTAVE_CONFIG=$with_octave_config + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for version of $OCTAVE_CONFIG" >&5 +$as_echo_n "checking for version of $OCTAVE_CONFIG... " >&6; } + OCTAVE_CONFIG_VERSION=`$OCTAVE_CONFIG --version` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCTAVE_CONFIG_VERSION" >&5 +$as_echo "$OCTAVE_CONFIG_VERSION" >&6; } + fi + + + + + + +prog_concat="$ac_cv_prog_HAVE_OCTAVE$ac_cv_prog_HAVE_OCTAVE_CONFIG$ac_cv_prog_HAVE_MKOCTFILE" + +if test "x$prog_concat" = "xyesyesyes" ; then + if test "x$OCTAVE_VERSION" != "x$MKOCTFILE_VERSION" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ** Mismatch between versions of octave and mkoctfile. **" >&5 +$as_echo "$as_me: WARNING: ** Mismatch between versions of octave and mkoctfile. **" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ** Octave libsndfile modules will not be built. **" >&5 +$as_echo "$as_me: WARNING: ** Octave libsndfile modules will not be built. **" >&2;} + elif test "x$OCTAVE_VERSION" != "x$OCTAVE_CONFIG_VERSION" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ** Mismatch between versions of octave and octave-config. **" >&5 +$as_echo "$as_me: WARNING: ** Mismatch between versions of octave and octave-config. **" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ** Octave libsndfile modules will not be built. **" >&5 +$as_echo "$as_me: WARNING: ** Octave libsndfile modules will not be built. **" >&2;} + else + case "$MKOCTFILE_VERSION" in + 2.*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Octave version 2.X is not supported." >&5 +$as_echo "$as_me: WARNING: Octave version 2.X is not supported." >&2;} + ;; + 3.*) + OCTAVE_DEST_ODIR=`$OCTAVE_CONFIG --oct-site-dir | sed 's%^/usr%${prefix}%'` + OCTAVE_DEST_MDIR=`$OCTAVE_CONFIG --m-site-dir | sed 's%^/usr%${prefix}%'` + + OCTAVE_BUILD=yes + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Octave version $MKOCTFILE_VERSION is not supported." >&5 +$as_echo "$as_me: WARNING: Octave version $MKOCTFILE_VERSION is not supported." >&2;} + ;; + esac + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: building octave libsndfile module... $OCTAVE_BUILD" >&5 +$as_echo "building octave libsndfile module... $OCTAVE_BUILD" >&6; } + fi + + + + + + + if test "x$OCTAVE_BUILD" = xyes; then + BUILD_OCTAVE_MOD_TRUE= + BUILD_OCTAVE_MOD_FALSE='#' +else + BUILD_OCTAVE_MOD_TRUE='#' + BUILD_OCTAVE_MOD_FALSE= +fi + + + + +fi + +else + + if false; then + BUILD_OCTAVE_MOD_TRUE= + BUILD_OCTAVE_MOD_FALSE='#' +else + BUILD_OCTAVE_MOD_TRUE='#' + BUILD_OCTAVE_MOD_FALSE= +fi + + +fi + + +HAVE_EXTERNAL_XIPH_LIBS=0 +EXTERNAL_XIPH_CFLAGS="" +EXTERNAL_XIPH_LIBS="" +EXTERNAL_XIPH_REQUIRE="" + + + + + + + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi +fi + + + + + +# Check whether --with-pkgconfigdir was given. +if test "${with_pkgconfigdir+set}" = set; then : + withval=$with_pkgconfigdir; +else + with_pkgconfigdir='${libdir}/pkgconfig' +fi + +pkgconfigdir=$with_pkgconfigdir + + + + + +if test -n "$PKG_CONFIG"; then : + + if test "x$enable_external_libs" = "xno"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** External libs (FLAC, Ogg, Vorbis) disabled. ***" >&5 +$as_echo "$as_me: WARNING: *** External libs (FLAC, Ogg, Vorbis) disabled. ***" >&2;} + +else + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for flac >= 1.3.1 " >&5 +$as_echo_n "checking for flac >= 1.3.1 ... " >&6; } + +if test -n "$FLAC_CFLAGS"; then + pkg_cv_FLAC_CFLAGS="$FLAC_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"flac >= 1.3.1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "flac >= 1.3.1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FLAC_CFLAGS=`$PKG_CONFIG --cflags "flac >= 1.3.1" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$FLAC_LIBS"; then + pkg_cv_FLAC_LIBS="$FLAC_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"flac >= 1.3.1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "flac >= 1.3.1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FLAC_LIBS=`$PKG_CONFIG --libs "flac >= 1.3.1" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + +pkg_link_saved_CFLAGS=$CFLAGS +pkg_link_saved_LIBS=$LIBS + +eval "pkg_CFLAGS=\${pkg_cv_FLAC_CFLAGS}" +eval "pkg_LIBS=\${pkg_cv_FLAC_LIBS}" + +CFLAGS="$CFLAGS $pkg_CFLAGS" +LIBS="$LIBS $pkg_LIBS" + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +puts ("") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pkg_link=yes +else + pkg_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +CFLAGS=$pkg_link_saved_CFLAGS +LIBS=$pkg_link_saved_LIBS + +if test $pkg_link = no ; then + $as_echo_n "link failed ... " + pkg_failed=yes + fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + FLAC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "flac >= 1.3.1"` + else + FLAC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "flac >= 1.3.1"` + fi + # Put the nasty error message in config.log where it belongs + echo "$FLAC_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ac_cv_flac=no +elif test $pkg_failed = untried; then + ac_cv_flac=no +else + FLAC_CFLAGS=$pkg_cv_FLAC_CFLAGS + FLAC_LIBS=$pkg_cv_FLAC_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cv_flac=yes +fi + + FLAC_CFLAGS=`echo $FLAC_CFLAGS | $SED "s|include/FLAC|include|"` + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ogg >= 1.3.0 " >&5 +$as_echo_n "checking for ogg >= 1.3.0 ... " >&6; } + +if test -n "$OGG_CFLAGS"; then + pkg_cv_OGG_CFLAGS="$OGG_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ogg >= 1.3.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "ogg >= 1.3.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_OGG_CFLAGS=`$PKG_CONFIG --cflags "ogg >= 1.3.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$OGG_LIBS"; then + pkg_cv_OGG_LIBS="$OGG_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ogg >= 1.3.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "ogg >= 1.3.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_OGG_LIBS=`$PKG_CONFIG --libs "ogg >= 1.3.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + +pkg_link_saved_CFLAGS=$CFLAGS +pkg_link_saved_LIBS=$LIBS + +eval "pkg_CFLAGS=\${pkg_cv_OGG_CFLAGS}" +eval "pkg_LIBS=\${pkg_cv_OGG_LIBS}" + +CFLAGS="$CFLAGS $pkg_CFLAGS" +LIBS="$LIBS $pkg_LIBS" + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +puts ("") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pkg_link=yes +else + pkg_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +CFLAGS=$pkg_link_saved_CFLAGS +LIBS=$pkg_link_saved_LIBS + +if test $pkg_link = no ; then + $as_echo_n "link failed ... " + pkg_failed=yes + fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + OGG_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "ogg >= 1.3.0"` + else + OGG_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "ogg >= 1.3.0"` + fi + # Put the nasty error message in config.log where it belongs + echo "$OGG_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ac_cv_ogg=no +elif test $pkg_failed = untried; then + ac_cv_ogg=no +else + OGG_CFLAGS=$pkg_cv_OGG_CFLAGS + OGG_LIBS=$pkg_cv_OGG_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cv_ogg=yes +fi + + if test "x$enable_experimental" = "xyes"; then : + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for speex >= 1.2 " >&5 +$as_echo_n "checking for speex >= 1.2 ... " >&6; } + +if test -n "$SPEEX_CFLAGS"; then + pkg_cv_SPEEX_CFLAGS="$SPEEX_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"speex >= 1.2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "speex >= 1.2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SPEEX_CFLAGS=`$PKG_CONFIG --cflags "speex >= 1.2" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$SPEEX_LIBS"; then + pkg_cv_SPEEX_LIBS="$SPEEX_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"speex >= 1.2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "speex >= 1.2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SPEEX_LIBS=`$PKG_CONFIG --libs "speex >= 1.2" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + +pkg_link_saved_CFLAGS=$CFLAGS +pkg_link_saved_LIBS=$LIBS + +eval "pkg_CFLAGS=\${pkg_cv_SPEEX_CFLAGS}" +eval "pkg_LIBS=\${pkg_cv_SPEEX_LIBS}" + +CFLAGS="$CFLAGS $pkg_CFLAGS" +LIBS="$LIBS $pkg_LIBS" + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +puts ("") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pkg_link=yes +else + pkg_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +CFLAGS=$pkg_link_saved_CFLAGS +LIBS=$pkg_link_saved_LIBS + +if test $pkg_link = no ; then + $as_echo_n "link failed ... " + pkg_failed=yes + fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + SPEEX_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "speex >= 1.2"` + else + SPEEX_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "speex >= 1.2"` + fi + # Put the nasty error message in config.log where it belongs + echo "$SPEEX_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ac_cv_speex=no +elif test $pkg_failed = untried; then + ac_cv_speex=no +else + SPEEX_CFLAGS=$pkg_cv_SPEEX_CFLAGS + SPEEX_LIBS=$pkg_cv_SPEEX_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cv_speex=yes +fi + +else + + SPEEX_CFLAGS="" + SPEEX_LIBS="" + +fi + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for vorbis >= 1.2.3 " >&5 +$as_echo_n "checking for vorbis >= 1.2.3 ... " >&6; } + +if test -n "$VORBIS_CFLAGS"; then + pkg_cv_VORBIS_CFLAGS="$VORBIS_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"vorbis >= 1.2.3\""; } >&5 + ($PKG_CONFIG --exists --print-errors "vorbis >= 1.2.3") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_VORBIS_CFLAGS=`$PKG_CONFIG --cflags "vorbis >= 1.2.3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$VORBIS_LIBS"; then + pkg_cv_VORBIS_LIBS="$VORBIS_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"vorbis >= 1.2.3\""; } >&5 + ($PKG_CONFIG --exists --print-errors "vorbis >= 1.2.3") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_VORBIS_LIBS=`$PKG_CONFIG --libs "vorbis >= 1.2.3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + +pkg_link_saved_CFLAGS=$CFLAGS +pkg_link_saved_LIBS=$LIBS + +eval "pkg_CFLAGS=\${pkg_cv_VORBIS_CFLAGS}" +eval "pkg_LIBS=\${pkg_cv_VORBIS_LIBS}" + +CFLAGS="$CFLAGS $pkg_CFLAGS" +LIBS="$LIBS $pkg_LIBS" + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +puts ("") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pkg_link=yes +else + pkg_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +CFLAGS=$pkg_link_saved_CFLAGS +LIBS=$pkg_link_saved_LIBS + +if test $pkg_link = no ; then + $as_echo_n "link failed ... " + pkg_failed=yes + fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + VORBIS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "vorbis >= 1.2.3"` + else + VORBIS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "vorbis >= 1.2.3"` + fi + # Put the nasty error message in config.log where it belongs + echo "$VORBIS_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ac_cv_vorbis=no +elif test $pkg_failed = untried; then + ac_cv_vorbis=no +else + VORBIS_CFLAGS=$pkg_cv_VORBIS_CFLAGS + VORBIS_LIBS=$pkg_cv_VORBIS_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cv_vorbis=yes +fi + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for vorbisenc >= 1.2.3 " >&5 +$as_echo_n "checking for vorbisenc >= 1.2.3 ... " >&6; } + +if test -n "$VORBISENC_CFLAGS"; then + pkg_cv_VORBISENC_CFLAGS="$VORBISENC_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"vorbisenc >= 1.2.3\""; } >&5 + ($PKG_CONFIG --exists --print-errors "vorbisenc >= 1.2.3") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_VORBISENC_CFLAGS=`$PKG_CONFIG --cflags "vorbisenc >= 1.2.3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$VORBISENC_LIBS"; then + pkg_cv_VORBISENC_LIBS="$VORBISENC_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"vorbisenc >= 1.2.3\""; } >&5 + ($PKG_CONFIG --exists --print-errors "vorbisenc >= 1.2.3") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_VORBISENC_LIBS=`$PKG_CONFIG --libs "vorbisenc >= 1.2.3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + +pkg_link_saved_CFLAGS=$CFLAGS +pkg_link_saved_LIBS=$LIBS + +eval "pkg_CFLAGS=\${pkg_cv_VORBISENC_CFLAGS}" +eval "pkg_LIBS=\${pkg_cv_VORBISENC_LIBS}" + +CFLAGS="$CFLAGS $pkg_CFLAGS" +LIBS="$LIBS $pkg_LIBS" + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +puts ("") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pkg_link=yes +else + pkg_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +CFLAGS=$pkg_link_saved_CFLAGS +LIBS=$pkg_link_saved_LIBS + +if test $pkg_link = no ; then + $as_echo_n "link failed ... " + pkg_failed=yes + fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + VORBISENC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "vorbisenc >= 1.2.3"` + else + VORBISENC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "vorbisenc >= 1.2.3"` + fi + # Put the nasty error message in config.log where it belongs + echo "$VORBISENC_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ac_cv_vorbisenc=no +elif test $pkg_failed = untried; then + ac_cv_vorbisenc=no +else + VORBISENC_CFLAGS=$pkg_cv_VORBISENC_CFLAGS + VORBISENC_LIBS=$pkg_cv_VORBISENC_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cv_vorbisenc=yes +fi + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for opus >= 1.1 " >&5 +$as_echo_n "checking for opus >= 1.1 ... " >&6; } + +if test -n "$OPUS_CFLAGS"; then + pkg_cv_OPUS_CFLAGS="$OPUS_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"opus >= 1.1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "opus >= 1.1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_OPUS_CFLAGS=`$PKG_CONFIG --cflags "opus >= 1.1" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$OPUS_LIBS"; then + pkg_cv_OPUS_LIBS="$OPUS_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"opus >= 1.1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "opus >= 1.1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_OPUS_LIBS=`$PKG_CONFIG --libs "opus >= 1.1" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + +pkg_link_saved_CFLAGS=$CFLAGS +pkg_link_saved_LIBS=$LIBS + +eval "pkg_CFLAGS=\${pkg_cv_OPUS_CFLAGS}" +eval "pkg_LIBS=\${pkg_cv_OPUS_LIBS}" + +CFLAGS="$CFLAGS $pkg_CFLAGS" +LIBS="$LIBS $pkg_LIBS" + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +puts ("") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pkg_link=yes +else + pkg_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +CFLAGS=$pkg_link_saved_CFLAGS +LIBS=$pkg_link_saved_LIBS + +if test $pkg_link = no ; then + $as_echo_n "link failed ... " + pkg_failed=yes + fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + OPUS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "opus >= 1.1"` + else + OPUS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "opus >= 1.1"` + fi + # Put the nasty error message in config.log where it belongs + echo "$OPUS_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ac_cv_opus=no +elif test $pkg_failed = untried; then + ac_cv_opus=no +else + OPUS_CFLAGS=$pkg_cv_OPUS_CFLAGS + OPUS_LIBS=$pkg_cv_OPUS_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cv_opus=yes +fi + enable_external_libs=yes + +fi + + if test "x$ac_cv_flac$ac_cv_ogg$ac_cv_vorbis$ac_cv_vorbisenc$ac_cv_opus" = "xyesyesyesyesyes"; then : + + HAVE_EXTERNAL_XIPH_LIBS=1 + enable_external_libs=yes + + EXTERNAL_XIPH_CFLAGS="$FLAC_CFLAGS $VORBIS_CFLAGS $VORBISENC_CFLAGS $SPEEX_CFLAGS $OPUS_CFLAGS $OGG_CFLAGS " + EXTERNAL_XIPH_LIBS="$FLAC_LIBS $VORBIS_LIBS $VORBISENC_LIBS $SPEEX_LIBS $OPUS_LIBS $OGG_LIBS " + EXTERNAL_XIPH_REQUIRE="flac ogg vorbis vorbisenc opus" + + if test x$ac_cv_speex = "xyes" ; then + EXTERNAL_XIPH_REQUIRE="$EXTERNAL_XIPH_REQUIRE speex" + fi + +else + + $as_echo "" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** One or more of the external libraries (ie libflac, libogg and" >&5 +$as_echo "$as_me: WARNING: *** One or more of the external libraries (ie libflac, libogg and" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** libvorbis) is either missing (possibly only the development" >&5 +$as_echo "$as_me: WARNING: *** libvorbis) is either missing (possibly only the development" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** headers) or is of an unsupported version." >&5 +$as_echo "$as_me: WARNING: *** headers) or is of an unsupported version." >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ***" >&5 +$as_echo "$as_me: WARNING: ***" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** Unfortunately, for ease of maintenance, the external libs" >&5 +$as_echo "$as_me: WARNING: *** Unfortunately, for ease of maintenance, the external libs" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** are an all or nothing affair." >&5 +$as_echo "$as_me: WARNING: *** are an all or nothing affair." >&2;} + $as_echo "" + enable_external_libs=no + +fi + +fi + + +cat >>confdefs.h <<_ACEOF +#define HAVE_EXTERNAL_XIPH_LIBS $HAVE_EXTERNAL_XIPH_LIBS +_ACEOF + + + +ac_cv_sqlite3=0 +if test "x$enable_sqlite" != "xno"; then : + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqlite3 >= 3.2 " >&5 +$as_echo_n "checking for sqlite3 >= 3.2 ... " >&6; } + +if test -n "$SQLITE3_CFLAGS"; then + pkg_cv_SQLITE3_CFLAGS="$SQLITE3_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sqlite3 >= 3.2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "sqlite3 >= 3.2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SQLITE3_CFLAGS=`$PKG_CONFIG --cflags "sqlite3 >= 3.2" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$SQLITE3_LIBS"; then + pkg_cv_SQLITE3_LIBS="$SQLITE3_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sqlite3 >= 3.2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "sqlite3 >= 3.2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SQLITE3_LIBS=`$PKG_CONFIG --libs "sqlite3 >= 3.2" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + +pkg_link_saved_CFLAGS=$CFLAGS +pkg_link_saved_LIBS=$LIBS + +eval "pkg_CFLAGS=\${pkg_cv_SQLITE3_CFLAGS}" +eval "pkg_LIBS=\${pkg_cv_SQLITE3_LIBS}" + +CFLAGS="$CFLAGS $pkg_CFLAGS" +LIBS="$LIBS $pkg_LIBS" + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +puts ("") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pkg_link=yes +else + pkg_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +CFLAGS=$pkg_link_saved_CFLAGS +LIBS=$pkg_link_saved_LIBS + +if test $pkg_link = no ; then + $as_echo_n "link failed ... " + pkg_failed=yes + fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + SQLITE3_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "sqlite3 >= 3.2"` + else + SQLITE3_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "sqlite3 >= 3.2"` + fi + # Put the nasty error message in config.log where it belongs + echo "$SQLITE3_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ac_cv_sqlite3=0 +elif test $pkg_failed = untried; then + ac_cv_sqlite3=0 +else + SQLITE3_CFLAGS=$pkg_cv_SQLITE3_CFLAGS + SQLITE3_LIBS=$pkg_cv_SQLITE3_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ac_cv_sqlite3=1 +fi + +fi + + +cat >>confdefs.h <<_ACEOF +#define HAVE_SQLITE3 ${ac_cv_sqlite3} +_ACEOF + + if test "x$ac_cv_sqlite3" = "x1"; then + HAVE_SQLITE3_TRUE= + HAVE_SQLITE3_FALSE='#' +else + HAVE_SQLITE3_TRUE='#' + HAVE_SQLITE3_FALSE= +fi + + + +if test "x$enable_cpu_clip" != "xno"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking processor clipping capabilities" >&5 +$as_echo_n "checking processor clipping capabilities... " >&6; } +if ${ac_cv_c_clip_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Initialize to unknown +ac_cv_c_clip_positive=unknown +ac_cv_c_clip_negative=unknown + + +if test $ac_cv_c_clip_positive = unknown ; then + if test "$cross_compiling" = yes; then : + ac_cv_c_clip_positive=unknown + +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #define _ISOC9X_SOURCE 1 + #define _ISOC99_SOURCE 1 + #define __USE_ISOC99 1 + #define __USE_ISOC9X 1 + #include + int main (void) + { double fval ; + int k, ival ; + + fval = 1.0 * 0x7FFFFFFF ; + for (k = 0 ; k < 100 ; k++) + { ival = (lrint (fval)) >> 24 ; + if (ival != 127) + return 1 ; + + fval *= 1.2499999 ; + } ; + + return 0 ; + } + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_clip_positive=yes +else + ac_cv_c_clip_positive=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + + if test "$cross_compiling" = yes; then : + ac_cv_c_clip_negative=unknown + +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #define _ISOC9X_SOURCE 1 + #define _ISOC99_SOURCE 1 + #define __USE_ISOC99 1 + #define __USE_ISOC9X 1 + #include + int main (void) + { double fval ; + int k, ival ; + + fval = -8.0 * 0x10000000 ; + for (k = 0 ; k < 100 ; k++) + { ival = (lrint (fval)) >> 24 ; + if (ival != -128) + return 1 ; + + fval *= 1.2499999 ; + } ; + + return 0 ; + } + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_clip_negative=yes +else + ac_cv_c_clip_negative=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi + +if test $ac_cv_c_clip_positive = yes ; then + ac_cv_c_clip_positive=1 +else + ac_cv_c_clip_positive=0 + fi + +if test $ac_cv_c_clip_negative = yes ; then + ac_cv_c_clip_negative=1 +else + ac_cv_c_clip_negative=0 + fi + + +case "$ac_cv_c_clip_positive$ac_cv_c_clip_negative" in + "00") + ac_cv_c_clip_type="none" + ;; + "10") + ac_cv_c_clip_type="positive" + ;; + "01") + ac_cv_c_clip_type="negative" + ;; + "11") + ac_cv_c_clip_type="both" + ;; + esac + + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_clip_type" >&5 +$as_echo "$ac_cv_c_clip_type" >&6; } + + + + +else + + $as_echo "checking processor clipping capabilities... disabled" + ac_cv_c_clip_positive=0 + ac_cv_c_clip_negative=0 + +fi + + +cat >>confdefs.h <<_ACEOF +#define CPU_CLIPS_POSITIVE ${ac_cv_c_clip_positive} +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define CPU_CLIPS_NEGATIVE ${ac_cv_c_clip_negative} +_ACEOF + + + +OS_SPECIFIC_CFLAGS="" +OS_SPECIFIC_LINKS="" +os_is_win32=0 +os_is_openbsd=0 +use_windows_api=0 +case $host_os in #( + darwin* | rhapsody*) : + + if test "x$HAVE_XCODE_SELECT" = "xyes"; then : + + developer_path=`xcode-select --print-path` + +else + + developer_path="/Developer" + +fi + OS_SPECIFIC_LINKS="-framework CoreAudio -framework AudioToolbox -framework CoreFoundation" ;; #( + mingw*) : + + os_is_win32=1 + use_windows_api=1 + OS_SPECIFIC_LINKS="-lwinmm" ;; #( + openbsd*) : + + os_is_openbsd=1 + ;; #( + *) : + ;; +esac + + +cat >>confdefs.h <<_ACEOF +#define OS_IS_WIN32 ${os_is_win32} +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define OS_IS_OPENBSD ${os_is_openbsd} +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define USE_WINDOWS_API ${use_windows_api} +_ACEOF + + if test ${use_windows_api} -eq 1; then + USE_WIN_VERSION_FILE_TRUE= + USE_WIN_VERSION_FILE_FALSE='#' +else + USE_WIN_VERSION_FILE_TRUE='#' + USE_WIN_VERSION_FILE_FALSE= +fi + + + +if test "x$enable_alsa" != "xno"; then : + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ALSA" >&5 +$as_echo_n "checking for ALSA... " >&6; } + +if test -n "$ALSA_CFLAGS"; then + pkg_cv_ALSA_CFLAGS="$ALSA_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"alsa\""; } >&5 + ($PKG_CONFIG --exists --print-errors "alsa") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_ALSA_CFLAGS=`$PKG_CONFIG --cflags "alsa" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$ALSA_LIBS"; then + pkg_cv_ALSA_LIBS="$ALSA_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"alsa\""; } >&5 + ($PKG_CONFIG --exists --print-errors "alsa") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_ALSA_LIBS=`$PKG_CONFIG --libs "alsa" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + ALSA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "alsa" 2>&1` + else + ALSA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "alsa" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$ALSA_PKG_ERRORS" >&5 + + + alsa_works="no" + +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + alsa_works="no" + +else + ALSA_CFLAGS=$pkg_cv_ALSA_CFLAGS + ALSA_LIBS=$pkg_cv_ALSA_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + save_CFLAGS="${CFLAGS}" + save_LIBS="${LIBS}" + CFLAGS="${CFLAGS} ${ALSA_CFLAGS}" + LIBS="${LIBS} ${ALSA_LIBS}" + for ac_header in alsa/asoundlib.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "alsa/asoundlib.h" "ac_cv_header_alsa_asoundlib_h" "$ac_includes_default" +if test "x$ac_cv_header_alsa_asoundlib_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ALSA_ASOUNDLIB_H 1 +_ACEOF + +fi + +done + + if test "x$ac_cv_header_alsa_asoundlib_h" = "xyes"; then : + + +$as_echo "#define HAVE_ALSA 1" >>confdefs.h + + alsa_works="yes" + +else + + alsa_works="no" + + ALSA_CFLAGS="" + ALSA_LIBS="" + +fi + CFLAGS="${save_CFLAGS}" + LIBS="${save_LIBS}" + +fi + + if test "x$alsa_works" = "xno"; then : + + if test "x$enable_alsa" = "xyes"; then : + + as_fn_error $? "You explicitly requested alsa support, but alsa could not be found!" "$LINENO" 5 + +else + + enable_alsa="no (auto)" + +fi + +fi + +fi + + +SNDIO_LIBS="" +HAVE_SNDIO_H=0 +case $host_os in #( + openbsd*) : + + for ac_header in sndio.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sndio.h" "ac_cv_header_sndio_h" "$ac_includes_default" +if test "x$ac_cv_header_sndio_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SNDIO_H 1 +_ACEOF + +fi + +done + + if test "x$ac_cv_header_sndio_h" = "xyes"; then : + + SNDIO_LIBS="-lsndio" + HAVE_SNDIO_H=1 + +fi + ;; #( + *) : + ;; +esac + + +cat >>confdefs.h <<_ACEOF +#define HAVE_SNDIO_H ${HAVE_SNDIO_H} +_ACEOF + + + +if test "x$ac_cv_sizeof_short" != "x2"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ******************************************************************" >&5 +$as_echo "$as_me: WARNING: ******************************************************************" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** sizeof (short) != 2. " >&5 +$as_echo "$as_me: WARNING: *** sizeof (short) != 2. " >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ******************************************************************" >&5 +$as_echo "$as_me: WARNING: ******************************************************************" >&2;} + +fi + +if test "x$ac_cv_sizeof_int" != "x4"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ******************************************************************" >&5 +$as_echo "$as_me: WARNING: ******************************************************************" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** sizeof (int) != 4 " >&5 +$as_echo "$as_me: WARNING: *** sizeof (int) != 4 " >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ******************************************************************" >&5 +$as_echo "$as_me: WARNING: ******************************************************************" >&2;} + +fi + +if test "x$ac_cv_sizeof_float" != "x4"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ******************************************************************" >&5 +$as_echo "$as_me: WARNING: ******************************************************************" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** sizeof (float) != 4. " >&5 +$as_echo "$as_me: WARNING: *** sizeof (float) != 4. " >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ******************************************************************" >&5 +$as_echo "$as_me: WARNING: ******************************************************************" >&2;} + +fi + +if test "x$ac_cv_sizeof_double" != "x8"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ******************************************************************" >&5 +$as_echo "$as_me: WARNING: ******************************************************************" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** sizeof (double) != 8. " >&5 +$as_echo "$as_me: WARNING: *** sizeof (double) != 8. " >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ******************************************************************" >&5 +$as_echo "$as_me: WARNING: ******************************************************************" >&2;} + +fi + +if test "x$ac_cv_prog_HAVE_AUTOGEN" = "xno"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Touching files in directory tests/." >&5 +$as_echo "$as_me: WARNING: Touching files in directory tests/." >&2;} + touch tests/*.c tests/*.h + +fi + + +if test "x$enable_bow_docs" = "xyes"; then : + + HTML_BGCOLOUR="white" + HTML_FGCOLOUR="black" + +else + + HTML_BGCOLOUR="black" + HTML_FGCOLOUR="white" + +fi + + +win32_target_dll=0 +COMPILER_IS_GCC=0 + +if test "x$enable_flags_setting" = "xyes"; then : + + + + + +for flag in -O2 -pipe; do + as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 +$as_echo_n "checking whether C compiler accepts $flag... " >&6; } +if eval \${$as_CACHEVAR+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS $flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$as_CACHEVAR=yes" +else + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +eval ac_res=\$$as_CACHEVAR + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then : + +if ${CFLAGS+:} false; then : + + case " $CFLAGS " in #( + *" $flag "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$flag"; } >&5 + (: CFLAGS already contains $flag) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CFLAGS " $flag" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 + (: CFLAGS="$CFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CFLAGS=$flag + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 + (: CFLAGS="$CFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + +else + : +fi + +done + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + + + +for flag in -O2 -pipe; do + as_CACHEVAR=`$as_echo "ax_cv_check_cxxflags__$flag" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $flag" >&5 +$as_echo_n "checking whether C++ compiler accepts $flag... " >&6; } +if eval \${$as_CACHEVAR+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + eval "$as_CACHEVAR=yes" +else + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CXXFLAGS=$ax_check_save_flags +fi +eval ac_res=\$$as_CACHEVAR + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then : + +if ${CXXFLAGS+:} false; then : + + case " $CXXFLAGS " in #( + *" $flag "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CXXFLAGS already contains \$flag"; } >&5 + (: CXXFLAGS already contains $flag) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CXXFLAGS " $flag" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CXXFLAGS=\"\$CXXFLAGS\""; } >&5 + (: CXXFLAGS="$CXXFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CXXFLAGS=$flag + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CXXFLAGS=\"\$CXXFLAGS\""; } >&5 + (: CXXFLAGS="$CXXFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + +else + : +fi + +done + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + case ${host_os} in #( + darwin*) : + + ldflags_test="-Wl,-dead_strip_dylibs" ;; #( + linux*) : + + ldflags_test="-Wl,-O1 -Wl,--as-needed -Wl,--no-undefined -Wl,--gc-sections" + ;; #( + *) : + ;; +esac + + + + +for flag in ${ldflags_test}; do + as_CACHEVAR=`$as_echo "ax_cv_check_ldflags__$flag" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the linker accepts $flag" >&5 +$as_echo_n "checking whether the linker accepts $flag... " >&6; } +if eval \${$as_CACHEVAR+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$LDFLAGS + LDFLAGS="$LDFLAGS $flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_CACHEVAR=yes" +else + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$ax_check_save_flags +fi +eval ac_res=\$$as_CACHEVAR + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then : + +if ${LDFLAGS+:} false; then : + + case " $LDFLAGS " in #( + *" $flag "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS already contains \$flag"; } >&5 + (: LDFLAGS already contains $flag) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append LDFLAGS " $flag" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS=\"\$LDFLAGS\""; } >&5 + (: LDFLAGS="$LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + LDFLAGS=$flag + { { $as_echo "$as_me:${as_lineno-$LINENO}: : LDFLAGS=\"\$LDFLAGS\""; } >&5 + (: LDFLAGS="$LDFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + +else + : +fi + +done + + +fi + +if test "x$enable_werror" = "xyes"; then : + + + + + +for flag in -Werror; do + as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 +$as_echo_n "checking whether C compiler accepts $flag... " >&6; } +if eval \${$as_CACHEVAR+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS $flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$as_CACHEVAR=yes" +else + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +eval ac_res=\$$as_CACHEVAR + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then : + +if ${CFLAGS+:} false; then : + + case " $CFLAGS " in #( + *" $flag "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$flag"; } >&5 + (: CFLAGS already contains $flag) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CFLAGS " $flag" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 + (: CFLAGS="$CFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CFLAGS=$flag + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 + (: CFLAGS="$CFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + +else + : +fi + +done + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + + + +for flag in -Werror; do + as_CACHEVAR=`$as_echo "ax_cv_check_cxxflags__$flag" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $flag" >&5 +$as_echo_n "checking whether C++ compiler accepts $flag... " >&6; } +if eval \${$as_CACHEVAR+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + eval "$as_CACHEVAR=yes" +else + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CXXFLAGS=$ax_check_save_flags +fi +eval ac_res=\$$as_CACHEVAR + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then : + +if ${CXXFLAGS+:} false; then : + + case " $CXXFLAGS " in #( + *" $flag "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CXXFLAGS already contains \$flag"; } >&5 + (: CXXFLAGS already contains $flag) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CXXFLAGS " $flag" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CXXFLAGS=\"\$CXXFLAGS\""; } >&5 + (: CXXFLAGS="$CXXFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CXXFLAGS=$flag + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CXXFLAGS=\"\$CXXFLAGS\""; } >&5 + (: CXXFLAGS="$CXXFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + +else + : +fi + +done + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi + +common_flags="-Wall -Wextra -Wpointer-arith -Wcast-align -Wcast-qual -Wshadow -Wwrite-strings -Wundef -Wuninitialized -Winit-self -Wno-format-truncation" + + + + +for flag in ${common_flags} -Wvla -Wbad-function-cast -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Waggregate-return; do + as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 +$as_echo_n "checking whether C compiler accepts $flag... " >&6; } +if eval \${$as_CACHEVAR+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS $flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$as_CACHEVAR=yes" +else + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +eval ac_res=\$$as_CACHEVAR + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then : + +if ${CFLAGS+:} false; then : + + case " $CFLAGS " in #( + *" $flag "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$flag"; } >&5 + (: CFLAGS already contains $flag) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CFLAGS " $flag" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 + (: CFLAGS="$CFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CFLAGS=$flag + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 + (: CFLAGS="$CFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + +else + : +fi + +done + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + + + +for flag in ${common_flags} -Wctor-dtor-privacy -Wnon-virtual-dtor -Woverloaded-virtual -Wreorder -Wsign-promo; do + as_CACHEVAR=`$as_echo "ax_cv_check_cxxflags__$flag" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $flag" >&5 +$as_echo_n "checking whether C++ compiler accepts $flag... " >&6; } +if eval \${$as_CACHEVAR+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + eval "$as_CACHEVAR=yes" +else + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CXXFLAGS=$ax_check_save_flags +fi +eval ac_res=\$$as_CACHEVAR + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then : + +if ${CXXFLAGS+:} false; then : + + case " $CXXFLAGS " in #( + *" $flag "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CXXFLAGS already contains \$flag"; } >&5 + (: CXXFLAGS already contains $flag) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CXXFLAGS " $flag" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CXXFLAGS=\"\$CXXFLAGS\""; } >&5 + (: CXXFLAGS="$CXXFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CXXFLAGS=$flag + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CXXFLAGS=\"\$CXXFLAGS\""; } >&5 + (: CXXFLAGS="$CXXFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + +else + : +fi + +done + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +if test "x$enable_stack_smash_protection" = "xyes"; then : + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports stack smash protection" >&5 +$as_echo_n "checking if $CC supports stack smash protection... " >&6; } + xiph_stack_check_old_cflags="$CFLAGS" + SSP_FLAGS="-fstack-protector --param ssp-buffer-size=4" + CFLAGS=$SSP_FLAGS + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main () +{ +puts("Hello, World!"); return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + CFLAGS="$xiph_stack_check_old_cflags $SSP_FLAGS" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + CFLAGS="$xiph_stack_check_old_cflags" + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX supports stack smash protection" >&5 +$as_echo_n "checking if $CXX supports stack smash protection... " >&6; } + xiph_stack_check_old_cflags="$CFLAGS" + SSP_FLAGS="-fstack-protector --param ssp-buffer-size=4" + CFLAGS=$SSP_FLAGS + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main () +{ +puts("Hello, World!"); return 0; + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + CFLAGS="$xiph_stack_check_old_cflags $SSP_FLAGS" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + CFLAGS="$xiph_stack_check_old_cflags" + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +fi + +if test "x$enable_test_coverage" = "xyes"; then : + + + + + +for flag in -coverage; do + as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 +$as_echo_n "checking whether C compiler accepts $flag... " >&6; } +if eval \${$as_CACHEVAR+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS $flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$as_CACHEVAR=yes" +else + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +eval ac_res=\$$as_CACHEVAR + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then : + +if ${CFLAGS+:} false; then : + + case " $CFLAGS " in #( + *" $flag "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$flag"; } >&5 + (: CFLAGS already contains $flag) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CFLAGS " $flag" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 + (: CFLAGS="$CFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CFLAGS=$flag + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 + (: CFLAGS="$CFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + +else + : +fi + +done + + +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to add -D_FORTIFY_SOURCE=2 to CPPFLAGS" >&5 +$as_echo_n "checking whether to add -D_FORTIFY_SOURCE=2 to CPPFLAGS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + + int main() { + #ifndef _FORTIFY_SOURCE + return 0; + #else + this_is_an_error; + #endif + } + + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + CPPFLAGS="$CPPFLAGS -D_FORTIFY_SOURCE=2" + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + +if test "x$ax_cv_c_compiler_vendor" = "xgnu"; then : + + case $host_os in #( + darwin* | rhapsody*) : + + temp_CFLAGS=`echo $CFLAGS | $SED "s/-Wall -pedantic//" | $SED "s/-Wshadow//" | $SED "s/-Waggregate-return//"` + CFLAGS=$temp_CFLAGS + SHLIB_VERSION_ARG="-Wl,-exported_symbols_list -Wl,\$(top_srcdir)/src/Symbols.darwin" ;; #( + mingw*) : + + SHLIB_VERSION_ARG="-Wc,-static-libgcc -Wl,\$(top_srcdir)/src/libsndfile-1.def" + win32_target_dll=1 + if test "x$enable_shared" = "xno"; then : + + win32_target_dll=0 + +fi + + + + +for flag in -mstackrealign; do + as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 +$as_echo_n "checking whether C compiler accepts $flag... " >&6; } +if eval \${$as_CACHEVAR+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS $flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$as_CACHEVAR=yes" +else + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +eval ac_res=\$$as_CACHEVAR + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then : + +if ${CFLAGS+:} false; then : + + case " $CFLAGS " in #( + *" $flag "*) : + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$flag"; } >&5 + (: CFLAGS already contains $flag) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CFLAGS " $flag" + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 + (: CFLAGS="$CFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else + + CFLAGS=$flag + { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 + (: CFLAGS="$CFLAGS") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + +else + : +fi + +done + + ;; #( + os2*) : + + SHLIB_VERSION_ARG="-Wl,-export-symbols \$(top_srcdir)/src/Symbols.os2" + ;; #( + *) : + ;; +esac + + COMPILER_IS_GCC=1 + +fi + +case $host_os in #( + linux*|kfreebsd*-gnu*|gnu*) : + SHLIB_VERSION_ARG="-Wl,--version-script=\$(top_srcdir)/src/Symbols.gnu-binutils" ;; #( + *) : + ;; +esac + + +cat >>confdefs.h <<_ACEOF +#define WIN32_TARGET_DLL ${win32_target_dll} +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define COMPILER_IS_GCC ${COMPILER_IS_GCC} +_ACEOF + + +CFLAGS="$CFLAGS $OS_SPECIFIC_CFLAGS" + +if test "x$CFLAGS" = "x"; then : + + as_fn_error $? "\"Error in configure script. CFLAGS has been screwed up.\"" "$LINENO" 5 + +fi + +HOST_TRIPLET="${host_cpu}-${host_vendor}-${host_os}" + + +cat >>confdefs.h <<_ACEOF +#define HOST_TRIPLET ${HOST_TRIPLET} +_ACEOF + + +if test "$HOST_TRIPLET" = "x86_64-w64-mingw32"; then : + + OS_SPECIFIC_LINKS=" -static-libgcc $OS_SPECIFIC_LINKS" + +fi + +WIN_RC_VERSION=`echo $PACKAGE_VERSION | $SED -e "s/p.*//" -e "s/\./,/g"` + + +if test "x$enable_static" = "xno"; then : + + SRC_BINDIR=src/.libs/ + TEST_BINDIR=tests/.libs/ + +else + + SRC_BINDIR=src/ + TEST_BINDIR=tests/ + +fi + + + + + + + + + + + + + + + + + + + + + + + + + + +ac_config_files="$ac_config_files Makefile Octave/Makefile src/version-metadata.rc include/sndfile.h tests/test_wrapper.sh tests/pedantic-header-test.sh libsndfile.spec sndfile.pc Scripts/build-test-tarball.mk" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${LINUX_MINGW_CROSS_TEST_TRUE}" && test -z "${LINUX_MINGW_CROSS_TEST_FALSE}"; then + as_fn_error $? "conditional \"LINUX_MINGW_CROSS_TEST\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${FULL_SUITE_TRUE}" && test -z "${FULL_SUITE_FALSE}"; then + as_fn_error $? "conditional \"FULL_SUITE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ENABLE_TEST_COVERAGE_TRUE}" && test -z "${ENABLE_TEST_COVERAGE_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_TEST_COVERAGE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_OSSFUZZERS_TRUE}" && test -z "${USE_OSSFUZZERS_FALSE}"; then + as_fn_error $? "conditional \"USE_OSSFUZZERS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_OSSFUZZ_FLAG_TRUE}" && test -z "${USE_OSSFUZZ_FLAG_FALSE}"; then + as_fn_error $? "conditional \"USE_OSSFUZZ_FLAG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_OSSFUZZ_STATIC_TRUE}" && test -z "${USE_OSSFUZZ_STATIC_FALSE}"; then + as_fn_error $? "conditional \"USE_OSSFUZZ_STATIC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +if test -z "${BUILD_OCTAVE_MOD_TRUE}" && test -z "${BUILD_OCTAVE_MOD_FALSE}"; then + as_fn_error $? "conditional \"BUILD_OCTAVE_MOD\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_OCTAVE_MOD_TRUE}" && test -z "${BUILD_OCTAVE_MOD_FALSE}"; then + as_fn_error $? "conditional \"BUILD_OCTAVE_MOD\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_OCTAVE_MOD_TRUE}" && test -z "${BUILD_OCTAVE_MOD_FALSE}"; then + as_fn_error $? "conditional \"BUILD_OCTAVE_MOD\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_SQLITE3_TRUE}" && test -z "${HAVE_SQLITE3_FALSE}"; then + as_fn_error $? "conditional \"HAVE_SQLITE3\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_WIN_VERSION_FILE_TRUE}" && test -z "${USE_WIN_VERSION_FILE_FALSE}"; then + as_fn_error $? "conditional \"USE_WIN_VERSION_FILE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by libsndfile $as_me 1.0.31, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to . +libsndfile home page: ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +libsndfile config.status 1.0.31 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +LD_RC='`$ECHO "$LD_RC" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_RC='`$ECHO "$reload_flag_RC" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_RC='`$ECHO "$reload_cmds_RC" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_RC='`$ECHO "$old_archive_cmds_RC" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +compiler_RC='`$ECHO "$compiler_RC" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +GCC_RC='`$ECHO "$GCC_RC" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_RC='`$ECHO "$lt_prog_compiler_no_builtin_flag_RC" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_RC='`$ECHO "$lt_prog_compiler_pic_RC" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_RC='`$ECHO "$lt_prog_compiler_wl_RC" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_RC='`$ECHO "$lt_prog_compiler_static_RC" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_RC='`$ECHO "$lt_cv_prog_compiler_c_o_RC" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_RC='`$ECHO "$archive_cmds_need_lc_RC" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_RC='`$ECHO "$enable_shared_with_static_runtimes_RC" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_RC='`$ECHO "$export_dynamic_flag_spec_RC" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_RC='`$ECHO "$whole_archive_flag_spec_RC" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_RC='`$ECHO "$compiler_needs_object_RC" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_RC='`$ECHO "$old_archive_from_new_cmds_RC" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_RC='`$ECHO "$old_archive_from_expsyms_cmds_RC" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_RC='`$ECHO "$archive_cmds_RC" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_RC='`$ECHO "$archive_expsym_cmds_RC" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_RC='`$ECHO "$module_cmds_RC" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_RC='`$ECHO "$module_expsym_cmds_RC" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_RC='`$ECHO "$with_gnu_ld_RC" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_RC='`$ECHO "$allow_undefined_flag_RC" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_RC='`$ECHO "$no_undefined_flag_RC" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_RC='`$ECHO "$hardcode_libdir_flag_spec_RC" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_RC='`$ECHO "$hardcode_libdir_separator_RC" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_RC='`$ECHO "$hardcode_direct_RC" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_RC='`$ECHO "$hardcode_direct_absolute_RC" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_RC='`$ECHO "$hardcode_minus_L_RC" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_RC='`$ECHO "$hardcode_shlibpath_var_RC" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_RC='`$ECHO "$hardcode_automatic_RC" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_RC='`$ECHO "$inherit_rpath_RC" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_RC='`$ECHO "$link_all_deplibs_RC" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_RC='`$ECHO "$always_export_symbols_RC" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_RC='`$ECHO "$export_symbols_cmds_RC" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_RC='`$ECHO "$exclude_expsyms_RC" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_RC='`$ECHO "$include_expsyms_RC" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_RC='`$ECHO "$prelink_cmds_RC" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_RC='`$ECHO "$postlink_cmds_RC" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_RC='`$ECHO "$file_list_spec_RC" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_RC='`$ECHO "$hardcode_action_RC" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_RC='`$ECHO "$compiler_lib_search_dirs_RC" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_RC='`$ECHO "$predep_objects_RC" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_RC='`$ECHO "$postdep_objects_RC" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +predeps_RC='`$ECHO "$predeps_RC" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_RC='`$ECHO "$postdeps_RC" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_RC='`$ECHO "$compiler_lib_search_path_RC" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in AS \ +DLLTOOL \ +OBJDUMP \ +SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ +nm_file_list_spec \ +lt_cv_truncate_bin \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +LD_RC \ +reload_flag_CXX \ +reload_flag_RC \ +compiler_CXX \ +compiler_RC \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_no_builtin_flag_RC \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_pic_RC \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_wl_RC \ +lt_prog_compiler_static_CXX \ +lt_prog_compiler_static_RC \ +lt_cv_prog_compiler_c_o_CXX \ +lt_cv_prog_compiler_c_o_RC \ +export_dynamic_flag_spec_CXX \ +export_dynamic_flag_spec_RC \ +whole_archive_flag_spec_CXX \ +whole_archive_flag_spec_RC \ +compiler_needs_object_CXX \ +compiler_needs_object_RC \ +with_gnu_ld_CXX \ +with_gnu_ld_RC \ +allow_undefined_flag_CXX \ +allow_undefined_flag_RC \ +no_undefined_flag_CXX \ +no_undefined_flag_RC \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_flag_spec_RC \ +hardcode_libdir_separator_CXX \ +hardcode_libdir_separator_RC \ +exclude_expsyms_CXX \ +exclude_expsyms_RC \ +include_expsyms_CXX \ +include_expsyms_RC \ +file_list_spec_CXX \ +file_list_spec_RC \ +compiler_lib_search_dirs_CXX \ +compiler_lib_search_dirs_RC \ +predep_objects_CXX \ +predep_objects_RC \ +postdep_objects_CXX \ +postdep_objects_RC \ +predeps_CXX \ +predeps_RC \ +postdeps_CXX \ +postdeps_RC \ +compiler_lib_search_path_CXX \ +compiler_lib_search_path_RC; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path \ +reload_cmds_CXX \ +reload_cmds_RC \ +old_archive_cmds_CXX \ +old_archive_cmds_RC \ +old_archive_from_new_cmds_CXX \ +old_archive_from_new_cmds_RC \ +old_archive_from_expsyms_cmds_CXX \ +old_archive_from_expsyms_cmds_RC \ +archive_cmds_CXX \ +archive_cmds_RC \ +archive_expsym_cmds_CXX \ +archive_expsym_cmds_RC \ +module_cmds_CXX \ +module_cmds_RC \ +module_expsym_cmds_CXX \ +module_expsym_cmds_RC \ +export_symbols_cmds_CXX \ +export_symbols_cmds_RC \ +prelink_cmds_CXX \ +prelink_cmds_RC \ +postlink_cmds_CXX \ +postlink_cmds_RC; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' + +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile' + + + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "Octave/Makefile") CONFIG_FILES="$CONFIG_FILES Octave/Makefile" ;; + "src/version-metadata.rc") CONFIG_FILES="$CONFIG_FILES src/version-metadata.rc" ;; + "include/sndfile.h") CONFIG_FILES="$CONFIG_FILES include/sndfile.h" ;; + "tests/test_wrapper.sh") CONFIG_FILES="$CONFIG_FILES tests/test_wrapper.sh" ;; + "tests/pedantic-header-test.sh") CONFIG_FILES="$CONFIG_FILES tests/pedantic-header-test.sh" ;; + "libsndfile.spec") CONFIG_FILES="$CONFIG_FILES libsndfile.spec" ;; + "sndfile.pc") CONFIG_FILES="$CONFIG_FILES sndfile.pc" ;; + "Scripts/build-test-tarball.mk") CONFIG_FILES="$CONFIG_FILES Scripts/build-test-tarball.mk" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + case $CONFIG_FILES in #( + *\'*) : + eval set x "$CONFIG_FILES" ;; #( + *) : + set x $CONFIG_FILES ;; #( + *) : + ;; +esac + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`$as_dirname -- "$am_mf" || +$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$am_mf" : 'X\(//\)[^/]' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$am_mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + am_filepart=`$as_basename -- "$am_mf" || +$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$am_mf" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { echo "$as_me:$LINENO: cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles" >&5 + (cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } || am_rc=$? + done + if test $am_rc -ne 0; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE=\"gmake\" (or whatever is + necessary). You can also try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking). +See \`config.log' for more details" "$LINENO" 5; } + fi + { am_dirpart=; unset am_dirpart;} + { am_filepart=; unset am_filepart;} + { am_mf=; unset am_mf;} + { am_rc=; unset am_rc;} + rm -f conftest-deps.mk +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# 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, see . + + +# The names of the tagged configurations supported by this script. +available_tags='CXX RC ' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Assembler program. +AS=$lt_AS + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Object dumper program. +OBJDUMP=$lt_OBJDUMP + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain=$ac_aux_dir/ltmain.sh + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: RC + +# The linker used to build libraries. +LD=$lt_LD_RC + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_RC +reload_cmds=$lt_reload_cmds_RC + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_RC + +# A language specific compiler. +CC=$lt_compiler_RC + +# Is the compiler the GNU compiler? +with_gcc=$GCC_RC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_RC + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_RC + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_RC + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_RC + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_RC + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_RC +archive_expsym_cmds=$lt_archive_expsym_cmds_RC + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_RC +module_expsym_cmds=$lt_module_expsym_cmds_RC + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_RC + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_RC + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_RC + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_RC + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_RC + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_RC + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_RC + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_RC + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_RC + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_RC + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_RC + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_RC + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_RC + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_RC + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_RC + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_RC + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_RC + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_RC + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_RC + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_RC +postdep_objects=$lt_postdep_objects_RC +predeps=$lt_predeps_RC +postdeps=$lt_postdeps_RC + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_RC + +# ### END LIBTOOL TAG CONFIG: RC +_LT_EOF + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + + +if test -z "$PKG_CONFIG"; then : + + $as_echo " *****************************************************************" + $as_echo " *** The pkg-config program is missing. ***" + $as_echo " *** External FLAC/Ogg/Vorbis libs cannot be found without it. ***" + $as_echo " *** http://pkg-config.freedesktop.org/wiki/ ***" + $as_echo " *****************************************************************" + +fi + +_lcl_receval="$libdir" +full_absolute_libdir=`(test "x$prefix" = xNONE && prefix="$ac_default_prefix" + test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" + _lcl_receval_old='' + while test "$_lcl_receval_old" != "$_lcl_receval"; do + _lcl_receval_old="$_lcl_receval" + eval _lcl_receval="\"$_lcl_receval\"" + done + echo "$_lcl_receval")` +_lcl_receval="$bindir" +full_absolute_bindir=`(test "x$prefix" = xNONE && prefix="$ac_default_prefix" + test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" + _lcl_receval_old='' + while test "$_lcl_receval_old" != "$_lcl_receval"; do + _lcl_receval_old="$_lcl_receval" + eval _lcl_receval="\"$_lcl_receval\"" + done + echo "$_lcl_receval")` +_lcl_receval="$pkgconfigdir" +full_absolute_pkgconfigdir=`(test "x$prefix" = xNONE && prefix="$ac_default_prefix" + test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" + _lcl_receval_old='' + while test "$_lcl_receval_old" != "$_lcl_receval"; do + _lcl_receval_old="$_lcl_receval" + eval _lcl_receval="\"$_lcl_receval\"" + done + echo "$_lcl_receval")` +_lcl_receval="$htmldir" +full_absolute_htmldir=`(test "x$prefix" = xNONE && prefix="$ac_default_prefix" + test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" + _lcl_receval_old='' + while test "$_lcl_receval_old" != "$_lcl_receval"; do + _lcl_receval_old="$_lcl_receval" + eval _lcl_receval="\"$_lcl_receval\"" + done + echo "$_lcl_receval")` +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: +-=-=-=-=-=-=-=-=-=-= Configuration Complete =-=-=-=-=-=-=-=-=-=-=- + + Configuration summary : + + libsndfile version : .................. ${VERSION} + + Host CPU : ............................ ${host_cpu} + Host Vendor : ......................... ${host_vendor} + Host OS : ............................. ${host_os} + + CFLAGS : .............................. ${CFLAGS} + CXXFLAGS : ............................ ${CXXFLAGS} + CPPFLAGS : ............................ ${CPPFLAGS} + LDFLAGS : ............................. ${LDFLAGS} + + Experimental code : ................... ${enable_experimental:-no} + Using ALSA in example programs : ...... ${enable_alsa:-no} + External FLAC/Ogg/Vorbis/Opus : ....... ${enable_external_libs:-no} + Building Octave interface : ........... ${OCTAVE_BUILD} + + Tools : + + C Compiler Vendor is : ................ ${ax_cv_c_compiler_vendor} (${ax_cv_c_compiler_version}) + CXX Compiler Vendor is : .............. ${ax_cv_cxx_compiler_vendor} (${ax_cv_cxx_compiler_version}) + + Sanitizer enabled : ................... ${enable_sanitizer:-no} + Stack smash protection : .............. ${enable_stack_smash_protection:-no} + + Installation directories : + + Library directory : ................... ${full_absolute_libdir} + Program directory : ................... ${full_absolute_bindir} + Pkgconfig directory : ................. ${full_absolute_pkgconfigdir} + HTML docs directory : ................. ${full_absolute_htmldir} + +Compiling some other packages against libsndfile may require +the addition of '$full_absolute_pkgconfigdir' to the +PKG_CONFIG_PATH environment variable. +" >&5 +$as_echo " +-=-=-=-=-=-=-=-=-=-= Configuration Complete =-=-=-=-=-=-=-=-=-=-=- + + Configuration summary : + + libsndfile version : .................. ${VERSION} + + Host CPU : ............................ ${host_cpu} + Host Vendor : ......................... ${host_vendor} + Host OS : ............................. ${host_os} + + CFLAGS : .............................. ${CFLAGS} + CXXFLAGS : ............................ ${CXXFLAGS} + CPPFLAGS : ............................ ${CPPFLAGS} + LDFLAGS : ............................. ${LDFLAGS} + + Experimental code : ................... ${enable_experimental:-no} + Using ALSA in example programs : ...... ${enable_alsa:-no} + External FLAC/Ogg/Vorbis/Opus : ....... ${enable_external_libs:-no} + Building Octave interface : ........... ${OCTAVE_BUILD} + + Tools : + + C Compiler Vendor is : ................ ${ax_cv_c_compiler_vendor} (${ax_cv_c_compiler_version}) + CXX Compiler Vendor is : .............. ${ax_cv_cxx_compiler_vendor} (${ax_cv_cxx_compiler_version}) + + Sanitizer enabled : ................... ${enable_sanitizer:-no} + Stack smash protection : .............. ${enable_stack_smash_protection:-no} + + Installation directories : + + Library directory : ................... ${full_absolute_libdir} + Program directory : ................... ${full_absolute_bindir} + Pkgconfig directory : ................. ${full_absolute_pkgconfigdir} + HTML docs directory : ................. ${full_absolute_htmldir} + +Compiling some other packages against libsndfile may require +the addition of '$full_absolute_pkgconfigdir' to the +PKG_CONFIG_PATH environment variable. +" >&6; } + +rm -f gdbclient diff --git a/libsndfile-1.0.31/configure.ac b/libsndfile-1.0.31/configure.ac new file mode 100644 index 0000000..78a79da --- /dev/null +++ b/libsndfile-1.0.31/configure.ac @@ -0,0 +1,743 @@ +dnl Copyright (C) 1999-2021 Erik de Castro Lopo . + +dnl Require autoconf version >= 2.69 +AC_PREREQ([2.69]) + +AC_INIT([libsndfile],[1.0.31],[sndfile@mega-nerd.com], + [libsndfile],[http://libsndfile.github.io/libsndfile/]) + +dnl Check whether we want to set defaults for CFLAGS, CXXFLAGS, CPPFLAGS and LDFLAGS +AC_MSG_CHECKING([whether configure should try to set CFLAGS/CXXFLAGS/CPPFLAGS/LDFLAGS]) +AS_IF([test "x${CFLAGS+set}" = "xset" || test "x${CXXFLAGS+set}" = "xset" || test "x${CPPFLAGS+set}" = "xset" || test "x${LDFLAGS+set}" = "xset"], [ + enable_flags_setting=no + : ${CFLAGS=""} + : ${CXXFLAGS=""} + ], [ + enable_flags_setting=yes + dnl Set to empty flags so AC_PROG_CC and + dnl AC_PROG_CXX do not add -g -O2 + CFLAGS="" + CXXFLAGS="" + ]) +AC_MSG_RESULT([${enable_flags_setting}]) + +dnl Put config stuff in 'build-aux'. +AC_CONFIG_AUX_DIR([build-aux]) + +AC_CONFIG_SRCDIR([src/sndfile.c]) +AC_CANONICAL_HOST + +AC_CONFIG_MACRO_DIR([m4]) +AC_CONFIG_HEADERS([src/config.h]) + +AM_INIT_AUTOMAKE([1.14 foreign dist-bzip2 no-dist-gzip serial-tests subdir-objects]) +AM_SILENT_RULES([yes]) + +dnl ==================================================================================== + +AC_PROG_CC +AC_PROG_CC_C99 + +AS_IF([test "x$ac_cv_prog_cc_c99" = "xno"], [ + AC_MSG_ERROR([libsndfile requires a C99 capable compiler!]) + ]) + +AC_USE_SYSTEM_EXTENSIONS +AC_PROG_CXX + +AC_LANG([C]) +AX_COMPILER_VENDOR +AX_COMPILER_VERSION + +AC_LANG_PUSH([C++]) +AX_COMPILER_VENDOR +AX_COMPILER_VERSION +AC_LANG_POP([C++]) + +AC_PROG_SED +AM_PROG_AR + +LT_INIT([win32-dll]) +LT_PROG_RC + +AC_PROG_INSTALL +AC_PROG_LN_S + +AM_PATH_PYTHON + +AC_CHECK_PROG([HAVE_AUTOGEN], [autogen], [yes], [no]) +AC_CHECK_PROG([HAVE_WINE], [wine], [yes], [no]) +AC_CHECK_PROG([HAVE_XCODE_SELECT], [xcode-select], [yes], [no]) + +dnl ------------------------------------------------------------------------------------ +dnl Rules for library version information: +dnl +dnl 1. Start with version information of `0:0:0' for each libtool library. +dnl 2. Update the version information only immediately before a public release of +dnl your software. More frequent updates are unnecessary, and only guarantee +dnl that the current interface number gets larger faster. +dnl 3. If the library source code has changed at all since the last update, then +dnl increment revision (`c:r:a' becomes `c:r+1:a'). +dnl 4. If any interfaces have been added, removed, or changed since the last update, +dnl increment current, and set revision to 0. +dnl 5. If any interfaces have been added since the last public release, then increment +dnl age. +dnl 6. If any interfaces have been removed since the last public release, then set age +dnl to 0. +SHARED_VERSION_INFO="1:31:0" + +dnl ------------------------------------------------------------------------------------ + +AC_HEADER_STDC + +AC_CHECK_HEADERS([endian.h]) +AC_CHECK_HEADERS([byteswap.h]) +AC_CHECK_HEADERS([locale.h]) +AC_CHECK_HEADERS([sys/time.h]) +AC_CHECK_HEADERS([immintrin.h]) + +AC_HEADER_SYS_WAIT + +AC_CHECK_DECLS([S_IRGRP]) +AS_IF([test "x$ac_cv_have_decl_S_IRGRP" = "xyes"], [ + AC_DEFINE_UNQUOTED([HAVE_DECL_S_IRGRP], [1], [Set to 1 if S_IRGRP is defined.]) + ], [ + AC_DEFINE_UNQUOTED([HAVE_DECL_S_IRGRP], [0], [Set to 0 if S_IRGRP is not defined.]) + ]) + +AM_CONDITIONAL([LINUX_MINGW_CROSS_TEST], + [test "x${build_os}:${host_os}:${HAVE_WINE}" = "xlinux-gnu:mingw32msvc:yes"]) + +dnl ==================================================================================== +dnl Couple of initializations here. Fill in real values later. + +SHLIB_VERSION_ARG="" + +dnl ==================================================================================== +dnl Finished checking, handle options. + +AC_ARG_ENABLE(experimental, + AS_HELP_STRING([--enable-experimental], [enable experimental code])) + +AS_IF([test "x$enable_experimental" = "xyes"], [ + EXPERIMENTAL_CODE=1 + ], [ + EXPERIMENTAL_CODE=0 + ]) +AC_DEFINE_UNQUOTED([ENABLE_EXPERIMENTAL_CODE], [${EXPERIMENTAL_CODE}], [Set to 1 to enable experimental code.]) + +AC_ARG_ENABLE([werror], + [AS_HELP_STRING([--enable-werror], [enable -Werror in all Makefiles])]) + +AC_ARG_ENABLE([stack-smash-protection], + [AS_HELP_STRING([--enable-stack-smash-protection], [Enable GNU GCC stack smash protection])]) + +AC_ARG_ENABLE([cpu-clip], + [AS_HELP_STRING([--disable-cpu-clip], [disable tricky cpu specific clipper])]) + +AC_ARG_ENABLE([bow-docs], + [AS_HELP_STRING([--enable-bow-docs], [enable black-on-white html docs])]) + +AC_ARG_ENABLE([sqlite], + [AS_HELP_STRING([--disable-sqlite], [disable use of sqlite])]) + +AC_ARG_ENABLE([alsa], + [AS_HELP_STRING([--disable-alsa], [disable ALSA support (default=autodetect)])], [], [enable_alsa=auto]) + +AC_ARG_ENABLE([external-libs], + [AS_HELP_STRING([--disable-external-libs], [disable use of FLAC, Ogg and Vorbis [[default=no]]])]) + +AC_ARG_ENABLE(octave, + [AS_HELP_STRING([--enable-octave], [enable building of GNU Octave module])]) + +AC_ARG_ENABLE([full-suite], + [AS_HELP_STRING([--disable-full-suite], [disable building and installing programs, documentation, only build library [[default=no]]])]) +AM_CONDITIONAL([FULL_SUITE], [test "x$enable_full_suite" != "xno"]) + +AC_ARG_ENABLE([test-coverage], + [AS_HELP_STRING([--enable-test-coverage], [enable test coverage])]) +AM_CONDITIONAL([ENABLE_TEST_COVERAGE], [test "x$enable_test_coverage" = "xyes"]) + +AC_ARG_ENABLE([ossfuzzers], + [AS_HELP_STRING([--enable-ossfuzzers], + [Whether to generate the fuzzers for OSS-Fuzz])], + [have_ossfuzzers=yes], [have_ossfuzzers=no]) +AM_CONDITIONAL([USE_OSSFUZZERS], [test "x$have_ossfuzzers" = "xyes"]) + +AC_SUBST([LIB_FUZZING_ENGINE]) +AM_CONDITIONAL([USE_OSSFUZZ_FLAG], [test "x$LIB_FUZZING_ENGINE" = "x-fsanitize=fuzzer"]) +AM_CONDITIONAL([USE_OSSFUZZ_STATIC], [test -f "$LIB_FUZZING_ENGINE"]) + +dnl ==================================================================================== +dnl Check types and their sizes. + +AC_CHECK_SIZEOF([wchar_t], [4]) +AC_CHECK_SIZEOF([short], [2]) +AC_CHECK_SIZEOF([int], [4]) +AC_CHECK_SIZEOF([long], [4]) +AC_CHECK_SIZEOF([float], [4]) +AC_CHECK_SIZEOF([double], [4]) +AC_CHECK_SIZEOF([void*], [8]) +AC_CHECK_SIZEOF([size_t], [4]) +AC_CHECK_SIZEOF([int64_t], [8]) +AC_CHECK_SIZEOF([long long], [8]) + +dnl ==================================================================================== +dnl Find an appropriate type for sf_count_t. +dnl On systems supporting files larger than 2 Gig, sf_count_t must be a 64 bit value. +dnl Unfortunately there is more than one way of ensuring this so need to do some +dnl pretty rigourous testing here. + +dnl Check for common 64 bit file offset types. +AC_CHECK_SIZEOF([off_t], [1]) + +AS_IF([test "x$enable_largefile:$ac_cv_sizeof_off_t" = "xno:8"], [ + AC_MSG_ERROR(["Error : Cannot disable large file support because sizeof (off_t) == 8."]) + ]) + +AS_CASE([$host_os], + [mingw32*], [ + TYPEOF_SF_COUNT_T="__int64" + SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL" + SIZEOF_SF_COUNT_T=8 + AC_DEFINE([__USE_MINGW_ANSI_STDIO], [1], [Set to 1 to use C99 printf/snprintf in MinGW.]) + ], + + [linux-android*], [ + TYPEOF_SF_COUNT_T="int64_t" + SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL" + SIZEOF_SF_COUNT_T=8 + ], + + [ + SIZEOF_SF_COUNT_T=0 + AS_IF([test "x$ac_cv_sizeof_off_t" = "x8"], [ + dnl If sizeof (off_t) is 8, no further checking is needed. + TYPEOF_SF_COUNT_T="int64_t" + SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL" + SIZEOF_SF_COUNT_T=8 + ], [ + dnl Save the old sizeof (off_t) value and then unset it to see if it + dnl changes when Large File Support is enabled. + pre_largefile_sizeof_off_t=$ac_cv_sizeof_off_t + unset ac_cv_sizeof_off_t + + AC_SYS_LARGEFILE + AS_IF([test "x$ac_cv_sys_largefile_CFLAGS" = "xno"], [ + ac_cv_sys_largefile_CFLAGS="" + ]) + AS_IF([test "x$ac_cv_sys_largefile_LDFLAGS" = "xno"], [ + ac_cv_sys_largefile_LDFLAGS="" + ]) + AS_IF([test "x$ac_cv_sys_largefile_LIBS" = "xno"], [ + ac_cv_sys_largefile_LIBS="" + ]) + + AC_CHECK_SIZEOF(off_t,1) + + AS_IF([test "x$ac_cv_sizeof_off_t" = "x8"], [ + TYPEOF_SF_COUNT_T="int64_t" + SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL" + SIZEOF_SF_COUNT_T=8 + ], [test "x$TYPEOF_SF_COUNT_T" = "xunknown"], [ + AS_ECHO([""]) + AS_ECHO(["*** The configure process has determined that this system is capable"]) + AS_ECHO(["*** of Large File Support but has not been able to find a type which"]) + AS_ECHO(["*** is an unambiguous 64 bit file offset."]) + AS_ECHO(["*** Please contact the author to help resolve this problem."]) + AS_ECHO([""]) + AC_MSG_ERROR([[Bad file offset type.]]) + ]) + ]) + ]) + +AS_CASE([$host_vendor], + [vita], [ + TYPEOF_SF_COUNT_T="int64_t" + SF_COUNT_MAX="0x7FFFFFFFFFFFFFFFLL" + SIZEOF_SF_COUNT_T=8 + ]) + +AS_IF([test "x$SIZEOF_SF_COUNT_T" = "x4"], [ + SF_COUNT_MAX="0x7FFFFFFF" + ]) + +AC_DEFINE_UNQUOTED([TYPEOF_SF_COUNT_T], [${TYPEOF_SF_COUNT_T}], [Set to long if unknown.]) +AC_SUBST(TYPEOF_SF_COUNT_T) + +AC_DEFINE_UNQUOTED([SIZEOF_SF_COUNT_T], [${SIZEOF_SF_COUNT_T}], [Set to sizeof (long) if unknown.]) +AC_SUBST(SIZEOF_SF_COUNT_T) + +AC_DEFINE_UNQUOTED([SF_COUNT_MAX], [${SF_COUNT_MAX}], [Set to maximum allowed value of sf_count_t type.]) +AC_SUBST(SF_COUNT_MAX) + +AC_TYPE_SSIZE_T + +dnl ==================================================================================== +dnl Determine endian-ness of host processor. + +AC_C_BIGENDIAN([ + dnl big-endian + ac_cv_c_big_endian=1 + ac_cv_c_little_endian=0 + ], [ + dnl little-endian + ac_cv_c_big_endian=0 + ac_cv_c_little_endian=1 + ]) + +AC_DEFINE_UNQUOTED([CPU_IS_BIG_ENDIAN], [${ac_cv_c_big_endian}], [Host processor is big endian.]) +AC_DEFINE_UNQUOTED([CPU_IS_LITTLE_ENDIAN], [${ac_cv_c_little_endian}], [Host processor is little endian.]) + +dnl ==================================================================================== +dnl Check for functions. + +AC_CHECK_FUNCS([malloc calloc realloc free]) +AC_CHECK_FUNCS([open read write lseek lseek64]) +AC_CHECK_FUNCS([fstat fstat64 ftruncate fsync]) +AC_CHECK_FUNCS([snprintf vsnprintf]) +AC_CHECK_FUNCS([gmtime gmtime_r localtime localtime_r gettimeofday]) +AC_CHECK_FUNCS([mmap getpagesize]) +AC_CHECK_FUNCS([setlocale]) +AC_CHECK_FUNCS([pipe waitpid]) + +AC_SEARCH_LIBS([floor], [m], [], [ + AC_MSG_ERROR([unable to find the floor() function!]) + ]) +AC_CHECK_FUNCS([floor ceil fmod lrint lrintf]) + +dnl ==================================================================================== +dnl Check for requirements for building plugins for other languages/enviroments. + +dnl Octave maths environment http://www.octave.org/ +AS_IF([test "x$cross_compiling" = "xno"], [ + AS_IF([test "x$enable_octave" = "xno"], [ + AM_CONDITIONAL(BUILD_OCTAVE_MOD, false) + ], [ + AC_OCTAVE_BUILD + ]) + ], [ + AM_CONDITIONAL(BUILD_OCTAVE_MOD, false) + ]) + +dnl ==================================================================================== +dnl Check for Ogg, Vorbis and FLAC. + +HAVE_EXTERNAL_XIPH_LIBS=0 +EXTERNAL_XIPH_CFLAGS="" +EXTERNAL_XIPH_LIBS="" +EXTERNAL_XIPH_REQUIRE="" + +dnl Check for pkg-config outside the if statement. +PKG_PROG_PKG_CONFIG +AX_REQUIRE_DEFINED([PKG_INSTALLDIR]) +PKG_INSTALLDIR + +AS_IF([test -n "$PKG_CONFIG"], [ + AS_IF([test "x$enable_external_libs" = "xno"], [ + AC_MSG_WARN([[*** External libs (FLAC, Ogg, Vorbis) disabled. ***]]) + ], [ + PKG_CHECK_MOD_VERSION(FLAC, flac >= 1.3.1, ac_cv_flac=yes, ac_cv_flac=no) + + dnl Make sure the FLAC_CFLAGS value is sane. + FLAC_CFLAGS=`echo $FLAC_CFLAGS | $SED "s|include/FLAC|include|"` + + PKG_CHECK_MOD_VERSION(OGG, ogg >= 1.3.0, ac_cv_ogg=yes, ac_cv_ogg=no) + + AS_IF([test "x$enable_experimental" = "xyes"], [ + PKG_CHECK_MOD_VERSION(SPEEX, speex >= 1.2, ac_cv_speex=yes, ac_cv_speex=no) + ], [ + SPEEX_CFLAGS="" + SPEEX_LIBS="" + ]) + + dnl Vorbis versions earlier than 1.2.3 have bugs that cause the libsndfile + dnl test suite to fail on MIPS, PowerPC and others. + dnl See: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=549899 + PKG_CHECK_MOD_VERSION(VORBIS, vorbis >= 1.2.3, ac_cv_vorbis=yes, ac_cv_vorbis=no) + PKG_CHECK_MOD_VERSION(VORBISENC, vorbisenc >= 1.2.3, ac_cv_vorbisenc=yes, ac_cv_vorbisenc=no) + + PKG_CHECK_MOD_VERSION(OPUS, opus >= 1.1, ac_cv_opus=yes, ac_cv_opus=no) + enable_external_libs=yes + ]) + + AS_IF([test "x$ac_cv_flac$ac_cv_ogg$ac_cv_vorbis$ac_cv_vorbisenc$ac_cv_opus" = "xyesyesyesyesyes"], [ + HAVE_EXTERNAL_XIPH_LIBS=1 + enable_external_libs=yes + + EXTERNAL_XIPH_CFLAGS="$FLAC_CFLAGS $VORBIS_CFLAGS $VORBISENC_CFLAGS $SPEEX_CFLAGS $OPUS_CFLAGS $OGG_CFLAGS " + EXTERNAL_XIPH_LIBS="$FLAC_LIBS $VORBIS_LIBS $VORBISENC_LIBS $SPEEX_LIBS $OPUS_LIBS $OGG_LIBS " + EXTERNAL_XIPH_REQUIRE="flac ogg vorbis vorbisenc opus" + + if test x$ac_cv_speex = "xyes" ; then + EXTERNAL_XIPH_REQUIRE="$EXTERNAL_XIPH_REQUIRE speex" + fi + ], [ + AS_ECHO([""]) + AC_MSG_WARN([[*** One or more of the external libraries (ie libflac, libogg and]]) + AC_MSG_WARN([[*** libvorbis) is either missing (possibly only the development]]) + AC_MSG_WARN([[*** headers) or is of an unsupported version.]]) + AC_MSG_WARN([[***]]) + AC_MSG_WARN([[*** Unfortunately, for ease of maintenance, the external libs]]) + AC_MSG_WARN([[*** are an all or nothing affair.]]) + AS_ECHO([""]) + enable_external_libs=no + ]) + ]) + +AC_DEFINE_UNQUOTED([HAVE_EXTERNAL_XIPH_LIBS], [$HAVE_EXTERNAL_XIPH_LIBS], [Will be set to 1 if flac, ogg, vorbis, and opus are available.]) + +dnl ==================================================================================== +dnl Check for libsqlite3 (only used in regtest). + +ac_cv_sqlite3=0 +AS_IF([test "x$enable_sqlite" != "xno"], [ + PKG_CHECK_MOD_VERSION([SQLITE3], [sqlite3 >= 3.2], [ac_cv_sqlite3=1], [ac_cv_sqlite3=0]) + ]) + +AC_DEFINE_UNQUOTED([HAVE_SQLITE3], [${ac_cv_sqlite3}], [Set to 1 if you have libsqlite3.]) +AM_CONDITIONAL([HAVE_SQLITE3], [test "x$ac_cv_sqlite3" = "x1"]) + +dnl ==================================================================================== +dnl Determine if the processor can do clipping on float to int conversions. + +AS_IF([test "x$enable_cpu_clip" != "xno"], [ + MN_C_CLIP_MODE + ], [ + AS_ECHO(["checking processor clipping capabilities... disabled"]) + ac_cv_c_clip_positive=0 + ac_cv_c_clip_negative=0 + ]) + +AC_DEFINE_UNQUOTED([CPU_CLIPS_POSITIVE], [${ac_cv_c_clip_positive}], + [Host processor clips on positive float to int conversion.]) +AC_DEFINE_UNQUOTED([CPU_CLIPS_NEGATIVE], [${ac_cv_c_clip_negative}], + [Host processor clips on negative float to int conversion.]) + +dnl ==================================================================================== +dnl Host OS specific stuff. + +OS_SPECIFIC_CFLAGS="" +OS_SPECIFIC_LINKS="" +os_is_win32=0 +os_is_openbsd=0 +use_windows_api=0 +AS_CASE([$host_os], + [darwin* | rhapsody*], [ + AS_IF([test "x$HAVE_XCODE_SELECT" = "xyes"], [ + developer_path=`xcode-select --print-path` + ], [ + developer_path="/Developer" + ]) + OS_SPECIFIC_LINKS="-framework CoreAudio -framework AudioToolbox -framework CoreFoundation"], + [mingw*], [ + os_is_win32=1 + use_windows_api=1 + OS_SPECIFIC_LINKS="-lwinmm"], + [openbsd*], [ + os_is_openbsd=1 + ]) + +AC_DEFINE_UNQUOTED([OS_IS_WIN32], [${os_is_win32}], [Set to 1 if compiling for Win32]) +AC_DEFINE_UNQUOTED([OS_IS_OPENBSD], [${os_is_openbsd}], [Set to 1 if compiling for OpenBSD]) +AC_DEFINE_UNQUOTED([USE_WINDOWS_API], [${use_windows_api}], [Set to 1 to use the native windows API]) +AM_CONDITIONAL(USE_WIN_VERSION_FILE, test ${use_windows_api} -eq 1) + +dnl ==================================================================================== +dnl Check for ALSA. + +AS_IF([test "x$enable_alsa" != "xno"], [ + PKG_CHECK_MODULES([ALSA], [alsa], [ + dnl actually test whether ALSA really works, in + dnl order to dodge wrong cross-compilation pickups + save_CFLAGS="${CFLAGS}" + save_LIBS="${LIBS}" + CFLAGS="${CFLAGS} ${ALSA_CFLAGS}" + LIBS="${LIBS} ${ALSA_LIBS}" + AC_CHECK_HEADERS([alsa/asoundlib.h]) + AS_IF([test "x$ac_cv_header_alsa_asoundlib_h" = "xyes"], [ + dnl ALSA definitely works + AC_DEFINE([HAVE_ALSA], [1], [Set to 1 if you have alsa]) + alsa_works="yes" + ], [ + dnl picked up wrong ALSA + alsa_works="no" + + dnl reset flags + ALSA_CFLAGS="" + ALSA_LIBS="" + ]) + CFLAGS="${save_CFLAGS}" + LIBS="${save_LIBS}" + ], [ + dnl could not find ALSA + alsa_works="no" + ]) + + AS_IF([test "x$alsa_works" = "xno"], [ + AS_IF([test "x$enable_alsa" = "xyes"], [ + dnl explicitly passed --enable-alsa, hence error out loud and clearly + AC_MSG_ERROR([You explicitly requested alsa support, but alsa could not be found!]) + ], [ + dnl did not explicitly pass --enable-alsa, relying on default automagic on + enable_alsa="no (auto)" + ]) + ]) + ]) + +dnl ==================================================================================== +dnl Check for OpenBSD's sndio. + +SNDIO_LIBS="" +HAVE_SNDIO_H=0 +AS_CASE([$host_os], + [openbsd*], [ + AC_CHECK_HEADERS(sndio.h) + AS_IF([test "x$ac_cv_header_sndio_h" = "xyes"], [ + SNDIO_LIBS="-lsndio" + HAVE_SNDIO_H=1 + ]) + ]) + +AC_DEFINE_UNQUOTED([HAVE_SNDIO_H], [${HAVE_SNDIO_H}], [Set to 1 if is available.]) + +dnl ==================================================================================== +dnl Test for sanity when cross-compiling. + +AS_IF([test "x$ac_cv_sizeof_short" != "x2"], [ + AC_MSG_WARN([[******************************************************************]]) + AC_MSG_WARN([[*** sizeof (short) != 2. ]]) + AC_MSG_WARN([[******************************************************************]]) + ]) + +AS_IF([test "x$ac_cv_sizeof_int" != "x4"], [ + AC_MSG_WARN([[******************************************************************]]) + AC_MSG_WARN([[*** sizeof (int) != 4 ]]) + AC_MSG_WARN([[******************************************************************]]) + ]) + +AS_IF([test "x$ac_cv_sizeof_float" != "x4"], [ + AC_MSG_WARN([[******************************************************************]]) + AC_MSG_WARN([[*** sizeof (float) != 4. ]]) + AC_MSG_WARN([[******************************************************************]]) + ]) + +AS_IF([test "x$ac_cv_sizeof_double" != "x8"], [ + AC_MSG_WARN([[******************************************************************]]) + AC_MSG_WARN([[*** sizeof (double) != 8. ]]) + AC_MSG_WARN([[******************************************************************]]) + ]) + +AS_IF([test "x$ac_cv_prog_HAVE_AUTOGEN" = "xno"], [ + AC_MSG_WARN([[Touching files in directory tests/.]]) + touch tests/*.c tests/*.h + ]) + +dnl ==================================================================================== +dnl Settings for the HTML documentation. + +AS_IF([test "x$enable_bow_docs" = "xyes"], [ + HTML_BGCOLOUR="white" + HTML_FGCOLOUR="black" + ], [ + HTML_BGCOLOUR="black" + HTML_FGCOLOUR="white" + ]) + +dnl ==================================================================================== +dnl Now use the information from the checking stage. + +win32_target_dll=0 +COMPILER_IS_GCC=0 + +AS_IF([test "x$enable_flags_setting" = "xyes"], [ + AX_APPEND_COMPILE_FLAGS([-O2 -pipe], [CFLAGS]) + + AC_LANG_PUSH([C++]) + AX_APPEND_COMPILE_FLAGS([-O2 -pipe], [CXXFLAGS]) + AC_LANG_POP([C++]) + + AS_CASE([${host_os}], + [darwin*], [ + ldflags_test="-Wl,-dead_strip_dylibs"], + [linux*], [ + ldflags_test="-Wl,-O1 -Wl,--as-needed -Wl,--no-undefined -Wl,--gc-sections"] + ) + AX_APPEND_LINK_FLAGS([${ldflags_test}], [LDFLAGS]) + ]) + +AS_IF([test "x$enable_werror" = "xyes"], [ + AX_APPEND_COMPILE_FLAGS([-Werror], [CFLAGS]) + + AC_LANG_PUSH([C++]) + AX_APPEND_COMPILE_FLAGS([-Werror], [CXXFLAGS]) + AC_LANG_POP([C++]) + ]) + +common_flags="-Wall -Wextra -Wpointer-arith -Wcast-align -Wcast-qual -Wshadow -Wwrite-strings -Wundef -Wuninitialized -Winit-self -Wno-format-truncation" +AX_APPEND_COMPILE_FLAGS([${common_flags} -Wvla -Wbad-function-cast -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Waggregate-return], [CFLAGS]) + +AC_LANG_PUSH([C++]) +AX_APPEND_COMPILE_FLAGS([${common_flags} -Wctor-dtor-privacy -Wnon-virtual-dtor -Woverloaded-virtual -Wreorder -Wsign-promo], [CXXFLAGS]) +AC_LANG_POP([C++]) + +AS_IF([test "x$enable_stack_smash_protection" = "xyes"], [ + XIPH_GCC_STACK_PROTECTOR + XIPH_GXX_STACK_PROTECTOR + ]) + +AS_IF([test "x$enable_test_coverage" = "xyes"], [ + AX_APPEND_COMPILE_FLAGS([-coverage], [CFLAGS]) + ]) + +dnl some distributions (such as Gentoo) have _FORTIFY_SOURCE always +dnl enabled. We test for this situation in order to prevent polluting +dnl the console with messages of macro redefinitions. +AX_ADD_FORTIFY_SOURCE + +AS_IF([test "x$ax_cv_c_compiler_vendor" = "xgnu"], [ + dnl OS specific tweaks. + AS_CASE([$host_os], + [darwin* | rhapsody*], [ + dnl Disable -Wall, -pedantic and -Wshadow for Apple Darwin/Rhapsody. + dnl System headers on these systems are broken. + temp_CFLAGS=`echo $CFLAGS | $SED "s/-Wall -pedantic//" | $SED "s/-Wshadow//" | $SED "s/-Waggregate-return//"` + CFLAGS=$temp_CFLAGS + SHLIB_VERSION_ARG="-Wl,-exported_symbols_list -Wl,\$(top_srcdir)/src/Symbols.darwin"], + [mingw*], [ + SHLIB_VERSION_ARG="-Wc,-static-libgcc -Wl,\$(top_srcdir)/src/libsndfile-1.def" + win32_target_dll=1 + AS_IF([test "x$enable_shared" = "xno"], [ + win32_target_dll=0 + ]) + AX_APPEND_COMPILE_FLAGS([-mstackrealign], [CFLAGS]) + ], + [os2*], [ + SHLIB_VERSION_ARG="-Wl,-export-symbols \$(top_srcdir)/src/Symbols.os2" + ]) + + COMPILER_IS_GCC=1 + ]) + +AS_CASE([$host_os], [linux*|kfreebsd*-gnu*|gnu*], [SHLIB_VERSION_ARG="-Wl,--version-script=\$(top_srcdir)/src/Symbols.gnu-binutils"]) + +AC_DEFINE_UNQUOTED([WIN32_TARGET_DLL], [${win32_target_dll}], [Set to 1 if windows DLL is being built.]) +AC_DEFINE_UNQUOTED([COMPILER_IS_GCC], [${COMPILER_IS_GCC}], [Set to 1 if the compile is GNU GCC.]) + +CFLAGS="$CFLAGS $OS_SPECIFIC_CFLAGS" + +AS_IF([test "x$CFLAGS" = "x"], [ + AC_MSG_ERROR(["Error in configure script. CFLAGS has been screwed up."]) + ]) + +HOST_TRIPLET="${host_cpu}-${host_vendor}-${host_os}" + +AC_DEFINE_UNQUOTED([HOST_TRIPLET], [${HOST_TRIPLET}], [The host triplet of the compiled binary.]) + +AS_IF([test "$HOST_TRIPLET" = "x86_64-w64-mingw32"], [ + OS_SPECIFIC_LINKS=" -static-libgcc $OS_SPECIFIC_LINKS" + ]) + +WIN_RC_VERSION=`echo $PACKAGE_VERSION | $SED -e "s/p.*//" -e "s/\./,/g"` + + +AS_IF([test "x$enable_static" = "xno"], [ + SRC_BINDIR=src/.libs/ + TEST_BINDIR=tests/.libs/ + ], [ + SRC_BINDIR=src/ + TEST_BINDIR=tests/ + ]) + +dnl ------------------------------------------------------------------------------- + +AC_SUBST(HOST_TRIPLET) + +AC_SUBST(HTML_BGCOLOUR) +AC_SUBST(HTML_FGCOLOUR) + +AC_SUBST(SHLIB_VERSION_ARG) +AC_SUBST(SHARED_VERSION_INFO) +AC_SUBST(CLEAN_VERSION) +AC_SUBST(VERSION_MAJOR) +AC_SUBST(GEN_TOOL) + +AC_SUBST(WIN_RC_VERSION) + +AC_SUBST(HAVE_EXTERNAL_XIPH_LIBS) +AC_SUBST(OS_SPECIFIC_CFLAGS) +AC_SUBST(OS_SPECIFIC_LINKS) +AC_SUBST(SNDIO_LIBS) + +AC_SUBST(EXTERNAL_XIPH_CFLAGS) +AC_SUBST(EXTERNAL_XIPH_LIBS) +AC_SUBST(EXTERNAL_XIPH_REQUIRE) +AC_SUBST(SRC_BINDIR) +AC_SUBST(TEST_BINDIR) + +AC_CONFIG_FILES([ + Makefile Octave/Makefile + src/version-metadata.rc include/sndfile.h + tests/test_wrapper.sh tests/pedantic-header-test.sh + libsndfile.spec sndfile.pc + Scripts/build-test-tarball.mk + ]) +AC_OUTPUT + +dnl ==================================================================================== + +AS_IF([test -z "$PKG_CONFIG"], [ + AS_ECHO([" *****************************************************************"]) + AS_ECHO([" *** The pkg-config program is missing. ***"]) + AS_ECHO([" *** External FLAC/Ogg/Vorbis libs cannot be found without it. ***"]) + AS_ECHO([" *** http://pkg-config.freedesktop.org/wiki/ ***"]) + AS_ECHO([" *****************************************************************"]) + ]) + +AX_RECURSIVE_EVAL([$libdir], [full_absolute_libdir]) +AX_RECURSIVE_EVAL([$bindir], [full_absolute_bindir]) +AX_RECURSIVE_EVAL([$pkgconfigdir], [full_absolute_pkgconfigdir]) +AX_RECURSIVE_EVAL([$htmldir], [full_absolute_htmldir]) +AC_MSG_RESULT([ +-=-=-=-=-=-=-=-=-=-= Configuration Complete =-=-=-=-=-=-=-=-=-=-=- + + Configuration summary : + + libsndfile version : .................. ${VERSION} + + Host CPU : ............................ ${host_cpu} + Host Vendor : ......................... ${host_vendor} + Host OS : ............................. ${host_os} + + CFLAGS : .............................. ${CFLAGS} + CXXFLAGS : ............................ ${CXXFLAGS} + CPPFLAGS : ............................ ${CPPFLAGS} + LDFLAGS : ............................. ${LDFLAGS} + + Experimental code : ................... ${enable_experimental:-no} + Using ALSA in example programs : ...... ${enable_alsa:-no} + External FLAC/Ogg/Vorbis/Opus : ....... ${enable_external_libs:-no} + Building Octave interface : ........... ${OCTAVE_BUILD} + + Tools : + + C Compiler Vendor is : ................ ${ax_cv_c_compiler_vendor} (${ax_cv_c_compiler_version}) + CXX Compiler Vendor is : .............. ${ax_cv_cxx_compiler_vendor} (${ax_cv_cxx_compiler_version}) + + Sanitizer enabled : ................... ${enable_sanitizer:-no} + Stack smash protection : .............. ${enable_stack_smash_protection:-no} + + Installation directories : + + Library directory : ................... ${full_absolute_libdir} + Program directory : ................... ${full_absolute_bindir} + Pkgconfig directory : ................. ${full_absolute_pkgconfigdir} + HTML docs directory : ................. ${full_absolute_htmldir} + +Compiling some other packages against libsndfile may require +the addition of '$full_absolute_pkgconfigdir' to the +PKG_CONFIG_PATH environment variable. +]) + +dnl Remove symlink created by Scripts/android-configure.sh. +rm -f gdbclient diff --git a/libsndfile-1.0.31/docs/FAQ.md b/libsndfile-1.0.31/docs/FAQ.md new file mode 100644 index 0000000..cca4714 --- /dev/null +++ b/libsndfile-1.0.31/docs/FAQ.md @@ -0,0 +1,480 @@ +--- +layout: default +title: libsndfile : Frequently Asked Questions. +--- + +# libsndfile : Frequently Asked Questions + +1. [Do you plan to support XYZ codec in libsndfile?](#Q001) +2. [In version 0 the SF\_INFO struct had a pcmbitwidth field but version 1 does not. Why?](#Q002) +3. [Compiling is really slow on MacOS X. Why?](#Q003) +4. [When trying to compile libsndfile on Solaris I get a "bad substitution" error during linking. What can I do to fix this?](#Q004) +5. [Why doesn't libsndfile do interleaving/de-interleaving?](#Q005) +6. [What's the best format for storing temporary files?](#Q006) +7. [On Linux/Unix/MacOS X, what's the best way of detecting the presence of libsndfile?](#Q007) +8. [I have libsndfile installed and now I want to use it. I just want a simple Makefile\! What do I do?](#Q008) +9. [How about adding the ability to write/read sound files to/from memory buffers?](#Q009) +10. [Reading a 16 bit PCM file as normalised floats and then writing them back changes some sample values. Why?](#Q010) +11. [I'm having problems with u-law encoded WAV files generated by libsndfile in Winamp. Why?](#Q011) +12. [I'm looking at sf\_read\*. What are items? What are frames?](#Q012) +13. [Why can't libsndfile open this Sound Designer II (SD2) file?](#Q013) +14. [I'd like to statically link libsndfile to my closed source application. Can I buy a license so that this is possible?](#Q014) +15. [My program is crashing during a call to a function in libsndfile. Is this a bug in libsndfile?](#Q015) +16. [Will you accept a fix for compiling libsndfile with compiler X?](#Q016) +17. [Can libsndfile read/write files from/to UNIX pipes?](#Q017) +18. [Is it possible to build a Universal Binary on Mac OS X?](#Q018) +19. [I have project files for Visual Studio / XCode / Whatever. Why don't you distribute them with libsndfile?](#Q019) +20. [Why doesn't libsndfile support MP3?](#Q020) +21. [How do I use libsndfile in a closed source or commercial program and comply with the license?](#Q021) +22. [What versions of windows does libsndfile work on?](#Q022) +23. [I'm cross compiling libsndfile for another platform. How can I run the test suite?](#Q023) + +----- + +## Q1 : Do you plan to support XYZ codec in libsndfile? {#Q001} + +If source code for XYZ codec is available under a suitable license (LGPL, BSD, +MIT etc) then yes, I'd like to add it. + +If suitable documentation is available on how to decode and encode the format +then maybe, depending on how much work is involved. + +If XYZ is some proprietary codec where no source code or documentation is +available then no. + +So if you want support for XYZ codec, first find existing source code or +documentation. If you can't find either then the answer is no. + +## Q2 : In version 0 the SF\_INFO struct had a pcmbitwidth field but version 1 does not. Why? {#Q002} + +This was dropped for a number of reasons: + +- pcmbitwidth makes little sense on compressed or floating point formats +- with the new API you really don't need to know it + +As documented [here](api.md#note-1) there is now a well defined behaviour which +ensures that no matter what the bit width of the source file, the scaling always +does something sensible. This makes it safe to read 8, 16, 24 and 32 bit PCM +files using `sf_read_short()` and always have the optimal behaviour. + +## Q3 : Compiling is really slow on MacOS X. Why? {#Q003} + +When you configure and compile libsndfile, it uses the /bin/sh shell for a +number of tasks (ie configure script and libtool). Older versions of OS X +(10.2?) shipped a really crappy Bourne shell as /bin/sh which resulted in +**really** slow compiles. Newer version of OS X ship GNU Bash as /bin/sh and +this answer doesn't apply in that case. + +To fix this I suggest that you install the GNU Bash shell, rename /bin/sh to +/bin/sh.old and make a symlink from /bin/sh to the bash shell. Bash is designed +to behave as a Bourne shell when it is called as /bin/sh. + +When I did this on my iBook running MacOS X, compile times dropped from 13 +minutes to 3 minutes. + +## Q4 : When trying to compile libsndfile on Solaris I get a "bad substitution" error on linking. Why? {#Q004} + +It seems that the Solaris Bourne shell disagrees with GNU libtool. + +To fix this I suggest that you install the GNU Bash shell, rename /bin/sh to +/bin/sh.old and make a symlink from /bin/sh to the bash shell. Bash is designed +to behave as a Bourne shell when it is called as /bin/sh. + +## Q5 : Why doesn't libsndfile do interleaving/de-interleaving? {#Q005} + +This problem is bigger than it may seem at first. + +For a stereo file, it is a pretty safe bet that a simple interleaving/ +de-interleaving could satisfy most users. However, for files with more than 2 +channels this is unlikely to be the case. If the user has a 4 channel file and +want to play that file on a stereo output sound card they either want the first +2 channels or they want some mixed combination of the 4 channels. + +When you add more channels, the combinations grow exponentially and it becomes +increasingly difficult to cover even a sensible subset of the possible +combinations. On top of that, coding any one style of interleaver/de-interleaver +is trivial, while coding one that can cover all combinations is far from +trivial. This means that this feature will not be added any time soon. + +## Q6 : What's the best format for storing temporary files? {#Q006} + +When you want to store temporary data there are a number of requirements: + +- A simple, easy to parse header. +- The format must provide the fastest possible read and write rates (ie avoid + conversions and encoding/decoding). +- The file format must be reasonably common and playable by most players. +- Able to store data in either endian-ness. + +The format which best meets these requirements is AU, which allows data to be +stored in any one of short, int, float and double (among others) formats. + +For instance, if an application uses float data internally, its temporary files +should use a format of (SF_ENDIAN_CPU | SF_FORMAT_AU | SF_FORMAT_FLOAT) which +will store big endian float data in big endian CPUs and little endian float data +on little endian CPUs. Reading and writing this format will not require any +conversions or byte swapping regardless of the host CPU. + +## Q7 : On Linux/Unix/MaxOS X, what's the best way of detecting the presence of libsndfile using autoconf? {#Q007} + +libsndfile uses the pkg-config (man pkg-config) method of registering itself +with the host system. The best way of detecting its presence is using something +like this in configure.ac (or configure.in): + + PKG_CHECK_MODULES(SNDFILE, sndfile >= 1.0.2, ac_cv_sndfile=1, ac_cv_sndfile=0) + + AC_DEFINE_UNQUOTED([HAVE_SNDFILE],${ac_cv_sndfile}, + [Set to 1 if you have libsndfile.]) + + AC_SUBST(SNDFILE_CFLAGS) + AC_SUBST(SNDFILE_LIBS) + +This will automatically set the **SNDFILE_CFLAGS** and **SNDFILE_LIBS** +variables which can be used in Makefile.am like this: + + SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ + SNDFILE_LIBS = @SNDFILE_LIBS@ + +If you install libsndfile from source, you will probably need to set the +**PKG_CONFIG_PATH** environment variable as suggested at the end of the +libsndfile configure process. For instance on my system I get this: + + -=-=-=-=-=-=-=-=-=-= Configuration Complete =-=-=-=-=-=-=-=-=-=- + + Configuration summary : + + Version : ..................... 1.0.5 + Experimental code : ........... no + + Tools : + + Compiler is GCC : ............. yes + GCC major version : ........... 3 + + Installation directories : + + Library directory : ........... /usr/local/lib + Program directory : ........... /usr/local/bin + Pkgconfig directory : ......... /usr/local/lib/pkgconfig + + Compiling some other packages against libsndfile may require + the addition of "/usr/local/lib/pkgconfig" to the + PKG_CONFIG_PATH environment variable. + +## Q8 : I have libsndfile installed and now I want to use it. I just want a simple Makefile\! What do I do? {#Q008} + +The **pkg-config** program makes finding the correct compiler flag values and +library location far easier. During the installation of libsndfile, a file named +**sndfile.pc** is installed in the directory **${libdir}/pkgconfig** (ie if +libsndfile is installed in **/usr/local/lib**, **sndfile.pc** will be installed +in **/usr/local/lib/pkgconfig/**). + +In order for pkg-config to find sndfile.pc it may be necessary to point the +environment variable **PKG_CONFIG_PATH** in the right direction. + + export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig + +Then, to compile a C file into an object file, the command would be: + + gcc `pkg-config --cflags sndfile` -c somefile.c + +and to link a number of objects into an executable that links against +libsndfile, the command would be: + + gcc `pkg-config --libs sndfile` obj1.o obj2.o -o program + +## Q9 : How about adding the ability to write/read sound files to/from memory buffers? {#Q009} + +This has been [added](api.md#open_virtual) for version 1.0.12. + +## Q10 : Reading a 16 bit PCM file as normalised floats and then writing them back changes some sample values. Why? {#Q010} + +This is caused by the fact that the conversion from 16 bit short to float is +done by dividing by 32768 (0x8000 in hexadecimal) while the conversion from +float to 16 bit short is done by multiplying by 32767 (0x7FFF in hex). So for +instance, a value in a 16 bit PCM file of 20000 gets read as a floating point +number of 0.6103515625 (20000.0 / 0x8000). Converting that back to a 16 bit +short results in a value of 19999.3896484375 (0.6103515625 \* 0x7FFF) which then +gets rounded down to 19999. + +You will notice that for this particular case, the error is 1 in 20000 or +0.005%. Interestingly, for values of less than 16369, dividing by 0x8000 +followed by multiplying by 0x7FFF and then rounding the result, gives back the +original value. It turns out that as long as the host operating system supplies +the 1999 ISO C Standard functions **lrintf** and **lrint** (or a replacement has +been supplied) then the maximum possible error is 1 in 16369 or about 0.006%. + +Regardless of the size of the error, the reason why this is done is rather +subtle. + +In a file containing 16 bit PCM samples, the values are restricted to the range +[-32768, 32767] while we want floating point values in the range [-1.0, 1.0]. +The only way to do this conversion is to do a floating point division by a value +of 0x8000. Converting the other way, the only way to ensure that floating point +values in the range [-1.0, 1.0] are within the valid range allowed by a 16 bit +short is to multiply by 0x7FFF. + +Some people would say that this is a severe short-coming of libsndfile. I would +counter that anybody who is constantly converting back and forth between 16 bit +shorts and normalised floats is going to suffer other losses in audio quality +that they should also be concerned about. + +Since this problem only occurs when converting between integer data on disk and +normalized floats in the application, it can be avoided by using something other +than normalized floats in the application. Alternatives to normalized floats are +the **short** and **int** data types (ie using sf_read_short or sf_read_int) or +using un-normalized floats (see +[SFC_SET_NORM_FLOAT](command.html#sfc_set_norm_float)). + +Another way to deal with this problem is to consider 16 bit short data as a +final destination format only, not as an intermediate storage format. All +intermediate data (ie which is going to be processed further) should be stored +in floating point format which is supported by all of the most common file +formats. If floating point files are considered too large (2 times the size of a +16 bit PCM file), it would also be possible to use 24 bit PCM as an intermediate +storage format (and which is also supported by most common file types). + +## Q11 : I'm having problems with u-law encoded WAV files generated by libsndfile in Winamp. Why? {#Q011} + +This is actually a Winamp problem. The official Microsoft spec suggests that the +'fmt ' chunk should be 18 bytes. Unfortunately at least one of Microsoft's own +applications (Sound Recorder on Win98 I believe) did not accept 18 bytes 'fmt ' +chunks. + +Michael Lee did some experimenting and found that: + +> I have checked that Windows Media Player 9, QuickTime Player 6.4, RealOne +> Player 2.0 and GoldWave 5.06 can all play u-law files with 16-byte or 18-byte +> 'fmt ' chunk. Only Winamp (2.91) and foobar2000 are unable to play u-law files +> with 16-byte 'fmt ' chunk. + +Even this is a very small sampling of all the players out there. For that reason +it is probably not a good idea to change this now because there is the risk of +breaking something that currently works. + +## Q12 : I'm looking at sf_read*. What are items? What are frames? {#Q012} + +An `item` is a single sample of the data type you are reading; ie a single +`short` value for `sf_read_short` or a single `float` for `sf_read_float`. + +For a sound file with only one channel, a frame is the same as a item (ie a +single sample) while for multi channel sound files, a single frame contains a +single item for each channel. + +Here are two simple, correct examples, both of which are assumed to be working +on a stereo file, first using items: + +```c +#define CHANNELS 2 +short data [CHANNELS * 100] ; +sf_count items_read = sf_read_short (file, data, 200) ; +assert (items_read == 200) ; +``` + +and now reading the exact same amount of data using frames: + +```c +#define CHANNELS 2 +short data [CHANNELS * 100] ; +sf_count frames_read = sf_readf_short (file, data, 100) ; +assert (frames_read == 100) ; +``` + +## Q13 : Why can't libsndfile open this Sound Designer II (SD2) file? {#Q013} + +This is somewhat complicated. First some background. + +SD2 files are native to the Apple Macintosh platform and use features of the Mac +filesystem (file resource forks) to store the file's sample rate, number of +channels, sample width and more. When you look at a file and its resource fork +on Mac OS X it looks like this: + + -rw-r--r-- 1 erikd erikd 46512 Oct 18 22:57 file.sd2 + -rw-r--r-- 1 erikd erikd 538 Oct 18 22:57 file.sd2/rsrc + +Notice how the file itself looks like a directory containing a single file named +**rsrc**. When libsndfile is compiled for MacOS X, it should open (for write and +read) SD2 file with resource forks like this without any problems. It will also +handle files with the resource fork in a separate file as described below. + +When SD2 files are moved to other platforms, the resource fork of the file can +sometimes be dropped altogether. All that remains is the raw audio data and no +information about the number of channels, sample rate or bit width which makes +it a little difficult for libsndfile to open the file. + +However, it is possible to safely move an SD2 file to a Linux or Windows +machine. For instance, when an SD2 file is copied from inside MacOS X to a +windows shared directory or a Samba share (ie Linux), MacOS X is clever enough +to store the resource fork of the file in a separate hidden file in the same +directory like this: + + -rw-r--r-- 1 erikd erikd 538 Oct 18 22:57 ._file.sd2 + -rw-r--r-- 1 erikd erikd 46512 Oct 18 22:57 file.sd2 + +Regardless of what platform it is running on, when libsndfile is asked to open a +file named **"foo"** and it can't recognize the file type from the data in the +file, it will attempt to open the resource fork and if that fails, it then tries +to open a file named **"._foo"** to see if the file has a valid resource fork. +This is the same regardless of whether the file is being opened for read or +write. + +In short, libsndfile should open SD2 files with a valid resource fork on all of +the platforms that libsndfile supports. If a file has lost its resource fork, +the only option is the open the file using the SF_FORMAT_RAW option and guessing +its sample rate, channel count and bit width. + +Occasionally, when SD2 files are moved to other systems, the file is +[BinHexed](http://www.macdisk.com/binhexen.php3) which wraps the resource fork +and the data fork together. For these files, it would be possible to write a +BinHex parser but there is not a lot to gain considering how rare these BinHexed +SD2 files are. + +## Q14 : I'd like to statically link libsndfile to my closed source application. Can I buy a license so that this is possible? {#Q014} + +Unfortunately no. libsndfile contains code written by other people who have +agreed that their code be used under the GNU LGPL but no more. Even if they were +to agree, there would be significant difficulties in dividing up the payments +fairly. + +The **only** way you can legally use libsndfile as a statically linked library +is if your application is released under the GNU GPL or LGPL. + +## Q15 : My program is crashing during a call to a function in libsndfile. Is this a bug in libsndfile? {#Q015} + +libsndfile is being used by large numbers of people all over the world without +any problems like this. That means that it is much more likely that your code +has a bug than libsndfile. However, it is still possible that there is a bug in +libsndfile. + +To figure out whether it is your code or libsndfile you should do the following: + +- Make sure you are compiling your code with warnings switched on and that you + fix as many warnings as possible. With the GNU compiler (gcc) I would + recommend at least **-W -Wall -Werror** which will force you to fix all + warnings before you can run the code. +- Try using a memory debugger. [Valgrind](http://valgrind.kde.org/) on x86 Linux + is excellent. [Purify](http://www.ibm.com/software/awdtools/purify/) also has + a good reputation. +- If the code is clean after the above two steps and you still get a crash in + libsndfile, then send me a small snippet of code (no more than 30-40 lines) + which includes the call to sf_open() and also shows how all variables passed + to/returned from sf_open() are defined. + +## Q16 : Will you accept a fix for compiling libsndfile with compiler X? {#Q016} + +If compiler X is a C++ compiler then no. C and C++ are different enough to make +writing code that compiles as valid C and valid C++ too difficult. I would +rather spend my time fixing bugs and adding features. + +If compiler X is a C compiler then I will do what I can as long as that does not +hamper the correctness, portability and maintainability of the existing code. It +should be noted however that libsndfile uses features specified by the 1999 ISO +C Standard. This can make compiling libsndfile with some older compilers +difficult. + +## Q17 : Can libsndfile read/write files from/to UNIX pipes? {#Q017} + +Yes, libsndfile can read files from pipes. Unfortunately, the write case is much +more complicated. + +File formats like AIFF and WAV have information at the start of the file (the +file header) which states the length of the file, the number of sample frames +etc. This information must be filled in correctly when the file header is +written, but this information is not reliably known until the file is closed. +This means that libsndfile cannot write AIFF, WAV and many other file types to a +pipe. + +However, there is at least one file format (AU) which is specifically designed +to be written to a pipe. Like AIFF and WAV, AU has a header with a sample frames +field, but it is specifically allowable to set that frames field to 0x7FFFFFFF +if the file length is not known when the header is written. The AU file format +can also hold data in many of the standard formats (ie SF_FORMAT_PCM_16, +SF_FORMAT_PCM_24, SF_FORMAT_FLOAT etc) as well as allowing data in both big and +little endian format. + +See also [FAQ Q6](#Q006). + +## Q18 : Is it possible to build a Universal Binary on Mac OS X? {#Q018} + +Yes, but you must do two separate configure/build/test runs; one on PowerPC and +one on Intel. It is then possible to merge the binaries into a single universal +binary using one of the programs in the Apple tool chain. + +It is **not** possible to build a working universal binary via a single +compile/build run on a single CPU. + +The problem is that the libsndfile build process detects features of the CPU its +being built for during the configure process and when building a universal +binary, configure is only run once and that data is then used for both CPUs. +That configure data will be wrong for one of those CPUs. You will still be able +to compile libsndfile, and the test suite will pass on the machine you compiled +it on. However, if you take the universal binary test suite programs compiled on +one CPU and run them on the other, the test suite will fail. + +Part of the problem is that the CPU endian-ness is detected at configure time. +Yes, I know the Apple compiler defines one of the macros \_\_LITTLE\_ENDIAN\_\_ +and \_\_BIG\_ENDIAN\_\_, but those macros are not part of the 1999 ISO C +Standard and they are not portable. + +Endian issues are not the only reason why the cross compiled binary will fail. +The configure script also detects other CPU specific idiosyncrasies to provide +more optimized code. + +Finally, the real show stopper problem with universal binaries is the problem +with the test suite. libsndfile contains a huge, comprehensive test suite. When +you compile a universal binary and run the test suite, you only test the native +compile. The cross compiled binary (the one with the much higher chance of +having problems) cannot be tested. + +Now, if you have read this far you're probably thinking there must be a way to +fix this and there probably is. The problem is that its a hell of a lot of work +and would require significant changes to the configure process, the internal +code and the test suite. In addition, these changes must not break compilation +on any of the platforms libsndfile is currently working on. + +## Q19 : I have project files for Visual Studio / XCode / Whatever. Why don't you distribute them with libsndfile? {#Q019} + +Use CMake project. + +## Q20 : Why doesn't libsndfile support MP3? {#Q020} + +In the past, MP3 was not supported because the technology behind MP3 was +patented. Those patents have now expired and there is an +[open ticket](https://github.com/libsndfile/libsndfile/issues/258) to implement +MP3 support. + +## Q21 : How do I use libsndfile in a closed source or commercial program and comply with the license? {#Q021} + +Here is a checklist of things you need to do to make sure your use of libsndfile +in a closed source or commercial project complies with the license libsndfile is +released under, the GNU Lesser General Public License (LGPL): + +- Make sure you are linking to libsndfile as a shared library (Linux and Unix + systems), Dynamic Link Library (Microsoft Windows) or dynlib (Mac OS X). If + you are using some other operating system that doesn't allow dynamically + linked libraries, you will not be able to use libsndfile unless you release + the source code to your program. +- In the licensing documentation for your program, add a statement that your + software depends on libsndfile and that libsndfile is released under the GNU + Lesser General Public License, either + [version 2.1](http://www.gnu.org/licenses/lgpl-2.1.txt) or optionally + [version 3](http://www.gnu.org/licenses/lgpl.txt). +- Include the text for both versions of the license, possibly as separate files + named libsndfile_lgpl_v2_1.txt and libsndfile_lgpl_v3.txt. + +## Q22 : What versions of Windows does libsndfile work on? {#Q022} + +New versions of libsndfile binary releases require Wiindows Vista. If you need +Windows XP support, you can build DLL from sources, we don't use specific WinXP +features. + +## Q23 : I'm cross compiling libsndfile for another platform. How can I run the test suite? {#Q023} + +Since version 1.0.21 the top level Makefile has an extra make target, +'test-tarball'. Building this target creates a tarball called called: + + ` libsndfile-testsuite-${host_triplet}-${version}.tar.gz` + +in the top level directory. This tarball can then be copied to the target +platform. Once untarred and test script `test_wrapper.sh` can be run from the +top level of the extracted tarball. diff --git a/libsndfile-1.0.31/docs/api.md b/libsndfile-1.0.31/docs/api.md new file mode 100644 index 0000000..f009b74 --- /dev/null +++ b/libsndfile-1.0.31/docs/api.md @@ -0,0 +1,736 @@ +--- +layout: page +title: The libsndfile API +--- + +# libsndfile + +Libsndfile is a library designed to allow the reading and writing of many different sampled sound file formats (such as +MS Windows WAV and the Apple/SGI AIFF format) through one standard library interface. + +During read and write operations, formats are seamlessly converted between the format the application program has +requested or supplied and the file's data format. The application programmer can remain blissfully unaware of issues +such as file endian-ness and data format. See [Note 1](#note-1) and [Note 2](#note-2). + +Every effort is made to keep these documents up-to-date, error free and unambiguous. However, since maintaining the +documentation is the least fun part of working on libsndfile, these docs can and do fall behind the behaviour of the +library. If any errors, omissions or ambiguities are found, please notify me (erikd) at mega-nerd dot com. + +To supplement this reference documentation, there are simple example programs included in the source code tarball. The +test suite which is also part of the source code tarball is also a good place to look for the correct usage of the +library functions. + +**Finally, if you think there is some feature missing from libsndfile, check that it isn't already implemented (and +documented) [here](command.md).** + +## Synopsis + +```c +#include ; +#include ; +``` + +| Name | Description | +|:------------------------------------------------------------------------------------------------------------|:--------------------------------------- | +| [sf_open, sf_wchar_open](#open) | File open functions. | +| [sf_open_fd](#open_fd) | Open sound file using file descriptor. | +| [sf_open_virtual](#open_virtual) | Open sound file using virtual API. | +| [sf_format_check](#check) | Validate sound file info. | +| [sf_seek](#seek) | Seek position in sound file. | +| [sf_command](command.md) | Command interface. | +| [sf_error, sf_strerror, sf_error_number, sf_perror, sf_error_str](#error) | Error functions. | +| [sf_close](#close) | File close function. | +| [sf_write_sync](#write_sync) | Write sync function. | +| [sf_read_short, sf_read_int, sf_read_float, sf_read_double](#read) | File items read functions. | +| [sf_readf_short, sf_readf_int, sf_readf_float, sf_readf_double](#readf) | File frames read functions. | +| [sf_write_short, sf_write_int, sf_write_float, sf_write_double](#write) | File items write functions. | +| [sf_writef_short, sf_writef_int, sf_writef_float, sf_writef_double](#writef) | File frames write functions. | +| [sf_read_raw, sf_write_raw](#raw) | Raw read/write functions. | +| [sf_get_string, sf_set_string](#string) | Functions for reading and writing string data. | +| [sf_version_string](#version_string) | Retrive library version string. | +| [sf_current_byterate](#current_byterate) | Retrieve current byterate. | +| [sf_set_chunk, sf_get_chunk_iterator, sf_next_chunk_iterator, sf_get_chunk_size, sf_get_chunk_data](#chunk) | RIFF chunks API. | + +SNDFILE* is an anonymous pointer to data which is private to the library. + +## File Open Function {#open} + +```c +SNDFILE* sf_open (const char *path, int mode, SF_INFO *sfinfo) ; +``` + +The sf_open() function opens the sound file at the specified path. The filename is byte encoded, but may be utf-8 on +Linux, while on Mac OS X it will use the filesystem character set. On Windows, there is also a Windows specific +sf_wchar_open() that takes a UTF16_BE encoded filename. + +```c +SNDFILE* sf_wchar_open (LPCWSTR wpath, int mode, SF_INFO *sfinfo) ; +``` + +The SF_INFO structure is for passing data between the calling function and the library when opening a file for reading +or writing. It is defined in sndfile.h as follows: + +```c +typedef struct +{ sf_count_t frames ; /* Used to be called samples. */ + int samplerate ; + int channels ; + int format ; + int sections ; + int seekable ; + } SF_INFO ; +``` + +The mode parameter for this function can be any one of the following three values: + +SFM_READ +: read only mode + +SFM_WRITE +: write only mode + +SFM_RDWR +: read/write mode + +When opening a file for read, the **format** field should be set to zero before +calling **sf_open**(). The only exception to this is the case of RAW files where +the caller has to set the **samplerate**, **channels** and **format** fields to +valid values. All other fields of the structure are filled in by the library. + +When opening a file for write, the caller must fill in structure members +**samplerate**, **channels**, and **format**. + +The **format** field in the above **SF_INFO** structure is made up of the +bit-wise OR of a major format type (values between 0x10000 and 0x08000000), a +minor format type (with values less than 0x10000) and an optional endian-ness +value. The currently understood formats are listed in *sndfile.h* as follows and +also include bitmasks for separating major and minor file types. Not all +combinations of endian-ness and major and minor file types are valid. + +| Name | Value | Description | +|:-----------------------|:-----------|:-------------------------------------------| +| **Major formats.** | +| SF_FORMAT_WAV | 0x010000 | Microsoft WAV format (little endian). | +| SF_FORMAT_AIFF | 0x020000 | Apple/SGI AIFF format (big endian). | +| SF_FORMAT_AU | 0x030000 | Sun/NeXT AU format (big endian). | +| SF_FORMAT_RAW | 0x040000 | RAW PCM data. | +| SF_FORMAT_PAF | 0x050000 | Ensoniq PARIS file format. | +| SF_FORMAT_SVX | 0x060000 | Amiga IFF / SVX8 / SV16 format. | +| SF_FORMAT_NIST | 0x070000 | Sphere NIST format. | +| SF_FORMAT_VOC | 0x080000 | VOC files. | +| SF_FORMAT_IRCAM | 0x0A0000 | Berkeley/IRCAM/CARL | +| SF_FORMAT_W64 | 0x0B0000 | Sonic Foundry's 64 bit RIFF/WAV | +| SF_FORMAT_MAT4 | 0x0C0000 | Matlab (tm) V4.2 / GNU Octave 2.0 | +| SF_FORMAT_MAT5 | 0x0D0000 | Matlab (tm) V5.0 / GNU Octave 2.1 | +| SF_FORMAT_PVF | 0x0E0000 | Portable Voice Format | +| SF_FORMAT_XI | 0x0F0000 | Fasttracker 2 Extended Instrument | +| SF_FORMAT_HTK | 0x100000 | HMM Tool Kit format | +| SF_FORMAT_SDS | 0x110000 | Midi Sample Dump Standard | +| SF_FORMAT_AVR | 0x120000 | Audio Visual Research | +| SF_FORMAT_WAVEX | 0x130000 | MS WAVE with WAVEFORMATEX | +| SF_FORMAT_SD2 | 0x160000 | Sound Designer 2 | +| SF_FORMAT_FLAC | 0x170000 | FLAC lossless file format | +| SF_FORMAT_CAF | 0x180000 | Core Audio File format | +| SF_FORMAT_WVE | 0x190000 | Psion WVE format | +| SF_FORMAT_OGG | 0x200000 | Xiph OGG container | +| SF_FORMAT_MPC2K | 0x210000 | Akai MPC 2000 sampler | +| SF_FORMAT_RF64 | 0x220000 | RF64 WAV file | +| **Subtypes.** | +| SF_FORMAT_PCM_S8 | 0x0001 | Signed 8 bit data | +| SF_FORMAT_PCM_16 | 0x0002 | Signed 16 bit data | +| SF_FORMAT_PCM_24 | 0x0003 | Signed 24 bit data | +| SF_FORMAT_PCM_32 | 0x0004 | Signed 32 bit data | +| SF_FORMAT_PCM_U8 | 0x0005 | Unsigned 8 bit data (WAV and RAW only) | +| SF_FORMAT_FLOAT | 0x0006 | 32 bit float data | +| SF_FORMAT_DOUBLE | 0x0007 | 64 bit float data | +| SF_FORMAT_ULAW | 0x0010 | U-Law encoded. | +| SF_FORMAT_ALAW | 0x0011 | A-Law encoded. | +| SF_FORMAT_IMA_ADPCM | 0x0012 | IMA ADPCM. | +| SF_FORMAT_MS_ADPCM | 0x0013 | Microsoft ADPCM. | +| SF_FORMAT_GSM610 | 0x0020 | GSM 6.10 encoding. | +| SF_FORMAT_VOX_ADPCM | 0x0021 | OKI / Dialogix ADPCM | +| SF_FORMAT_NMS_ADPCM_16 | 0x0022 | 16kbs NMS G721-variant encoding. | +| SF_FORMAT_NMS_ADPCM_24 | 0x0023 | 24kbs NMS G721-variant encoding. | +| SF_FORMAT_NMS_ADPCM_32 | 0x0024 | 32kbs NMS G721-variant encoding. | +| SF_FORMAT_G721_32 | 0x0030 | 32kbs G721 ADPCM encoding. | +| SF_FORMAT_G723_24 | 0x0031 | 24kbs G723 ADPCM encoding. | +| SF_FORMAT_G723_40 | 0x0032 | 40kbs G723 ADPCM encoding. | +| SF_FORMAT_DWVW_12 | 0x0040 | 12 bit Delta Width Variable Word encoding. | +| SF_FORMAT_DWVW_16 | 0x0041 | 16 bit Delta Width Variable Word encoding. | +| SF_FORMAT_DWVW_24 | 0x0042 | 24 bit Delta Width Variable Word encoding. | +| SF_FORMAT_DWVW_N | 0x0043 | N bit Delta Width Variable Word encoding. | +| SF_FORMAT_DPCM_8 | 0x0050 | 8 bit differential PCM (XI only) | +| SF_FORMAT_DPCM_16 | 0x0051 | 16 bit differential PCM (XI only) | +| SF_FORMAT_VORBIS | 0x0060 | Xiph Vorbis encoding. | +| SF_FORMAT_OPUS | 0x0064 | Xiph/Skype Opus encoding. | +| SF_FORMAT_ALAC_16 | 0x0070 | Apple Lossless Audio Codec (16 bit). | +| SF_FORMAT_ALAC_20 | 0x0071 | Apple Lossless Audio Codec (20 bit). | +| SF_FORMAT_ALAC_24 | 0x0072 | Apple Lossless Audio Codec (24 bit). | +| SF_FORMAT_ALAC_32 | 0x0073 | Apple Lossless Audio Codec (32 bit). | +| **Endian-ness options.** | +| SF_ENDIAN_FILE | 0x00000000 | Default file endian-ness. | +| SF_ENDIAN_LITTLE | 0x10000000 | Force little endian-ness. | +| SF_ENDIAN_BIG | 0x20000000 | Force big endian-ness. | +| SF_ENDIAN_CPU | 0x30000000 | Force CPU endian-ness. | +| SF_FORMAT_SUBMASK | 0x0000FFFF | | +| SF_FORMAT_TYPEMASK | 0x0FFF0000 | | +| SF_FORMAT_ENDMASK | 0x30000000 | | + +Every call to **sf_open**() should be matched with a call to +[**sf_close**()](#close) to free up memory allocated during the call to **sf_open**(). + +On success, the sf_open function returns a non-NULL pointer which should be passed as the first parameter to all +subsequent libsndfile calls dealing with that audio file. On fail, the sf_open function returns a NULL pointer. An +explanation of the error can obtained by passing NULL to [**sf_strerror**()](#error). + +### File Descriptor Open {#open_fd} + +```c +SNDFILE* sf_open_fd (int fd, int mode, SF_INFO *sfinfo, int close_desc) ; +``` + +**Note:** On Microsoft Windows, this function does not work if the application +and the libsndfile DLL are linked to different versions of the Microsoft C +runtime DLL. + +The second open function takes a file descriptor of a file that has already been +opened. Care should be taken to ensure that the mode of the file represented by +the descriptor matches the mode argument. This function is useful in the +following circumstances: + +* Opening temporary files securely (ie use the **tmpfile**() to return a FILE* + pointer and then using fileno() to retrieve the file descriptor which is then + passed to libsndfile). +* Opening files with file names using OS specific character encodings and then + passing the file descriptor to **sf_open_fd**(). +* Opening sound files embedded within larger files. [More info](embedded_files.md). + +Every call to `sf_open_fd`() should be matched with a call to sf_close() to free +up memory allocated during the call to sf_open_fd(). + +When sf_close() is called, the file descriptor is only closed if the +**close_desc** parameter was TRUE when the sf_open_fd() function was called. + +On success, the sf_open_fd() function returns a non-NULL pointer which should be +passed as the first parameter to all subsequent libsndfile calls dealing with +that audio file. On fail, the sf_open_fd() function returns a NULL pointer. + +### Virtual File Open Function {#open_virtual} + +```c +SNDFILE* sf_open_virtual (SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user_data) ; +``` + +Opens a soundfile from a virtual file I/O context which is provided by the +caller. This is usually used to interface libsndfile to write/read from memory +with a stream or buffer based system. Apart from the sfvirtual and the user_data +parameters this function behaves like [sf_open()](#open). + +```c + typedef struct + { sf_vio_get_filelen get_filelen ; + sf_vio_seek seek ; + sf_vio_read read ; + sf_vio_write write ; + sf_vio_tell tell ; + } SF_VIRTUAL_IO ; +``` + +Libsndfile calls the callbacks provided by the SF_VIRTUAL_IO structure when +opening, reading and writing to the virtual file context. The user_data pointer +is a user defined context which will be available in the callbacks. + +```c +typedef sf_count_t (*sf_vio_get_filelen) (void *user_data) ; +typedef sf_count_t (*sf_vio_seek) (sf_count_t offset, int whence, void *user_data) ; +typedef sf_count_t (*sf_vio_read) (void *ptr, sf_count_t count, void *user_data) ; +typedef sf_count_t (*sf_vio_write) (const void *ptr, sf_count_t count, void *user_data) ; +typedef sf_count_t (*sf_vio_tell) (void *user_data) ; +``` + +#### sf_vio_get_filelen + +```c +typedef sf_count_t (*sf_vio_get_filelen) (void *user_data) ; +``` + +The virtual file contex must return the length of the virtual file in bytes. + +#### sf_vio_seek + +```c +typedef sf_count_t (*sf_vio_seek) (sf_count_t offset, int whence, void *user_data) ; +``` + +The virtual file context must seek to offset using the seek mode provided by +whence which is one of SEEK_CUR, SEEK_SET, SEEK_END. + +The return value must contain the new offset in the file. + +#### sf_vio_read + +```c +typedef sf_count_t (*sf_vio_read) (void *ptr, sf_count_t count, void *user_data) ; +``` + +The virtual file context must copy ("read") "count" bytes into the buffer +provided by ptr and return the count of actually copied bytes. + +#### sf_vio_write + +```c +typedef sf_count_t (*sf_vio_write) (const void *ptr, sf_count_t count, void *user_data) ; +``` + +The virtual file context must process "count" bytes stored in the buffer passed +with ptr and return the count of actually processed bytes. + +#### sf_vio_tell + +```c +typedef sf_count_t (*sf_vio_tell) (void *user_data) ; +``` + +Return the current position of the virtual file context. + +## Format Check Function {#chek} + +```c +int sf_format_check (const SF_INFO *info) ; +``` + +This function allows the caller to check if a set of parameters in the SF_INFO +struct is valid before calling [sf_open](#open) (SFM_WRITE). + +sf_format_check() returns TRUE if the parameters are valid and FALSE otherwise. + +## File Seek Functions + +```c +sf_count_t sf_seek (SNDFILE *sndfile, sf_count_t frames, int whence) ; +``` + +The file seek functions work much like lseek in unistd.h with the exception that +the non-audio data is ignored and the seek only moves within the audio data +section of the file. In addition, seeks are defined in number of (multichannel) +frames. Therefore, a seek in a stereo file from the current position forward +with an offset of 1 would skip forward by one sample of both channels. + +like lseek(), the whence parameter can be any one of the following three values: + +SEEK_SET +: The offset is set to the start of the audio data plus offset (multichannel) +frames. + +SEEK_CUR +: The offset is set to its current location plus offset (multichannel) frames. + +SEEK_END +: The offset is set to the end of the data plus offset (multichannel) frames. + +Internally, libsndfile keeps track of the read and write locations using +separate read and write pointers. If a file has been opened with a mode of +SFM_RDWR, bitwise OR-ing the standard whence values above with either SFM_READ +or SFM_WRITE allows the read and write pointers to be modified separately. +If the SEEK_* values are used on their own, the read and write pointers are +both modified. + +Note that the frames offset can be negative and in fact should be when SEEK_END +is used for the whence parameter. + +sf_seek will return the offset in (multichannel) frames from the start of the +audio data or -1 if an error occured (ie an attempt is made to seek beyond the +start or end of the file). + +## Error Reporting Functions {#error} + +```c +int sf_error (SNDFILE *sndfile) ; +``` + +This function returns the current error number for the given SNDFILE. + +The error number may be one of the following: + +| Name | Value | +|:----------------------------|:------| +| SF_ERR_NO_ERROR | 0 | +| SF_ERR_UNRECOGNISED_FORMAT | 1 | +| SF_ERR_SYSTEM | 2 | +| SF_ERR_MALFORMED_FILE | 3 | +| SF_ERR_UNSUPPORTED_ENCODING | 4 | + +or any one of many other internal error values. +Applications should only test the return value against error values defined in +\; as the internal error values are subject to change at any time. +For errors not in the above list, the function sf_error_number() can be used to +convert it to an error string. + +```c +const char* sf_strerror (SNDFILE *sndfile) ; +const char* sf_error_number (int errnum) ; +``` + +The error functions sf_strerror () and sf_error_number () convert the library's +internal error enumerations into text strings. + +```c +int sf_perror (SNDFILE *sndfile) ; +int sf_error_str (SNDFILE *sndfile, char* str, size_t len) ; +``` + +The functions sf_perror() and sf_error_str() are deprecated and will be dropped +from the library at some later date. + +## File Close Function {#close} + +```c +int sf_close (SNDFILE *sndfile) ; +``` + +The close function closes the file, deallocates its internal buffers and returns +0 on success or an error value otherwise. + +## Write Sync Function {#write_sync} + +```c +void sf_write_sync (SNDFILE *sndfile) ; +``` + +If the file is opened SFM_WRITE or SFM_RDWR, call the operating system's +function to force the writing of all file cache buffers to disk. If the file is +opened SFM_READ no action is taken. + +## File Read Functions {#read} + +```c +sf_count_t sf_read_short (SNDFILE *sndfile, short *ptr, sf_count_t items) ; +sf_count_t sf_read_int (SNDFILE *sndfile, int *ptr, sf_count_t items) ; +sf_count_t sf_read_float (SNDFILE *sndfile, float *ptr, sf_count_t items) ; +sf_count_t sf_read_double (SNDFILE *sndfile, double *ptr, sf_count_t items) ; +``` + +{: #readf} +```c +sf_count_t sf_readf_short (SNDFILE *sndfile, short *ptr, sf_count_t frames) ; +sf_count_t sf_readf_int (SNDFILE *sndfile, int *ptr, sf_count_t frames) ; +sf_count_t sf_readf_float (SNDFILE *sndfile, float *ptr, sf_count_t frames) ; +sf_count_t sf_readf_double (SNDFILE *sndfile, double *ptr, sf_count_t frames) ; +``` + +The file read functions fill the array pointed to by ptr with the requested +number of items or frames. + +For the frames-count functions, the frames parameter specifies the number of +frames. A frame is just a block of samples, one for each channel. + +**Care must be taken to ensure that there is enough space in the array pointed +to by ptr, to take (frames \* channels) number of items (shorts, ints, floats or +doubles).** + +For the items-count functions, the items parameter must be an integer product +of the number of channels or an error will occur. Here, an item is just a +sample. + +Note: The only difference between the "items" and "frames" versions of each read +function is the units in which the object count is specified - calling +sf_readf_short() with a count argument of N, on a SNDFILE with C channels, is +the same as calling sf_read_short with a count argument of N\*C. The buffer +pointed to by "ptr" should be the same number of bytes in each case. + +Note: The data type used by the calling program and the data format of the file +do not need to be the same. For instance, it is possible to open a 16 bit PCM +encoded WAV file and read the data using sf_read_float(). The library seamlessly +converts between the two formats on-the-fly. See [Note 1](#note-1). + +The sf_read_XXXX and sf_readf_XXXX functions return the number of items or +frames read, respectively. Unless the end of the file was reached during the +read, the return value should equal the number of objects requested. Attempts to +read beyond the end of the file will not result in an error but will cause the +read functions to return less than the number of objects requested or 0 if +already at the end of the file. When the buffer is not is not completely filled, +unused buffer space is filled by zeroes. + +## File Write Functions {#write} + +```c +sf_count_t sf_write_short (SNDFILE *sndfile, short *ptr, sf_count_t items) ; +sf_count_t sf_write_int (SNDFILE *sndfile, int *ptr, sf_count_t items) ; +sf_count_t sf_write_float (SNDFILE *sndfile, float *ptr, sf_count_t items) ; +sf_count_t sf_write_double (SNDFILE *sndfile, double *ptr, sf_count_t items) ; +``` + +{: #writef} +```c +sf_count_t sf_writef_short (SNDFILE *sndfile, short *ptr, sf_count_t frames) ; +sf_count_t sf_writef_int (SNDFILE *sndfile, int *ptr, sf_count_t frames) ; +sf_count_t sf_writef_float (SNDFILE *sndfile, float *ptr, sf_count_t frames) ; +sf_count_t sf_writef_double (SNDFILE *sndfile, double *ptr, sf_count_t frames) ; +``` + +The file write functions write the data in the array pointed to by ptr to the +file. + +For items-count functions, the items parameter specifies the size of the array +and must be an integer product of the number of channels or an error will occur. + +For the frames-count functions, the array is expected to be large enough to hold +a number of items equal to the product of frames and the number of channels. + +As with the read functions [above](#read), the only difference in the items and +frames version of each write function is the units in which the buffer size is +specified. Again, the data type used by the calling program and the data format +of the file do not need to be the same ([Note 1](#note-1)). + +The sf_write_XXXX and sf_writef_XXXX functions respectively return the number of +items or frames written (which should be the same as the items or frames +parameter). + +## Raw File Read and Write Functions {#raw} + +```c +sf_count_t sf_read_raw (SNDFILE *sndfile, void *ptr, sf_count_t bytes) ; +sf_count_t sf_write_raw (SNDFILE *sndfile, void *ptr, sf_count_t bytes) ; +``` + +**Note:** Unless you are writing an external decoder/encode that uses libsndfile +to handle the file headers, you should not be using these functions. + +The raw read and write functions read raw audio data from the audio file (not to +be confused with reading RAW header-less PCM files). The number of bytes read or +written must always be an integer multiple of the number of channels multiplied +by the number of bytes required to represent one sample from one channel. + +The raw read and write functions return the number of bytes read or written +(which should be the same as the bytes parameter). + +**Note : The result of using of both regular reads/writes and raw reads/writes +on compressed file formats other than SF_FORMAT_ALAW and SF_FORMAT_ULAW is +undefined.** + +See also : [SFC_RAW_NEEDS_ENDSWAP](command.md#sfc_raw_needs_endswap). + +## Functions for Reading and Writing String Data {#string} + +```c +const char* sf_get_string (SNDFILE *sndfile, int str_type) ; +int sf_set_string (SNDFILE *sndfile, int str_type, const char* str) ; +``` + +These functions allow strings to be set on files opened for write and to be +retrieved from files opened for read where supported by the given file type. The +**str_type** parameter can be any one of the following string types: + +| Name | Value | Description | +|:-------------------|:------|:--------------| +| SF_STR_TITLE | 0x01 | Title. | +| SF_STR_COPYRIGHT | 0x02 | Copyright. | +| SF_STR_SOFTWARE | 0x03 | Software. | +| SF_STR_ARTIST | 0x04 | Artist. | +| SF_STR_COMMENT | 0x05 | Comment. | +| SF_STR_DATE | 0x06 | Date. | +| SF_STR_ALBUM | 0x07 | Album. | +| SF_STR_LICENSE | 0x08 | License. | +| SF_STR_TRACKNUMBER | 0x09 | Track number. | +| SF_STR_GENRE | 0x10 | Genre. | + +The sf_get_string() function returns the specified string if it exists and a +NULL pointer otherwise. In addition to the string ids above, SF_STR_FIRST (== +SF_STR_TITLE) and SF_STR_LAST (always the same as the highest numbers string id) +are also available to allow iteration over all the available string ids. + +The sf_set_string() function sets the string data. It returns zero on success +and non-zero on error.The error code can be converted to a string using +sf_error_number(). + +Strings passed to and retrieved from these two functions are assumed to be +utf-8. However, while formats like Ogg/Vorbis and FLAC fully support utf-8, +others like WAV and AIFF officially only support ASCII. Writing utf-8 strings to +WAV and AIF files with libsndfile will work when read back with libsndfile, but +may not work with other programs. + +The suggested method of dealing with tags retrived using sf_get_string() is to +assume they are utf-8. Similarly if you have a string in some exotic format like +utf-16, it should be encoded to utf-8 before being written using libsndfile. + +## Function for retrieving library version {#version_string} + +```c +const char *sf_version_string (void) ; +``` + +Return the library version string. + +## Function for retrieving current byterate {#current_byterate} + +```c +int sf_current_byterate (SNDFILE *sndfile) ; +``` + +Return the current byterate at this point in the file. The byte rate in this +case is the number of bytes per second of audio data. For instance, for a +stereo, 18 bit PCM encoded file with an 16kHz sample rate, the byte rate +would be 2 (stereo) \* 2 (two bytes per sample) * 16000 => 64000 bytes/sec. + +For some file formats the returned value will be accurate and exact, for some +it will be a close approximation, for some it will be the average bitrate for +the whole file and for some it will be a time varying value that was accurate +when the file was most recently read or written. + +To get the bitrate, multiple this value by 8. + +`sf_current_byterate` returns byte per second or -1 if byterate is +unknown. + +## Functions to get and set chunks from within a sound file + +These functions allow the getting and setting of chunks within a sound file (for +those formats which allow it). + +These functions fail safely. Specifically, they will not allow you to overwrite +existing chunks or add extra versions of format specific reserved chunks but +should allow you to retrieve any and all chunks (may not be implemented for all +chunks or all file formats). + +### sf_set_chunk + +```c +int sf_set_chunk (SNDFILE *sndfile, const SF_CHUNK_INFO *chunk_info) ; +``` + +Set the specified chunk info (must be done before any audio data is written to +the file). This will fail for format specific reserved chunks. The +`chunk_info->data` pointer must be valid until the file is closed. + +The `SF_CHUNK_INFO` struct is documented as follows: + +```c +struct SF_CHUNK_INFO +{ char id [64] ; /* The chunk identifier. */ + unsigned id_size ; /* The size of the chunk identifier. */ + unsigned datalen ; /* The size of that data. */ + void *data ; /* Pointer to the data. */ +} ; + typedef struct SF_CHUNK_INFO SF_CHUNK_INFO ; +``` + +`sf_set_chunk` returns `SF_ERR_NO_ERROR` on success or non-zero on failure. + +### sf_get_chunk_iterator + +```c +SF_CHUNK_ITERATOR * +sf_get_chunk_iterator (SNDFILE *sndfile, const SF_CHUNK_INFO *chunk_info) ; +``` + +Get an iterator for all chunks matching `chunk_info`. + +`SF_CHUNK_ITERATOR` is an opaque structure to an iterator over the all chunks of +a given id and defined as follows: + +```c +typedef struct SF_CHUNK_ITERATOR SF_CHUNK_ITERATOR ; +``` + +The iterator will point to the first chunk matching `chunk_info`. Chunks are +matching, if (`chunk_info->id`) matches the first (`chunk_info->id_size`) bytes +of a chunk found in the `SNDFILE*` handle. If `chunk_info` is `NULL`, an +iterator to all chunks in the `SNDFILE*` handle is returned. The values of +`chunk_info->datalen` and `chunk_info->data` are ignored. If no matching chunks +are found in the sndfile, `NULL` is returned. + +The returned iterator will stay valid until one of the following occurs: + +* The sndfile is closed. +* A new chunk is added using [`sf_set_chunk()`](#sf_set_chunk). +* Another chunk iterator function is called on the same `SNDFILE*` + handle that causes the iterator to be modified. + +The memory for the iterator belongs to the SNDFILE* handle and is freed when +[sf_close](#close) is called. + +### sf_next_chunk_iterator + +```c +sf_next_chunk_iterator (SF_CHUNK_ITERATOR * iterator) ; +``` + +Iterate through chunks by incrementing the iterator. + +Increments the iterator and returns a handle to the new one. After this call, +iterator will no longer be valid, and you must use the newly returned handle +from now on. The returned handle can be used to access the next chunk matching +the criteria as defined in [sf_get_chunk_iterator](#sf_get_chunk_iterator). +If iterator points to the last chunk, this will free all resources associated +with iterator and return `NULL`. The returned iterator will stay valid until +`sf_get_next_chunk_iterator` is called again, the sndfile is closed or a new +chunk us added. + +### sf_get_chunk_size + +```c +int +sf_get_chunk_size (const SF_CHUNK_ITERATOR * it, SF_CHUNK_INFO * chunk_info) ; +``` + +Get the size of the specified chunk. + +If the specified chunk exists, the size will be returned in the `datalen` field +of the `SF_CHUNK_INFO` struct. Additionally, the id of the chunk will be copied +to the `id` field of the `SF_CHUNK_INFO` struct and it's `id_size` field will be +updated accordingly. + +If the chunk doesn't exist `chunk_info->datalen` will be zero, and the `id` and +`id_size` fields will be undefined. + +The function will return `SF_ERR_NO_ERROR` on success or non-zero on failure. + +### sf_get_chunk_data + +```c +int +sf_get_chunk_data (const SF_CHUNK_ITERATOR *it, SF_CHUNK_INFO *chunk_info) ; +``` + +Get the specified chunk data. + +If the specified chunk exists, up to `chunk_info->datalen` bytes of the chunk +data will be copied into the `chunk_info->data` buffer (allocated by the caller) +and the `chunk_info->datalen` field updated to reflect the size of the data. The +`id` and `id_size` field will be updated according to the retrieved chunk. If +the chunk doesn't exist `chunk_info->datalen` will be zero, and the `id` and +`id_size` fields will be undefined. + +The function will return `SF_ERR_NO_ERROR` on success or non-zero on failure. + +## Note 1 + +When converting between integer PCM formats of differing size (e.g. using +sf_read_int() to read a 16 bit PCM encoded WAV file) libsndfile obeys one simple +rule: + +Whenever integer data is moved from one sized container to another sized +container, the most significant bit in the source container will become the most +significant bit in the destination container. + +When converting between integer data and floating point data, different rules +apply. The default behaviour when reading floating point data (sf_read_float() +or sf_read_double ()) from a file with integer data is normalisation. Regardless +of whether data in the file is 8, 16, 24 or 32 bit wide, the data will be read +as floating point data in the range [-1.0, 1.0]. Similarly, data in the range +[-1.0, 1.0] will be written to an integer PCM file so that a data value of 1.0 +will be the largest allowable integer for the given bit width. This +normalisation can be turned on or off using the [sf_command](command.md) +interface. + +## Note 2 + +Reading a file containg floating point data (allowable with WAV, AIFF, AU and +other file formats) using integer read methods (sf_read_short() or +sf_read_int()) can produce unexpected results. For instance the data in the file +may have a maximum absolute value < 1.0 which would mean that all sample +values read from the file will be zero. In order to read these files correctly +using integer read methods, it is recommended that you use the +[sf_command](command.md) interface, a command of +[SFC_SET_SCALE_FLOAT_INT_READ](command.md#sfc_set_scale_float_int_read) and a +parameter of SF_TRUE to force correct scaling. diff --git a/libsndfile-1.0.31/docs/bugs.md b/libsndfile-1.0.31/docs/bugs.md new file mode 100644 index 0000000..f788c0e --- /dev/null +++ b/libsndfile-1.0.31/docs/bugs.md @@ -0,0 +1,47 @@ +--- +layout: page +--- + +# Reporting Bugs in libsndfile + +Before even attempting to report a bug in libsndfile please make sure you have +read the [Frequently Asked Questions](FAQ.md). If you are having a problem +writing code using libsndfile make sure you read the +[Application Programming Interface](api.md) documentation. + +That said, I am interested in finding and fixing all genuine bugs in libsndfile. +Bugs I want to fix include any of the following problems (and probably others): + +- Compilation problems on new platforms. +- Errors being detected during the `make check` process. +- Segmentation faults occuring inside libsndfile. +- libsndfile hanging when opening a file. +- Supported sound file types being incorrectly read or written. +- Omissions, errors or spelling mistakes in the documentation. + +When submitting a bug report you must include: + +- Your system (CPU and memory size should be enough). +- The operating system you are using. +- Whether you are using a package provided by your distribution or you compiled + it youself. +- If you compiled it yourself, the compiler you are using. (Also make sure to + run `make check`.) +- A description of the problem. +- Information generated by the sndfile-info program (see next paragraph). +- If you are having problems with sndfile-play and ALSA on Linux, I will need + information about your kernel, ALSA version, compiler version, whether you + compiled the kernel/ALSA your self or installed from a package etc. + +If libsndfile compiles and installs correctly but has difficulty reading a +particular file or type of file you should run the **sndfile-info** program +(from the examples directory of the libsndfile distribution) on the file. See +[here](sndfile_info.md) for an example of the use of the **sndfile-info** +program. + +Please do not send me a sound file which fails to open under libsndfile unless +I specifically ask you to. The above information should usually suffice for most +problems. + +Once you have the above information you should submit a ticket on the libsndfile +[GitHub issue tracker](https://github.com/libsndfile/libsndfile/issues). diff --git a/libsndfile-1.0.31/docs/command.md b/libsndfile-1.0.31/docs/command.md new file mode 100644 index 0000000..5e6606f --- /dev/null +++ b/libsndfile-1.0.31/docs/command.md @@ -0,0 +1,1929 @@ +--- +layout: page +title: libsndfile : the sf_command function. +--- + +# sf_command + +```c +int sf_command (SNDFILE *sndfile, int cmd, void *data, int datasize) ; +``` + +This function allows the caller to retrieve information from or change aspects +of the library behaviour. Examples include retrieving a string containing the +library version or changing the scaling applied to floating point sample data +during read and write. Most of these operations are performed on a per-file +basis. + +The cmd parameter is an integer identifier which is defined in *sndfile.h*. All +of the valid command identifiers have names beginning with "SFC_". Data is +passed to and returned from the library by use of a void pointer. The library +will not read or write more than datasize bytes from the void pointer. For some +calls no data is required in which case data should be NULL and datasize may be +used for some other purpose. + +The available commands are as follows: + +| Name | Description | +|:------------------------------------------------------------------|:--------------------------------------------------------| +| [SFC_GET_LIB_VERSION](#sfc_get_lib_version) | Retrieve the version of the library as a string. | +| [SFC_GET_LOG_INFO](#sfc_get_log_info) | Retrieve the internal per-file operation log. | +| [SFC_GET_CURRENT_SF_INFO](#sfc_get_current_sf_info) | Retrieve `SF_INFO` struct of opened file. | +| [SFC_CALC_SIGNAL_MAX](#sfc_calc_signal_max) | Calculate the measured maximum signal value. | +| [SFC_CALC_NORM_SIGNAL_MAX](#sfc_calc_norm_signal_max) | Calculate the measured normalised maximum signal value. | +| [SFC_CALC_MAX_ALL_CHANNELS](#sfc_calc_max_all_channels) | Calculate the peak value for each channel. | +| [SFC_CALC_NORM_MAX_ALL_CHANNELS](#sfc_calc_norm_max_all_channels) | Calculate the normalised peak for each channel. | +| [SFC_GET_SIGNAL_MAX](#sfc_get_signal_max) | Retrieve the peak value for the file. | +| [SFC_GET_MAX_ALL_CHANNELS](#sfc_get_max_all_channels) | Retrieve the peak value for each channel. | +| [SFC_SET_NORM_FLOAT](#sfc_set_norm_float) | Set float normalisation behaviour. | +| [SFC_SET_NORM_DOUBLE](#sfc_set_norm_double) | Set double normalisation behaviour. | +| [SFC_GET_NORM_FLOAT](#sfc_get_norm_float) | Get float normalisation behaviour. | +| [SFC_GET_NORM_DOUBLE](#sfc_get_norm_double) | Get double normalisation behaviour. | +| [SFC_SET_SCALE_FLOAT_INT_READ](#sfc_set_scale_float_int_read) | Control scale factor on read. | +| [SFC_SET_SCALE_INT_FLOAT_WRITE](#sfc_set_scale_int_float_write) | Control scale factor on write. | +| [SFC_GET_SIMPLE_FORMAT_COUNT](#sfc_get_simple_format_count) | Get simple formats count. | +| [SFC_GET_SIMPLE_FORMAT](#sfc_get_simple_format) | Get information about a simple format. | +| [SFC_GET_FORMAT_INFO](#sfc_get_format_info) | Get information about a major or subtype format. | +| [SFC_GET_FORMAT_MAJOR_COUNT](#sfc_get_format_major_count) | Get the number of major formats. | +| [SFC_GET_FORMAT_MAJOR](#sfc_get_format_major) | Get information about a major format type. | +| [SFC_GET_FORMAT_SUBTYPE_COUNT](#sfc_get_format_subtype_count) | Get the number of subformats. | +| [SFC_GET_FORMAT_SUBTYPE](#sfc_get_format_subtype) | Get information about a subformat. | +| [SFC_SET_ADD_PEAK_CHUNK](#sfc_set_add_peak_chunk) | Control PEAK chunk write to WAV and AIFF. | +| [SFC_UPDATE_HEADER_NOW](#sfc_update_header_now) | Update the file header in write mode on demand. | +| [SFC_SET_UPDATE_HEADER_AUTO](#sfc_set_update_header_auto) | Update the file header on each write. | +| [SFC_FILE_TRUNCATE](#sfc_file_truncate) | Truncate a file open for write or for read/write. | +| [SFC_SET_RAW_START_OFFSET](#sfc_set_raw_start_offset) | Change the data start offset for raw files. | +| SFC_SET_DITHER_ON_WRITE | Not implemented. | +| SFC_SET_DITHER_ON_READ | Not implemented. | +| SFC_GET_DITHER_INFO_COUNT | Not implemented. | +| SFC_GET_DITHER_INFO | Not implemented. | +| [SFC_SET_CLIPPING](#sfc_set_clipping) | Control automatic clipping behaviour. | +| [SFC_GET_CLIPPING](#sfc_get_clipping) | Get current clipping setting. | +| [SFC_GET_EMBED_FILE_INFO](#sfc_get_embed_file_info) | Get information about embedded audio files. | +| [SFC_WAVEX_GET_AMBISONIC](#sfc_wavex_get_ambisonic) | Test a WAVEX file for Ambisonic format. | +| [SFC_WAVEX_SET_AMBISONIC](#sfc_wavex_set_ambisonic) | Modify a WAVEX header for Ambisonic format. | +| [SFC_SET_VBR_ENCODING_QUALITY](#sfc_set_vbr_encoding_quality) | Set the Variable Bit Rate encoding quality. | +| [SFC_SET_OGG_PAGE_LATENCY_MS](#sfc_set_ogg_page_latency_ms) | Set Ogg page latency for Opus file. | +| [SFC_SET_COMPRESSION_LEVEL](#sfc_set_compression_level) | Set the compression level. | +| [SFC_RAW_DATA_NEEDS_ENDSWAP](#sfc_raw_data_needs_endswap) | Determine if raw data needs endswapping. | +| [SFC_GET_BROADCAST_INFO](#sfc_get_broadcast_info) | Get the Broadcast Chunk info. | +| [SFC_SET_BROADCAST_INFO](#sfc_set_broadcast_info) | Set the Broadcast Chunk info. | +| [SFC_GET_CHANNEL_MAP_INFO](#sfc_get_channel_map_info) | Get the channel map info. | +| [SFC_SET_CHANNEL_MAP_INFO](#sfc_set_channel_map_info) | Set the channel map info. | +| [SFC_SET_CART_INFO](#sfc_set_cart_info) | Set the Cart Chunk info. | +| [SFC_GET_CART_INFO](#sfc_get_cart_info) | Get the Cart Chunk info. | +| [SFC_GET_LOOP_INFO](#sfc_get_loop_info) | Get loop info. | +| [SFC_GET_INSTRUMENT](#sfc_get_instrument) | Get instrument info. | +| [SFC_SET_INSTRUMENT](#sfc_set_instrument) | Set instrument info. | +| [SFC_GET_CUE_COUNT](#sfc_get_cue_count) | Get the cue marker count. | +| [SFC_GET_CUE](#sfc_get_cue) | Get cue marker info. | +| [SFC_SET_CUE](#sfc_set_cue) | Set cue marker info. | +| [SFC_RF64_AUTO_DOWNGRADE](#sfc_rf64_auto_downgrade) | Set auto downgrade from RF64 to WAV. | +| [SFC_GET_ORIGINAL_SAMPLERATE](#sfc_get_original_samplerate) | Get original samplerate metadata. | +| [SFC_SET_ORIGINAL_SAMPLERATE](#sfc_set_original_samplerate) | Set original samplerate metadata. | + +--- + +## SFC_GET_LIB_VERSION + +Retrieve the version of the library as a string. + +### Parameters + +sndfile +: Not used + +cmd +: SFC_GET_LIB_VERSION + +data +: A pointer to a char buffer + +datasize +: The size of the buffer + +### Examples + +```c +char buffer [128] ; +sf_command (NULL, SFC_GET_LIB_VERSION, buffer, sizeof (buffer)) ; +``` + +### Return value + +This call will return the length of the retrieved version string. + +### Notes + +The string returned in the buffer passed to this function will not overflow the +buffer and will always be null terminated . + +## SFC_GET_LOG_INFO + +Retrieve the internal per-file operation log. + +This log buffer can often contain a good reason for why libsndfile failed to +open a particular file. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_GET_LOG_INFO + +data +: A pointer to a char buffer + +datasize +: The size of the buffer + +Example: + +```c +char buffer [2048] ; +sf_command (sndfile, SFC_GET_LOG_INFO, buffer, sizeof (buffer)) ; +``` + +### Return value + +This call will return the length of the retrieved version string. + +### Notes + +The string returned in the buffer passed to this function will not overflow the +buffer and will always be null terminated. + +## SFC_GET_CURRENT_SF_INFO + +Retrieve `SF_INFO` struct of opened file. + +`SFC_GET_CURRENT_SF_INFO` command copies `SF_INFO` struct of `sndfile` object to +provided buffer. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_GET_CURRENT_SF_INFO + +data +: A pointer to a valid SF_INFO* pointer + +datasize +: sizeof (SF_INFO) + +### Examples + +```c +SF_INFO sfinfo ; +sf_command (sndfile, SFC_GET_CURRENT_SF_INFO, sfinfo, sizeof (SF_INFO)) ; +``` + +### Return value + +Zero on success, non-zero otherwise. + +## SFC_CALC_SIGNAL_MAX + +Retrieve the measured maximum signal value. This involves reading through the +whole file which can be slow on large files. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_CALC_SIGNAL_MAX + +data +: A pointer to a double + +datasize +: sizeof (double) + +### Examples + +```c +double max_val ; +sf_command (sndfile, SFC_CALC_SIGNAL_MAX, &max_val, sizeof (max_val)) ; +``` + +### Return value + +Zero on success, non-zero otherwise. + +## SFC_CALC_NORM_SIGNAL_MAX + +Retrieve the measured normalised maximum signal value. This involves reading +through the whole file which can be slow on large files. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_CALC_NORM_SIGNAL_MAX + +data +: A pointer to a double + +datasize +: sizeof (double) + +### Examples + +```c +double max_val ; +sf_command (sndfile, SFC_CALC_NORM_SIGNAL_MAX, &max_val, sizeof (max_val)) ; +``` + +### Return value + +Zero on success, non-zero otherwise. + +## SFC_CALC_MAX_ALL_CHANNELS + +Calculate the peak value (ie a single number) for each channel. This involves +reading through the whole file which can be slow on large files. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_CALC_MAX_ALL_CHANNELS + +data +: A pointer to a double + +datasize +: sizeof (double) * number_of_channels + +### Examples + +```c +double peaks [number_of_channels] ; +sf_command (sndfile, SFC_CALC_MAX_ALL_CHANNELS, peaks, sizeof (peaks)) ; +``` + +### Return value + +Zero if peaks have been calculated successfully and non-zero otherwise. + +## SFC_CALC_NORM_MAX_ALL_CHANNELS + +Calculate the normalised peak for each channel. This involves reading through +the whole file which can be slow on large files. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_CALC_NORM_MAX_ALL_CHANNELS + +data +: A pointer to a double + +datasize +: sizeof (double) * number_of_channels + +### Examples + +```c +double peaks [number_of_channels] ; +sf_command (sndfile, SFC_CALC_NORM_MAX_ALL_CHANNELS, peaks, sizeof (peaks)) ; +``` + +### Return value + +Zero if peaks have been calculated successfully and non-zero otherwise. + +## SFC_GET_SIGNAL_MAX + +Retrieve the peak value for the file as stored in the file header. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_GET_SIGNAL_MAX + +data +: A pointer to a double + +datasize +: sizeof (double) + +### Examples + +```c +double max_peak ; +sf_command (sndfile, SFC_GET_SIGNAL_MAX, &max_peak, sizeof (max_peak)) ; +``` + +### Return value + +SF_TRUE if the file header contained the peak value. SF_FALSE +otherwise. + +## SFC_GET_MAX_ALL_CHANNELS + +Retrieve the peak value for the file as stored in the file header. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_GET_SIGNAL_MAX + +data +: A pointer to an array of doubles + +datasize +: sizeof (double) * number_of_channels + +### Example + +```c +double peaks [number_of_channels] ; +sf_command (sndfile, SFC_GET_MAX_ALL_CHANNELS, peaks, sizeof (peaks)) ; +``` + +### Return value + +SF_TRUE if the file header contains per channel peak values for the file, +SF_FALSE otherwise. + +## SFC_SET_NORM_FLOAT + +This command only affects data read from or written to using the +floating point +functions: + +```c +size_t sf_read_float (SNDFILE *sndfile, float *ptr, size_t items) ; +size_t sf_readf_float (SNDFILE *sndfile, float *ptr, size_t frames) ; + +size_t sf_write_float (SNDFILE *sndfile, float *ptr, size_t items) ; +size_t sf_writef_float (SNDFILE *sndfile, float *ptr, size_t frames) ; +``` + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_SET_NORM_FLOAT + +data +: NULL + +datasize +: SF_TRUE or SF_FALSE + +For read operations setting normalisation to SF_TRUE means that the data from +all subsequent reads will be be normalised to the range [-1.0, 1.0]. + +For write operations, setting normalisation to SF_TRUE means than all data +supplied to the float write functions should be in the range [-1.0, 1.0] and +will be scaled for the file format as necessary. + +For both cases, setting normalisation to SF_FALSE means that no scaling will +take place. + +### Examples + +```c +sf_command (sndfile, SFC_SET_NORM_FLOAT, NULL, SF_TRUE) ; + +sf_command (sndfile, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; +``` + +### Return value + +Returns the previous float normalisation mode. + +## SFC_SET_NORM_DOUBLE + +This command only affects data read from or written to using the double +precision floating point +functions: + +```c +size_t sf_read_double (SNDFILE *sndfile, double *ptr, size_t items) ; +size_t sf_readf_double (SNDFILE *sndfile, double *ptr, size_t frames) ; + +size_t sf_write_double (SNDFILE *sndfile, double *ptr, size_t items) ; +size_t sf_writef_double (SNDFILE *sndfile, double *ptr, size_t frames) ; +``` + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_SET_NORM_DOUBLE + +data +: NULL + +datasize +: SF_TRUE or SF_FALSE + +For read operations setting normalisation to SF_TRUE means that the data from +all subsequent reads will be be normalised to the range [-1.0, 1.0]. + +For write operations, setting normalisation to SF_TRUE means than all data +supplied to the double write functions should be in the range [-1.0, 1.0] and +will be scaled for the file format as necessary. + +For both cases, setting normalisation to SF_FALSE means that no scaling will +take place. + +### Examples + +```c +sf_command (sndfile, SFC_SET_NORM_DOUBLE, NULL, SF_TRUE) ; + +sf_command (sndfile, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; +``` + +### Return value + +Returns the previous double normalisation mode. + +## SFC_GET_NORM_FLOAT + +Retrieve the current float normalisation mode. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_GET_NORM_FLOAT + +data +: NULL + +datasize +: anything + +### Examples + +```c +normalisation = sf_command (sndfile, SFC_GET_NORM_FLOAT, NULL, 0) ; +``` + +### Return value + +Returns TRUE if normalisation is on and FALSE otherwise. + +## SFC_GET_NORM_DOUBLE + +Retrieve the current float normalisation mode. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_GET_NORM_DOUBLE + +data +: NULL + +datasize +: anything + +Example: + +```c +normalisation = sf_command (sndfile, SFC_GET_NORM_DOUBLE, NULL, 0) ; +``` + +### Return value + +Returns TRUE if normalisation is on and FALSE otherwise. + +## SFC_SET_SCALE_FLOAT_INT_READ + +Set/clear the scale factor when integer (short/int) data is read from a file +containing floating point data. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd: +SFC_SET_SCALE_FLOAT_INT_READ + +data +: NULL + +datasize +: TRUE or FALSE + +Example: + +```c +sf_command (sndfile, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; +``` + +### Return value + +Returns the previous `SFC_SET_SCALE_FLOAT_INT_READ` setting for this file. + +## SFC_SET_SCALE_INT_FLOAT_WRITE + +Set/clear the scale factor when integer (short/int) data is written to a file as +floating point data. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_SET_SCALE_INT_FLOAT_WRITE + +data +: NULL + +datasize +: TRUE or FALSE + +### Examples + +```c +sf_command (sndfile, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_TRUE) ; +``` + +### Return value + +Returns the previous `SFC_SET_SCALE_INT_FLOAT_WRITE` setting for this file. + +## SFC_GET_SIMPLE_FORMAT_COUNT + +Retrieve the number of simple formats supported by libsndfile. + +### Parameters + +sndfile +: Not used. + +cmd +: SFC_GET_SIMPLE_FORMAT_COUNT + +data +: a pointer to an int + +datasize +: sizeof (int) + +### Examples + +```c +int count ; +sf_command (sndfile, SFC_GET_SIMPLE_FORMAT_COUNT, &count, sizeof (int)) ; +``` + +### Return value + +`0`. + +## SFC_GET_SIMPLE_FORMAT + +Retrieve information about a simple format. + +### Parameters + +sndfile +: Not used. + +cmd +: SFC_GET_SIMPLE_FORMAT + +data +: a pointer to an SF_FORMAT_INFO struct + +datasize +: sizeof (SF_FORMAT_INFO) + +The SF_FORMAT_INFO struct is defined in *sndfile.h* as: + +```c +typedef struct +{ int format ; + const char *name ; + const char *extension ; +} SF_FORMAT_INFO ; +``` + +When `sf_command()` is called with `SF_GET_SIMPLE_FORMAT`, the value of the +format field should be the format number (ie 0 \<= format \<= count value +obtained using `SF_GET_SIMPLE_FORMAT_COUNT). + +### Examples + +```c +SF_FORMAT_INFO format_info ; +int k, count ; + +sf_command (sndfile, SFC_GET_SIMPLE_FORMAT_COUNT, &count, sizeof (int)) ; + +for (k = 0 ; k < count ; k++) +{ format_info.format = k ; + sf_command (sndfile, SFC_GET_SIMPLE_FORMAT, &format_info, sizeof (format_info)) ; + printf ("%08x %s %s\n", format_info.format, format_info.name, format_info.extension) ; + } ; +``` + +### Return value + +0 on success and non-zero otherwise. + +The value of the format field of the `SF_FORMAT_INFO` struct will be a value +which can be placed in the format field of an `SF_INFO` struct when a file is to +be opened for write. The name field will contain a char\* pointer to the name of +the string, eg. "WAV (Microsoft 16 bit PCM)". The extension field will contain +the most commonly used file extension for that file type. + +## SFC_GET_FORMAT_INFO + +Retrieve information about a major or subtype format. + +### Parameters + +sndfile +: Not used. + +cmd +: SFC_GET_FORMAT_INFO + +data +: a pointer to an SF_FORMAT_INFO struct + +datasize +: sizeof (SF_FORMAT_INFO) + +The `SF_FORMAT_INFO` struct is defined in \ as: + +```c +typedef struct +{ int format ; + const char *name ; + const char *extension ; +} SF_FORMAT_INFO ; +``` + +When `sf_command()` is called with `SF_GET_FORMAT_INFO`, the format field is +examined and if (format & `SF_FORMAT_TYPEMASK`) is a valid format then the +struct is filled in with information about the given major type. If (format & +`SF_FORMAT_TYPEMASK`) is FALSE and (format & `SF_FORMAT_SUBMASK`) is a valid +subtype format then the struct is filled in with information about the given +subtype. + +### Examples + +```c +SF_FORMAT_INFO format_info ; + +format_info.format = SF_FORMAT_WAV ; +sf_command (sndfile, SFC_GET_FORMAT_INFO, &format_info, sizeof (format_info)) ; +printf ("%08x %s %s\n", format_info.format, format_info.name, format_info.extension) ; + +format_info.format = SF_FORMAT_ULAW ; +sf_command (sndfile, SFC_GET_FORMAT_INFO, &format_info, sizeof (format_info)) ; +printf ("%08x %s\n", format_info.format, format_info.name) ; +``` + +### Return value + +0 on success and non-zero otherwise. + +## SFC_GET_FORMAT_MAJOR_COUNT + +Retrieve the number of major formats. + +### Parameters + +sndfile +: Not used. + +cmd +: SFC_GET_FORMAT_MAJOR_COUNT + +data +: a pointer to an int + +datasize +: sizeof (int) + +### Examples + +```c +int count ; +sf_command (sndfile, SFC_GET_FORMAT_MAJOR_COUNT, &count, sizeof (int)) ; +``` + +### Return value + +0. + +## SFC_GET_FORMAT_MAJOR + +Retrieve information about a major format type. + +### Parameters + +sndfile +: Not used. + +cmd +: SFC_GET_FORMAT_MAJOR + +data +: a pointer to an SF_FORMAT_INFO struct + +datasize +: sizeof (SF_FORMAT_INFO) + +### Examples + +```c +SF_FORMAT_INFO format_info ; +int k, count ; + +sf_command (sndfile, SFC_GET_FORMAT_MAJOR_COUNT, &count, sizeof (int)) ; + +for (k = 0 ; k < count ; k++) +{ format_info.format = k ; + sf_command (sndfile, SFC_GET_FORMAT_MAJOR, &format_info, sizeof (format_info)) ; + printf ("%08x %s %s\n", format_info.format, format_info.name, format_info.extension) ; + } ; +``` + +For a more comprehensive example, see the program `list_formats.c` in the +`examples/` directory of the libsndfile source code distribution. + +### Return value + +0 on success and non-zero otherwise. + +The value of the format field will be one of the major format identifiers such +as `SF_FORMAT_WAV` or `SF_FORMAT`_AIFF. The name field will contain a char\* +pointer to the name of the string, eg. "WAV (Microsoft)". The extension field +will contain the most commonly used file extension for that file type. + +## SFC_GET_FORMAT_SUBTYPE_COUNT + +Retrieve the number of subformats. + +### Parameters + +sndfile +: Not used. + +cmd +: SFC_GET_FORMAT_SUBTYPE_COUNT + +data +: a pointer to an int + +datasize +: sizeof (int) + +### Examples + +```c +int count ; +sf_command (sndfile, SFC_GET_FORMAT_SUBTYPE_COUNT, &count, sizeof (int)) ; +``` + +### Return value + +Returns zero. + +## SFC_GET_FORMAT_SUBTYPE + +Enumerate the subtypes (this function does not translate a subtype into a string +describing that subtype). A typical use case might be retrieving a string +description of all subtypes so that a dialog box can be filled in. + +### Parameters + +sndfile +: Not used. + +cmd +: SFC_GET_FORMAT_SUBTYPE + +data +: a pointer to an SF_FORMAT_INFO struct + +datasize +: sizeof (SF_FORMAT_INFO) + +### Examples + +Example 1: Retrieve all sybtypes supported by the WAV format. + +```c +SF_FORMAT_INFO format_info ; +int k, count ; + +sf_command (sndfile, SFC_GET_FORMAT_SUBTYPE_COUNT, &count, sizeof (int)) ; + +for (k = 0 ; k < count ; k++) +{ format_info.format = k ; + sf_command (sndfile, SFC_GET_FORMAT_SUBTYPE, &format_info, sizeof (format_info)) ; + if (! sf_format_check (format_info.format | SF_FORMAT_WAV)) + continue ; + printf ("%08x %s\n", format_info.format, format_info.name) ; + } ; +``` + +Example 2: Print a string describing the `SF_FORMAT_PCM_16` subtype. + +```c +SF_FORMAT_INFO format_info ; +int k, count ; + +sf_command (sndfile, SFC_GET_FORMAT_SUBTYPE_COUNT, &count, sizeof (int)) ; + +for (k = 0 ; k < count ; k++) +{ format_info.format = k ; + sf_command (sndfile, SFC_GET_FORMAT_SUBTYPE, &format_info, sizeof (format_info)) ; + if (format_info.format == SF_FORMAT_PCM_16) + { printf ("%08x %s\n", format_info.format, format_info.name) ; + break ; + } ; + } ; +``` + +For a more comprehensive example, see the program `list_formats.c` in the +`examples/` directory of the libsndfile source code distribution. + +### Return value + +0 on success and non-zero otherwise. + +The value of the format field will be one of the major format identifiers such +as `SF_FORMAT_WAV` or `SF_FORMAT_AIFF`. The name field will contain a char\* +pointer to the name of the string; for instance "WAV (Microsoft)" or "AIFF +(Apple/SGI)". The extension field will be a NULL pointer. + +## SFC_SET_ADD_PEAK_CHUNK + +By default, WAV and AIFF files which contain floating point data (subtype +`SF_FORMAT_FLOAT` or `SF_FORMAT_DOUBLE`) have a PEAK chunk. By using this +command, the addition of a PEAK chunk can be turned on or off. + +**Note**: This call must be made before any data is written to the file. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_SET_ADD_PEAK_CHUNK + +data +: Not used (should be NULL) + +datasize +: TRUE or FALSE. + +### Examples + +```c +/* Turn on the PEAK chunk. */ +sf_command (sndfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ; + +/* Turn off the PEAK chunk. */ +sf_command (sndfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; +``` + +### Return value + +Returns SF_TRUE if the peak chunk will be written after this call. Returns +SF_FALSE if the peak chunk will not be written after this call. + +## SFC_UPDATE_HEADER_NOW + +The header of an audio file is normally written by libsndfile when the file is +closed using [**sf_close()**](api.md#file-close-function). + +There are however situations where large files are being generated and it would +be nice to have valid data in the header before the file is complete. Using this +command will update the file header to reflect the amount of data written to the +file so far. Other programs opening the file for read (before any more data is +written) will then read a valid sound file header. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_UPDATE_HEADER_NOW + +data +: Not used (should be NULL) + +datasize +: Not used. + +### Examples + +```c +/* Update the header now. */ +sf_command (sndfile, SFC_UPDATE_HEADER_NOW, NULL, 0) ; +``` + +### Return value + +Returns zero. + +## SFC_SET_UPDATE_HEADER_AUTO + +Similar to `SFC_UPDATE_HEADER_NOW` but updates the header at the end of every +call to the [sf_write\*](api.md#write) functions. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_SET_UPDATE_HEADER_AUTO + +data +: Not used (should be NULL) + +datasize +: `SF_TRUE` or `SF_FALSE` + +### Examples + +```c +/* Turn on auto header update. */ +sf_command (sndfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; + +/* Turn off auto header update. */ +sf_command (sndfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_FALSE) ; +``` + +### Return value + +TRUE if auto update header is now on; FALSE otherwise. + +## SFC_FILE_TRUNCATE + +Truncate a file that was opened for write or read/write. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_FILE_TRUNCATE + +data +: A pointer to an sf_count_t. + +datasize +: sizeof (sf_count_t) + +Truncate the file to the number of frames specified by the sf_count_t pointed to +by data. After this command, both the read and the write pointer will be at the +new end of the file. This command will fail (returning non-zero) if the +requested truncate position is beyond the end of the file. + +### Examples + +```c +/* Truncate the file to a length of 20 frames. */ +sf_count_t frames = 20 ; +sf_command (sndfile, SFC_FILE_TRUNCATE, &frames, sizeof (frames)) ; +``` + +### Return value + +Zero on sucess, non-zero otherwise. + +## SFC_SET_RAW_START_OFFSET + +Change the data start offset for files opened up as `SF_FORMAT_RAW`. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_SET_RAW_START_OFFSET + +data +: A pointer to an sf_count_t. + +datasize +: sizeof (sf_count_t) + +For a file opened as format `SF_FORMAT_RAW`, set the data offset to the value +given by `data`. + +### Examples + +```c +/* Reset the data offset to 5 bytes from the start of the file. */ +sf_count_t offset = 5 ; +sf_command (sndfile, SFC_SET_RAW_START_OFFSET, &offset, sizeof (offset)) ; +``` + +### Return value + +Zero on success, non-zero otherwise. + +## SFC_SET_CLIPPING + +Turn on/off automatic clipping when doing floating point to integer conversion. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_SET_CLIPPING + +data +: NULL + +datasize +: SF_TRUE or SF_FALSE. + +Turn on (datasize == SF_TRUE) or off (datasize == SF_FALSE) clipping. + +### Examples + +```c +sf_command (sndfile, SFC_SET_CLIPPING, NULL, SF_TRUE) ; +``` + +### Return value + +Clipping mode (SF_TRUE or SF_FALSE). + +## SFC_GET_CLIPPING + +Turn on/off automatic clipping when doing floating point to integer conversion. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_GET_CLIPPING + +data +: NULL + +datasize +: 0 + +Retrieve the current cliiping setting. + +### Examples + +```c +sf_command (sndfile, SFC_GET_CLIPPING, NULL, 0) ; +``` + +### Return value + +Clipping mode (SF_TRUE or SF_FALSE). + +## SFC_GET_EMBED_FILE_INFO + +Get the file offset and file length of a file enbedded within another larger +file. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_GET_EMBED_FILE_INFO + +data +: a pointer to an SF_EMBED_FILE_INFO struct + +datasize +: sizeof (SF_EMBED_FILE_INFO) + +The `SF_EMBED_FILE_INFO` struct is defined in *sndfile.h* as: + +```c +typedef struct +{ sf_count_t offset ; + sf_count_t length ; +} SF_EMBED_FILE_INFO ; +``` + +### Return value + +0 on success and non-zero otherwise. + +The value of the offset field of the `SF_EMBED_FILE_INFO` struct will be the +offsets in bytes from the start of the outer file to the start of the audio +file. The value of the offset field of the `SF_EMBED_FILE_INFO` struct will be +the length in bytes of the embedded file. + +## SFC_WAVEX_GET_AMBISONIC + +Test if the current file has the GUID of a WAVEX file for any of the Ambisonic +formats. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_WAVEX_GET_AMBISONIC + +data +: NULL + +datasize +: 0 + +The Ambisonic WAVEX formats are defined here: +. + +### Return value + +`SF_AMBISONIC_NONE(0x40)` or `SF_AMBISONIC_B_FORMAT(0x41)` or zero if the file +format does not support ambisonic formats. + +## SFC_WAVEX_SET_AMBISONIC + +Set the GUID of a new WAVEX file to indicate an Ambisonics format. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_WAVEX_SET_AMBISONIC + +data +: NULL + +datasize +: SF_AMBISONIC_NONE or SF_AMBISONIC_B_FORMAT + +Turn on (`SF_AMBISONIC_B_FORMAT(0x41)`) or off (`SF_AMBISONIC_NONE(0x40)`) +encoding. This command is currently only supported for files with +`SF_FORMAT_WAVEX` format. + +The Ambisonic WAVEX formats are defined here: + +. + +### Return value + +Return the ambisonic value that has just been set or zero if the +file format does not support ambisonic encoding. + +## SFC_SET_VBR_ENCODING_QUALITY + +Set the Variable Bit Rate encoding quality. The encoding quality value +should be between 0.0 (lowest quality) and 1.0 (highest quality). +Currenly this command is only implemented for FLAC and Ogg/Vorbis files. +It has no effect on un-compressed file formats. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_SET_VBR_ENCODING_QUALITY + +data +: A pointer to a double value + +datasize +: sizeof (double) + +The command must be sent before any audio data is written to the file. + +### Return value + +SF_TRUE if VBR encoding quality was set. SF_FALSE otherwise. + +## SFC_SET_OGG_PAGE_LATENCY_MS + +Set page latency for Ogg Opus file in milliseconds. The value should be between +50.0 and 1600.0. This command is only implemented for Ogg Opus files. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_SET_OGG_PAGE_LATENCY_MS + +data +: A pointer to a double value + +datasize +: sizeof (double) + +### Return value + +0 on success and non-zero otherwise. + +## SFC_SET_COMPRESSION_LEVEL + +Set the compression level. The compression level should be between 0.0 (minimum +compression level) and 1.0 (highest compression level). Currenly this command is +only implemented for FLAC and Ogg/Vorbis files. It has no effect on +uncompressed file formats. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_SET_COMPRESSION_LEVEL + +data +: A pointer to a double value + +datasize +: sizeof (double) + +The command must be sent before any audio data is written to the file. + +### Return value + +SF_TRUE if compression level was set. SF_FALSE otherwise. + +## SFC_RAW_DATA_NEEDS_ENDSWAP + +Determine if raw data read using [sf_read_raw()](api.md#raw) needs to be end +swapped on the host CPU. + +For instance, will return SF_TRUE on when reading WAV containing +`SF_FORMAT_PCM_16` data on a big endian machine and `SF_FALSE` on a +little endian machine. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_RAW_DATA_NEEDS_ENDSWAP + +data +: NULL + +datasize +: 0 + +### Return value + +`SF_TRUE` or `SF_FALSE`. + +## SFC_GET_BROADCAST_INFO + +Retrieve the Broadcast Extension Chunk from WAV (and related) files. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_GET_BROADCAST_INFO + +data +: a pointer to an SF_BROADCAST_INFO struct + +datasize +: sizeof (SF_BROADCAST_INFO) + +The SF_BROADCAST_INFO struct is defined in *sndfile.h* as: + +```c +typedef struct +{ char description [256] ; + char originator [32] ; + char originator_reference [32] ; + char origination_date [10] ; + char origination_time [8] ; + unsigned int time_reference_low ; + unsigned int time_reference_high ; + short version ; + char umid [64] ; + char reserved [190] ; + unsigned int coding_history_size ; + char coding_history [256] ; +} SF_BROADCAST_INFO ; +``` + +### Return value + +`SF_TRUE` if the file contained a Broadcast Extension chunk or `SF_FALSE` +otherwise. + +## SFC_SET_BROADCAST_INFO + +Set the Broadcast Extension Chunk for WAV (and related) files. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_SET_BROADCAST_INFO + +data +: a pointer to an SF_BROADCAST_INFO struct + +datasize +: sizeof (SF_BROADCAST_INFO) + +### Return value + +`SF_TRUE` if setting the Broadcast Extension chunk was successful and `SF_FALSE` +otherwise. + +## SFC_GET_CHANNEL_MAP_INFO + +Retrieve the channel map contained in an AIFF or CAF Channel Layout chunk. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_GET_CHANNEL_MAP_INFO + +data +: a pointer to an array of int, the same size as the number of channels in the +file + +datasize +: number of channels * sizeof (int) + +Channel map positions are defined in an enum in *sndfile.h*: + +| Name | Value | Description | +|:-------------------------------------|:------|:------------------------------------------------------------------| +| SF_CHANNEL_MAP_INVALID | 0 | | +| SF_CHANNEL_MAP_MONO | 1 | | +| SF_CHANNEL_MAP_LEFT | 2 | Apple calls this 'Left' | +| SF_CHANNEL_MAP_RIGHT | 3 | Apple calls this 'Right' | +| SF_CHANNEL_MAP_CENTER | 4 | Apple calls this 'Center' | +| SF_CHANNEL_MAP_FRONT_LEFT | 5 | | +| SF_CHANNEL_MAP_FRONT_RIGHT | 6 | | +| SF_CHANNEL_MAP_FRONT_CENTER | 7 | | +| SF_CHANNEL_MAP_REAR_CENTER | 8 | Apple calls this 'Center Surround', Msft calls this 'Back Center' | +| SF_CHANNEL_MAP_REAR_LEFT | 9 | Apple calls this 'Left Surround', Msft calls this 'Back Left' | +| SF_CHANNEL_MAP_REAR_RIGHT | 10 | Apple calls this 'Right Surround', Msft calls this 'Back Right' | +| SF_CHANNEL_MAP_LFE | 11 | Apple calls this 'LFEScreen', Msft calls this 'Low Frequency' | +| SF_CHANNEL_MAP_FRONT_LEFT_OF_CENTER | 12 | Apple calls this 'Left Center' | +| SF_CHANNEL_MAP_FRONT_RIGHT_OF_CENTER | 13 | Apple calls this 'Right Center' | +| SF_CHANNEL_MAP_SIDE_LEFT | 14 | Apple calls this 'Left Surround Direct' | +| SF_CHANNEL_MAP_SIDE_RIGHT | 15 | Apple calls this 'Right Surround Direct' | +| SF_CHANNEL_MAP_TOP_CENTER | 16 | Apple calls this 'Top Center Surround' | +| SF_CHANNEL_MAP_TOP_FRONT_LEFT | 17 | Apple calls this 'Vertical Height Left' | +| SF_CHANNEL_MAP_TOP_FRONT_RIGHT | 18 | Apple calls this 'Vertical Height Right' | +| SF_CHANNEL_MAP_TOP_FRONT_CENTER | 19 | Apple calls this 'Vertical Height Center' | +| SF_CHANNEL_MAP_TOP_REAR_LEFT | 20 | Apple and MS call this 'Top Back Left' | +| SF_CHANNEL_MAP_TOP_REAR_RIGHT | 21 | Apple and MS call this 'Top Back Right' | +| SF_CHANNEL_MAP_TOP_REAR_CENTER | 22 | Apple and MS call this 'Top Back Center' | +| SF_CHANNEL_MAP_AMBISONIC_B_W | 23 | | +| SF_CHANNEL_MAP_AMBISONIC_B_X | 24 | | +| SF_CHANNEL_MAP_AMBISONIC_B_Y | 25 | | +| SF_CHANNEL_MAP_AMBISONIC_B_Z | 26 | | +| SF_CHANNEL_MAP_MAX | 27 | | + +### Return value + +`SF_TRUE` if the file contained a Channel Layout chunk or `SF_FALSE` otherwise. + +## SFC_SET_CHANNEL_MAP_INFO + +Set the channel map contained in an AIFF or CAF Channel Layout chunk. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_SET_CHANNEL_MAP_INFO + +data +: a pointer to an array of int, the same size as the number of channels in the +file + +datasize +: number of channels * sizeof (int) + +### Return value + +`SF_TRUE` if setting the Channel Layout chunk was successful and `SF_FALSE` +otherwise. + +## SFC_GET_CART_INFO + +Retrieve the Cart Chunk from WAV (and related) files. Based on AES46 standard +for CartChunk (see [CartChunk.org](http://www.cartchunk.org/) for more +information. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_GET_CART_INFO + +data +: a pointer to an SF_CART_INFO struct + +datasize +: sizeof (SF_CART_INFO) + +The SF_CART_INFO struct is defined in *sndfile.h* as: + +```c +#define SF_CART_INFO_VAR(p_tag_text_size) \ + struct + { char version [4] ; + char title [64] ; + char artist [64] ; + char cut_id [64] ; + char client_id [64] ; + char category [64] ; + char classification [64] ; + char out_cue [64] ; + char start_date [10] ; + char start_time [8] ; + char end_date [10] ; + char end_time [8] ; + char producer_app_id [64] ; + char producer_app_version [64] ; + char user_def [64] ; + long level_reference ; + SF_CART_TIMER post_timers [8] ; + char reserved [276] ; + char url [1024] ; + unsigned int tag_text_size ; + char tag_text[p_tag_text_size] ; + } +``` + +### Return value + +`SF_TRUE` if the file contained a Cart chunk or `SF_FALSE` otherwise. + +## SFC_SET_CART_INFO + +Set the Cart Chunk for WAV (and related) files. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_SET_CART_INFO + +data +: a pointer to an SF_CART_INFO struct + +datasize +: sizeof (SF_CART_INFO) + +### Return value + +SF_TRUE if setting the Cart chunk was successful and SF_FALSE otherwise. + +## SFC_GET_LOOP_INFO + +Retrieve loop information for file including time signature, length in beats and +original MIDI base note + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_GET_LOOP_INFO + +data +: a pointer to an SF_LOOP_INFO struct + +datasize +: sizeof (SF_LOOP_INFO) + +The SF_LOOP_INFO struct is defined in *sndfile.h* as: + +```c +typedef struct +{ short time_sig_num ; /* any positive integer > 0 */ + short time_sig_den ; /* any positive power of 2 > 0 */ + int loop_mode ; /* see SF_LOOP enum */ + + int num_beats ; /* this is NOT the amount of quarter notes !!!*/ + /* a full bar of 4/4 is 4 beats */ + /* a full bar of 7/8 is 7 beats */ + + float bpm ; /* suggestion, as it can be calculated using other fields:*/ + /* file's lenght, file's sampleRate and our time_sig_den*/ + /* -> bpms are always the amount of _quarter notes_ per minute */ + + int root_key ; /* MIDI note, or -1 for None */ + int future [6] ; +} SF_LOOP_INFO ; +``` + +### Examples + +```c +SF_LOOP_INFO loop; +sf_command (sndfile, SFC_GET_LOOP_INFO, &loop, sizeof (loop)) ; +``` + +### Return value + +`SF_TRUE` if the file header contains loop information for the file, `SF_FALSE` +otherwise. + +## SFC_GET_INSTRUMENT + +Retrieve instrument information from file including MIDI base note, keyboard +mapping and looping informations(start/stop and mode). + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_GET_INSTRUMENT + +data +: a pointer to an SF_INSTRUMENT struct + +datasize +: sizeof (SF_INSTRUMENT) + +The `SF_INSTRUMENT` struct is defined in *sndfile.h* as: + +```c +typedef struct +{ int gain ; + char basenote, detune ; + char velocity_lo, velocity_hi ; + char key_lo, key_hi ; + int loop_count ; + + struct + { int mode ; + unsigned int start ; + unsigned int end ; + unsigned int count ; + } loops [16] ; /* make variable in a sensible way */ +} SF_INSTRUMENT ; +``` + +`mode` values are defined as: + +| Name | Value | Description | +|:--------------------|:------|:------------| +| SF_LOOP_NONE | 800 | | +| SF_LOOP_FORWARD | 801 | | +| SF_LOOP_BACKWARD | 802 | | +| SF_LOOP_ALTERNATING | 803 | | + +### Examples + +```c +SF_INSTRUMENT inst ; +sf_command (sndfile, SFC_GET_INSTRUMENT, &inst, sizeof (inst)) ; +``` + +### Return value + +`SF_TRUE` if the file header contains instrument information for the file, +`SF_FALSE` otherwise. + +## SFC_SET_INSTRUMENT + +Set the instrument information for the file. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_SET_INSTRUMENT + +data +: a pointer to an SF_INSTRUMENT struct + +datasize +: sizeof (SF_INSTRUMENT) + +### Examples + +```c +SF_INSTRUMENT inst ; +sf_command (sndfile, SFC_SET_INSTRUMENT, &inst, sizeof (inst)) ; +``` + +### Return value + +`SF_TRUE` if the file header contains instrument information for the file, +`SF_FALSE` otherwise. + +## SFC_GET_CUE_COUNT + +Retrieve the number of cue markers available for retrieval using the +[SFC_GET_CUE](#sfc_get_cue) command. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_GET_CUE_COUNT + +data +: a pointer to a uint32_t + +datasize +: sizeof (uint32_t) + +### Examples + +```c +uint32_t cue_count ; +sf_command (sndfile, SFC_GET_CUE_COUNT, &cue_count, sizeof (cue_count)) ; +``` + +### Return value + +`SF_TRUE` if the file header contains cue marker information for the file, +`SF_FALSE` otherwise. + +## SFC_GET_CUE + +Retrieve cue marker information from file. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_GET_CUE + +data +: a pointer to an SF_CUES struct + +datasize +: sizeof (SF_CUES) + +The SF_CUES struct is defined in *sndfile.h* as: + +```c +typedef struct +{ int cue_count ; + + struct + { int32_t indx ; + uint32_t position ; + int32_t fcc_chunk ; + int32_t chunk_start ; + int32_t block_start ; + uint32_t sample_offset ; + char name [256] ; + } cue_points [100] ; +} SF_CUES ; +``` + +There is also an SF_CUES_VAR \#define that allows reading/writing more than 100 +cue markers. + +### Examples + +```c +SF_CUES cues ; +sf_command (sndfile, SFC_GET_CUE, &cues, sizeof (cues)) ; +``` + +### Return value + +`SF_TRUE` if the file header contains cue marker information for the file, +`SF_FALSE` otherwise. + +## SFC_SET_CUE + +Set the cue marker information for the file. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_SET_CUE + +data +: a pointer to an SF_CUES struct + +datasize +: sizeof (SF_CUES) + +### Examples + +```c +SF_CUES cues ; +sf_command (sndfile, SFC_SET_CUE, &cues, sizeof (cues)) ; +``` + +### Return value + +`SF_TRUE` if the file header contains cue marker information for the file, +`SF_FALSE` otherwise. + +## SFC_RF64_AUTO_DOWNGRADE + +Enable auto downgrade from RF64 to WAV. + +The EBU recomendation is that when writing RF64 files and the resulting file is +less than 4Gig in size, it should be downgraded to a WAV file (WAV files have a +maximum size of 4Gig). libsndfile doesn't follow the EBU recommendations +exactly, mainly because the test suite needs to be able test reading/writing +RF64 files without having to generate files larger than 4 gigabytes. + +Note: This command should be issued before the first bit of audio data has been +written to the file. Calling this command after audio data has been written will +return the current value of this setting, but will not allow it to be changed. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_RF64_AUTO_DOWNGRADE + +data +: NULL + +datasize +: SF_TRUE or SF_FALSE + +### Examples + +```c +/* Enable auto downgrade on file close. */ +sf_command (sndfile, SFC_RF64_AUTO_DOWNGRADE, NULL, SF_TRUE) ; +``` + +### Return value + +Returns `SF_TRUE` if `SFC_RF64_AUTO_DOWNGRADE` is set and `SF_FALSE` otherwise. + +## SFC_GET_ORIGINAL_SAMPLERATE + +Get original samplerate metadata. + +The Opus audio codec stores audio data independent of samplerate, but only +supports encoding or decoding at 8000Hz, 12000Hz, 16000Hz, 24000Hz or 48000Hz. +Opus includes a header field to record the original source input samplerate, and +a samplerate converter may be used if needed. + +This command gets the original samplerate header field. It does not enable any +(non-existent) samplerate conversion, nor change the current decoder samplerate. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_GET_ORIGINAL_SAMPLERATE + +data +: pointer to an integer + +datasize +: sizeof (int) + +### Examples + +```c +/* Get the original sample rate */ +int original_samplerate ; +sf_command (sndfile, SFC_GET_ORIGINAL_SAMPLERATE, &original_samplerate, sizeof (original_samplerate)) ; +``` + +### Return value + +Returns `SF_TRUE` on success, `SF_FALSE` otherwise. + +The passed integer is set to the value of the original samplerate. + +## SFC_SET_ORIGINAL_SAMPLERATE + +Set original samplerate metadata. + +The Opus audio codec stores audio data independent of samplerate, but only +supports encoding or decoding at 8000Hz, 12000Hz, 16000Hz, 24000Hz or 48000Hz. +Opus includes a header field to record the original source input samplerate, and +a samplerate converter may be used if needed. + +When writing an Opus file this command sets the original samplerate header field +to the provided value, which is then stored in the file. This has no effect on +the current encoder samplerate. + +When reading an Opus file this command overrides the original samplerate value +as read from the file. libsndfile uses this value to choose what samplerate to +decode at, rounding up to the nearest valid Opus samplerate. After a successful +call, the file samplerate and frames count may have changed. + +Note: This command should be issued before the first bit of audio data has been +read from or written to the file. + +### Parameters + +sndfile +: A valid SNDFILE* pointer + +cmd +: SFC_SET_ORIGINAL_SAMPLERATE + +data +: pointer to an integer + +datasize +: sizeof (int) + +### Examples + +```c +/* Store the original sample rate as 44100 */ +int original_samplerate 44100; +sf_command (sndfile, SFC_SET_ORIGINAL_SAMPLERATE, &original_samplerate, sizeof (input_samplerate)) ; +``` + +### Return value + +Returns SF_TRUE on success, SF_FALSE otherwise. + +On write, can only succeed if no data has been written. On read, if successful, +[SFC_GET_CURRENT_SF_INFO](#sfc_get_current_sf_info) should be called to +determine the new frames count and samplerate diff --git a/libsndfile-1.0.31/docs/embedded_files.md b/libsndfile-1.0.31/docs/embedded_files.md new file mode 100644 index 0000000..e55f2ed --- /dev/null +++ b/libsndfile-1.0.31/docs/embedded_files.md @@ -0,0 +1,21 @@ +--- +layout: page +--- + +# Embedded Sound Files + +By using the open SNDFILE with a file descriptor function: + + SNDFILE* sf_open_fd (int fd, int mode, SF_INFO *sfinfo, int close_desc) ; + +it is possible to open sound files embedded within larger files. There are +however a couple of caveats: + +* Read/Write mode (SFM_RDWR) is not supported. +* Writing of embedded files is only supported at the end of the file. +* Reading of embedded files is only supported at file offsets greater than zero. +* Not all file formats are supported (currently only WAV, AIFF and AU). + +The test program **multi_file_test.c** in the **tests/** directory of the source +code tarball shows how this functionality is used to read and write embedded +files. diff --git a/libsndfile-1.0.31/docs/formats.md b/libsndfile-1.0.31/docs/formats.md new file mode 100644 index 0000000..13bab52 --- /dev/null +++ b/libsndfile-1.0.31/docs/formats.md @@ -0,0 +1,52 @@ +--- +layout: page +title: libsndfile: Supported formats +--- + +# libsndfile : Supported formats + +The following table lists the file formats and encodings that libsndfile can +read and write. The file formats are arranged across the top and encodings along +the left edge. + +{:.formats-table} +| | Microsoft WAV | SGI / Apple AIFF / AIFC |Sun / DEC / NeXT AU / SND | Headerless RAW | Paris Audio File PAF | Commodore Amiga IFF / SVX | Sphere Nist WAV | IRCAM SF | Creative VOC | Soundforge W64 | GNU Octave 2.0 MAT4 | GNU Octave 2.1 MAT5 | Portable Voice Format PVF | Fasttracker 2 XI | HMM Tool Kit HTK | Apple CAF | Sound Designer II SD2 | Free Lossless Audio Codec FLAC | +|:-------------------|:-------------:|:-----------------------:|:------------------------:|:--------------:|:--------------------:|:-------------------------:|:---------------:|:--------:|:------------:|:--------------:|:-------------------:|:-------------------:|:-------------------------:|:----------------:|:----------------:|:---------:|:---------------------:|:------------------------------:| +| Unsigned 8 bit PCM | R/W | R/W | | R/W | | | | | R/W | R/W | | R/W | | | | | | | +| Signed 8 bit PCM | | R/W | R/W | R/W | R/W | R/W | R/W | | | | | | R/W | | | R/W | R/W | R/W | +| Signed 16 bit PCM | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W | | R/W | R/W | R/W | R/W | +| Signed 24 bit PCM | R/W | R/W | R/W | R/W | R/W | | R/W | | | R/W | | | | | | R/W | R/W | R/W | +| Signed 32 bit PCM | R/W | R/W | R/W | R/W | | | R/W | R/W | | R/W | R/W | R/W | R/W | | | R/W | | | +| 32 bit float | R/W | R/W | R/W | R/W | | | | R/W | | R/W | R/W | R/W | | | | R/W | | | +| 64 bit double | R/W | R/W | R/W | R/W | | | | | | R/W | R/W | R/W | | | | R/W | | | +| u-law encoding | R/W | R/W | R/W | R/W | | | R/W | R/W | R/W | R/W | | | | | | R/W | | | +| A-law encoding | R/W | R/W | R/W | R/W | | | R/W | R/W | R/W | R/W | | | | | | R/W | | | +| IMA ADPCM | R/W | | | | | | | | | R/W | | | | | | | | | +| MS ADPCM | R/W | | | | | | | | | R/W | | | | | | | | | +| GSM 6.10 | R/W | R/W | | R/W | | | | | | R/W | | | | | | | | | +| G721 ADPCM 32kbps | R/W | | R/W | | | | | | | | | | | | | | | | +| G723 ADPCM 24kbps | | | R/W | | | | | | | | | | | | | | | | +| G723 ADPCM 40kbps | | | R/W | | | | | | | | | | | | | | | | +| 12 bit DWVW | | R/W | | R/W | | | | | | | | | | | | | | | +| 16 bit DWVW | | R/W | | R/W | | | | | | | | | | | | | | | +| 24 bit DWVW | | R/W | | R/W | | | | | | | | | | | | | | | +| Ok Dialogic ADPCM | | | | R/W | | | | | | | | | | | | | | | +| 8 bit DPCM | | | | | | | | | | | | | | R/W | | | | | +| 16 bit DPCM | | | | | | | | | | | | | | R/W | | | | | + +From version 1.0.18, libsndfile also reads and writes +[FLAC](https://xiph.org/flac/) and [Ogg/Vorbis](https://xiph.org/vorbis/). + +From version 1.0.29, libsndfile can read and write +[Ogg/Opus](https://opus-codec.org/). + +Some of the file formats I am also interested in adding are: + +- Kurzweil K2000 sampler files. +- Ogg Speex. +- MPEG Layer 3 (commonly known as MP3) + +Other file formats may also be added on request. + +If you are interested in how to add a new format to a libsndfile, you may find +this [FAQ](new_file_type_howto.md) helpful. diff --git a/libsndfile-1.0.31/docs/index.md b/libsndfile-1.0.31/docs/index.md new file mode 100644 index 0000000..3779fdf --- /dev/null +++ b/libsndfile-1.0.31/docs/index.md @@ -0,0 +1,316 @@ +--- +layout: home +title: The libsndfile Home Page +--- + +Libsndfile is a C library for reading and writing files containing sampled sound +(such as MS Windows WAV and the Apple/SGI AIFF format) through one standard +library interface. It is released in source code format under the +[Gnu Lesser General Public License](http://www.gnu.org/copyleft/lesser.html). + +The library was written to compile and run on a Linux system but should compile +and run on just about any Unix (including MacOS X). +There are also pre-compiled binaries available for 32 and 64 bit windows. + +It was designed to handle both little-endian (such as WAV) and big-endian (such +as AIFF) data, and to compile and run correctly on little-endian (such as Intel +and DEC/Compaq Alpha) processor systems as well as big-endian processor systems +such as Motorola 68k, Power PC, MIPS and Sparc. Hopefully the design of the +library will also make it easy to extend for reading and writing new sound file +formats. + +It has been compiled and tested (at one time or another) on the following +systems: + +* Every platform supported by Debian GNU/Linux including x86_64-linux-gnu, + i486-linux-gnu, powerpc-linux-gnu, sparc-linux-gnu, alpha-linux-gnu, + mips-linux-gnu and armel-linux-gnu. +* powerpc-apple-darwin7.0 (Mac OS X 10.3) +* sparc-sun-solaris2.8 (using gcc) +* mips-sgi-irix5.3 (using gcc) +* QNX 6.0 +* i386-unknown-openbsd2.9 +* Microsoft Windows + +At the moment, each new release is being tested on i386 Linux, x86_64 Linux, +PowerPC Linux, Win32 and Win64. + +## Features + +libsndfile has the following main features : + +* Ability to read and write a large number of [file formats](formats.html). +* A simple, elegant and easy to use Applications Programming Interface. +* Usable on Unix, Win32, MacOS and others. +* On the fly format conversion, including endian-ness swapping, type conversion + and bitwidth scaling. +* Optional normalisation when reading floating point data from files containing + integer data. +* Ability to open files in read/write mode. +* The ability to write the file header without closing the file (only on files + open for write or read/write). +* Ability to query the library about all supported formats and retrieve text + strings describing each format. + +libsndfile has a comprehensive test suite so that each release is as bug free +as possible. +When new bugs are found, new tests are added to the test suite to ensure that +these bugs don't creep back into the code. +When new features are added, tests are added to the test suite to make sure that +these features continue to work correctly even when they are old features. + +## History + +My first attempt at reading and writing WAV files was in 1990 or so under +Windows 3.1. I started using Linux in early 1995 and contributed some code to +the [wavplay](http://www.vaxxine.com/ve3wwg/gnuwave.html) program. That +contributed code would eventually mutate into this library. As one of my +interests is Digital Signal Processing (DSP) I decided that as well as reading +data from an audio file in the native format (typically 16 bit short integers) +it would also be useful to be able to have the library do the conversion to +floating point numbers for DSP applications. It then dawned on me that whatever +file format (anything from 8 bit unsigned chars, to 32 bit floating point +numbers) the library should be able to convert the data to whatever format the +library user wishes to use it in. For example, in a sound playback program, the +library caller typically wants the sound data in 16 bit short integers to dump +into a sound card even though the data in the file may be 32 bit floating point +numbers (ie Microsoft's WAVE_FORMAT_IEEE_FLOAT format). Another example would be +someone doing speech recognition research who has recorded some speech as a 16 +bit WAV file but wants to process it as double precision floating point numbers. + +Here is the release history for libsndfile: + +* Version 0.0.8 (Feb 15 1999) First official release. +* Version 0.0.28 (Apr 26 2002) Final release of version 0 of libsndfile. +* Version 1.0.0rc1 (Jun 24 2002) Release candidate 1 of version 1 of libsndfile. +* Version 1.0.0rc6 (Aug 14 2002) MacOS 9 fixes. +* Version 1.0.0 (Aug 16 2002) First 1.0.X release. +* Version 1.0.1 (Sep 14 2002) Added MAT4 and MAT5 file formats. +* Version 1.0.2 (Nov 24 2002) Added VOX ADPCM format. +* Version 1.0.3 (Dec 09 2002) Fixes for Linux on ia64 CPUs. +* Version 1.0.4 (Feb 02 2003) New file formats and functionality. +* Version 1.0.5 (May 03 2003) One new file format and new functionality. +* Version 1.0.6 (Feb 08 2004) Large file fix for Linux/Solaris, new + functionality and Win32 improvements. +* Version 1.0.7 (Feb 24 2004) Fix build problems on MacOS X and fix ia64/MIPS + etc clip mode detction. +* Version 1.0.8 (Mar 14 2004) Minor bug fixes. +* Version 1.0.9 (Mar 30 2004) Add AVR format. Improve handling of some WAV + files. +* Version 1.0.10 (Jun 15 2004) Minor bug fixes. Fix support for Win32 MinGW + compiler. +* Version 1.0.11 (Nov 15 2004) Add SD2 file support, reading of loop data in WAV + and AIFF. Minor bug fixes. +* Version 1.0.12 (Sep 30 2005) Add FLAC and CAF file support, virtual I/O + interface. Minor bug fixes and cleanups. +* Version 1.0.13 (Jan 21 2006) Add read/write of instrument chunks. Minor bug + fixes. +* Version 1.0.14 (Feb 19 2006) Minor bug fixes. Start shipping windows + binary/source ZIP. +* Version 1.0.15 (Mar 16 2006) Minor bug fixes. +* Version 1.0.16 (Apr 30 2006) Add support for RIFX. Other minor feature + enhancements and bug fixes. +* Version 1.0.17 (Aug 31 2006) Add C++ wrapper sndfile.hh. Minor bug fixes and + cleanups. +* Version 1.0.18 (Feb 07 2009) Add Ogg/Vorbis suppport, remove captive + libraries, many new features and bug fixes. Generate Win32 and Win64 + pre-compiled binaries. +* Version 1.0.19 (Mar 02 2009) Fix for CVE-2009-0186. Huge number of minor fixes + as a result of static analysis. +* Version 1.0.20 (May 14 2009) Fix for potential heap overflow. +* Version 1.0.21 (December 13 2009) Bunch of minor bug fixes. +* Version 1.0.22 (October 04 2010) Bunch of minor bug fixes. +* Version 1.0.23 (October 10 2010) Minor bug fixes. +* Version 1.0.24 (March 23 2011) Minor bug fixes. +* Version 1.0.25 (July 13 2011) Fix for Secunia Advisory SA45125. Minor bug + fixes and improvements. +* Version 1.0.26 (November 22 2015) Fix for CVE-2014-9496, CVE-2014-9756 and + CVE-2015-7805. Add ALAC/CAF support. Minor bug fixes and improvements. +* Version 1.0.27 (June 19 2016) Fix a seek regression in 1.0.26. Add metadata + read/write for CAF and RF64. FIx PAF endian-ness issue. +* Version 1.0.28 (April 2 2017) Fix buffer overruns in FLAC and ID3 handling + code. Reduce default header memory requirements. Fix detection of Large File + Support for 32 bit systems. +* Version 1.0.29 (August 15 2020) Opus support, build system improvements and + bug fixes. +* Version 1.0.30 (September 19 2020) Bugfix release. Fix file descriptor leaks + in sf_open_fd () function. Fix critical CMake bug leading to broken ABI on + Linux platforms. Other numerous fixes to CMake build system, consider it + stable now. Fix some memory leaks. Fix handling of some SD2 files. Update + documentation. Integrate GitHub Actions for faster test builds and Oss-Fuzz + for fuzzing tests. Move sndfile.h.in from src/ to include/ directory. To avoid + problems, delete old generated sndfile.h from $(top_builddir)/src. +* Version 1.0.31 (January 24 2021) Bugfix release. Fix multiple memory leaks + reported by OSS-Fuzz. More SSE2-optimized functions for x86 and amd64. + +## Similar or Related Projects + +* [SoX](http://sox.sourceforge.net/) is a program for converting between sound + file formats. +* [Wavplay](http://www.hitsquad.com/smm/programs/WavPlay/) started out as a + minimal WAV file player under Linux and has mutated into Gnuwave, a + client/server application for more general multimedia and games sound + playback. +* [Audiofile](http://www.68k.org/~michael/audiofile/) (libaudiofile) is a + library similar to libsndfile but with a different programming interface. The + author Michael Pruett has set out to clone (and fix some bugs in) the + libaudiofile library which ships with SGI's IRIX OS. +* [sndlib.tar.gz](ftp://ccrma-ftp.stanford.edu/pub/Lisp/sndlib.tar.gz) is + another library written by Bill Schottstaedt of CCRMA. + +## Licensing + +libsndfile is released under the terms of the GNU Lesser General Public License, +of which there are two versions; +[version 2.1](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html) +and +[version 3](http://www.gnu.org/copyleft/lesser.html). +To maximise the compatibility of libsndfile, the user may choose to use +libsndfile under either of the above two licenses. +You can also read a simple explanation of the ideas behind the GPL and the LGPL +[here](http://www.gnu.org/copyleft/lesser.html). + +You can use libsndfile with +[Free Software](http://www.gnu.org/), +[Open Source](http://www.opensource.org/), +proprietary, shareware or other closed source applications as long as libsndfile +is used as a dynamically loaded library and you abide by a small number of other +conditions (read the LGPL for more info). +With applications released under the GNU GPL you can also use libsndfile +statically linked to your application. + +I would like to see libsndfile used as widely as possible but I would prefer it +if you released software that uses libsndfile as +[Free Software](http://www.gnu.org/) +or +[Open Source](http://www.opensource.org/). +However, if you put in a great deal of effort building a significant application +which simply uses libsndfile for file I/O, then I have no problem with you +releasing that as closed source and charging as much money as you want for it as +long as you abide by [the license](http://www.gnu.org/copyleft/lesser.html). + +## Download + +Check latest version on +[GitHub Releases page](https://github.com/libsndfile/libsndfile/releases/). + +Binatries and source packages are signed by current releaser David Seifert aka +@SoapGentoo. You can verify signatures with his public GPG key: + +``` +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v2 + +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 +=K3x+ +-----END PGP PUBLIC KEY BLOCK----- +``` + +## See Also + +* [sndfile-tools](https://github.com/libsndfile/sndfile-tools): a small +collection of programs which use libsndfile. diff --git a/libsndfile-1.0.31/docs/libsndfile.css b/libsndfile-1.0.31/docs/libsndfile.css new file mode 100644 index 0000000..3386bc3 --- /dev/null +++ b/libsndfile-1.0.31/docs/libsndfile.css @@ -0,0 +1,101 @@ +body { + background : black ; + color : white ; + font-family : arial, helvetica, sans-serif ; + line-height: 1.5 ; + margin-left: 6%; + margin-right: 6%; +} +td { + font-family : arial, helvetica, sans-serif ; + background : black ; + color : white ; +} +center { + font-family : arial, helvetica, sans-serif ; +} +p { + font-family : arial, helvetica, sans-serif ; + text-align : left ; +} +.indent_block { + font-family : arial, helvetica, sans-serif ; + text-align : left ; +} +br { + font-family : arial, helvetica, sans-serif ; +} +form { + font-family : arial, helvetica, sans-serif ; +} +ul { + font-family : arial, helvetica, sans-serif ; + text-align : left ; +} +ol { + font-family : arial, helvetica, sans-serif ; + text-align : left ; +} +dl { + font-family : arial, helvetica, sans-serif ; + text-align : left ; +} +h1 { + font-size : xx-large ; + background : black ; + color : #5050FF ; + text-align : left ; +} +h2 { + font-size : x-large ; + background : black ; + color : #5050FF ; + text-align : left ; +} +h3 { + font-size : large ; + background : black ; + color : #5050FF ; + text-align : left ; +} +h4 { + font-size : medium ; + background : black ; + color : #5050FF ; + text-align : left ; +} +pre { + font-family : courier, monospace ; + font-size : medium ; +} +code, +kbd, +samp, +var { + font-family: "Courier New", monospace, serif; + font-size: 1em; +} +a:link { color : #9090FF ; } +a:visited { color : #5050FF ; } +a:active { color : #FF00FF ; } +a:hover { background-color : #202080 ; } + +table.formats-table { + text-align: center; + font-size: small; + border-collapse: collapse; +} + +table.formats-table, table.formats-table th, table.formats-table td { + border: 1px solid white; +} + +.image-logo { + display: block; + margin-left: auto; + margin-right: auto; +} + +nav { + text-align: center; +} diff --git a/libsndfile-1.0.31/docs/libsndfile.jpg b/libsndfile-1.0.31/docs/libsndfile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7855b92d0e635df3f22cf41ad371c700fa8508e5 GIT binary patch literal 22043 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. + +To help make these steps clearer let's suppose we are adding support for the +Whacky file format whose files contain 'W','A','C' and 'K' as the first four +bytes of the file format. Lets also assume that Whacky files contain PCM encoded +data. + +## Step 1 + +Create a new .c file in the src/ directory of the libsndfile source tree. The +file name should be reasonable descriptive so that is is obvious that files of +the new type are handled by this file. In this particular case the file might +be named 'whacky.c'. + +## Step 2 + +Add your new source code file to the build process. + +Edit the file src/Makefile.am and add the name of your file handler to the +FILESPECIFIC list of handlers. This list looks something like this: + + FILESPECIFIC = aiff.c au.c au_g72x.c nist.c paf.c raw.c samplitude.c \ + svx.c wav.c wav_float.c wav_gsm610.c wav_ima_adpcm.c \ + wav_ms_adpcm.c + +Then, run the script named 'reconf' in the libsndfile top level directory, +which will run autoconf and other associated tools. Finally run "./configure" +in the top level directory. You may want to use the "--disable-gcc-opt" option +to disable gcc optimisations and make debugging with gdb/ddd easier. + +## Step 3 + +Add a unique identifier for the new file type. + +Edit src/sndfile.h.in and find the enum containing the SF_FORMAT_XXX identifiers. +Since you will be adding a major file type you should add your identifier to the +top part of the list where the values are above 0x10000 in value. The easiest +way to do this is to find the largest value in the list, add 0x10000 to it and +make that your new identifier value. The identifier should be something like +SF_FORMAT_WACK. + +## Step 4 + +Add code to the file type recogniser function. + +Edit src/sndfile.c and find the function guess_file_type (). This function +reads the first 3 ints of the file and from that makes a guess at the file +type. In our case we would add: + + if (buffer [0] == MAKE_MARKER ('W','A','C','K')) + return SF_FORMAT_WACK ; + +The use of the MAKE_MARKER macro should be pretty obvious and it is defined at +the top of file should you need to have a look at it. + +## Step 5 + +Add a call to your open function from psf_open_file (). + +Edit src/sndfile.c and find the switch statement in psf_open_file (). It starts +like this: + + switch (filetype) + { case SF_FORMAT_WAV : + error = wav_open (psf) ; + break ; + + case SF_FORMAT_AIFF : + error = aiff_open (psf) ; + break ; + +Towards the bottom of this switch statement your should add one for the new file +type. Something like: + + case SF_FORMAT_WACK : + sf_errno = whacky_open (psf) ; + break ; + +## Step 6 + +Add prototypes for new open read and open write functions. + +Edit src/common.h, go to the bottom of the file and add something like + + int whacky_open (SF_PRIVATE *psf) ; + +## Step 7 + +Implement your open read function. The best way to do this is by coding +something much like one of the other file formats. The file src/au.c might be a +good place to start. + +In src/whacky.c you should now implement the function whacky_open() which +was prototyped in src/common.h. This function should return 0 on success and +a non-zero number on error. + +Error values are defined in src/common.h in a enum which starts at SFE_NO_ERROR. +When adding a new error value, you also need to add an error string to the +SndfileErrors array in src/sndfile.c. + +To parse the header of your new file type you should avoid using standard read/ +write/seek functions (and the fread/fwrite/fseek etc) and instead use +psf_binheader_readf () which is implemented and documented in src/common.h. + +During the parsing process, you should also print logging information to +libsndfile's internal log buffer using the psf_log_printf() function. + +At the end of the open read process, you should have set a number of fields in +the SF_PRIVATE structure pointed to by psf. + +**THIS FILE IS INCOMPLETE** diff --git a/libsndfile-1.0.31/docs/octave.md b/libsndfile-1.0.31/docs/octave.md new file mode 100644 index 0000000..f619ca6 --- /dev/null +++ b/libsndfile-1.0.31/docs/octave.md @@ -0,0 +1,71 @@ +--- +layout: page +--- + +# libsndfile and GNU Octave + +[GNU Octave](http://www.octave.org/) is a high-level interactive language for +numerical computations. There are currently two development streams, a stable +2.0.X series and a development 2.1.X series. Octave reads and writes data in +binary formats that were originally developed for +[MATLAB](http://www.mathworks.com/). Version 2.0.X of Octave uses binary data +files compatible with MATLAB version 4.2 while Octave 2.1.X uses binary data +files compatible with MATLAB version 5.0 as well as being able to read the older +MATLAB 4.2 format. + +From version 1.0.1 of libsndfile onwards, libsndfile has the ability of reading +and writing a small subset of the binary data files used by both versions of GNU +Octave. This gives people using GNU Octave for audio based work an easy method +of moving audio data between GNU Octave and other programs which use libsndfile. + +For instance it is now possible to do the following: + +* Load a WAV file into a sound file editor such as + [Sweep](http://www.metadecks.org/software/sweep/). +* Save it as a MAT4 file. +* Load the data into Octave for manipulation. +* Save the modified data. +* Reload it in Sweep. + +Another example would be using the MAT4 or MAT5 file formats as a format which +can be easily loaded into Octave for viewing/analyzing as well as a format which +can be played with command line players such as the one included with +libsndfile. + +## Details + +Octave, like most programming languages, uses variables to store data, and +Octave variables can contain both arrays and matrices. It is also able to store +one or more of these variables in a file. When reading Octave files, libsndfile +expects a file to contain two variables and their associated data. The first +variable should contain a variable holding the file sample rate while the second +variable contains the audio data. + +For example, to generate a sine wave and store it as a binary file which is +compatible with libsndfile, do the following: + + octave:1 > samplerate = 44100 ; + octave:2 > wavedata = sin ((0:1023)*2*pi/1024) ; + octave:3 > save sine.mat samplerate wavedata + +The process of reading and writing files compatible with libsndfile can be made +easier by use of two Octave script files: + + octave:4 > [data fs] = sndfile_load ("sine.mat") ; + octave:5 > sndfile_save ("sine2.mat", data, fs) ; + +In addition, libsndfile contains a command line program which which is able to +play the correct types of Octave files. Using this command line player +**sndfile-play** and a third Octave script file allows Octave data to be played +from within Octave on any of the platforms which **sndfile-play** supports (at +the moment: Linux, MacOS X, Solaris and Win32). + + octave:6 > sndfile_play (data, fs) ; + +These three Octave scripts are installed automatically in Octave's site script +directory when libsndfile is installed (except on Win32) ie when libsndfile is +being installed into /usr/local, the Octave scripts will be installed in +/usr/local/share/octave/site/m/. + +There are some other Octave scripts for audio to be found +[here](http://octave.sourceforge.net/audio/index.html). diff --git a/libsndfile-1.0.31/docs/print.css b/libsndfile-1.0.31/docs/print.css new file mode 100644 index 0000000..deb5b13 --- /dev/null +++ b/libsndfile-1.0.31/docs/print.css @@ -0,0 +1,14 @@ +body { + background:white; + color:black; +} + +h1{ + background:white; + color:black; +} + +h2 { + background:white; + color:#666; +} diff --git a/libsndfile-1.0.31/docs/sndfile_info.md b/libsndfile-1.0.31/docs/sndfile_info.md new file mode 100644 index 0000000..78d3548 --- /dev/null +++ b/libsndfile-1.0.31/docs/sndfile_info.md @@ -0,0 +1,36 @@ +--- +layout: page +title: sndfile-info +--- + +Here is an example of the output from the **sndfile-info** program +distributed with libsndfile. + +This file was opened and parsed correctly but had been truncated so that +the values in the **FORM** and **SSND** chunks were incorrect. + +``` + erikd@hendrix > examples/sndfile-info truncated.aiff + truncated.aiff + size : 200000 + FORM : 307474 (should be 199992) + AIFF + COMM : 18 + Sample Rate : 16000 + Samples : 76857 + Channels : 2 + Sample Size : 16 + SSND : 307436 (should be 199946) + Offset : 0 + Block Size : 0 + + -------------------------------- + Sample Rate : 16000 + Frames : 76857 + Channels : 2 + Bit Width : 16 + Format : 0x00020001 + Sections : 1 + Seekable : TRUE + Signal Max : 32766 +``` diff --git a/libsndfile-1.0.31/docs/tutorial.md b/libsndfile-1.0.31/docs/tutorial.md new file mode 100644 index 0000000..848c175 --- /dev/null +++ b/libsndfile-1.0.31/docs/tutorial.md @@ -0,0 +1,10 @@ +--- +layout: page +--- + +# libsndfile Tutorial + +**More coming soon.** + +For now, the best place to look for example code is the `examples/` directory of the source code distribution and the +libsndfile test suite which is located in the `tests/` directory of the source code distribution. diff --git a/libsndfile-1.0.31/docs/win32.md b/libsndfile-1.0.31/docs/win32.md new file mode 100644 index 0000000..6106517 --- /dev/null +++ b/libsndfile-1.0.31/docs/win32.md @@ -0,0 +1,18 @@ +--- +layout: page +--- + +# Building libsndfile on Win32 + +**Note : For pre-compiled binaries for windows, both for win32 and win64, see +the main web page.** + +There are currently two build systems; the official GNU autotool based one and +a more limited and experimental CMake based build system. + +libsndfile is written to be compiled by a compiler which supports large chunks +of the 1999 ISO C Standard (tested with GCC, Clang and Visual Studio 2015). + +It is recommended to use CMake and Visual Studio to build libsndfile on Windows +but you can try the [MinGW](http://www.mingw.org/) compiler suite with Autotools +or CMake buildsystem. diff --git a/libsndfile-1.0.31/examples/generate.c b/libsndfile-1.0.31/examples/generate.c new file mode 100644 index 0000000..dade7d9 --- /dev/null +++ b/libsndfile-1.0.31/examples/generate.c @@ -0,0 +1,131 @@ +/* +** Copyright (C) 2002-2011 Erik de Castro Lopo +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the author nor the names of any contributors may be used +** to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include + +#include + +#define BUFFER_LEN 4096 + +static void encode_file (const char *infilename, const char *outfilename, int filetype) ; + +int +main (int argc, char **argv) +{ + if (argc != 2) + { puts ("\nEncode a single input file into a number of different output ") ; + puts ("encodings. These output encodings can then be moved to another ") ; + puts ("OS for testing.\n") ; + puts (" Usage : generate \n") ; + exit (1) ; + } ; + + /* A couple of standard WAV files. Make sure Win32 plays these. */ + encode_file (argv [1], "pcmu8.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_U8) ; + encode_file (argv [1], "pcm16.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; + encode_file (argv [1], "imaadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM) ; + encode_file (argv [1], "msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM) ; + encode_file (argv [1], "gsm610.wav" , SF_FORMAT_WAV | SF_FORMAT_GSM610) ; + + /* Soundforge W64. */ + encode_file (argv [1], "pcmu8.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_U8) ; + encode_file (argv [1], "pcm16.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_16) ; + encode_file (argv [1], "imaadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM) ; + encode_file (argv [1], "msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM) ; + encode_file (argv [1], "gsm610.w64" , SF_FORMAT_W64 | SF_FORMAT_GSM610) ; + + return 0 ; +} /* main */ + +/*============================================================================================ +** Helper functions and macros. +*/ + +#define PUT_DOTS(k) \ + { while (k--) \ + putchar ('.') ; \ + putchar (' ') ; \ + } + +/*======================================================================================== +*/ + +static void +encode_file (const char *infilename, const char *outfilename, int filetype) +{ static float buffer [BUFFER_LEN] ; + + SNDFILE *infile, *outfile ; + SF_INFO sfinfo ; + int k, readcount ; + + printf (" %s -> %s ", infilename, outfilename) ; + fflush (stdout) ; + + k = 16 - strlen (outfilename) ; + PUT_DOTS (k) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + if (! (infile = sf_open (infilename, SFM_READ, &sfinfo))) + { printf ("Error : could not open file : %s\n", infilename) ; + puts (sf_strerror (NULL)) ; + exit (1) ; + } + + sfinfo.format = filetype ; + + if (! sf_format_check (&sfinfo)) + { sf_close (infile) ; + printf ("Invalid encoding\n") ; + return ; + } ; + + if (! (outfile = sf_open (outfilename, SFM_WRITE, &sfinfo))) + { printf ("Error : could not open file : %s\n", outfilename) ; + puts (sf_strerror (NULL)) ; + exit (1) ; + } ; + + while ((readcount = sf_read_float (infile, buffer, BUFFER_LEN)) > 0) + sf_write_float (outfile, buffer, readcount) ; + + sf_close (infile) ; + sf_close (outfile) ; + + printf ("ok\n") ; + + return ; +} /* encode_file */ + diff --git a/libsndfile-1.0.31/examples/list_formats.c b/libsndfile-1.0.31/examples/list_formats.c new file mode 100644 index 0000000..348c81b --- /dev/null +++ b/libsndfile-1.0.31/examples/list_formats.c @@ -0,0 +1,76 @@ +/* +** Copyright (C) 2001-2014 Erik de Castro Lopo +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the author nor the names of any contributors may be used +** to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include + +#include + +int +main (void) +{ SF_FORMAT_INFO info ; + SF_INFO sfinfo ; + int format, major_count, subtype_count, m, s ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + printf ("Version : %s\n\n", sf_version_string ()) ; + + sf_command (NULL, SFC_GET_FORMAT_MAJOR_COUNT, &major_count, sizeof (int)) ; + sf_command (NULL, SFC_GET_FORMAT_SUBTYPE_COUNT, &subtype_count, sizeof (int)) ; + + sfinfo.channels = 1 ; + for (m = 0 ; m < major_count ; m++) + { info.format = m ; + sf_command (NULL, SFC_GET_FORMAT_MAJOR, &info, sizeof (info)) ; + printf ("%s (extension \"%s\")\n", info.name, info.extension) ; + + format = info.format ; + + for (s = 0 ; s < subtype_count ; s++) + { info.format = s ; + sf_command (NULL, SFC_GET_FORMAT_SUBTYPE, &info, sizeof (info)) ; + + format = (format & SF_FORMAT_TYPEMASK) | info.format ; + + sfinfo.format = format ; + if (sf_format_check (&sfinfo)) + printf (" %s\n", info.name) ; + } ; + puts ("") ; + } ; + puts ("") ; + + return 0 ; +} /* main */ + diff --git a/libsndfile-1.0.31/examples/make_sine.c b/libsndfile-1.0.31/examples/make_sine.c new file mode 100644 index 0000000..76f35b0 --- /dev/null +++ b/libsndfile-1.0.31/examples/make_sine.c @@ -0,0 +1,100 @@ +/* +** Copyright (C) 1999-2012 Erik de Castro Lopo +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the author nor the names of any contributors may be used +** to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include + +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846264338 +#endif + +#define SAMPLE_RATE 44100 +#define SAMPLE_COUNT (SAMPLE_RATE * 4) /* 4 seconds */ +#define AMPLITUDE (1.0 * 0x7F000000) +#define LEFT_FREQ (344.0 / SAMPLE_RATE) +#define RIGHT_FREQ (466.0 / SAMPLE_RATE) + +int +main (void) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k ; + int *buffer ; + + if (! (buffer = malloc (2 * SAMPLE_COUNT * sizeof (int)))) + { printf ("Error : Malloc failed.\n") ; + return 1 ; + } ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = SAMPLE_COUNT ; + sfinfo.channels = 2 ; + sfinfo.format = (SF_FORMAT_WAV | SF_FORMAT_PCM_24) ; + + if (! (file = sf_open ("sine.wav", SFM_WRITE, &sfinfo))) + { printf ("Error : Not able to open output file.\n") ; + free (buffer) ; + return 1 ; + } ; + + if (sfinfo.channels == 1) + { for (k = 0 ; k < SAMPLE_COUNT ; k++) + buffer [k] = AMPLITUDE * sin (LEFT_FREQ * 2 * k * M_PI) ; + } + else if (sfinfo.channels == 2) + { for (k = 0 ; k < SAMPLE_COUNT ; k++) + { buffer [2 * k] = AMPLITUDE * sin (LEFT_FREQ * 2 * k * M_PI) ; + buffer [2 * k + 1] = AMPLITUDE * sin (RIGHT_FREQ * 2 * k * M_PI) ; + } ; + } + else + { printf ("Error : make_sine can only generate mono or stereo files.\n") ; + sf_close (file) ; + free (buffer) ; + return 1 ; + } ; + + if (sf_write_int (file, buffer, sfinfo.channels * SAMPLE_COUNT) != + sfinfo.channels * SAMPLE_COUNT) + puts (sf_strerror (file)) ; + + sf_close (file) ; + free (buffer) ; + return 0 ; +} /* main */ + diff --git a/libsndfile-1.0.31/examples/sfprocess.c b/libsndfile-1.0.31/examples/sfprocess.c new file mode 100644 index 0000000..1c141a4 --- /dev/null +++ b/libsndfile-1.0.31/examples/sfprocess.c @@ -0,0 +1,142 @@ +/* +** Copyright (C) 2001-2013 Erik de Castro Lopo +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the author nor the names of any contributors may be used +** to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include + +/* Include this header file to use functions from libsndfile. */ +#include + +/* This will be the length of the buffer used to hold.frames while +** we process them. +*/ +#define BUFFER_LEN 1024 + +/* libsndfile can handle more than 6 channels but we'll restrict it to 6. */ +#define MAX_CHANNELS 6 + +/* Function prototype. */ +static void process_data (double *data, int count, int channels) ; + + +int +main (void) +{ /* This is a buffer of double precision floating point values + ** which will hold our data while we process it. + */ + static double data [BUFFER_LEN] ; + + /* A SNDFILE is very much like a FILE in the Standard C library. The + ** sf_open function return an SNDFILE* pointer when they sucessfully + ** open the specified file. + */ + SNDFILE *infile, *outfile ; + + /* A pointer to an SF_INFO struct is passed to sf_open. + ** On read, the library fills this struct with information about the file. + ** On write, the struct must be filled in before calling sf_open. + */ + SF_INFO sfinfo ; + int readcount ; + const char *infilename = "input.wav" ; + const char *outfilename = "output.wav" ; + + /* The SF_INFO struct must be initialized before using it. + */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + /* Here's where we open the input file. We pass sf_open the file name and + ** a pointer to an SF_INFO struct. + ** On successful open, sf_open returns a SNDFILE* pointer which is used + ** for all subsequent operations on that file. + ** If an error occurs during sf_open, the function returns a NULL pointer. + ** + ** If you are trying to open a raw headerless file you will need to set the + ** format and channels fields of sfinfo before calling sf_open(). For + ** instance to open a raw 16 bit stereo PCM file you would need the following + ** two lines: + ** + ** sfinfo.format = SF_FORMAT_RAW | SF_FORMAT_PCM_16 ; + ** sfinfo.channels = 2 ; + */ + if (! (infile = sf_open (infilename, SFM_READ, &sfinfo))) + { /* Open failed so print an error message. */ + printf ("Not able to open input file %s.\n", infilename) ; + /* Print the error message from libsndfile. */ + puts (sf_strerror (NULL)) ; + return 1 ; + } ; + + if (sfinfo.channels > MAX_CHANNELS) + { printf ("Not able to process more than %d channels\n", MAX_CHANNELS) ; + return 1 ; + } ; + /* Open the output file. */ + if (! (outfile = sf_open (outfilename, SFM_WRITE, &sfinfo))) + { printf ("Not able to open output file %s.\n", outfilename) ; + puts (sf_strerror (NULL)) ; + return 1 ; + } ; + + /* While there are.frames in the input file, read them, process + ** them and write them to the output file. + */ + while ((readcount = sf_read_double (infile, data, BUFFER_LEN))) + { process_data (data, readcount, sfinfo.channels) ; + sf_write_double (outfile, data, readcount) ; + } ; + + /* Close input and output files. */ + sf_close (infile) ; + sf_close (outfile) ; + + return 0 ; +} /* main */ + +static void +process_data (double *data, int count, int channels) +{ double channel_gain [MAX_CHANNELS] = { 0.5, 0.8, 0.1, 0.4, 0.4, 0.9 } ; + int k, chan ; + + /* Process the data here. + ** If the soundfile contains more then 1 channel you need to take care of + ** the data interleaving youself. + ** Current we just apply a channel dependant gain. + */ + + for (chan = 0 ; chan < channels ; chan ++) + for (k = chan ; k < count ; k+= channels) + data [k] *= channel_gain [chan] ; + + return ; +} /* process_data */ + diff --git a/libsndfile-1.0.31/examples/sndfile-loopify.c b/libsndfile-1.0.31/examples/sndfile-loopify.c new file mode 100644 index 0000000..b0aded4 --- /dev/null +++ b/libsndfile-1.0.31/examples/sndfile-loopify.c @@ -0,0 +1,180 @@ +/* +** Copyright (C) 1999-2015 Erik de Castro Lopo +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the author nor the names of any contributors may be used +** to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +** A quick/rough hack to add SF_INSTRUMENT data to a file. It compiles, but +** no guarantees beyond that. Happy to receive patches to fix/improve it. +** +** Code for this was stolen from programs/sndfile-convert.c and related code. +*/ + +#include +#include +#include +#include + +#include + +#define BUFFER_LEN (1 << 14) + + +typedef struct +{ char *infilename, *outfilename ; + SF_INFO infileinfo, outfileinfo ; +} OptionData ; + +const char * program_name (const char * argv0) ; +static void sfe_copy_data_int (SNDFILE *outfile, SNDFILE *infile, int channels) ; +static void add_instrument_data (SNDFILE *outfile, const SF_INFO * in_info) ; + +static void +usage_exit (const char *progname) +{ + printf ("\nUsage : %s \n", progname) ; + puts ("") ; + exit (1) ; +} /* usage_exit */ + +int +main (int argc, char * argv []) +{ const char *progname, *infilename, *outfilename ; + SNDFILE *infile = NULL, *outfile = NULL ; + SF_INFO in_sfinfo, out_sfinfo ; + + progname = program_name (argv [0]) ; + + if (argc < 3 || argc > 5) + usage_exit (progname) ; + + infilename = argv [argc-2] ; + outfilename = argv [argc-1] ; + + if (strcmp (infilename, outfilename) == 0) + { printf ("Error : Input and output filenames are the same.\n\n") ; + usage_exit (progname) ; + } ; + + if (strlen (infilename) > 1 && infilename [0] == '-') + { printf ("Error : Input filename (%s) looks like an option.\n\n", infilename) ; + usage_exit (progname) ; + } ; + + if (outfilename [0] == '-') + { printf ("Error : Output filename (%s) looks like an option.\n\n", outfilename) ; + usage_exit (progname) ; + } ; + + memset (&in_sfinfo, 0, sizeof (in_sfinfo)) ; + + if ((infile = sf_open (infilename, SFM_READ, &in_sfinfo)) == NULL) + { printf ("Not able to open input file %s.\n", infilename) ; + puts (sf_strerror (NULL)) ; + return 1 ; + } ; + + memcpy (&out_sfinfo, &in_sfinfo, sizeof (out_sfinfo)) ; + /* Open the output file. */ + if ((outfile = sf_open (outfilename, SFM_WRITE, &out_sfinfo)) == NULL) + { printf ("Not able to open output file %s : %s\n", outfilename, sf_strerror (NULL)) ; + return 1 ; + } ; + + /* Add the loop data */ + add_instrument_data (outfile, &in_sfinfo) ; + + /* Copy the audio data */ + sfe_copy_data_int (outfile, infile, in_sfinfo.channels) ; + + sf_close (infile) ; + sf_close (outfile) ; + + return 0 ; +} /* main */ + +const char * +program_name (const char * argv0) +{ const char * tmp ; + + tmp = strrchr (argv0, '/') ; + argv0 = tmp ? tmp + 1 : argv0 ; + + /* Remove leading libtool name mangling. */ + if (strstr (argv0, "lt-") == argv0) + return argv0 + 3 ; + + return argv0 ; +} /* program_name */ + +static void +sfe_copy_data_int (SNDFILE *outfile, SNDFILE *infile, int channels) +{ static int data [BUFFER_LEN] ; + int frames, readcount ; + + frames = BUFFER_LEN / channels ; + readcount = frames ; + + while (readcount > 0) + { readcount = sf_readf_int (infile, data, frames) ; + sf_writef_int (outfile, data, readcount) ; + } ; + + return ; +} /* sfe_copy_data_int */ + +static void +add_instrument_data (SNDFILE *file, const SF_INFO *info) +{ SF_INSTRUMENT instr ; + + memset (&instr, 0, sizeof (instr)) ; + + instr.gain = 1 ; + instr.basenote = 0 ; + instr.detune = 0 ; + instr.velocity_lo = 0 ; + instr.velocity_hi = 0 ; + instr.key_lo = 0 ; + instr.key_hi = 0 ; + instr.loop_count = 1 ; + + instr.loops [0].mode = SF_LOOP_FORWARD ; + instr.loops [0].start = 0 ; + instr.loops [0].end = info->frames ; + instr.loops [0].count = 0 ; + + if (sf_command (file, SFC_SET_INSTRUMENT, &instr, sizeof (instr)) == SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_SET_INSTRUMENT) failed.\n\n", __LINE__) ; + exit (1) ; + } ; + + return ; +} /* add_instrument_data */ + diff --git a/libsndfile-1.0.31/examples/sndfile-to-text.c b/libsndfile-1.0.31/examples/sndfile-to-text.c new file mode 100644 index 0000000..d5d0ec9 --- /dev/null +++ b/libsndfile-1.0.31/examples/sndfile-to-text.c @@ -0,0 +1,156 @@ +/* +** Copyright (C) 2008-2016 Erik de Castro Lopo +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the author nor the names of any contributors may be used +** to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include +#include + +#include + +#define BLOCK_SIZE 4096 + +#ifdef DBL_DECIMAL_DIG + #define OP_DBL_Digs (DBL_DECIMAL_DIG) +#else + #ifdef DECIMAL_DIG + #define OP_DBL_Digs (DECIMAL_DIG) + #else + #define OP_DBL_Digs (DBL_DIG + 3) + #endif +#endif + +static void +print_usage (char *progname) +{ printf ("\nUsage : %s [--full-precision] \n", progname) ; + puts ("\n" + " Where the output file will contain a line for each frame\n" + " and a column for each channel.\n" + ) ; + +} /* print_usage */ + +static void +convert_to_text (SNDFILE * infile, FILE * outfile, int channels, int full_precision) +{ float buf [BLOCK_SIZE] ; + sf_count_t frames ; + int k, m, readcount ; + + frames = BLOCK_SIZE / channels ; + + while ((readcount = sf_readf_float (infile, buf, frames)) > 0) + { for (k = 0 ; k < readcount ; k++) + { for (m = 0 ; m < channels ; m++) + if (full_precision) + fprintf (outfile, " %.*e", OP_DBL_Digs - 1, buf [k * channels + m]) ; + else + fprintf (outfile, " % 12.10f", buf [k * channels + m]) ; + fprintf (outfile, "\n") ; + } ; + } ; + + return ; +} /* convert_to_text */ + +int +main (int argc, char * argv []) +{ char *progname, *infilename, *outfilename ; + SNDFILE *infile = NULL ; + FILE *outfile = NULL ; + SF_INFO sfinfo ; + int full_precision = 0 ; + + progname = strrchr (argv [0], '/') ; + progname = progname ? progname + 1 : argv [0] ; + + switch (argc) + { case 4 : + if (!strcmp ("--full-precision", argv [3])) + { print_usage (progname) ; + return 1 ; + } ; + full_precision = 1 ; + argv++ ; + case 3 : + break ; + default: + print_usage (progname) ; + return 1 ; + } ; + + infilename = argv [1] ; + outfilename = argv [2] ; + + if (strcmp (infilename, outfilename) == 0) + { printf ("Error : Input and output filenames are the same.\n\n") ; + print_usage (progname) ; + return 1 ; + } ; + + if (infilename [0] == '-') + { printf ("Error : Input filename (%s) looks like an option.\n\n", infilename) ; + print_usage (progname) ; + return 1 ; + } ; + + if (outfilename [0] == '-') + { printf ("Error : Output filename (%s) looks like an option.\n\n", outfilename) ; + print_usage (progname) ; + return 1 ; + } ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + if ((infile = sf_open (infilename, SFM_READ, &sfinfo)) == NULL) + { printf ("Not able to open input file %s.\n", infilename) ; + puts (sf_strerror (NULL)) ; + return 1 ; + } ; + + /* Open the output file. */ + if ((outfile = fopen (outfilename, "w")) == NULL) + { printf ("Not able to open output file %s : %s\n", outfilename, sf_strerror (NULL)) ; + return 1 ; + } ; + + fprintf (outfile, "# Converted from file %s.\n", infilename) ; + fprintf (outfile, "# Channels %d, Sample rate %d\n", sfinfo.channels, sfinfo.samplerate) ; + + convert_to_text (infile, outfile, sfinfo.channels, full_precision) ; + + sf_close (infile) ; + fclose (outfile) ; + + return 0 ; +} /* main */ + diff --git a/libsndfile-1.0.31/examples/sndfilehandle.cc b/libsndfile-1.0.31/examples/sndfilehandle.cc new file mode 100644 index 0000000..c9a1931 --- /dev/null +++ b/libsndfile-1.0.31/examples/sndfilehandle.cc @@ -0,0 +1,84 @@ +/* +** Copyright (C) 2007-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include +#include + +#include + +#define BUFFER_LEN 1024 + +static void +create_file (const char * fname, int format) +{ static short buffer [BUFFER_LEN] ; + + SndfileHandle file ; + int channels = 2 ; + int srate = 48000 ; + + printf ("Creating file named '%s'\n", fname) ; + + file = SndfileHandle (fname, SFM_WRITE, format, channels, srate) ; + + memset (buffer, 0, sizeof (buffer)) ; + + file.write (buffer, BUFFER_LEN) ; + + puts ("") ; + /* + ** The SndfileHandle object will automatically close the file and + ** release all allocated memory when the object goes out of scope. + ** This is the Resource Acquisition Is Initailization idom. + ** See : http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization + */ +} /* create_file */ + +static void +read_file (const char * fname) +{ static short buffer [BUFFER_LEN] ; + + SndfileHandle file ; + + file = SndfileHandle (fname) ; + + printf ("Opened file '%s'\n", fname) ; + printf (" Sample rate : %d\n", file.samplerate ()) ; + printf (" Channels : %d\n", file.channels ()) ; + + file.read (buffer, BUFFER_LEN) ; + + puts ("") ; + + /* RAII takes care of destroying SndfileHandle object. */ +} /* read_file */ + +int +main (void) +{ const char * fname = "test.wav" ; + + puts ("\nSimple example showing usage of the C++ SndfileHandle object.\n") ; + + create_file (fname, SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; + + read_file (fname) ; + + puts ("Done.\n") ; + return 0 ; +} /* main */ + + diff --git a/libsndfile-1.0.31/include/sndfile.h.in b/libsndfile-1.0.31/include/sndfile.h.in new file mode 100644 index 0000000..917ff4b --- /dev/null +++ b/libsndfile-1.0.31/include/sndfile.h.in @@ -0,0 +1,872 @@ +/* +** Copyright (C) 1999-2016 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +/* +** sndfile.h -- system-wide definitions +** +** API documentation is in the doc/ directory of the source code tarball +** and at http://libsndfile.github.io/libsndfile/api.html. +*/ + +#ifndef SNDFILE_H +#define SNDFILE_H + +/* This is the version 1.0.X header file. */ +#define SNDFILE_1 + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* The following file types can be read and written. +** A file type would consist of a major type (ie SF_FORMAT_WAV) bitwise +** ORed with a minor type (ie SF_FORMAT_PCM). SF_FORMAT_TYPEMASK and +** SF_FORMAT_SUBMASK can be used to separate the major and minor file +** types. +*/ + +enum +{ /* Major formats. */ + SF_FORMAT_WAV = 0x010000, /* Microsoft WAV format (little endian default). */ + SF_FORMAT_AIFF = 0x020000, /* Apple/SGI AIFF format (big endian). */ + SF_FORMAT_AU = 0x030000, /* Sun/NeXT AU format (big endian). */ + SF_FORMAT_RAW = 0x040000, /* RAW PCM data. */ + SF_FORMAT_PAF = 0x050000, /* Ensoniq PARIS file format. */ + SF_FORMAT_SVX = 0x060000, /* Amiga IFF / SVX8 / SV16 format. */ + SF_FORMAT_NIST = 0x070000, /* Sphere NIST format. */ + SF_FORMAT_VOC = 0x080000, /* VOC files. */ + SF_FORMAT_IRCAM = 0x0A0000, /* Berkeley/IRCAM/CARL */ + SF_FORMAT_W64 = 0x0B0000, /* Sonic Foundry's 64 bit RIFF/WAV */ + SF_FORMAT_MAT4 = 0x0C0000, /* Matlab (tm) V4.2 / GNU Octave 2.0 */ + SF_FORMAT_MAT5 = 0x0D0000, /* Matlab (tm) V5.0 / GNU Octave 2.1 */ + SF_FORMAT_PVF = 0x0E0000, /* Portable Voice Format */ + SF_FORMAT_XI = 0x0F0000, /* Fasttracker 2 Extended Instrument */ + SF_FORMAT_HTK = 0x100000, /* HMM Tool Kit format */ + SF_FORMAT_SDS = 0x110000, /* Midi Sample Dump Standard */ + SF_FORMAT_AVR = 0x120000, /* Audio Visual Research */ + SF_FORMAT_WAVEX = 0x130000, /* MS WAVE with WAVEFORMATEX */ + SF_FORMAT_SD2 = 0x160000, /* Sound Designer 2 */ + SF_FORMAT_FLAC = 0x170000, /* FLAC lossless file format */ + SF_FORMAT_CAF = 0x180000, /* Core Audio File format */ + SF_FORMAT_WVE = 0x190000, /* Psion WVE format */ + SF_FORMAT_OGG = 0x200000, /* Xiph OGG container */ + SF_FORMAT_MPC2K = 0x210000, /* Akai MPC 2000 sampler */ + SF_FORMAT_RF64 = 0x220000, /* RF64 WAV file */ + + /* Subtypes from here on. */ + + SF_FORMAT_PCM_S8 = 0x0001, /* Signed 8 bit data */ + SF_FORMAT_PCM_16 = 0x0002, /* Signed 16 bit data */ + SF_FORMAT_PCM_24 = 0x0003, /* Signed 24 bit data */ + SF_FORMAT_PCM_32 = 0x0004, /* Signed 32 bit data */ + + SF_FORMAT_PCM_U8 = 0x0005, /* Unsigned 8 bit data (WAV and RAW only) */ + + SF_FORMAT_FLOAT = 0x0006, /* 32 bit float data */ + SF_FORMAT_DOUBLE = 0x0007, /* 64 bit float data */ + + SF_FORMAT_ULAW = 0x0010, /* U-Law encoded. */ + SF_FORMAT_ALAW = 0x0011, /* A-Law encoded. */ + SF_FORMAT_IMA_ADPCM = 0x0012, /* IMA ADPCM. */ + SF_FORMAT_MS_ADPCM = 0x0013, /* Microsoft ADPCM. */ + + SF_FORMAT_GSM610 = 0x0020, /* GSM 6.10 encoding. */ + SF_FORMAT_VOX_ADPCM = 0x0021, /* OKI / Dialogix ADPCM */ + + SF_FORMAT_NMS_ADPCM_16 = 0x0022, /* 16kbs NMS G721-variant encoding. */ + SF_FORMAT_NMS_ADPCM_24 = 0x0023, /* 24kbs NMS G721-variant encoding. */ + SF_FORMAT_NMS_ADPCM_32 = 0x0024, /* 32kbs NMS G721-variant encoding. */ + + SF_FORMAT_G721_32 = 0x0030, /* 32kbs G721 ADPCM encoding. */ + SF_FORMAT_G723_24 = 0x0031, /* 24kbs G723 ADPCM encoding. */ + SF_FORMAT_G723_40 = 0x0032, /* 40kbs G723 ADPCM encoding. */ + + SF_FORMAT_DWVW_12 = 0x0040, /* 12 bit Delta Width Variable Word encoding. */ + SF_FORMAT_DWVW_16 = 0x0041, /* 16 bit Delta Width Variable Word encoding. */ + SF_FORMAT_DWVW_24 = 0x0042, /* 24 bit Delta Width Variable Word encoding. */ + SF_FORMAT_DWVW_N = 0x0043, /* N bit Delta Width Variable Word encoding. */ + + SF_FORMAT_DPCM_8 = 0x0050, /* 8 bit differential PCM (XI only) */ + SF_FORMAT_DPCM_16 = 0x0051, /* 16 bit differential PCM (XI only) */ + + SF_FORMAT_VORBIS = 0x0060, /* Xiph Vorbis encoding. */ + SF_FORMAT_OPUS = 0x0064, /* Xiph/Skype Opus encoding. */ + + SF_FORMAT_ALAC_16 = 0x0070, /* Apple Lossless Audio Codec (16 bit). */ + SF_FORMAT_ALAC_20 = 0x0071, /* Apple Lossless Audio Codec (20 bit). */ + SF_FORMAT_ALAC_24 = 0x0072, /* Apple Lossless Audio Codec (24 bit). */ + SF_FORMAT_ALAC_32 = 0x0073, /* Apple Lossless Audio Codec (32 bit). */ + + /* Endian-ness options. */ + + SF_ENDIAN_FILE = 0x00000000, /* Default file endian-ness. */ + SF_ENDIAN_LITTLE = 0x10000000, /* Force little endian-ness. */ + SF_ENDIAN_BIG = 0x20000000, /* Force big endian-ness. */ + SF_ENDIAN_CPU = 0x30000000, /* Force CPU endian-ness. */ + + SF_FORMAT_SUBMASK = 0x0000FFFF, + SF_FORMAT_TYPEMASK = 0x0FFF0000, + SF_FORMAT_ENDMASK = 0x30000000 +} ; + +/* +** The following are the valid command numbers for the sf_command() +** interface. The use of these commands is documented in the file +** command.html in the doc directory of the source code distribution. +*/ + +enum +{ SFC_GET_LIB_VERSION = 0x1000, + SFC_GET_LOG_INFO = 0x1001, + SFC_GET_CURRENT_SF_INFO = 0x1002, + + + SFC_GET_NORM_DOUBLE = 0x1010, + SFC_GET_NORM_FLOAT = 0x1011, + SFC_SET_NORM_DOUBLE = 0x1012, + SFC_SET_NORM_FLOAT = 0x1013, + SFC_SET_SCALE_FLOAT_INT_READ = 0x1014, + SFC_SET_SCALE_INT_FLOAT_WRITE = 0x1015, + + SFC_GET_SIMPLE_FORMAT_COUNT = 0x1020, + SFC_GET_SIMPLE_FORMAT = 0x1021, + + SFC_GET_FORMAT_INFO = 0x1028, + + SFC_GET_FORMAT_MAJOR_COUNT = 0x1030, + SFC_GET_FORMAT_MAJOR = 0x1031, + SFC_GET_FORMAT_SUBTYPE_COUNT = 0x1032, + SFC_GET_FORMAT_SUBTYPE = 0x1033, + + SFC_CALC_SIGNAL_MAX = 0x1040, + SFC_CALC_NORM_SIGNAL_MAX = 0x1041, + SFC_CALC_MAX_ALL_CHANNELS = 0x1042, + SFC_CALC_NORM_MAX_ALL_CHANNELS = 0x1043, + SFC_GET_SIGNAL_MAX = 0x1044, + SFC_GET_MAX_ALL_CHANNELS = 0x1045, + + SFC_SET_ADD_PEAK_CHUNK = 0x1050, + + SFC_UPDATE_HEADER_NOW = 0x1060, + SFC_SET_UPDATE_HEADER_AUTO = 0x1061, + + SFC_FILE_TRUNCATE = 0x1080, + + SFC_SET_RAW_START_OFFSET = 0x1090, + + SFC_SET_DITHER_ON_WRITE = 0x10A0, + SFC_SET_DITHER_ON_READ = 0x10A1, + + SFC_GET_DITHER_INFO_COUNT = 0x10A2, + SFC_GET_DITHER_INFO = 0x10A3, + + SFC_GET_EMBED_FILE_INFO = 0x10B0, + + SFC_SET_CLIPPING = 0x10C0, + SFC_GET_CLIPPING = 0x10C1, + + SFC_GET_CUE_COUNT = 0x10CD, + SFC_GET_CUE = 0x10CE, + SFC_SET_CUE = 0x10CF, + + SFC_GET_INSTRUMENT = 0x10D0, + SFC_SET_INSTRUMENT = 0x10D1, + + SFC_GET_LOOP_INFO = 0x10E0, + + SFC_GET_BROADCAST_INFO = 0x10F0, + SFC_SET_BROADCAST_INFO = 0x10F1, + + SFC_GET_CHANNEL_MAP_INFO = 0x1100, + SFC_SET_CHANNEL_MAP_INFO = 0x1101, + + SFC_RAW_DATA_NEEDS_ENDSWAP = 0x1110, + + /* Support for Wavex Ambisonics Format */ + SFC_WAVEX_SET_AMBISONIC = 0x1200, + SFC_WAVEX_GET_AMBISONIC = 0x1201, + + /* + ** RF64 files can be set so that on-close, writable files that have less + ** than 4GB of data in them are converted to RIFF/WAV, as per EBU + ** recommendations. + */ + SFC_RF64_AUTO_DOWNGRADE = 0x1210, + + SFC_SET_VBR_ENCODING_QUALITY = 0x1300, + SFC_SET_COMPRESSION_LEVEL = 0x1301, + SFC_SET_OGG_PAGE_LATENCY_MS = 0x1302, + SFC_SET_OGG_PAGE_LATENCY = 0x1303, + + /* Cart Chunk support */ + SFC_SET_CART_INFO = 0x1400, + SFC_GET_CART_INFO = 0x1401, + + /* Opus files original samplerate metadata */ + SFC_SET_ORIGINAL_SAMPLERATE = 0x1500, + SFC_GET_ORIGINAL_SAMPLERATE = 0x1501, + + /* Following commands for testing only. */ + SFC_TEST_IEEE_FLOAT_REPLACE = 0x6001, + + /* + ** These SFC_SET_ADD_* values are deprecated and will disappear at some + ** time in the future. They are guaranteed to be here up to and + ** including version 1.0.8 to avoid breakage of existing software. + ** They currently do nothing and will continue to do nothing. + */ + SFC_SET_ADD_HEADER_PAD_CHUNK = 0x1051, + + SFC_SET_ADD_DITHER_ON_WRITE = 0x1070, + SFC_SET_ADD_DITHER_ON_READ = 0x1071 +} ; + + +/* +** String types that can be set and read from files. Not all file types +** support this and even the file types which support one, may not support +** all string types. +*/ + +enum +{ SF_STR_TITLE = 0x01, + SF_STR_COPYRIGHT = 0x02, + SF_STR_SOFTWARE = 0x03, + SF_STR_ARTIST = 0x04, + SF_STR_COMMENT = 0x05, + SF_STR_DATE = 0x06, + SF_STR_ALBUM = 0x07, + SF_STR_LICENSE = 0x08, + SF_STR_TRACKNUMBER = 0x09, + SF_STR_GENRE = 0x10 +} ; + +/* +** Use the following as the start and end index when doing metadata +** transcoding. +*/ + +#define SF_STR_FIRST SF_STR_TITLE +#define SF_STR_LAST SF_STR_GENRE + +enum +{ /* True and false */ + SF_FALSE = 0, + SF_TRUE = 1, + + /* Modes for opening files. */ + SFM_READ = 0x10, + SFM_WRITE = 0x20, + SFM_RDWR = 0x30, + + SF_AMBISONIC_NONE = 0x40, + SF_AMBISONIC_B_FORMAT = 0x41 +} ; + +/* Public error values. These are guaranteed to remain unchanged for the duration +** of the library major version number. +** There are also a large number of private error numbers which are internal to +** the library which can change at any time. +*/ + +enum +{ SF_ERR_NO_ERROR = 0, + SF_ERR_UNRECOGNISED_FORMAT = 1, + SF_ERR_SYSTEM = 2, + SF_ERR_MALFORMED_FILE = 3, + SF_ERR_UNSUPPORTED_ENCODING = 4 +} ; + + +/* Channel map values (used with SFC_SET/GET_CHANNEL_MAP). +*/ + +enum +{ SF_CHANNEL_MAP_INVALID = 0, + SF_CHANNEL_MAP_MONO = 1, + SF_CHANNEL_MAP_LEFT, /* Apple calls this 'Left' */ + SF_CHANNEL_MAP_RIGHT, /* Apple calls this 'Right' */ + SF_CHANNEL_MAP_CENTER, /* Apple calls this 'Center' */ + SF_CHANNEL_MAP_FRONT_LEFT, + SF_CHANNEL_MAP_FRONT_RIGHT, + SF_CHANNEL_MAP_FRONT_CENTER, + SF_CHANNEL_MAP_REAR_CENTER, /* Apple calls this 'Center Surround', Msft calls this 'Back Center' */ + SF_CHANNEL_MAP_REAR_LEFT, /* Apple calls this 'Left Surround', Msft calls this 'Back Left' */ + SF_CHANNEL_MAP_REAR_RIGHT, /* Apple calls this 'Right Surround', Msft calls this 'Back Right' */ + SF_CHANNEL_MAP_LFE, /* Apple calls this 'LFEScreen', Msft calls this 'Low Frequency' */ + SF_CHANNEL_MAP_FRONT_LEFT_OF_CENTER, /* Apple calls this 'Left Center' */ + SF_CHANNEL_MAP_FRONT_RIGHT_OF_CENTER, /* Apple calls this 'Right Center */ + SF_CHANNEL_MAP_SIDE_LEFT, /* Apple calls this 'Left Surround Direct' */ + SF_CHANNEL_MAP_SIDE_RIGHT, /* Apple calls this 'Right Surround Direct' */ + SF_CHANNEL_MAP_TOP_CENTER, /* Apple calls this 'Top Center Surround' */ + SF_CHANNEL_MAP_TOP_FRONT_LEFT, /* Apple calls this 'Vertical Height Left' */ + SF_CHANNEL_MAP_TOP_FRONT_RIGHT, /* Apple calls this 'Vertical Height Right' */ + SF_CHANNEL_MAP_TOP_FRONT_CENTER, /* Apple calls this 'Vertical Height Center' */ + SF_CHANNEL_MAP_TOP_REAR_LEFT, /* Apple and MS call this 'Top Back Left' */ + SF_CHANNEL_MAP_TOP_REAR_RIGHT, /* Apple and MS call this 'Top Back Right' */ + SF_CHANNEL_MAP_TOP_REAR_CENTER, /* Apple and MS call this 'Top Back Center' */ + + SF_CHANNEL_MAP_AMBISONIC_B_W, + SF_CHANNEL_MAP_AMBISONIC_B_X, + SF_CHANNEL_MAP_AMBISONIC_B_Y, + SF_CHANNEL_MAP_AMBISONIC_B_Z, + + SF_CHANNEL_MAP_MAX +} ; + + +/* A SNDFILE* pointer can be passed around much like stdio.h's FILE* pointer. */ + +typedef struct SNDFILE_tag SNDFILE ; + +/* The following typedef is system specific and is defined when libsndfile is +** compiled. sf_count_t will be a 64 bit value when the underlying OS allows +** 64 bit file offsets. +** On windows, we need to allow the same header file to be compiler by both GCC +** and the Microsoft compiler. +*/ + +typedef @TYPEOF_SF_COUNT_T@ sf_count_t ; +#ifndef SF_COUNT_MAX +#define SF_COUNT_MAX @SF_COUNT_MAX@ +#endif + + +/* A pointer to a SF_INFO structure is passed to sf_open () and filled in. +** On write, the SF_INFO structure is filled in by the user and passed into +** sf_open (). +*/ + +struct SF_INFO +{ sf_count_t frames ; /* Used to be called samples. Changed to avoid confusion. */ + int samplerate ; + int channels ; + int format ; + int sections ; + int seekable ; +} ; + +typedef struct SF_INFO SF_INFO ; + +/* The SF_FORMAT_INFO struct is used to retrieve information about the sound +** file formats libsndfile supports using the sf_command () interface. +** +** Using this interface will allow applications to support new file formats +** and encoding types when libsndfile is upgraded, without requiring +** re-compilation of the application. +** +** Please consult the libsndfile documentation (particularly the information +** on the sf_command () interface) for examples of its use. +*/ + +typedef struct +{ int format ; + const char *name ; + const char *extension ; +} SF_FORMAT_INFO ; + +/* +** Enums and typedefs for adding dither on read and write. +** See the html documentation for sf_command(), SFC_SET_DITHER_ON_WRITE +** and SFC_SET_DITHER_ON_READ. +*/ + +enum +{ SFD_DEFAULT_LEVEL = 0, + SFD_CUSTOM_LEVEL = 0x40000000, + + SFD_NO_DITHER = 500, + SFD_WHITE = 501, + SFD_TRIANGULAR_PDF = 502 +} ; + +typedef struct +{ int type ; + double level ; + const char *name ; +} SF_DITHER_INFO ; + +/* Struct used to retrieve information about a file embedded within a +** larger file. See SFC_GET_EMBED_FILE_INFO. +*/ + +typedef struct +{ sf_count_t offset ; + sf_count_t length ; +} SF_EMBED_FILE_INFO ; + +/* +** Struct used to retrieve cue marker information from a file +*/ + +typedef struct +{ int32_t indx ; + uint32_t position ; + int32_t fcc_chunk ; + int32_t chunk_start ; + int32_t block_start ; + uint32_t sample_offset ; + char name [256] ; +} SF_CUE_POINT ; + +#define SF_CUES_VAR(count) \ + struct \ + { uint32_t cue_count ; \ + SF_CUE_POINT cue_points [count] ; \ + } + +typedef SF_CUES_VAR (100) SF_CUES ; + +/* +** Structs used to retrieve music sample information from a file. +*/ + +enum +{ /* + ** The loop mode field in SF_INSTRUMENT will be one of the following. + */ + SF_LOOP_NONE = 800, + SF_LOOP_FORWARD, + SF_LOOP_BACKWARD, + SF_LOOP_ALTERNATING +} ; + +typedef struct +{ int gain ; + char basenote, detune ; + char velocity_lo, velocity_hi ; + char key_lo, key_hi ; + int loop_count ; + + struct + { int mode ; + uint32_t start ; + uint32_t end ; + uint32_t count ; + } loops [16] ; /* make variable in a sensible way */ +} SF_INSTRUMENT ; + + + +/* Struct used to retrieve loop information from a file.*/ +typedef struct +{ + short time_sig_num ; /* any positive integer > 0 */ + short time_sig_den ; /* any positive power of 2 > 0 */ + int loop_mode ; /* see SF_LOOP enum */ + + int num_beats ; /* this is NOT the amount of quarter notes !!!*/ + /* a full bar of 4/4 is 4 beats */ + /* a full bar of 7/8 is 7 beats */ + + float bpm ; /* suggestion, as it can be calculated using other fields:*/ + /* file's length, file's sampleRate and our time_sig_den*/ + /* -> bpms are always the amount of _quarter notes_ per minute */ + + int root_key ; /* MIDI note, or -1 for None */ + int future [6] ; +} SF_LOOP_INFO ; + + +/* Struct used to retrieve broadcast (EBU) information from a file. +** Strongly (!) based on EBU "bext" chunk format used in Broadcast WAVE. +*/ +#define SF_BROADCAST_INFO_VAR(coding_hist_size) \ + struct \ + { char description [256] ; \ + char originator [32] ; \ + char originator_reference [32] ; \ + char origination_date [10] ; \ + char origination_time [8] ; \ + uint32_t time_reference_low ; \ + uint32_t time_reference_high ; \ + short version ; \ + char umid [64] ; \ + int16_t loudness_value ; \ + int16_t loudness_range ; \ + int16_t max_true_peak_level ; \ + int16_t max_momentary_loudness ; \ + int16_t max_shortterm_loudness ; \ + char reserved [180] ; \ + uint32_t coding_history_size ; \ + char coding_history [coding_hist_size] ; \ + } + +/* SF_BROADCAST_INFO is the above struct with coding_history field of 256 bytes. */ +typedef SF_BROADCAST_INFO_VAR (256) SF_BROADCAST_INFO ; + +struct SF_CART_TIMER +{ char usage [4] ; + int32_t value ; +} ; + +typedef struct SF_CART_TIMER SF_CART_TIMER ; + +#define SF_CART_INFO_VAR(p_tag_text_size) \ + struct \ + { char version [4] ; \ + char title [64] ; \ + char artist [64] ; \ + char cut_id [64] ; \ + char client_id [64] ; \ + char category [64] ; \ + char classification [64] ; \ + char out_cue [64] ; \ + char start_date [10] ; \ + char start_time [8] ; \ + char end_date [10] ; \ + char end_time [8] ; \ + char producer_app_id [64] ; \ + char producer_app_version [64] ; \ + char user_def [64] ; \ + int32_t level_reference ; \ + SF_CART_TIMER post_timers [8] ; \ + char reserved [276] ; \ + char url [1024] ; \ + uint32_t tag_text_size ; \ + char tag_text [p_tag_text_size] ; \ + } + +typedef SF_CART_INFO_VAR (256) SF_CART_INFO ; + +/* Virtual I/O functionality. */ + +typedef sf_count_t (*sf_vio_get_filelen) (void *user_data) ; +typedef sf_count_t (*sf_vio_seek) (sf_count_t offset, int whence, void *user_data) ; +typedef sf_count_t (*sf_vio_read) (void *ptr, sf_count_t count, void *user_data) ; +typedef sf_count_t (*sf_vio_write) (const void *ptr, sf_count_t count, void *user_data) ; +typedef sf_count_t (*sf_vio_tell) (void *user_data) ; + +struct SF_VIRTUAL_IO +{ sf_vio_get_filelen get_filelen ; + sf_vio_seek seek ; + sf_vio_read read ; + sf_vio_write write ; + sf_vio_tell tell ; +} ; + +typedef struct SF_VIRTUAL_IO SF_VIRTUAL_IO ; + + +/* Open the specified file for read, write or both. On error, this will +** return a NULL pointer. To find the error number, pass a NULL SNDFILE +** to sf_strerror (). +** All calls to sf_open() should be matched with a call to sf_close(). +*/ + +SNDFILE* sf_open (const char *path, int mode, SF_INFO *sfinfo) ; + + +/* Use the existing file descriptor to create a SNDFILE object. If close_desc +** is TRUE, the file descriptor will be closed when sf_close() is called. If +** it is FALSE, the descriptor will not be closed. +** When passed a descriptor like this, the library will assume that the start +** of file header is at the current file offset. This allows sound files within +** larger container files to be read and/or written. +** On error, this will return a NULL pointer. To find the error number, pass a +** NULL SNDFILE to sf_strerror (). +** All calls to sf_open_fd() should be matched with a call to sf_close(). + +*/ + +SNDFILE* sf_open_fd (int fd, int mode, SF_INFO *sfinfo, int close_desc) ; + +SNDFILE* sf_open_virtual (SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user_data) ; + + +/* sf_error () returns a error number which can be translated to a text +** string using sf_error_number(). +*/ + +int sf_error (SNDFILE *sndfile) ; + + +/* sf_strerror () returns to the caller a pointer to the current error message for +** the given SNDFILE. +*/ + +const char* sf_strerror (SNDFILE *sndfile) ; + + +/* sf_error_number () allows the retrieval of the error string for each internal +** error number. +** +*/ + +const char* sf_error_number (int errnum) ; + + +/* The following two error functions are deprecated but they will remain in the +** library for the foreseeable future. The function sf_strerror() should be used +** in their place. +*/ + +int sf_perror (SNDFILE *sndfile) ; +int sf_error_str (SNDFILE *sndfile, char* str, size_t len) ; + + +/* Allow the caller to retrieve information from or change aspects of the +** library behaviour. +*/ + +int sf_command (SNDFILE *sndfile, int command, void *data, int datasize) ; + + +/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */ + +int sf_format_check (const SF_INFO *info) ; + + +/* Seek within the waveform data chunk of the SNDFILE. sf_seek () uses +** the same values for whence (SEEK_SET, SEEK_CUR and SEEK_END) as +** stdio.h function fseek (). +** An offset of zero with whence set to SEEK_SET will position the +** read / write pointer to the first data sample. +** On success sf_seek returns the current position in (multi-channel) +** samples from the start of the file. +** Please see the libsndfile documentation for moving the read pointer +** separately from the write pointer on files open in mode SFM_RDWR. +** On error all of these functions return -1. +*/ + +enum +{ SF_SEEK_SET = SEEK_SET, + SF_SEEK_CUR = SEEK_CUR, + SF_SEEK_END = SEEK_END +} ; + +sf_count_t sf_seek (SNDFILE *sndfile, sf_count_t frames, int whence) ; + + +/* Functions for retrieving and setting string data within sound files. +** Not all file types support this features; AIFF and WAV do. For both +** functions, the str_type parameter must be one of the SF_STR_* values +** defined above. +** On error, sf_set_string() returns non-zero while sf_get_string() +** returns NULL. +*/ + +int sf_set_string (SNDFILE *sndfile, int str_type, const char* str) ; + +const char* sf_get_string (SNDFILE *sndfile, int str_type) ; + + +/* Return the library version string. */ + +const char * sf_version_string (void) ; + +/* Return the current byterate at this point in the file. The byte rate in this +** case is the number of bytes per second of audio data. For instance, for a +** stereo, 18 bit PCM encoded file with an 16kHz sample rate, the byte rate +** would be 2 (stereo) * 2 (two bytes per sample) * 16000 => 64000 bytes/sec. +** For some file formats the returned value will be accurate and exact, for some +** it will be a close approximation, for some it will be the average bitrate for +** the whole file and for some it will be a time varying value that was accurate +** when the file was most recently read or written. +** To get the bitrate, multiple this value by 8. +** Returns -1 for unknown. +*/ +int sf_current_byterate (SNDFILE *sndfile) ; + +/* Functions for reading/writing the waveform data of a sound file. +*/ + +sf_count_t sf_read_raw (SNDFILE *sndfile, void *ptr, sf_count_t bytes) ; +sf_count_t sf_write_raw (SNDFILE *sndfile, const void *ptr, sf_count_t bytes) ; + + +/* Functions for reading and writing the data chunk in terms of frames. +** The number of items actually read/written = frames * number of channels. +** sf_xxxx_raw read/writes the raw data bytes from/to the file +** sf_xxxx_short passes data in the native short format +** sf_xxxx_int passes data in the native int format +** sf_xxxx_float passes data in the native float format +** sf_xxxx_double passes data in the native double format +** All of these read/write function return number of frames read/written. +*/ + +sf_count_t sf_readf_short (SNDFILE *sndfile, short *ptr, sf_count_t frames) ; +sf_count_t sf_writef_short (SNDFILE *sndfile, const short *ptr, sf_count_t frames) ; + +sf_count_t sf_readf_int (SNDFILE *sndfile, int *ptr, sf_count_t frames) ; +sf_count_t sf_writef_int (SNDFILE *sndfile, const int *ptr, sf_count_t frames) ; + +sf_count_t sf_readf_float (SNDFILE *sndfile, float *ptr, sf_count_t frames) ; +sf_count_t sf_writef_float (SNDFILE *sndfile, const float *ptr, sf_count_t frames) ; + +sf_count_t sf_readf_double (SNDFILE *sndfile, double *ptr, sf_count_t frames) ; +sf_count_t sf_writef_double (SNDFILE *sndfile, const double *ptr, sf_count_t frames) ; + + +/* Functions for reading and writing the data chunk in terms of items. +** Otherwise similar to above. +** All of these read/write function return number of items read/written. +*/ + +sf_count_t sf_read_short (SNDFILE *sndfile, short *ptr, sf_count_t items) ; +sf_count_t sf_write_short (SNDFILE *sndfile, const short *ptr, sf_count_t items) ; + +sf_count_t sf_read_int (SNDFILE *sndfile, int *ptr, sf_count_t items) ; +sf_count_t sf_write_int (SNDFILE *sndfile, const int *ptr, sf_count_t items) ; + +sf_count_t sf_read_float (SNDFILE *sndfile, float *ptr, sf_count_t items) ; +sf_count_t sf_write_float (SNDFILE *sndfile, const float *ptr, sf_count_t items) ; + +sf_count_t sf_read_double (SNDFILE *sndfile, double *ptr, sf_count_t items) ; +sf_count_t sf_write_double (SNDFILE *sndfile, const double *ptr, sf_count_t items) ; + + +/* Close the SNDFILE and clean up all memory allocations associated with this +** file. +** Returns 0 on success, or an error number. +*/ + +int sf_close (SNDFILE *sndfile) ; + + +/* If the file is opened SFM_WRITE or SFM_RDWR, call fsync() on the file +** to force the writing of data to disk. If the file is opened SFM_READ +** no action is taken. +*/ + +void sf_write_sync (SNDFILE *sndfile) ; + + + +/* The function sf_wchar_open() is Windows Only! +** Open a file passing in a Windows Unicode filename. Otherwise, this is +** the same as sf_open(). +** +** In order for this to work, you need to do the following: +** +** #include +** #define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1 +** #including +*/ + +#if (defined (ENABLE_SNDFILE_WINDOWS_PROTOTYPES) && ENABLE_SNDFILE_WINDOWS_PROTOTYPES) +SNDFILE* sf_wchar_open (LPCWSTR wpath, int mode, SF_INFO *sfinfo) ; +#endif + + + + +/* Getting and setting of chunks from within a sound file. +** +** These functions allow the getting and setting of chunks within a sound file +** (for those formats which allow it). +** +** These functions fail safely. Specifically, they will not allow you to overwrite +** existing chunks or add extra versions of format specific reserved chunks but +** should allow you to retrieve any and all chunks (may not be implemented for +** all chunks or all file formats). +*/ + +struct SF_CHUNK_INFO +{ char id [64] ; /* The chunk identifier. */ + unsigned id_size ; /* The size of the chunk identifier. */ + unsigned datalen ; /* The size of that data. */ + void *data ; /* Pointer to the data. */ +} ; + +typedef struct SF_CHUNK_INFO SF_CHUNK_INFO ; + +/* Set the specified chunk info (must be done before any audio data is written +** to the file). This will fail for format specific reserved chunks. +** The chunk_info->data pointer must be valid until the file is closed. +** Returns SF_ERR_NO_ERROR on success or non-zero on failure. +*/ +int sf_set_chunk (SNDFILE * sndfile, const SF_CHUNK_INFO * chunk_info) ; + +/* +** An opaque structure to an iterator over the all chunks of a given id +*/ +typedef struct SF_CHUNK_ITERATOR SF_CHUNK_ITERATOR ; + +/* Get an iterator for all chunks matching chunk_info. +** The iterator will point to the first chunk matching chunk_info. +** Chunks are matching, if (chunk_info->id) matches the first +** (chunk_info->id_size) bytes of a chunk found in the SNDFILE* handle. +** If chunk_info is NULL, an iterator to all chunks in the SNDFILE* handle +** is returned. +** The values of chunk_info->datalen and chunk_info->data are ignored. +** If no matching chunks are found in the sndfile, NULL is returned. +** The returned iterator will stay valid until one of the following occurs: +** a) The sndfile is closed. +** b) A new chunk is added using sf_set_chunk(). +** c) Another chunk iterator function is called on the same SNDFILE* handle +** that causes the iterator to be modified. +** The memory for the iterator belongs to the SNDFILE* handle and is freed when +** sf_close() is called. +*/ +SF_CHUNK_ITERATOR * +sf_get_chunk_iterator (SNDFILE * sndfile, const SF_CHUNK_INFO * chunk_info) ; + +/* Iterate through chunks by incrementing the iterator. +** Increments the iterator and returns a handle to the new one. +** After this call, iterator will no longer be valid, and you must use the +** newly returned handle from now on. +** The returned handle can be used to access the next chunk matching +** the criteria as defined in sf_get_chunk_iterator(). +** If iterator points to the last chunk, this will free all resources +** associated with iterator and return NULL. +** The returned iterator will stay valid until sf_get_chunk_iterator_next +** is called again, the sndfile is closed or a new chunk us added. +*/ +SF_CHUNK_ITERATOR * +sf_next_chunk_iterator (SF_CHUNK_ITERATOR * iterator) ; + + +/* Get the size of the specified chunk. +** If the specified chunk exists, the size will be returned in the +** datalen field of the SF_CHUNK_INFO struct. +** Additionally, the id of the chunk will be copied to the id +** field of the SF_CHUNK_INFO struct and it's id_size field will +** be updated accordingly. +** If the chunk doesn't exist chunk_info->datalen will be zero, and the +** id and id_size fields will be undefined. +** The function will return SF_ERR_NO_ERROR on success or non-zero on +** failure. +*/ +int +sf_get_chunk_size (const SF_CHUNK_ITERATOR * it, SF_CHUNK_INFO * chunk_info) ; + +/* Get the specified chunk data. +** If the specified chunk exists, up to chunk_info->datalen bytes of +** the chunk data will be copied into the chunk_info->data buffer +** (allocated by the caller) and the chunk_info->datalen field +** updated to reflect the size of the data. The id and id_size +** field will be updated according to the retrieved chunk +** If the chunk doesn't exist chunk_info->datalen will be zero, and the +** id and id_size fields will be undefined. +** The function will return SF_ERR_NO_ERROR on success or non-zero on +** failure. +*/ +int +sf_get_chunk_data (const SF_CHUNK_ITERATOR * it, SF_CHUNK_INFO * chunk_info) ; + + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* SNDFILE_H */ diff --git a/libsndfile-1.0.31/include/sndfile.hh b/libsndfile-1.0.31/include/sndfile.hh new file mode 100644 index 0000000..ae9af3f --- /dev/null +++ b/libsndfile-1.0.31/include/sndfile.hh @@ -0,0 +1,452 @@ +/* +** Copyright (C) 2005-2017 Erik de Castro Lopo +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the author nor the names of any contributors may be used +** to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +** The above modified BSD style license (GPL and LGPL compatible) applies to +** this file. It does not apply to libsndfile itself which is released under +** the GNU LGPL or the libsndfile test suite which is released under the GNU +** GPL. +** This means that this header file can be used under this modified BSD style +** license, but the LGPL still holds for the libsndfile library itself. +*/ + +/* +** sndfile.hh -- A lightweight C++ wrapper for the libsndfile API. +** +** All the methods are inlines and all functionality is contained in this +** file. There is no separate implementation file. +** +** API documentation is in the doc/ directory of the source code tarball +** and at http://libsndfile.github.io/libsndfile/api.html. +*/ + +#ifndef SNDFILE_HH +#define SNDFILE_HH + +#include + +#include +#include // for std::nothrow + +#if __cplusplus < 201100 +#ifndef nullptr +#define nullptr NULL +#endif +#endif + +class SndfileHandle +{ private : + struct SNDFILE_ref + { SNDFILE_ref (void) ; + ~SNDFILE_ref (void) ; + + SNDFILE *sf ; + SF_INFO sfinfo ; + int ref ; + } ; + + SNDFILE_ref *p ; + + public : + /* Default constructor */ + SndfileHandle (void) : p (nullptr) {} ; + SndfileHandle (const char *path, int mode = SFM_READ, + int format = 0, int channels = 0, int samplerate = 0) ; + SndfileHandle (std::string const & path, int mode = SFM_READ, + int format = 0, int channels = 0, int samplerate = 0) ; + SndfileHandle (int fd, bool close_desc, int mode = SFM_READ, + int format = 0, int channels = 0, int samplerate = 0) ; + SndfileHandle (SF_VIRTUAL_IO &sfvirtual, void *user_data, int mode = SFM_READ, + int format = 0, int channels = 0, int samplerate = 0) ; + +#ifdef ENABLE_SNDFILE_WINDOWS_PROTOTYPES + SndfileHandle (LPCWSTR wpath, int mode = SFM_READ, + int format = 0, int channels = 0, int samplerate = 0) ; +#endif + + ~SndfileHandle (void) ; + + SndfileHandle (const SndfileHandle &orig) ; + SndfileHandle & operator = (const SndfileHandle &rhs) ; + + /* Mainly for debugging/testing. */ + int refCount (void) const { return (p == nullptr) ? 0 : p->ref ; } + + operator bool () const { return (p != nullptr) ; } + + bool operator == (const SndfileHandle &rhs) const { return (p == rhs.p) ; } + + sf_count_t frames (void) const { return p ? p->sfinfo.frames : 0 ; } + int format (void) const { return p ? p->sfinfo.format : 0 ; } + int channels (void) const { return p ? p->sfinfo.channels : 0 ; } + int samplerate (void) const { return p ? p->sfinfo.samplerate : 0 ; } + + int error (void) const ; + const char * strError (void) const ; + + int command (int cmd, void *data, int datasize) ; + + sf_count_t seek (sf_count_t frames, int whence) ; + + void writeSync (void) ; + + int setString (int str_type, const char* str) ; + + const char* getString (int str_type) const ; + + static int formatCheck (int format, int channels, int samplerate) ; + + sf_count_t read (short *ptr, sf_count_t items) ; + sf_count_t read (int *ptr, sf_count_t items) ; + sf_count_t read (float *ptr, sf_count_t items) ; + sf_count_t read (double *ptr, sf_count_t items) ; + + sf_count_t write (const short *ptr, sf_count_t items) ; + sf_count_t write (const int *ptr, sf_count_t items) ; + sf_count_t write (const float *ptr, sf_count_t items) ; + sf_count_t write (const double *ptr, sf_count_t items) ; + + sf_count_t readf (short *ptr, sf_count_t frames) ; + sf_count_t readf (int *ptr, sf_count_t frames) ; + sf_count_t readf (float *ptr, sf_count_t frames) ; + sf_count_t readf (double *ptr, sf_count_t frames) ; + + sf_count_t writef (const short *ptr, sf_count_t frames) ; + sf_count_t writef (const int *ptr, sf_count_t frames) ; + sf_count_t writef (const float *ptr, sf_count_t frames) ; + sf_count_t writef (const double *ptr, sf_count_t frames) ; + + sf_count_t readRaw (void *ptr, sf_count_t bytes) ; + sf_count_t writeRaw (const void *ptr, sf_count_t bytes) ; + + /**< Raw access to the handle. SndfileHandle keeps ownership. */ + SNDFILE * rawHandle (void) ; + + /**< Take ownership of handle, if reference count is 1. */ + SNDFILE * takeOwnership (void) ; +} ; + +/*============================================================================== +** Nothing but implementation below. +*/ + +inline +SndfileHandle::SNDFILE_ref::SNDFILE_ref (void) +: sf (nullptr), sfinfo (), ref (1) +{} + +inline +SndfileHandle::SNDFILE_ref::~SNDFILE_ref (void) +{ if (sf != nullptr) sf_close (sf) ; } + +inline +SndfileHandle::SndfileHandle (const char *path, int mode, int fmt, int chans, int srate) +: p (nullptr) +{ + p = new (std::nothrow) SNDFILE_ref () ; + + if (p != nullptr) + { p->ref = 1 ; + + p->sfinfo.frames = 0 ; + p->sfinfo.channels = chans ; + p->sfinfo.format = fmt ; + p->sfinfo.samplerate = srate ; + p->sfinfo.sections = 0 ; + p->sfinfo.seekable = 0 ; + + p->sf = sf_open (path, mode, &p->sfinfo) ; + } ; + + return ; +} /* SndfileHandle const char * constructor */ + +inline +SndfileHandle::SndfileHandle (std::string const & path, int mode, int fmt, int chans, int srate) +: p (nullptr) +{ + p = new (std::nothrow) SNDFILE_ref () ; + + if (p != nullptr) + { p->ref = 1 ; + + p->sfinfo.frames = 0 ; + p->sfinfo.channels = chans ; + p->sfinfo.format = fmt ; + p->sfinfo.samplerate = srate ; + p->sfinfo.sections = 0 ; + p->sfinfo.seekable = 0 ; + + p->sf = sf_open (path.c_str (), mode, &p->sfinfo) ; + } ; + + return ; +} /* SndfileHandle std::string constructor */ + +inline +SndfileHandle::SndfileHandle (int fd, bool close_desc, int mode, int fmt, int chans, int srate) +: p (nullptr) +{ + if (fd < 0) + return ; + + p = new (std::nothrow) SNDFILE_ref () ; + + if (p != nullptr) + { p->ref = 1 ; + + p->sfinfo.frames = 0 ; + p->sfinfo.channels = chans ; + p->sfinfo.format = fmt ; + p->sfinfo.samplerate = srate ; + p->sfinfo.sections = 0 ; + p->sfinfo.seekable = 0 ; + + p->sf = sf_open_fd (fd, mode, &p->sfinfo, close_desc) ; + } ; + + return ; +} /* SndfileHandle fd constructor */ + +inline +SndfileHandle::SndfileHandle (SF_VIRTUAL_IO &sfvirtual, void *user_data, int mode, int fmt, int chans, int srate) +: p (nullptr) +{ + p = new (std::nothrow) SNDFILE_ref () ; + + if (p != nullptr) + { p->ref = 1 ; + + p->sfinfo.frames = 0 ; + p->sfinfo.channels = chans ; + p->sfinfo.format = fmt ; + p->sfinfo.samplerate = srate ; + p->sfinfo.sections = 0 ; + p->sfinfo.seekable = 0 ; + + p->sf = sf_open_virtual (&sfvirtual, mode, &p->sfinfo, user_data) ; + } ; + + return ; +} /* SndfileHandle std::string constructor */ + +inline +SndfileHandle::~SndfileHandle (void) +{ if (p != nullptr && -- p->ref == 0) + delete p ; +} /* SndfileHandle destructor */ + + +inline +SndfileHandle::SndfileHandle (const SndfileHandle &orig) +: p (orig.p) +{ if (p != nullptr) + ++ p->ref ; +} /* SndfileHandle copy constructor */ + +inline SndfileHandle & +SndfileHandle::operator = (const SndfileHandle &rhs) +{ + if (&rhs == this) + return *this ; + if (p != nullptr && -- p->ref == 0) + delete p ; + + p = rhs.p ; + if (p != nullptr) + ++ p->ref ; + + return *this ; +} /* SndfileHandle assignment operator */ + +inline int +SndfileHandle::error (void) const +{ return sf_error (p->sf) ; } + +inline const char * +SndfileHandle::strError (void) const +{ return sf_strerror (p->sf) ; } + +inline int +SndfileHandle::command (int cmd, void *data, int datasize) +{ return sf_command (p->sf, cmd, data, datasize) ; } + +inline sf_count_t +SndfileHandle::seek (sf_count_t frame_count, int whence) +{ return sf_seek (p->sf, frame_count, whence) ; } + +inline void +SndfileHandle::writeSync (void) +{ sf_write_sync (p->sf) ; } + +inline int +SndfileHandle::setString (int str_type, const char* str) +{ return sf_set_string (p->sf, str_type, str) ; } + +inline const char* +SndfileHandle::getString (int str_type) const +{ return sf_get_string (p->sf, str_type) ; } + +inline int +SndfileHandle::formatCheck (int fmt, int chans, int srate) +{ + SF_INFO sfinfo ; + + sfinfo.frames = 0 ; + sfinfo.channels = chans ; + sfinfo.format = fmt ; + sfinfo.samplerate = srate ; + sfinfo.sections = 0 ; + sfinfo.seekable = 0 ; + + return sf_format_check (&sfinfo) ; +} + +/*---------------------------------------------------------------------*/ + +inline sf_count_t +SndfileHandle::read (short *ptr, sf_count_t items) +{ return sf_read_short (p->sf, ptr, items) ; } + +inline sf_count_t +SndfileHandle::read (int *ptr, sf_count_t items) +{ return sf_read_int (p->sf, ptr, items) ; } + +inline sf_count_t +SndfileHandle::read (float *ptr, sf_count_t items) +{ return sf_read_float (p->sf, ptr, items) ; } + +inline sf_count_t +SndfileHandle::read (double *ptr, sf_count_t items) +{ return sf_read_double (p->sf, ptr, items) ; } + +inline sf_count_t +SndfileHandle::write (const short *ptr, sf_count_t items) +{ return sf_write_short (p->sf, ptr, items) ; } + +inline sf_count_t +SndfileHandle::write (const int *ptr, sf_count_t items) +{ return sf_write_int (p->sf, ptr, items) ; } + +inline sf_count_t +SndfileHandle::write (const float *ptr, sf_count_t items) +{ return sf_write_float (p->sf, ptr, items) ; } + +inline sf_count_t +SndfileHandle::write (const double *ptr, sf_count_t items) +{ return sf_write_double (p->sf, ptr, items) ; } + +inline sf_count_t +SndfileHandle::readf (short *ptr, sf_count_t frame_count) +{ return sf_readf_short (p->sf, ptr, frame_count) ; } + +inline sf_count_t +SndfileHandle::readf (int *ptr, sf_count_t frame_count) +{ return sf_readf_int (p->sf, ptr, frame_count) ; } + +inline sf_count_t +SndfileHandle::readf (float *ptr, sf_count_t frame_count) +{ return sf_readf_float (p->sf, ptr, frame_count) ; } + +inline sf_count_t +SndfileHandle::readf (double *ptr, sf_count_t frame_count) +{ return sf_readf_double (p->sf, ptr, frame_count) ; } + +inline sf_count_t +SndfileHandle::writef (const short *ptr, sf_count_t frame_count) +{ return sf_writef_short (p->sf, ptr, frame_count) ; } + +inline sf_count_t +SndfileHandle::writef (const int *ptr, sf_count_t frame_count) +{ return sf_writef_int (p->sf, ptr, frame_count) ; } + +inline sf_count_t +SndfileHandle::writef (const float *ptr, sf_count_t frame_count) +{ return sf_writef_float (p->sf, ptr, frame_count) ; } + +inline sf_count_t +SndfileHandle::writef (const double *ptr, sf_count_t frame_count) +{ return sf_writef_double (p->sf, ptr, frame_count) ; } + +inline sf_count_t +SndfileHandle::readRaw (void *ptr, sf_count_t bytes) +{ return sf_read_raw (p->sf, ptr, bytes) ; } + +inline sf_count_t +SndfileHandle::writeRaw (const void *ptr, sf_count_t bytes) +{ return sf_write_raw (p->sf, ptr, bytes) ; } + +inline SNDFILE * +SndfileHandle::rawHandle (void) +{ return (p ? p->sf : nullptr) ; } + +inline SNDFILE * +SndfileHandle::takeOwnership (void) +{ + if (p == nullptr || (p->ref != 1)) + return nullptr ; + + SNDFILE * sf = p->sf ; + p->sf = nullptr ; + delete p ; + p = nullptr ; + return sf ; +} + +#ifdef ENABLE_SNDFILE_WINDOWS_PROTOTYPES + +inline +SndfileHandle::SndfileHandle (LPCWSTR wpath, int mode, int fmt, int chans, int srate) +: p (nullptr) +{ + p = new (std::nothrow) SNDFILE_ref () ; + + if (p != nullptr) + { p->ref = 1 ; + + p->sfinfo.frames = 0 ; + p->sfinfo.channels = chans ; + p->sfinfo.format = fmt ; + p->sfinfo.samplerate = srate ; + p->sfinfo.sections = 0 ; + p->sfinfo.seekable = 0 ; + + p->sf = sf_wchar_open (wpath, mode, &p->sfinfo) ; + } ; + + return ; +} /* SndfileHandle const wchar_t * constructor */ + +#endif + +#endif /* SNDFILE_HH */ + diff --git a/libsndfile-1.0.31/libsndfile.spec.in b/libsndfile-1.0.31/libsndfile.spec.in new file mode 100644 index 0000000..d442728 --- /dev/null +++ b/libsndfile-1.0.31/libsndfile.spec.in @@ -0,0 +1,69 @@ + +%define name @PACKAGE@ +%define version @VERSION@ +%define release 1 + +Summary: A library to handle various audio file formats. +Name: %{name} +Version: %{version} +Release: %{release} +Copyright: LGPL +Group: Libraries/Sound +Source: http://www.mega-nerd.com/libsndfile/libsndfile-%{version}.tar.gz +Url: http://www.mega-nerd.com/libsndfile/ +BuildRoot: /var/tmp/%{name}-%{version} + +%description +libsndfile is a C library for reading and writing sound files such as +AIFF, AU and WAV files through one standard interface. It can currently +read/write 8, 16, 24 and 32-bit PCM files as well as 32-bit floating +point WAV files and a number of compressed formats. + +%package devel +Summary: Libraries, includes, etc to develop libsndfile applications +Group: Libraries + +%description devel +Libraries, include files, etc you can use to develop libsndfile applications. + +%prep +%setup + +%build +%configure +make + +%install +if [ -d $RPM_BUILD_ROOT ]; then rm -rf $RPM_BUILD_ROOT; fi +mkdir -p $RPM_BUILD_ROOT +make DESTDIR=$RPM_BUILD_ROOT install +%clean +if [ -d $RPM_BUILD_ROOT ]; then rm -rf $RPM_BUILD_ROOT; fi + +%files +%defattr(-,root,root) +%doc AUTHORS COPYING ChangeLog INSTALL NEWS README TODO doc +%{_libdir}/libsndfile.so.* +%{_bindir}/* +%{_mandir}/man1/* +%{_datadir}/octave/site/m/* +%{_defaultdocdir}/libsndfile1-dev/html/* + +%files devel +%defattr(-,root,root) +%{_libdir}/libsndfile.a +%{_libdir}/libsndfile.la +%{_libdir}/libsndfile.so +%{_includedir}/sndfile.h +%{_libdir}/pkgconfig/sndfile.pc + +%changelog +* Sun May 15 2005 Erik de Castro Lopo +- Add html files to the files section. +* Tue Sep 16 2003 Erik de Castro Lopo +- Apply corrections from Andrew Schultz. +* Mon Oct 21 2002 Erik de Castro Lopo +- Force installation of sndfile.pc file. +* Thu Jul 6 2000 Josh Green +- Created libsndfile.spec.in + diff --git a/libsndfile-1.0.31/m4/ax_add_fortify_source.m4 b/libsndfile-1.0.31/m4/ax_add_fortify_source.m4 new file mode 100644 index 0000000..d443814 --- /dev/null +++ b/libsndfile-1.0.31/m4/ax_add_fortify_source.m4 @@ -0,0 +1,53 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_add_fortify_source.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_ADD_FORTIFY_SOURCE +# +# DESCRIPTION +# +# Check whether -D_FORTIFY_SOURCE=2 can be added to CPPFLAGS without macro +# redefinition warnings. Some distributions (such as Gentoo Linux) enable +# _FORTIFY_SOURCE globally in their compilers, leading to unnecessary +# warnings in the form of +# +# :0:0: error: "_FORTIFY_SOURCE" redefined [-Werror] +# : note: this is the location of the previous definition +# +# which is a problem if -Werror is enabled. This macro checks whether +# _FORTIFY_SOURCE is already defined, and if not, adds -D_FORTIFY_SOURCE=2 +# to CPPFLAGS. +# +# LICENSE +# +# Copyright (c) 2017 David Seifert +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 1 + +AC_DEFUN([AX_ADD_FORTIFY_SOURCE],[ + AC_MSG_CHECKING([whether to add -D_FORTIFY_SOURCE=2 to CPPFLAGS]) + AC_LINK_IFELSE([ + AC_LANG_SOURCE( + [[ + int main() { + #ifndef _FORTIFY_SOURCE + return 0; + #else + this_is_an_error; + #endif + } + ]] + )], [ + AC_MSG_RESULT([yes]) + CPPFLAGS="$CPPFLAGS -D_FORTIFY_SOURCE=2" + ], [ + AC_MSG_RESULT([no]) + ]) +]) diff --git a/libsndfile-1.0.31/m4/ax_append_compile_flags.m4 b/libsndfile-1.0.31/m4/ax_append_compile_flags.m4 new file mode 100644 index 0000000..5b6f1af --- /dev/null +++ b/libsndfile-1.0.31/m4/ax_append_compile_flags.m4 @@ -0,0 +1,67 @@ +# ============================================================================ +# https://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html +# ============================================================================ +# +# SYNOPSIS +# +# AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS], [INPUT]) +# +# DESCRIPTION +# +# For every FLAG1, FLAG2 it is checked whether the compiler works with the +# flag. If it does, the flag is added FLAGS-VARIABLE +# +# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. +# CFLAGS) is used. During the check the flag is always added to the +# current language's flags. +# +# If EXTRA-FLAGS is defined, it is added to the current language's default +# flags (e.g. CFLAGS) when the check is done. The check is thus made with +# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to +# force the compiler to issue an error when a bad flag is given. +# +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# +# NOTE: This macro depends on the AX_APPEND_FLAG and +# AX_CHECK_COMPILE_FLAG. Please keep this macro in sync with +# AX_APPEND_LINK_FLAGS. +# +# LICENSE +# +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# 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, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 6 + +AC_DEFUN([AX_APPEND_COMPILE_FLAGS], +[AX_REQUIRE_DEFINED([AX_CHECK_COMPILE_FLAG]) +AX_REQUIRE_DEFINED([AX_APPEND_FLAG]) +for flag in $1; do + AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3], [$4]) +done +])dnl AX_APPEND_COMPILE_FLAGS diff --git a/libsndfile-1.0.31/m4/ax_append_flag.m4 b/libsndfile-1.0.31/m4/ax_append_flag.m4 new file mode 100644 index 0000000..e8c5312 --- /dev/null +++ b/libsndfile-1.0.31/m4/ax_append_flag.m4 @@ -0,0 +1,71 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_append_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) +# +# DESCRIPTION +# +# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space +# added in between. +# +# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. +# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains +# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly +# FLAG. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# 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, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 7 + +AC_DEFUN([AX_APPEND_FLAG], +[dnl +AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF +AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])]) +AS_VAR_SET_IF(FLAGS,[ + AS_CASE([" AS_VAR_GET(FLAGS) "], + [*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])], + [ + AS_VAR_APPEND(FLAGS,[" $1"]) + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) + ], + [ + AS_VAR_SET(FLAGS,[$1]) + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) +AS_VAR_POPDEF([FLAGS])dnl +])dnl AX_APPEND_FLAG diff --git a/libsndfile-1.0.31/m4/ax_append_link_flags.m4 b/libsndfile-1.0.31/m4/ax_append_link_flags.m4 new file mode 100644 index 0000000..6f7f174 --- /dev/null +++ b/libsndfile-1.0.31/m4/ax_append_link_flags.m4 @@ -0,0 +1,65 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_append_link_flags.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_APPEND_LINK_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS], [INPUT]) +# +# DESCRIPTION +# +# For every FLAG1, FLAG2 it is checked whether the linker works with the +# flag. If it does, the flag is added FLAGS-VARIABLE +# +# If FLAGS-VARIABLE is not specified, the linker's flags (LDFLAGS) is +# used. During the check the flag is always added to the linker's flags. +# +# If EXTRA-FLAGS is defined, it is added to the linker's default flags +# when the check is done. The check is thus made with the flags: "LDFLAGS +# EXTRA-FLAGS FLAG". This can for example be used to force the linker to +# issue an error when a bad flag is given. +# +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# +# NOTE: This macro depends on the AX_APPEND_FLAG and AX_CHECK_LINK_FLAG. +# Please keep this macro in sync with AX_APPEND_COMPILE_FLAGS. +# +# LICENSE +# +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# 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, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 6 + +AC_DEFUN([AX_APPEND_LINK_FLAGS], +[AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG]) +AX_REQUIRE_DEFINED([AX_APPEND_FLAG]) +for flag in $1; do + AX_CHECK_LINK_FLAG([$flag], [AX_APPEND_FLAG([$flag], [m4_default([$2], [LDFLAGS])])], [], [$3], [$4]) +done +])dnl AX_APPEND_LINK_FLAGS diff --git a/libsndfile-1.0.31/m4/ax_check_compile_flag.m4 b/libsndfile-1.0.31/m4/ax_check_compile_flag.m4 new file mode 100644 index 0000000..dcabb92 --- /dev/null +++ b/libsndfile-1.0.31/m4/ax_check_compile_flag.m4 @@ -0,0 +1,74 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the current language's compiler +# or gives an error. (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the current language's default +# flags (e.g. CFLAGS) when the check is done. The check is thus made with +# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to +# force the compiler to issue an error when a bad flag is given. +# +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# 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, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 5 + +AC_DEFUN([AX_CHECK_COMPILE_FLAG], +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl +AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ + ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS + _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" + AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) +AS_VAR_IF(CACHEVAR,yes, + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_COMPILE_FLAGS diff --git a/libsndfile-1.0.31/m4/ax_check_link_flag.m4 b/libsndfile-1.0.31/m4/ax_check_link_flag.m4 new file mode 100644 index 0000000..819409a --- /dev/null +++ b/libsndfile-1.0.31/m4/ax_check_link_flag.m4 @@ -0,0 +1,74 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the linker or gives an error. +# (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the linker's default flags +# when the check is done. The check is thus made with the flags: "LDFLAGS +# EXTRA-FLAGS FLAG". This can for example be used to force the linker to +# issue an error when a bad flag is given. +# +# INPUT gives an alternative input source to AC_LINK_IFELSE. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# 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, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 5 + +AC_DEFUN([AX_CHECK_LINK_FLAG], +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl +AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [ + ax_check_save_flags=$LDFLAGS + LDFLAGS="$LDFLAGS $4 $1" + AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + LDFLAGS=$ax_check_save_flags]) +AS_VAR_IF(CACHEVAR,yes, + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_LINK_FLAGS diff --git a/libsndfile-1.0.31/m4/ax_compiler_vendor.m4 b/libsndfile-1.0.31/m4/ax_compiler_vendor.m4 new file mode 100644 index 0000000..4ca8089 --- /dev/null +++ b/libsndfile-1.0.31/m4/ax_compiler_vendor.m4 @@ -0,0 +1,87 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_compiler_vendor.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_COMPILER_VENDOR +# +# DESCRIPTION +# +# Determine the vendor of the C/C++ compiler, e.g., gnu, intel, ibm, sun, +# hp, borland, comeau, dec, cray, kai, lcc, metrowerks, sgi, microsoft, +# watcom, etc. The vendor is returned in the cache variable +# $ax_cv_c_compiler_vendor for C and $ax_cv_cxx_compiler_vendor for C++. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2008 Matteo Frigo +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# 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, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 16 + +AC_DEFUN([AX_COMPILER_VENDOR], +[AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor, + dnl Please add if possible support to ax_compiler_version.m4 + [# note: don't check for gcc first since some other compilers define __GNUC__ + vendors="intel: __ICC,__ECC,__INTEL_COMPILER + ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__ + pathscale: __PATHCC__,__PATHSCALE__ + clang: __clang__ + cray: _CRAYC + fujitsu: __FUJITSU + gnu: __GNUC__ + sun: __SUNPRO_C,__SUNPRO_CC + hp: __HP_cc,__HP_aCC + dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER + borland: __BORLANDC__,__CODEGEARC__,__TURBOC__ + comeau: __COMO__ + kai: __KCC + lcc: __LCC__ + sgi: __sgi,sgi + microsoft: _MSC_VER + metrowerks: __MWERKS__ + watcom: __WATCOMC__ + portland: __PGI + tcc: __TINYC__ + unknown: UNKNOWN" + for ventest in $vendors; do + case $ventest in + *:) vendor=$ventest; continue ;; + *) vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;; + esac + AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[ + #if !($vencpp) + thisisanerror; + #endif + ])], [break]) + done + ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=`echo $vendor | cut -d: -f1` + ]) +]) diff --git a/libsndfile-1.0.31/m4/ax_compiler_version.m4 b/libsndfile-1.0.31/m4/ax_compiler_version.m4 new file mode 100644 index 0000000..8a8e28a --- /dev/null +++ b/libsndfile-1.0.31/m4/ax_compiler_version.m4 @@ -0,0 +1,492 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_compiler_version.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_COMPILER_VERSION +# +# DESCRIPTION +# +# This macro retrieves the compiler version and returns it in the cache +# variable $ax_cv_c_compiler_version for C and $ax_cv_cxx_compiler_version +# for C++. +# +# Version is returned as epoch:major.minor.patchversion +# +# Epoch is used in order to have an increasing version number in case of +# marketing change. +# +# Epoch use: * borland compiler use chronologically 0turboc for turboc +# era, +# +# 1borlanc BORLANDC++ before 5, 2cppbuilder for cppbuilder era, +# 3borlancpp for return of BORLANDC++ (after version 5.5), +# 4cppbuilder for cppbuilder with year version, +# and 5xe for XE era. +# +# An empty string is returned otherwise. +# +# LICENSE +# +# Copyright (c) 2014 Bastien ROUCARIES +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 9 + +# for intel +AC_DEFUN([_AX_COMPILER_VERSION_INTEL], + [ dnl + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + [__INTEL_COMPILER/100],, + AC_MSG_FAILURE([[[$0]] unknown intel compiler version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + [(__INTEL_COMPILER%100)/10],, + AC_MSG_FAILURE([[[$0]] unknown intel compiler version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + [(__INTEL_COMPILER%10)],, + AC_MSG_FAILURE([[[$0]] unknown intel compiler version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) + +# for IBM +AC_DEFUN([_AX_COMPILER_VERSION_IBM], + [ dnl + dnl check between z/OS C/C++ and XL C/C++ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([], + [ + #if defined(__COMPILER_VER__) + choke me; + #endif + ])], + [ + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + [__xlC__/100],, + AC_MSG_FAILURE([[[$0]] unknown IBM compiler major version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + [__xlC__%100],, + AC_MSG_FAILURE([[[$0]] unknown IBM compiler minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + [__xlC_ver__/0x100],, + AC_MSG_FAILURE([[[$0]] unknown IBM compiler patch version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_build, + [__xlC_ver__%0x100],, + AC_MSG_FAILURE([[[$0]] unknown IBM compiler build version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_build" + ], + [ + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + [__xlC__%1000],, + AC_MSG_FAILURE([[[$0]] unknown IBM compiler patch version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + [(__xlC__/10000)%10],, + AC_MSG_FAILURE([[[$0]] unknown IBM compiler minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + [(__xlC__/100000)%10],, + AC_MSG_FAILURE([[[$0]] unknown IBM compiler major version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) +]) + +# for pathscale +AC_DEFUN([_AX_COMPILER_VERSION_PATHSCALE],[ + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + __PATHCC__,, + AC_MSG_FAILURE([[[$0]] unknown pathscale major])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + __PATHCC_MINOR__,, + AC_MSG_FAILURE([[[$0]] unknown pathscale minor])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + [__PATHCC_PATCHLEVEL__],, + AC_MSG_FAILURE([[[$0]] unknown pathscale patch level])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) + +# for clang +AC_DEFUN([_AX_COMPILER_VERSION_CLANG],[ + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + __clang_major__,, + AC_MSG_FAILURE([[[$0]] unknown clang major])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + __clang_minor__,, + AC_MSG_FAILURE([[[$0]] unknown clang minor])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + [__clang_patchlevel__],,0) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) + +# for crayc +AC_DEFUN([_AX_COMPILER_VERSION_CRAY],[ + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + _RELEASE,, + AC_MSG_FAILURE([[[$0]] unknown crayc release])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + _RELEASE_MINOR,, + AC_MSG_FAILURE([[[$0]] unknown crayc minor])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor" + ]) + +# for fujitsu +AC_DEFUN([_AX_COMPILER_VERSION_FUJITSU],[ + AC_COMPUTE_INT(ax_cv_[]_AC_LANG_ABBREV[]_compiler_version, + __FCC_VERSION,, + AC_MSG_FAILURE([[[$0]]unknown fujitsu release])) + ]) + +# for GNU +AC_DEFUN([_AX_COMPILER_VERSION_GNU],[ + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + __GNUC__,, + AC_MSG_FAILURE([[[$0]] unknown gcc major])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + __GNUC_MINOR__,, + AC_MSG_FAILURE([[[$0]] unknown gcc minor])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + [__GNUC_PATCHLEVEL__],, + AC_MSG_FAILURE([[[$0]] unknown gcc patch level])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) + +# For sun +AC_DEFUN([_AX_COMPILER_VERSION_SUN],[ + m4_define([_AX_COMPILER_VERSION_SUN_NUMBER], + [ + #if defined(__SUNPRO_CC) + __SUNPRO_CC + #else + __SUNPRO_C + #endif + ]) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_until59, + !!(_AX_COMPILER_VERSION_SUN_NUMBER < 0x1000),, + AC_MSG_FAILURE([[[$0]] unknown sun release version])) + AS_IF([test "X$_ax_[]_AC_LANG_ABBREV[]_compiler_version_until59" = X1], + [dnl + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + _AX_COMPILER_VERSION_SUN_NUMBER % 0x10,, + AC_MSG_FAILURE([[[$0]] unknown sun patch version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + (_AX_COMPILER_VERSION_SUN_NUMBER / 0x10) % 0x10,, + AC_MSG_FAILURE([[[$0]] unknown sun minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + (_AX_COMPILER_VERSION_SUN_NUMBER / 0x100),, + AC_MSG_FAILURE([[[$0]] unknown sun major version])) + ], + [dnl + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + _AX_COMPILER_VERSION_SUN_NUMBER % 0x10,, + AC_MSG_FAILURE([[[$0]] unknown sun patch version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + (_AX_COMPILER_VERSION_SUN_NUMBER / 0x100) % 0x100,, + AC_MSG_FAILURE([[[$0]] unknown sun minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + (_AX_COMPILER_VERSION_SUN_NUMBER / 0x1000),, + AC_MSG_FAILURE([[[$0]] unknown sun major version])) + ]) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" +]) + +AC_DEFUN([_AX_COMPILER_VERSION_HP],[ + m4_define([_AX_COMPILER_VERSION_HP_NUMBER], + [ + #if defined(__HP_cc) + __HP_cc + #else + __HP_aCC + #endif + ]) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_untilA0121, + !!(_AX_COMPILER_VERSION_HP_NUMBER <= 1),, + AC_MSG_FAILURE([[[$0]] unknown hp release version])) + AS_IF([test "X$_ax_[]_AC_LANG_ABBREV[]_compiler_version_untilA0121" = X1], + [dnl By default output last version with this behavior. + dnl it is so old + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="01.21.00" + ], + [dnl + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + (_AX_COMPILER_VERSION_HP_NUMBER % 100),, + AC_MSG_FAILURE([[[$0]] unknown hp release version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + ((_AX_COMPILER_VERSION_HP_NUMBER / 100)%100),, + AC_MSG_FAILURE([[[$0]] unknown hp minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + ((_AX_COMPILER_VERSION_HP_NUMBER / 10000)%100),, + AC_MSG_FAILURE([[[$0]] unknown hp major version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) +]) + +AC_DEFUN([_AX_COMPILER_VERSION_DEC],[dnl + m4_define([_AX_COMPILER_VERSION_DEC_NUMBER], + [ + #if defined(__DECC_VER) + __DECC_VER + #else + __DECCXX_VER + #endif + ]) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + (_AX_COMPILER_VERSION_DEC_NUMBER % 10000),, + AC_MSG_FAILURE([[[$0]] unknown dec release version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + ((_AX_COMPILER_VERSION_DEC_NUMBER / 100000UL)%100),, + AC_MSG_FAILURE([[[$0]] unknown dec minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + ((_AX_COMPILER_VERSION_DEC_NUMBER / 10000000UL)%100),, + AC_MSG_FAILURE([[[$0]] unknown dec major version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) + +# borland +AC_DEFUN([_AX_COMPILER_VERSION_BORLAND],[dnl + m4_define([_AX_COMPILER_VERSION_TURBOC_NUMBER], + [ + #if defined(__TURBOC__) + __TURBOC__ + #else + choke me + #endif + ]) + m4_define([_AX_COMPILER_VERSION_BORLANDC_NUMBER], + [ + #if defined(__BORLANDC__) + __BORLANDC__ + #else + __CODEGEARC__ + #endif + ]) + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM(, + _AX_COMPILER_VERSION_TURBOC_NUMBER)], + [dnl TURBOC + AC_COMPUTE_INT( + _ax_[]_AC_LANG_ABBREV[]_compiler_version_turboc_raw, + _AX_COMPILER_VERSION_TURBOC_NUMBER,, + AC_MSG_FAILURE([[[$0]] unknown turboc version])) + AS_IF( + [test $_ax_[]_AC_LANG_ABBREV[]_compiler_version_turboc_raw -lt 661 || test $_ax_[]_AC_LANG_ABBREV[]_compiler_version_turboc_raw -gt 1023], + [dnl compute normal version + AC_COMPUTE_INT( + _ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + _AX_COMPILER_VERSION_TURBOC_NUMBER % 0x100,, + AC_MSG_FAILURE([[[$0]] unknown turboc minor version])) + AC_COMPUTE_INT( + _ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + (_AX_COMPILER_VERSION_TURBOC_NUMBER/0x100)%0x100,, + AC_MSG_FAILURE([[[$0]] unknown turboc major version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="0turboc:$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor"], + [dnl special version + AS_CASE([$_ax_[]_AC_LANG_ABBREV[]_compiler_version_turboc_raw], + [661],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="0turboc:1.00"], + [662],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="0turboc:1.01"], + [663],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="0turboc:2.00"], + [ + AC_MSG_WARN([[[$0]] unknown turboc version between 0x295 and 0x400 please report bug]) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="" + ]) + ]) + ], + # borlandc + [ + AC_COMPUTE_INT( + _ax_[]_AC_LANG_ABBREV[]_compiler_version_borlandc_raw, + _AX_COMPILER_VERSION_BORLANDC_NUMBER,, + AC_MSG_FAILURE([[[$0]] unknown borlandc version])) + AS_CASE([$_ax_[]_AC_LANG_ABBREV[]_compiler_version_borlandc_raw], + dnl BORLANDC++ before 5.5 + [512] ,[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="1borlanc:2.00"], + [1024],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="1borlanc:3.00"], + [1024],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="1borlanc:3.00"], + [1040],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="1borlanc:3.1"], + [1106],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="1borlanc:4.0"], + [1280],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="1borlanc:5.0"], + [1312],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="1borlanc:5.02"], + dnl C++ Builder era + [1328],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="2cppbuilder:3.0"], + [1344],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="2cppbuilder:4.0"], + dnl BORLANDC++ after 5.5 + [1360],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="3borlancpp:5.5"], + [1361],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="3borlancpp:5.51"], + [1378],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="3borlancpp:5.6.4"], + dnl C++ Builder with year number + [1392],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="4cppbuilder:2006"], + [1424],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="4cppbuilder:2007"], + [1555],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="4cppbuilder:2009"], + [1569],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="4cppbuilder:2010"], + dnl XE version + [1584],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="5xe"], + [1600],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="5xe:2"], + [1616],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="5xe:3"], + [1632],[ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="5xe:4"], + [ + AC_MSG_WARN([[[$0]] Unknown borlandc compiler version $_ax_[]_AC_LANG_ABBREV[]_compiler_version_borlandc_raw please report bug]) + ]) + ]) + ]) + +# COMO +AC_DEFUN([_AX_COMPILER_VERSION_COMEAU], + [ dnl + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + [__COMO_VERSION__%100],, + AC_MSG_FAILURE([[[$0]] unknown comeau compiler minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + [(__COMO_VERSION__/100)%10],, + AC_MSG_FAILURE([[[$0]] unknown comeau compiler major version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor" + ]) + +# KAI +AC_DEFUN([_AX_COMPILER_VERSION_KAI],[ + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + [__KCC_VERSION%100],, + AC_MSG_FAILURE([[[$0]] unknown kay compiler patch version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + [(__KCC_VERSION/100)%10],, + AC_MSG_FAILURE([[[$0]] unknown kay compiler minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + [(__KCC_VERSION/1000)%10],, + AC_MSG_FAILURE([[[$0]] unknown kay compiler major version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) + +dnl LCC +dnl LCC does not output version... + +# SGI +AC_DEFUN([_AX_COMPILER_VERSION_SGI],[ + m4_define([_AX_COMPILER_VERSION_SGI_NUMBER], + [ + #if defined(_COMPILER_VERSION) + _COMPILER_VERSION + #else + _SGI_COMPILER_VERSION + #endif + ]) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + [_AX_COMPILER_VERSION_SGI_NUMBER%10],, + AC_MSG_FAILURE([[[$0]] unknown SGI compiler patch version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + [(_AX_COMPILER_VERSION_SGI_NUMBER/10)%10],, + AC_MSG_FAILURE([[[$0]] unknown SGI compiler minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + [(_AX_COMPILER_VERSION_SGI_NUMBER/100)%10],, + AC_MSG_FAILURE([[[$0]] unknown SGI compiler major version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) + +# microsoft +AC_DEFUN([_AX_COMPILER_VERSION_MICROSOFT],[ + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + _MSC_VER%100,, + AC_MSG_FAILURE([[[$0]] unknown microsoft compiler minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + (_MSC_VER/100)%100,, + AC_MSG_FAILURE([[[$0]] unknown microsoft compiler major version])) + dnl could be overridden + _ax_[]_AC_LANG_ABBREV[]_compiler_version_patch=0 + _ax_[]_AC_LANG_ABBREV[]_compiler_version_build=0 + # special case for version 6 + AS_IF([test "X$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major" = "X12"], + [AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + _MSC_FULL_VER%1000,, + _ax_[]_AC_LANG_ABBREV[]_compiler_version_patch=0)]) + # for version 7 + AS_IF([test "X$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major" = "X13"], + [AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + _MSC_FULL_VER%1000,, + AC_MSG_FAILURE([[[$0]] unknown microsoft compiler patch version])) + ]) + # for version > 8 + AS_IF([test $_ax_[]_AC_LANG_ABBREV[]_compiler_version_major -ge 14], + [AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + _MSC_FULL_VER%10000,, + AC_MSG_FAILURE([[[$0]] unknown microsoft compiler patch version])) + ]) + AS_IF([test $_ax_[]_AC_LANG_ABBREV[]_compiler_version_major -ge 15], + [AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_build, + _MSC_BUILD,, + AC_MSG_FAILURE([[[$0]] unknown microsoft compiler build version])) + ]) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_build" + ]) + +# for metrowerks +AC_DEFUN([_AX_COMPILER_VERSION_METROWERKS],[dnl + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + __MWERKS__%0x100,, + AC_MSG_FAILURE([[[$0]] unknown metrowerks compiler patch version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + (__MWERKS__/0x100)%0x10,, + AC_MSG_FAILURE([[[$0]] unknown metrowerks compiler minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + (__MWERKS__/0x1000)%0x10,, + AC_MSG_FAILURE([[[$0]] unknown metrowerks compiler major version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) + +# for watcom +AC_DEFUN([_AX_COMPILER_VERSION_WATCOM],[dnl + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + __WATCOMC__%100,, + AC_MSG_FAILURE([[[$0]] unknown watcom compiler minor version])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + (__WATCOMC__/100)%100,, + AC_MSG_FAILURE([[[$0]] unknown watcom compiler major version])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor" + ]) + +# for PGI +AC_DEFUN([_AX_COMPILER_VERSION_PORTLAND],[ + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_major, + __PGIC__,, + AC_MSG_FAILURE([[[$0]] unknown pgi major])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor, + __PGIC_MINOR__,, + AC_MSG_FAILURE([[[$0]] unknown pgi minor])) + AC_COMPUTE_INT(_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch, + [__PGIC_PATCHLEVEL__],, + AC_MSG_FAILURE([[[$0]] unknown pgi patch level])) + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version="$_ax_[]_AC_LANG_ABBREV[]_compiler_version_major.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_minor.$_ax_[]_AC_LANG_ABBREV[]_compiler_version_patch" + ]) + +# tcc +AC_DEFUN([_AX_COMPILER_VERSION_TCC],[ + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version=[`tcc -v | $SED 's/^[ ]*tcc[ ]\+version[ ]\+\([0-9.]\+\).*/\1/g'`] + ]) +# main entry point +AC_DEFUN([AX_COMPILER_VERSION],[dnl + AC_REQUIRE([AX_COMPILER_VENDOR]) + AC_REQUIRE([AC_PROG_SED]) + AC_CACHE_CHECK([for _AC_LANG compiler version], + ax_cv_[]_AC_LANG_ABBREV[]_compiler_version, + [ dnl + AS_CASE([$ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor], + [intel],[_AX_COMPILER_VERSION_INTEL], + [ibm],[_AX_COMPILER_VERSION_IBM], + [pathscale],[_AX_COMPILER_VERSION_PATHSCALE], + [clang],[_AX_COMPILER_VERSION_CLANG], + [cray],[_AX_COMPILER_VERSION_CRAY], + [fujitsu],[_AX_COMPILER_VERSION_FUJITSU], + [gnu],[_AX_COMPILER_VERSION_GNU], + [sun],[_AX_COMPILER_VERSION_SUN], + [hp],[_AX_COMPILER_VERSION_HP], + [dec],[_AX_COMPILER_VERSION_DEC], + [borland],[_AX_COMPILER_VERSION_BORLAND], + [comeau],[_AX_COMPILER_VERSION_COMEAU], + [kai],[_AX_COMPILER_VERSION_KAI], + [sgi],[_AX_COMPILER_VERSION_SGI], + [microsoft],[_AX_COMPILER_VERSION_MICROSOFT], + [metrowerks],[_AX_COMPILER_VERSION_METROWERKS], + [watcom],[_AX_COMPILER_VERSION_WATCOM], + [portland],[_AX_COMPILER_VERSION_PORTLAND], + [tcc],[_AX_COMPILER_VERSION_TCC], + [ax_cv_[]_AC_LANG_ABBREV[]_compiler_version=""]) + ]) +]) diff --git a/libsndfile-1.0.31/m4/ax_recursive_eval.m4 b/libsndfile-1.0.31/m4/ax_recursive_eval.m4 new file mode 100644 index 0000000..0625aca --- /dev/null +++ b/libsndfile-1.0.31/m4/ax_recursive_eval.m4 @@ -0,0 +1,56 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_recursive_eval.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_RECURSIVE_EVAL(VALUE, RESULT) +# +# DESCRIPTION +# +# Interpolate the VALUE in loop until it doesn't change, and set the +# result to $RESULT. WARNING: It's easy to get an infinite loop with some +# unsane input. +# +# LICENSE +# +# Copyright (c) 2008 Alexandre Duret-Lutz +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# 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, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 1 + +AC_DEFUN([AX_RECURSIVE_EVAL], +[_lcl_receval="$1" +$2=`(test "x$prefix" = xNONE && prefix="$ac_default_prefix" + test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" + _lcl_receval_old='' + while test "[$]_lcl_receval_old" != "[$]_lcl_receval"; do + _lcl_receval_old="[$]_lcl_receval" + eval _lcl_receval="\"[$]_lcl_receval\"" + done + echo "[$]_lcl_receval")`]) diff --git a/libsndfile-1.0.31/m4/ax_require_defined.m4 b/libsndfile-1.0.31/m4/ax_require_defined.m4 new file mode 100644 index 0000000..17c3eab --- /dev/null +++ b/libsndfile-1.0.31/m4/ax_require_defined.m4 @@ -0,0 +1,37 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_require_defined.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_REQUIRE_DEFINED(MACRO) +# +# DESCRIPTION +# +# AX_REQUIRE_DEFINED is a simple helper for making sure other macros have +# been defined and thus are available for use. This avoids random issues +# where a macro isn't expanded. Instead the configure script emits a +# non-fatal: +# +# ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found +# +# It's like AC_REQUIRE except it doesn't expand the required macro. +# +# Here's an example: +# +# AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG]) +# +# LICENSE +# +# Copyright (c) 2014 Mike Frysinger +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 2 + +AC_DEFUN([AX_REQUIRE_DEFINED], [dnl + m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])]) +])dnl AX_REQUIRE_DEFINED diff --git a/libsndfile-1.0.31/m4/clip_mode.m4 b/libsndfile-1.0.31/m4/clip_mode.m4 new file mode 100644 index 0000000..4556b93 --- /dev/null +++ b/libsndfile-1.0.31/m4/clip_mode.m4 @@ -0,0 +1,124 @@ +dnl @synopsis MN_C_CLIP_MODE +dnl +dnl Determine the clipping mode when converting float to int. +dnl @version 1.0 May 17 2003 +dnl @author Erik de Castro Lopo +dnl +dnl Permission to use, copy, modify, distribute, and sell this file for any +dnl purpose is hereby granted without fee, provided that the above copyright +dnl and this permission notice appear in all copies. No representations are +dnl made about the suitability of this software for any purpose. It is +dnl provided "as is" without express or implied warranty. + + + + + + + +dnl Find the clipping mode in the following way: +dnl 1) If we are not cross compiling test it. +dnl 2) IF we are cross compiling, assume that clipping isn't done correctly. + +AC_DEFUN([MN_C_CLIP_MODE], +[AC_CACHE_CHECK(processor clipping capabilities, + ac_cv_c_clip_type, + +# Initialize to unknown +ac_cv_c_clip_positive=unknown +ac_cv_c_clip_negative=unknown + + +if test $ac_cv_c_clip_positive = unknown ; then + AC_TRY_RUN( + [[ + #define _ISOC9X_SOURCE 1 + #define _ISOC99_SOURCE 1 + #define __USE_ISOC99 1 + #define __USE_ISOC9X 1 + #include + int main (void) + { double fval ; + int k, ival ; + + fval = 1.0 * 0x7FFFFFFF ; + for (k = 0 ; k < 100 ; k++) + { ival = (lrint (fval)) >> 24 ; + if (ival != 127) + return 1 ; + + fval *= 1.2499999 ; + } ; + + return 0 ; + } + ]], + ac_cv_c_clip_positive=yes, + ac_cv_c_clip_positive=no, + ac_cv_c_clip_positive=unknown + ) + + AC_TRY_RUN( + [[ + #define _ISOC9X_SOURCE 1 + #define _ISOC99_SOURCE 1 + #define __USE_ISOC99 1 + #define __USE_ISOC9X 1 + #include + int main (void) + { double fval ; + int k, ival ; + + fval = -8.0 * 0x10000000 ; + for (k = 0 ; k < 100 ; k++) + { ival = (lrint (fval)) >> 24 ; + if (ival != -128) + return 1 ; + + fval *= 1.2499999 ; + } ; + + return 0 ; + } + ]], + ac_cv_c_clip_negative=yes, + ac_cv_c_clip_negative=no, + ac_cv_c_clip_negative=unknown + ) + fi + +if test $ac_cv_c_clip_positive = yes ; then + ac_cv_c_clip_positive=1 +else + ac_cv_c_clip_positive=0 + fi + +if test $ac_cv_c_clip_negative = yes ; then + ac_cv_c_clip_negative=1 +else + ac_cv_c_clip_negative=0 + fi + +[[ +case "$ac_cv_c_clip_positive$ac_cv_c_clip_negative" in + "00") + ac_cv_c_clip_type="none" + ;; + "10") + ac_cv_c_clip_type="positive" + ;; + "01") + ac_cv_c_clip_type="negative" + ;; + "11") + ac_cv_c_clip_type="both" + ;; + esac + ]] + +) +] + +)# MN_C_CLIP_MODE + + diff --git a/libsndfile-1.0.31/m4/extra_pkg.m4 b/libsndfile-1.0.31/m4/extra_pkg.m4 new file mode 100644 index 0000000..ce4ecb8 --- /dev/null +++ b/libsndfile-1.0.31/m4/extra_pkg.m4 @@ -0,0 +1,105 @@ +# extra_pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# +# Copyright (c) 2008-2012 Erik de Castro Lopo +# Copyright (c) 2004 Scott James Remnant . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# 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. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# -------------------------------------------------------------- +# PKG_CHECK_MOD_VERSION(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# +# This is a very slight modification to the macro PKG_CHECK_MODULES that +# is in the original pkg.m4 file. It prints the versions in the checking +# message (erikd@mega-nerd.com). + +AC_DEFUN([PKG_CHECK_MOD_VERSION], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $2 ]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +pkg_link_saved_CFLAGS=$CFLAGS +pkg_link_saved_LIBS=$LIBS + +eval "pkg_CFLAGS=\${pkg_cv_[]$1[]_CFLAGS}" +eval "pkg_LIBS=\${pkg_cv_[]$1[]_LIBS}" + +CFLAGS="$CFLAGS $pkg_CFLAGS" +LIBS="$LIBS $pkg_LIBS" + +AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [puts ("")])], pkg_link=yes, pkg_link=no) + +CFLAGS=$pkg_link_saved_CFLAGS +LIBS=$pkg_link_saved_LIBS + +if test $pkg_link = no ; then + $as_echo_n "link failed ... " + pkg_failed=yes + fi + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + ifelse([$4], , [AC_MSG_ERROR(dnl +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT +])], + [AC_MSG_RESULT([no]) + $4]) +elif test $pkg_failed = untried; then + ifelse([$4], , [AC_MSG_FAILURE(dnl +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])], + [$4]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + ifelse([$3], , :, [$3]) +fi[]dnl +])# PKG_CHECK_MOD_VERSION diff --git a/libsndfile-1.0.31/m4/libtool.m4 b/libsndfile-1.0.31/m4/libtool.m4 new file mode 100644 index 0000000..a70aea9 --- /dev/null +++ b/libsndfile-1.0.31/m4/libtool.m4 @@ -0,0 +1,8387 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# 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, see . +]) + +# serial 58 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + +# _LT_CC_BASENAME(CC) +# ------------------- +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. +m4_defun([_LT_CC_BASENAME], +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl +m4_require([_LT_CMD_TRUNCATE])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from 'configure', and 'config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# 'config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain=$ac_aux_dir/ltmain.sh +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the 'libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to 'config.status' so that its +# declaration there will have the same value as in 'configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags='_LT_TAGS'dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into 'config.status', and then the shell code to quote escape them in +# for loops in 'config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# '#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test 0 = "$lt_write_fail" && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +'$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test 0 != $[#] +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try '$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try '$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test yes = "$silent" && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +_LT_COPYING +_LT_LIBTOOL_TAGS + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS=$save_LDFLAGS + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[[012]][[,.]]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*|11.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test yes = "$lt_cv_ld_force_load"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + m4_if([$1], [CXX], +[ if test yes != "$lt_cv_apple_cc_single_mod"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script that will find a shell with a builtin +# printf (that we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case $ECHO in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], + [Search for dependent libraries within DIR (or the compiler's sysroot + if not specified).])], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([$with_sysroot]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and where our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*|powerpc64le-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test yes = "[$]$2"; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS +]) + +if test yes = "[$]$2"; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n "$lt_cv_sys_max_cmd_len"; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes = "$cross_compiling"; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen=shl_load], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen=dlopen], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links=nottested +if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test no = "$hard_links"; then + AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", + [Define to the sub-directory where libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then + + # We can hardcode non-existent directories. + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$versuffix$shared_ext $libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .bundle || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + # Handle Gentoo/FreeBSD as it was Linux + case $host_vendor in + gentoo) + version_type=linux ;; + *) + version_type=freebsd-$objformat ;; + esac + + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + linux) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + need_lib_prefix=no + need_version=no + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program that can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$1"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac]) +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program that can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test no = "$withval" || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + +# _LT_CHECK_MAGIC_METHOD +# ---------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_MAGIC_METHOD], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +AC_CACHE_CHECK([how to recognize dependent libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[[4-9]]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[[45]]*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi]) +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM=-lm) + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([nm_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test yes = "$GCC"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS=$save_LDFLAGS]) + if test yes = "$lt_cv_irix_exported_symbol"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + osf3*) + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting $shlibpath_var if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC=$CC +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report what library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC=$lt_save_CC +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + + _LT_TAGVAR(GCC, $1)=$GXX + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)=$prev$p + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)=$p + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)=$p + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test no = "$F77"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_F77"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$G77 + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test no = "$FC"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_FC"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_FC" + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code=$lt_simple_compile_test_code + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f "$lt_ac_sed" && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test 10 -lt "$lt_ac_count" && break + lt_ac_count=`expr $lt_ac_count + 1` + if test "$lt_ac_count" -gt "$lt_ac_max"; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine what file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/libsndfile-1.0.31/m4/ltoptions.m4 b/libsndfile-1.0.31/m4/ltoptions.m4 new file mode 100644 index 0000000..94b0829 --- /dev/null +++ b/libsndfile-1.0.31/m4/ltoptions.m4 @@ -0,0 +1,437 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 8 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option '$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl 'shared' nor 'disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], + [_LT_WITH_AIX_SONAME([aix])]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the 'shared' and +# 'disable-shared' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the 'static' and +# 'disable-static' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the 'fast-install' +# and 'disable-fast-install' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_AIX_SONAME([DEFAULT]) +# ---------------------------------- +# implement the --with-aix-soname flag, and support the `aix-soname=aix' +# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT +# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +m4_define([_LT_WITH_AIX_SONAME], +[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl +shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[[5-9]]*,yes) + AC_MSG_CHECKING([which variant of shared library versioning to provide]) + AC_ARG_WITH([aix-soname], + [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) + with_aix_soname=$lt_cv_with_aix_soname]) + AC_MSG_RESULT([$with_aix_soname]) + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + +_LT_DECL([], [shared_archive_member_spec], [0], + [Shared archive member basename, for filename based shared library versioning on AIX])dnl +])# _LT_WITH_AIX_SONAME + +LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' +# LT_INIT options. +# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [pic_mode=m4_default([$1], [default])]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/libsndfile-1.0.31/m4/ltsugar.m4 b/libsndfile-1.0.31/m4/ltsugar.m4 new file mode 100644 index 0000000..48bc934 --- /dev/null +++ b/libsndfile-1.0.31/m4/ltsugar.m4 @@ -0,0 +1,124 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59, which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/libsndfile-1.0.31/m4/ltversion.m4 b/libsndfile-1.0.31/m4/ltversion.m4 new file mode 100644 index 0000000..fa04b52 --- /dev/null +++ b/libsndfile-1.0.31/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 4179 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.6]) +m4_define([LT_PACKAGE_REVISION], [2.4.6]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.6' +macro_revision='2.4.6' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/libsndfile-1.0.31/m4/lt~obsolete.m4 b/libsndfile-1.0.31/m4/lt~obsolete.m4 new file mode 100644 index 0000000..c6b26f8 --- /dev/null +++ b/libsndfile-1.0.31/m4/lt~obsolete.m4 @@ -0,0 +1,99 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/libsndfile-1.0.31/m4/mkoctfile_version.m4 b/libsndfile-1.0.31/m4/mkoctfile_version.m4 new file mode 100644 index 0000000..c17333e --- /dev/null +++ b/libsndfile-1.0.31/m4/mkoctfile_version.m4 @@ -0,0 +1,38 @@ +dnl @synopsis OCTAVE_MKOCTFILE_VERSION +dnl +dnl Find the version of mkoctfile. +dnl @version 1.0 Aug 23 2007 +dnl @author Erik de Castro Lopo +dnl +dnl Permission to use, copy, modify, distribute, and sell this file for any +dnl purpose is hereby granted without fee, provided that the above copyright +dnl and this permission notice appear in all copies. No representations are +dnl made about the suitability of this software for any purpose. It is +dnl provided "as is" without express or implied warranty. +dnl + +AC_DEFUN([OCTAVE_MKOCTFILE_VERSION], +[ + + +AC_ARG_WITH(mkoctfile, + AC_HELP_STRING([--with-mkoctfile], [choose the mkoctfile version]), + [ with_mkoctfile=$withval ]) + +test -z "$with_mkoctfile" && with_mkoctfile=mkoctfile + +AC_CHECK_PROG(HAVE_MKOCTFILE,$with_mkoctfile,yes,no) + +if test "x$ac_cv_prog_HAVE_MKOCTFILE" = "xyes" ; then + MKOCTFILE=$with_mkoctfile + + AC_MSG_CHECKING([for version of $MKOCTFILE]) + MKOCTFILE_VERSION=`$with_mkoctfile --version 2>&1 | sed 's/mkoctfile, version //g'` + AC_MSG_RESULT($MKOCTFILE_VERSION) + fi + +AC_SUBST(MKOCTFILE) +AC_SUBST(MKOCTFILE_VERSION) + +])# OCTAVE_MKOCTFILE_VERSION + diff --git a/libsndfile-1.0.31/m4/octave.m4 b/libsndfile-1.0.31/m4/octave.m4 new file mode 100644 index 0000000..88d5a5b --- /dev/null +++ b/libsndfile-1.0.31/m4/octave.m4 @@ -0,0 +1,143 @@ +dnl Evaluate an expression in octave +dnl +dnl OCTAVE_EVAL(expr,var) -> var=expr +dnl +dnl Stolen from octave-forge + +AC_DEFUN([OCTAVE_EVAL], +[ +AC_MSG_CHECKING([for $1 in $OCTAVE]) +$2=`TERM=;$OCTAVE -qfH --eval "disp($1)"` +AC_MSG_RESULT($$2) +AC_SUBST($2) +]) # OCTAVE_EVAL + +dnl @synopsis AC_OCTAVE_VERSION +dnl +dnl Find the version of Octave. +dnl @version 1.0 Aug 23 2007 +dnl @author Erik de Castro Lopo +dnl +dnl Permission to use, copy, modify, distribute, and sell this file for any +dnl purpose is hereby granted without fee, provided that the above copyright +dnl and this permission notice appear in all copies. No representations are +dnl made about the suitability of this software for any purpose. It is +dnl provided "as is" without express or implied warranty. +dnl + +AC_DEFUN([AC_OCTAVE_VERSION], +[ + +AC_ARG_WITH(octave, + AC_HELP_STRING([--with-octave], [choose the octave version]), + [ with_octave=$withval ]) + +test -z "$with_octave" && with_octave=octave + +AC_CHECK_PROG(HAVE_OCTAVE,$with_octave,yes,no) + +if test "x$ac_cv_prog_HAVE_OCTAVE" = "xyes" ; then + OCTAVE=$with_octave + OCTAVE_EVAL(OCTAVE_VERSION,OCTAVE_VERSION) + fi + +AC_SUBST(OCTAVE) +AC_SUBST(OCTAVE_VERSION) + +])# AC_OCTAVE_VERSION + +dnl @synopsis AC_OCTAVE_CONFIG_VERSION +dnl +dnl Find the version of Octave. +dnl @version 1.0 Aug 23 2007 +dnl @author Erik de Castro Lopo +dnl +dnl Permission to use, copy, modify, distribute, and sell this file for any +dnl purpose is hereby granted without fee, provided that the above copyright +dnl and this permission notice appear in all copies. No representations are +dnl made about the suitability of this software for any purpose. It is +dnl provided "as is" without express or implied warranty. +dnl + +AC_DEFUN([AC_OCTAVE_CONFIG_VERSION], +[ + +AC_ARG_WITH(octave-config, + AC_HELP_STRING([--with-octave-config], [choose the octave-config version]), + [ with_octave_config=$withval ]) + +test -z "$with_octave_config" && with_octave_config=octave-config + +AC_CHECK_PROG(HAVE_OCTAVE_CONFIG,$with_octave_config,yes,no) + +if test "x$ac_cv_prog_HAVE_OCTAVE_CONFIG" = "xyes" ; then + OCTAVE_CONFIG=$with_octave_config + AC_MSG_CHECKING([for version of $OCTAVE_CONFIG]) + OCTAVE_CONFIG_VERSION=`$OCTAVE_CONFIG --version` + AC_MSG_RESULT($OCTAVE_CONFIG_VERSION) + fi + +AC_SUBST(OCTAVE_CONFIG) +AC_SUBST(OCTAVE_CONFIG_VERSION) + +])# AC_OCTAVE_CONFIG_VERSION + +dnl @synopsis AC_OCTAVE_BUILD +dnl +dnl Check programs and headers required for building octave plugins. +dnl @version 1.0 Aug 23 2007 +dnl @author Erik de Castro Lopo +dnl +dnl Permission to use, copy, modify, distribute, and sell this file for any +dnl purpose is hereby granted without fee, provided that the above copyright +dnl and this permission notice appear in all copies. No representations are +dnl made about the suitability of this software for any purpose. It is +dnl provided "as is" without express or implied warranty. + + +AC_DEFUN([AC_OCTAVE_BUILD], +[ + +dnl Default to no. +OCTAVE_BUILD=no + +AC_OCTAVE_VERSION +OCTAVE_MKOCTFILE_VERSION +AC_OCTAVE_CONFIG_VERSION + +prog_concat="$ac_cv_prog_HAVE_OCTAVE$ac_cv_prog_HAVE_OCTAVE_CONFIG$ac_cv_prog_HAVE_MKOCTFILE" + +if test "x$prog_concat" = "xyesyesyes" ; then + if test "x$OCTAVE_VERSION" != "x$MKOCTFILE_VERSION" ; then + AC_MSG_WARN([** Mismatch between versions of octave and mkoctfile. **]) + AC_MSG_WARN([** Octave libsndfile modules will not be built. **]) + elif test "x$OCTAVE_VERSION" != "x$OCTAVE_CONFIG_VERSION" ; then + AC_MSG_WARN([** Mismatch between versions of octave and octave-config. **]) + AC_MSG_WARN([** Octave libsndfile modules will not be built. **]) + else + case "$MKOCTFILE_VERSION" in + 2.*) + AC_MSG_WARN([Octave version 2.X is not supported.]) + ;; + 3.*) + OCTAVE_DEST_ODIR=`$OCTAVE_CONFIG --oct-site-dir | sed 's%^/usr%${prefix}%'` + OCTAVE_DEST_MDIR=`$OCTAVE_CONFIG --m-site-dir | sed 's%^/usr%${prefix}%'` + + OCTAVE_BUILD=yes + ;; + *) + AC_MSG_WARN([Octave version $MKOCTFILE_VERSION is not supported.]) + ;; + esac + fi + AC_MSG_RESULT([building octave libsndfile module... $OCTAVE_BUILD]) + fi + +AC_SUBST(OCTAVE_DEST_ODIR) +AC_SUBST(OCTAVE_DEST_MDIR) + +AC_SUBST(MKOCTFILE) + +AM_CONDITIONAL(BUILD_OCTAVE_MOD, test "x$OCTAVE_BUILD" = xyes) + +])# AC_OCTAVE_BUILD diff --git a/libsndfile-1.0.31/m4/stack_protect.m4 b/libsndfile-1.0.31/m4/stack_protect.m4 new file mode 100644 index 0000000..bf27e6e --- /dev/null +++ b/libsndfile-1.0.31/m4/stack_protect.m4 @@ -0,0 +1,73 @@ +dnl Copyright (C) 2013 Xiph.org Foundation +dnl +dnl Redistribution and use in source and binary forms, with or without +dnl modification, are permitted provided that the following conditions +dnl are met: +dnl +dnl - Redistributions of source code must retain the above copyright +dnl notice, this list of conditions and the following disclaimer. +dnl +dnl - Redistributions in binary form must reproduce the above copyright +dnl notice, this list of conditions and the following disclaimer in the +dnl documentation and/or other materials provided with the distribution. +dnl +dnl - Neither the name of the Xiph.org Foundation nor the names of its +dnl contributors may be used to endorse or promote products derived from +dnl this software without specific prior written permission. +dnl +dnl THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +dnl ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +dnl LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +dnl A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR +dnl CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +dnl EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +dnl PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +dnl Want to know of GCC stack protector works, botfor the C and for the C++ +dnl compiler. +dnl +dnl Just checking if the compiler accepts the required CFLAGSs is not enough +dnl because we have seen at least one instance where this check was +dnl in-sufficient. +dnl +dnl Instead, try to compile and link a test program with the stack protector +dnl flags. If that works, we use it. + +AC_DEFUN([XIPH_GCC_STACK_PROTECTOR], +[AC_LANG_ASSERT(C) + AC_MSG_CHECKING([if $CC supports stack smash protection]) + xiph_stack_check_old_cflags="$CFLAGS" + SSP_FLAGS="-fstack-protector --param ssp-buffer-size=4" + CFLAGS=$SSP_FLAGS + AC_TRY_LINK([ + #include + ], + [puts("Hello, World!"); return 0;], + AC_MSG_RESULT([yes]) + CFLAGS="$xiph_stack_check_old_cflags $SSP_FLAGS", + AC_MSG_RESULT([no]) + CFLAGS="$xiph_stack_check_old_cflags" + ) +])# XIPH_GCC_STACK_PROTECTOR + +AC_DEFUN([XIPH_GXX_STACK_PROTECTOR], +[AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([if $CXX supports stack smash protection]) + xiph_stack_check_old_cflags="$CFLAGS" + SSP_FLAGS="-fstack-protector --param ssp-buffer-size=4" + CFLAGS=$SSP_FLAGS + AC_TRY_LINK([ + #include + ], + [puts("Hello, World!"); return 0;], + AC_MSG_RESULT([yes]) + CFLAGS="$xiph_stack_check_old_cflags $SSP_FLAGS", + AC_MSG_RESULT([no]) + CFLAGS="$xiph_stack_check_old_cflags" + ) + AC_LANG_POP([C++]) +])# XIPH_GXX_STACK_PROTECTOR diff --git a/libsndfile-1.0.31/man/sndfile-cmp.1 b/libsndfile-1.0.31/man/sndfile-cmp.1 new file mode 100644 index 0000000..88aaafe --- /dev/null +++ b/libsndfile-1.0.31/man/sndfile-cmp.1 @@ -0,0 +1,29 @@ +.Dd November 2, 2014 +.Dt SNDFILE-CMP 1 +.Os +.Sh NAME +.Nm sndfile-cmp +.Nd compare two audio files +.Sh SYNOPSIS +.Nm sndfile-cmp +.Ar file1 +.Ar file2 +.Sh DESCRIPTION +.Nm +compares the audio data of two sound files. +For two files to compare as being the same, their channel counts, sample rate, +audio data lengths and actual audio data must match. +Other differences such as string metadata like song title, artist etc and their +presence or absence are ignored. +.Sh EXIT STATUS +.Bl -tag -width 1n -compact +.It 0 +The audio data is the same. +.It 1 +The audio data differs. +.El +.Sh SEE ALSO +.Lk http://libsndfile.github.io/libsndfile/ +.Sh AUTHORS +.An Conrad Parker Aq Mt conrad@metadecks.org +.An Erik de Castro Lopo Aq Mt erikd@mega-nerd.com diff --git a/libsndfile-1.0.31/man/sndfile-concat.1 b/libsndfile-1.0.31/man/sndfile-concat.1 new file mode 100644 index 0000000..3ba34c7 --- /dev/null +++ b/libsndfile-1.0.31/man/sndfile-concat.1 @@ -0,0 +1,28 @@ +.Dd November 2, 2014 +.Dt SNDFILE-CONCAT 1 +.Os +.Sh NAME +.Nm sndfile-concat +.Nd concatenate audio data from two or more audio files +.Sh SYNOPSIS +.Nm sndfile-concat +.Ar infile1 +.Ar infile2 +.Ar ... +.Ar outfile +.Sh DESCRIPTION +.Nm +generates a new output file by concatenating the audio data +of two or more input files. The encoding of the output file +is the encoding used in +.Ar infile1 . +Audio data from the subsequent files are converted to this encoding. +The only restriction is that the files must have +the same number of channels. +The output file is overwritten if it already exists. +.Sh EXIT STATUS +.Ex -std +.Sh SEE ALSO +.Lk http://libsndfile.github.io/libsndfile/ +.Sh AUTHORS +.An Erik de Castro Lopo Aq Mt erikd@mega-nerd.com diff --git a/libsndfile-1.0.31/man/sndfile-convert.1 b/libsndfile-1.0.31/man/sndfile-convert.1 new file mode 100644 index 0000000..e7156ee --- /dev/null +++ b/libsndfile-1.0.31/man/sndfile-convert.1 @@ -0,0 +1,160 @@ +.Dd November 2, 2014 +.Dt SNDFILE-CONVERT 1 +.Os +.Sh NAME +.Nm sndfile-convert +.Nd convert sound files from one format to another +.Sh SYNOPSIS +.Nm sndfile-convert +.Op Fl override-sample-rate Ns = Ns Ar rate +.Op Fl endian Ns = Ns Cm little | big | cpu +.Op Fl normalize +.Op Ar encoding +.Ar input +.Ar output +.Sh DESCRIPTION +.Nm +converts sound files from one audio format to another. +The output file is overwritten it it already exists. +.Ss Formats +The format of the output file is determined by the filename extension. +The following file formats are currently recognized: +.Pp +.Bl -tag -compact -width ircam +.It wav +WAV (Microsoft) +.It aif +AIFF (Apple/SGI) +.It au +AU (Sun/NeXT) +.It snd +AU (Sun/NeXT) +.It raw +RAW (header-less) +.It gsm +RAW (header-less) +.It vox +RAW (header-less) +.It paf +PAF (Ensoniq PARIS, big-endian) +.It fap +PAF (Ensoniq PARIS, little-endian) +.It svx +IFF (Amiga IFF/SVX8/SV16) +.It nist +SPHERE (NIST SPeech HEader Resources) +.It sph +SPHERE (NIST SPeech HEader Resources) +.It voc +VOC (Creative Labs) +.It ircam +SF (Berkeley/IRCAM/CARL) +.It sf +SF (Berkeley/IRCAM/CARL) +.It w64 +W64 (SoundFoundry WAVE 64) +.It mat +MAT4 (GNU Octave 2.0 / Matlab 4.2) +.It mat4 +MAT4 (GNU Octave 2.0 / Matlab 4.2) +.It mat5 +MAT5 (GNU Octave 2.1 / Matlab 5.0) +.It pvf +PVF (Portable Voice Format) +.It xi +XI (FastTracker 2) +.It htk +HTK (HMM Tool Kit) +.It sds +SDS (Midi Sample Dump Standard) +.It avr +AVR (Audio Visual Research) +.It wavex +WAVEX (MS WAVE with WAVEFORMATEX) +.It sd2 +SD2 (Sound Designer II) +.It flac +FLAC (FLAC Lossless Audio Codec) +.It caf +CAF (Apple Core Audio File) +.It wve +WVE (Psion Series 3) +.It prc +WVE (Psion Series 3) +.It ogg +OGG (OGG Container format) +.It oga +OGG (OGG Container format) +.It mpc +MPC (Akai MPC 2k) +.It rf64 +RF64 (RIFF 64) +.El +.Ss Options +The following options are recoginzed: +.Pp +.Bl -tag -compact -width "override-sample-rate=XXXXX" +.It Fl override-sample-rate Ns = Ns Ar rate +Make the input use sample rate of +.Ar rate +Hz. +.It Fl endian Ns = Ns Cm little +Make the output file use little endian data. +.It Fl endian Ns = Ns Cm big +Make the output file use big endian data. +.It Fl endian Ns = Ns Cm cpu +Make the output file use CPU endianness. +.It Fl normalize +Normalize the audio data in the output file. +.El +.Ss Encodings +The optional +.Ar encoding +parameter allows setting of the data encoding for the output file. +The following encodings are currently supported: +.Pp +.Bl -tag -compact -width ima-adpcmXX +.It Fl pcms8 +signed 8 bit pcm +.It Fl pcmu8 +unsigned 8 bit pcm +.It Fl pcm16 +16 bit pcm +.It Fl pcm24 +24 bit pcm +.It Fl pcm32 +32 bit pcm +.It Fl float32 +32 bit floating point +.It Fl ulaw +ULAW +.It Fl alaw +ALAW +.It Fl ima-adpcm +IMA ADPCM (WAV only) +.It Fl ms-adpcm +MS ADPCM (WAV only) +.It Fl gsm610 +GSM6.10 (WAV only) +.It Fl dwvw12 +12 bit DWVW (AIFF only) +.It Fl dwvw16 +16 bit DWVW (AIFF only) +.It Fl dwvw24 +24 bit DWVW (AIFF only) +.It Fl vorbis +Vorbis (OGG only) +.El +.Pp +If no encoding is specified for the output file, +.Nm +will try to use the encoding of the input file. +This will not always work as most container formats +(e.g. WAV, AIFF etc) only support a small subset of encodings +(e.g. 16 bit PCM, a-law, Vorbis etc). +.Sh EXIT STATUS +.Ex -std +.Sh SEE ALSO +.Lk http://libsndfile.github.io/libsndfile/ +.Sh AUTHORS +.An Erik de Castro Lopo Aq Mt erikd@mega-nerd.com . diff --git a/libsndfile-1.0.31/man/sndfile-deinterleave.1 b/libsndfile-1.0.31/man/sndfile-deinterleave.1 new file mode 100644 index 0000000..0cf7076 --- /dev/null +++ b/libsndfile-1.0.31/man/sndfile-deinterleave.1 @@ -0,0 +1,62 @@ +.Dd November 2, 2014 +.Dt SNDFILE-INTERLEAVE 1 +.Os +.Sh NAME +.Nm sndfile-interleave , +.Nm sndfile-deinterleave +.Nd convert mono files into a multi-channel file and vice versa +.Sh SYNOPSIS +.Nm sndfile-interleave +.Ar input1 +.Ar input2 +.Ar ... +.Fl o Ar output +.Nm sndfile-deinterleave +.Ar file +.Sh DESCRIPTION +.Nm sndfile-interleave +creates a multi-channel file taking audio data +from two or more mono files as individual channels. +The format of the output file is determined by its filename suffix. +The audio parameters of the output file will be made so that +the format can accommodate each of the mono inputs; +for example, the samplerate will be the maximal samplerate +occurring in the inputs. +The output file will be overwritten if it already exists. +.Pp +.Nm sndfile-deinterleave +creates two or more mono files from a multi-channel audio file, +containing data from the individual channels. The names of the +resulting mono files are of the form +.Dq name_XY.suf +where +.Em name +and +.Em suf +are the basename and suffix of the original file. +If any file of such name already exists, it will be overwritten. +Apart from the number of channels, +the audio format of the resulting mono files +is the same as that of the original file. +.Sh EXIT STATUS +.Ex -std +.Sh EXAMPLES +Merge a mono OGG file and a mono FLAC file into a stereo WAV file: +.Bd -literal -offset indent +$ sndfile-interleave left.ogg right.flac -o stereo.wav +.Ed +.Pp +Split a multi-channel into individual mono files: +.Bd -literal -offset indent +$ sndfile-deinterleave multi.wav +Input file : multi +Output files : + multi_00.wav + multi_01.wav + multi_02.wav + multi_03.wav +.Ed +.Sh SEE ALSO +.Lk http://libsndfile.github.io/libsndfile/ +.Sh AUTHORS +.An Erik de Castro Lopo Aq Mt erikd@mega-nerd.com diff --git a/libsndfile-1.0.31/man/sndfile-info.1 b/libsndfile-1.0.31/man/sndfile-info.1 new file mode 100644 index 0000000..a8c3749 --- /dev/null +++ b/libsndfile-1.0.31/man/sndfile-info.1 @@ -0,0 +1,34 @@ +.Dd November 2, 2014 +.Dt SNDFILE-INFO 1 +.Os +.Sh NAME +.Nm sndfile-info +.Nd display information about sound files +.Sh SYNOPSIS +.Nm sndfile-info +.Op Fl -broadcast +.Op Fl -cart +.Op Fl -channel-map +.Op Fl -instrument +.Ar +.Sh DESCRIPTION +.Nm +displays basic information about sound files +such as format, number of channels, samplerate, and length. +The following options are recognized: +.Pp +.Bl -tag -compact -width channelmapXXXX +.It Fl -broadcast +Display broadcast (BWF) info. +.It Fl -cart +Display the cart chunk of a WAV (or related) file. +.It Fl -channel-map +Display channel map. +.It Fl -instrument +Display instrument info: +a base note, gain, velocity, key, and loop points. +.El +.Sh SEE ALSO +.Lk http://libsndfile.github.io/libsndfile/ +.Sh AUTHORS +.An Erik de Castro Lopo Aq Mt erikd@mega-nerd.com . diff --git a/libsndfile-1.0.31/man/sndfile-interleave.1 b/libsndfile-1.0.31/man/sndfile-interleave.1 new file mode 100644 index 0000000..0cf7076 --- /dev/null +++ b/libsndfile-1.0.31/man/sndfile-interleave.1 @@ -0,0 +1,62 @@ +.Dd November 2, 2014 +.Dt SNDFILE-INTERLEAVE 1 +.Os +.Sh NAME +.Nm sndfile-interleave , +.Nm sndfile-deinterleave +.Nd convert mono files into a multi-channel file and vice versa +.Sh SYNOPSIS +.Nm sndfile-interleave +.Ar input1 +.Ar input2 +.Ar ... +.Fl o Ar output +.Nm sndfile-deinterleave +.Ar file +.Sh DESCRIPTION +.Nm sndfile-interleave +creates a multi-channel file taking audio data +from two or more mono files as individual channels. +The format of the output file is determined by its filename suffix. +The audio parameters of the output file will be made so that +the format can accommodate each of the mono inputs; +for example, the samplerate will be the maximal samplerate +occurring in the inputs. +The output file will be overwritten if it already exists. +.Pp +.Nm sndfile-deinterleave +creates two or more mono files from a multi-channel audio file, +containing data from the individual channels. The names of the +resulting mono files are of the form +.Dq name_XY.suf +where +.Em name +and +.Em suf +are the basename and suffix of the original file. +If any file of such name already exists, it will be overwritten. +Apart from the number of channels, +the audio format of the resulting mono files +is the same as that of the original file. +.Sh EXIT STATUS +.Ex -std +.Sh EXAMPLES +Merge a mono OGG file and a mono FLAC file into a stereo WAV file: +.Bd -literal -offset indent +$ sndfile-interleave left.ogg right.flac -o stereo.wav +.Ed +.Pp +Split a multi-channel into individual mono files: +.Bd -literal -offset indent +$ sndfile-deinterleave multi.wav +Input file : multi +Output files : + multi_00.wav + multi_01.wav + multi_02.wav + multi_03.wav +.Ed +.Sh SEE ALSO +.Lk http://libsndfile.github.io/libsndfile/ +.Sh AUTHORS +.An Erik de Castro Lopo Aq Mt erikd@mega-nerd.com diff --git a/libsndfile-1.0.31/man/sndfile-metadata-get.1 b/libsndfile-1.0.31/man/sndfile-metadata-get.1 new file mode 100644 index 0000000..61dfae7 --- /dev/null +++ b/libsndfile-1.0.31/man/sndfile-metadata-get.1 @@ -0,0 +1,116 @@ +.Dd November 2, 2014 +.Dt SNDFILE-METADATA-GET 1 +.Os +.Sh NAME +.Nm sndfile-metadata-get , +.Nm sndfile-metadata-set +.Nd get or set metadata in a sound file +.Sh SYNOPSIS +.Nm sndfile-metadata-get +.Op Ar options +.Ar file +.Nm sndfile-metadata-set +.Op Ar options +.Ar file +.Nm sndfile-metadata-set +.Op Ar options +.Ar input +.Ar output +.Sh DESCRIPTION +.Nm sndfile-metadata-get +displays bext and string metadata stored in an audio file. +The following options specify what to print. +.Pp +.Bl -tag -width bext-descriptionXXXX -compact +.It Fl -all +all metadata +.It Fl -bext-description +description +.It Fl -bext-originator +originator info +.It Fl -bext-orig-ref +originator reference +.It Fl -bext-umid +Unique Material Identifier +.It Fl -bext-orig-date +origination date +.It Fl -bext-orig-time +origination time +.It Fl -bext-coding-hist +coding history +.It Fl -str-title +title +.It Fl -str-copyright +copyright +.It Fl -str-artist +artist +.It Fl -str-comment +comment +.It Fl -str-date +creation date +.It Fl -str-album +album +.It Fl -str-license +license +.El +.Pp +.Nm sndfile-metadata-set +sets bext and string metadata in an audio file if the format supports it. +If the file does not contain a BEXT chunk to be modified, +the second synopsis must be used, where another output file +capable of storing the metadata is created. +This file is overwritten if it already exists. +The following options take an argument specifying the metadata: +.Pp +.Bl -tag -width bext-coding-histXXXXXXX -compact +.It Fl -bext-description +description +.It Fl -bext-originator +originator +.It Fl -bext-orig-ref +originator reference +.It Fl -bext-umid +Unique Material Identifier +.It Fl -bext-orig-date +origination date +.It Fl -bext-orig-time +origination time +.It Fl -bext-coding-hist +coding history +.It Fl -bext-time-raf +time reference +.It Fl -str-comment +comment +.It Fl -str-title +title +.It Fl -str-copyright +copyright +.It Fl -str-artist +artist +.It Fl -str-date +date +.It Fl -str-album +album +.It Fl -str-license +license +.El +.Pp +The following options take no argument: +.Pp +.Bl -tag -width bext-coding-histXXXXXXX -compact +.It Fl -bext-auto-time-date +Set the BEXT time and date to current. +.It Fl -bext-auto-time +Set the BEXT time to current. +.It Fl -bext-auto-date +Set the BEXT date to current. +.It Fl -str-auto-date +Set the string date to current. +.El +.Sh EXIT STATUS +.Ex -std +.Sh SEE ALSO +.Lk http://libsndfile.github.io/libsndfile/ +.Lk http://tech.ebu.ch/docs/tech/tech3285.pdf +.Sh AUTHORS +.An Erik de Castro Lopo Aq Mt erikd@mega-nerd.com diff --git a/libsndfile-1.0.31/man/sndfile-metadata-set.1 b/libsndfile-1.0.31/man/sndfile-metadata-set.1 new file mode 100644 index 0000000..61dfae7 --- /dev/null +++ b/libsndfile-1.0.31/man/sndfile-metadata-set.1 @@ -0,0 +1,116 @@ +.Dd November 2, 2014 +.Dt SNDFILE-METADATA-GET 1 +.Os +.Sh NAME +.Nm sndfile-metadata-get , +.Nm sndfile-metadata-set +.Nd get or set metadata in a sound file +.Sh SYNOPSIS +.Nm sndfile-metadata-get +.Op Ar options +.Ar file +.Nm sndfile-metadata-set +.Op Ar options +.Ar file +.Nm sndfile-metadata-set +.Op Ar options +.Ar input +.Ar output +.Sh DESCRIPTION +.Nm sndfile-metadata-get +displays bext and string metadata stored in an audio file. +The following options specify what to print. +.Pp +.Bl -tag -width bext-descriptionXXXX -compact +.It Fl -all +all metadata +.It Fl -bext-description +description +.It Fl -bext-originator +originator info +.It Fl -bext-orig-ref +originator reference +.It Fl -bext-umid +Unique Material Identifier +.It Fl -bext-orig-date +origination date +.It Fl -bext-orig-time +origination time +.It Fl -bext-coding-hist +coding history +.It Fl -str-title +title +.It Fl -str-copyright +copyright +.It Fl -str-artist +artist +.It Fl -str-comment +comment +.It Fl -str-date +creation date +.It Fl -str-album +album +.It Fl -str-license +license +.El +.Pp +.Nm sndfile-metadata-set +sets bext and string metadata in an audio file if the format supports it. +If the file does not contain a BEXT chunk to be modified, +the second synopsis must be used, where another output file +capable of storing the metadata is created. +This file is overwritten if it already exists. +The following options take an argument specifying the metadata: +.Pp +.Bl -tag -width bext-coding-histXXXXXXX -compact +.It Fl -bext-description +description +.It Fl -bext-originator +originator +.It Fl -bext-orig-ref +originator reference +.It Fl -bext-umid +Unique Material Identifier +.It Fl -bext-orig-date +origination date +.It Fl -bext-orig-time +origination time +.It Fl -bext-coding-hist +coding history +.It Fl -bext-time-raf +time reference +.It Fl -str-comment +comment +.It Fl -str-title +title +.It Fl -str-copyright +copyright +.It Fl -str-artist +artist +.It Fl -str-date +date +.It Fl -str-album +album +.It Fl -str-license +license +.El +.Pp +The following options take no argument: +.Pp +.Bl -tag -width bext-coding-histXXXXXXX -compact +.It Fl -bext-auto-time-date +Set the BEXT time and date to current. +.It Fl -bext-auto-time +Set the BEXT time to current. +.It Fl -bext-auto-date +Set the BEXT date to current. +.It Fl -str-auto-date +Set the string date to current. +.El +.Sh EXIT STATUS +.Ex -std +.Sh SEE ALSO +.Lk http://libsndfile.github.io/libsndfile/ +.Lk http://tech.ebu.ch/docs/tech/tech3285.pdf +.Sh AUTHORS +.An Erik de Castro Lopo Aq Mt erikd@mega-nerd.com diff --git a/libsndfile-1.0.31/man/sndfile-play.1 b/libsndfile-1.0.31/man/sndfile-play.1 new file mode 100644 index 0000000..f36d131 --- /dev/null +++ b/libsndfile-1.0.31/man/sndfile-play.1 @@ -0,0 +1,34 @@ +.Dd November 2, 2014 +.Dt SNDFILE-PLAY 1 +.Os +.Sh NAME +.Nm sndfile-play +.Nd play a sound file +.Sh SYNOPSIS +.Nm sndfile-play +.Ar +.Sh DESCRIPTION +.Nm +plays one or more sound files on various operating systems using standard audio +output APIs. The following table summarizes which audio API is used where: +.Pp +.Bl -tag -width MacOSX10XXX -compact +.It Linux +ALSA or OSS +.It OpenBSD +sndio +.It FreeBSD +/dev/dsp (OSS) +.It Solaris +/dev/audio +.It MacOSX 10.6 +CoreAudio +.It MacOSX 10.7 +AudioToolbox +.It Win32 +waveOut +.El +.Sh SEE ALSO +.Lk http://libsndfile.github.io/libsndfile/ +.Sh AUTHORS +.An Erik de Castro Lopo Aq Mt erikd@mega-nerd.com diff --git a/libsndfile-1.0.31/man/sndfile-salvage.1 b/libsndfile-1.0.31/man/sndfile-salvage.1 new file mode 100644 index 0000000..b2010f1 --- /dev/null +++ b/libsndfile-1.0.31/man/sndfile-salvage.1 @@ -0,0 +1,25 @@ +.Dd November 2, 2014 +.Dt SNDFILE-SALVAGE 1 +.Os +.Sh NAME +.Nm sndfile-salvage +.Nd salvage audio data from WAV files longer than 4G +.Sh SYNOPSIS +.Nm sndfile-salvage +.Ar toolong.wav +.Ar fixed64.wav +.Sh DESCRIPTION +Audio files using the WAV file container are inherently limited to 4G of data +size fields in the WAV header being stored as unsigned 32bit integers. +Many applications have trouble with these WAV files +that are more the 4G in size. +.Nm +rewrites the WAV file into a W64 file with the same audio content. +This file is overwritten if it already exists. +.Sh EXIT STATUS +.Ex -std +.Sh SEE ALSO +.Lk http://libsndfile.github.io/libsndfile/ +.\".Lk http://en.wikipedia.org/wiki/RF64 +.Sh AUTHORS +.An Erik de Castro Lopo Aq Mt erikd@mega-nerd.com diff --git a/libsndfile-1.0.31/ossfuzz/sndfile_fuzzer.cc b/libsndfile-1.0.31/ossfuzz/sndfile_fuzzer.cc new file mode 100644 index 0000000..3c85073 --- /dev/null +++ b/libsndfile-1.0.31/ossfuzz/sndfile_fuzzer.cc @@ -0,0 +1,155 @@ +#include +#include +#include +#include +#include +#include + +typedef struct +{ + sf_count_t offset; + sf_count_t length; + const unsigned char *data; +} VIO_DATA; + +static sf_count_t vfget_filelen (void *user_data) +{ + VIO_DATA *vf = (VIO_DATA *)user_data; + return vf->length; +} + +static sf_count_t vfseek (sf_count_t offset, int whence, void *user_data) +{ + VIO_DATA *vf = (VIO_DATA *)user_data; + sf_count_t new_offset; + + switch (whence) + { + case SEEK_SET: + new_offset = offset; + break ; + + case SEEK_CUR: + new_offset = vf->offset + offset; + break ; + + case SEEK_END: + new_offset = vf->length + offset; + break; + + default: + break; + } + + /* Ensure you can't seek outside the data */ + if (new_offset > vf->length) + { + /* Trying to seek past the end of the data */ + printf("vf overseek: new_offset(%" PRId64 ") > vf->length(%" PRId64 ");" + " whence(%d), vf->offset(%" PRId64 "), offset(%" PRId64 ")\n", + new_offset, vf->length, whence, vf->offset, offset); + new_offset = vf->length; + } + else if (new_offset < 0) + { + /* Trying to seek before the start of the data */ + printf("vf underseek: new_offset(%" PRId64 ") < 0; whence(%d), vf->offset" + "(%" PRId64 "), vf->length(%" PRId64 "), offset(%" PRId64 ")\n", + new_offset, whence, vf->offset, vf->length, offset); + new_offset = 0; + } + vf->offset = new_offset; + + return vf->offset; +} + +static sf_count_t vfread (void *ptr, sf_count_t count, void *user_data) +{ + VIO_DATA *vf = (VIO_DATA *)user_data; + + if (vf->offset + count > vf->length) + { + count = vf->length - vf->offset; + } + + memcpy(ptr, vf->data + vf->offset, count); + vf->offset += count; + + return count; +} + +static sf_count_t vfwrite (const void *ptr, sf_count_t count, void *user_data) +{ + (void)ptr; + (void)count; + (void)user_data; + + // Cannot write to this virtual file. + return 0; +} + +static sf_count_t vftell (void *user_data) +{ VIO_DATA *vf = (VIO_DATA *)user_data; + + return vf->offset; +} + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) +{ + VIO_DATA vio_data; + SF_VIRTUAL_IO vio; + SF_INFO sndfile_info; + SNDFILE *sndfile = NULL; + float* read_buffer = NULL; + + // Initialize the virtual IO structure. + vio.get_filelen = vfget_filelen; + vio.seek = vfseek; + vio.read = vfread; + vio.write = vfwrite; + vio.tell = vftell; + + // Initialize the VIO user data. + vio_data.data = data; + vio_data.length = size; + vio_data.offset = 0; + + memset(&sndfile_info, 0, sizeof(SF_INFO)); + + // Try and open the virtual file. + sndfile = sf_open_virtual(&vio, SFM_READ, &sndfile_info, &vio_data); + + if (sndfile_info.channels == 0) + { + // No sound channels in file. + goto EXIT_LABEL; + } + else if (sndfile_info.channels > 1024 * 1024) + { + // Too many channels to handle. + goto EXIT_LABEL; + } + + // Just the right number of channels. Create some buffer space for reading. + read_buffer = (float*)malloc(sizeof(float) * sndfile_info.channels); + if (read_buffer == NULL) + { + abort(); + } + + while (sf_readf_float(sndfile, read_buffer, 1)) + { + // Do nothing with the data. + } + +EXIT_LABEL: + + if (sndfile != NULL) + { + sf_close(sndfile); + } + + free(read_buffer); + + return 0; +} diff --git a/libsndfile-1.0.31/ossfuzz/standaloneengine.cc b/libsndfile-1.0.31/ossfuzz/standaloneengine.cc new file mode 100644 index 0000000..ab6408d --- /dev/null +++ b/libsndfile-1.0.31/ossfuzz/standaloneengine.cc @@ -0,0 +1,86 @@ +#include +#include +#include + +#include "testinput.h" + +/** + * Main procedure for standalone fuzzing engine. + * + * Reads filenames from the argument array. For each filename, read the file + * into memory and then call the fuzzing interface with the data. + */ +int main(int argc, char **argv) +{ + int ii; + for(ii = 1; ii < argc; ii++) + { + FILE *infile; + printf("[%s] ", argv[ii]); + + /* Try and open the file. */ + infile = fopen(argv[ii], "rb"); + if(infile) + { + uint8_t *buffer = NULL; + size_t buffer_len; + + printf("Opened.. "); + + /* Get the length of the file. */ + fseek(infile, 0L, SEEK_END); + buffer_len = ftell(infile); + + /* Reset the file indicator to the beginning of the file. */ + fseek(infile, 0L, SEEK_SET); + + /* Allocate a buffer for the file contents. */ + buffer = (uint8_t *)calloc(buffer_len, sizeof(uint8_t)); + if(buffer) + { + size_t result; + + /* Read all the text from the file into the buffer. */ + result = fread(buffer, sizeof(uint8_t), buffer_len, infile); + + if (result == buffer_len) + { + printf("Read %zu bytes, fuzzing.. ", buffer_len); + /* Call the fuzzer with the data. */ + LLVMFuzzerTestOneInput(buffer, buffer_len); + + printf("complete !!"); + } + else + { + fprintf(stderr, + "Failed to read %zu bytes (result %zu)\n", + buffer_len, + result); + } + + /* Free the buffer as it's no longer needed. */ + free(buffer); + buffer = NULL; + } + else + { + fprintf(stderr, + "[%s] Failed to allocate %zu bytes \n", + argv[ii], + buffer_len); + } + + /* Close the file as it's no longer needed. */ + fclose(infile); + infile = NULL; + } + else + { + /* Failed to open the file. Maybe wrong name or wrong permissions? */ + fprintf(stderr, "[%s] Open failed. \n", argv[ii]); + } + + printf("\n"); + } +} diff --git a/libsndfile-1.0.31/ossfuzz/testinput.h b/libsndfile-1.0.31/ossfuzz/testinput.h new file mode 100644 index 0000000..6ab9b51 --- /dev/null +++ b/libsndfile-1.0.31/ossfuzz/testinput.h @@ -0,0 +1,3 @@ +#include + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size); diff --git a/libsndfile-1.0.31/programs/common.c b/libsndfile-1.0.31/programs/common.c new file mode 100644 index 0000000..fb479f0 --- /dev/null +++ b/libsndfile-1.0.31/programs/common.c @@ -0,0 +1,497 @@ +/* +** Copyright (C) 1999-2019 Erik de Castro Lopo +** Copyright (C) 2008 George Blood Audio +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the author nor the names of any contributors may be used +** to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include +#include +#include + +#include + +#include "common.h" + +#define BUFFER_LEN 4096 + +#define MIN(x, y) ((x) < (y) ? (x) : (y)) + +int +sfe_copy_data_fp (SNDFILE *outfile, SNDFILE *infile, int channels, int normalize) +{ static double data [BUFFER_LEN], max ; + sf_count_t frames, readcount, k ; + + frames = BUFFER_LEN / channels ; + readcount = frames ; + + sf_command (infile, SFC_CALC_SIGNAL_MAX, &max, sizeof (max)) ; + if (!isnormal (max)) /* neither zero, subnormal, infinite, nor NaN */ + return 1 ; + + if (!normalize && max < 1.0) + { while (readcount > 0) + { readcount = sf_readf_double (infile, data, frames) ; + sf_writef_double (outfile, data, readcount) ; + } ; + } + else + { sf_command (infile, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + + while (readcount > 0) + { readcount = sf_readf_double (infile, data, frames) ; + for (k = 0 ; k < readcount * channels ; k++) + { data [k] /= max ; + + if (!isfinite (data [k])) /* infinite or NaN */ + return 1; + } + sf_writef_double (outfile, data, readcount) ; + } ; + } ; + + return 0 ; +} /* sfe_copy_data_fp */ + +void +sfe_copy_data_int (SNDFILE *outfile, SNDFILE *infile, int channels) +{ static int data [BUFFER_LEN] ; + int frames, readcount ; + + frames = BUFFER_LEN / channels ; + readcount = frames ; + + while (readcount > 0) + { readcount = sf_readf_int (infile, data, frames) ; + sf_writef_int (outfile, data, readcount) ; + } ; + + return ; +} /* sfe_copy_data_int */ + +/*============================================================================== +*/ + +static int +merge_broadcast_info (SNDFILE * infile, SNDFILE * outfile, int format, const METADATA_INFO * info) +{ SF_BROADCAST_INFO_2K binfo ; + int infileminor ; + + memset (&binfo, 0, sizeof (binfo)) ; + + if ((SF_FORMAT_TYPEMASK & format) != SF_FORMAT_WAV) + { printf ("Error : This is not a WAV file and hence broadcast info cannot be added to it.\n\n") ; + return 1 ; + } ; + + infileminor = SF_FORMAT_SUBMASK & format ; + + switch (infileminor) + { case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_32 : + break ; + + default : + printf ( + "Warning : The EBU Technical Recommendation R68-2000 states that the only\n" + " allowed encodings are Linear PCM and MPEG3. This file is not in\n" + " the right format.\n\n" + ) ; + break ; + } ; + + if (sf_command (infile, SFC_GET_BROADCAST_INFO, &binfo, sizeof (binfo)) == 0) + { if (infile == outfile) + { printf ( + "Error : Attempting in-place broadcast info update, but file does not\n" + " have a 'bext' chunk to modify. The solution is to specify both\n" + " input and output files on the command line.\n\n" + ) ; + return 1 ; + } ; + } ; + +#define REPLACE_IF_NEW(x) \ + if (info->x != NULL) \ + { memset (binfo.x, 0, sizeof (binfo.x)) ; \ + memcpy (binfo.x, info->x, MIN (strlen (info->x), sizeof (binfo.x))) ; \ + } ; + + REPLACE_IF_NEW (description) ; + REPLACE_IF_NEW (originator) ; + REPLACE_IF_NEW (originator_reference) ; + REPLACE_IF_NEW (origination_date) ; + REPLACE_IF_NEW (origination_time) ; + REPLACE_IF_NEW (umid) ; + + /* Special case loudness values */ +#define REPLACE_IF_NEW_INT(x) \ + if (info->x != NULL) \ + { binfo.x = round (atof (info->x) * 100.0) ; \ + } ; + + REPLACE_IF_NEW_INT (loudness_value) ; + REPLACE_IF_NEW_INT (loudness_range) ; + REPLACE_IF_NEW_INT (max_true_peak_level) ; + REPLACE_IF_NEW_INT (max_momentary_loudness) ; + REPLACE_IF_NEW_INT (max_shortterm_loudness) ; + + /* Special case for Time Ref. */ + if (info->time_ref != NULL) + { uint64_t ts = atoll (info->time_ref) ; + + binfo.time_reference_high = (ts >> 32) ; + binfo.time_reference_low = (ts & 0xffffffff) ; + } ; + + /* Special case for coding_history because we may want to append. */ + if (info->coding_history != NULL) + { if (info->coding_hist_append) + { int slen = strlen (binfo.coding_history) ; + + while (slen > 1 && isspace (binfo.coding_history [slen - 1])) + slen -- ; + + memcpy (binfo.coding_history + slen, info->coding_history, sizeof (binfo.coding_history) - slen) ; + } + else + { size_t slen = MIN (strlen (info->coding_history), sizeof (binfo.coding_history)) ; + + memset (binfo.coding_history, 0, sizeof (binfo.coding_history)) ; + memcpy (binfo.coding_history, info->coding_history, slen) ; + binfo.coding_history_size = slen ; + } ; + } ; + + if (sf_command (outfile, SFC_SET_BROADCAST_INFO, &binfo, sizeof (binfo)) == 0) + { printf ("Error : Setting of broadcast info chunks failed.\n\n") ; + return 1 ; + } ; + + return 0 ; +} /* merge_broadcast_info*/ + +static void +update_strings (SNDFILE * outfile, const METADATA_INFO * info) +{ + if (info->title != NULL) + sf_set_string (outfile, SF_STR_TITLE, info->title) ; + + if (info->copyright != NULL) + sf_set_string (outfile, SF_STR_COPYRIGHT, info->copyright) ; + + if (info->artist != NULL) + sf_set_string (outfile, SF_STR_ARTIST, info->artist) ; + + if (info->comment != NULL) + sf_set_string (outfile, SF_STR_COMMENT, info->comment) ; + + if (info->date != NULL) + sf_set_string (outfile, SF_STR_DATE, info->date) ; + + if (info->album != NULL) + sf_set_string (outfile, SF_STR_ALBUM, info->album) ; + + if (info->license != NULL) + sf_set_string (outfile, SF_STR_LICENSE, info->license) ; + +} /* update_strings */ + + + +void +sfe_apply_metadata_changes (const char * filenames [2], const METADATA_INFO * info) +{ SNDFILE *infile = NULL, *outfile = NULL ; + SF_INFO sfinfo ; + METADATA_INFO tmpinfo ; + int error_code = 0 ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + memset (&tmpinfo, 0, sizeof (tmpinfo)) ; + + if (filenames [1] == NULL) + infile = outfile = sf_open (filenames [0], SFM_RDWR, &sfinfo) ; + else + { infile = sf_open (filenames [0], SFM_READ, &sfinfo) ; + + /* Output must be WAV. */ + sfinfo.format = SF_FORMAT_WAV | (SF_FORMAT_SUBMASK & sfinfo.format) ; + outfile = sf_open (filenames [1], SFM_WRITE, &sfinfo) ; + } ; + + if (infile == NULL) + { printf ("Error : Not able to open input file '%s' : %s\n", filenames [0], sf_strerror (infile)) ; + error_code = 1 ; + goto cleanup_exit ; + } ; + + if (outfile == NULL) + { printf ("Error : Not able to open output file '%s' : %s\n", filenames [1], sf_strerror (outfile)) ; + error_code = 1 ; + goto cleanup_exit ; + } ; + + if (info->has_bext_fields && merge_broadcast_info (infile, outfile, sfinfo.format, info)) + { error_code = 1 ; + goto cleanup_exit ; + } ; + + if (infile != outfile) + { int infileminor = SF_FORMAT_SUBMASK & sfinfo.format ; + + /* If the input file is not the same as the output file, copy the data. */ + if ((infileminor == SF_FORMAT_DOUBLE) || (infileminor == SF_FORMAT_FLOAT)) + { if (sfe_copy_data_fp (outfile, infile, sfinfo.channels, SF_FALSE) != 0) + { printf ("Error : Not able to decode input file '%s'\n", filenames [0]) ; + error_code = 1 ; + goto cleanup_exit ; + } ; + } + else + sfe_copy_data_int (outfile, infile, sfinfo.channels) ; + } ; + + update_strings (outfile, info) ; + +cleanup_exit : + + if (outfile != NULL && outfile != infile) + sf_close (outfile) ; + + if (infile != NULL) + sf_close (infile) ; + + if (error_code) + exit (error_code) ; + + return ; +} /* sfe_apply_metadata_changes */ + +/*============================================================================== +*/ + +typedef struct +{ const char *ext ; + int len ; + int format ; +} OUTPUT_FORMAT_MAP ; + +/* Map a file name extension to a container format. */ +static OUTPUT_FORMAT_MAP format_map [] = +{ + { "wav", 0, SF_FORMAT_WAV }, + { "aif", 3, SF_FORMAT_AIFF }, + { "au", 0, SF_FORMAT_AU }, + { "snd", 0, SF_FORMAT_AU }, + { "raw", 0, SF_FORMAT_RAW }, + { "gsm", 0, SF_FORMAT_RAW | SF_FORMAT_GSM610 }, + { "vox", 0, SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM }, + { "paf", 0, SF_FORMAT_PAF | SF_ENDIAN_BIG }, + { "fap", 0, SF_FORMAT_PAF | SF_ENDIAN_LITTLE }, + { "svx", 0, SF_FORMAT_SVX }, + { "nist", 0, SF_FORMAT_NIST }, + { "sph", 0, SF_FORMAT_NIST }, + { "voc", 0, SF_FORMAT_VOC }, + { "ircam", 0, SF_FORMAT_IRCAM }, + { "sf", 0, SF_FORMAT_IRCAM }, + { "w64", 0, SF_FORMAT_W64 }, + { "mat", 0, SF_FORMAT_MAT4 }, + { "mat4", 0, SF_FORMAT_MAT4 }, + { "mat5", 0, SF_FORMAT_MAT5 }, + { "pvf", 0, SF_FORMAT_PVF }, + { "xi", 0, SF_FORMAT_XI }, + { "htk", 0, SF_FORMAT_HTK }, + { "sds", 0, SF_FORMAT_SDS }, + { "avr", 0, SF_FORMAT_AVR }, + { "wavex", 0, SF_FORMAT_WAVEX }, + { "sd2", 0, SF_FORMAT_SD2 }, + { "flac", 0, SF_FORMAT_FLAC }, + { "caf", 0, SF_FORMAT_CAF }, + { "wve", 0, SF_FORMAT_WVE }, + { "prc", 0, SF_FORMAT_WVE }, + { "ogg", 0, SF_FORMAT_OGG }, + { "oga", 0, SF_FORMAT_OGG }, + { "opus", 0, SF_FORMAT_OGG | SF_FORMAT_OPUS }, + { "mpc", 0, SF_FORMAT_MPC2K }, + { "rf64", 0, SF_FORMAT_RF64 }, +} ; /* format_map */ + +int +sfe_file_type_of_ext (const char *str, int format) +{ char buffer [16], *cptr ; + int k ; + + format &= SF_FORMAT_SUBMASK ; + + if ((cptr = strrchr (str, '.')) == NULL) + return 0 ; + + strncpy (buffer, cptr + 1, 15) ; + buffer [15] = 0 ; + + for (k = 0 ; buffer [k] ; k++) + buffer [k] = tolower ((buffer [k])) ; + + for (k = 0 ; k < (int) (sizeof (format_map) / sizeof (format_map [0])) ; k++) + { if ((format_map [k].len > 0 && strncmp (buffer, format_map [k].ext, format_map [k].len) == 0) || + (strcmp (buffer, format_map [k].ext) == 0)) + { if (format_map [k].format & SF_FORMAT_SUBMASK) + return format_map [k].format ; + else + return format_map [k].format | format ; + } ; + } ; + + /* Default if all the above fails. */ + return (SF_FORMAT_WAV | SF_FORMAT_PCM_24) ; +} /* sfe_file_type_of_ext */ + +void +sfe_dump_format_map (void) +{ SF_FORMAT_INFO info ; + int k ; + + for (k = 0 ; k < ARRAY_LEN (format_map) ; k++) + { info.format = format_map [k].format ; + sf_command (NULL, SFC_GET_FORMAT_INFO, &info, sizeof (info)) ; + printf (" %-10s : %s", format_map [k].ext, info.name == NULL ? "????" : info.name) ; + if (format_map [k].format & SF_FORMAT_SUBMASK) + { info.format = format_map [k].format & SF_FORMAT_SUBMASK ; + sf_command (NULL, SFC_GET_FORMAT_INFO, &info, sizeof (info)) ; + printf (" %s", info.name == NULL ? "????" : info.name) ; + } ; + putchar ('\n') ; + + } ; + +} /* sfe_dump_format_map */ + +const char * +program_name (const char * argv0) +{ const char * tmp ; + + tmp = strrchr (argv0, '/') ; + argv0 = tmp ? tmp + 1 : argv0 ; + + /* Remove leading libtool name mangling. */ + if (strstr (argv0, "lt-") == argv0) + return argv0 + 3 ; + + return argv0 ; +} /* program_name */ + +const char * +sfe_endian_name (int format) +{ + switch (format & SF_FORMAT_ENDMASK) + { case SF_ENDIAN_FILE : return "file" ; + case SF_ENDIAN_LITTLE : return "little" ; + case SF_ENDIAN_BIG : return "big" ; + case SF_ENDIAN_CPU : return "cpu" ; + default : break ; + } ; + + return "unknown" ; +} /* sfe_endian_name */ + +const char * +sfe_container_name (int format) +{ + switch (format & SF_FORMAT_TYPEMASK) + { case SF_FORMAT_WAV : return "WAV" ; + case SF_FORMAT_AIFF : return "AIFF" ; + case SF_FORMAT_AU : return "AU" ; + case SF_FORMAT_RAW : return "RAW" ; + case SF_FORMAT_PAF : return "PAF" ; + case SF_FORMAT_SVX : return "SVX" ; + case SF_FORMAT_NIST : return "NIST" ; + case SF_FORMAT_VOC : return "VOC" ; + case SF_FORMAT_IRCAM : return "IRCAM" ; + case SF_FORMAT_W64 : return "W64" ; + case SF_FORMAT_MAT4 : return "MAT4" ; + case SF_FORMAT_MAT5 : return "MAT5" ; + case SF_FORMAT_PVF : return "PVF" ; + case SF_FORMAT_XI : return "XI" ; + case SF_FORMAT_HTK : return "HTK" ; + case SF_FORMAT_SDS : return "SDS" ; + case SF_FORMAT_AVR : return "AVR" ; + case SF_FORMAT_WAVEX : return "WAVEX" ; + case SF_FORMAT_SD2 : return "SD2" ; + case SF_FORMAT_FLAC : return "FLAC" ; + case SF_FORMAT_CAF : return "CAF" ; + case SF_FORMAT_WVE : return "WVE" ; + case SF_FORMAT_OGG : return "OGG" ; + case SF_FORMAT_MPC2K : return "MPC2K" ; + case SF_FORMAT_RF64 : return "RF64" ; + default : break ; + } ; + + return "unknown" ; +} /* sfe_container_name */ + +const char * +sfe_codec_name (int format) +{ + switch (format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_PCM_S8 : return "signed 8 bit PCM" ; + case SF_FORMAT_PCM_16 : return "16 bit PCM" ; + case SF_FORMAT_PCM_24 : return "24 bit PCM" ; + case SF_FORMAT_PCM_32 : return "32 bit PCM" ; + case SF_FORMAT_PCM_U8 : return "unsigned 8 bit PCM" ; + case SF_FORMAT_FLOAT : return "32 bit float" ; + case SF_FORMAT_DOUBLE : return "64 bit double" ; + case SF_FORMAT_ULAW : return "u-law" ; + case SF_FORMAT_ALAW : return "a-law" ; + case SF_FORMAT_IMA_ADPCM : return "IMA ADPCM" ; + case SF_FORMAT_MS_ADPCM : return "MS ADPCM" ; + case SF_FORMAT_GSM610 : return "gsm610" ; + case SF_FORMAT_VOX_ADPCM : return "Vox ADPCM" ; + case SF_FORMAT_G721_32 : return "g721 32kbps" ; + case SF_FORMAT_G723_24 : return "g723 24kbps" ; + case SF_FORMAT_G723_40 : return "g723 40kbps" ; + case SF_FORMAT_DWVW_12 : return "12 bit DWVW" ; + case SF_FORMAT_DWVW_16 : return "16 bit DWVW" ; + case SF_FORMAT_DWVW_24 : return "14 bit DWVW" ; + case SF_FORMAT_DWVW_N : return "DWVW" ; + case SF_FORMAT_DPCM_8 : return "8 bit DPCM" ; + case SF_FORMAT_DPCM_16 : return "16 bit DPCM" ; + case SF_FORMAT_VORBIS : return "Vorbis" ; + case SF_FORMAT_ALAC_16 : return "16 bit ALAC" ; + case SF_FORMAT_ALAC_20 : return "20 bit ALAC" ; + case SF_FORMAT_ALAC_24 : return "24 bit ALAC" ; + case SF_FORMAT_ALAC_32 : return "32 bit ALAC" ; + case SF_FORMAT_OPUS : return "Opus" ; + default : break ; + } ; + return "unknown" ; +} /* sfe_codec_name */ diff --git a/libsndfile-1.0.31/programs/common.h b/libsndfile-1.0.31/programs/common.h new file mode 100644 index 0000000..5ed36db --- /dev/null +++ b/libsndfile-1.0.31/programs/common.h @@ -0,0 +1,82 @@ +/* +** Copyright (C) 1999-2013 Erik de Castro Lopo +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the author nor the names of any contributors may be used +** to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#define ARRAY_LEN(x) ((int) (sizeof (x) / sizeof (x [0]))) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +typedef struct +{ const char * title ; + const char * copyright ; + const char * artist ; + const char * comment ; + const char * date ; + const char * album ; + const char * license ; + + + /* Stuff to go in the 'bext' chunk of WAV files. */ + int has_bext_fields ; + int coding_hist_append ; + + const char * description ; + const char * originator ; + const char * originator_reference ; + const char * origination_date ; + const char * origination_time ; + const char * umid ; + const char * loudness_value ; + const char * loudness_range ; + const char * max_true_peak_level ; + const char * max_momentary_loudness ; + const char * max_shortterm_loudness ; + const char * coding_history ; + const char * time_ref ; +} METADATA_INFO ; + +typedef SF_BROADCAST_INFO_VAR (2048) SF_BROADCAST_INFO_2K ; + +void sfe_apply_metadata_changes (const char * filenames [2], const METADATA_INFO * info) ; + +int sfe_copy_data_fp (SNDFILE *outfile, SNDFILE *infile, int channels, int normalize) ; + +void sfe_copy_data_int (SNDFILE *outfile, SNDFILE *infile, int channels) ; + +int sfe_file_type_of_ext (const char *filename, int format) ; + +void sfe_dump_format_map (void) ; + +const char * program_name (const char * argv0) ; + +const char * sfe_endian_name (int format) ; +const char * sfe_container_name (int format) ; +const char * sfe_codec_name (int format) ; diff --git a/libsndfile-1.0.31/programs/sndfile-cmp.c b/libsndfile-1.0.31/programs/sndfile-cmp.c new file mode 100644 index 0000000..3dd992d --- /dev/null +++ b/libsndfile-1.0.31/programs/sndfile-cmp.c @@ -0,0 +1,155 @@ +/* +** Copyright (C) 2008-2016 Erik de Castro Lopo +** Copyright (C) 2008 Conrad Parker +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the author nor the names of any contributors may be used +** to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include + +#include "common.h" + +/* Length of comparison data buffers in units of items */ +#define BUFLEN 65536 + +static const char * progname = NULL ; +static char * filename1 = NULL, * filename2 = NULL ; + +static int +comparison_error (const char * what, sf_count_t frame_offset) +{ char buffer [128] ; + + if (frame_offset >= 0) + snprintf (buffer, sizeof (buffer), " (at frame offset %" PRId64 ")", frame_offset) ; + else + buffer [0] = 0 ; + + printf ("%s: %s of files %s and %s differ%s.\n", progname, what, filename1, filename2, buffer) ; + return 1 ; +} /* comparison_error */ + +static int +compare (void) +{ + double buf1 [BUFLEN], buf2 [BUFLEN] ; + SF_INFO sfinfo1, sfinfo2 ; + SNDFILE * sf1 = NULL, * sf2 = NULL ; + sf_count_t items, i, nread1, nread2, offset = 0 ; + int retval = 0 ; + + memset (&sfinfo1, 0, sizeof (SF_INFO)) ; + sf1 = sf_open (filename1, SFM_READ, &sfinfo1) ; + if (sf1 == NULL) + { printf ("Error opening %s.\n", filename1) ; + retval = 1 ; + goto out ; + } ; + + memset (&sfinfo2, 0, sizeof (SF_INFO)) ; + sf2 = sf_open (filename2, SFM_READ, &sfinfo2) ; + if (sf2 == NULL) + { printf ("Error opening %s.\n", filename2) ; + retval = 1 ; + goto out ; + } ; + + if (sfinfo1.samplerate != sfinfo2.samplerate) + { retval = comparison_error ("Samplerates", -1) ; + goto out ; + } ; + + if (sfinfo1.channels != sfinfo2.channels) + { retval = comparison_error ("Number of channels", -1) ; + goto out ; + } ; + + /* Calculate the framecount that will fit in our data buffers */ + items = BUFLEN / sfinfo1.channels ; + + while ((nread1 = sf_readf_double (sf1, buf1, items)) > 0) + { nread2 = sf_readf_double (sf2, buf2, nread1) ; + if (nread2 != nread1) + { retval = comparison_error ("PCM data lengths", -1) ; + goto out ; + } ; + for (i = 0 ; i < nread1 * sfinfo1.channels ; i++) + { if (buf1 [i] != buf2 [i]) + { retval = comparison_error ("PCM data", offset + i / sfinfo1.channels) ; + goto out ; + } ; + } ; + offset += nread1 ; + } ; + + if ((nread2 = sf_readf_double (sf2, buf2, items)) != 0) + { retval = comparison_error ("PCM data lengths", -1) ; + goto out ; + } ; + +out : + sf_close (sf1) ; + sf_close (sf2) ; + + return retval ; +} /* compare */ + +static void +usage_exit (void) +{ + printf ("Usage : %s \n", progname) ; + printf (" Compare the PCM data of two sound files.\n\n") ; + printf ("Using %s.\n\n", sf_version_string ()) ; + exit (1) ; +} /* usage_exit */ + +int +main (int argc, char *argv []) +{ + progname = program_name (argv [0]) ; + + if (argc != 3) + usage_exit () ; + + filename1 = argv [argc - 2] ; + filename2 = argv [argc - 1] ; + + if (strcmp (filename1, filename2) == 0) + { printf ("Error : Input filenames are the same.\n\n") ; + usage_exit () ; + } ; + + return compare () ; +} /* main */ diff --git a/libsndfile-1.0.31/programs/sndfile-concat.c b/libsndfile-1.0.31/programs/sndfile-concat.c new file mode 100644 index 0000000..3a02a94 --- /dev/null +++ b/libsndfile-1.0.31/programs/sndfile-concat.c @@ -0,0 +1,170 @@ +/* +** Copyright (C) 1999-2014 Erik de Castro Lopo +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the author nor the names of any contributors may be used +** to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include + +#include + +#include "common.h" + +#define BUFFER_LEN (1 << 16) + + +static void concat_data_fp (SNDFILE *wfile, SNDFILE *rofile, int channels) ; +static void concat_data_int (SNDFILE *wfile, SNDFILE *rofile, int channels) ; + +static void +usage_exit (const char *progname) +{ + printf ("\nUsage : %s ... \n\n", progname) ; + puts ( + " Create a new output file containing the concatenated\n" + " audio data from froms ....\n" + "\n" + " The joined file will be encoded in the same format as the data\n" + " in infile1, with all the data in subsequent files automatically\n" + " converted to the correct encoding.\n" + "\n" + " The only restriction is that the two files must have the same\n" + " number of channels.\n" + ) ; + + exit (1) ; +} /* usage_exit */ + +int +main (int argc, char *argv []) +{ const char *progname, *outfilename ; + SNDFILE *outfile, **infiles ; + SF_INFO sfinfo_out, sfinfo_in ; + void (*func) (SNDFILE*, SNDFILE*, int) ; + int k ; + + progname = program_name (argv [0]) ; + + if (argc < 4) + usage_exit (progname) ; + + argv ++ ; + argc -- ; + + argc -- ; + outfilename = argv [argc] ; + + if ((infiles = calloc (argc, sizeof (SNDFILE*))) == NULL) + { printf ("\nError : Malloc failed.\n\n") ; + exit (1) ; + } ; + + memset (&sfinfo_in, 0, sizeof (sfinfo_in)) ; + + if ((infiles [0] = sf_open (argv [0], SFM_READ, &sfinfo_in)) == NULL) + { printf ("\nError : failed to open file '%s'.\n\n", argv [0]) ; + exit (1) ; + } ; + + sfinfo_out = sfinfo_in ; + + for (k = 1 ; k < argc ; k++) + { if ((infiles [k] = sf_open (argv [k], SFM_READ, &sfinfo_in)) == NULL) + { printf ("\nError : failed to open file '%s'.\n\n", argv [k]) ; + exit (1) ; + } ; + + if (sfinfo_in.channels != sfinfo_out.channels) + { printf ("\nError : File '%s' has %d channels (should have %d).\n\n", argv [k], sfinfo_in.channels, sfinfo_out.channels) ; + exit (1) ; + } ; + } ; + + if ((outfile = sf_open (outfilename, SFM_WRITE, &sfinfo_out)) == NULL) + { printf ("\nError : Not able to open input file %s.\n", outfilename) ; + puts (sf_strerror (NULL)) ; + exit (1) ; + } ; + + if ((sfinfo_out.format & SF_FORMAT_SUBMASK) == SF_FORMAT_DOUBLE || + (sfinfo_out.format & SF_FORMAT_SUBMASK) == SF_FORMAT_FLOAT) + func = concat_data_fp ; + else + func = concat_data_int ; + + for (k = 0 ; k < argc ; k++) + { func (outfile, infiles [k], sfinfo_out.channels) ; + sf_close (infiles [k]) ; + } ; + + sf_close (outfile) ; + free (infiles) ; + + return 0 ; +} /* main */ + +static void +concat_data_fp (SNDFILE *wfile, SNDFILE *rofile, int channels) +{ static double data [BUFFER_LEN] ; + int frames, readcount ; + + frames = BUFFER_LEN / channels ; + readcount = frames ; + + sf_seek (wfile, 0, SEEK_END) ; + + while (readcount > 0) + { readcount = sf_readf_double (rofile, data, frames) ; + sf_writef_double (wfile, data, readcount) ; + } ; + + return ; +} /* concat_data_fp */ + +static void +concat_data_int (SNDFILE *wfile, SNDFILE *rofile, int channels) +{ static int data [BUFFER_LEN] ; + int frames, readcount ; + + frames = BUFFER_LEN / channels ; + readcount = frames ; + + sf_seek (wfile, 0, SEEK_END) ; + + while (readcount > 0) + { readcount = sf_readf_int (rofile, data, frames) ; + sf_writef_int (wfile, data, readcount) ; + } ; + + return ; +} /* concat_data_int */ + diff --git a/libsndfile-1.0.31/programs/sndfile-convert.c b/libsndfile-1.0.31/programs/sndfile-convert.c new file mode 100644 index 0000000..5aa4fdf --- /dev/null +++ b/libsndfile-1.0.31/programs/sndfile-convert.c @@ -0,0 +1,407 @@ +/* +** Copyright (C) 1999-2019 Erik de Castro Lopo +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the author nor the names of any contributors may be used +** to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include + +#include + +#include "common.h" + + +typedef struct +{ char *infilename, *outfilename ; + SF_INFO infileinfo, outfileinfo ; +} OptionData ; + +static void copy_metadata (SNDFILE *outfile, SNDFILE *infile, int channels) ; + +static void +usage_exit (const char *progname) +{ + printf ("\nUsage : %s [options] [encoding] \n", progname) ; + puts ("\n" + " where [option] may be:\n\n" + " -override-sample-rate=X : force sample rate of input to X\n" + " -endian=little : force output file to little endian data\n" + " -endian=big : force output file to big endian data\n" + " -endian=cpu : force output file same endian-ness as the CPU\n" + " -normalize : normalize the data in the output file\n" + ) ; + + puts ( + " where [encoding] may be one of the following:\n\n" + " -pcms8 : signed 8 bit pcm\n" + " -pcmu8 : unsigned 8 bit pcm\n" + " -pcm16 : 16 bit pcm\n" + " -pcm24 : 24 bit pcm\n" + " -pcm32 : 32 bit pcm\n" + " -float32 : 32 bit floating point\n" + " -float64 : 64 bit floating point\n" + " -ulaw : ULAW\n" + " -alaw : ALAW\n" + " -alac16 : 16 bit ALAC (CAF only)\n" + " -alac20 : 20 bit ALAC (CAF only)\n" + " -alac24 : 24 bit ALAC (CAF only)\n" + " -alac32 : 32 bit ALAC (CAF only)\n" + " -ima-adpcm : IMA ADPCM (WAV only)\n" + " -ms-adpcm : MS ADPCM (WAV only)\n" + " -gsm610 : GSM6.10 (WAV only)\n" + " -dwvw12 : 12 bit DWVW (AIFF only)\n" + " -dwvw16 : 16 bit DWVW (AIFF only)\n" + " -dwvw24 : 24 bit DWVW (AIFF only)\n" + " -vorbis : Vorbis (OGG only)\n" + " -opus : Opus (OGG only)\n" + ) ; + + puts ( + " If no encoding is specified, the program will try to use the encoding\n" + " of the input file in the output file. This will not always work as\n" + " most container formats (eg WAV, AIFF etc) only support a small subset\n" + " of codec formats (eg 16 bit PCM, a-law, Vorbis etc).\n" + ) ; + + puts ( + " The format of the output file is determined by the file extension of the\n" + " output file name. The following extensions are currently understood:\n" + ) ; + + sfe_dump_format_map () ; + + puts ("") ; + exit (1) ; +} /* usage_exit */ + +static void +report_format_error_exit (const char * argv0, SF_INFO * sfinfo) +{ int old_format = sfinfo->format ; + int endian = sfinfo->format & SF_FORMAT_ENDMASK ; + int channels = sfinfo->channels ; + + sfinfo->format = old_format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (endian && sf_format_check (sfinfo)) + { printf ("Error : output file format does not support %s endian-ness.\n", sfe_endian_name (endian)) ; + exit (1) ; + } ; + + sfinfo->channels = 1 ; + if (sf_format_check (sfinfo)) + { printf ("Error : output file format does not support %d channels.\n", channels) ; + exit (1) ; + } ; + + printf ("\n" + "Error : output file format is invalid.\n" + "The '%s' container does not support '%s' codec data.\n" + "Run '%s --help' for clues.\n\n", + sfe_container_name (sfinfo->format), sfe_codec_name (sfinfo->format), program_name (argv0)) ; + exit (1) ; +} /* report_format_error_exit */ + +int +main (int argc, char * argv []) +{ const char *progname, *infilename, *outfilename ; + SNDFILE *infile = NULL, *outfile = NULL ; + SF_INFO sfinfo ; + int k, outfilemajor, outfileminor = 0, infileminor ; + int override_sample_rate = 0 ; /* assume no sample rate override. */ + int endian = SF_ENDIAN_FILE, normalize = SF_FALSE ; + + progname = program_name (argv [0]) ; + + if (argc < 3 || argc > 5) + usage_exit (progname) ; + + infilename = argv [argc-2] ; + outfilename = argv [argc-1] ; + + if (strcmp (infilename, outfilename) == 0) + { printf ("Error : Input and output filenames are the same.\n\n") ; + usage_exit (progname) ; + } ; + + if (strlen (infilename) > 1 && infilename [0] == '-') + { printf ("Error : Input filename (%s) looks like an option.\n\n", infilename) ; + usage_exit (progname) ; + } ; + + if (outfilename [0] == '-') + { printf ("Error : Output filename (%s) looks like an option.\n\n", outfilename) ; + usage_exit (progname) ; + } ; + + for (k = 1 ; k < argc - 2 ; k++) + { if (! strcmp (argv [k], "-pcms8")) + { outfileminor = SF_FORMAT_PCM_S8 ; + continue ; + } ; + if (! strcmp (argv [k], "-pcmu8")) + { outfileminor = SF_FORMAT_PCM_U8 ; + continue ; + } ; + if (! strcmp (argv [k], "-pcm16")) + { outfileminor = SF_FORMAT_PCM_16 ; + continue ; + } ; + if (! strcmp (argv [k], "-pcm24")) + { outfileminor = SF_FORMAT_PCM_24 ; + continue ; + } ; + if (! strcmp (argv [k], "-pcm32")) + { outfileminor = SF_FORMAT_PCM_32 ; + continue ; + } ; + if (! strcmp (argv [k], "-float32")) + { outfileminor = SF_FORMAT_FLOAT ; + continue ; + } ; + if (! strcmp (argv [k], "-float64")) + { outfileminor = SF_FORMAT_DOUBLE ; + continue ; + } ; + if (! strcmp (argv [k], "-ulaw")) + { outfileminor = SF_FORMAT_ULAW ; + continue ; + } ; + if (! strcmp (argv [k], "-alaw")) + { outfileminor = SF_FORMAT_ALAW ; + continue ; + } ; + if (! strcmp (argv [k], "-alac16")) + { outfileminor = SF_FORMAT_ALAC_16 ; + continue ; + } ; + if (! strcmp (argv [k], "-alac20")) + { outfileminor = SF_FORMAT_ALAC_20 ; + continue ; + } ; + if (! strcmp (argv [k], "-alac24")) + { outfileminor = SF_FORMAT_ALAC_24 ; + continue ; + } ; + if (! strcmp (argv [k], "-alac32")) + { outfileminor = SF_FORMAT_ALAC_32 ; + continue ; + } ; + if (! strcmp (argv [k], "-ima-adpcm")) + { outfileminor = SF_FORMAT_IMA_ADPCM ; + continue ; + } ; + if (! strcmp (argv [k], "-ms-adpcm")) + { outfileminor = SF_FORMAT_MS_ADPCM ; + continue ; + } ; + if (! strcmp (argv [k], "-gsm610")) + { outfileminor = SF_FORMAT_GSM610 ; + continue ; + } ; + if (! strcmp (argv [k], "-dwvw12")) + { outfileminor = SF_FORMAT_DWVW_12 ; + continue ; + } ; + if (! strcmp (argv [k], "-dwvw16")) + { outfileminor = SF_FORMAT_DWVW_16 ; + continue ; + } ; + if (! strcmp (argv [k], "-dwvw24")) + { outfileminor = SF_FORMAT_DWVW_24 ; + continue ; + } ; + if (! strcmp (argv [k], "-vorbis")) + { outfileminor = SF_FORMAT_VORBIS ; + continue ; + } ; + if (! strcmp (argv [k], "-opus")) + { outfileminor = SF_FORMAT_OPUS ; + continue ; + } ; + + if (strstr (argv [k], "-override-sample-rate=") == argv [k]) + { const char *ptr ; + + ptr = argv [k] + strlen ("-override-sample-rate=") ; + override_sample_rate = atoi (ptr) ; + continue ; + } ; + + if (! strcmp (argv [k], "-endian=little")) + { endian = SF_ENDIAN_LITTLE ; + continue ; + } ; + + if (! strcmp (argv [k], "-endian=big")) + { endian = SF_ENDIAN_BIG ; + continue ; + } ; + + if (! strcmp (argv [k], "-endian=cpu")) + { endian = SF_ENDIAN_CPU ; + continue ; + } ; + + if (! strcmp (argv [k], "-endian=file")) + { endian = SF_ENDIAN_FILE ; + continue ; + } ; + + if (! strcmp (argv [k], "-normalize")) + { normalize = SF_TRUE ; + continue ; + } ; + + printf ("Error : Not able to decode argunment '%s'.\n", argv [k]) ; + exit (1) ; + } ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + if ((infile = sf_open (infilename, SFM_READ, &sfinfo)) == NULL) + { printf ("Not able to open input file %s.\n", infilename) ; + puts (sf_strerror (NULL)) ; + return 1 ; + } ; + + /* Update sample rate if forced to something else. */ + if (override_sample_rate) + sfinfo.samplerate = override_sample_rate ; + + infileminor = sfinfo.format & SF_FORMAT_SUBMASK ; + + if ((sfinfo.format = sfe_file_type_of_ext (outfilename, sfinfo.format)) == 0) + { printf ("Error : Not able to determine output file type for %s.\n", outfilename) ; + return 1 ; + } ; + + outfilemajor = sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_ENDMASK) ; + + if (outfileminor == 0) + outfileminor = sfinfo.format & SF_FORMAT_SUBMASK ; + + if (outfileminor != 0) + sfinfo.format = outfilemajor | outfileminor ; + else + sfinfo.format = outfilemajor | (sfinfo.format & SF_FORMAT_SUBMASK) ; + + sfinfo.format |= endian ; + + if ((sfinfo.format & SF_FORMAT_TYPEMASK) == SF_FORMAT_XI) + switch (sfinfo.format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_PCM_16 : + sfinfo.format = outfilemajor | SF_FORMAT_DPCM_16 ; + break ; + + case SF_FORMAT_PCM_S8 : + case SF_FORMAT_PCM_U8 : + sfinfo.format = outfilemajor | SF_FORMAT_DPCM_8 ; + break ; + } ; + + if (sf_format_check (&sfinfo) == 0) + { sf_close (infile) ; + report_format_error_exit (argv [0], &sfinfo) ; + } ; + + if ((sfinfo.format & SF_FORMAT_SUBMASK) == SF_FORMAT_GSM610 && sfinfo.samplerate != 8000) + { printf ( + "WARNING: GSM 6.10 data format only supports 8kHz sample rate. The converted\n" + "ouput file will contain the input data converted to the GSM 6.10 data format\n" + "but not re-sampled.\n" + ) ; + } ; + + /* Open the output file. */ + if ((outfile = sf_open (outfilename, SFM_WRITE, &sfinfo)) == NULL) + { printf ("Not able to open output file %s : %s\n", outfilename, sf_strerror (NULL)) ; + return 1 ; + } ; + + /* Copy the metadata */ + copy_metadata (outfile, infile, sfinfo.channels) ; + + if (normalize + || (outfileminor == SF_FORMAT_DOUBLE) || (outfileminor == SF_FORMAT_FLOAT) + || (infileminor == SF_FORMAT_DOUBLE) || (infileminor == SF_FORMAT_FLOAT) + || (infileminor == SF_FORMAT_OPUS) || (outfileminor == SF_FORMAT_OPUS) + || (infileminor == SF_FORMAT_VORBIS) || (outfileminor == SF_FORMAT_VORBIS)) + { if (sfe_copy_data_fp (outfile, infile, sfinfo.channels, normalize) != 0) + { printf ("Error : Not able to decode input file %s.\n", infilename) ; + return 1 ; + } ; + } + else + sfe_copy_data_int (outfile, infile, sfinfo.channels) ; + + sf_close (infile) ; + sf_close (outfile) ; + + return 0 ; +} /* main */ + +static void +copy_metadata (SNDFILE *outfile, SNDFILE *infile, int channels) +{ SF_INSTRUMENT inst ; + SF_CUES cues ; + SF_BROADCAST_INFO_2K binfo ; + const char *str ; + int k, chanmap [256] ; + + for (k = SF_STR_FIRST ; k <= SF_STR_LAST ; k++) + { str = sf_get_string (infile, k) ; + if (str != NULL) + sf_set_string (outfile, k, str) ; + } ; + + memset (&inst, 0, sizeof (inst)) ; + memset (&cues, 0, sizeof (cues)) ; + memset (&binfo, 0, sizeof (binfo)) ; + + if (channels < ARRAY_LEN (chanmap)) + { size_t size = channels * sizeof (chanmap [0]) ; + + if (sf_command (infile, SFC_GET_CHANNEL_MAP_INFO, chanmap, size) == SF_TRUE) + sf_command (outfile, SFC_SET_CHANNEL_MAP_INFO, chanmap, size) ; + } ; + + if (sf_command (infile, SFC_GET_CUE, &cues, sizeof (cues)) == SF_TRUE) + sf_command (outfile, SFC_SET_CUE, &cues, sizeof (cues)) ; + + if (sf_command (infile, SFC_GET_INSTRUMENT, &inst, sizeof (inst)) == SF_TRUE) + sf_command (outfile, SFC_SET_INSTRUMENT, &inst, sizeof (inst)) ; + + if (sf_command (infile, SFC_GET_BROADCAST_INFO, &binfo, sizeof (binfo)) == SF_TRUE) + sf_command (outfile, SFC_SET_BROADCAST_INFO, &binfo, sizeof (binfo)) ; + +} /* copy_metadata */ + diff --git a/libsndfile-1.0.31/programs/sndfile-deinterleave.c b/libsndfile-1.0.31/programs/sndfile-deinterleave.c new file mode 100644 index 0000000..616761e --- /dev/null +++ b/libsndfile-1.0.31/programs/sndfile-deinterleave.c @@ -0,0 +1,210 @@ +/* +** Copyright (C) 2009-2017 Erik de Castro Lopo +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the author nor the names of any contributors may be used +** to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include + +#include "common.h" + +#define BUFFER_LEN 4096 +#define MAX_CHANNELS 16 + + +typedef struct +{ SNDFILE * infile ; + SNDFILE * outfile [MAX_CHANNELS] ; + + union + { double d [MAX_CHANNELS * BUFFER_LEN] ; + int i [MAX_CHANNELS * BUFFER_LEN] ; + } din ; + + union + { double d [BUFFER_LEN] ; + int i [BUFFER_LEN] ; + } dout ; + + int channels ; +} STATE ; + +static void usage_exit (void) ; + +static void deinterleave_int (STATE * state) ; +static void deinterleave_double (STATE * state) ; + +int +main (int argc, char **argv) +{ STATE state ; + SF_INFO sfinfo ; + char pathname [512], ext [32], *cptr ; + int ch, double_split ; + + if (argc != 2) + { if (argc != 1) + puts ("\nError : need a single input file.\n") ; + usage_exit () ; + } ; + + memset (&state, 0, sizeof (state)) ; + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + if ((state.infile = sf_open (argv [1], SFM_READ, &sfinfo)) == NULL) + { printf ("\nError : Not able to open input file '%s'\n%s\n", argv [1], sf_strerror (NULL)) ; + exit (1) ; + } ; + + if (sfinfo.channels < 2) + { printf ("\nError : Input file '%s' only has one channel.\n", argv [1]) ; + exit (1) ; + } ; + + if (sfinfo.channels > MAX_CHANNELS) + { printf ("\nError : Input file '%s' has too many (%d) channels. Limit is %d.\n", + argv [1], sfinfo.channels, MAX_CHANNELS) ; + exit (1) ; + } ; + + + state.channels = sfinfo.channels ; + sfinfo.channels = 1 ; + + if (snprintf (pathname, sizeof (pathname), "%s", argv [1]) > (int) sizeof (pathname)) + { printf ("\nError : Length of provided filename '%s' exceeds MAX_PATH (%d).\n", argv [1], (int) sizeof (pathname)) ; + exit (1) ; + } ; + + if ((cptr = strrchr (pathname, '.')) == NULL) + ext [0] = 0 ; + else + { snprintf (ext, sizeof (ext), "%s", cptr) ; + cptr [0] = 0 ; + } ; + + printf ("Input file : %s\n", pathname) ; + puts ("Output files :") ; + + for (ch = 0 ; ch < state.channels ; ch++) + { char filename [520] ; + size_t count ; + + count = snprintf (filename, sizeof (filename), "%s_%02d%s", pathname, ch, ext) ; + + if (count >= sizeof (filename)) + { printf ("File name truncated to %s\n", filename) ; + } ; + + if ((state.outfile [ch] = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) + { printf ("Not able to open output file '%s'\n%s\n", filename, sf_strerror (NULL)) ; + exit (1) ; + } ; + + printf (" %s\n", filename) ; + } ; + + switch (sfinfo.format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_FLOAT : + case SF_FORMAT_DOUBLE : + case SF_FORMAT_VORBIS : + double_split = 1 ; + break ; + + default : + double_split = 0 ; + break ; + } ; + + if (double_split) + deinterleave_double (&state) ; + else + deinterleave_int (&state) ; + + sf_close (state.infile) ; + for (ch = 0 ; ch < MAX_CHANNELS ; ch++) + if (state.outfile [ch] != NULL) + sf_close (state.outfile [ch]) ; + + return 0 ; +} /* main */ + +/*------------------------------------------------------------------------------ +*/ + +static void +usage_exit (void) +{ puts ("\nUsage : sndfile-deinterleave \n") ; + puts ( + "Split a mutli-channel file into a set of mono files.\n" + "\n" + "If the input file is named 'a.wav', the output files will be named\n" + "a_00.wav, a_01.wav and so on.\n" + ) ; + printf ("Using %s.\n\n", sf_version_string ()) ; + exit (1) ; +} /* usage_exit */ + +static void +deinterleave_int (STATE * state) +{ int read_len ; + int ch, k ; + + do + { read_len = sf_readf_int (state->infile, state->din.i, BUFFER_LEN) ; + + for (ch = 0 ; ch < state->channels ; ch ++) + { for (k = 0 ; k < read_len ; k++) + state->dout.i [k] = state->din.i [k * state->channels + ch] ; + sf_write_int (state->outfile [ch], state->dout.i, read_len) ; + } ; + } + while (read_len > 0) ; + +} /* deinterleave_int */ + +static void +deinterleave_double (STATE * state) +{ int read_len ; + int ch, k ; + + do + { read_len = sf_readf_double (state->infile, state->din.d, BUFFER_LEN) ; + + for (ch = 0 ; ch < state->channels ; ch ++) + { for (k = 0 ; k < read_len ; k++) + state->dout.d [k] = state->din.d [k * state->channels + ch] ; + sf_write_double (state->outfile [ch], state->dout.d, read_len) ; + } ; + } + while (read_len > 0) ; + +} /* deinterleave_double */ diff --git a/libsndfile-1.0.31/programs/sndfile-info.c b/libsndfile-1.0.31/programs/sndfile-info.c new file mode 100644 index 0000000..e0e4882 --- /dev/null +++ b/libsndfile-1.0.31/programs/sndfile-info.c @@ -0,0 +1,527 @@ +/* +** Copyright (C) 1999-2019 Erik de Castro Lopo +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the author nor the names of any contributors may be used +** to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include +#include +#include + +#include + +#include "common.h" + +#define BUFFER_LEN (1 << 16) + +#if (defined (WIN32) || defined (_WIN32)) +#include +#endif + +static void usage_exit (const char *progname) ; + +static void info_dump (const char *filename) ; +static int instrument_dump (const char *filename) ; +static int broadcast_dump (const char *filename) ; +static int chanmap_dump (const char *filename) ; +static int cart_dump (const char *filename) ; +static void total_dump (void) ; + +static double total_seconds = 0.0 ; + +int +main (int argc, char *argv []) +{ int k ; + + if (argc < 2 || strcmp (argv [1], "--help") == 0 || strcmp (argv [1], "-h") == 0) + usage_exit (program_name (argv [0])) ; + + if (strcmp (argv [1], "--instrument") == 0) + { int error = 0 ; + + for (k = 2 ; k < argc ; k++) + error += instrument_dump (argv [k]) ; + return error ; + } ; + + if (strcmp (argv [1], "--broadcast") == 0) + { int error = 0 ; + + for (k = 2 ; k < argc ; k++) + error += broadcast_dump (argv [k]) ; + return error ; + } ; + + if (strcmp (argv [1], "--channel-map") == 0) + { int error = 0 ; + + for (k = 2 ; k < argc ; k++) + error += chanmap_dump (argv [k]) ; + return error ; + } ; + + if (strcmp (argv [1], "--cart") == 0) + { int error = 0 ; + + for (k = 2 ; k < argc ; k++) + error += cart_dump (argv [k]) ; + return error ; + } ; + + for (k = 1 ; k < argc ; k++) + info_dump (argv [k]) ; + + if (argc > 2) + total_dump () ; + + return 0 ; +} /* main */ + +/*============================================================================== +** Print version and usage. +*/ + +static double data [BUFFER_LEN] ; + +static void +usage_exit (const char *progname) +{ printf ("Usage :\n %s ...\n", progname) ; + printf (" Prints out information about one or more sound files.\n\n") ; + printf (" %s --instrument \n", progname) ; + printf (" Prints out the instrument data for the given file.\n\n") ; + printf (" %s --broadcast \n", progname) ; + printf (" Prints out the broadcast WAV info for the given file.\n\n") ; + printf (" %s --channel-map \n", progname) ; + printf (" Prints out the channel map for the given file.\n\n") ; + printf (" %s --cart \n", progname) ; + printf (" Prints out the cart chunk WAV info for the given file.\n\n") ; + + printf ("Using %s.\n\n", sf_version_string ()) ; +#if (defined (_WIN32) || defined (WIN32)) + printf ("This is a Unix style command line application which\n" + "should be run in a MSDOS box or Command Shell window.\n\n") ; + printf ("Sleeping for 5 seconds before exiting.\n\n") ; + fflush (stdout) ; + + Sleep (5 * 1000) ; +#endif + exit (1) ; +} /* usage_exit */ + +/*============================================================================== +** Dumping of sndfile info. +*/ + +static double data [BUFFER_LEN] ; + +static double +calc_decibels (SF_INFO * sfinfo, double max) +{ double decibels ; + + switch (sfinfo->format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_PCM_U8 : + case SF_FORMAT_PCM_S8 : + decibels = max / 0x80 ; + break ; + + case SF_FORMAT_PCM_16 : + decibels = max / 0x8000 ; + break ; + + case SF_FORMAT_PCM_24 : + decibels = max / 0x800000 ; + break ; + + case SF_FORMAT_PCM_32 : + decibels = max / 0x80000000 ; + break ; + + case SF_FORMAT_FLOAT : + case SF_FORMAT_DOUBLE : + decibels = max / 1.0 ; + break ; + + default : + decibels = max / 0x8000 ; + break ; + } ; + + return 20.0 * log10 (decibels) ; +} /* calc_decibels */ + +static const char * +format_duration_str (double seconds) +{ static char str [128] ; + int hrs, min ; + double sec ; + + memset (str, 0, sizeof (str)) ; + + hrs = (int) (seconds / 3600.0) ; + min = (int) ((seconds - (hrs * 3600.0)) / 60.0) ; + sec = seconds - (hrs * 3600.0) - (min * 60.0) ; + + snprintf (str, sizeof (str) - 1, "%02d:%02d:%06.3f", hrs, min, sec) ; + + return str ; +} /* format_duration_str */ + +static const char * +generate_duration_str (SF_INFO *sfinfo) +{ + double seconds ; + + if (sfinfo->samplerate < 1) + return NULL ; + + if (sfinfo->frames / sfinfo->samplerate > 0x7FFFFFFF) + return "unknown" ; + + seconds = (1.0 * sfinfo->frames) / sfinfo->samplerate ; + + /* Accumulate the total of all known file durations */ + total_seconds += seconds ; + + return format_duration_str (seconds) ; +} /* generate_duration_str */ + +static void +info_dump (const char *filename) +{ static char strbuffer [BUFFER_LEN] ; + SNDFILE *file ; + SF_INFO sfinfo ; + double signal_max, decibels ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) + { printf ("Error : Not able to open input file %s.\n", filename) ; + fflush (stdout) ; + memset (data, 0, sizeof (data)) ; + sf_command (file, SFC_GET_LOG_INFO, strbuffer, BUFFER_LEN) ; + puts (strbuffer) ; + puts (sf_strerror (NULL)) ; + return ; + } ; + + printf ("========================================\n") ; + sf_command (file, SFC_GET_LOG_INFO, strbuffer, BUFFER_LEN) ; + puts (strbuffer) ; + printf ("----------------------------------------\n") ; + + printf ("Sample Rate : %d\n", sfinfo.samplerate) ; + + if (sfinfo.frames == SF_COUNT_MAX) + printf ("Frames : unknown\n") ; + else + printf ("Frames : %" PRId64 "\n", sfinfo.frames) ; + + printf ("Channels : %d\n", sfinfo.channels) ; + printf ("Format : 0x%08X\n", sfinfo.format) ; + printf ("Sections : %d\n", sfinfo.sections) ; + printf ("Seekable : %s\n", (sfinfo.seekable ? "TRUE" : "FALSE")) ; + printf ("Duration : %s\n", generate_duration_str (&sfinfo)) ; + + if (sfinfo.frames < 100 * 1024 * 1024) + { /* Do not use sf_signal_max because it doesn't work for non-seekable files . */ + sf_command (file, SFC_CALC_SIGNAL_MAX, &signal_max, sizeof (signal_max)) ; + decibels = calc_decibels (&sfinfo, signal_max) ; + printf ("Signal Max : %g (%4.2f dB)\n", signal_max, decibels) ; + } ; + putchar ('\n') ; + + sf_close (file) ; + +} /* info_dump */ + +/*============================================================================== +** Dumping of SF_INSTRUMENT data. +*/ + +static const char * +str_of_type (int mode) +{ switch (mode) + { case SF_LOOP_NONE : return "none" ; + case SF_LOOP_FORWARD : return "fwd " ; + case SF_LOOP_BACKWARD : return "back" ; + case SF_LOOP_ALTERNATING : return "alt " ; + default : break ; + } ; + + return "????" ; +} /* str_of_mode */ + +static int +instrument_dump (const char *filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + SF_INSTRUMENT inst ; + int got_inst, k ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) + { printf ("Error : Not able to open input file %s.\n", filename) ; + fflush (stdout) ; + memset (data, 0, sizeof (data)) ; + puts (sf_strerror (NULL)) ; + return 1 ; + } ; + + got_inst = sf_command (file, SFC_GET_INSTRUMENT, &inst, sizeof (inst)) ; + sf_close (file) ; + + if (got_inst == SF_FALSE) + { printf ("Error : File '%s' does not contain instrument data.\n\n", filename) ; + return 1 ; + } ; + + printf ("Instrument : %s\n\n", filename) ; + printf (" Gain : %d\n", inst.gain) ; + printf (" Base note : %d\n", inst.basenote) ; + printf (" Velocity : %d - %d\n", (int) inst.velocity_lo, (int) inst.velocity_hi) ; + printf (" Key : %d - %d\n", (int) inst.key_lo, (int) inst.key_hi) ; + printf (" Loop points : %d\n", inst.loop_count) ; + + for (k = 0 ; k < inst.loop_count ; k++) + printf (" %-2d Mode : %s Start : %6d End : %6d Count : %6d\n", k, str_of_type (inst.loops [k].mode), inst.loops [k].start, inst.loops [k].end, inst.loops [k].count) ; + + putchar ('\n') ; + return 0 ; +} /* instrument_dump */ + +static int +broadcast_dump (const char *filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + SF_BROADCAST_INFO_2K bext ; + double time_ref_sec ; + int got_bext ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) + { printf ("Error : Not able to open input file %s.\n", filename) ; + fflush (stdout) ; + memset (data, 0, sizeof (data)) ; + puts (sf_strerror (NULL)) ; + return 1 ; + } ; + + memset (&bext, 0, sizeof (SF_BROADCAST_INFO_2K)) ; + + got_bext = sf_command (file, SFC_GET_BROADCAST_INFO, &bext, sizeof (bext)) ; + sf_close (file) ; + + if (got_bext == SF_FALSE) + { printf ("Error : File '%s' does not contain broadcast information.\n\n", filename) ; + return 1 ; + } ; + + /* + ** From : http://www.ebu.ch/en/technical/publications/userguides/bwf_user_guide.php + ** + ** Time Reference: + ** This field is a count from midnight in samples to the first sample + ** of the audio sequence. + */ + + time_ref_sec = ((pow (2.0, 32) * bext.time_reference_high) + (1.0 * bext.time_reference_low)) / sfinfo.samplerate ; + + printf ("Description : %.*s\n", (int) sizeof (bext.description), bext.description) ; + printf ("Originator : %.*s\n", (int) sizeof (bext.originator), bext.originator) ; + printf ("Origination ref : %.*s\n", (int) sizeof (bext.originator_reference), bext.originator_reference) ; + printf ("Origination date : %.*s\n", (int) sizeof (bext.origination_date), bext.origination_date) ; + printf ("Origination time : %.*s\n", (int) sizeof (bext.origination_time), bext.origination_time) ; + + if (bext.time_reference_high == 0 && bext.time_reference_low == 0) + printf ("Time ref : 0\n") ; + else + printf ("Time ref : 0x%x%08x (%.6f seconds)\n", bext.time_reference_high, bext.time_reference_low, time_ref_sec) ; + + printf ("BWF version : %d\n", bext.version) ; + + if (bext.version >= 1) + printf ("UMID : %.*s\n", (int) sizeof (bext.umid), bext.umid) ; + + if (bext.version >= 2) + { /* 0x7fff shall be used to designate an unused value */ + /* valid range: -99.99 .. 99.99 */ + printf ("Loudness value : %6.2f LUFS\n", bext.loudness_value / 100.0) ; + /* valid range: 0.00 .. 99.99 */ + printf ("Loudness range : %6.2f LU\n", bext.loudness_range / 100.0) ; + /* valid range: -99.99 .. 99.99 */ + printf ("Max. true peak level : %6.2f dBTP\n", bext.max_true_peak_level / 100.0) ; + printf ("Max. momentary loudness : %6.2f LUFS\n", bext.max_momentary_loudness / 100.0) ; + printf ("Max. short term loudness : %6.2f LUFS\n", bext.max_shortterm_loudness / 100.0) ; + } ; + + printf ("Coding history : %.*s\n", bext.coding_history_size, bext.coding_history) ; + + return 0 ; +} /* broadcast_dump */ + +static int +chanmap_dump (const char *filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int * channel_map ; + int got_chanmap, k ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) + { printf ("Error : Not able to open input file %s.\n", filename) ; + fflush (stdout) ; + memset (data, 0, sizeof (data)) ; + puts (sf_strerror (NULL)) ; + return 1 ; + } ; + + if ((channel_map = calloc (sfinfo.channels, sizeof (int))) == NULL) + { printf ("Error : malloc failed.\n\n") ; + return 1 ; + } ; + + got_chanmap = sf_command (file, SFC_GET_CHANNEL_MAP_INFO, channel_map, sfinfo.channels * sizeof (int)) ; + sf_close (file) ; + + if (got_chanmap == SF_FALSE) + { printf ("Error : File '%s' does not contain channel map information.\n\n", filename) ; + free (channel_map) ; + return 1 ; + } ; + + printf ("File : %s\n\n", filename) ; + + puts (" Chan Position") ; + for (k = 0 ; k < sfinfo.channels ; k ++) + { const char * name ; + +#define CASE_NAME(x) case x : name = #x ; break ; + switch (channel_map [k]) + { CASE_NAME (SF_CHANNEL_MAP_INVALID) ; + CASE_NAME (SF_CHANNEL_MAP_MONO) ; + CASE_NAME (SF_CHANNEL_MAP_LEFT) ; + CASE_NAME (SF_CHANNEL_MAP_RIGHT) ; + CASE_NAME (SF_CHANNEL_MAP_CENTER) ; + CASE_NAME (SF_CHANNEL_MAP_FRONT_LEFT) ; + CASE_NAME (SF_CHANNEL_MAP_FRONT_RIGHT) ; + CASE_NAME (SF_CHANNEL_MAP_FRONT_CENTER) ; + CASE_NAME (SF_CHANNEL_MAP_REAR_CENTER) ; + CASE_NAME (SF_CHANNEL_MAP_REAR_LEFT) ; + CASE_NAME (SF_CHANNEL_MAP_REAR_RIGHT) ; + CASE_NAME (SF_CHANNEL_MAP_LFE) ; + CASE_NAME (SF_CHANNEL_MAP_FRONT_LEFT_OF_CENTER) ; + CASE_NAME (SF_CHANNEL_MAP_FRONT_RIGHT_OF_CENTER) ; + CASE_NAME (SF_CHANNEL_MAP_SIDE_LEFT) ; + CASE_NAME (SF_CHANNEL_MAP_SIDE_RIGHT) ; + CASE_NAME (SF_CHANNEL_MAP_TOP_CENTER) ; + CASE_NAME (SF_CHANNEL_MAP_TOP_FRONT_LEFT) ; + CASE_NAME (SF_CHANNEL_MAP_TOP_FRONT_RIGHT) ; + CASE_NAME (SF_CHANNEL_MAP_TOP_FRONT_CENTER) ; + CASE_NAME (SF_CHANNEL_MAP_TOP_REAR_LEFT) ; + CASE_NAME (SF_CHANNEL_MAP_TOP_REAR_RIGHT) ; + CASE_NAME (SF_CHANNEL_MAP_TOP_REAR_CENTER) ; + CASE_NAME (SF_CHANNEL_MAP_MAX) ; + default : name = "default" ; + break ; + } ; + + printf (" %3d %s\n", k, name) ; + } ; + + putchar ('\n') ; + free (channel_map) ; + + return 0 ; +} /* chanmap_dump */ + +static int +cart_dump (const char *filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + SF_CART_INFO_VAR (1024) cart ; + int got_cart, k ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + memset (&cart, 0, sizeof (cart)) ; + + if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) + { printf ("Error : Not able to open input file %s.\n", filename) ; + fflush (stdout) ; + memset (data, 0, sizeof (data)) ; + puts (sf_strerror (NULL)) ; + return 1 ; + } ; + + got_cart = sf_command (file, SFC_GET_CART_INFO, &cart, sizeof (cart)) ; + sf_close (file) ; + + if (got_cart == SF_FALSE) + { printf ("Error : File '%s' does not contain cart information.\n\n", filename) ; + return 1 ; + } ; + + printf ("Version : %.*s\n", (int) sizeof (cart.version), cart.version) ; + printf ("Title : %.*s\n", (int) sizeof (cart.title), cart.title) ; + printf ("Artist : %.*s\n", (int) sizeof (cart.artist), cart.artist) ; + printf ("Cut id : %.*s\n", (int) sizeof (cart.cut_id), cart.cut_id) ; + printf ("Category : %.*s\n", (int) sizeof (cart.category), cart.category) ; + printf ("Classification : %.*s\n", (int) sizeof (cart.classification), cart.classification) ; + printf ("Out cue : %.*s\n", (int) sizeof (cart.out_cue), cart.out_cue) ; + printf ("Start date : %.*s\n", (int) sizeof (cart.start_date), cart.start_date) ; + printf ("Start time : %.*s\n", (int) sizeof (cart.start_time), cart.start_time) ; + printf ("End date : %.*s\n", (int) sizeof (cart.end_date), cart.end_date) ; + printf ("End time : %.*s\n", (int) sizeof (cart.end_time), cart.end_time) ; + printf ("App id : %.*s\n", (int) sizeof (cart.producer_app_id), cart.producer_app_id) ; + printf ("App version : %.*s\n", (int) sizeof (cart.producer_app_version), cart.producer_app_version) ; + printf ("User defined : %.*s\n", (int) sizeof (cart.user_def), cart.user_def) ; + printf ("Level ref. : %d\n", cart.level_reference) ; + printf ("Post timers :\n") ; + + for (k = 0 ; k < ARRAY_LEN (cart.post_timers) ; k++) + if (cart.post_timers [k].usage [0]) + printf (" %d %.*s %d\n", k, (int) sizeof (cart.post_timers [k].usage), cart.post_timers [k].usage, cart.post_timers [k].value) ; + + printf ("Reserved : %.*s\n", (int) sizeof (cart.reserved), cart.reserved) ; + printf ("Url : %.*s\n", (int) sizeof (cart.url), cart.url) ; + printf ("Tag text : %.*s\n", cart.tag_text_size, cart.tag_text) ; + + return 0 ; +} /* cart_dump */ + +static void +total_dump (void) +{ printf ("========================================\n") ; + printf ("Total Duration : %s\n", format_duration_str (total_seconds)) ; +} /* total_dump */ diff --git a/libsndfile-1.0.31/programs/sndfile-interleave.c b/libsndfile-1.0.31/programs/sndfile-interleave.c new file mode 100644 index 0000000..4c04443 --- /dev/null +++ b/libsndfile-1.0.31/programs/sndfile-interleave.c @@ -0,0 +1,202 @@ +/* +** Copyright (C) 2009-2015 Erik de Castro Lopo +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the author nor the names of any contributors may be used +** to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include + +#include "common.h" + +#define BUFFER_LEN 4096 +#define MAX_INPUTS 16 + + +typedef struct +{ SNDFILE * infile [MAX_INPUTS] ; + SNDFILE * outfile ; + + union + { double d [BUFFER_LEN] ; + int i [BUFFER_LEN] ; + } din ; + + union + + { double d [MAX_INPUTS * BUFFER_LEN] ; + int i [MAX_INPUTS * BUFFER_LEN] ; + } dout ; + + int channels ; +} STATE ; + + +static void usage_exit (void) ; +static void interleave_int (STATE * state) ; +static void interleave_double (STATE * state) ; + + +int +main (int argc, char **argv) +{ STATE state ; + SF_INFO sfinfo ; + int k, double_merge = 0 ; + + if (argc < 5) + { if (argc > 1) + puts ("\nError : need at least 2 input files.") ; + usage_exit () ; + } ; + + if (strcmp (argv [argc - 2], "-o") != 0) + { puts ("\nError : second last command line parameter should be '-o'.\n") ; + usage_exit () ; + } ; + + if (argc - 3 > MAX_INPUTS) + { printf ("\nError : Cannot handle more than %d input channels.\n\n", MAX_INPUTS) ; + exit (1) ; + } ; + + memset (&state, 0, sizeof (state)) ; + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + for (k = 1 ; k < argc - 2 ; k++) + { + if ((state.infile [k - 1] = sf_open (argv [k], SFM_READ, &sfinfo)) == NULL) + { printf ("\nError : Not able to open input file '%s'\n%s\n", argv [k], sf_strerror (NULL)) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\bError : Input file '%s' should be mono (has %d channels).\n", argv [k], sfinfo.channels) ; + exit (1) ; + } ; + + switch (sfinfo.format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_FLOAT : + case SF_FORMAT_DOUBLE : + case SF_FORMAT_VORBIS : + double_merge = 1 ; + break ; + + default : + break ; + } ; + + state.channels ++ ; + } ; + + sfinfo.channels = state.channels ; + sfinfo.format = sfe_file_type_of_ext (argv [argc - 1], sfinfo.format) ; + + if ((state.outfile = sf_open (argv [argc - 1], SFM_WRITE, &sfinfo)) == NULL) + { printf ("Not able to open output file '%s'\n%s\n", argv [argc - 1], sf_strerror (NULL)) ; + exit (1) ; + } ; + + if (double_merge) + interleave_double (&state) ; + else + interleave_int (&state) ; + + for (k = 0 ; k < MAX_INPUTS ; k++) + if (state.infile [k] != NULL) + sf_close (state.infile [k]) ; + sf_close (state.outfile) ; + + return 0 ; +} /* main */ + +/*------------------------------------------------------------------------------ +*/ + + +static void +usage_exit (void) +{ puts ("\nUsage : sndfile-interleave ... -o \n") ; + puts ("Merge two or more mono files into a single multi-channel file.\n") ; + printf ("Using %s.\n\n", sf_version_string ()) ; + exit (1) ; +} /* usage_exit */ + + +static void +interleave_int (STATE * state) +{ int max_read_len, read_len ; + int ch, k ; + + do + { max_read_len = 0 ; + + for (ch = 0 ; ch < state->channels ; ch ++) + { read_len = sf_read_int (state->infile [ch], state->din.i, BUFFER_LEN) ; + if (read_len < BUFFER_LEN) + memset (state->din.i + read_len, 0, sizeof (state->din.i [0]) * (BUFFER_LEN - read_len)) ; + + for (k = 0 ; k < BUFFER_LEN ; k++) + state->dout.i [k * state->channels + ch] = state->din.i [k] ; + + max_read_len = MAX (max_read_len, read_len) ; + } ; + + sf_writef_int (state->outfile, state->dout.i, max_read_len) ; + } + while (max_read_len > 0) ; + +} /* interleave_int */ + + +static void +interleave_double (STATE * state) +{ int max_read_len, read_len ; + int ch, k ; + + do + { max_read_len = 0 ; + + for (ch = 0 ; ch < state->channels ; ch ++) + { read_len = sf_read_double (state->infile [ch], state->din.d, BUFFER_LEN) ; + if (read_len < BUFFER_LEN) + memset (state->din.d + read_len, 0, sizeof (state->din.d [0]) * (BUFFER_LEN - read_len)) ; + + for (k = 0 ; k < BUFFER_LEN ; k++) + state->dout.d [k * state->channels + ch] = state->din.d [k] ; + + max_read_len = MAX (max_read_len, read_len) ; + } ; + + sf_writef_double (state->outfile, state->dout.d, max_read_len) ; + } + while (max_read_len > 0) ; + +} /* interleave_double */ diff --git a/libsndfile-1.0.31/programs/sndfile-metadata-get.c b/libsndfile-1.0.31/programs/sndfile-metadata-get.c new file mode 100644 index 0000000..9a09638 --- /dev/null +++ b/libsndfile-1.0.31/programs/sndfile-metadata-get.c @@ -0,0 +1,197 @@ +/* +** Copyright (C) 2008-2014 Erik de Castro Lopo +** Copyright (C) 2008-2010 George Blood Audio +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the author nor the names of any contributors may be used +** to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +#include +#include +#include +#include +#include + +#include + +#include "common.h" + +#define BUFFER_LEN (1 << 16) + +static void usage_exit (const char *progname, int exit_code) ; +static void process_args (SNDFILE * file, const SF_BROADCAST_INFO_2K * binfo, int argc, char * argv []) ; + +int +main (int argc, char *argv []) +{ SNDFILE *file ; + SF_INFO sfinfo ; + SF_BROADCAST_INFO_2K binfo ; + const char *progname ; + const char * filename = NULL ; + int start ; + + /* Store the program name. */ + progname = program_name (argv [0]) ; + + /* Check if we've been asked for help. */ + if (argc < 2 || strcmp (argv [1], "--help") == 0 || strcmp (argv [1], "-h") == 0) + usage_exit (progname, 0) ; + + if (argv [argc - 1][0] != '-') + { filename = argv [argc - 1] ; + start = 1 ; + } + else if (argv [1][0] != '-') + { filename = argv [1] ; + start = 2 ; + } + else + { printf ("Error : Either the first or the last command line parameter should be a filename.\n\n") ; + exit (1) ; + } ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) + { printf ("Error : Open of file '%s' failed : %s\n\n", filename, sf_strerror (file)) ; + exit (1) ; + } ; + + memset (&binfo, 0, sizeof (binfo)) ; + if (sf_command (file, SFC_GET_BROADCAST_INFO, &binfo, sizeof (binfo)) == 0) + memset (&binfo, 0, sizeof (binfo)) ; + + process_args (file, &binfo, argc - 2, argv + start) ; + + sf_close (file) ; + return 0 ; +} /* main */ + +/*============================================================================== +** Print version and usage. +*/ + +static void +usage_exit (const char *progname, int exit_code) +{ printf ("\nUsage :\n %s [options] \n\nOptions:\n", progname) ; + + puts ( + " --bext-description Print the 'bext' description.\n" + " --bext-originator Print the 'bext' originator info.\n" + " --bext-orig-ref Print the 'bext' origination reference.\n" + " --bext-umid Print the 'bext' UMID.\n" + " --bext-orig-date Print the 'bext' origination date.\n" + " --bext-orig-time Print the 'bext' origination time.\n" + " --bext-loudness-value Print the 'bext' loudness value.\n" + " --bext-loudness-range Print the 'bext' loudness range.\n" + " --bext-max-truepeak Print the 'bext' max. true peak level\n" + " --bext-max-momentary Print the 'bext' max. momentary loudness\n" + " --bext-max-shortterm Print the 'bext' max. short term loudness\n" + " --bext-coding-hist Print the 'bext' coding history.\n" + ) ; + + puts ( + " --str-title Print the title metadata.\n" + " --str-copyright Print the copyright metadata.\n" + " --str-artist Print the artist metadata.\n" + " --str-comment Print the comment metadata.\n" + " --str-date Print the creation date metadata.\n" + " --str-album Print the album metadata.\n" + " --str-license Print the license metadata.\n" + ) ; + + printf ("Using %s.\n\n", sf_version_string ()) ; + exit (exit_code) ; +} /* usage_exit */ + +static void +process_args (SNDFILE * file, const SF_BROADCAST_INFO_2K * binfo, int argc, char * argv []) +{ const char * str ; + int k, do_all = 0 ; + +#define HANDLE_BEXT_ARG(cmd, name, field) \ + if (do_all || strcmp (argv [k], cmd) == 0) \ + { printf ("%-22s : %.*s\n", name, (int) sizeof (binfo->field), binfo->field) ; \ + if (! do_all) \ + continue ; \ + } ; + +#define HANDLE_BEXT_ARG_INT(cmd, name, field) \ + if (do_all || strcmp (argv [k], cmd) == 0) \ + { printf ("%-22s : %6.2f\n", name, binfo->field / 100.0) ; \ + if (! do_all) \ + continue ; \ + } ; + +#define HANDLE_STR_ARG(cmd, name, id) \ + if (do_all || strcmp (argv [k], cmd) == 0) \ + { str = sf_get_string (file, id) ; \ + printf ("%-22s : %s\n", name, str ? str : "") ; \ + if (! do_all) continue ; \ + } ; + + if (argc == 0) + { do_all = 1 ; + argc = 1 ; + } ; + + for (k = 0 ; k < argc ; k++) + { if (do_all || strcmp (argv [k], "--all") == 0) + do_all = 1 ; + + HANDLE_BEXT_ARG ("--bext-description", "Description", description) ; + HANDLE_BEXT_ARG ("--bext-originator", "Originator", originator) ; + HANDLE_BEXT_ARG ("--bext-orig-ref", "Origination ref", originator_reference) ; + HANDLE_BEXT_ARG ("--bext-umid", "UMID", umid) ; + HANDLE_BEXT_ARG ("--bext-orig-date", "Origination date", origination_date) ; + HANDLE_BEXT_ARG ("--bext-orig-time", "Origination time", origination_time) ; + HANDLE_BEXT_ARG_INT ("--bext-loudness-value", "Loudness value", loudness_value) ; + HANDLE_BEXT_ARG_INT ("--bext-loudness-range", "Loudness range", loudness_range) ; + HANDLE_BEXT_ARG_INT ("--bext-max-truepeak", "Max. true peak level", max_true_peak_level) ; + HANDLE_BEXT_ARG_INT ("--bext-max-momentary", "Max. momentary level", max_momentary_loudness) ; + HANDLE_BEXT_ARG_INT ("--bext-max-shortterm", "Max. short term level", max_shortterm_loudness) ; + HANDLE_BEXT_ARG ("--bext-coding-hist", "Coding history", coding_history) ; + + HANDLE_STR_ARG ("--str-title", "Name", SF_STR_TITLE) ; + HANDLE_STR_ARG ("--str-copyright", "Copyright", SF_STR_COPYRIGHT) ; + HANDLE_STR_ARG ("--str-artist", "Artist", SF_STR_ARTIST) ; + HANDLE_STR_ARG ("--str-comment", "Comment", SF_STR_COMMENT) ; + HANDLE_STR_ARG ("--str-date", "Create date", SF_STR_DATE) ; + HANDLE_STR_ARG ("--str-album", "Album", SF_STR_ALBUM) ; + HANDLE_STR_ARG ("--str-license", "License", SF_STR_LICENSE) ; + + if (! do_all) + { printf ("Error : Don't know what to do with command line arg '%s'.\n\n", argv [k]) ; + exit (1) ; + } ; + break ; + } ; + + return ; +} /* process_args */ diff --git a/libsndfile-1.0.31/programs/sndfile-metadata-set.c b/libsndfile-1.0.31/programs/sndfile-metadata-set.c new file mode 100644 index 0000000..b1ed640 --- /dev/null +++ b/libsndfile-1.0.31/programs/sndfile-metadata-set.c @@ -0,0 +1,295 @@ +/* +** Copyright (C) 2008-2016 Erik de Castro Lopo +** Copyright (C) 2008-2010 George Blood Audio +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the author nor the names of any contributors may be used +** to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +#include +#include +#include +#include +#include + +#include + +#include "common.h" + +#define BUFFER_LEN (1 << 16) + + +static void usage_exit (const char *progname, int exit_code) ; +static void missing_param (const char * option) ; +static void read_localtime (struct tm * timedata) ; +static int has_bext_fields_set (const METADATA_INFO * info) ; + +int +main (int argc, char *argv []) +{ METADATA_INFO info ; + struct tm timedata ; + const char *progname ; + const char * filenames [2] = { NULL, NULL } ; + char date [128], time [128] ; + int k ; + + /* Store the program name. */ + progname = program_name (argv [0]) ; + + /* Check if we've been asked for help. */ + if (argc < 3 || strcmp (argv [1], "--help") == 0 || strcmp (argv [1], "-h") == 0) + usage_exit (progname, 0) ; + + /* Set all fields of the struct to zero bytes. */ + memset (&info, 0, sizeof (info)) ; + + /* Get the time in case we need it later. */ + read_localtime (&timedata) ; + + for (k = 1 ; k < argc ; k++) + { if (argv [k][0] != '-') + { if (filenames [0] == NULL) + filenames [0] = argv [k] ; + else if (filenames [1] == NULL) + filenames [1] = argv [k] ; + else + { printf ("Error : Already have two file names on the command line and then found '%s'.\n\n", argv [k]) ; + usage_exit (progname, 1) ; + } ; + continue ; + } ; + +#define HANDLE_BEXT_ARG(cmd, field) \ + if (strcmp (argv [k], cmd) == 0) \ + { k ++ ; \ + if (k == argc) missing_param (argv [k - 1]) ; \ + info.field = argv [k] ; \ + continue ; \ + } ; + + HANDLE_BEXT_ARG ("--bext-description", description) ; + HANDLE_BEXT_ARG ("--bext-originator", originator) ; + HANDLE_BEXT_ARG ("--bext-orig-ref", originator_reference) ; + HANDLE_BEXT_ARG ("--bext-umid", umid) ; + HANDLE_BEXT_ARG ("--bext-orig-date", origination_date) ; + HANDLE_BEXT_ARG ("--bext-orig-time", origination_time) ; + HANDLE_BEXT_ARG ("--bext-loudness-value", loudness_value) ; + HANDLE_BEXT_ARG ("--bext-loudness-range", loudness_range) ; + HANDLE_BEXT_ARG ("--bext-max-truepeak", max_true_peak_level) ; + HANDLE_BEXT_ARG ("--bext-max-momentary", max_momentary_loudness) ; + HANDLE_BEXT_ARG ("--bext-max-shortterm", max_shortterm_loudness) ; + HANDLE_BEXT_ARG ("--bext-coding-hist", coding_history) ; + HANDLE_BEXT_ARG ("--bext-time-ref", time_ref) ; + +#define HANDLE_STR_ARG(cmd, field) \ + if (strcmp (argv [k], cmd) == 0) \ + { k ++ ; \ + if (k == argc) missing_param (argv [k - 1]) ; \ + info.field = argv [k] ; \ + continue ; \ + } ; + + HANDLE_STR_ARG ("--str-comment", comment) ; + HANDLE_STR_ARG ("--str-title", title) ; + HANDLE_STR_ARG ("--str-copyright", copyright) ; + HANDLE_STR_ARG ("--str-artist", artist) ; + HANDLE_STR_ARG ("--str-date", date) ; + HANDLE_STR_ARG ("--str-album", album) ; + HANDLE_STR_ARG ("--str-license", license) ; + + /* Following options do not take an argument. */ + if (strcmp (argv [k], "--bext-auto-time-date") == 0) + { snprintf (time, sizeof (time), "%02d:%02d:%02d", timedata.tm_hour, timedata.tm_min, timedata.tm_sec) ; + info.origination_time = time ; + + snprintf (date, sizeof (date), "%04d-%02d-%02d", timedata.tm_year + 1900, timedata.tm_mon + 1, timedata.tm_mday) ; + info.origination_date = date ; + continue ; + } ; + + if (strcmp (argv [k], "--bext-auto-time") == 0) + { snprintf (time, sizeof (time), "%02d:%02d:%02d", timedata.tm_hour, timedata.tm_min, timedata.tm_sec) ; + info.origination_time = time ; + continue ; + } ; + + if (strcmp (argv [k], "--bext-auto-date") == 0) + { snprintf (date, sizeof (date), "%04d-%02d-%02d", timedata.tm_year + 1900, timedata.tm_mon + 1, timedata.tm_mday) ; + info.origination_date = strdup (date) ; + continue ; + } ; + + if (strcmp (argv [k], "--str-auto-date") == 0) + { snprintf (date, sizeof (date), "%04d-%02d-%02d", timedata.tm_year + 1900, timedata.tm_mon + 1, timedata.tm_mday) ; + + info.date = strdup (date) ; + continue ; + } ; + + printf ("Error : Don't know what to do with command line arg '%s'.\n\n", argv [k]) ; + usage_exit (progname, 1) ; + } ; + + /* Find out if any of the 'bext' fields are set. */ + info.has_bext_fields = has_bext_fields_set (&info) ; + + if (filenames [0] == NULL) + { printf ("Error : No input file specificed.\n\n") ; + exit (1) ; + } ; + + if (filenames [1] != NULL && strcmp (filenames [0], filenames [1]) == 0) + { printf ("Error : Input and output files are the same.\n\n") ; + exit (1) ; + } ; + + if (info.coding_history != NULL && filenames [1] == NULL) + { printf ("\n" + "Error : Trying to update coding history of an existing file which unfortunately\n" + " is not supported. Instead, create a new file using :\n" + "\n" + " %s --bext-coding-hist \"Coding history\" old_file.wav new_file.wav\n" + "\n", + progname) ; + exit (1) ; + } ; + + sfe_apply_metadata_changes (filenames, &info) ; + + return 0 ; +} /* main */ + +/*============================================================================== +** Print version and usage. +*/ + +static void +usage_exit (const char *progname, int exit_code) +{ printf ("\nUsage :\n\n" + " %s [options] \n" + " %s [options] \n" + "\n", + progname, progname) ; + + puts ( + "Where an option is made up of a pair of a field to set (one of\n" + "the 'bext' or metadata fields below) and a string. Fields are\n" + "as follows :\n" + ) ; + + puts ( + " --bext-description Set the 'bext' description.\n" + " --bext-originator Set the 'bext' originator.\n" + " --bext-orig-ref Set the 'bext' originator reference.\n" + " --bext-umid Set the 'bext' UMID.\n" + " --bext-orig-date Set the 'bext' origination date.\n" + " --bext-orig-time Set the 'bext' origination time.\n" + " --bext-loudness-value Set the 'bext' loudness value.\n" + " --bext-loudness-range Set the 'bext' loudness range.\n" + " --bext-max-truepeak Set the 'bext' max. true peak level\n" + " --bext-max-momentary Set the 'bext' max. momentary loudness\n" + " --bext-max-shortterm Set the 'bext' max. short term loudness\n" + " --bext-coding-hist Set the 'bext' coding history.\n" + " --bext-time-ref Set the 'bext' Time ref.\n" + "\n" + " --str-comment Set the metadata comment.\n" + " --str-title Set the metadata title.\n" + " --str-copyright Set the metadata copyright.\n" + " --str-artist Set the metadata artist.\n" + " --str-date Set the metadata date.\n" + " --str-album Set the metadata album.\n" + " --str-license Set the metadata license.\n" + ) ; + + puts ( + "There are also the following arguments which do not take a\n" + "parameter :\n\n" + " --bext-auto-time-date Set the 'bext' time and date to current time/date.\n" + " --bext-auto-time Set the 'bext' time to current time.\n" + " --bext-auto-date Set the 'bext' date to current date.\n" + " --str-auto-date Set the metadata date to current date.\n" + ) ; + + puts ( + "Most of the above operations can be done in-place on an existing\n" + "file. If any operation cannot be performed, the application will\n" + "exit with an appropriate error message.\n" + ) ; + + printf ("Using %s.\n\n", sf_version_string ()) ; + exit (exit_code) ; +} /* usage_exit */ + +static void +missing_param (const char * option) +{ + printf ("Error : Option '%s' needs a parameter but doesn't seem to have one.\n\n", option) ; + exit (1) ; +} /* missing_param */ + +/*============================================================================== +*/ + +static int +has_bext_fields_set (const METADATA_INFO * info) +{ + if (info->description || info->originator || info->originator_reference) + return 1 ; + + if (info->origination_date || info->origination_time || info->umid || info->coding_history || info->time_ref) + return 1 ; + + if (info->loudness_value || info->loudness_range || info->max_true_peak_level || info->max_momentary_loudness || info->max_shortterm_loudness) + return 1 ; + + return 0 ; +} /* has_bext_fields_set */ + +static void +read_localtime (struct tm * timedata) +{ time_t current ; + + time (¤t) ; + memset (timedata, 0, sizeof (struct tm)) ; + +#if defined (HAVE_LOCALTIME_R) + /* If the re-entrant version is available, use it. */ + localtime_r (¤t, timedata) ; +#elif defined (HAVE_LOCALTIME) + { + struct tm *tmptr ; + /* Otherwise use the standard one and copy the data to local storage. */ + if ((tmptr = localtime (¤t)) != NULL) + memcpy (timedata, tmptr, sizeof (struct tm)) ; + } +#endif + + return ; +} /* read_localtime */ diff --git a/libsndfile-1.0.31/programs/sndfile-play.c b/libsndfile-1.0.31/programs/sndfile-play.c new file mode 100644 index 0000000..cd5cc27 --- /dev/null +++ b/libsndfile-1.0.31/programs/sndfile-play.c @@ -0,0 +1,860 @@ +/* +** Copyright (C) 1999-2018 Erik de Castro Lopo +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the author nor the names of any contributors may be used +** to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "common.h" + +#if HAVE_ALSA_ASOUNDLIB_H + #define ALSA_PCM_NEW_HW_PARAMS_API + #define ALSA_PCM_NEW_SW_PARAMS_API + #include + #include +#endif + +#if defined (__ANDROID__) + +#elif defined (__linux__) || defined (__FreeBSD_kernel__) || defined (__FreeBSD__) + #include + #include + #include + +#elif HAVE_SNDIO_H + #include + +#elif (defined (sun) && defined (unix)) + #include + #include + #include + +#elif (OS_IS_WIN32 == 1) + #include + #include + +#endif + +#define SIGNED_SIZEOF(x) ((int) sizeof (x)) +#define BUFFER_LEN (2048) + +/*------------------------------------------------------------------------------ +** Linux/OSS functions for playing a sound. +*/ + +#if HAVE_ALSA_ASOUNDLIB_H + +static snd_pcm_t * alsa_open (int channels, unsigned srate, int realtime) ; +static int alsa_write_float (snd_pcm_t *alsa_dev, float *data, int frames, int channels) ; + +static void +alsa_play (int argc, char *argv []) +{ static float buffer [BUFFER_LEN] ; + SNDFILE *sndfile ; + SF_INFO sfinfo ; + snd_pcm_t * alsa_dev ; + int k, readcount, subformat ; + + for (k = 1 ; k < argc ; k++) + { memset (&sfinfo, 0, sizeof (sfinfo)) ; + + printf ("Playing %s\n", argv [k]) ; + if (! (sndfile = sf_open (argv [k], SFM_READ, &sfinfo))) + { puts (sf_strerror (NULL)) ; + continue ; + } ; + + if (sfinfo.channels < 1 || sfinfo.channels > 2) + { printf ("Error : channels = %d.\n", sfinfo.channels) ; + continue ; + } ; + + if ((alsa_dev = alsa_open (sfinfo.channels, (unsigned) sfinfo.samplerate, SF_FALSE)) == NULL) + continue ; + + subformat = sfinfo.format & SF_FORMAT_SUBMASK ; + + if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) + { double scale ; + int m ; + + sf_command (sndfile, SFC_CALC_SIGNAL_MAX, &scale, sizeof (scale)) ; + if (scale > 1.0) + scale = 1.0 / scale ; + else + scale = 1.0 ; + + while ((readcount = sf_read_float (sndfile, buffer, BUFFER_LEN))) + { for (m = 0 ; m < readcount ; m++) + buffer [m] *= scale ; + alsa_write_float (alsa_dev, buffer, BUFFER_LEN / sfinfo.channels, sfinfo.channels) ; + } ; + } + else + { while ((readcount = sf_read_float (sndfile, buffer, BUFFER_LEN))) + alsa_write_float (alsa_dev, buffer, BUFFER_LEN / sfinfo.channels, sfinfo.channels) ; + } ; + + snd_pcm_drain (alsa_dev) ; + snd_pcm_close (alsa_dev) ; + + sf_close (sndfile) ; + } ; + + return ; +} /* alsa_play */ + +static snd_pcm_t * +alsa_open (int channels, unsigned samplerate, int realtime) +{ const char * device = "default" ; + snd_pcm_t *alsa_dev = NULL ; + snd_pcm_hw_params_t *hw_params ; + snd_pcm_uframes_t buffer_size ; + snd_pcm_uframes_t alsa_period_size, alsa_buffer_frames ; + snd_pcm_sw_params_t *sw_params ; + + int err ; + + if (realtime) + { alsa_period_size = 256 ; + alsa_buffer_frames = 3 * alsa_period_size ; + } + else + { alsa_period_size = 1024 ; + alsa_buffer_frames = 4 * alsa_period_size ; + } ; + + if ((err = snd_pcm_open (&alsa_dev, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) + { fprintf (stderr, "cannot open audio device \"%s\" (%s)\n", device, snd_strerror (err)) ; + goto catch_error ; + } ; + + snd_pcm_nonblock (alsa_dev, 0) ; + + if ((err = snd_pcm_hw_params_malloc (&hw_params)) < 0) + { fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n", snd_strerror (err)) ; + goto catch_error ; + } ; + + if ((err = snd_pcm_hw_params_any (alsa_dev, hw_params)) < 0) + { fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n", snd_strerror (err)) ; + goto catch_error ; + } ; + + if ((err = snd_pcm_hw_params_set_access (alsa_dev, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) + { fprintf (stderr, "cannot set access type (%s)\n", snd_strerror (err)) ; + goto catch_error ; + } ; + + if ((err = snd_pcm_hw_params_set_format (alsa_dev, hw_params, SND_PCM_FORMAT_FLOAT)) < 0) + { fprintf (stderr, "cannot set sample format (%s)\n", snd_strerror (err)) ; + goto catch_error ; + } ; + + if ((err = snd_pcm_hw_params_set_rate_near (alsa_dev, hw_params, &samplerate, 0)) < 0) + { fprintf (stderr, "cannot set sample rate (%s)\n", snd_strerror (err)) ; + goto catch_error ; + } ; + + if ((err = snd_pcm_hw_params_set_channels (alsa_dev, hw_params, channels)) < 0) + { fprintf (stderr, "cannot set channel count (%s)\n", snd_strerror (err)) ; + goto catch_error ; + } ; + + if ((err = snd_pcm_hw_params_set_buffer_size_near (alsa_dev, hw_params, &alsa_buffer_frames)) < 0) + { fprintf (stderr, "cannot set buffer size (%s)\n", snd_strerror (err)) ; + goto catch_error ; + } ; + + if ((err = snd_pcm_hw_params_set_period_size_near (alsa_dev, hw_params, &alsa_period_size, 0)) < 0) + { fprintf (stderr, "cannot set period size (%s)\n", snd_strerror (err)) ; + goto catch_error ; + } ; + + if ((err = snd_pcm_hw_params (alsa_dev, hw_params)) < 0) + { fprintf (stderr, "cannot set parameters (%s)\n", snd_strerror (err)) ; + goto catch_error ; + } ; + + /* extra check: if we have only one period, this code won't work */ + snd_pcm_hw_params_get_period_size (hw_params, &alsa_period_size, 0) ; + snd_pcm_hw_params_get_buffer_size (hw_params, &buffer_size) ; + if (alsa_period_size == buffer_size) + { fprintf (stderr, "Can't use period equal to buffer size (%lu == %lu)", alsa_period_size, buffer_size) ; + goto catch_error ; + } ; + + snd_pcm_hw_params_free (hw_params) ; + + if ((err = snd_pcm_sw_params_malloc (&sw_params)) != 0) + { fprintf (stderr, "%s: snd_pcm_sw_params_malloc: %s", __func__, snd_strerror (err)) ; + goto catch_error ; + } ; + + if ((err = snd_pcm_sw_params_current (alsa_dev, sw_params)) != 0) + { fprintf (stderr, "%s: snd_pcm_sw_params_current: %s", __func__, snd_strerror (err)) ; + goto catch_error ; + } ; + + /* note: set start threshold to delay start until the ring buffer is full */ + snd_pcm_sw_params_current (alsa_dev, sw_params) ; + + if ((err = snd_pcm_sw_params_set_start_threshold (alsa_dev, sw_params, buffer_size)) < 0) + { fprintf (stderr, "cannot set start threshold (%s)\n", snd_strerror (err)) ; + goto catch_error ; + } ; + + if ((err = snd_pcm_sw_params (alsa_dev, sw_params)) != 0) + { fprintf (stderr, "%s: snd_pcm_sw_params: %s", __func__, snd_strerror (err)) ; + goto catch_error ; + } ; + + snd_pcm_sw_params_free (sw_params) ; + + snd_pcm_reset (alsa_dev) ; + +catch_error : + + if (err < 0 && alsa_dev != NULL) + { snd_pcm_close (alsa_dev) ; + return NULL ; + } ; + + return alsa_dev ; +} /* alsa_open */ + +static int +alsa_write_float (snd_pcm_t *alsa_dev, float *data, int frames, int channels) +{ static int epipe_count = 0 ; + + int total = 0 ; + int retval ; + + if (epipe_count > 0) + epipe_count -- ; + + while (total < frames) + { retval = snd_pcm_writei (alsa_dev, data + total * channels, frames - total) ; + + if (retval >= 0) + { total += retval ; + if (total == frames) + return total ; + + continue ; + } ; + + switch (retval) + { case -EAGAIN : + puts ("alsa_write_float: EAGAIN") ; + continue ; + break ; + + case -EPIPE : + if (epipe_count > 0) + { printf ("alsa_write_float: EPIPE %d\n", epipe_count) ; + if (epipe_count > 140) + return retval ; + } ; + epipe_count += 100 ; + +#if 0 + if (0) + { snd_pcm_status_t *status ; + + snd_pcm_status_alloca (&status) ; + if ((retval = snd_pcm_status (alsa_dev, status)) < 0) + fprintf (stderr, "alsa_out: xrun. can't determine length\n") ; + else if (snd_pcm_status_get_state (status) == SND_PCM_STATE_XRUN) + { struct timeval now, diff, tstamp ; + + gettimeofday (&now, 0) ; + snd_pcm_status_get_trigger_tstamp (status, &tstamp) ; + timersub (&now, &tstamp, &diff) ; + + fprintf (stderr, "alsa_write_float xrun: of at least %.3f msecs. resetting stream\n", + diff.tv_sec * 1000 + diff.tv_usec / 1000.0) ; + } + else + fprintf (stderr, "alsa_write_float: xrun. can't determine length\n") ; + } ; +#endif + + snd_pcm_prepare (alsa_dev) ; + break ; + + case -EBADFD : + fprintf (stderr, "alsa_write_float: Bad PCM state.n") ; + return 0 ; + break ; + + case -ESTRPIPE : + fprintf (stderr, "alsa_write_float: Suspend event.n") ; + return 0 ; + break ; + + case -EIO : + puts ("alsa_write_float: EIO") ; + return 0 ; + + default : + fprintf (stderr, "alsa_write_float: retval = %d\n", retval) ; + return 0 ; + break ; + } ; /* switch */ + } ; /* while */ + + return total ; +} /* alsa_write_float */ + +#endif /* HAVE_ALSA_ASOUNDLIB_H */ + +/*------------------------------------------------------------------------------ +** Linux/OSS functions for playing a sound. +*/ + +#if !defined (__ANDROID__) && (defined (__linux__) || defined (__FreeBSD_kernel__) || defined (__FreeBSD__)) + +static int opensoundsys_open_device (int channels, int srate) ; + +static int +opensoundsys_play (int argc, char *argv []) +{ static short buffer [BUFFER_LEN] ; + SNDFILE *sndfile ; + SF_INFO sfinfo ; + int k, audio_device, readcount, writecount, subformat ; + + for (k = 1 ; k < argc ; k++) + { memset (&sfinfo, 0, sizeof (sfinfo)) ; + + printf ("Playing %s\n", argv [k]) ; + if (! (sndfile = sf_open (argv [k], SFM_READ, &sfinfo))) + { puts (sf_strerror (NULL)) ; + continue ; + } ; + + if (sfinfo.channels < 1 || sfinfo.channels > 2) + { printf ("Error : channels = %d.\n", sfinfo.channels) ; + continue ; + } ; + + audio_device = opensoundsys_open_device (sfinfo.channels, sfinfo.samplerate) ; + + subformat = sfinfo.format & SF_FORMAT_SUBMASK ; + + if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) + { static float float_buffer [BUFFER_LEN] ; + double scale ; + int m ; + + sf_command (sndfile, SFC_CALC_SIGNAL_MAX, &scale, sizeof (scale)) ; + if (scale < 1e-10) + scale = 1.0 ; + else + scale = 32700.0 / scale ; + + while ((readcount = sf_read_float (sndfile, float_buffer, BUFFER_LEN))) + { for (m = 0 ; m < readcount ; m++) + buffer [m] = scale * float_buffer [m] ; + writecount = write (audio_device, buffer, readcount * sizeof (short)) ; + } ; + } + else + { while ((readcount = sf_read_short (sndfile, buffer, BUFFER_LEN))) + writecount = write (audio_device, buffer, readcount * sizeof (short)) ; + } ; + + if (ioctl (audio_device, SNDCTL_DSP_POST, 0) == -1) + perror ("ioctl (SNDCTL_DSP_POST) ") ; + + if (ioctl (audio_device, SNDCTL_DSP_SYNC, 0) == -1) + perror ("ioctl (SNDCTL_DSP_SYNC) ") ; + + close (audio_device) ; + + sf_close (sndfile) ; + } ; + + return writecount ; +} /* opensoundsys_play */ + +static int +opensoundsys_open_device (int channels, int srate) +{ int fd, stereo, fmt ; + + if ((fd = open ("/dev/dsp", O_WRONLY, 0)) == -1 && + (fd = open ("/dev/sound/dsp", O_WRONLY, 0)) == -1) + { perror ("opensoundsys_open_device : open ") ; + exit (1) ; + } ; + + stereo = 0 ; + if (ioctl (fd, SNDCTL_DSP_STEREO, &stereo) == -1) + { /* Fatal error */ + perror ("opensoundsys_open_device : stereo ") ; + exit (1) ; + } ; + + if (ioctl (fd, SNDCTL_DSP_RESET, 0)) + { perror ("opensoundsys_open_device : reset ") ; + exit (1) ; + } ; + + fmt = CPU_IS_BIG_ENDIAN ? AFMT_S16_BE : AFMT_S16_LE ; + if (ioctl (fd, SNDCTL_DSP_SETFMT, &fmt) != 0) + { perror ("opensoundsys_open_device : set format ") ; + exit (1) ; + } ; + + if (ioctl (fd, SNDCTL_DSP_CHANNELS, &channels) != 0) + { perror ("opensoundsys_open_device : channels ") ; + exit (1) ; + } ; + + if (ioctl (fd, SNDCTL_DSP_SPEED, &srate) != 0) + { perror ("opensoundsys_open_device : sample rate ") ; + exit (1) ; + } ; + + if (ioctl (fd, SNDCTL_DSP_SYNC, 0) != 0) + { perror ("opensoundsys_open_device : sync ") ; + exit (1) ; + } ; + + return fd ; +} /* opensoundsys_open_device */ + +#endif /* __linux__ */ + +/*------------------------------------------------------------------------------ +** Mac OS X functions for playing a sound. +*/ + +/* MacOSX 10.8 use a new Audio API. Someone needs to write some code for it. */ + +/*------------------------------------------------------------------------------ +** Win32 functions for playing a sound. +** +** This API sucks. Its needlessly complicated and is *WAY* too loose with +** passing pointers around in integers and using char* pointers to +** point to data instead of short*. It plain sucks! +*/ + +#if (OS_IS_WIN32 == 1) + +#define WIN32_BUFFER_LEN (1 << 15) + +typedef struct +{ HWAVEOUT hwave ; + WAVEHDR whdr [2] ; + + CRITICAL_SECTION mutex ; /* to control access to BuffersInUSe */ + HANDLE Event ; /* signal that a buffer is free */ + + short buffer [WIN32_BUFFER_LEN / sizeof (short)] ; + int current, bufferlen ; + int BuffersInUse ; + + SNDFILE *sndfile ; + SF_INFO sfinfo ; + + sf_count_t remaining ; +} Win32_Audio_Data ; + + +static void +win32_play_data (Win32_Audio_Data *audio_data) +{ int thisread, readcount ; + + /* fill a buffer if there is more data and we can read it sucessfully */ + readcount = (audio_data->remaining > audio_data->bufferlen) ? audio_data->bufferlen : (int) audio_data->remaining ; + + short *lpData = (short *) (void *) audio_data->whdr [audio_data->current].lpData ; + thisread = (int) sf_read_short (audio_data->sndfile, lpData, readcount) ; + + audio_data->remaining -= thisread ; + + if (thisread > 0) + { /* Fix buffer length if this is only a partial block. */ + if (thisread < audio_data->bufferlen) + audio_data->whdr [audio_data->current].dwBufferLength = thisread * sizeof (short) ; + + /* Queue the WAVEHDR */ + waveOutWrite (audio_data->hwave, (LPWAVEHDR) &(audio_data->whdr [audio_data->current]), sizeof (WAVEHDR)) ; + + /* count another buffer in use */ + EnterCriticalSection (&audio_data->mutex) ; + audio_data->BuffersInUse ++ ; + LeaveCriticalSection (&audio_data->mutex) ; + + /* use the other buffer next time */ + audio_data->current = (audio_data->current + 1) % 2 ; + } ; + + return ; +} /* win32_play_data */ + +static void CALLBACK +win32_audio_out_callback (HWAVEOUT hwave, UINT msg, DWORD_PTR data, DWORD param1, DWORD param2) +{ Win32_Audio_Data *audio_data ; + + /* Prevent compiler warnings. */ + (void) hwave ; + (void) param1 ; + (void) param2 ; + + if (data == 0) + return ; + + /* + ** I consider this technique of passing a pointer via an integer as + ** fundamentally broken but thats the way microsoft has defined the + ** interface. + */ + audio_data = (Win32_Audio_Data*) data ; + + /* let main loop know a buffer is free */ + if (msg == MM_WOM_DONE) + { EnterCriticalSection (&audio_data->mutex) ; + audio_data->BuffersInUse -- ; + LeaveCriticalSection (&audio_data->mutex) ; + SetEvent (audio_data->Event) ; + } ; + + return ; +} /* win32_audio_out_callback */ + +static void +win32_play (int argc, char *argv []) +{ Win32_Audio_Data audio_data ; + + WAVEFORMATEX wf ; + int k, error ; + + audio_data.sndfile = NULL ; + audio_data.hwave = 0 ; + + for (k = 1 ; k < argc ; k++) + { printf ("Playing %s\n", argv [k]) ; + + if (! (audio_data.sndfile = sf_open (argv [k], SFM_READ, &(audio_data.sfinfo)))) + { puts (sf_strerror (NULL)) ; + continue ; + } ; + + audio_data.remaining = audio_data.sfinfo.frames * audio_data.sfinfo.channels ; + audio_data.current = 0 ; + + InitializeCriticalSection (&audio_data.mutex) ; + audio_data.Event = CreateEvent (0, FALSE, FALSE, 0) ; + + wf.nChannels = audio_data.sfinfo.channels ; + wf.wFormatTag = WAVE_FORMAT_PCM ; + wf.cbSize = 0 ; + wf.wBitsPerSample = 16 ; + + wf.nSamplesPerSec = audio_data.sfinfo.samplerate ; + + wf.nBlockAlign = audio_data.sfinfo.channels * sizeof (short) ; + + wf.nAvgBytesPerSec = wf.nBlockAlign * wf.nSamplesPerSec ; + + error = waveOutOpen (&(audio_data.hwave), WAVE_MAPPER, &wf, (DWORD_PTR) win32_audio_out_callback, + (DWORD_PTR) &audio_data, CALLBACK_FUNCTION) ; + if (error) + { puts ("waveOutOpen failed.") ; + audio_data.hwave = 0 ; + continue ; + } ; + + audio_data.whdr [0].lpData = (char*) audio_data.buffer ; + audio_data.whdr [1].lpData = ((char*) audio_data.buffer) + sizeof (audio_data.buffer) / 2 ; + + audio_data.whdr [0].dwBufferLength = sizeof (audio_data.buffer) / 2 ; + audio_data.whdr [1].dwBufferLength = sizeof (audio_data.buffer) / 2 ; + + audio_data.whdr [0].dwFlags = 0 ; + audio_data.whdr [1].dwFlags = 0 ; + + /* length of each audio buffer in samples */ + audio_data.bufferlen = sizeof (audio_data.buffer) / 2 / sizeof (short) ; + + /* Prepare the WAVEHDRs */ + if ((error = waveOutPrepareHeader (audio_data.hwave, &(audio_data.whdr [0]), sizeof (WAVEHDR)))) + { printf ("waveOutPrepareHeader [0] failed : %08X\n", error) ; + waveOutClose (audio_data.hwave) ; + continue ; + } ; + + if ((error = waveOutPrepareHeader (audio_data.hwave, &(audio_data.whdr [1]), sizeof (WAVEHDR)))) + { printf ("waveOutPrepareHeader [1] failed : %08X\n", error) ; + waveOutUnprepareHeader (audio_data.hwave, &(audio_data.whdr [0]), sizeof (WAVEHDR)) ; + waveOutClose (audio_data.hwave) ; + continue ; + } ; + + /* Fill up both buffers with audio data */ + audio_data.BuffersInUse = 0 ; + win32_play_data (&audio_data) ; + win32_play_data (&audio_data) ; + + /* loop until both buffers are released */ + while (audio_data.BuffersInUse > 0) + { + /* wait for buffer to be released */ + WaitForSingleObject (audio_data.Event, INFINITE) ; + + /* refill the buffer if there is more data to play */ + win32_play_data (&audio_data) ; + } ; + + waveOutUnprepareHeader (audio_data.hwave, &(audio_data.whdr [0]), sizeof (WAVEHDR)) ; + waveOutUnprepareHeader (audio_data.hwave, &(audio_data.whdr [1]), sizeof (WAVEHDR)) ; + + waveOutClose (audio_data.hwave) ; + audio_data.hwave = 0 ; + + DeleteCriticalSection (&audio_data.mutex) ; + + sf_close (audio_data.sndfile) ; + } ; + +} /* win32_play */ + +#endif /* Win32 */ + +/*------------------------------------------------------------------------------ +** OpenBSD's sndio. +*/ + +#if HAVE_SNDIO_H + +static void +sndio_play (int argc, char *argv []) +{ struct sio_hdl *hdl ; + struct sio_par par ; + short buffer [BUFFER_LEN] ; + SNDFILE *sndfile ; + SF_INFO sfinfo ; + int k, readcount ; + + for (k = 1 ; k < argc ; k++) + { printf ("Playing %s\n", argv [k]) ; + if (! (sndfile = sf_open (argv [k], SFM_READ, &sfinfo))) + { puts (sf_strerror (NULL)) ; + continue ; + } ; + + if (sfinfo.channels < 1 || sfinfo.channels > 2) + { printf ("Error : channels = %d.\n", sfinfo.channels) ; + continue ; + } ; + + if ((hdl = sio_open (NULL, SIO_PLAY, 0)) == NULL) + { fprintf (stderr, "open sndio device failed") ; + return ; + } ; + + sio_initpar (&par) ; + par.rate = sfinfo.samplerate ; + par.pchan = sfinfo.channels ; + par.bits = 16 ; + par.sig = 1 ; + par.le = SIO_LE_NATIVE ; + + if (! sio_setpar (hdl, &par) || ! sio_getpar (hdl, &par)) + { fprintf (stderr, "set sndio params failed") ; + return ; + } ; + + if (! sio_start (hdl)) + { fprintf (stderr, "sndio start failed") ; + return ; + } ; + + while ((readcount = sf_read_short (sndfile, buffer, BUFFER_LEN))) + sio_write (hdl, buffer, readcount * sizeof (short)) ; + + sio_close (hdl) ; + } ; + + return ; +} /* sndio_play */ + +#endif /* sndio */ + +/*------------------------------------------------------------------------------ +** Solaris. +*/ + +#if (defined (sun) && defined (unix)) /* ie Solaris */ + +static void +solaris_play (int argc, char *argv []) +{ static short buffer [BUFFER_LEN] ; + audio_info_t audio_info ; + SNDFILE *sndfile ; + SF_INFO sfinfo ; + unsigned long delay_time ; + long k, start_count, output_count, write_count, read_count ; + int audio_fd, error, done ; + + for (k = 1 ; k < argc ; k++) + { printf ("Playing %s\n", argv [k]) ; + if (! (sndfile = sf_open (argv [k], SFM_READ, &sfinfo))) + { puts (sf_strerror (NULL)) ; + continue ; + } ; + + if (sfinfo.channels < 1 || sfinfo.channels > 2) + { printf ("Error : channels = %d.\n", sfinfo.channels) ; + continue ; + } ; + + /* open the audio device - write only, non-blocking */ + if ((audio_fd = open ("/dev/audio", O_WRONLY | O_NONBLOCK)) < 0) + { perror ("open (/dev/audio) failed") ; + return ; + } ; + + /* Retrive standard values. */ + AUDIO_INITINFO (&audio_info) ; + + audio_info.play.sample_rate = sfinfo.samplerate ; + audio_info.play.channels = sfinfo.channels ; + audio_info.play.precision = 16 ; + audio_info.play.encoding = AUDIO_ENCODING_LINEAR ; + audio_info.play.gain = AUDIO_MAX_GAIN ; + audio_info.play.balance = AUDIO_MID_BALANCE ; + + if ((error = ioctl (audio_fd, AUDIO_SETINFO, &audio_info))) + { perror ("ioctl (AUDIO_SETINFO) failed") ; + return ; + } ; + + /* Delay time equal to 1/4 of a buffer in microseconds. */ + delay_time = (BUFFER_LEN * 1000000) / (audio_info.play.sample_rate * 4) ; + + done = 0 ; + while (! done) + { read_count = sf_read_short (sndfile, buffer, BUFFER_LEN) ; + if (read_count < BUFFER_LEN) + { memset (&(buffer [read_count]), 0, (BUFFER_LEN - read_count) * sizeof (short)) ; + /* Tell the main application to terminate. */ + done = SF_TRUE ; + } ; + + start_count = 0 ; + output_count = BUFFER_LEN * sizeof (short) ; + + while (output_count > 0) + { /* write as much data as possible */ + write_count = write (audio_fd, &(buffer [start_count]), output_count) ; + if (write_count > 0) + { output_count -= write_count ; + start_count += write_count ; + } + else + { /* Give the audio output time to catch up. */ + usleep (delay_time) ; + } ; + } ; /* while (outpur_count > 0) */ + } ; /* while (! done) */ + + close (audio_fd) ; + } ; + + return ; +} /* solaris_play */ + +#endif /* Solaris */ + +/*============================================================================== +** Main function. +*/ + +int +main (int argc, char *argv []) +{ + if (argc < 2) + { + printf ("\nUsage : %s \n\n", program_name (argv [0])) ; + printf ("Using %s.\n\n", sf_version_string ()) ; +#if (OS_IS_WIN32 == 1) + printf ("This is a Unix style command line application which\n" + "should be run in a MSDOS box or Command Shell window.\n\n") ; + printf ("Sleeping for 5 seconds before exiting.\n\n") ; + + Sleep (5 * 1000) ; +#endif + return 1 ; + } ; + +#if defined (__ANDROID__) + puts ("*** Playing sound not yet supported on Android.") ; + puts ("*** Please feel free to submit a patch.") ; + return 1 ; +#elif defined (__linux__) + #if HAVE_ALSA_ASOUNDLIB_H + if (access ("/proc/asound/cards", R_OK) == 0) + alsa_play (argc, argv) ; + else + #endif + opensoundsys_play (argc, argv) ; +#elif defined (__FreeBSD_kernel__) || defined (__FreeBSD__) + opensoundsys_play (argc, argv) ; +#elif HAVE_SNDIO_H + sndio_play (argc, argv) ; +#elif (defined (sun) && defined (unix)) + solaris_play (argc, argv) ; +#elif (OS_IS_WIN32 == 1) + win32_play (argc, argv) ; +#else + puts ("*** Playing sound not supported on this platform.") ; + puts ("*** Please feel free to submit a patch.") ; + return 1 ; +#endif + + return 0 ; +} /* main */ + diff --git a/libsndfile-1.0.31/programs/sndfile-salvage.c b/libsndfile-1.0.31/programs/sndfile-salvage.c new file mode 100644 index 0000000..9c21d52 --- /dev/null +++ b/libsndfile-1.0.31/programs/sndfile-salvage.c @@ -0,0 +1,283 @@ +/* +** Copyright (C) 2010-2014 Erik de Castro Lopo +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the author nor the names of any contributors may be used +** to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include +#include +#include +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif +#include +#include +#include + +#include + +#include "common.h" + +#define BUFFER_LEN (1 << 16) + +#define NOT(x) (! (x)) + + +static void usage_exit (const char *progname) ; +static void salvage_file (const char * broken_wav, const char * fixed_w64) ; + +int +main (int argc, char *argv []) +{ + if (argc != 3) + usage_exit (program_name (argv [0])) ; + + salvage_file (argv [1], argv [2]) ; + + return 0 ; +} /* main */ + +/*============================================================================== +*/ + +static void lseek_or_die (int fd, off_t offset, int whence) ; +static sf_count_t get_file_length (int fd, const char * name) ; +static sf_count_t find_data_offset (int fd, int format) ; +static void copy_data (int fd, SNDFILE * sndfile, int readsize) ; + + +static void +usage_exit (const char *progname) +{ printf ("Usage :\n\n %s \n\n", progname) ; + puts ("Salvages the audio data from WAV files which are more than 4G in length.\n") ; + printf ("Using %s.\n\n", sf_version_string ()) ; + exit (1) ; +} /* usage_exit */ + +static void +salvage_file (const char * broken_wav, const char * fixed_w64) +{ SNDFILE * sndfile ; + SF_INFO sfinfo ; + sf_count_t broken_len, data_offset ; + int fd, read_size ; + + if (strcmp (broken_wav, fixed_w64) == 0) + { printf ("Error : Input and output files must be different.\n\n") ; + exit (1) ; + } ; + + if ((fd = open (broken_wav, O_RDONLY)) < 0) + { printf ("Error : Not able to open file '%s' : %s\n", broken_wav, strerror (errno)) ; + exit (1) ; + } ; + + broken_len = get_file_length (fd, broken_wav) ; + if (broken_len <= 0xffffffff) + printf ("File is not greater than 4Gig but salvaging anyway.\n") ; + + /* Grab the format info from the broken file. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + if ((sndfile = sf_open (broken_wav, SFM_READ, &sfinfo)) == NULL) + { printf ("sf_open ('%s') failed : %s\n", broken_wav, sf_strerror (NULL)) ; + exit (1) ; + } ; + sf_close (sndfile) ; + + data_offset = find_data_offset (fd, sfinfo.format & SF_FORMAT_TYPEMASK) ; + + printf ("Offset to audio data : %" PRId64 "\n", data_offset) ; + + switch (sfinfo.format & SF_FORMAT_TYPEMASK) + { case SF_FORMAT_WAV : + case SF_FORMAT_WAVEX : + sfinfo.format = SF_FORMAT_W64 | (sfinfo.format & SF_FORMAT_SUBMASK) ; + break ; + + default : + printf ("Don't currently support this file type.\n") ; + exit (1) ; + } ; + + switch (sfinfo.format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_PCM_U8 : + case SF_FORMAT_PCM_S8 : + read_size = 1 ; + break ; + + case SF_FORMAT_PCM_16 : + read_size = 2 ; + break ; + + case SF_FORMAT_PCM_24 : + read_size = 3 ; + break ; + + case SF_FORMAT_PCM_32 : + case SF_FORMAT_FLOAT : + read_size = 4 ; + break ; + + case SF_FORMAT_DOUBLE : + read_size = 8 ; + break ; + + default : + printf ("Sorry, don't currently support this file encoding type.\n") ; + exit (1) ; + } ; + + read_size *= sfinfo.channels ; + + if ((sndfile = sf_open (fixed_w64, SFM_WRITE, &sfinfo)) == NULL) + { printf ("sf_open ('%s') failed : %s\n", fixed_w64, sf_strerror (NULL)) ; + exit (1) ; + } ; + + lseek_or_die (fd, data_offset, SEEK_SET) ; + + copy_data (fd, sndfile, read_size) ; + + sf_close (sndfile) ; + + puts ("Done!") ; +} /* salvage_file */ + +/*------------------------------------------------------------------------------ +*/ + +static void +lseek_or_die (int fd, off_t offset, int whence) +{ + if (lseek (fd, offset, whence) < 0) + { printf ("lseek failed : %s\n", strerror (errno)) ; + exit (1) ; + } ; + + return ; +} /* lseek_or_die */ + + +static sf_count_t +get_file_length (int fd, const char * name) +{ struct stat sbuf ; + + if (sizeof (sbuf.st_size) != 8) + { puts ("Error : sizeof (sbuf.st_size) != 8. Was program compiled with\n" + " 64 bit file offsets?\n") ; + exit (1) ; + } ; + + if (fstat (fd, &sbuf) != 0) + { printf ("Error : fstat ('%s') failed : %s\n", name, strerror (errno)) ; + exit (1) ; + } ; + + return sbuf.st_size ; +} /* get_file_length */ + +static sf_count_t +find_data_offset (int fd, int format) +{ char buffer [8192], *cptr ; + const char * target = "XXXX" ; + sf_count_t offset = -1, extra ; + int rlen, slen ; + + switch (format) + { case SF_FORMAT_WAV : + case SF_FORMAT_WAVEX : + target = "data" ; + extra = 8 ; + break ; + + case SF_FORMAT_AIFF : + target = "SSND" ; + extra = 16 ; + break ; + + default : + puts ("Error : Sorry, don't handle this input file format.\n") ; + exit (1) ; + } ; + + slen = strlen (target) ; + + lseek_or_die (fd, 0, SEEK_SET) ; + + printf ("Searching for '%s' maker.\n", target) ; + + if ((rlen = read (fd, buffer, sizeof (buffer))) < 0) + { printf ("Error : failed read : %s\n", strerror (errno)) ; + exit (1) ; + } ; + + cptr = memchr (buffer, target [0], rlen - slen) ; + if (cptr && memcmp (cptr, target, slen) == 0) + offset = cptr - buffer ; + else + { printf ("Error : Could not find data offset.\n") ; + exit (1) ; + } ; + + return offset + extra ; +} /* find_data_offset */ + +static void +copy_data (int fd, SNDFILE * sndfile, int readsize) +{ static char * buffer ; + sf_count_t readlen, count ; + int bufferlen, done = 0 ; + + bufferlen = readsize * 1024 ; + buffer = malloc (bufferlen) ; + + while (NOT (done) && (readlen = read (fd, buffer, bufferlen)) >= 0) + { if (readlen < bufferlen) + { readlen -= readlen % readsize ; + done = 1 ; + } ; + + if ((count = sf_write_raw (sndfile, buffer, readlen)) != readlen) + { printf ("Error : sf_write_raw returned %" PRId64 " : %s\n", count, sf_strerror (sndfile)) ; + return ; + } ; + } ; + + free (buffer) ; + + return ; +} /* copy_data */ + diff --git a/libsndfile-1.0.31/programs/test-sndfile-metadata-set.py b/libsndfile-1.0.31/programs/test-sndfile-metadata-set.py new file mode 100755 index 0000000..0006936 --- /dev/null +++ b/libsndfile-1.0.31/programs/test-sndfile-metadata-set.py @@ -0,0 +1,198 @@ +#!/usr/bin/env python + +# Copyright (C) 2008-2016 Erik de Castro Lopo +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the author nor the names of any contributors may be used +# to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Simple test script for the sndfile-metadata-set program. + +from __future__ import print_function + +try: + # py2 + import commands +except ImportError: + # py3 + import subprocess as commands + +import os, sys +import time, datetime + +class Programs: + def __init__ (self, needs_exe): + if needs_exe: + extension = ".exe" + else: + extension = "" + self.meta_set_prog = "./sndfile-metadata-set" + extension + self.meta_get_prog = "./sndfile-metadata-get" + extension + self.make_sine_prog = "../examples/make_sine" + extension + + def _run_command (self, should_fail, cmd): + status, output = commands.getstatusoutput (cmd) + if should_fail and not status: + print("\n\nError : command '%s' should have failed." % cmd) + print(output) + print() + sys.exit (1) + if not should_fail and status: + print("\n\nError : command '%s' should not have failed." % cmd) + print(output) + print() + sys.exit (1) + return output + + def meta_set (self, should_fail, args): + return self._run_command (should_fail, self.meta_set_prog + " " + args) + + def meta_get (self, should_fail, args): + return self._run_command (should_fail, self.meta_get_prog + " " + args) + + def make_sine (self): + return os.system (self.make_sine_prog) + + def check_executables (self): + for name in [ self.meta_set_prog, self.meta_get_prog, self.make_sine_prog ]: + if not (os.path.isfile (name)): + print("\n\nError : Can't find executable '%s'. Have you run make?" % name) + sys.exit (1) + + +def print_test_name (name): + print(" %-30s :" % name, end="") + +def assert_info (programs, filename, arg, value): + output = programs.meta_get (False, "%s %s" % (arg, filename)) + if output.find (value) < 0: + print("\n\nError : not able to find '%s'." % value) + print(output) + sys.exit (1) + return + + +def test_empty_fail (programs): + print_test_name ("Empty fail test") + output = programs.meta_set (True, "--bext-description Alpha sine.wav") + print("ok") + +def test_copy (programs): + print_test_name ("Copy test") + output = programs.meta_set (False, "--bext-description \"First Try\" sine.wav output.wav") + assert_info (programs, "output.wav", "--bext-description", "First Try") + print("ok") + +def test_update (programs, tests): + print_test_name ("Update test") + for arg, value in tests: + output = programs.meta_set (False, "%s \"%s\" output.wav" % (arg, value)) + assert_info (programs, "output.wav", arg, value) + print("ok") + +def test_post_mod (programs, tests): + print_test_name ("Post mod test") + for arg, value in tests: + assert_info (programs, "output.wav", arg, value) + print("ok") + +def test_auto_date (programs): + print_test_name ("Auto date test") + output = programs.meta_set (False, "--bext-auto-time-date sine.wav date-time.wav") + target = datetime.date.today ().__str__ () + assert_info (programs, "date-time.wav", "--bext-orig-date", target) + print("ok") + + +#------------------------------------------------------------------------------- + +def test_coding_history (programs): + print_test_name ("Coding history test") + output = programs.meta_set (False, "--bext-coding-hist \"alpha beta\" output.wav") + output = programs.meta_get (False, "--bext-coding-hist output.wav") + print("ok") + +#------------------------------------------------------------------------------- + +def test_rewrite (programs): + print_test_name ("Rewrite test") + output = programs.meta_set (False, "--bext-originator \"Really, really long string\" output.wav") + output = programs.meta_set (False, "--bext-originator \"Short\" output.wav") + output = programs.meta_get (False, "--bext-originator output.wav") + if output.find ("really long") > 0: + print("\n\nError : output '%s' should not contain 'really long'." % output) + sys.exit (1) + print("ok") + +#=============================================================================== + +test_dir = "programs" + +print("\nTesting WAV metadata manipulation:") + +if os.path.isdir (test_dir): + os.chdir (test_dir) + +if len (sys.argv) >= 1 and sys.argv [1].endswith ("mingw32"): + needs_exe = True +else: + needs_exe = False + +programs = Programs (needs_exe) + +programs.check_executables () + +programs.make_sine () +if not os.path.isfile ("sine.wav"): + print("\n\nError : Can't file file 'sine.wav'.") + sys.exit (1) + +test_empty_fail (programs) +test_copy (programs) + +tests = [ + ("--bext-description", "Alpha"), ("--bext-originator", "Beta"), ("--bext-orig-ref", "Charlie"), + ("--bext-umid", "Delta"), ("--bext-orig-date", "2001-10-01"), ("--bext-orig-time", "01:02:03"), + ("--str-title", "Echo"), ("--str-artist", "Fox trot") + ] + +test_auto_date (programs) +test_update (programs, tests) +test_post_mod (programs, tests) + +test_update (programs, [ ("--str-artist", "Fox") ]) + +# This never worked. +# test_coding_history () + +test_rewrite (programs) + + +print() + +sys.exit (0) + diff --git a/libsndfile-1.0.31/regtest/checksum.c b/libsndfile-1.0.31/regtest/checksum.c new file mode 100644 index 0000000..5714144 --- /dev/null +++ b/libsndfile-1.0.31/regtest/checksum.c @@ -0,0 +1,117 @@ +/* +** Copyright (C) 2005-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* +** A simple checksum for short, int and float data. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include + +#include "regtest.h" + +#define BIG_PRIME 999983 + +#define ARRAY_LEN(x) ((int) (sizeof (x)) / (sizeof ((x) [0]))) + +static int short_checksum (SNDFILE * file, int start) ; +static int int_checksum (SNDFILE * file, int start) ; +static int float_checksum (SNDFILE * file, int start) ; + +int +calc_checksum (SNDFILE * file, const SF_INFO * info) +{ int start ; + + /* Seed the checksum with data from the SF_INFO struct. */ + start = info->samplerate ; + start = start * BIG_PRIME + info->channels ; + start = start * BIG_PRIME + info->format ; + + switch (info->format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_FLOAT : + case SF_FORMAT_DOUBLE : + return float_checksum (file, start) ; + + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_32 : + return int_checksum (file, start) ; + + default : + return short_checksum (file, start) ; + } ; + + return 0 ; +} /* calc_checksum */ + +/*------------------------------------------------------------------------------ +*/ + +static union +{ short s [1 << 16] ; + int i [1 << 15] ; + float f [1 << 15] ; +} data ; + +static int +short_checksum (SNDFILE * file, int start) +{ int k, count ; + + do + { count = (int) sf_read_short (file, data.s, ARRAY_LEN (data.s)) ; + for (k = 0 ; k < count ; k++) + start = start * BIG_PRIME + data.s [k] ; + } + while (count > 0) ; + + return start ; +} /* short_checksum */ + +static int +int_checksum (SNDFILE * file, int start) +{ int k, count ; + + do + { count = (int) sf_read_int (file, data.i, ARRAY_LEN (data.i)) ; + for (k = 0 ; k < count ; k++) + start = start * BIG_PRIME + data.i [k] ; + } + while (count > 0) ; + + return start ; +} /* int_checksum */ + +static int +float_checksum (SNDFILE * file, int start) +{ int k, count ; + + do + { count = (int) sf_read_float (file, data.f, ARRAY_LEN (data.f)) ; + for (k = 0 ; k < count ; k++) + start = start * BIG_PRIME + lrintf (2147483648.0f * data.f [k]) ; + } + while (count > 0) ; + + return start ; +} /* float_checksum */ + diff --git a/libsndfile-1.0.31/regtest/database.c b/libsndfile-1.0.31/regtest/database.c new file mode 100644 index 0000000..1048ebb --- /dev/null +++ b/libsndfile-1.0.31/regtest/database.c @@ -0,0 +1,542 @@ +/* +** Copyright (C) 2005-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "config.h" + +#include +#include +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif +#include +#include +#ifdef HAVE_DIRECT_H +#include +#endif +#include + +#include + +#include "regtest.h" + +#if HAVE_SQLITE3 + +#include +#include + +typedef struct +{ sqlite3 *sql ; + + int count ; + int ekey_max ; + + /* Filename and pathname for file. */ + char filename [256] ; + char pathname [512] ; + + /* Storage for createding SQL commands. Must be larger than logbuf below. */ + char cmdbuf [1 << 15] ; + + /* Storage for log buffer retrieved from SNDFILE* .*/ + char logbuf [1 << 14] ; + +} REGTEST_DB ; + +/* In checksum.c */ +int calc_checksum (SNDFILE * file, const SF_INFO * info) ; + +static void get_filename_pathname (REGTEST_DB * db, const char *filepath) ; +static void single_quote_replace (char * buf) ; + +static int get_ekey_from_filename (REGTEST_DB * db, const char *filepath) ; +static int get_filename_pathname_by_ekey (REGTEST_DB * db, int ekey) ; +static int check_file_by_ekey (REGTEST_DB * db, int ekey) ; + +static int count_callback (REGTEST_DB * db, int argc, char **argv, char **colname) ; +static int ekey_max_callback (REGTEST_DB * db, int argc, char **argv, char **colname) ; +static int callback (void *unused, int argc, char **argv, char **colname) ; +static const char *db_basename (const char *fname); + +/* Windows accepts both '\\' and '/' in paths */ +#ifdef _WIN32 + #define IS_SLASH(c) ((c) == '\\' || (c) == '/') + #define HAS_DRIVELETTER(path) (isalpha ((int)(path[0])) && path[1] == ':' && IS_SLASH(path[2])) +#else + #define IS_SLASH(c) ((c) == '/') + #define HAS_DRIVELETTER(path) 0 +#endif + +REG_DB * +db_open (const char * db_name) +{ REGTEST_DB * db ; + int err ; + + if ((db = malloc (sizeof (REGTEST_DB))) == NULL) + { perror ("malloc") ; + exit (1) ; + } ; + + if ((err = sqlite3_open (db_name, &(db->sql))) != 0) + { printf ("Can't open database: %s\n", sqlite3_errmsg (db->sql)) ; + sqlite3_close (db->sql) ; + free (db) ; + exit (1) ; + } ; + + return (REG_DB *) db ; +} /* db_open */ + +int +db_create (const char * db_name) +{ REGTEST_DB * db ; + const char *cmd ; + char * errmsg = NULL ; + int err ; + + db = (REGTEST_DB *) db_open (db_name) ; + + cmd = "create table sndfile (ekey INTEGER PRIMARY KEY," + "fname VARCHAR(1)," + "fpath VARCHAR(1)," + "srate INTEGER," + "frames VARCHAR(1)," + "channels INTEGER," + "format VARCHAR(1)," + "checksum VARCHAR(1)," + "logbuf VARCHAR(1)" + ");" ; + + err = sqlite3_exec (db->sql, cmd, callback, 0, &errmsg) ; + if (err != SQLITE_OK) + printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ; + + sqlite3_close (db->sql) ; + free (db) ; + + return 0 ; +} /* db_create */ + +int +db_close (REG_DB * db_handle) +{ REGTEST_DB * db ; + + db = (REGTEST_DB *) db_handle ; + + sqlite3_close (db->sql) ; + free (db) ; + + return 0 ; +} /* db_close */ + +/*============================================================================== +*/ + +int +db_file_exists (REG_DB * db_handle, const char * filename) +{ REGTEST_DB * db ; + char * errmsg ; + int err ; + + db = (REGTEST_DB *) db_handle ; + + filename = db_basename (filename); + + snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select fname from sndfile where fname='%s'", filename) ; + + db->count = 0 ; + err = sqlite3_exec (db->sql, db->cmdbuf, (sqlite3_callback) count_callback, db, &errmsg) ; + if (err == 0 && db->count == 1) + return 1 ; + + return 0 ; +} /* db_file_exists */ + +int +db_add_file (REG_DB * db_handle, const char * filepath) +{ REGTEST_DB * db ; + SNDFILE * sndfile ; + SF_INFO info ; + char * errmsg ; + int err, checksum ; + + db = (REGTEST_DB *) db_handle ; + + get_filename_pathname (db, filepath) ; + + if (db_file_exists (db_handle, filepath)) + { printf (" %s : already in database\n", db->filename) ; + return 0 ; + } ; + + memset (&info, 0, sizeof (info)) ; + sndfile = sf_open (db->pathname, SFM_READ, &info) ; + sf_command (sndfile, SFC_GET_LOG_INFO, db->logbuf, sizeof (db->logbuf)) ; + checksum = (sndfile == NULL) ? 0 : calc_checksum (sndfile, &info) ; + sf_close (sndfile) ; + + if (sndfile == NULL) + { printf (" %s : could not open : %s, filepath: '%s'\n", db->filename, sf_strerror (NULL), filepath) ; + puts (db->logbuf) ; + return 1 ; + } ; + + single_quote_replace (db->logbuf) ; + + snprintf (db->cmdbuf, sizeof (db->cmdbuf), "insert into sndfile " + "(fname, fpath, srate, frames, channels, format, checksum, logbuf) values" + "('%s','%s',%d,'%ld', %d, '0x%08x', '0x%08x', '%s');", + db->filename, db->pathname, info.samplerate, (long) info.frames, info.channels, info.format, checksum, db->logbuf) ; + + if (strlen (db->cmdbuf) >= sizeof (db->cmdbuf) - 1) + { printf ("strlen (db->cmdbuf) too long.\n") ; + exit (1) ; + } ; + + err = sqlite3_exec (db->sql, db->cmdbuf, callback, 0, &errmsg) ; + if (err != SQLITE_OK) + { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ; + puts (db->cmdbuf) ; + } ; + + return 0 ; +} /* db_add_file */ + +int +db_check_file (REG_DB * db_handle, const char * filepath) +{ REGTEST_DB * db ; + int ekey ; + + if (db_file_exists (db_handle, filepath) == 0) + { printf ("\nFile not in database.\n\n") ; + exit (0) ; + } ; + + db = (REGTEST_DB *) db_handle ; + + ekey = get_ekey_from_filename (db, filepath) ; + + return check_file_by_ekey (db, ekey) ; +} /* db_check_file */ + +/*============================================================================== +*/ + +int +db_check_all (REG_DB * db_handle) +{ REGTEST_DB * db ; + char * errmsg ; + int err, ekey ; + + db = (REGTEST_DB *) db_handle ; + + db->ekey_max = 0 ; + + snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select ekey from sndfile") ; + + err = sqlite3_exec (db->sql, db->cmdbuf, (sqlite3_callback) ekey_max_callback, db, &errmsg) ; + if (err != SQLITE_OK) + { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ; + puts (db->cmdbuf) ; + } ; + + for (ekey = 1 ; ekey <= db->ekey_max ; ekey++) + if (get_filename_pathname_by_ekey (db, ekey) != 0) + check_file_by_ekey (db, ekey) ; + + return 0 ; +} /* db_check_all */ + + +int +db_list_all (REG_DB * db_handle) +{ + printf ("%s : %p\n", __func__, db_handle) ; + return 0 ; +} /* db_list_all */ + +int +db_del_entry (REG_DB * db_handle, const char * entry) +{ + printf ("%s : %p %s\n", __func__, db_handle, entry) ; + return 0 ; +} /* db_del_entry */ + +/*============================================================================== +*/ + +static int +get_ekey_from_filename (REGTEST_DB * db, const char *filepath) +{ char * errmsg, **result ; + int err, ekey = 0, rows, cols ; + + get_filename_pathname (db, filepath) ; + + snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select ekey from sndfile where fname='%s'", db->filename) ; + + err = sqlite3_get_table (db->sql, db->cmdbuf, &result, &rows, &cols, &errmsg) ; + if (err != SQLITE_OK) + { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ; + puts (db->cmdbuf) ; + } ; + + if (cols != 1 || rows != 1) + { printf ("Bad juju!! rows = %d cols = %d\n", rows, cols) ; + exit (1) ; + } ; + + ekey = strtol (result [1], NULL, 10) ; + + sqlite3_free_table (result) ; + + return ekey ; +} /* get_ekey_from_filename */ + +static int +get_filename_pathname_by_ekey (REGTEST_DB * db, int ekey) +{ char *errmsg, **result ; + int err, rows, cols ; + + snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select fname,fpath from sndfile where ekey='%d'", ekey) ; + + err = sqlite3_get_table (db->sql, db->cmdbuf, &result, &rows, &cols, &errmsg) ; + if (err != SQLITE_OK) + { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ; + puts (db->cmdbuf) ; + return 0 ; + } ; + + if (cols != 2 || rows != 1) + { printf ("\nError (%s %d) : rows = %d cols = %d\n", __func__, __LINE__, rows, cols) ; + exit (1) ; + } ; + + snprintf (db->filename, sizeof (db->filename), "%s", result [2]) ; + snprintf (db->pathname, sizeof (db->pathname), "%s", result [3]) ; + + sqlite3_free_table (result) ; + + return 1 ; +} /* get_filename_pathname_by_ekey */ + +static int +check_file_by_ekey (REGTEST_DB * db, int ekey) +{ SNDFILE * sndfile ; + SF_INFO info ; + char * errmsg, **result ; + int err, k, rows, cols, checksum ; + + printf (" %s : ", db->filename) ; + fflush (stdout) ; + + memset (&info, 0, sizeof (info)) ; + sndfile = sf_open (db->pathname, SFM_READ, &info) ; + sf_command (sndfile, SFC_GET_LOG_INFO, db->logbuf, sizeof (db->logbuf)) ; + checksum = (sndfile == NULL) ? 0 : calc_checksum (sndfile, &info) ; + sf_close (sndfile) ; + + if (sndfile == NULL) + { printf ("\n\nError : Could not open '%s' : %s\n", db->pathname, sf_strerror (NULL)) ; + puts (db->logbuf) ; + exit (1) ; + } ; + + single_quote_replace (db->logbuf) ; + + snprintf (db->cmdbuf, sizeof (db->cmdbuf), "select fname,srate,frames,channels,format," + "checksum,logbuf from sndfile where ekey='%d'", ekey) ; + + err = sqlite3_get_table (db->sql, db->cmdbuf, &result, &rows, &cols, &errmsg) ; + if (err != SQLITE_OK) + { printf ("Line %d : SQL error: %s\n", __LINE__, errmsg) ; + puts (db->cmdbuf) ; + } ; + + for (k = 0 ; k < cols ; k++) + { if (strcmp (result [k], "fname") == 0) + { if (strcmp (result [k + cols], db->filename) == 0) + continue ; + printf ("\n\nError : fname doesn't match : %s != %s\n", result [k + cols], db->filename) ; + } ; + + if (strcmp (result [k], "srate") == 0) + { if (strtol (result [k + cols], NULL, 10) == info.samplerate) + continue ; + printf ("\n\nError : srate doesn't match : %s == %d\n", result [k + cols], info.samplerate) ; + } ; + + if (strcmp (result [k], "frames") == 0) + { if (strtoll (result [k + cols], NULL, 10) == info.frames) + continue ; + printf ("\n\nError : frames doesn't match : %s == %ld\n", result [k + cols], (long) info.frames) ; + } ; + + if (strcmp (result [k], "channels") == 0) + { if (strtol (result [k + cols], NULL, 10) == info.channels) + continue ; + printf ("\n\nError : channels doesn't match : %s == %d\n", result [k + cols], info.channels) ; + } ; + + if (strcmp (result [k], "format") == 0) + { if (strtol (result [k + cols], NULL, 16) == info.format) + continue ; + printf ("\n\nError : format doesn't match : %s == 0x%08x\n", result [k + cols], info.format) ; + } ; + + if (strcmp (result [k], "checksum") == 0) + { int db_val = (int) strtoll (result [k + cols], NULL, 16) ; + + if (db_val == checksum) + continue ; + printf ("\n\nError : checksum doesn't match : 0x%08x == 0x%08x\n", db_val, checksum) ; + } ; + + if (strcmp (result [k], "logbuf") == 0) + continue ; + + printf ("\nHere is the old logubuffer :\n\n%s\n\nand the new :\n\n%s\n\n", result [2 * cols - 1], db->logbuf) ; + exit (1) ; + } ; + + sqlite3_free_table (result) ; + + puts ("ok") ; + + return 0 ; +} /* check_file_by_ekey */ + +/*============================================================================== +*/ + +static void +get_filename_pathname (REGTEST_DB * db, const char *filepath) +{ + const char * basename = db_basename (filepath) ; + int slen ; + + /* Test for a relative path + */ + if (!IS_SLASH(filepath [0]) && !HAS_DRIVELETTER(filepath)) + { memset (db->pathname, 0, sizeof (db->pathname)) ; + if (getcwd (db->pathname, sizeof (db->pathname)) == NULL) + { perror ("\ngetcwd failed") ; + exit (1) ; + } ; + + slen = strlen (db->pathname) ; + /* a '/' is fine for Windows too */ + snprintf (db->pathname + slen, sizeof (db->pathname) - slen, "/%s", filepath) ; + } + else + snprintf (db->pathname, sizeof (db->pathname), "%s", filepath) ; + + snprintf (db->filename, sizeof (db->filename), "%s", basename) ; + + basename = db_basename (db->pathname) ; + if (basename == db->pathname) + { printf ("\nError : bad pathname %s\n", filepath) ; + exit (1) ; + } ; +} /* get filename_pathname */ + +static void +single_quote_replace (char * buf) +{ while ((buf = strchr (buf, '\'')) != 0) + buf [0] = '"' ; +} /* single_quote_replace */ + +static int +count_callback (REGTEST_DB * db, int argc, char **argv, char **colname) +{ db->count ++ ; + + (void) argc ; + (void) argv ; + (void) colname ; + return 0 ; +} /* count_callback */ + +static int +ekey_max_callback (REGTEST_DB * db, int argc, char **argv, char **unused) +{ int ekey ; + + (void) argc ; + (void) unused ; + + ekey = strtol (argv [0], NULL, 10) ; + if (ekey > db->ekey_max) + db->ekey_max = ekey ; + + return 0 ; +} /* ekey_max_callback */ + +static int +callback (void *unused, int argc, char **argv, char **colname) +{ int k ; + + (void) unused ; + + for (k = 0 ; k < argc ; k++) + printf ("%s = %s\n", colname [k], argv [k] ? argv [k] : "NULL") ; + + printf ("\n") ; + + return 0 ; +} /* callback */ + +/* + * Win32: Strip drive-letter and directory from a filename. + * non-Win32: Strip directory from a filename. + */ +static const char *db_basename (const char *fname) +{ + const char *base = fname; + +#if !defined(_WIN32) + const char *slash = strrchr (base, '/'); + + if (slash) + base = slash + 1 ; +#else + if (fname[0] && fname[1] == ':') { + fname += 2; + base = fname; + } + while (*fname) { + if (IS_SLASH(*fname)) + base = fname + 1; + fname++; + } +#endif + return base ; +} + +#else + +int dummy (void) ; + +int +dummy (void) +{ /* + ** Empty dummy fnction so tha compiler doesn't winge about an + ** empty file. + */ + return 0 ; +} /* dummy */ + +#endif diff --git a/libsndfile-1.0.31/regtest/regtest.h b/libsndfile-1.0.31/regtest/regtest.h new file mode 100644 index 0000000..567d97b --- /dev/null +++ b/libsndfile-1.0.31/regtest/regtest.h @@ -0,0 +1,38 @@ +/* +** Copyright (C) 2005-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +typedef struct REG_DB_tag REG_DB ; + +/* In database.c */ +REG_DB * db_open (const char * db_name) ; + +int db_create (const char * dbname) ; + +int db_close (REG_DB * db_handle) ; + +int db_file_exists (REG_DB * db_handle, const char * filename) ; +int db_add_file (REG_DB * db_handle, const char * filename) ; +int db_check_file (REG_DB * db_handle, const char * filename) ; + +int db_list_all (REG_DB * db_handle) ; +int db_check_all (REG_DB * db_handle) ; +int db_del_entry (REG_DB * db_handle, const char * entry) ; + +/* In checksum.c */ +int calc_checksum (SNDFILE * file, const SF_INFO * info) ; + diff --git a/libsndfile-1.0.31/regtest/sndfile-regtest.c b/libsndfile-1.0.31/regtest/sndfile-regtest.c new file mode 100644 index 0000000..a28caa2 --- /dev/null +++ b/libsndfile-1.0.31/regtest/sndfile-regtest.c @@ -0,0 +1,121 @@ +/* +** Copyright (C) 2005-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "config.h" + +#include +#include +#include + +#include + +#if HAVE_SQLITE3 + +#include "regtest.h" + +enum +{ OPT_ADD_FILE = 0x0100, + OPT_CREATE_DB = 0x0200, + OPT_DEL_ENTRY = 0x0400, + OPT_LIST_ALL = 0x0800, + OPT_TEST_ALL = 0x1000, + OPT_VERBOSE = 0x2000 +} ; + +static void print_libsndfile_version (void) ; + +int +main (int argc, char * argv []) +{ const char *db_name = "./.sndfile-regtest.db" ; + REG_DB *reg_db ; + int k, retval ; + + if (argc < 2) + { printf ("\nUsage message goes here.\n\n") ; + exit (0) ; + } ; + + if (argc == 2 && strcmp (argv [1], "--create-db") == 0) + return db_create (db_name) ; + + reg_db = db_open (db_name) ; + + if (argc == 2) + { if (strcmp (argv [1], "--list-all") == 0) + return db_list_all (reg_db) ; + + if (strcmp (argv [1], "--check-all") == 0) + { print_libsndfile_version () ; + retval = db_check_all (reg_db) ; + puts ("\nDone.\n") ; + return retval ; + } ; + } ; + + if (argc == 3 && strcmp (argv [1], "--del-entry") == 0) + { db_del_entry (reg_db, argv [2]) ; + db_close (reg_db) ; + return 0 ; + } ; + + if (strcmp (argv [1], "--check-file") == 0) + { print_libsndfile_version () ; + + for (k = 2 ; k < argc ; k++) + db_check_file (reg_db, argv [k]) ; + db_close (reg_db) ; + return 0 ; + } ; + + if (strcmp (argv [1], "--add-file") == 0) + { print_libsndfile_version () ; + + for (k = 2 ; k < argc ; k++) + db_add_file (reg_db, argv [k]) ; + db_close (reg_db) ; + return 0 ; + } ; + + printf ("\nError : unhandled command line args :") ; + for (k = 1 ; k < argc ; k++) + printf (" %s", argv [k]) ; + puts ("\n") ; + + return 1 ; +} /* main */ + +static void +print_libsndfile_version (void) +{ char version [64] ; + + sf_command (NULL, SFC_GET_LIB_VERSION, version, sizeof (version)) ; + printf ("\nsndfile-regtest : using %s\n\n", version) ; +} /* print_lib_version */ + +#else + +int +main (void) +{ + puts ("\nThis program was not compiled with libsqlite3 and hence doesn't work.\n") ; + + return 0 ; +} /* main */ + +#endif + diff --git a/libsndfile-1.0.31/sndfile.pc.in b/libsndfile-1.0.31/sndfile.pc.in new file mode 100644 index 0000000..961cf93 --- /dev/null +++ b/libsndfile-1.0.31/sndfile.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: sndfile +Description: A library for reading and writing audio files +Requires: +Requires.private: @EXTERNAL_XIPH_REQUIRE@ +Version: @VERSION@ +Libs: -L${libdir} -lsndfile +Cflags: -I${includedir} diff --git a/libsndfile-1.0.31/src/ALAC/ALACAudioTypes.h b/libsndfile-1.0.31/src/ALAC/ALACAudioTypes.h new file mode 100644 index 0000000..52d3f44 --- /dev/null +++ b/libsndfile-1.0.31/src/ALAC/ALACAudioTypes.h @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2011 Apple Inc. All rights reserved. + * + * @APPLE_APACHE_LICENSE_HEADER_START@ + * + * Licensed under the Apache License, Version 2.0 (the "License") ; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @APPLE_APACHE_LICENSE_HEADER_END@ + */ + +/* + File: ALACAudioTypes.h +*/ + +#ifndef ALACAUDIOTYPES_H +#define ALACAUDIOTYPES_H + +/* Force these Mac OS specific things to zero. */ +#define PRAGMA_STRUCT_ALIGN 0 +#define PRAGMA_STRUCT_PACKPUSH 0 +#define PRAGMA_STRUCT_PACK 0 +#define PRAGMA_ONCE 0 +#define PRAGMA_MARK 0 + + +#if PRAGMA_ONCE +#pragma once +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include "sfendian.h" + +#if CPU_IS_BIG_ENDIAN == 1 +#define TARGET_RT_BIG_ENDIAN 1 +#else +#define TARGET_RT_BIG_ENDIAN 0 +#endif + +#define kChannelAtomSize 12 + +enum +{ + kALAC_UnimplementedError = -4, + kALAC_FileNotFoundError = -43, + kALAC_ParamError = -50, + kALAC_MemFullError = -108, + fALAC_FrameLengthError = -666, + + /* Add for libsndfile */ + kALAC_BadBitWidth = -0x100000, + kALAC_IncompatibleVersion = -0x100001, + kALAC_BadSpecificConfigSize = -0x100002, + kALAC_ZeroChannelCount = -0x100003, + kALAC_NumSamplesTooBig = -0x100004, + kALAC_UnsupportedElement = -0x100005, +} ; + +enum +{ + kALACFormatAppleLossless = MAKE_MARKER ('a', 'l', 'a', 'c'), + kALACFormatLinearPCM = MAKE_MARKER ('l', 'p', 'c', 'm') +} ; + +enum +{ + kALACMaxChannels = 8, + kALACMaxEscapeHeaderBytes = 8, + kALACMaxSearches = 16, + kALACMaxCoefs = 16, + kALACDefaultFramesPerPacket = 4096 +} ; + +typedef uint32_t ALACChannelLayoutTag ; + +enum +{ + kALACFormatFlagIsFloat = (1 << 0), // 0x1 + kALACFormatFlagIsBigEndian = (1 << 1), // 0x2 + kALACFormatFlagIsSignedInteger = (1 << 2), // 0x4 + kALACFormatFlagIsPacked = (1 << 3), // 0x8 + kALACFormatFlagIsAlignedHigh = (1 << 4), // 0x10 +} ; + +enum +{ +#if TARGET_RT_BIG_ENDIAN + kALACFormatFlagsNativeEndian = kALACFormatFlagIsBigEndian +#else + kALACFormatFlagsNativeEndian = 0 +#endif +} ; + +// this is required to be an IEEE 64bit float +typedef double alac_float64_t ; + +// These are the Channel Layout Tags used in the Channel Layout Info portion of the ALAC magic cookie +enum +{ kALACChannelLayoutTag_Mono = (100 << 16) | 1, // C + kALACChannelLayoutTag_Stereo = (101 << 16) | 2, // L R + kALACChannelLayoutTag_MPEG_3_0_B = (113 << 16) | 3, // C L R + kALACChannelLayoutTag_MPEG_4_0_B = (116 << 16) | 4, // C L R Cs + kALACChannelLayoutTag_MPEG_5_0_D = (120 << 16) | 5, // C L R Ls Rs + kALACChannelLayoutTag_MPEG_5_1_D = (124 << 16) | 6, // C L R Ls Rs LFE + kALACChannelLayoutTag_AAC_6_1 = (142 << 16) | 7, // C L R Ls Rs Cs LFE + kALACChannelLayoutTag_MPEG_7_1_B = (127 << 16) | 8 // C Lc Rc L R Ls Rs LFE (doc: IS-13818-7 MPEG2-AAC) +} ; + +// ALAC currently only utilizes these channels layouts. There is a one for one correspondance between a +// given number of channels and one of these layout tags +static const ALACChannelLayoutTag ALACChannelLayoutTags [kALACMaxChannels] = +{ + kALACChannelLayoutTag_Mono, // C + kALACChannelLayoutTag_Stereo, // L R + kALACChannelLayoutTag_MPEG_3_0_B, // C L R + kALACChannelLayoutTag_MPEG_4_0_B, // C L R Cs + kALACChannelLayoutTag_MPEG_5_0_D, // C L R Ls Rs + kALACChannelLayoutTag_MPEG_5_1_D, // C L R Ls Rs LFE + kALACChannelLayoutTag_AAC_6_1, // C L R Ls Rs Cs LFE + kALACChannelLayoutTag_MPEG_7_1_B // C Lc Rc L R Ls Rs LFE (doc: IS-13818-7 MPEG2-AAC) +} ; + +// AudioChannelLayout from CoreAudioTypes.h. We never need the AudioChannelDescription so we remove it +struct ALACAudioChannelLayout +{ ALACChannelLayoutTag mChannelLayoutTag ; + uint32_t mChannelBitmap ; + uint32_t mNumberChannelDescriptions ; +} ; +typedef struct ALACAudioChannelLayout ALACAudioChannelLayout ; + +struct AudioFormatDescription +{ + alac_float64_t mSampleRate ; + uint32_t mFormatID ; + uint32_t mFormatFlags ; + uint32_t mBytesPerPacket ; + uint32_t mFramesPerPacket ; + uint32_t mBytesPerFrame ; + uint32_t mChannelsPerFrame ; + uint32_t mBitsPerChannel ; + uint32_t mReserved ; +} ; +typedef struct AudioFormatDescription AudioFormatDescription ; + +/* Lossless Definitions */ + +enum +{ + kALACCodecFormat = MAKE_MARKER ('a', 'l', 'a', 'c'), + kALACVersion = 0, + kALACCompatibleVersion = kALACVersion, + kALACDefaultFrameSize = 4096 +} ; + +// note: this struct is wrapped in an 'alac' atom in the sample description extension area +// note: in QT movies, it will be further wrapped in a 'wave' atom surrounded by 'frma' and 'term' atoms +typedef struct ALACSpecificConfig +{ + uint32_t frameLength ; + uint8_t compatibleVersion ; + uint8_t bitDepth ; // max 32 + uint8_t pb ; // 0 <= pb <= 255 + uint8_t mb ; + uint8_t kb ; + uint8_t numChannels ; + uint16_t maxRun ; + uint32_t maxFrameBytes ; + uint32_t avgBitRate ; + uint32_t sampleRate ; + +} ALACSpecificConfig ; + + +// The AudioChannelLayout atom type is not exposed yet so define it here +enum +{ + AudioChannelLayoutAID = MAKE_MARKER ('c', 'h', 'a', 'n') +} ; + +#if PRAGMA_STRUCT_ALIGN + #pragma options align = reset +#elif PRAGMA_STRUCT_PACKPUSH + #pragma pack (pop) +#elif PRAGMA_STRUCT_PACK + #pragma pack () +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ALACAUDIOTYPES_H */ diff --git a/libsndfile-1.0.31/src/ALAC/ALACBitUtilities.c b/libsndfile-1.0.31/src/ALAC/ALACBitUtilities.c new file mode 100644 index 0000000..d861be4 --- /dev/null +++ b/libsndfile-1.0.31/src/ALAC/ALACBitUtilities.c @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2011 Apple Inc. All rights reserved. + * + * @APPLE_APACHE_LICENSE_HEADER_START@ + * + * Licensed under the Apache License, Version 2.0 (the "License") ; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @APPLE_APACHE_LICENSE_HEADER_END@ + */ + +/*============================================================================= + File: ALACBitUtilities.c + + $NoKeywords: $ +=============================================================================*/ + +#include +#include "ALACBitUtilities.h" + +#define PRAGMA_MARK 0 + +// BitBufferInit +// +void BitBufferInit (BitBuffer * bits, uint8_t * buffer, uint32_t byteSize) +{ + bits->cur = buffer ; + bits->end = bits->cur + byteSize ; + bits->bitIndex = 0 ; + bits->byteSize = byteSize ; +} + +// BitBufferRead +// +uint32_t BitBufferRead (BitBuffer * bits, uint8_t numBits) +{ + uint32_t returnBits ; + + //Assert (numBits <= 16) ; + + returnBits = ((uint32_t) bits->cur [0] << 16) | ((uint32_t) bits->cur [1] << 8) | ((uint32_t) bits->cur [2]) ; + returnBits = returnBits << bits->bitIndex ; + returnBits &= 0x00FFFFFF ; + + bits->bitIndex += numBits ; + + returnBits = returnBits >> (24 - numBits) ; + + bits->cur += (bits->bitIndex >> 3) ; + bits->bitIndex &= 7 ; + + //Assert (bits->cur <= bits->end) ; + + return returnBits ; +} + +// BitBufferReadSmall +// +// Reads up to 8 bits +uint8_t BitBufferReadSmall (BitBuffer * bits, uint8_t numBits) +{ + uint16_t returnBits ; + + //Assert (numBits <= 8) ; + + returnBits = (bits->cur [0] << 8) | bits->cur [1] ; + returnBits = returnBits << bits->bitIndex ; + + bits->bitIndex += numBits ; + + returnBits = returnBits >> (16 - numBits) ; + + bits->cur += (bits->bitIndex >> 3) ; + bits->bitIndex &= 7 ; + + //Assert (bits->cur <= bits->end) ; + + return (uint8_t) returnBits ; +} + +// BitBufferReadOne +// +// Reads one byte +uint8_t BitBufferReadOne (BitBuffer * bits) +{ + uint8_t returnBits ; + + returnBits = (bits->cur [0] >> (7 - bits->bitIndex)) & 1 ; + + bits->bitIndex++ ; + + bits->cur += (bits->bitIndex >> 3) ; + bits->bitIndex &= 7 ; + + //Assert (bits->cur <= bits->end) ; + + return returnBits ; +} + +// BitBufferPeek +// +uint32_t BitBufferPeek (BitBuffer * bits, uint8_t numBits) +{ + return ((((((uint32_t) bits->cur [0] << 16) | ((uint32_t) bits->cur [1] << 8) | + ((uint32_t) bits->cur [2])) << bits->bitIndex) & 0x00FFFFFF) >> (24 - numBits)) ; +} + +// BitBufferPeekOne +// +uint32_t BitBufferPeekOne (BitBuffer * bits) +{ + return ((bits->cur [0] >> (7 - bits->bitIndex)) & 1) ; +} + +// BitBufferUnpackBERSize +// +uint32_t BitBufferUnpackBERSize (BitBuffer * bits) +{ + uint32_t size ; + uint8_t tmp ; + + for (size = 0, tmp = 0x80u ; tmp &= 0x80u ; size = (size << 7u) | (tmp & 0x7fu)) + tmp = (uint8_t) BitBufferReadSmall (bits, 8) ; + + return size ; +} + +// BitBufferGetPosition +// +uint32_t BitBufferGetPosition (BitBuffer * bits) +{ + uint8_t * begin ; + + begin = bits->end - bits->byteSize ; + + return ((uint32_t) (bits->cur - begin) * 8) + bits->bitIndex ; +} + +// BitBufferByteAlign +// +void BitBufferByteAlign (BitBuffer * bits, int32_t addZeros) +{ + // align bit buffer to next byte boundary, writing zeros if requested + if (bits->bitIndex == 0) + return ; + + if (addZeros) + BitBufferWrite (bits, 0, 8 - bits->bitIndex) ; + else + BitBufferAdvance (bits, 8 - bits->bitIndex) ; +} + +// BitBufferAdvance +// +void BitBufferAdvance (BitBuffer * bits, uint32_t numBits) +{ + if (numBits) + { + bits->bitIndex += numBits ; + bits->cur += (bits->bitIndex >> 3) ; + bits->bitIndex &= 7 ; + } +} + +// BitBufferRewind +// +void BitBufferRewind (BitBuffer * bits, uint32_t numBits) +{ + uint32_t numBytes ; + + if (numBits == 0) + return ; + + if (bits->bitIndex >= numBits) + { + bits->bitIndex -= numBits ; + return ; + } + + numBits -= bits->bitIndex ; + bits->bitIndex = 0 ; + + numBytes = numBits / 8 ; + numBits = numBits % 8 ; + + bits->cur -= numBytes ; + + if (numBits > 0) + { + bits->bitIndex = 8 - numBits ; + bits->cur-- ; + } + + if (bits->cur < (bits->end - bits->byteSize)) + { + //DebugCMsg ("BitBufferRewind: Rewound too far.") ; + + bits->cur = (bits->end - bits->byteSize) ; + bits->bitIndex = 0 ; + } +} + +// BitBufferWrite +// +void BitBufferWrite (BitBuffer * bits, uint32_t bitValues, uint32_t numBits) +{ + uint32_t invBitIndex ; + + RequireAction (bits != NULL, return ;) ; + RequireActionSilent (numBits > 0, return ;) ; + + invBitIndex = 8 - bits->bitIndex ; + + while (numBits > 0) + { + uint32_t tmp ; + uint8_t shift ; + uint8_t mask ; + uint32_t curNum ; + + curNum = MIN (invBitIndex, numBits) ; + + tmp = bitValues >> (numBits - curNum) ; + + shift = (uint8_t) (invBitIndex - curNum) ; + mask = 0xffu >> (8 - curNum) ; // must be done in two steps to avoid compiler sequencing ambiguity + mask <<= shift ; + + bits->cur [0] = (bits->cur [0] & ~mask) | (((uint8_t) tmp << shift) & mask) ; + numBits -= curNum ; + + // increment to next byte if need be + invBitIndex -= curNum ; + if (invBitIndex == 0) + { + invBitIndex = 8 ; + bits->cur++ ; + } + } + + bits->bitIndex = 8 - invBitIndex ; +} + +void BitBufferReset (BitBuffer * bits) +//void BitBufferInit (BitBuffer * bits, uint8_t * buffer, uint32_t byteSize) +{ + bits->cur = bits->end - bits->byteSize ; + bits->bitIndex = 0 ; +} + +#if PRAGMA_MARK +#pragma mark - +#endif diff --git a/libsndfile-1.0.31/src/ALAC/ALACBitUtilities.h b/libsndfile-1.0.31/src/ALAC/ALACBitUtilities.h new file mode 100644 index 0000000..97080cd --- /dev/null +++ b/libsndfile-1.0.31/src/ALAC/ALACBitUtilities.h @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2011 Apple Inc. All rights reserved. + * + * @APPLE_APACHE_LICENSE_HEADER_START@ + * + * Licensed under the Apache License, Version 2.0 (the "License") ; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @APPLE_APACHE_LICENSE_HEADER_END@ + */ + +/*============================================================================= + File: ALACBitUtilities.h + + $NoKeywords: $ +=============================================================================*/ + +#ifndef __ALACBITUTILITIES_H +#define __ALACBITUTILITIES_H + +#include + +#ifndef MIN +#define MIN(x, y) ((x) < (y) ? (x) : (y)) +#endif // MIN +#ifndef MAX +#define MAX(x, y) ((x) > (y) ? (x) : (y)) +#endif // MAX + +#define RequireAction(condition, action) if (! (condition)) { action } +#define RequireActionSilent(condition, action) if (! (condition)) { action } +#define RequireNoErr(condition, action) if (condition) { action } + +enum +{ + ALAC_noErr = 0 +} ; + + +typedef enum +{ ID_SCE = 0, /* Single Channel Element */ + ID_CPE = 1, /* Channel Pair Element */ + ID_CCE = 2, /* Coupling Channel Element */ + ID_LFE = 3, /* LFE Channel Element */ + ID_DSE = 4, /* not yet supported */ + ID_PCE = 5, + ID_FIL = 6, + ID_END = 7 +} ELEMENT_TYPE ; + +// types +typedef struct BitBuffer +{ + uint8_t * cur ; + uint8_t * end ; + uint32_t bitIndex ; + uint32_t byteSize ; + +} BitBuffer ; + +/* + BitBuffer routines + - these routines take a fixed size buffer and read/write to it + - bounds checking must be done by the client +*/ +void BitBufferInit (BitBuffer * bits, uint8_t * buffer, uint32_t byteSize) ; +uint32_t BitBufferRead (BitBuffer * bits, uint8_t numBits) ; // note: cannot read more than 16 bits at a time +uint8_t BitBufferReadSmall (BitBuffer * bits, uint8_t numBits) ; +uint8_t BitBufferReadOne (BitBuffer * bits) ; +uint32_t BitBufferPeek (BitBuffer * bits, uint8_t numBits) ; // note: cannot read more than 16 bits at a time +uint32_t BitBufferPeekOne (BitBuffer * bits) ; +uint32_t BitBufferUnpackBERSize (BitBuffer * bits) ; +uint32_t BitBufferGetPosition (BitBuffer * bits) ; +void BitBufferByteAlign (BitBuffer * bits, int32_t addZeros) ; +void BitBufferAdvance (BitBuffer * bits, uint32_t numBits) ; +void BitBufferRewind (BitBuffer * bits, uint32_t numBits) ; +void BitBufferWrite (BitBuffer * bits, uint32_t value, uint32_t numBits) ; +void BitBufferReset (BitBuffer * bits) ; + +#endif /* __BITUTILITIES_H */ diff --git a/libsndfile-1.0.31/src/ALAC/EndianPortable.h b/libsndfile-1.0.31/src/ALAC/EndianPortable.h new file mode 100644 index 0000000..aa1f449 --- /dev/null +++ b/libsndfile-1.0.31/src/ALAC/EndianPortable.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2011 Apple Inc. All rights reserved. +** Copyright (C) 2013-2014 Erik de Castro Lopo + * + * @APPLE_APACHE_LICENSE_HEADER_START@ + * + * Licensed under the Apache License, Version 2.0 (the "License") ; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @APPLE_APACHE_LICENSE_HEADER_END@ + */ + +// +// EndianPortable.h +// +// Copyright 2011 Apple Inc. All rights reserved. +// + +#ifndef _EndianPortable_h +#define _EndianPortable_h + +#include + +#define Swap16NtoB(x) H2BE_16 (x) +#define Swap16BtoN(x) BE2H_16 (x) + +#define Swap32NtoB(x) H2BE_32 (x) +#define Swap32BtoN(x) BE2H_32 (x) + +#endif diff --git a/libsndfile-1.0.31/src/ALAC/ag_dec.c b/libsndfile-1.0.31/src/ALAC/ag_dec.c new file mode 100644 index 0000000..e7e4c62 --- /dev/null +++ b/libsndfile-1.0.31/src/ALAC/ag_dec.c @@ -0,0 +1,356 @@ +/* + * Copyright (c) 2011 Apple Inc. All rights reserved. + * + * @APPLE_APACHE_LICENSE_HEADER_START@ + * + * Licensed under the Apache License, Version 2.0 (the "License") ; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @APPLE_APACHE_LICENSE_HEADER_END@ + */ + +/* + File: ag_dec.c + + Contains: Adaptive Golomb decode routines. + + Copyright: (c) 2001-2011 Apple, Inc. +*/ + +#include +#include +#include +#include + +#include "aglib.h" +#include "ALACBitUtilities.h" +#include "ALACAudioTypes.h" + +#define CODE_TO_LONG_MAXBITS 32 +#define N_MAX_MEAN_CLAMP 0xffff +#define N_MEAN_CLAMP_VAL 0xffff +#define REPORT_VAL 40 + +#if __GNUC__ +#define ALWAYS_INLINE __attribute__ ((always_inline)) +#else +#define ALWAYS_INLINE +#endif + +/* And on the subject of the CodeWarrior x86 compiler and inlining, I reworked a lot of this + to help the compiler out. In many cases this required manual inlining or a macro. Sorry + if it is ugly but the performance gains are well worth it. + - WSK 5/19/04 +*/ + +void set_standard_ag_params (AGParamRecPtr params, uint32_t fullwidth, uint32_t sectorwidth) +{ + /* Use + fullwidth = sectorwidth = numOfSamples, for analog 1-dimensional type-short data, + but use + fullwidth = full image width, sectorwidth = sector (patch) width + for such as image (2-dim.) data. + */ + set_ag_params (params, MB0, PB0, KB0, fullwidth, sectorwidth, MAX_RUN_DEFAULT) ; +} + +void set_ag_params (AGParamRecPtr params, uint32_t m, uint32_t p, uint32_t k, uint32_t f, uint32_t s, uint32_t maxrun) +{ + params->mb = params->mb0 = m ; + params->pb = p ; + params->kb = k ; + params->wb = (1u << params->kb) - 1 ; + params->qb = QB-params->pb ; + params->fw = f ; + params->sw = s ; + params->maxrun = maxrun ; +} + +#if PRAGMA_MARK +#pragma mark - +#endif + + +// note: implementing this with some kind of "count leading zeros" assembly is a big performance win +static inline int32_t lead (int32_t m) +{ + long j ; + unsigned long c = (1ul << 31) ; + + for (j = 0 ; j < 32 ; j++) + { + if ((c & m) != 0) + break ; + c >>= 1 ; + } + return j ; +} + +#define arithmin(a, b) ((a) < (b) ? (a) : (b)) + +static inline int32_t ALWAYS_INLINE lg3a (int32_t x) +{ + int32_t result ; + + x += 3 ; + result = lead (x) ; + + return 31 - result ; +} + +static inline uint32_t ALWAYS_INLINE read32bit (uint8_t * buffer) +{ + // embedded CPUs typically can't read unaligned 32-bit words so just read the bytes + uint32_t value ; + + value = ((uint32_t) buffer [0] << 24) | ((uint32_t) buffer [1] << 16) | + ((uint32_t) buffer [2] << 8) | (uint32_t) buffer [3] ; + return value ; + +} + +#if PRAGMA_MARK +#pragma mark - +#endif + +#define get_next_fromlong(inlong, suff) ((inlong) >> (32 - (suff))) + + +static inline uint32_t ALWAYS_INLINE +getstreambits (uint8_t *in, int32_t bitoffset, int32_t numbits) +{ + uint32_t load1, load2 ; + uint32_t byteoffset = bitoffset / 8 ; + uint32_t result ; + + //Assert (numbits <= 32) ; + + load1 = read32bit (in + byteoffset) ; + + if ((numbits + (bitoffset & 0x7)) > 32) + { + int32_t load2shift ; + + result = load1 << (bitoffset & 0x7) ; + load2 = (uint32_t) in [byteoffset + 4] ; + load2shift = (8 - (numbits + (bitoffset & 0x7) - 32)) ; + load2 >>= load2shift ; + result >>= (32 - numbits) ; + result |= load2 ; + } + else + { + result = load1 >> (32 - numbits - (bitoffset & 7)) ; + } + + // a shift of >= "the number of bits in the type of the value being shifted" results in undefined + // behavior so don't try to shift by 32 + if (numbits != (sizeof (result) * 8)) + result &= ~ (0xfffffffful << numbits) ; + + return result ; +} + + +static inline int32_t dyn_get (unsigned char *in, uint32_t *bitPos, uint32_t m, uint32_t k) +{ + uint32_t tempbits = *bitPos ; + uint32_t result ; + uint32_t pre = 0, v ; + uint32_t streamlong ; + + streamlong = read32bit (in + (tempbits >> 3)) ; + streamlong <<= (tempbits & 7) ; + + /* find the number of bits in the prefix */ + { + uint32_t notI = ~streamlong ; + pre = lead (notI) ; + } + + if (pre >= MAX_PREFIX_16) + { + pre = MAX_PREFIX_16 ; + tempbits += pre ; + streamlong <<= pre ; + result = get_next_fromlong (streamlong, MAX_DATATYPE_BITS_16) ; + tempbits += MAX_DATATYPE_BITS_16 ; + + } + else + { + // all of the bits must fit within the long we have loaded + //Assert (pre+1+k <= 32) ; + + tempbits += pre ; + tempbits += 1 ; + streamlong <<= pre + 1 ; + v = get_next_fromlong (streamlong, k) ; + tempbits += k ; + + result = pre*m + v-1 ; + + if (v < 2) + { + result -= (v-1) ; + tempbits -= 1 ; + } + } + + *bitPos = tempbits ; + return result ; +} + + +static inline int32_t dyn_get_32bit (uint8_t * in, uint32_t * bitPos, int32_t m, int32_t k, int32_t maxbits) +{ + uint32_t tempbits = *bitPos ; + uint32_t v ; + uint32_t streamlong ; + uint32_t result ; + + streamlong = read32bit (in + (tempbits >> 3)) ; + streamlong <<= (tempbits & 7) ; + + /* find the number of bits in the prefix */ + { + uint32_t notI = ~streamlong ; + result = lead (notI) ; + } + + if (result >= MAX_PREFIX_32) + { + result = getstreambits (in, tempbits+MAX_PREFIX_32, maxbits) ; + tempbits += MAX_PREFIX_32 + maxbits ; + } + else + { + /* all of the bits must fit within the long we have loaded*/ + //Assert (k<=14) ; + //Assert (result= 2) + { + result += (v-1) ; + tempbits += 1 ; + } + } + } + + *bitPos = tempbits ; + + return result ; +} + +int32_t dyn_decomp (AGParamRecPtr params, BitBuffer * bitstream, int32_t * pc, int32_t numSamples, int32_t maxSize, uint32_t * outNumBits) +{ + uint8_t *in ; + int32_t *outPtr = pc ; + uint32_t bitPos, startPos, maxPos ; + uint32_t j, m, k, n, c, mz ; + int32_t del, zmode ; + uint32_t mb ; + uint32_t pb_local = params->pb ; + uint32_t kb_local = params->kb ; + uint32_t wb_local = params->wb ; + int32_t status ; + + RequireAction ((bitstream != NULL) && (pc != NULL) && (outNumBits != NULL), return kALAC_ParamError ;) ; + *outNumBits = 0 ; + + in = bitstream->cur ; + startPos = bitstream->bitIndex ; + maxPos = bitstream->byteSize * 8 ; + bitPos = startPos ; + + mb = params->mb0 ; + zmode = 0 ; + + c = 0 ; + status = ALAC_noErr ; + + while (c < (uint32_t) numSamples) + { + // bail if we've run off the end of the buffer + RequireAction (bitPos < maxPos, status = kALAC_ParamError ; goto Exit ;) ; + + m = (mb) >> QBSHIFT ; + k = lg3a (m) ; + + k = arithmin (k, kb_local) ; + m = (1 << k) - 1 ; + + n = dyn_get_32bit (in, &bitPos, m, k, maxSize) ; + + // least significant bit is sign bit + { + uint32_t ndecode = n + zmode ; + int32_t multiplier = - (int) (ndecode & 1) ; + + multiplier |= 1 ; + del = ((ndecode+1) >> 1) * (multiplier) ; + } + + *outPtr++ = del ; + + c++ ; + + mb = pb_local * (n + zmode) + mb - ((pb_local * mb) >> QBSHIFT) ; + + // update mean tracking + if (n > N_MAX_MEAN_CLAMP) + mb = N_MEAN_CLAMP_VAL ; + + zmode = 0 ; + + if (((mb << MMULSHIFT) < QB) && (c < (uint32_t) numSamples)) + { + zmode = 1 ; + k = lead (mb) - BITOFF + ((mb + MOFF) >> MDENSHIFT) ; + mz = ((1 << k) - 1) & wb_local ; + + n = dyn_get (in, &bitPos, mz, k) ; + + RequireAction (c+n <= (uint32_t) numSamples, status = kALAC_ParamError ; goto Exit ;) ; + + for (j = 0 ; j < n ; j++) + { + *outPtr++ = 0 ; + ++c ; + } + + if (n >= 65535) + zmode = 0 ; + + mb = 0 ; + } + } + +Exit: + *outNumBits = (bitPos - startPos) ; + BitBufferAdvance (bitstream, *outNumBits) ; + RequireAction (bitstream->cur <= bitstream->end, status = kALAC_ParamError ;) ; + + return status ; +} diff --git a/libsndfile-1.0.31/src/ALAC/ag_enc.c b/libsndfile-1.0.31/src/ALAC/ag_enc.c new file mode 100644 index 0000000..2b1df19 --- /dev/null +++ b/libsndfile-1.0.31/src/ALAC/ag_enc.c @@ -0,0 +1,350 @@ +/* + * Copyright (c) 2011 Apple Inc. All rights reserved. + * Copyright (C) 2013-2014 Erik de Castro Lopo + * + * @APPLE_APACHE_LICENSE_HEADER_START@ + * + * Licensed under the Apache License, Version 2.0 (the "License") ; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @APPLE_APACHE_LICENSE_HEADER_END@ + */ + +/* + File: ag_enc.c + + Contains: Adaptive Golomb encode routines. + + Copyright: (c) 2001-2011 Apple, Inc. +*/ + +#include "aglib.h" +#include "ALACBitUtilities.h" +#include "EndianPortable.h" +#include "ALACAudioTypes.h" + +#include +#include +#include +#include + +#define CODE_TO_LONG_MAXBITS 32 +#define N_MAX_MEAN_CLAMP 0xffff +#define N_MEAN_CLAMP_VAL 0xffff +#define REPORT_VAL 40 + +#if __GNUC__ +#define ALWAYS_INLINE __attribute__ ((always_inline)) +#else +#define ALWAYS_INLINE +#endif + + +/* And on the subject of the CodeWarrior x86 compiler and inlining, I reworked a lot of this + to help the compiler out. In many cases this required manual inlining or a macro. Sorry + if it is ugly but the performance gains are well worth it. + - WSK 5/19/04 +*/ + +// note: implementing this with some kind of "count leading zeros" assembly is a big performance win +static inline int32_t lead (int32_t m) +{ + long j ; + unsigned long c = (1ul << 31) ; + + for (j = 0 ; j < 32 ; j++) + { + if ((c & m) != 0) + break ; + c >>= 1 ; + } + return j ; +} + +#define arithmin (a, b) ((a) < (b) ? (a) : (b)) + +static inline int32_t ALWAYS_INLINE lg3a (int32_t x) +{ + int32_t result ; + + x += 3 ; + result = lead (x) ; + + return 31 - result ; +} + +static inline int32_t ALWAYS_INLINE abs_func (int32_t a) +{ + // note: the CW PPC intrinsic __abs () turns into these instructions so no need to try and use it + int32_t isneg = a >> 31 ; + int32_t xorval = a ^ isneg ; + int32_t result = xorval-isneg ; + + return result ; +} + +#if PRAGMA_MARK +#pragma mark - +#endif + +static inline int32_t dyn_code (int32_t m, int32_t k, int32_t n, uint32_t *outNumBits) +{ + uint32_t divx, mod, de ; + uint32_t numBits ; + uint32_t value ; + + // Assert (n >= 0) ; + + divx = n / m ; + + if (divx >= MAX_PREFIX_16) + { + numBits = MAX_PREFIX_16 + MAX_DATATYPE_BITS_16 ; + value = (((1 << MAX_PREFIX_16) - 1) << MAX_DATATYPE_BITS_16) + n ; + } + else + { + mod = n%m ; + de = (mod == 0) ; + numBits = divx + k + 1 - de ; + value = (((1 << divx) - 1) << (numBits - divx)) + mod + 1 - de ; + + // if coding this way is bigger than doing escape, then do escape + if (numBits > MAX_PREFIX_16 + MAX_DATATYPE_BITS_16) + { + numBits = MAX_PREFIX_16 + MAX_DATATYPE_BITS_16 ; + value = (((1 << MAX_PREFIX_16) - 1) << MAX_DATATYPE_BITS_16) + n ; + } + } + + *outNumBits = numBits ; + + return (int32_t) value ; +} + + +static inline int32_t dyn_code_32bit (int32_t maxbits, uint32_t m, uint32_t k, uint32_t n, uint32_t *outNumBits, uint32_t *outValue, uint32_t *overflow, uint32_t *overflowbits) +{ + uint32_t divx, mod, de ; + uint32_t numBits ; + uint32_t value ; + int32_t didOverflow = 0 ; + + divx = n / m ; + + if (divx < MAX_PREFIX_32) + { + mod = n - (m * divx) ; + + de = (mod == 0) ; + numBits = divx + k + 1 - de ; + value = (((1 << divx) - 1) << (numBits - divx)) + mod + 1 - de ; + if (numBits > 25) + goto codeasescape ; + } + else + { +codeasescape: + numBits = MAX_PREFIX_32 ; + value = (((1 << MAX_PREFIX_32) - 1)) ; + *overflow = n ; + *overflowbits = maxbits ; + didOverflow = 1 ; + } + + *outNumBits = numBits ; + *outValue = value ; + + return didOverflow ; +} + + +static inline void ALWAYS_INLINE dyn_jam_noDeref (unsigned char *out, uint32_t bitPos, uint32_t numBits, uint32_t value) +{ + uint32_t mask ; + uint32_t curr ; + uint32_t shift ; + + //Assert (numBits <= 32) ; + + curr = psf_get_be32 (out, bitPos >> 3) ; + + shift = 32 - (bitPos & 7) - numBits ; + + mask = ~0u >> (32 - numBits) ; // mask must be created in two steps to avoid compiler sequencing ambiguity + mask <<= shift ; + + value = (value << shift) & mask ; + value |= curr & ~mask ; + + psf_put_be32 (out, bitPos >> 3, value) ; +} + + +static inline void ALWAYS_INLINE dyn_jam_noDeref_large (unsigned char *out, uint32_t bitPos, uint32_t numBits, uint32_t value) +{ + uint32_t w ; + uint32_t curr ; + uint32_t mask ; + int32_t shiftvalue = (32 - (bitPos & 7) - numBits) ; + + //Assert (numBits <= 32) ; + + curr = psf_get_be32 (out, bitPos >> 3) ; + + if (shiftvalue < 0) + { + uint8_t tailbyte ; + uint8_t *tailptr ; + + w = value >> -shiftvalue ; + mask = ~0u >> -shiftvalue ; + w |= (curr & ~mask) ; + + tailptr = out + (bitPos >> 3) + 4 ; + tailbyte = (value << ((8+shiftvalue))) & 0xff ; + *tailptr = (uint8_t) tailbyte ; + } + else + { + mask = ~0u >> (32 - numBits) ; + mask <<= shiftvalue ; // mask must be created in two steps to avoid compiler sequencing ambiguity + + w = (value << shiftvalue) & mask ; + w |= curr & ~mask ; + } + + psf_put_be32 (out, bitPos >> 3, w) ; +} + + +int32_t dyn_comp (AGParamRecPtr params, int32_t * pc, BitBuffer * bitstream, int32_t numSamples, int32_t bitSize, uint32_t * outNumBits) +{ + unsigned char * out ; + uint32_t bitPos, startPos ; + uint32_t m, k, n, c, mz, nz ; + uint32_t numBits ; + uint32_t value ; + int32_t del, zmode ; + uint32_t overflow, overflowbits ; + int32_t status ; + + // shadow the variables in params so there's not the dereferencing overhead + uint32_t mb, pb, kb, wb ; + int32_t rowPos = 0 ; + int32_t rowSize = params->sw ; + int32_t rowJump = (params->fw) - rowSize ; + int32_t * inPtr = pc ; + + *outNumBits = 0 ; + RequireAction ((bitSize >= 1) && (bitSize <= 32), return kALAC_ParamError ;) ; + + out = bitstream->cur ; + startPos = bitstream->bitIndex ; + bitPos = startPos ; + + mb = params->mb = params->mb0 ; + pb = params->pb ; + kb = params->kb ; + wb = params->wb ; + zmode = 0 ; + + c = 0 ; + status = ALAC_noErr ; + + while (c < (uint32_t) numSamples) + { + m = mb >> QBSHIFT ; + k = lg3a (m) ; + if (k > kb) + { + k = kb ; + } + m = (1 << k) - 1 ; + + del = *inPtr++ ; + rowPos++ ; + + n = (abs_func (del) << 1) - ((del >> 31) & 1) - zmode ; + //Assert (32-lead (n) <= bitSize) ; + + if (dyn_code_32bit (bitSize, m, k, n, &numBits, &value, &overflow, &overflowbits)) + { + dyn_jam_noDeref (out, bitPos, numBits, value) ; + bitPos += numBits ; + dyn_jam_noDeref_large (out, bitPos, overflowbits, overflow) ; + bitPos += overflowbits ; + } + else + { + dyn_jam_noDeref (out, bitPos, numBits, value) ; + bitPos += numBits ; + } + + c++ ; + if (rowPos >= rowSize) + { + rowPos = 0 ; + inPtr += rowJump ; + } + + mb = pb * (n + zmode) + mb - ((pb * mb) >> QBSHIFT) ; + + // update mean tracking if it's overflowed + if (n > N_MAX_MEAN_CLAMP) + mb = N_MEAN_CLAMP_VAL ; + + zmode = 0 ; + + RequireAction (c <= (uint32_t) numSamples, status = kALAC_ParamError ; goto Exit ;) ; + + if (((mb << MMULSHIFT) < QB) && (c < (uint32_t) numSamples)) + { + zmode = 1 ; + nz = 0 ; + + while (c < (uint32_t) numSamples && *inPtr == 0) + { + /* Take care of wrap-around globals. */ + ++inPtr ; + ++nz ; + ++c ; + if (++rowPos >= rowSize) + { + rowPos = 0 ; + inPtr += rowJump ; + } + + if (nz >= 65535) + { + zmode = 0 ; + break ; + } + } + + k = lead (mb) - BITOFF + ((mb + MOFF) >> MDENSHIFT) ; + mz = ((1 << k) - 1) & wb ; + + value = dyn_code (mz, k, nz, &numBits) ; + dyn_jam_noDeref (out, bitPos, numBits, value) ; + bitPos += numBits ; + + mb = 0 ; + } + } + + *outNumBits = (bitPos - startPos) ; + BitBufferAdvance (bitstream, *outNumBits) ; + +Exit: + return status ; +} diff --git a/libsndfile-1.0.31/src/ALAC/aglib.h b/libsndfile-1.0.31/src/ALAC/aglib.h new file mode 100644 index 0000000..825c4bd --- /dev/null +++ b/libsndfile-1.0.31/src/ALAC/aglib.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2011 Apple Inc. All rights reserved. + * + * @APPLE_APACHE_LICENSE_HEADER_START@ + * + * Licensed under the Apache License, Version 2.0 (the "License") ; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @APPLE_APACHE_LICENSE_HEADER_END@ + */ + +/* + File: aglib.h + + Copyright: (C) 2001-2011 Apple, Inc. +*/ + +#ifndef AGLIB_H +#define AGLIB_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define QBSHIFT 9 +#define QB (1 << QBSHIFT) +#define PB0 40 +#define MB0 10 +#define KB0 14 +#define MAX_RUN_DEFAULT 255 + +#define MMULSHIFT 2 +#define MDENSHIFT (QBSHIFT - MMULSHIFT - 1) +#define MOFF ((1 << (MDENSHIFT - 2))) + +#define BITOFF 24 + +/* Max. prefix of 1's. */ +#define MAX_PREFIX_16 9 +#define MAX_PREFIX_TOLONG_16 15 +#define MAX_PREFIX_32 9 + +/* Max. bits in 16-bit data type */ +#define MAX_DATATYPE_BITS_16 16 + +typedef struct AGParamRec +{ + uint32_t mb, mb0, pb, kb, wb, qb ; + uint32_t fw, sw ; + + uint32_t maxrun ; + + // fw = 1, sw = 1 ; + +} AGParamRec, *AGParamRecPtr ; + +struct BitBuffer ; + +void set_standard_ag_params (AGParamRecPtr params, uint32_t fullwidth, uint32_t sectorwidth) ; +void set_ag_params (AGParamRecPtr params, uint32_t m, uint32_t p, uint32_t k, uint32_t f, uint32_t s, uint32_t maxrun) ; + +int32_t dyn_comp (AGParamRecPtr params, int32_t * pc, struct BitBuffer * bitstream, int32_t numSamples, int32_t bitSize, uint32_t * outNumBits) ; +int32_t dyn_decomp (AGParamRecPtr params, struct BitBuffer * bitstream, int32_t * pc, int32_t numSamples, int32_t maxSize, uint32_t * outNumBits) ; + + +#ifdef __cplusplus +} +#endif + +#endif //#ifndef AGLIB_H diff --git a/libsndfile-1.0.31/src/ALAC/alac_codec.h b/libsndfile-1.0.31/src/ALAC/alac_codec.h new file mode 100644 index 0000000..c73347d --- /dev/null +++ b/libsndfile-1.0.31/src/ALAC/alac_codec.h @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2011 Apple Inc. All rights reserved. + * Copyright (C) 2012-2014 Erik de Castro Lopo + * + * @APPLE_APACHE_LICENSE_HEADER_START@ + * + * Licensed under the Apache License, Version 2.0 (the "License") ; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @APPLE_APACHE_LICENSE_HEADER_END@ + */ + +/* + File: alac_codec.h +*/ + +#ifndef ALAC_CODEC_H +#define ALAC_CODEC_H + +#include + +#include "ALACAudioTypes.h" + +#define ALAC_FRAME_LENGTH 4096 + +struct BitBuffer ; + +typedef struct alac_decoder_s +{ + // decoding parameters (public for use in the analyzer) + ALACSpecificConfig mConfig ; + + uint16_t mActiveElements ; + + // decoding buffers + int32_t mMixBufferU [ALAC_FRAME_LENGTH] ; + int32_t mMixBufferV [ALAC_FRAME_LENGTH] ; + union + { + int32_t mPredictor [ALAC_FRAME_LENGTH] ; + uint16_t mShiftBuffer [ALAC_FRAME_LENGTH] ; + } ; + uint32_t mNumChannels ; +} ALAC_DECODER ; + +typedef struct alac_encoder_s +{ + // ALAC encoder parameters + int16_t mBitDepth ; + + // encoding state + int16_t mLastMixRes [kALACMaxChannels] ; + + int32_t mFastMode ; + + // encoding buffers + int32_t mMixBufferU [ALAC_FRAME_LENGTH] ; + int32_t mMixBufferV [ALAC_FRAME_LENGTH] ; + int32_t mPredictorU [ALAC_FRAME_LENGTH] ; + int32_t mPredictorV [ALAC_FRAME_LENGTH] ; + uint16_t mShiftBufferUV [2 * ALAC_FRAME_LENGTH] ; + uint8_t mWorkBuffer [4 * ALAC_FRAME_LENGTH] ; + + // per-channel coefficients buffers + int16_t mCoefsU [kALACMaxChannels][kALACMaxSearches][kALACMaxCoefs] ; + int16_t mCoefsV [kALACMaxChannels][kALACMaxSearches][kALACMaxCoefs] ; + + // encoding statistics + uint32_t mTotalBytesGenerated ; + uint32_t mAvgBitRate ; + uint32_t mMaxFrameBytes ; + uint32_t mFrameSize ; + uint32_t mMaxOutputBytes ; + uint32_t mNumChannels ; + uint32_t mOutputSampleRate ; +} ALAC_ENCODER ; + + +int32_t alac_decoder_init (ALAC_DECODER *p, void * inMagicCookie, uint32_t inMagicCookieSize) ; +int32_t alac_encoder_init (ALAC_ENCODER *p, uint32_t samplerate, uint32_t channels, uint32_t format_flags, uint32_t frameSize) ; + +int32_t alac_decode (ALAC_DECODER *, struct BitBuffer * bits, int32_t * sampleBuffer, + uint32_t numSamples, uint32_t * outNumSamples) ; + +int32_t alac_encode (ALAC_ENCODER *p, uint32_t numSamples, + const int32_t * theReadBuffer, unsigned char * theWriteBuffer, + uint32_t * ioNumBytes) ; + +void alac_set_fastmode (ALAC_ENCODER * p, int32_t fast) ; + +uint32_t alac_get_magic_cookie_size (uint32_t inNumChannels) ; +void alac_get_magic_cookie (ALAC_ENCODER *p, void * config, uint32_t * ioSize) ; +void alac_get_source_format (ALAC_ENCODER *p, const AudioFormatDescription * source, AudioFormatDescription * output) ; + +#endif diff --git a/libsndfile-1.0.31/src/ALAC/alac_decoder.c b/libsndfile-1.0.31/src/ALAC/alac_decoder.c new file mode 100644 index 0000000..6c124e6 --- /dev/null +++ b/libsndfile-1.0.31/src/ALAC/alac_decoder.c @@ -0,0 +1,652 @@ +/* + * Copyright (c) 2011 Apple Inc. All rights reserved. + * Copyright (C) 2012-2015 Erik de Castro Lopo + * + * @APPLE_APACHE_LICENSE_HEADER_START@ + * + * Licensed under the Apache License, Version 2.0 (the "License") ; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @APPLE_APACHE_LICENSE_HEADER_END@ + */ + +/* + File: ALACDecoder.cpp +*/ + +#include +#include +#include +#include + +#include "alac_codec.h" + +#include "dplib.h" +#include "aglib.h" +#include "matrixlib.h" +#include "shift.h" + +#include "ALACBitUtilities.h" +#include "EndianPortable.h" + +typedef enum +{ false = 0, + true = 1 +} bool ; + +// constants/data +const uint32_t kMaxBitDepth = 32 ; // max allowed bit depth is 32 + + +// prototypes +static int32_t alac_fill_element (struct BitBuffer * bits) ; +static int32_t alac_data_stream_element (struct BitBuffer * bits) ; + +static void Zero32 (int32_t * buffer, uint32_t numItems, uint32_t stride) ; + + +/* + Init () + - initialize the decoder with the given configuration +*/ +int32_t +alac_decoder_init (ALAC_DECODER *p, void * inMagicCookie, uint32_t inMagicCookieSize) +{ + int32_t status = ALAC_noErr ; + ALACSpecificConfig theConfig ; + uint8_t * theActualCookie = (uint8_t *) inMagicCookie ; + uint32_t theCookieBytesRemaining = inMagicCookieSize ; + + // For historical reasons the decoder needs to be resilient to magic cookies vended by older encoders. + // As specified in the ALACMagicCookieDescription.txt document, there may be additional data encapsulating + // the ALACSpecificConfig. This would consist of format ('frma') and 'alac' atoms which precede the + // ALACSpecificConfig. + // See ALACMagicCookieDescription.txt for additional documentation concerning the 'magic cookie' + + // skip format ('frma') atom if present + if (theActualCookie [4] == 'f' && theActualCookie [5] == 'r' && theActualCookie [6] == 'm' && theActualCookie [7] == 'a') + { + theActualCookie += 12 ; + theCookieBytesRemaining -= 12 ; + } + + // skip 'alac' atom header if present + if (theActualCookie [4] == 'a' && theActualCookie [5] == 'l' && theActualCookie [6] == 'a' && theActualCookie [7] == 'c') + { + theActualCookie += 12 ; + theCookieBytesRemaining -= 12 ; + } + + // read the ALACSpecificConfig + if (theCookieBytesRemaining >= sizeof (ALACSpecificConfig)) + { + theConfig.frameLength = psf_get_be32 (theActualCookie, offsetof (ALACSpecificConfig, frameLength)) ; + + if (theConfig.frameLength > ALAC_FRAME_LENGTH) + return fALAC_FrameLengthError ; + + theConfig.compatibleVersion = theActualCookie [offsetof (ALACSpecificConfig, compatibleVersion)] ; + theConfig.bitDepth = theActualCookie [offsetof (ALACSpecificConfig, bitDepth)] ; + theConfig.pb = theActualCookie [offsetof (ALACSpecificConfig, pb)] ; + theConfig.mb = theActualCookie [offsetof (ALACSpecificConfig, mb)] ; + theConfig.kb = theActualCookie [offsetof (ALACSpecificConfig, kb)] ; + theConfig.numChannels = theActualCookie [offsetof (ALACSpecificConfig, numChannels)] ; + theConfig.maxRun = psf_get_be16 (theActualCookie, offsetof (ALACSpecificConfig, maxRun)) ; + theConfig.maxFrameBytes = psf_get_be32 (theActualCookie, offsetof (ALACSpecificConfig, maxFrameBytes)) ; + theConfig.avgBitRate = psf_get_be32 (theActualCookie, offsetof (ALACSpecificConfig, avgBitRate)) ; + theConfig.sampleRate = psf_get_be32 (theActualCookie, offsetof (ALACSpecificConfig, sampleRate)) ; + + p->mConfig = theConfig ; + p->mNumChannels = theConfig.numChannels ; + + RequireAction (p->mConfig.compatibleVersion <= kALACVersion, return kALAC_IncompatibleVersion ;) ; + RequireAction ((p->mConfig.bitDepth >= 8 && p->mConfig.bitDepth <= 32), return kALAC_BadBitWidth ;) ; + RequireAction ((p->mMixBufferU != NULL) && (p->mMixBufferV != NULL) && (p->mPredictor != NULL), + status = kALAC_MemFullError ; goto Exit ;) ; + } + else + { + status = kALAC_BadSpecificConfigSize ; + } + + // skip to Channel Layout Info + // theActualCookie += sizeof (ALACSpecificConfig) ; + + // Currently, the Channel Layout Info portion of the magic cookie (as defined in the + // ALACMagicCookieDescription.txt document) is unused by the decoder. + +Exit: + return status ; +} + +/* + Decode () + - the decoded samples are interleaved into the output buffer in the order they arrive in + the bitstream +*/ +int32_t +alac_decode (ALAC_DECODER *p, struct BitBuffer * bits, int32_t * sampleBuffer, uint32_t numSamples, uint32_t * outNumSamples) +{ + BitBuffer shiftBits ; + uint32_t bits1, bits2 ; + uint8_t tag ; + uint8_t elementInstanceTag ; + AGParamRec agParams ; + uint32_t channelIndex ; + int16_t coefsU [32] ; // max possible size is 32 although NUMCOEPAIRS is the current limit + int16_t coefsV [32] ; + uint8_t numU, numV ; + uint8_t mixBits ; + int8_t mixRes ; + uint16_t unusedHeader ; + uint8_t escapeFlag ; + uint32_t chanBits ; + uint8_t bytesShifted ; + uint32_t shift ; + uint8_t modeU, modeV ; + uint32_t denShiftU, denShiftV ; + uint16_t pbFactorU, pbFactorV ; + uint16_t pb ; + int32_t * out32 ; + uint8_t headerByte ; + uint8_t partialFrame ; + uint32_t extraBits ; + int32_t val ; + uint32_t i, j ; + int32_t status ; + uint32_t numChannels = p->mNumChannels ; + + RequireAction ((bits != NULL) && (sampleBuffer != NULL) && (outNumSamples != NULL), return kALAC_ParamError ;) ; + RequireAction (p->mNumChannels > 0, return kALAC_ZeroChannelCount ;) ; + + p->mActiveElements = 0 ; + channelIndex = 0 ; + + status = ALAC_noErr ; + *outNumSamples = numSamples ; + + while (status == ALAC_noErr) + { + // bail if we ran off the end of the buffer + RequireAction (bits->cur < bits->end, status = kALAC_ParamError ; goto Exit ;) ; + + // copy global decode params for this element + pb = p->mConfig.pb ; + + // read element tag + tag = BitBufferReadSmall (bits, 3) ; + switch (tag) + { + case ID_SCE: + case ID_LFE: + { + // mono/LFE channel + elementInstanceTag = BitBufferReadSmall (bits, 4) ; + p->mActiveElements |= (1u << elementInstanceTag) ; + + // read the 12 unused header bits + unusedHeader = (uint16_t) BitBufferRead (bits, 12) ; + RequireAction (unusedHeader == 0, status = kALAC_ParamError ; goto Exit ;) ; + + // read the 1-bit "partial frame" flag, 2-bit "shift-off" flag & 1-bit "escape" flag + headerByte = (uint8_t) BitBufferRead (bits, 4) ; + + partialFrame = headerByte >> 3 ; + + bytesShifted = (headerByte >> 1) & 0x3u ; + RequireAction (bytesShifted != 3, status = kALAC_ParamError ; goto Exit ;) ; + + shift = bytesShifted * 8 ; + + escapeFlag = headerByte & 0x1 ; + + chanBits = p->mConfig.bitDepth - (bytesShifted * 8) ; + + // check for partial frame to override requested numSamples + if (partialFrame != 0) + { + numSamples = BitBufferRead (bits, 16) << 16 ; + numSamples |= BitBufferRead (bits, 16) ; + + RequireAction (numSamples < kALACDefaultFramesPerPacket, return kALAC_NumSamplesTooBig ;) ; + } + + if (escapeFlag == 0) + { + // compressed frame, read rest of parameters + mixBits = (uint8_t) BitBufferRead (bits, 8) ; + mixRes = (int8_t) BitBufferRead (bits, 8) ; + //Assert ((mixBits == 0) && (mixRes == 0)) ; // no mixing for mono + + headerByte = (uint8_t) BitBufferRead (bits, 8) ; + modeU = headerByte >> 4 ; + denShiftU = headerByte & 0xfu ; + + headerByte = (uint8_t) BitBufferRead (bits, 8) ; + pbFactorU = headerByte >> 5 ; + numU = headerByte & 0x1fu ; + + for (i = 0 ; i < numU ; i++) + coefsU [i] = (int16_t) BitBufferRead (bits, 16) ; + + // if shift active, skip the shift buffer but remember where it starts + if (bytesShifted != 0) + { + shiftBits = *bits ; + BitBufferAdvance (bits, (bytesShifted * 8) * numSamples) ; + } + + // decompress + set_ag_params (&agParams, p->mConfig.mb, (pb * pbFactorU) / 4, p->mConfig.kb, numSamples, numSamples, p->mConfig.maxRun) ; + status = dyn_decomp (&agParams, bits, p->mPredictor, numSamples, chanBits, &bits1) ; + RequireNoErr (status, goto Exit ;) ; + + if (modeU == 0) + { + unpc_block (p->mPredictor, p->mMixBufferU, numSamples, &coefsU [0], numU, chanBits, denShiftU) ; + } + else + { + // the special "numActive == 31" mode can be done in-place + unpc_block (p->mPredictor, p->mPredictor, numSamples, NULL, 31, chanBits, 0) ; + unpc_block (p->mPredictor, p->mMixBufferU, numSamples, &coefsU [0], numU, chanBits, denShiftU) ; + } + } + else + { + //Assert (bytesShifted == 0) ; + + // uncompressed frame, copy data into the mix buffer to use common output code + shift = 32 - chanBits ; + if (chanBits <= 16) + { + for (i = 0 ; i < numSamples ; i++) + { + val = (int32_t) BitBufferRead (bits, (uint8_t) chanBits) ; + val = (val << shift) >> shift ; + p->mMixBufferU [i] = val ; + } + } + else + { + // BitBufferRead () can't read more than 16 bits at a time so break up the reads + extraBits = chanBits - 16 ; + for (i = 0 ; i < numSamples ; i++) + { + val = (int32_t) BitBufferRead (bits, 16) ; + val = arith_shift_left (val, 16) >> shift ; + p->mMixBufferU [i] = val | BitBufferRead (bits, (uint8_t) extraBits) ; + } + } + + mixBits = mixRes = 0 ; + bits1 = chanBits * numSamples ; + bytesShifted = 0 ; + } + + // now read the shifted values into the shift buffer + if (bytesShifted != 0) + { + shift = bytesShifted * 8 ; + //Assert (shift <= 16) ; + + for (i = 0 ; i < numSamples ; i++) + p->mShiftBuffer [i] = (uint16_t) BitBufferRead (&shiftBits, (uint8_t) shift) ; + } + + // convert 32-bit integers into output buffer + switch (p->mConfig.bitDepth) + { + case 16: + out32 = sampleBuffer + channelIndex ; + for (i = 0, j = 0 ; i < numSamples ; i++, j += numChannels) + out32 [j] = arith_shift_left (p->mMixBufferU [i], 16) ; + break ; + case 20: + out32 = sampleBuffer + channelIndex ; + copyPredictorTo20 (p->mMixBufferU, out32, numChannels, numSamples) ; + break ; + case 24: + out32 = sampleBuffer + channelIndex ; + if (bytesShifted != 0) + copyPredictorTo24Shift (p->mMixBufferU, p->mShiftBuffer, out32, numChannels, numSamples, bytesShifted) ; + else + copyPredictorTo24 (p->mMixBufferU, out32, numChannels, numSamples) ; + break ; + case 32: + out32 = sampleBuffer + channelIndex ; + if (bytesShifted != 0) + copyPredictorTo32Shift (p->mMixBufferU, p->mShiftBuffer, out32, numChannels, numSamples, bytesShifted) ; + else + copyPredictorTo32 (p->mMixBufferU, out32, numChannels, numSamples) ; + break ; + } + + channelIndex += 1 ; + *outNumSamples = numSamples ; + break ; + } + + case ID_CPE: + { + // if decoding this pair would take us over the max channels limit, bail + if ((channelIndex + 2) > numChannels) + goto NoMoreChannels ; + + // stereo channel pair + elementInstanceTag = BitBufferReadSmall (bits, 4) ; + p->mActiveElements |= (1u << elementInstanceTag) ; + + // read the 12 unused header bits + unusedHeader = (uint16_t) BitBufferRead (bits, 12) ; + RequireAction (unusedHeader == 0, status = kALAC_ParamError ; goto Exit ;) ; + + // read the 1-bit "partial frame" flag, 2-bit "shift-off" flag & 1-bit "escape" flag + headerByte = (uint8_t) BitBufferRead (bits, 4) ; + + partialFrame = headerByte >> 3 ; + + bytesShifted = (headerByte >> 1) & 0x3u ; + RequireAction (bytesShifted != 3, status = kALAC_ParamError ; goto Exit ;) ; + + shift = bytesShifted * 8 ; + + escapeFlag = headerByte & 0x1 ; + + chanBits = p->mConfig.bitDepth - (bytesShifted * 8) + 1 ; + + // check for partial frame length to override requested numSamples + if (partialFrame != 0) + { + numSamples = BitBufferRead (bits, 16) << 16 ; + numSamples |= BitBufferRead (bits, 16) ; + + RequireAction (numSamples < kALACDefaultFramesPerPacket, return kALAC_NumSamplesTooBig ;) ; + } + + if (escapeFlag == 0) + { + // compressed frame, read rest of parameters + mixBits = (uint8_t) BitBufferRead (bits, 8) ; + mixRes = (int8_t) BitBufferRead (bits, 8) ; + + headerByte = (uint8_t) BitBufferRead (bits, 8) ; + modeU = headerByte >> 4 ; + denShiftU = headerByte & 0xfu ; + + headerByte = (uint8_t) BitBufferRead (bits, 8) ; + pbFactorU = headerByte >> 5 ; + numU = headerByte & 0x1fu ; + for (i = 0 ; i < numU ; i++) + coefsU [i] = (int16_t) BitBufferRead (bits, 16) ; + + headerByte = (uint8_t) BitBufferRead (bits, 8) ; + modeV = headerByte >> 4 ; + denShiftV = headerByte & 0xfu ; + + headerByte = (uint8_t) BitBufferRead (bits, 8) ; + pbFactorV = headerByte >> 5 ; + numV = headerByte & 0x1fu ; + for (i = 0 ; i < numV ; i++) + coefsV [i] = (int16_t) BitBufferRead (bits, 16) ; + + // if shift active, skip the interleaved shifted values but remember where they start + if (bytesShifted != 0) + { + shiftBits = *bits ; + BitBufferAdvance (bits, (bytesShifted * 8) * 2 * numSamples) ; + } + + // decompress and run predictor for "left" channel + set_ag_params (&agParams, p->mConfig.mb, (pb * pbFactorU) / 4, p->mConfig.kb, numSamples, numSamples, p->mConfig.maxRun) ; + status = dyn_decomp (&agParams, bits, p->mPredictor, numSamples, chanBits, &bits1) ; + RequireNoErr (status, goto Exit ;) ; + + if (modeU == 0) + { + unpc_block (p->mPredictor, p->mMixBufferU, numSamples, &coefsU [0], numU, chanBits, denShiftU) ; + } + else + { + // the special "numActive == 31" mode can be done in-place + unpc_block (p->mPredictor, p->mPredictor, numSamples, NULL, 31, chanBits, 0) ; + unpc_block (p->mPredictor, p->mMixBufferU, numSamples, &coefsU [0], numU, chanBits, denShiftU) ; + } + + // decompress and run predictor for "right" channel + set_ag_params (&agParams, p->mConfig.mb, (pb * pbFactorV) / 4, p->mConfig.kb, numSamples, numSamples, p->mConfig.maxRun) ; + status = dyn_decomp (&agParams, bits, p->mPredictor, numSamples, chanBits, &bits2) ; + RequireNoErr (status, goto Exit ;) ; + + if (modeV == 0) + { + unpc_block (p->mPredictor, p->mMixBufferV, numSamples, &coefsV [0], numV, chanBits, denShiftV) ; + } + else + { + // the special "numActive == 31" mode can be done in-place + unpc_block (p->mPredictor, p->mPredictor, numSamples, NULL, 31, chanBits, 0) ; + unpc_block (p->mPredictor, p->mMixBufferV, numSamples, &coefsV [0], numV, chanBits, denShiftV) ; + } + } + else + { + //Assert (bytesShifted == 0) ; + + // uncompressed frame, copy data into the mix buffers to use common output code + chanBits = p->mConfig.bitDepth ; + shift = 32 - chanBits ; + if (chanBits <= 16) + { + for (i = 0 ; i < numSamples ; i++) + { + val = (int32_t) BitBufferRead (bits, (uint8_t) chanBits) ; + val = (val << shift) >> shift ; + p->mMixBufferU [i] = val ; + + val = (int32_t) BitBufferRead (bits, (uint8_t) chanBits) ; + val = (val << shift) >> shift ; + p->mMixBufferV [i] = val ; + } + } + else + { + // BitBufferRead () can't read more than 16 bits at a time so break up the reads + extraBits = chanBits - 16 ; + for (i = 0 ; i < numSamples ; i++) + { + val = (int32_t) BitBufferRead (bits, 16) ; + val = (((uint32_t) val) << 16) >> shift ; + p->mMixBufferU [i] = val | BitBufferRead (bits, (uint8_t) extraBits) ; + + val = (int32_t) BitBufferRead (bits, 16) ; + val = ((uint32_t) val) >> shift ; + p->mMixBufferV [i] = val | BitBufferRead (bits, (uint8_t) extraBits) ; + } + } + + bits1 = chanBits * numSamples ; + bits2 = chanBits * numSamples ; + mixBits = mixRes = 0 ; + bytesShifted = 0 ; + } + + // now read the shifted values into the shift buffer + if (bytesShifted != 0) + { + shift = bytesShifted * 8 ; + //Assert (shift <= 16) ; + + for (i = 0 ; i < (numSamples * 2) ; i += 2) + { + p->mShiftBuffer [i + 0] = (uint16_t) BitBufferRead (&shiftBits, (uint8_t) shift) ; + p->mShiftBuffer [i + 1] = (uint16_t) BitBufferRead (&shiftBits, (uint8_t) shift) ; + } + } + + // un-mix the data and convert to output format + // - note that mixRes = 0 means just interleave so we use that path for uncompressed frames + switch (p->mConfig.bitDepth) + { + case 16: + out32 = sampleBuffer + channelIndex ; + unmix16 (p->mMixBufferU, p->mMixBufferV, out32, numChannels, numSamples, mixBits, mixRes) ; + break ; + case 20: + out32 = sampleBuffer + channelIndex ; + unmix20 (p->mMixBufferU, p->mMixBufferV, out32, numChannels, numSamples, mixBits, mixRes) ; + break ; + case 24: + out32 = sampleBuffer + channelIndex ; + unmix24 (p->mMixBufferU, p->mMixBufferV, out32, numChannels, numSamples, + mixBits, mixRes, p->mShiftBuffer, bytesShifted) ; + break ; + case 32: + out32 = sampleBuffer + channelIndex ; + unmix32 (p->mMixBufferU, p->mMixBufferV, out32, numChannels, numSamples, + mixBits, mixRes, p->mShiftBuffer, bytesShifted) ; + break ; + } + + channelIndex += 2 ; + *outNumSamples = numSamples ; + break ; + } + + case ID_CCE: + case ID_PCE: + { + // unsupported element, bail + //AssertNoErr (tag) ; + status = kALAC_UnsupportedElement ; + break ; + } + + case ID_DSE: + { + // data stream element -- parse but ignore + status = alac_data_stream_element (bits) ; + break ; + } + + case ID_FIL: + { + // fill element -- parse but ignore + status = alac_fill_element (bits) ; + break ; + } + + case ID_END: + { + // frame end, all done so byte align the frame and check for overruns + BitBufferByteAlign (bits, false) ; + //Assert (bits->cur == bits->end) ; + goto Exit ; + } + } + +#if 0 // ! DEBUG + // if we've decoded all of our channels, bail (but not in debug b/c we want to know if we're seeing bad bits) + // - this also protects us if the config does not match the bitstream or crap data bits follow the audio bits + if (channelIndex >= numChannels) + break ; +#endif + } + +NoMoreChannels: + + // if we get here and haven't decoded all of the requested channels, fill the remaining channels with zeros + for ( ; channelIndex < numChannels ; channelIndex++) + { + int32_t * fill32 = sampleBuffer + channelIndex ; + Zero32 (fill32, numSamples, numChannels) ; + } + +Exit: + return status ; +} + +#if PRAGMA_MARK +#pragma mark - +#endif + +/* + FillElement () + - they're just filler so we don't need 'em +*/ +static int32_t +alac_fill_element (struct BitBuffer * bits) +{ + int16_t count ; + + // 4-bit count or (4-bit + 8-bit count) if 4-bit count == 15 + // - plus this weird -1 thing I still don't fully understand + count = BitBufferReadSmall (bits, 4) ; + if (count == 15) + count += (int16_t) BitBufferReadSmall (bits, 8) - 1 ; + + BitBufferAdvance (bits, count * 8) ; + + RequireAction (bits->cur <= bits->end, return kALAC_ParamError ;) ; + + return ALAC_noErr ; +} + +/* + DataStreamElement () + - we don't care about data stream elements so just skip them +*/ +static int32_t +alac_data_stream_element (struct BitBuffer * bits) +{ + int32_t data_byte_align_flag ; + uint16_t count ; + + // the tag associates this data stream element with a given audio element + + /* element_instance_tag = */ BitBufferReadSmall (bits, 4) ; + + data_byte_align_flag = BitBufferReadOne (bits) ; + + // 8-bit count or (8-bit + 8-bit count) if 8-bit count == 255 + count = BitBufferReadSmall (bits, 8) ; + if (count == 255) + count += BitBufferReadSmall (bits, 8) ; + + // the align flag means the bitstream should be byte-aligned before reading the following data bytes + if (data_byte_align_flag) + BitBufferByteAlign (bits, false) ; + + // skip the data bytes + BitBufferAdvance (bits, count * 8) ; + + RequireAction (bits->cur <= bits->end, return kALAC_ParamError ;) ; + + return ALAC_noErr ; +} + +/* + ZeroN () + - helper routines to clear out output channel buffers when decoding fewer channels than requested +*/ +static void Zero32 (int32_t * buffer, uint32_t numItems, uint32_t stride) +{ + if (stride == 1) + { + memset (buffer, 0, numItems * sizeof (int32_t)) ; + } + else + { + for (uint32_t indx = 0 ; indx < (numItems * stride) ; indx += stride) + buffer [indx] = 0 ; + } +} diff --git a/libsndfile-1.0.31/src/ALAC/alac_encoder.c b/libsndfile-1.0.31/src/ALAC/alac_encoder.c new file mode 100644 index 0000000..599399a --- /dev/null +++ b/libsndfile-1.0.31/src/ALAC/alac_encoder.c @@ -0,0 +1,1333 @@ +/* + * Copyright (c) 2011 Apple Inc. All rights reserved. + * Copyright (C) 2012-2015 Erik de Castro Lopo + * + * @APPLE_APACHE_LICENSE_HEADER_START@ + * + * Licensed under the Apache License, Version 2.0 (the "License") ; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @APPLE_APACHE_LICENSE_HEADER_END@ + */ + +/* + File: ALACEncoder.cpp +*/ + +// build stuff +#define VERBOSE_DEBUG 0 +#define DebugMsg printf + +// headers +#include +#include +#include + +#include "sfendian.h" + +#include "alac_codec.h" + +#include "aglib.h" +#include "dplib.h" +#include "matrixlib.h" + +#include "ALACBitUtilities.h" +#include "ALACAudioTypes.h" +#include "EndianPortable.h" + +typedef enum +{ + false = 0, + true = 1 +} bool ; + +static void GetConfig (ALAC_ENCODER *p, ALACSpecificConfig * config) ; + +static int32_t EncodeStereo (ALAC_ENCODER *p, struct BitBuffer * bitstream, const int32_t * input, uint32_t stride, uint32_t channelIndex, uint32_t numSamples) ; +static int32_t EncodeStereoFast (ALAC_ENCODER *p, struct BitBuffer * bitstream, const int32_t * input, uint32_t stride, uint32_t channelIndex, uint32_t numSamples) ; +static int32_t EncodeStereoEscape (ALAC_ENCODER *p, struct BitBuffer * bitstream, const int32_t * input, uint32_t stride, uint32_t numSamples) ; +static int32_t EncodeMono (ALAC_ENCODER *p, struct BitBuffer * bitstream, const int32_t * input, uint32_t stride, uint32_t channelIndex, uint32_t numSamples) ; + + + +// Note: in C you can't typecast to a 2-dimensional array pointer but that's what we need when +// picking which coefs to use so we declare this typedef b/c we *can* typecast to this type +typedef int16_t (*SearchCoefs) [kALACMaxCoefs] ; + +// defines/constants +const uint32_t kALACEncoderMagic = MAKE_MARKER ('d', 'p', 'g', 'e') ; +const uint32_t kMaxSampleSize = 32 ; // max allowed bit width is 32 +const uint32_t kDefaultMixBits = 2 ; +const uint32_t kDefaultMixRes = 0 ; +const uint32_t kMaxRes = 4 ; +const uint32_t kDefaultNumUV = 8 ; +const uint32_t kMinUV = 4 ; +const uint32_t kMaxUV = 8 ; + +// static functions +#if VERBOSE_DEBUG +static void AddFiller (BitBuffer * bits, int32_t numBytes) ; +#endif + + +/* + Map Format: 3-bit field per channel which is the same as the "element tag" that should be placed + at the beginning of the frame for that channel. Indicates whether SCE, CPE, or LFE. + Each particular field is accessed via the current channel indx. Note that the channel + indx increments by two for channel pairs. + + For example: + + C L R 3-channel input = (ID_CPE << 3) | (ID_SCE) + indx 0 value = (map & (0x7ul << (0 * 3))) >> (0 * 3) + indx 1 value = (map & (0x7ul << (1 * 3))) >> (1 * 3) + + C L R Ls Rs LFE 5.1-channel input = (ID_LFE << 15) | (ID_CPE << 9) | (ID_CPE << 3) | (ID_SCE) + indx 0 value = (map & (0x7ul << (0 * 3))) >> (0 * 3) + indx 1 value = (map & (0x7ul << (1 * 3))) >> (1 * 3) + indx 3 value = (map & (0x7ul << (3 * 3))) >> (3 * 3) + indx 5 value = (map & (0x7ul << (5 * 3))) >> (5 * 3) + indx 7 value = (map & (0x7ul << (7 * 3))) >> (7 * 3) +*/ +static const uint32_t sChannelMaps [kALACMaxChannels] = +{ + ID_SCE, + ID_CPE, + (ID_CPE << 3) | (ID_SCE), + (ID_SCE << 9) | (ID_CPE << 3) | (ID_SCE), + (ID_CPE << 9) | (ID_CPE << 3) | (ID_SCE), + (ID_SCE << 15) | (ID_CPE << 9) | (ID_CPE << 3) | (ID_SCE), + (ID_SCE << 18) | (ID_SCE << 15) | (ID_CPE << 9) | (ID_CPE << 3) | (ID_SCE), + (ID_SCE << 21) | (ID_CPE << 15) | (ID_CPE << 9) | (ID_CPE << 3) | (ID_SCE) +} ; + +#if PRAGMA_MARK +#pragma mark - +#endif + +void +alac_set_fastmode (ALAC_ENCODER * p, int32_t fast) +{ + p->mFastMode = fast ; +} + + +/* + HEADER SPECIFICATION + + For every segment we adopt the following header: + + 1 byte reserved (always 0) + 1 byte flags (see below) + [4 byte frame length] (optional, see below) + ---Next, the per-segment ALAC parameters--- + 1 byte mixBits (middle-side parameter) + 1 byte mixRes (middle-side parameter, interpreted as signed char) + + 1 byte shiftU (4 bits modeU, 4 bits denShiftU) + 1 byte filterU (3 bits pbFactorU, 5 bits numU) + (numU) shorts (signed DP coefficients for V channel) + ---Next, 2nd-channel ALAC parameters in case of stereo mode--- + 1 byte shiftV (4 bits modeV, 4 bits denShiftV) + 1 byte filterV (3 bits pbFactorV, 5 bits numV) + (numV) shorts (signed DP coefficients for V channel) + ---After this come the shift-off bytes for (>= 24)-bit data (n-byte shift) if indicated--- + ---Then comes the AG-compressor bitstream--- + + + FLAGS + ----- + + The presence of certain flag bits changes the header format such that the parameters might + not even be sent. The currently defined flags format is: + + 0000psse + + where 0 = reserved, must be 0 + p = 1-bit field "partial frame" flag indicating 32-bit frame length follows this byte + ss = 2-bit field indicating "number of shift-off bytes ignored by compression" + e = 1-bit field indicating "escape" + + The "partial frame" flag means that the following segment is not equal to the frame length specified + in the out-of-band decoder configuration. This allows the decoder to deal with end-of-file partial + segments without incurring the 32-bit overhead for each segment. + + The "shift-off" field indicates the number of bytes at the bottom of the word that were passed through + uncompressed. The reason for this is that the entropy inherent in the LS bytes of >= 24-bit words + quite often means that the frame would have to be "escaped" b/c the compressed size would be >= the + uncompressed size. However, by shifting the input values down and running the remaining bits through + the normal compression algorithm, a net win can be achieved. If this field is non-zero, it means that + the shifted-off bytes follow after the parameter section of the header and before the compressed + bitstream. Note that doing this also allows us to use matrixing on 32-bit inputs after one or more + bytes are shifted off the bottom which helps the eventual compression ratio. For stereo channels, + the shifted off bytes are interleaved. + + The "escape" flag means that this segment was not compressed b/c the compressed size would be + >= uncompressed size. In that case, the audio data was passed through uncompressed after the header. + The other header parameter bytes will not be sent. + + + PARAMETERS + ---------- + + If the segment is not a partial or escape segment, the total header size (in bytes) is given exactly by: + + 4 + (2 + 2 * numU) (mono mode) + 4 + (2 + 2 * numV) + (2 + 2 * numV) (stereo mode) + + where the ALAC filter-lengths numU, numV are bounded by a + constant (in the current source, numU, numV <= NUMCOEPAIRS), and + this forces an absolute upper bound on header size. + + Each segment-decode process loads up these bytes from the front of the + local stream, in the above order, then follows with the entropy-encoded + bits for the given segment. + + To generalize middle-side, there are various mixing modes including middle-side, each lossless, + as embodied in the mix () and unmix () functions. These functions exploit a generalized middle-side + transformation: + + u := [(rL + (m-r)R)/m] ; + v := L - R ; + + where [ ] denotes integer floor. The (lossless) inverse is + + L = u + v - [rV/m] ; + R = L - v ; + + In the segment header, m and r are encoded in mixBits and mixRes. + Classical "middle-side" is obtained with m = 2, r = 1, but now + we have more generalized mixes. + + NOTES + ----- + The relevance of the ALAC coefficients is explained in detail + in patent documents. +*/ + +/* + EncodeStereo () + - encode a channel pair +*/ +static int32_t +EncodeStereo (ALAC_ENCODER *p, struct BitBuffer * bitstream, const int32_t * inputBuffer, uint32_t stride, uint32_t channelIndex, uint32_t numSamples) +{ + BitBuffer workBits ; + BitBuffer startBits = *bitstream ; // squirrel away copy of current state in case we need to go back and do an escape packet + AGParamRec agParams ; + uint32_t bits1, bits2 ; + uint32_t dilate ; + int32_t mixBits, mixRes, maxRes ; + uint32_t minBits, minBits1, minBits2 ; + uint32_t numU, numV ; + uint32_t mode ; + uint32_t pbFactor ; + uint32_t chanBits ; + uint8_t bytesShifted ; + SearchCoefs coefsU ; + SearchCoefs coefsV ; + uint32_t indx ; + uint8_t partialFrame ; + uint32_t escapeBits ; + bool doEscape ; + int32_t status = ALAC_noErr ; + int32_t bestRes ; + + // make sure we handle this bit-depth before we get going + RequireAction ((p->mBitDepth == 16) || (p->mBitDepth == 20) || (p->mBitDepth == 24) || (p->mBitDepth == 32), return kALAC_ParamError ;) ; + + // reload coefs pointers for this channel pair + // - note that, while you might think they should be re-initialized per block, retaining state across blocks + // actually results in better overall compression + // - strangely, re-using the same coefs for the different passes of the "mixRes" search loop instead of using + // different coefs for the different passes of "mixRes" results in even better compression + coefsU = (SearchCoefs) p->mCoefsU [channelIndex] ; + coefsV = (SearchCoefs) p->mCoefsV [channelIndex] ; + + // matrix encoding adds an extra bit but 32-bit inputs cannot be matrixed b/c 33 is too many + // so enable 16-bit "shift off" and encode in 17-bit mode + // - in addition, 24-bit mode really improves with one byte shifted off + if (p->mBitDepth == 32) + bytesShifted = 2 ; + else if (p->mBitDepth >= 24) + bytesShifted = 1 ; + else + bytesShifted = 0 ; + + chanBits = p->mBitDepth - (bytesShifted * 8) + 1 ; + + // flag whether or not this is a partial frame + partialFrame = (numSamples == p->mFrameSize) ? 0 : 1 ; + + // brute-force encode optimization loop + // - run over variations of the encoding params to find the best choice + mixBits = kDefaultMixBits ; + maxRes = kMaxRes ; + numU = numV = kDefaultNumUV ; + mode = 0 ; + pbFactor = 4 ; + dilate = 8 ; + + minBits = minBits1 = minBits2 = 1ul << 31 ; + + bestRes = p->mLastMixRes [channelIndex] ; + + for (mixRes = 0 ; mixRes <= maxRes ; mixRes++) + { + // mix the stereo inputs + switch (p->mBitDepth) + { + case 16: + mix16 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples / dilate, mixBits, mixRes) ; + break ; + case 20: + mix20 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples / dilate, mixBits, mixRes) ; + break ; + case 24: + // includes extraction of shifted-off bytes + mix24 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples / dilate, + mixBits, mixRes, p->mShiftBufferUV, bytesShifted) ; + break ; + case 32: + // includes extraction of shifted-off bytes + mix32 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples / dilate, + mixBits, mixRes, p->mShiftBufferUV, bytesShifted) ; + break ; + } + + BitBufferInit (&workBits, p->mWorkBuffer, p->mMaxOutputBytes) ; + + // run the dynamic predictors + pc_block (p->mMixBufferU, p->mPredictorU, numSamples / dilate, coefsU [numU - 1], numU, chanBits, DENSHIFT_DEFAULT) ; + pc_block (p->mMixBufferV, p->mPredictorV, numSamples / dilate, coefsV [numV - 1], numV, chanBits, DENSHIFT_DEFAULT) ; + + // run the lossless compressor on each channel + set_ag_params (&agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples / dilate, numSamples / dilate, MAX_RUN_DEFAULT) ; + status = dyn_comp (&agParams, p->mPredictorU, &workBits, numSamples / dilate, chanBits, &bits1) ; + RequireNoErr (status, goto Exit ;) ; + + set_ag_params (&agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples / dilate, numSamples / dilate, MAX_RUN_DEFAULT) ; + status = dyn_comp (&agParams, p->mPredictorV, &workBits, numSamples / dilate, chanBits, &bits2) ; + RequireNoErr (status, goto Exit ;) ; + + // look for best match + if ((bits1 + bits2) < minBits1) + { + minBits1 = bits1 + bits2 ; + bestRes = mixRes ; + } + } + + p->mLastMixRes [channelIndex] = (int16_t) bestRes ; + + // mix the stereo inputs with the current best mixRes + mixRes = p->mLastMixRes [channelIndex] ; + switch (p->mBitDepth) + { + case 16: + mix16 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, mixBits, mixRes) ; + break ; + case 20: + mix20 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, mixBits, mixRes) ; + break ; + case 24: + // also extracts the shifted off bytes into the shift buffers + mix24 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, + mixBits, mixRes, p->mShiftBufferUV, bytesShifted) ; + break ; + case 32: + // also extracts the shifted off bytes into the shift buffers + mix32 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, + mixBits, mixRes, p->mShiftBufferUV, bytesShifted) ; + break ; + } + + // now it's time for the predictor coefficient search loop + numU = numV = kMinUV ; + minBits1 = minBits2 = 1ul << 31 ; + + for (uint32_t numUV = kMinUV ; numUV <= kMaxUV ; numUV += 4) + { + BitBufferInit (&workBits, p->mWorkBuffer, p->mMaxOutputBytes) ; + + dilate = 32 ; + + // run the predictor over the same data multiple times to help it converge + for (uint32_t converge = 0 ; converge < 8 ; converge++) + { + pc_block (p->mMixBufferU, p->mPredictorU, numSamples / dilate, coefsU [numUV-1], numUV, chanBits, DENSHIFT_DEFAULT) ; + pc_block (p->mMixBufferV, p->mPredictorV, numSamples / dilate, coefsV [numUV-1], numUV, chanBits, DENSHIFT_DEFAULT) ; + } + + dilate = 8 ; + + set_ag_params (&agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples / dilate, numSamples / dilate, MAX_RUN_DEFAULT) ; + status = dyn_comp (&agParams, p->mPredictorU, &workBits, numSamples / dilate, chanBits, &bits1) ; + + if ((bits1 * dilate + 16 * numUV) < minBits1) + { + minBits1 = bits1 * dilate + 16 * numUV ; + numU = numUV ; + } + + set_ag_params (&agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples / dilate, numSamples / dilate, MAX_RUN_DEFAULT) ; + status = dyn_comp (&agParams, p->mPredictorV, &workBits, numSamples / dilate, chanBits, &bits2) ; + + if ((bits2 * dilate + 16 * numUV) < minBits2) + { + minBits2 = bits2 * dilate + 16 * numUV ; + numV = numUV ; + } + } + + // test for escape hatch if best calculated compressed size turns out to be more than the input size + minBits = minBits1 + minBits2 + (8 /* mixRes/maxRes/etc. */ * 8) + ((partialFrame == true) ? 32 : 0) ; + if (bytesShifted != 0) + minBits += (numSamples * (bytesShifted * 8) * 2) ; + + escapeBits = (numSamples * p->mBitDepth * 2) + ((partialFrame == true) ? 32 : 0) + (2 * 8) ; /* 2 common header bytes */ + + doEscape = (minBits >= escapeBits) ? true : false ; + + if (doEscape == false) + { + // write bitstream header and coefs + BitBufferWrite (bitstream, 0, 12) ; + BitBufferWrite (bitstream, (partialFrame << 3) | (bytesShifted << 1), 4) ; + if (partialFrame) + BitBufferWrite (bitstream, numSamples, 32) ; + BitBufferWrite (bitstream, mixBits, 8) ; + BitBufferWrite (bitstream, mixRes, 8) ; + + //Assert ((mode < 16) && (DENSHIFT_DEFAULT < 16)) ; + //Assert ((pbFactor < 8) && (numU < 32)) ; + //Assert ((pbFactor < 8) && (numV < 32)) ; + + BitBufferWrite (bitstream, (mode << 4) | DENSHIFT_DEFAULT, 8) ; + BitBufferWrite (bitstream, (pbFactor << 5) | numU, 8) ; + for (indx = 0 ; indx < numU ; indx++) + BitBufferWrite (bitstream, coefsU [numU - 1][indx], 16) ; + + BitBufferWrite (bitstream, (mode << 4) | DENSHIFT_DEFAULT, 8) ; + BitBufferWrite (bitstream, (pbFactor << 5) | numV, 8) ; + for (indx = 0 ; indx < numV ; indx++) + BitBufferWrite (bitstream, coefsV [numV - 1][indx], 16) ; + + // if shift active, write the interleaved shift buffers + if (bytesShifted != 0) + { + uint32_t bitShift = bytesShifted * 8 ; + + //Assert (bitShift <= 16) ; + + for (indx = 0 ; indx < (numSamples * 2) ; indx += 2) + { + uint32_t shiftedVal ; + + shiftedVal = ((uint32_t) p->mShiftBufferUV [indx + 0] << bitShift) | (uint32_t) p->mShiftBufferUV [indx + 1] ; + BitBufferWrite (bitstream, shiftedVal, bitShift * 2) ; + } + } + + // run the dynamic predictor and lossless compression for the "left" channel + // - note: to avoid allocating more buffers, we're mixing and matching between the available buffers instead + // of only using "U" buffers for the U-channel and "V" buffers for the V-channel + if (mode == 0) + { + pc_block (p->mMixBufferU, p->mPredictorU, numSamples, coefsU [numU - 1], numU, chanBits, DENSHIFT_DEFAULT) ; + } + else + { + pc_block (p->mMixBufferU, p->mPredictorV, numSamples, coefsU [numU - 1], numU, chanBits, DENSHIFT_DEFAULT) ; + pc_block (p->mPredictorV, p->mPredictorU, numSamples, NULL, 31, chanBits, 0) ; + } + + set_ag_params (&agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples, numSamples, MAX_RUN_DEFAULT) ; + status = dyn_comp (&agParams, p->mPredictorU, bitstream, numSamples, chanBits, &bits1) ; + RequireNoErr (status, goto Exit ;) ; + + // run the dynamic predictor and lossless compression for the "right" channel + if (mode == 0) + { + pc_block (p->mMixBufferV, p->mPredictorV, numSamples, coefsV [numV - 1], numV, chanBits, DENSHIFT_DEFAULT) ; + } + else + { + pc_block (p->mMixBufferV, p->mPredictorU, numSamples, coefsV [numV - 1], numV, chanBits, DENSHIFT_DEFAULT) ; + pc_block (p->mPredictorU, p->mPredictorV, numSamples, NULL, 31, chanBits, 0) ; + } + + set_ag_params (&agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples, numSamples, MAX_RUN_DEFAULT) ; + status = dyn_comp (&agParams, p->mPredictorV, bitstream, numSamples, chanBits, &bits2) ; + RequireNoErr (status, goto Exit ;) ; + + /* if we happened to create a compressed packet that was actually bigger than an escape packet would be, + chuck it and do an escape packet + */ + minBits = BitBufferGetPosition (bitstream) - BitBufferGetPosition (&startBits) ; + if (minBits >= escapeBits) + { + *bitstream = startBits ; // reset bitstream state + doEscape = true ; + printf ("compressed frame too big: %u vs. %u \n", minBits, escapeBits) ; + } + } + + if (doEscape == true) + { + /* escape */ + status = EncodeStereoEscape (p, bitstream, inputBuffer, stride, numSamples) ; + +#if VERBOSE_DEBUG + DebugMsg ("escape!: %u vs %u\n", minBits, escapeBits) ; +#endif + } + +Exit: + return status ; +} + +/* + EncodeStereoFast () + - encode a channel pair without the search loop for maximum possible speed +*/ +static int32_t +EncodeStereoFast (ALAC_ENCODER *p, struct BitBuffer * bitstream, const int32_t * inputBuffer, uint32_t stride, uint32_t channelIndex, uint32_t numSamples) +{ + BitBuffer startBits = *bitstream ; // squirrel away current bit position in case we decide to use escape hatch + AGParamRec agParams ; + uint32_t bits1, bits2 ; + int32_t mixBits, mixRes ; + uint32_t minBits, minBits1, minBits2 ; + uint32_t numU, numV ; + uint32_t mode ; + uint32_t pbFactor ; + uint32_t chanBits ; + uint8_t bytesShifted ; + SearchCoefs coefsU ; + SearchCoefs coefsV ; + uint32_t indx ; + uint8_t partialFrame ; + uint32_t escapeBits ; + bool doEscape ; + int32_t status ; + + // make sure we handle this bit-depth before we get going + RequireAction ((p->mBitDepth == 16) || (p->mBitDepth == 20) || (p->mBitDepth == 24) || (p->mBitDepth == 32), return kALAC_ParamError ;) ; + + // reload coefs pointers for this channel pair + // - note that, while you might think they should be re-initialized per block, retaining state across blocks + // actually results in better overall compression + // - strangely, re-using the same coefs for the different passes of the "mixRes" search loop instead of using + // different coefs for the different passes of "mixRes" results in even better compression + coefsU = (SearchCoefs) p->mCoefsU [channelIndex] ; + coefsV = (SearchCoefs) p->mCoefsV [channelIndex] ; + + // matrix encoding adds an extra bit but 32-bit inputs cannot be matrixed b/c 33 is too many + // so enable 16-bit "shift off" and encode in 17-bit mode + // - in addition, 24-bit mode really improves with one byte shifted off + if (p->mBitDepth == 32) + bytesShifted = 2 ; + else if (p->mBitDepth >= 24) + bytesShifted = 1 ; + else + bytesShifted = 0 ; + + chanBits = p->mBitDepth - (bytesShifted * 8) + 1 ; + + // flag whether or not this is a partial frame + partialFrame = (numSamples == p->mFrameSize) ? 0 : 1 ; + + // set up default encoding parameters for "fast" mode + mixBits = kDefaultMixBits ; + mixRes = kDefaultMixRes ; + numU = numV = kDefaultNumUV ; + mode = 0 ; + pbFactor = 4 ; + + minBits = minBits1 = minBits2 = 1ul << 31 ; + + // mix the stereo inputs with default mixBits/mixRes + switch (p->mBitDepth) + { + case 16: + mix16 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, mixBits, mixRes) ; + break ; + case 20: + mix20 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, mixBits, mixRes) ; + break ; + case 24: + // also extracts the shifted off bytes into the shift buffers + mix24 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, + mixBits, mixRes, p->mShiftBufferUV, bytesShifted) ; + break ; + case 32: + // also extracts the shifted off bytes into the shift buffers + mix32 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, + mixBits, mixRes, p->mShiftBufferUV, bytesShifted) ; + break ; + } + + /* speculatively write the bitstream assuming the compressed version will be smaller */ + + // write bitstream header and coefs + BitBufferWrite (bitstream, 0, 12) ; + BitBufferWrite (bitstream, (partialFrame << 3) | (bytesShifted << 1), 4) ; + if (partialFrame) + BitBufferWrite (bitstream, numSamples, 32) ; + BitBufferWrite (bitstream, mixBits, 8) ; + BitBufferWrite (bitstream, mixRes, 8) ; + + //Assert ((mode < 16) && (DENSHIFT_DEFAULT < 16)) ; + //Assert ((pbFactor < 8) && (numU < 32)) ; + //Assert ((pbFactor < 8) && (numV < 32)) ; + + BitBufferWrite (bitstream, (mode << 4) | DENSHIFT_DEFAULT, 8) ; + BitBufferWrite (bitstream, (pbFactor << 5) | numU, 8) ; + for (indx = 0 ; indx < numU ; indx++) + BitBufferWrite (bitstream, coefsU [numU - 1][indx], 16) ; + + BitBufferWrite (bitstream, (mode << 4) | DENSHIFT_DEFAULT, 8) ; + BitBufferWrite (bitstream, (pbFactor << 5) | numV, 8) ; + for (indx = 0 ; indx < numV ; indx++) + BitBufferWrite (bitstream, coefsV [numV - 1][indx], 16) ; + + // if shift active, write the interleaved shift buffers + if (bytesShifted != 0) + { + uint32_t bitShift = bytesShifted * 8 ; + + //Assert (bitShift <= 16) ; + + for (indx = 0 ; indx < (numSamples * 2) ; indx += 2) + { + uint32_t shiftedVal ; + + shiftedVal = ((uint32_t) p->mShiftBufferUV [indx + 0] << bitShift) | (uint32_t) p->mShiftBufferUV [indx + 1] ; + BitBufferWrite (bitstream, shiftedVal, bitShift * 2) ; + } + } + + // run the dynamic predictor and lossless compression for the "left" channel + // - note: we always use mode 0 in the "fast" path so we don't need the code for mode != 0 + pc_block (p->mMixBufferU, p->mPredictorU, numSamples, coefsU [numU - 1], numU, chanBits, DENSHIFT_DEFAULT) ; + + set_ag_params (&agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples, numSamples, MAX_RUN_DEFAULT) ; + status = dyn_comp (&agParams, p->mPredictorU, bitstream, numSamples, chanBits, &bits1) ; + RequireNoErr (status, goto Exit ;) ; + + // run the dynamic predictor and lossless compression for the "right" channel + pc_block (p->mMixBufferV, p->mPredictorV, numSamples, coefsV [numV - 1], numV, chanBits, DENSHIFT_DEFAULT) ; + + set_ag_params (&agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples, numSamples, MAX_RUN_DEFAULT) ; + status = dyn_comp (&agParams, p->mPredictorV, bitstream, numSamples, chanBits, &bits2) ; + RequireNoErr (status, goto Exit ;) ; + + // do bit requirement calculations + minBits1 = bits1 + (numU * sizeof (int16_t) * 8) ; + minBits2 = bits2 + (numV * sizeof (int16_t) * 8) ; + + // test for escape hatch if best calculated compressed size turns out to be more than the input size + minBits = minBits1 + minBits2 + (8 /* mixRes/maxRes/etc. */ * 8) + ((partialFrame == true) ? 32 : 0) ; + if (bytesShifted != 0) + minBits += (numSamples * (bytesShifted * 8) * 2) ; + + escapeBits = (numSamples * p->mBitDepth * 2) + ((partialFrame == true) ? 32 : 0) + (2 * 8) ; /* 2 common header bytes */ + + doEscape = (minBits >= escapeBits) ? true : false ; + + if (doEscape == false) + { + /* if we happened to create a compressed packet that was actually bigger than an escape packet would be, + chuck it and do an escape packet + */ + minBits = BitBufferGetPosition (bitstream) - BitBufferGetPosition (&startBits) ; + if (minBits >= escapeBits) + { + doEscape = true ; + printf ("compressed frame too big: %u vs. %u\n", minBits, escapeBits) ; + } + + } + + if (doEscape == true) + { + /* escape */ + + // reset bitstream position since we speculatively wrote the compressed version + *bitstream = startBits ; + + // write escape frame + status = EncodeStereoEscape (p, bitstream, inputBuffer, stride, numSamples) ; + +#if VERBOSE_DEBUG + DebugMsg ("escape!: %u vs %u\n", minBits, (numSamples * p->mBitDepth * 2)) ; +#endif + } + +Exit: + return status ; +} + +/* + EncodeStereoEscape () + - encode stereo escape frame +*/ +static int32_t +EncodeStereoEscape (ALAC_ENCODER *p, struct BitBuffer * bitstream, const int32_t * inputBuffer, uint32_t stride, uint32_t numSamples) +{ + uint8_t partialFrame ; + uint32_t indx ; + + // flag whether or not this is a partial frame + partialFrame = (numSamples == p->mFrameSize) ? 0 : 1 ; + + // write bitstream header + BitBufferWrite (bitstream, 0, 12) ; + BitBufferWrite (bitstream, (partialFrame << 3) | 1, 4) ; // LSB = 1 means "frame not compressed" + if (partialFrame) + BitBufferWrite (bitstream, numSamples, 32) ; + + // just copy the input data to the output buffer + switch (p->mBitDepth) + { + case 16: + for (indx = 0 ; indx < (numSamples * stride) ; indx += stride) + { + BitBufferWrite (bitstream, inputBuffer [indx + 0] >> 16, 16) ; + BitBufferWrite (bitstream, inputBuffer [indx + 1] >> 16, 16) ; + } + break ; + case 20: + for (indx = 0 ; indx < (numSamples * stride) ; indx += stride) + { + BitBufferWrite (bitstream, inputBuffer [indx + 0] >> 12, 16) ; + BitBufferWrite (bitstream, inputBuffer [indx + 1] >> 12, 16) ; + } + break ; + case 24: + // mix24 () with mixres param = 0 means de-interleave so use it to simplify things + mix24 (inputBuffer, stride, p->mMixBufferU, p->mMixBufferV, numSamples, 0, 0, p->mShiftBufferUV, 0) ; + for (indx = 0 ; indx < numSamples ; indx++) + { + BitBufferWrite (bitstream, p->mMixBufferU [indx] >> 8, 24) ; + BitBufferWrite (bitstream, p->mMixBufferV [indx] >> 8, 24) ; + } + break ; + case 32: + for (indx = 0 ; indx < (numSamples * stride) ; indx += stride) + { + BitBufferWrite (bitstream, inputBuffer [indx + 0], 32) ; + BitBufferWrite (bitstream, inputBuffer [indx + 1], 32) ; + } + break ; + } + + return ALAC_noErr ; +} + +/* + EncodeMono () + - encode a mono input buffer +*/ +static int32_t +EncodeMono (ALAC_ENCODER *p, struct BitBuffer * bitstream, const int32_t * inputBuffer, uint32_t stride, uint32_t channelIndex, uint32_t numSamples) +{ + BitBuffer startBits = *bitstream ; // squirrel away copy of current state in case we need to go back and do an escape packet + AGParamRec agParams ; + uint32_t bits1 ; + uint32_t numU ; + SearchCoefs coefsU ; + uint32_t dilate ; + uint32_t minBits, bestU ; + uint32_t minU, maxU ; + uint32_t indx, indx2 ; + uint8_t bytesShifted ; + uint32_t shift ; + uint32_t mask ; + uint32_t chanBits ; + uint8_t pbFactor ; + uint8_t partialFrame ; + uint32_t escapeBits ; + bool doEscape ; + int32_t status = ALAC_noErr ; + + + // make sure we handle this bit-depth before we get going + RequireAction ((p->mBitDepth == 16) || (p->mBitDepth == 20) || (p->mBitDepth == 24) || (p->mBitDepth == 32), return kALAC_ParamError ;) ; + + // reload coefs array from previous frame + coefsU = (SearchCoefs) p->mCoefsU [channelIndex] ; + + // pick bit depth for actual encoding + // - we lop off the lower byte (s) for 24-/32-bit encodings + if (p->mBitDepth == 32) + bytesShifted = 2 ; + else if (p->mBitDepth >= 24) + bytesShifted = 1 ; + else + bytesShifted = 0 ; + + shift = bytesShifted * 8 ; + mask = (1ul << shift) - 1 ; + chanBits = p->mBitDepth - (bytesShifted * 8) ; + + // flag whether or not this is a partial frame + partialFrame = (numSamples == p->mFrameSize) ? 0 : 1 ; + + // convert N-bit data to 32-bit for predictor + switch (p->mBitDepth) + { + case 16: + // convert 16-bit data to 32-bit for predictor + for (indx = 0, indx2 = 0 ; indx < numSamples ; indx++, indx2 += stride) + p->mMixBufferU [indx] = inputBuffer [indx2] >> 16 ; + break ; + + case 20: + // convert 20-bit data to 32-bit for predictor + for (indx = 0, indx2 = 0 ; indx < numSamples ; indx++, indx2 += stride) + p->mMixBufferU [indx] = inputBuffer [indx2] >> 12 ; + break ; + case 24: + // convert 24-bit data to 32-bit for the predictor and extract the shifted off byte (s) + for (indx = 0, indx2 = 0 ; indx < numSamples ; indx++, indx2 += stride) + { + p->mMixBufferU [indx] = inputBuffer [indx2] >> 8 ; + p->mShiftBufferUV [indx] = (uint16_t) (p->mMixBufferU [indx] & mask) ; + p->mMixBufferU [indx] >>= shift ; + } + + break ; + case 32: + // just copy the 32-bit input data for the predictor and extract the shifted off byte (s) + for (indx = 0, indx2 = 0 ; indx < numSamples ; indx++, indx2 += stride) + { + p->mShiftBufferUV [indx] = (uint16_t) (inputBuffer [indx2] & mask) ; + p->mMixBufferU [indx] = inputBuffer [indx2] >> shift ; + } + break ; + } + + // brute-force encode optimization loop (implied "encode depth" of 0 if comparing to cmd line tool) + // - run over variations of the encoding params to find the best choice + minU = 4 ; + maxU = 8 ; + minBits = 1ul << 31 ; + pbFactor = 4 ; + + bestU = minU ; + + for (numU = minU ; numU <= maxU ; numU += 4) + { + BitBuffer workBits ; + uint32_t numBits ; + + BitBufferInit (&workBits, p->mWorkBuffer, p->mMaxOutputBytes) ; + + dilate = 32 ; + for (uint32_t converge = 0 ; converge < 7 ; converge++) + pc_block (p->mMixBufferU, p->mPredictorU, numSamples / dilate, coefsU [numU - 1], numU, chanBits, DENSHIFT_DEFAULT) ; + + dilate = 8 ; + pc_block (p->mMixBufferU, p->mPredictorU, numSamples / dilate, coefsU [numU - 1], numU, chanBits, DENSHIFT_DEFAULT) ; + + set_ag_params (&agParams, MB0, (pbFactor * PB0) / 4, KB0, numSamples / dilate, numSamples / dilate, MAX_RUN_DEFAULT) ; + status = dyn_comp (&agParams, p->mPredictorU, &workBits, numSamples / dilate, chanBits, &bits1) ; + RequireNoErr (status, goto Exit ;) ; + + numBits = (dilate * bits1) + (16 * numU) ; + if (numBits < minBits) + { + bestU = numU ; + minBits = numBits ; + } + } + + // test for escape hatch if best calculated compressed size turns out to be more than the input size + // - first, add bits for the header bytes mixRes/maxRes/shiftU/filterU + minBits += (4 /* mixRes/maxRes/etc. */ * 8) + ((partialFrame == true) ? 32 : 0) ; + if (bytesShifted != 0) + minBits += (numSamples * (bytesShifted * 8)) ; + + escapeBits = (numSamples * p->mBitDepth) + ((partialFrame == true) ? 32 : 0) + (2 * 8) ; /* 2 common header bytes */ + + doEscape = (minBits >= escapeBits) ? true : false ; + + if (doEscape == false) + { + // write bitstream header + BitBufferWrite (bitstream, 0, 12) ; + BitBufferWrite (bitstream, (partialFrame << 3) | (bytesShifted << 1), 4) ; + if (partialFrame) + BitBufferWrite (bitstream, numSamples, 32) ; + BitBufferWrite (bitstream, 0, 16) ; // mixBits = mixRes = 0 + + // write the params and predictor coefs + numU = bestU ; + BitBufferWrite (bitstream, (0 << 4) | DENSHIFT_DEFAULT, 8) ; // modeU = 0 + BitBufferWrite (bitstream, (pbFactor << 5) | numU, 8) ; + for (indx = 0 ; indx < numU ; indx++) + BitBufferWrite (bitstream, coefsU [numU-1][indx], 16) ; + + // if shift active, write the interleaved shift buffers + if (bytesShifted != 0) + { + for (indx = 0 ; indx < numSamples ; indx++) + BitBufferWrite (bitstream, p->mShiftBufferUV [indx], shift) ; + } + + // run the dynamic predictor with the best result + pc_block (p->mMixBufferU, p->mPredictorU, numSamples, coefsU [numU-1], numU, chanBits, DENSHIFT_DEFAULT) ; + + // do lossless compression + set_standard_ag_params (&agParams, numSamples, numSamples) ; + status = dyn_comp (&agParams, p->mPredictorU, bitstream, numSamples, chanBits, &bits1) ; + //AssertNoErr (status) ; + + + /* if we happened to create a compressed packet that was actually bigger than an escape packet would be, + chuck it and do an escape packet + */ + minBits = BitBufferGetPosition (bitstream) - BitBufferGetPosition (&startBits) ; + if (minBits >= escapeBits) + { + *bitstream = startBits ; // reset bitstream state + doEscape = true ; + printf ("compressed frame too big: %u vs. %u\n", minBits, escapeBits) ; + } + } + + if (doEscape == true) + { + // write bitstream header and coefs + BitBufferWrite (bitstream, 0, 12) ; + BitBufferWrite (bitstream, (partialFrame << 3) | 1, 4) ; // LSB = 1 means "frame not compressed" + if (partialFrame) + BitBufferWrite (bitstream, numSamples, 32) ; + + // just copy the input data to the output buffer + switch (p->mBitDepth) + { + case 16: + for (indx = 0 ; indx < (numSamples * stride) ; indx += stride) + BitBufferWrite (bitstream, inputBuffer [indx] >> 16, 16) ; + break ; + case 20: + // convert 20-bit data to 32-bit for simplicity + for (indx = 0 ; indx < (numSamples * stride) ; indx += stride) + BitBufferWrite (bitstream, inputBuffer [indx] >> 12, 20) ; + break ; + case 24: + // convert 24-bit data to 32-bit for simplicity + for (indx = 0, indx2 = 0 ; indx < numSamples ; indx++, indx2 += stride) + { + p->mMixBufferU [indx] = inputBuffer [indx2] >> 8 ; + BitBufferWrite (bitstream, p->mMixBufferU [indx], 24) ; + } + break ; + case 32: + for (indx = 0 ; indx < (numSamples * stride) ; indx += stride) + BitBufferWrite (bitstream, inputBuffer [indx], 32) ; + break ; + } +#if VERBOSE_DEBUG + DebugMsg ("escape!: %u vs %u\n", minBits, (numSamples * p->mBitDepth)) ; +#endif + } + +Exit: + return status ; +} + +#if PRAGMA_MARK +#pragma mark - +#endif + +/* + Encode () + - encode the next block of samples +*/ +int32_t +alac_encode (ALAC_ENCODER *p, uint32_t numSamples, + const int32_t * theReadBuffer, unsigned char * theWriteBuffer, uint32_t * ioNumBytes) +{ + uint32_t outputSize ; + BitBuffer bitstream ; + int32_t status ; + uint32_t numChannels = p->mNumChannels ; + + // make sure we handle this bit-depth before we get going + RequireAction ((p->mBitDepth == 16) || (p->mBitDepth == 20) || (p->mBitDepth == 24) || (p->mBitDepth == 32), return kALAC_ParamError ;) ; + + // create a bit buffer structure pointing to our output buffer + BitBufferInit (&bitstream, theWriteBuffer, p->mMaxOutputBytes) ; + + if (numChannels == 2) + { + // add 3-bit frame start tag ID_CPE = channel pair & 4-bit element instance tag = 0 + BitBufferWrite (&bitstream, ID_CPE, 3) ; + BitBufferWrite (&bitstream, 0, 4) ; + + // encode stereo input buffer + if (p->mFastMode == false) + status = EncodeStereo (p, &bitstream, theReadBuffer, 2, 0, numSamples) ; + else + status = EncodeStereoFast (p, &bitstream, theReadBuffer, 2, 0, numSamples) ; + RequireNoErr (status, goto Exit ;) ; + } + else if (numChannels == 1) + { + // add 3-bit frame start tag ID_SCE = mono channel & 4-bit element instance tag = 0 + BitBufferWrite (&bitstream, ID_SCE, 3) ; + BitBufferWrite (&bitstream, 0, 4) ; + + // encode mono input buffer + status = EncodeMono (p, &bitstream, theReadBuffer, 1, 0, numSamples) ; + RequireNoErr (status, goto Exit ;) ; + } + else + { + const int32_t * inputBuffer ; + uint32_t tag ; + uint32_t channelIndex ; + uint8_t stereoElementTag ; + uint8_t monoElementTag ; + uint8_t lfeElementTag ; + + inputBuffer = theReadBuffer ; + + stereoElementTag = 0 ; + monoElementTag = 0 ; + lfeElementTag = 0 ; + + for (channelIndex = 0 ; channelIndex < numChannels ;) + { + tag = (sChannelMaps [numChannels - 1] & (0x7ul << (channelIndex * 3))) >> (channelIndex * 3) ; + + BitBufferWrite (&bitstream, tag, 3) ; + switch (tag) + { + case ID_SCE: + // mono + BitBufferWrite (&bitstream, monoElementTag, 4) ; + + status = EncodeMono (p, &bitstream, inputBuffer, numChannels, channelIndex, numSamples) ; + + inputBuffer += 1 ; + channelIndex++ ; + monoElementTag++ ; + break ; + + case ID_CPE: + // stereo + BitBufferWrite (&bitstream, stereoElementTag, 4) ; + + status = EncodeStereo (p, &bitstream, inputBuffer, numChannels, channelIndex, numSamples) ; + + inputBuffer += 2 ; + channelIndex += 2 ; + stereoElementTag++ ; + break ; + + case ID_LFE: + // LFE channel (subwoofer) + BitBufferWrite (&bitstream, lfeElementTag, 4) ; + + status = EncodeMono (p, &bitstream, inputBuffer, numChannels, channelIndex, numSamples) ; + + inputBuffer += 1 ; + channelIndex++ ; + lfeElementTag++ ; + break ; + + default: + printf ("That ain't right! (%u)\n", tag) ; + status = kALAC_ParamError ; + goto Exit ; + } + + RequireNoErr (status, goto Exit ;) ; + } + } + +#if VERBOSE_DEBUG +{ + // if there is room left in the output buffer, add some random fill data to test decoder + int32_t bitsLeft ; + int32_t bytesLeft ; + + bitsLeft = BitBufferGetPosition (&bitstream) - 3 ; // - 3 for ID_END tag + bytesLeft = bitstream.byteSize - ((bitsLeft + 7) / 8) ; + + if ((bytesLeft > 20) && ((bytesLeft & 0x4u) != 0)) + AddFiller (&bitstream, bytesLeft) ; +} +#endif + + // add 3-bit frame end tag: ID_END + BitBufferWrite (&bitstream, ID_END, 3) ; + + // byte-align the output data + BitBufferByteAlign (&bitstream, true) ; + + outputSize = BitBufferGetPosition (&bitstream) / 8 ; + //Assert (outputSize <= mMaxOutputBytes) ; + + + // all good, let iTunes know what happened and remember the total number of input sample frames + *ioNumBytes = outputSize ; + //mEncodedFrames += encodeMsg->numInputSamples ; + + // gather encoding stats + p->mTotalBytesGenerated += outputSize ; + p->mMaxFrameBytes = MAX (p->mMaxFrameBytes, outputSize) ; + + status = ALAC_noErr ; + +Exit: + return status ; +} + + +#if PRAGMA_MARK +#pragma mark - +#endif + +/* + GetConfig () +*/ +void +GetConfig (ALAC_ENCODER *p, ALACSpecificConfig * config) +{ + config->frameLength = Swap32NtoB (p->mFrameSize) ; + config->compatibleVersion = (uint8_t) kALACCompatibleVersion ; + config->bitDepth = (uint8_t) p->mBitDepth ; + config->pb = (uint8_t) PB0 ; + config->kb = (uint8_t) KB0 ; + config->mb = (uint8_t) MB0 ; + config->numChannels = (uint8_t) p->mNumChannels ; + config->maxRun = Swap16NtoB ((uint16_t) MAX_RUN_DEFAULT) ; + config->maxFrameBytes = Swap32NtoB (p->mMaxFrameBytes) ; + config->avgBitRate = Swap32NtoB (p->mAvgBitRate) ; + config->sampleRate = Swap32NtoB (p->mOutputSampleRate) ; +} + +uint32_t +alac_get_magic_cookie_size (uint32_t inNumChannels) +{ + if (inNumChannels > 2) + { + return sizeof (ALACSpecificConfig) + kChannelAtomSize + sizeof (ALACAudioChannelLayout) ; + } + else + { + return sizeof (ALACSpecificConfig) ; + } +} + +void +alac_get_magic_cookie (ALAC_ENCODER *p, void * outCookie, uint32_t * ioSize) +{ + ALACSpecificConfig theConfig = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ; + ALACAudioChannelLayout theChannelLayout = { 0, 0, 0 } ; + uint8_t theChannelAtom [kChannelAtomSize] = { 0, 0, 0, 0, 'c', 'h', 'a', 'n', 0, 0, 0, 0 } ; + uint32_t theCookieSize = sizeof (ALACSpecificConfig) ; + uint8_t * theCookiePointer = (uint8_t *) outCookie ; + + GetConfig (p, &theConfig) ; + if (theConfig.numChannels > 2) + { + theChannelLayout.mChannelLayoutTag = Swap32NtoB (ALACChannelLayoutTags [theConfig.numChannels - 1]) ; + theCookieSize += (sizeof (ALACAudioChannelLayout) + kChannelAtomSize) ; + } + if (*ioSize >= theCookieSize) + { + memcpy (theCookiePointer, &theConfig, sizeof (ALACSpecificConfig)) ; + theChannelAtom [3] = (sizeof (ALACAudioChannelLayout) + kChannelAtomSize) ; + if (theConfig.numChannels > 2) + { + theCookiePointer += sizeof (ALACSpecificConfig) ; + memcpy (theCookiePointer, theChannelAtom, kChannelAtomSize) ; + theCookiePointer += kChannelAtomSize ; + memcpy (theCookiePointer, &theChannelLayout, sizeof (ALACAudioChannelLayout)) ; + } + *ioSize = theCookieSize ; + } + else + { + *ioSize = 0 ; // no incomplete cookies + } +} + +/* + alac_encoder_init () + - initialize the encoder component with the current config +*/ +int32_t +alac_encoder_init (ALAC_ENCODER *p, uint32_t samplerate, uint32_t channels, uint32_t format_flags, uint32_t frameSize) +{ + int32_t status ; + + p->mFrameSize = (frameSize > 0 && frameSize <= ALAC_FRAME_LENGTH) ? frameSize : ALAC_FRAME_LENGTH ; + + p->mOutputSampleRate = samplerate ; + p->mNumChannels = channels ; + switch (format_flags) + { + case 1: + p->mBitDepth = 16 ; + break ; + case 2: + p->mBitDepth = 20 ; + break ; + case 3: + p->mBitDepth = 24 ; + break ; + case 4: + p->mBitDepth = 32 ; + break ; + default: + break ; + } + + // set up default encoding parameters and state + // - note: mFrameSize is set in the constructor or via alac_set_frame_size () which must be called before this routine + for (uint32_t indx = 0 ; indx < kALACMaxChannels ; indx++) + p->mLastMixRes [indx] = kDefaultMixRes ; + + // the maximum output frame size can be no bigger than (samplesPerBlock * numChannels * ((10 + sampleSize)/8) + 1) + // but note that this can be bigger than the input size! + // - since we don't yet know what our input format will be, use our max allowed sample size in the calculation + p->mMaxOutputBytes = p->mFrameSize * p->mNumChannels * ((10 + kMaxSampleSize) / 8) + 1 ; + + status = ALAC_noErr ; + + // initialize coefs arrays once b/c retaining state across blocks actually improves the encode ratio + for (int32_t channel = 0 ; channel < (int32_t) p->mNumChannels ; channel++) + { + for (int32_t search = 0 ; search < kALACMaxSearches ; search++) + { + init_coefs (p->mCoefsU [channel][search], DENSHIFT_DEFAULT, kALACMaxCoefs) ; + init_coefs (p->mCoefsV [channel][search], DENSHIFT_DEFAULT, kALACMaxCoefs) ; + } + } + + return status ; +} + +/* + alac_get_source_format () + - given the input format, return one of our supported formats +*/ +void +alac_get_source_format (ALAC_ENCODER *p, const AudioFormatDescription * source, AudioFormatDescription * output) +{ + (void) output ; + // default is 16-bit native endian + // - note: for float input we assume that's coming from one of our decoders (mp3, aac) so it only makes sense + // to encode to 16-bit since the source was lossy in the first place + // - note: if not a supported bit depth, find the closest supported bit depth to the input one + if ((source->mFormatID != kALACFormatLinearPCM) || ((source->mFormatFlags & kALACFormatFlagIsFloat) != 0) || (source->mBitsPerChannel <= 16)) + p->mBitDepth = 16 ; + else if (source->mBitsPerChannel <= 20) + p->mBitDepth = 20 ; + else if (source->mBitsPerChannel <= 24) + p->mBitDepth = 24 ; + else + p->mBitDepth = 32 ; + + // we support 16/20/24/32-bit integer data at any sample rate and our target number of channels + // and sample rate were specified when we were configured + /* + MakeUncompressedAudioFormat (mNumChannels, (float) mOutputSampleRate, mBitDepth, kAudioFormatFlagsNativeIntegerPacked, output) ; + */ +} + + + +#if VERBOSE_DEBUG + +#if PRAGMA_MARK +#pragma mark - +#endif + +/* + AddFiller () + - add fill and data stream elements to the bitstream to test the decoder +*/ +static void AddFiller (BitBuffer * bits, int32_t numBytes) +{ + uint8_t tag ; + int32_t indx ; + + // out of lameness, subtract 6 bytes to deal with header + alignment as required for fill/data elements + numBytes -= 6 ; + if (numBytes <= 0) + return ; + + // randomly pick Fill or Data Stream Element based on numBytes requested + tag = (numBytes & 0x8) ? ID_FIL : ID_DSE ; + + BitBufferWrite (bits, tag, 3) ; + if (tag == ID_FIL) + { + // can't write more than 269 bytes in a fill element + numBytes = (numBytes > 269) ? 269 : numBytes ; + + // fill element = 4-bit size unless >= 15 then 4-bit size + 8-bit extension size + if (numBytes >= 15) + { + uint16_t extensionSize ; + + BitBufferWrite (bits, 15, 4) ; + + // 8-bit extension count field is "extra + 1" which is weird but I didn't define the syntax + // - otherwise, there's no way to represent 15 + // - for example, to really mean 15 bytes you must encode extensionSize = 1 + // - why it's not like data stream elements I have no idea + extensionSize = (numBytes - 15) + 1 ; + //Assert (extensionSize <= 255) ; + BitBufferWrite (bits, extensionSize, 8) ; + } + else + BitBufferWrite (bits, numBytes, 4) ; + + BitBufferWrite (bits, 0x10, 8) ; // extension_type = FILL_DATA = b0001 or'ed with fill_nibble = b0000 + for (indx = 0 ; indx < (numBytes - 1) ; indx++) + BitBufferWrite (bits, 0xa5, 8) ; // fill_byte = b10100101 = 0xa5 + } + else + { + // can't write more than 510 bytes in a data stream element + numBytes = (numBytes > 510) ? 510 : numBytes ; + + BitBufferWrite (bits, 0, 4) ; // element instance tag + BitBufferWrite (bits, 1, 1) ; // byte-align flag = true + + // data stream element = 8-bit size unless >= 255 then 8-bit size + 8-bit size + if (numBytes >= 255) + { + BitBufferWrite (bits, 255, 8) ; + BitBufferWrite (bits, numBytes - 255, 8) ; + } + else + BitBufferWrite (bits, numBytes, 8) ; + + BitBufferByteAlign (bits, true) ; // byte-align with zeros + + for (indx = 0 ; indx < numBytes ; indx++) + BitBufferWrite (bits, 0x5a, 8) ; + } +} + +#endif /* VERBOSE_DEBUG */ diff --git a/libsndfile-1.0.31/src/ALAC/dp_dec.c b/libsndfile-1.0.31/src/ALAC/dp_dec.c new file mode 100644 index 0000000..4f5bc1d --- /dev/null +++ b/libsndfile-1.0.31/src/ALAC/dp_dec.c @@ -0,0 +1,379 @@ +/* + * Copyright (c) 2011 Apple Inc. All rights reserved. + * + * @APPLE_APACHE_LICENSE_HEADER_START@ + * + * Licensed under the Apache License, Version 2.0 (the "License") ; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @APPLE_APACHE_LICENSE_HEADER_END@ + */ + +/* + File: dp_dec.c + + Contains: Dynamic Predictor decode routines + + Copyright: (c) 2001-2011 Apple, Inc. +*/ + + +#include + +#include "dplib.h" +#include "shift.h" + +#if __GNUC__ +#define ALWAYS_INLINE __attribute__ ((always_inline)) +#else +#define ALWAYS_INLINE +#endif + +#define LOOP_ALIGN + +static inline int32_t ALWAYS_INLINE +sign_of_int (int32_t i) +{ + int32_t negishift ; + + negishift = ((uint32_t) - i) >> 31 ; + return negishift | (i >> 31) ; +} + +void +unpc_block (const int32_t * pc1, int32_t * out, int32_t num, int16_t * coefs, int32_t numactive, uint32_t chanbits, uint32_t denshift) +{ + register int16_t a0, a1, a2, a3 ; + register int32_t b0, b1, b2, b3 ; + int32_t j, k, lim ; + int32_t sum1, sg, sgn, top, dd ; + int32_t * pout ; + int32_t del, del0 ; + uint32_t chanshift = 32 - chanbits ; + int32_t denhalf = 1 << (denshift - 1) ; + + out [0] = pc1 [0] ; + if (numactive == 0) + { + // just copy if numactive == 0 (but don't bother if in/out pointers the same) + if ((num > 1) && (pc1 != out)) + memcpy (&out [1], &pc1 [1], (num - 1) * sizeof (int32_t)) ; + return ; + } + if (numactive == 31) + { + // short-circuit if numactive == 31 + int32_t prev ; + + /* this code is written such that the in/out buffers can be the same + to conserve buffer space on embedded devices like the iPod + + (original code) + for (j = 1 ; j < num ; j++) + del = pc1 [j] + out [j-1] ; + out [j] = (del << chanshift) >> chanshift ; + */ + prev = out [0] ; + for (j = 1 ; j < num ; j++) + { + del = pc1 [j] + prev ; + prev = (del << chanshift) >> chanshift ; + out [j] = prev ; + } + return ; + } + + for (j = 1 ; j <= numactive ; j++) + { + del = pc1 [j] + out [j-1] ; + out [j] = arith_shift_left (del, chanshift) >> chanshift ; + } + + lim = numactive + 1 ; + + if (numactive == 4) + { + // optimization for numactive == 4 + register int16_t ia0, ia1, ia2, ia3 ; + register int32_t ib0, ib1, ib2, ib3 ; + + ia0 = coefs [0] ; + ia1 = coefs [1] ; + ia2 = coefs [2] ; + ia3 = coefs [3] ; + + for (j = lim ; j < num ; j++) + { + LOOP_ALIGN + + top = out [j - lim] ; + pout = out + j - 1 ; + + ib0 = top - pout [0] ; + ib1 = top - pout [-1] ; + ib2 = top - pout [-2] ; + ib3 = top - pout [-3] ; + + sum1 = (denhalf - ia0 * ib0 - ia1 * ib1 - ia2 * ib2 - ia3 * ib3) >> denshift ; + + del = pc1 [j] ; + del0 = del ; + sg = sign_of_int (del) ; + del += top + sum1 ; + + out [j] = arith_shift_left (del, chanshift) >> chanshift ; + + if (sg > 0) + { + sgn = sign_of_int (ib3) ; + ia3 -= sgn ; + del0 -= (4 - 3) * ((sgn * ib3) >> denshift) ; + if (del0 <= 0) + continue ; + + sgn = sign_of_int (ib2) ; + ia2 -= sgn ; + del0 -= (4 - 2) * ((sgn * ib2) >> denshift) ; + if (del0 <= 0) + continue ; + + sgn = sign_of_int (ib1) ; + ia1 -= sgn ; + del0 -= (4 - 1) * ((sgn * ib1) >> denshift) ; + if (del0 <= 0) + continue ; + + ia0 -= sign_of_int (ib0) ; + } + else if (sg < 0) + { + // note: to avoid unnecessary negations, we flip the value of "sgn" + sgn = -sign_of_int (ib3) ; + ia3 -= sgn ; + del0 -= (4 - 3) * ((sgn * ib3) >> denshift) ; + if (del0 >= 0) + continue ; + + sgn = -sign_of_int (ib2) ; + ia2 -= sgn ; + del0 -= (4 - 2) * ((sgn * ib2) >> denshift) ; + if (del0 >= 0) + continue ; + + sgn = -sign_of_int (ib1) ; + ia1 -= sgn ; + del0 -= (4 - 1) * ((sgn * ib1) >> denshift) ; + if (del0 >= 0) + continue ; + + ia0 += sign_of_int (ib0) ; + } + } + + coefs [0] = ia0 ; + coefs [1] = ia1 ; + coefs [2] = ia2 ; + coefs [3] = ia3 ; + } + else if (numactive == 8) + { + register int16_t a4, a5, a6, a7 ; + register int32_t b4, b5, b6, b7 ; + + // optimization for numactive == 8 + a0 = coefs [0] ; + a1 = coefs [1] ; + a2 = coefs [2] ; + a3 = coefs [3] ; + a4 = coefs [4] ; + a5 = coefs [5] ; + a6 = coefs [6] ; + a7 = coefs [7] ; + + for (j = lim ; j < num ; j++) + { + LOOP_ALIGN + + top = out [j - lim] ; + pout = out + j - 1 ; + + b0 = top - (*pout--) ; + b1 = top - (*pout--) ; + b2 = top - (*pout--) ; + b3 = top - (*pout--) ; + b4 = top - (*pout--) ; + b5 = top - (*pout--) ; + b6 = top - (*pout--) ; + b7 = top - (*pout) ; + pout += 8 ; + + sum1 = (denhalf - a0 * b0 - a1 * b1 - a2 * b2 - a3 * b3 + - a4 * b4 - a5 * b5 - a6 * b6 - a7 * b7) >> denshift ; + + del = pc1 [j] ; + del0 = del ; + sg = sign_of_int (del) ; + del += top + sum1 ; + + out [j] = arith_shift_left (del, chanshift) >> chanshift ; + + if (sg > 0) + { + sgn = sign_of_int (b7) ; + a7 -= sgn ; + del0 -= 1 * ((sgn * b7) >> denshift) ; + if (del0 <= 0) + continue ; + + sgn = sign_of_int (b6) ; + a6 -= sgn ; + del0 -= 2 * ((sgn * b6) >> denshift) ; + if (del0 <= 0) + continue ; + + sgn = sign_of_int (b5) ; + a5 -= sgn ; + del0 -= 3 * ((sgn * b5) >> denshift) ; + if (del0 <= 0) + continue ; + + sgn = sign_of_int (b4) ; + a4 -= sgn ; + del0 -= 4 * ((sgn * b4) >> denshift) ; + if (del0 <= 0) + continue ; + + sgn = sign_of_int (b3) ; + a3 -= sgn ; + del0 -= 5 * ((sgn * b3) >> denshift) ; + if (del0 <= 0) + continue ; + + sgn = sign_of_int (b2) ; + a2 -= sgn ; + del0 -= 6 * ((sgn * b2) >> denshift) ; + if (del0 <= 0) + continue ; + + sgn = sign_of_int (b1) ; + a1 -= sgn ; + del0 -= 7 * ((sgn * b1) >> denshift) ; + if (del0 <= 0) + continue ; + + a0 -= sign_of_int (b0) ; + } + else if (sg < 0) + { + // note: to avoid unnecessary negations, we flip the value of "sgn" + sgn = -sign_of_int (b7) ; + a7 -= sgn ; + del0 -= 1 * ((sgn * b7) >> denshift) ; + if (del0 >= 0) + continue ; + + sgn = -sign_of_int (b6) ; + a6 -= sgn ; + del0 -= 2 * ((sgn * b6) >> denshift) ; + if (del0 >= 0) + continue ; + + sgn = -sign_of_int (b5) ; + a5 -= sgn ; + del0 -= 3 * ((sgn * b5) >> denshift) ; + if (del0 >= 0) + continue ; + + sgn = -sign_of_int (b4) ; + a4 -= sgn ; + del0 -= 4 * ((sgn * b4) >> denshift) ; + if (del0 >= 0) + continue ; + + sgn = -sign_of_int (b3) ; + a3 -= sgn ; + del0 -= 5 * ((sgn * b3) >> denshift) ; + if (del0 >= 0) + continue ; + + sgn = -sign_of_int (b2) ; + a2 -= sgn ; + del0 -= 6 * ((sgn * b2) >> denshift) ; + if (del0 >= 0) + continue ; + + sgn = -sign_of_int (b1) ; + a1 -= sgn ; + del0 -= 7 * ((sgn * b1) >> denshift) ; + if (del0 >= 0) + continue ; + + a0 += sign_of_int (b0) ; + } + } + + coefs [0] = a0 ; + coefs [1] = a1 ; + coefs [2] = a2 ; + coefs [3] = a3 ; + coefs [4] = a4 ; + coefs [5] = a5 ; + coefs [6] = a6 ; + coefs [7] = a7 ; + } + else + { + // general case + for (j = lim ; j < num ; j++) + { + LOOP_ALIGN + + sum1 = 0 ; + pout = out + j - 1 ; + top = out [j-lim] ; + + for (k = 0 ; k < numactive ; k++) + sum1 += coefs [k] * (pout [-k] - top) ; + + del = pc1 [j] ; + del0 = del ; + sg = sign_of_int (del) ; + del += top + ((sum1 + denhalf) >> denshift) ; + out [j] = (del << chanshift) >> chanshift ; + + if (sg > 0) + { + for (k = (numactive - 1) ; k >= 0 ; k--) + { + dd = top - pout [-k] ; + sgn = sign_of_int (dd) ; + coefs [k] -= sgn ; + del0 -= (numactive - k) * ((sgn * dd) >> denshift) ; + if (del0 <= 0) + break ; + } + } + else if (sg < 0) + { + for (k = (numactive - 1) ; k >= 0 ; k--) + { + dd = top - pout [-k] ; + sgn = sign_of_int (dd) ; + coefs [k] += sgn ; + del0 -= (numactive - k) * ((-sgn * dd) >> denshift) ; + if (del0 >= 0) + break ; + } + } + } + } +} diff --git a/libsndfile-1.0.31/src/ALAC/dp_enc.c b/libsndfile-1.0.31/src/ALAC/dp_enc.c new file mode 100644 index 0000000..ad098a4 --- /dev/null +++ b/libsndfile-1.0.31/src/ALAC/dp_enc.c @@ -0,0 +1,385 @@ +/* + * Copyright (c) 2011 Apple Inc. All rights reserved. + * + * @APPLE_APACHE_LICENSE_HEADER_START@ + * + * Licensed under the Apache License, Version 2.0 (the "License") ; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @APPLE_APACHE_LICENSE_HEADER_END@ + */ + +/* + File: dp_enc.c + + Contains: Dynamic Predictor encode routines + + Copyright: (c) 2001-2011 Apple, Inc. +*/ + +#include + +#include "dplib.h" +#include "shift.h" + +#if __GNUC__ +#define ALWAYS_INLINE __attribute__ ((always_inline)) +#else +#define ALWAYS_INLINE +#endif + +#define LOOP_ALIGN + +void +init_coefs (int16_t * coefs, uint32_t denshift, int32_t numPairs) +{ + int32_t k ; + int32_t den = 1 << denshift ; + + coefs [0] = (AINIT * den) >> 4 ; + coefs [1] = (BINIT * den) >> 4 ; + coefs [2] = (CINIT * den) >> 4 ; + for (k = 3 ; k < numPairs ; k++) + coefs [k] = 0 ; +} + +void +copy_coefs (const int16_t * srcCoefs, int16_t * dstCoefs, int32_t numPairs) +{ + int32_t k ; + + for (k = 0 ; k < numPairs ; k++) + dstCoefs [k] = srcCoefs [k] ; +} + +static inline int32_t ALWAYS_INLINE sign_of_int (int32_t i) +{ + int32_t negishift ; + + negishift = ((uint32_t) - i) >> 31 ; + return negishift | (i >> 31) ; +} + +void +pc_block (int32_t * in, int32_t * pc1, int32_t num, int16_t * coefs, int32_t numactive, uint32_t chanbits, uint32_t denshift) +{ + register int16_t a0, a1, a2, a3 ; + register int32_t b0, b1, b2, b3 ; + int32_t j, k, lim ; + int32_t * pin ; + int32_t sum1, dd ; + int32_t sg, sgn ; + int32_t top ; + int32_t del, del0 ; + uint32_t chanshift = 32 - chanbits ; + int32_t denhalf = 1 << (denshift - 1) ; + + pc1 [0] = in [0] ; + if (numactive == 0) + { + // just copy if numactive == 0 (but don't bother if in/out pointers the same) + if ((num > 1) && (in != pc1)) + memcpy (&pc1 [1], &in [1], (num - 1) * sizeof (int32_t)) ; + return ; + } + if (numactive == 31) + { + // short-circuit if numactive == 31 + for (j = 1 ; j < num ; j++) + { + del = in [j] - in [j-1] ; + pc1 [j] = (del << chanshift) >> chanshift ; + } + return ; + } + + for (j = 1 ; j <= numactive ; j++) + { + del = in [j] - in [j-1] ; + pc1 [j] = arith_shift_left (del, chanshift) >> chanshift ; + } + + lim = numactive + 1 ; + + if (numactive == 4) + { + // optimization for numactive == 4 + a0 = coefs [0] ; + a1 = coefs [1] ; + a2 = coefs [2] ; + a3 = coefs [3] ; + + for (j = lim ; j < num ; j++) + { + LOOP_ALIGN + + top = in [j - lim] ; + pin = in + j - 1 ; + + b0 = top - pin [0] ; + b1 = top - pin [-1] ; + b2 = top - pin [-2] ; + b3 = top - pin [-3] ; + + sum1 = (denhalf - a0 * b0 - a1 * b1 - a2 * b2 - a3 * b3) >> denshift ; + + del = in [j] - top - sum1 ; + del = arith_shift_left (del, chanshift) >> chanshift ; + pc1 [j] = del ; + del0 = del ; + + sg = sign_of_int (del) ; + if (sg > 0) + { + sgn = sign_of_int (b3) ; + a3 -= sgn ; + del0 -= (4 - 3) * ((sgn * b3) >> denshift) ; + if (del0 <= 0) + continue ; + + sgn = sign_of_int (b2) ; + a2 -= sgn ; + del0 -= (4 - 2) * ((sgn * b2) >> denshift) ; + if (del0 <= 0) + continue ; + + sgn = sign_of_int (b1) ; + a1 -= sgn ; + del0 -= (4 - 1) * ((sgn * b1) >> denshift) ; + if (del0 <= 0) + continue ; + + a0 -= sign_of_int (b0) ; + } + else if (sg < 0) + { + // note: to avoid unnecessary negations, we flip the value of "sgn" + sgn = -sign_of_int (b3) ; + a3 -= sgn ; + del0 -= (4 - 3) * ((sgn * b3) >> denshift) ; + if (del0 >= 0) + continue ; + + sgn = -sign_of_int (b2) ; + a2 -= sgn ; + del0 -= (4 - 2) * ((sgn * b2) >> denshift) ; + if (del0 >= 0) + continue ; + + sgn = -sign_of_int (b1) ; + a1 -= sgn ; + del0 -= (4 - 1) * ((sgn * b1) >> denshift) ; + if (del0 >= 0) + continue ; + + a0 += sign_of_int (b0) ; + } + } + + coefs [0] = a0 ; + coefs [1] = a1 ; + coefs [2] = a2 ; + coefs [3] = a3 ; + } + else if (numactive == 8) + { + // optimization for numactive == 8 + register int16_t a4, a5, a6, a7 ; + register int32_t b4, b5, b6, b7 ; + + a0 = coefs [0] ; + a1 = coefs [1] ; + a2 = coefs [2] ; + a3 = coefs [3] ; + a4 = coefs [4] ; + a5 = coefs [5] ; + a6 = coefs [6] ; + a7 = coefs [7] ; + + for (j = lim ; j < num ; j++) + { + LOOP_ALIGN + + top = in [j - lim] ; + pin = in + j - 1 ; + + b0 = top - (*pin--) ; + b1 = top - (*pin--) ; + b2 = top - (*pin--) ; + b3 = top - (*pin--) ; + b4 = top - (*pin--) ; + b5 = top - (*pin--) ; + b6 = top - (*pin--) ; + b7 = top - (*pin) ; + pin += 8 ; + + sum1 = (denhalf - a0 * b0 - a1 * b1 - a2 * b2 - a3 * b3 + - a4 * b4 - a5 * b5 - a6 * b6 - a7 * b7) >> denshift ; + + del = in [j] - top - sum1 ; + del = arith_shift_left (del, chanshift) >> chanshift ; + pc1 [j] = del ; + del0 = del ; + + sg = sign_of_int (del) ; + if (sg > 0) + { + sgn = sign_of_int (b7) ; + a7 -= sgn ; + del0 -= 1 * ((sgn * b7) >> denshift) ; + if (del0 <= 0) + continue ; + + sgn = sign_of_int (b6) ; + a6 -= sgn ; + del0 -= 2 * ((sgn * b6) >> denshift) ; + if (del0 <= 0) + continue ; + + sgn = sign_of_int (b5) ; + a5 -= sgn ; + del0 -= 3 * ((sgn * b5) >> denshift) ; + if (del0 <= 0) + continue ; + + sgn = sign_of_int (b4) ; + a4 -= sgn ; + del0 -= 4 * ((sgn * b4) >> denshift) ; + if (del0 <= 0) + continue ; + + sgn = sign_of_int (b3) ; + a3 -= sgn ; + del0 -= 5 * ((sgn * b3) >> denshift) ; + if (del0 <= 0) + continue ; + + sgn = sign_of_int (b2) ; + a2 -= sgn ; + del0 -= 6 * ((sgn * b2) >> denshift) ; + if (del0 <= 0) + continue ; + + sgn = sign_of_int (b1) ; + a1 -= sgn ; + del0 -= 7 * ((sgn * b1) >> denshift) ; + if (del0 <= 0) + continue ; + + a0 -= sign_of_int (b0) ; + } + else if (sg < 0) + { + // note: to avoid unnecessary negations, we flip the value of "sgn" + sgn = -sign_of_int (b7) ; + a7 -= sgn ; + del0 -= 1 * ((sgn * b7) >> denshift) ; + if (del0 >= 0) + continue ; + + sgn = -sign_of_int (b6) ; + a6 -= sgn ; + del0 -= 2 * ((sgn * b6) >> denshift) ; + if (del0 >= 0) + continue ; + + sgn = -sign_of_int (b5) ; + a5 -= sgn ; + del0 -= 3 * ((sgn * b5) >> denshift) ; + if (del0 >= 0) + continue ; + + sgn = -sign_of_int (b4) ; + a4 -= sgn ; + del0 -= 4 * ((sgn * b4) >> denshift) ; + if (del0 >= 0) + continue ; + + sgn = -sign_of_int (b3) ; + a3 -= sgn ; + del0 -= 5 * ((sgn * b3) >> denshift) ; + if (del0 >= 0) + continue ; + + sgn = -sign_of_int (b2) ; + a2 -= sgn ; + del0 -= 6 * ((sgn * b2) >> denshift) ; + if (del0 >= 0) + continue ; + + sgn = -sign_of_int (b1) ; + a1 -= sgn ; + del0 -= 7 * ((sgn * b1) >> denshift) ; + if (del0 >= 0) + continue ; + + a0 += sign_of_int (b0) ; + } + } + + coefs [0] = a0 ; + coefs [1] = a1 ; + coefs [2] = a2 ; + coefs [3] = a3 ; + coefs [4] = a4 ; + coefs [5] = a5 ; + coefs [6] = a6 ; + coefs [7] = a7 ; + } + else + { +//pc_block_general: + // general case + for (j = lim ; j < num ; j++) + { + LOOP_ALIGN + + top = in [j - lim] ; + pin = in + j - 1 ; + + sum1 = 0 ; + for (k = 0 ; k < numactive ; k++) + sum1 -= coefs [k] * (top - pin [-k]) ; + + del = in [j] - top - ((sum1 + denhalf) >> denshift) ; + del = (del << chanshift) >> chanshift ; + pc1 [j] = del ; + del0 = del ; + + sg = sign_of_int (del) ; + if (sg > 0) + { + for (k = (numactive - 1) ; k >= 0 ; k--) + { + dd = top - pin [-k] ; + sgn = sign_of_int (dd) ; + coefs [k] -= sgn ; + del0 -= (numactive - k) * ((sgn * dd) >> denshift) ; + if (del0 <= 0) + break ; + } + } + else if (sg < 0) + { + for (k = (numactive - 1) ; k >= 0 ; k--) + { + dd = top - pin [-k] ; + sgn = sign_of_int (dd) ; + coefs [k] += sgn ; + del0 -= (numactive - k) * ((-sgn * dd) >> denshift) ; + if (del0 >= 0) + break ; + } + } + } + } +} diff --git a/libsndfile-1.0.31/src/ALAC/dplib.h b/libsndfile-1.0.31/src/ALAC/dplib.h new file mode 100644 index 0000000..43ae721 --- /dev/null +++ b/libsndfile-1.0.31/src/ALAC/dplib.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2011 Apple Inc. All rights reserved. + * + * @APPLE_APACHE_LICENSE_HEADER_START@ + * + * Licensed under the Apache License, Version 2.0 (the "License") ; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @APPLE_APACHE_LICENSE_HEADER_END@ + */ + +/* + File: dplib.h + + Contains: Dynamic Predictor routines + + Copyright: Copyright (C) 2001-2011 Apple, Inc. +*/ + +#ifndef __DPLIB_H__ +#define __DPLIB_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// defines + +#define DENSHIFT_MAX 15 +#define DENSHIFT_DEFAULT 9 +#define AINIT 38 +#define BINIT (-29) +#define CINIT (-2) +#define NUMCOEPAIRS 16 + +// prototypes + +void init_coefs (int16_t * coefs, uint32_t denshift, int32_t numPairs) ; +void copy_coefs (const int16_t * srcCoefs, int16_t * dstCoefs, int32_t numPairs) ; + +// NOTE: these routines read at least "numactive" samples so the i/o buffers must be at least that big + +void pc_block (int32_t * in, int32_t * pc, int32_t num, int16_t * coefs, int32_t numactive, uint32_t chanbits, uint32_t denshift) ; +void unpc_block (const int32_t * pc, int32_t * out, int32_t num, int16_t * coefs, int32_t numactive, uint32_t chanbits, uint32_t denshift) ; + +#ifdef __cplusplus +} +#endif + +#endif /* __DPLIB_H__ */ diff --git a/libsndfile-1.0.31/src/ALAC/matrix_dec.c b/libsndfile-1.0.31/src/ALAC/matrix_dec.c new file mode 100644 index 0000000..6d0b401 --- /dev/null +++ b/libsndfile-1.0.31/src/ALAC/matrix_dec.c @@ -0,0 +1,330 @@ +/* + * Copyright (c) 2011 Apple Inc. All rights reserved. + * Copyright (C) 2012-2014 Erik de Castro Lopo + * + * @APPLE_APACHE_LICENSE_HEADER_START@ + * + * Licensed under the Apache License, Version 2.0 (the "License") ; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @APPLE_APACHE_LICENSE_HEADER_END@ + */ + +/* + File: matrix_dec.c + + Contains: ALAC mixing/matrixing decode routines. + + Copyright: (c) 2004-2011 Apple, Inc. +*/ + +#include "matrixlib.h" +#include "ALACAudioTypes.h" +#include "shift.h" + +// up to 24-bit "offset" macros for the individual bytes of a 20/24-bit word +#if TARGET_RT_BIG_ENDIAN + #define LBYTE 2 + #define MBYTE 1 + #define HBYTE 0 +#else + #define LBYTE 0 + #define MBYTE 1 + #define HBYTE 2 +#endif + +/* + There is no plain middle-side option ; instead there are various mixing + modes including middle-side, each lossless, as embodied in the mix () + and unmix () functions. These functions exploit a generalized middle-side + transformation: + + u := [(rL + (m-r)R)/m] ; + v := L - R ; + + where [ ] denotes integer floor. The (lossless) inverse is + + L = u + v - [rV/m] ; + R = L - v ; +*/ + +// 16-bit routines + +void +unmix16 (const int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, int32_t mixbits, int32_t mixres) +{ + int32_t j ; + + if (mixres != 0) + { + /* matrixed stereo */ + for (j = 0 ; j < numSamples ; j++) + { + int32_t l, r ; + + l = u [j] + v [j] - ((mixres * v [j]) >> mixbits) ; + r = l - v [j] ; + + out [0] = arith_shift_left (l, 16) ; + out [1] = arith_shift_left (r, 16) ; + out += stride ; + } + } + else + { + /* Conventional separated stereo. */ + for (j = 0 ; j < numSamples ; j++) + { + out [0] = u [j] << 16 ; + out [1] = v [j] << 16 ; + out += stride ; + } + } +} + +// 20-bit routines +// - the 20 bits of data are left-justified in 3 bytes of storage but right-aligned for input/output predictor buffers + +void +unmix20 (const int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, int32_t mixbits, int32_t mixres) +{ + int32_t j ; + + if (mixres != 0) + { + /* matrixed stereo */ + for (j = 0 ; j < numSamples ; j++) + { + int32_t l, r ; + + l = u [j] + v [j] - ((mixres * v [j]) >> mixbits) ; + r = l - v [j] ; + + out [0] = arith_shift_left (l, 12) ; + out [1] = arith_shift_left (r, 12) ; + out += stride ; + } + } + else + { + /* Conventional separated stereo. */ + for (j = 0 ; j < numSamples ; j++) + { + out [0] = arith_shift_left (u [j], 12) ; + out [1] = arith_shift_left (v [j], 12) ; + out += stride ; + } + } +} + +// 24-bit routines +// - the 24 bits of data are right-justified in the input/output predictor buffers + +void +unmix24 (const int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, + int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted) +{ + int32_t shift = bytesShifted * 8 ; + int32_t l, r ; + int32_t j, k ; + + if (mixres != 0) + { + /* matrixed stereo */ + if (bytesShifted != 0) + { + for (j = 0, k = 0 ; j < numSamples ; j++, k += 2) + { + l = u [j] + v [j] - ((mixres * v [j]) >> mixbits) ; + r = l - v [j] ; + + l = arith_shift_left (l, shift) | (uint32_t) shiftUV [k + 0] ; + r = arith_shift_left (r, shift) | (uint32_t) shiftUV [k + 1] ; + + out [0] = arith_shift_left (l, 8) ; + out [1] = arith_shift_left (r, 8) ; + out += stride ; + } + } + else + { + for (j = 0 ; j < numSamples ; j++) + { + l = u [j] + v [j] - ((mixres * v [j]) >> mixbits) ; + r = l - v [j] ; + + out [0] = l << 8 ; + out [1] = r << 8 ; + out += stride ; + } + } + } + else + { + /* Conventional separated stereo. */ + if (bytesShifted != 0) + { + for (j = 0, k = 0 ; j < numSamples ; j++, k += 2) + { + l = u [j] ; + r = v [j] ; + + l = (l << shift) | (uint32_t) shiftUV [k + 0] ; + r = (r << shift) | (uint32_t) shiftUV [k + 1] ; + + out [0] = l << 8 ; + out [1] = r << 8 ; + out += stride ; + } + } + else + { + for (j = 0 ; j < numSamples ; j++) + { + out [0] = u [j] << 8 ; + out [1] = v [j] << 8 ; + out += stride ; + } + } + } +} + +// 32-bit routines +// - note that these really expect the internal data width to be < 32 but the arrays are 32-bit +// - otherwise, the calculations might overflow into the 33rd bit and be lost +// - therefore, these routines deal with the specified "unused lower" bytes in the "shift" buffers + +void +unmix32 (const int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, + int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted) +{ + int32_t shift = bytesShifted * 8 ; + int32_t l, r ; + int32_t j, k ; + + if (mixres != 0) + { + //Assert (bytesShifted != 0) ; + + /* matrixed stereo with shift */ + for (j = 0, k = 0 ; j < numSamples ; j++, k += 2) + { + int32_t lt, rt ; + + lt = u [j] ; + rt = v [j] ; + + l = lt + rt - ((mixres * rt) >> mixbits) ; + r = l - rt ; + + out [0] = arith_shift_left (l, shift) | (uint32_t) shiftUV [k + 0] ; + out [1] = arith_shift_left (r, shift) | (uint32_t) shiftUV [k + 1] ; + out += stride ; + } + } + else + { + if (bytesShifted == 0) + { + /* interleaving w/o shift */ + for (j = 0 ; j < numSamples ; j++) + { + out [0] = u [j] ; + out [1] = v [j] ; + out += stride ; + } + } + else + { + /* interleaving with shift */ + for (j = 0, k = 0 ; j < numSamples ; j++, k += 2) + { + out [0] = (u [j] << shift) | (uint32_t) shiftUV [k + 0] ; + out [1] = (v [j] << shift) | (uint32_t) shiftUV [k + 1] ; + out += stride ; + } + } + } +} + +// 20/24-bit <-> 32-bit helper routines (not really matrixing but convenient to put here) + +void +copyPredictorTo24 (const int32_t * in, int32_t * out, uint32_t stride, int32_t numSamples) +{ + int32_t j ; + + for (j = 0 ; j < numSamples ; j++) + { + out [0] = in [j] << 8 ; + out += stride ; + } +} + +void +copyPredictorTo24Shift (const int32_t * in, uint16_t * shift, int32_t * out, uint32_t stride, int32_t numSamples, int32_t bytesShifted) +{ + int32_t shiftVal = bytesShifted * 8 ; + int32_t j ; + + //Assert (bytesShifted != 0) ; + + for (j = 0 ; j < numSamples ; j++) + { + int32_t val = in [j] ; + + val = arith_shift_left (val, shiftVal) | (uint32_t) shift [j] ; + out [0] = arith_shift_left (val, 8) ; + out += stride ; + } +} + +void +copyPredictorTo20 (const int32_t * in, int32_t * out, uint32_t stride, int32_t numSamples) +{ + int32_t j ; + + // 32-bit predictor values are right-aligned but 20-bit output values should be left-aligned + // in the 24-bit output buffer + for (j = 0 ; j < numSamples ; j++) + { + out [0] = arith_shift_left (in [j], 12) ; + out += stride ; + } +} + +void +copyPredictorTo32 (const int32_t * in, int32_t * out, uint32_t stride, int32_t numSamples) +{ + int32_t i, j ; + + // this is only a subroutine to abstract the "iPod can only output 16-bit data" problem + for (i = 0, j = 0 ; i < numSamples ; i++, j += stride) + out [j] = arith_shift_left (in [i], 8) ; +} + +void +copyPredictorTo32Shift (const int32_t * in, uint16_t * shift, int32_t * out, uint32_t stride, int32_t numSamples, int32_t bytesShifted) +{ + int32_t * op = out ; + uint32_t shiftVal = bytesShifted * 8 ; + int32_t j ; + + //Assert (bytesShifted != 0) ; + + // this is only a subroutine to abstract the "iPod can only output 16-bit data" problem + for (j = 0 ; j < numSamples ; j++) + { + op [0] = arith_shift_left (in [j], shiftVal) | (uint32_t) shift [j] ; + op += stride ; + } +} diff --git a/libsndfile-1.0.31/src/ALAC/matrix_enc.c b/libsndfile-1.0.31/src/ALAC/matrix_enc.c new file mode 100644 index 0000000..b50f83b --- /dev/null +++ b/libsndfile-1.0.31/src/ALAC/matrix_enc.c @@ -0,0 +1,275 @@ +/* + * Copyright (c) 2011 Apple Inc. All rights reserved. + * Copyright (C) 2012-2014 Erik de Castro Lopo + * + * @APPLE_APACHE_LICENSE_HEADER_START@ + * + * Licensed under the Apache License, Version 2.0 (the "License") ; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @APPLE_APACHE_LICENSE_HEADER_END@ + */ + +/* + File: matrix_enc.c + + Contains: ALAC mixing/matrixing encode routines. + + Copyright: (c) 2004-2011 Apple, Inc. +*/ + +#include "matrixlib.h" +#include "ALACAudioTypes.h" + +/* + There is no plain middle-side option ; instead there are various mixing + modes including middle-side, each lossless, as embodied in the mix () + and unmix () functions. These functions exploit a generalized middle-side + transformation: + + u := [(rL + (m-r)R)/m] ; + v := L - R ; + + where [ ] denotes integer floor. The (lossless) inverse is + + L = u + v - [rV/m] ; + R = L - v ; +*/ + +// 16-bit routines + +void +mix16 (const int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, int32_t mixbits, int32_t mixres) +{ + int32_t j ; + + if (mixres != 0) + { + int32_t mod = 1 << mixbits ; + int32_t m2 ; + + /* matrixed stereo */ + m2 = mod - mixres ; + for (j = 0 ; j < numSamples ; j++) + { + int32_t l, r ; + + l = in [0] >> 16 ; + r = in [1] >> 16 ; + in += stride ; + u [j] = (mixres * l + m2 * r) >> mixbits ; + v [j] = l - r ; + } + } + else + { + /* Conventional separated stereo. */ + for (j = 0 ; j < numSamples ; j++) + { + u [j] = in [0] >> 16 ; + v [j] = in [1] >> 16 ; + in += stride ; + } + } +} + +// 20-bit routines +// - the 20 bits of data are left-justified in 3 bytes of storage but right-aligned for input/output predictor buffers + +void +mix20 (const int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, int32_t mixbits, int32_t mixres) +{ + int32_t l, r ; + int32_t j ; + + if (mixres != 0) + { + /* matrixed stereo */ + int32_t mod = 1 << mixbits ; + int32_t m2 = mod - mixres ; + + for (j = 0 ; j < numSamples ; j++) + { + l = in [0] >> 12 ; + r = in [1] >> 12 ; + in += stride ; + + u [j] = (mixres * l + m2 * r) >> mixbits ; + v [j] = l - r ; + } + } + else + { + /* Conventional separated stereo. */ + for (j = 0 ; j < numSamples ; j++) + { + u [j] = in [0] >> 12 ; + v [j] = in [1] >> 12 ; + in += stride ; + } + } +} + +// 24-bit routines +// - the 24 bits of data are right-justified in the input/output predictor buffers + +void +mix24 (const int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, + int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted) +{ + int32_t l, r ; + int32_t shift = bytesShifted * 8 ; + uint32_t mask = (1ul << shift) - 1 ; + int32_t j, k ; + + if (mixres != 0) + { + /* matrixed stereo */ + int32_t mod = 1 << mixbits ; + int32_t m2 = mod - mixres ; + + if (bytesShifted != 0) + { + for (j = 0, k = 0 ; j < numSamples ; j++, k += 2) + { + l = in [0] >> 8 ; + r = in [1] >> 8 ; + in += stride ; + + shiftUV [k + 0] = (uint16_t) (l & mask) ; + shiftUV [k + 1] = (uint16_t) (r & mask) ; + + l >>= shift ; + r >>= shift ; + + u [j] = (mixres * l + m2 * r) >> mixbits ; + v [j] = l - r ; + } + } + else + { + for (j = 0 ; j < numSamples ; j++) + { + l = in [0] >> 8 ; + r = in [1] >> 8 ; + in += stride ; + + u [j] = (mixres * l + m2 * r) >> mixbits ; + v [j] = l - r ; + } + } + } + else + { + /* Conventional separated stereo. */ + if (bytesShifted != 0) + { + for (j = 0, k = 0 ; j < numSamples ; j++, k += 2) + { + l = in [0] >> 8 ; + r = in [1] >> 8 ; + in += stride ; + + shiftUV [k + 0] = (uint16_t) (l & mask) ; + shiftUV [k + 1] = (uint16_t) (r & mask) ; + + l >>= shift ; + r >>= shift ; + + u [j] = l ; + v [j] = r ; + } + } + else + { + for (j = 0 ; j < numSamples ; j++) + { + l = in [0] >> 8 ; + r = in [1] >> 8 ; + in += stride ; + } + } + } +} + +// 32-bit routines +// - note that these really expect the internal data width to be < 32 but the arrays are 32-bit +// - otherwise, the calculations might overflow into the 33rd bit and be lost +// - therefore, these routines deal with the specified "unused lower" bytes in the "shift" buffers + +void +mix32 (const int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, + int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted) +{ + int32_t shift = bytesShifted * 8 ; + uint32_t mask = (1ul << shift) - 1 ; + int32_t l, r ; + int32_t j, k ; + + if (mixres != 0) + { + int32_t mod = 1 << mixbits ; + int32_t m2 ; + + //Assert (bytesShifted != 0) ; + + /* matrixed stereo with shift */ + m2 = mod - mixres ; + for (j = 0, k = 0 ; j < numSamples ; j++, k += 2) + { + l = in [0] ; + r = in [1] ; + in += stride ; + + shiftUV [k + 0] = (uint16_t) (l & mask) ; + shiftUV [k + 1] = (uint16_t) (r & mask) ; + + l >>= shift ; + r >>= shift ; + + u [j] = (mixres * l + m2 * r) >> mixbits ; + v [j] = l - r ; + } + } + else + { + if (bytesShifted == 0) + { + /* de-interleaving w/o shift */ + for (j = 0 ; j < numSamples ; j++) + { + u [j] = in [0] ; + v [j] = in [1] ; + in += stride ; + } + } + else + { + /* de-interleaving with shift */ + for (j = 0, k = 0 ; j < numSamples ; j++, k += 2) + { + l = in [0] ; + r = in [1] ; + in += stride ; + + shiftUV [k + 0] = (uint16_t) (l & mask) ; + shiftUV [k + 1] = (uint16_t) (r & mask) ; + + l >>= shift ; + r >>= shift ; + + u [j] = l ; + v [j] = r ; + } + } + } +} diff --git a/libsndfile-1.0.31/src/ALAC/matrixlib.h b/libsndfile-1.0.31/src/ALAC/matrixlib.h new file mode 100644 index 0000000..d9be5fe --- /dev/null +++ b/libsndfile-1.0.31/src/ALAC/matrixlib.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2011 Apple Inc. All rights reserved. + * Copyright (C) 2012-2014 Erik de Castro Lopo + * + * @APPLE_APACHE_LICENSE_HEADER_START@ + * + * Licensed under the Apache License, Version 2.0 (the "License") ; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @APPLE_APACHE_LICENSE_HEADER_END@ + */ + +/* + File: matrixlib.h + + Contains: ALAC mixing/matrixing routines to/from 32-bit predictor buffers. + + Copyright: Copyright (C) 2004 to 2011 Apple, Inc. +*/ + +#ifndef __MATRIXLIB_H +#define __MATRIXLIB_H + +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// 16-bit routines +void mix16 (const int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, int32_t mixbits, int32_t mixres) ; +void unmix16 (const int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, int32_t mixbits, int32_t mixres) ; + +// 20-bit routines +void mix20 (const int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, int32_t mixbits, int32_t mixres) ; +void unmix20 (const int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, int32_t mixbits, int32_t mixres) ; + +// 24-bit routines +// - 24-bit data sometimes compresses better by shifting off the bottom byte so these routines deal with +// the specified "unused lower bytes" in the combined "shift" buffer +void mix24 (const int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, + int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted) ; +void unmix24 (const int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, + int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted) ; + +// 32-bit routines +// - note that these really expect the internal data width to be < 32-bit but the arrays are 32-bit +// - otherwise, the calculations might overflow into the 33rd bit and be lost +// - therefore, these routines deal with the specified "unused lower" bytes in the combined "shift" buffer +void mix32 (const int32_t * in, uint32_t stride, int32_t * u, int32_t * v, int32_t numSamples, + int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted) ; +void unmix32 (const int32_t * u, int32_t * v, int32_t * out, uint32_t stride, int32_t numSamples, + int32_t mixbits, int32_t mixres, uint16_t * shiftUV, int32_t bytesShifted) ; + +// 20/24/32-bit <-> 32-bit helper routines (not really matrixing but convenient to put here) +void copy20ToPredictor (const int32_t * in, uint32_t stride, int32_t * out, int32_t numSamples) ; +void copy24ToPredictor (const int32_t * in, uint32_t stride, int32_t * out, int32_t numSamples) ; + +void copyPredictorTo24 (const int32_t * in, int32_t * out, uint32_t stride, int32_t numSamples) ; +void copyPredictorTo24Shift (const int32_t * in, uint16_t * shift, int32_t * out, uint32_t stride, int32_t numSamples, int32_t bytesShifted) ; +void copyPredictorTo20 (const int32_t * in, int32_t * out, uint32_t stride, int32_t numSamples) ; + +void copyPredictorTo32 (const int32_t * in, int32_t * out, uint32_t stride, int32_t numSamples) ; +void copyPredictorTo32Shift (const int32_t * in, uint16_t * shift, int32_t * out, uint32_t stride, int32_t numSamples, int32_t bytesShifted) ; + +#ifdef __cplusplus +} +#endif + +#endif /* __MATRIXLIB_H */ diff --git a/libsndfile-1.0.31/src/ALAC/shift.h b/libsndfile-1.0.31/src/ALAC/shift.h new file mode 100644 index 0000000..7c2d6f6 --- /dev/null +++ b/libsndfile-1.0.31/src/ALAC/shift.h @@ -0,0 +1,29 @@ +/* +** Copyright (C) 2014 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#if __GNUC__ +#define ALWAYS_INLINE __attribute__ ((always_inline)) +#else +#define ALWAYS_INLINE +#endif + + +static inline int32_t ALWAYS_INLINE +arith_shift_left (int32_t x, int shift) +{ return (int32_t) (((uint32_t) x) << shift) ; +} /* arith_shift_left */ diff --git a/libsndfile-1.0.31/src/G72x/ChangeLog b/libsndfile-1.0.31/src/G72x/ChangeLog new file mode 100644 index 0000000..aa108df --- /dev/null +++ b/libsndfile-1.0.31/src/G72x/ChangeLog @@ -0,0 +1,50 @@ +2001-06-05 Erik de Castro Lopo + + * g72x.c + Added {} in function update () to prevent 'ambiguous else' warning messages. + +2000-07-14 Erik de Castro Lopo + + * g72x.c + Modified g72x_init_state () to fit in with the new structure of the code. + Implemented g72x_encode_block () and g72x_decode_block (). + +2000-07-12 Erik de Castro Lopo + + * g72x.h + Moved nearly all definitions and function prototypes from this file have been + moved to private.h. + Added an enum defining the 4 different G72x ADPCM codecs. + Added new function prototypes to define a cleaner interface to the encoder + and decoder. This new interface also allows samples to be processed in blocks + rather than on a sample by sample basis like the original code. + + * private.h + Added prototypes moved from g72x.h. + Changed struct g72x_state to a typedef struct { .. } G72x_PRIVATE. + Added fields to G72x_PRIVATE required for working on blocks of samples. + +2000-06-07 Erik de Castro Lopo + + * g72x.c + Fixed all compiler warnings. + Removed functions tandem_adjust() which is not required by libsndfile. + + * g721.c + Fixed all compiler warnings. + Removed functions tandem_adjust_alaw() and tandem_adjust_ulaw () which are not + required by libsndfile. + Removed second parameter to g721_encoder () which is not required. + + * g72x.h + Removed in_coding and out_coding parameters from all functions. These allowed + g72x encoding/decoding to/from A-law or u-law and are not required by libsndfile. + Removed unneeded defines for A-law, u-law and linear encoding. + + * g723_16.c + Removed second parameter (in_coding) for g723_16_encoder(). + Removed second parameter (out_coding) for g723_16_decoder(). + + * private.h + New file containing prototypes and tyepdefs private to G72x code. + diff --git a/libsndfile-1.0.31/src/G72x/README b/libsndfile-1.0.31/src/G72x/README new file mode 100644 index 0000000..e69de29 diff --git a/libsndfile-1.0.31/src/G72x/README.original b/libsndfile-1.0.31/src/G72x/README.original new file mode 100644 index 0000000..23b0e7d --- /dev/null +++ b/libsndfile-1.0.31/src/G72x/README.original @@ -0,0 +1,94 @@ +The files in this directory comprise ANSI-C language reference implementations +of the CCITT (International Telegraph and Telephone Consultative Committee) +G.711, G.721 and G.723 voice compressions. They have been tested on Sun +SPARCstations and passed 82 out of 84 test vectors published by CCITT +(Dec. 20, 1988) for G.721 and G.723. [The two remaining test vectors, +which the G.721 decoder implementation for u-law samples did not pass, +may be in error because they are identical to two other vectors for G.723_40.] + +This source code is released by Sun Microsystems, Inc. to the public domain. +Please give your acknowledgement in product literature if this code is used +in your product implementation. + +Sun Microsystems supports some CCITT audio formats in Solaris 2.0 system +software. However, Sun's implementations have been optimized for higher +performance on SPARCstations. + + +The source files for CCITT conversion routines in this directory are: + + g72x.h header file for g721.c, g723_24.c and g723_40.c + g711.c CCITT G.711 u-law and A-law compression + g72x.c common denominator of G.721 and G.723 ADPCM codes + g721.c CCITT G.721 32Kbps ADPCM coder (with g72x.c) + g723_24.c CCITT G.723 24Kbps ADPCM coder (with g72x.c) + g723_40.c CCITT G.723 40Kbps ADPCM coder (with g72x.c) + + +Simple conversions between u-law, A-law, and 16-bit linear PCM are invoked +as follows: + + unsigned char ucode, acode; + short pcm_val; + + ucode = linear2ulaw(pcm_val); + ucode = alaw2ulaw(acode); + + acode = linear2alaw(pcm_val); + acode = ulaw2alaw(ucode); + + pcm_val = ulaw2linear(ucode); + pcm_val = alaw2linear(acode); + + +The other CCITT compression routines are invoked as follows: + + #include "g72x.h" + + struct g72x_state state; + int sample, code; + + g72x_init_state(&state); + code = {g721,g723_24,g723_40}_encoder(sample, coding, &state); + sample = {g721,g723_24,g723_40}_decoder(code, coding, &state); + +where + coding = AUDIO_ENCODING_ULAW for 8-bit u-law samples + AUDIO_ENCODING_ALAW for 8-bit A-law samples + AUDIO_ENCODING_LINEAR for 16-bit linear PCM samples + + + +This directory also includes the following sample programs: + + encode.c CCITT ADPCM encoder + decode.c CCITT ADPCM decoder + Makefile makefile for the sample programs + + +The sample programs contain examples of how to call the various compression +routines and pack/unpack the bits. The sample programs read byte streams from +stdin and write to stdout. The input/output data is raw data (no file header +or other identifying information is embedded). The sample programs are +invoked as follows: + + encode [-3|4|5] [-a|u|l] outfile + decode [-3|4|5] [-a|u|l] outfile +where: + -3 encode to (decode from) G.723 24kbps (3-bit) data + -4 encode to (decode from) G.721 32kbps (4-bit) data [the default] + -5 encode to (decode from) G.723 40kbps (5-bit) data + -a encode from (decode to) A-law data + -u encode from (decode to) u-law data [the default] + -l encode from (decode to) 16-bit linear data + +Examples: + # Read 16-bit linear and output G.721 + encode -4 -l g721file + + # Read 40Kbps G.723 and output A-law + decode -5 -a alawfile + + # Compress and then decompress u-law data using 24Kbps G.723 + encode -3 ulawout + diff --git a/libsndfile-1.0.31/src/G72x/g721.c b/libsndfile-1.0.31/src/G72x/g721.c new file mode 100644 index 0000000..826d42c --- /dev/null +++ b/libsndfile-1.0.31/src/G72x/g721.c @@ -0,0 +1,155 @@ +/* + * This source code is a product of Sun Microsystems, Inc. and is provided + * for unrestricted use. Users may copy or modify this source code without + * charge. + * + * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING + * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * Sun source code is provided with no support and without any obligation on + * the part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + * + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE + * OR ANY PART THEREOF. + * + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + * + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California 94043 + */ + +/* + * g721.c + * + * Description: + * + * g721_encoder (), g721_decoder () + * + * These routines comprise an implementation of the CCITT G.721 ADPCM + * coding algorithm. Essentially, this implementation is identical to + * the bit level description except for a few deviations which + * take advantage of work station attributes, such as hardware 2's + * complement arithmetic and large memory. Specifically, certain time + * consuming operations such as multiplications are replaced + * with lookup tables and software 2's complement operations are + * replaced with hardware 2's complement. + * + * The deviation from the bit level specification (lookup tables) + * preserves the bit level performance specifications. + * + * As outlined in the G.721 Recommendation, the algorithm is broken + * down into modules. Each section of code below is preceded by + * the name of the module which it is implementing. + * + */ + +#include "g72x.h" +#include "g72x_priv.h" + +static short qtab_721 [7] = { -124, 80, 178, 246, 300, 349, 400 } ; +/* + * Maps G.721 code word to reconstructed scale factor normalized log + * magnitude values. + */ +static short _dqlntab [16] = { -2048, 4, 135, 213, 273, 323, 373, 425, + 425, 373, 323, 273, 213, 135, 4, -2048 } ; + +/* Maps G.721 code word to log of scale factor multiplier. */ +static short _witab [16] = { -12, 18, 41, 64, 112, 198, 355, 1122, + 1122, 355, 198, 112, 64, 41, 18, -12 } ; +/* + * Maps G.721 code words to a set of values whose long and short + * term averages are computed and then compared to give an indication + * how stationary (steady state) the signal is. + */ +static short _fitab [16] = { 0, 0, 0, 0x200, 0x200, 0x200, 0x600, 0xE00, + 0xE00, 0x600, 0x200, 0x200, 0x200, 0, 0, 0 } ; + +/* + * g721_encoder () + * + * Encodes the input vale of linear PCM, A-law or u-law data sl and returns + * the resulting code. -1 is returned for unknown input coding value. + */ +int +g721_encoder ( + int sl, + G72x_STATE *state_ptr) +{ + short sezi, se, sez ; /* ACCUM */ + short d ; /* SUBTA */ + short sr ; /* ADDB */ + short y ; /* MIX */ + short dqsez ; /* ADDC */ + short dq, i ; + + /* linearize input sample to 14-bit PCM */ + sl >>= 2 ; /* 14-bit dynamic range */ + + sezi = predictor_zero (state_ptr) ; + sez = sezi >> 1 ; + se = (sezi + predictor_pole (state_ptr)) >> 1 ; /* estimated signal */ + + d = sl - se ; /* estimation difference */ + + /* quantize the prediction difference */ + y = step_size (state_ptr) ; /* quantizer step size */ + i = quantize (d, y, qtab_721, 7) ; /* i = ADPCM code */ + + dq = reconstruct (i & 8, _dqlntab [i], y) ; /* quantized est diff */ + + sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq ; /* reconst. signal */ + + dqsez = sr + sez - se ; /* pole prediction diff. */ + + update (4, y, arith_shift_left (_witab [i], 5), _fitab [i], dq, sr, dqsez, state_ptr) ; + + return i ; +} + +/* + * g721_decoder () + * + * Description: + * + * Decodes a 4-bit code of G.721 encoded data of i and + * returns the resulting linear PCM, A-law or u-law value. + * return -1 for unknown out_coding value. + */ +int +g721_decoder ( + int i, + G72x_STATE *state_ptr) +{ + short sezi, sei, sez, se ; /* ACCUM */ + short y ; /* MIX */ + short sr ; /* ADDB */ + short dq ; + short dqsez ; + + i &= 0x0f ; /* mask to get proper bits */ + sezi = predictor_zero (state_ptr) ; + sez = sezi >> 1 ; + sei = sezi + predictor_pole (state_ptr) ; + se = sei >> 1 ; /* se = estimated signal */ + + y = step_size (state_ptr) ; /* dynamic quantizer step size */ + + dq = reconstruct (i & 0x08, _dqlntab [i], y) ; /* quantized diff. */ + + sr = (dq < 0) ? (se - (dq & 0x3FFF)) : se + dq ; /* reconst. signal */ + + dqsez = sr - se + sez ; /* pole prediction diff. */ + + update (4, y, arith_shift_left (_witab [i], 5), _fitab [i], dq, sr, dqsez, state_ptr) ; + + /* sr was 14-bit dynamic range */ + return arith_shift_left (sr, 2) ; +} + diff --git a/libsndfile-1.0.31/src/G72x/g723_16.c b/libsndfile-1.0.31/src/G72x/g723_16.c new file mode 100644 index 0000000..c377e63 --- /dev/null +++ b/libsndfile-1.0.31/src/G72x/g723_16.c @@ -0,0 +1,162 @@ +/* + * This source code is a product of Sun Microsystems, Inc. and is provided + * for unrestricted use. Users may copy or modify this source code without + * charge. + * + * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING + * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * Sun source code is provided with no support and without any obligation on + * the part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + * + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE + * OR ANY PART THEREOF. + * + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + * + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California 94043 + */ +/* 16kbps version created, used 24kbps code and changing as little as possible. + * G.726 specs are available from ITU's gopher or WWW site (http://www.itu.ch) + * If any errors are found, please contact me at mrand@tamu.edu + * -Marc Randolph + */ + +/* + * g723_16.c + * + * Description: + * + * g723_16_encoder (), g723_16_decoder () + * + * These routines comprise an implementation of the CCITT G.726 16 Kbps + * ADPCM coding algorithm. Essentially, this implementation is identical to + * the bit level description except for a few deviations which take advantage + * of workstation attributes, such as hardware 2's complement arithmetic. + * + */ + +#include "g72x.h" +#include "g72x_priv.h" + +/* + * Maps G.723_16 code word to reconstructed scale factor normalized log + * magnitude values. Comes from Table 11/G.726 + */ +static short _dqlntab [4] = { 116, 365, 365, 116 } ; + +/* Maps G.723_16 code word to log of scale factor multiplier. + * + * _witab [4] is actually {-22 , 439, 439, -22}, but FILTD wants it + * as WI << 5 (multiplied by 32), so we'll do that here + */ +static short _witab [4] = { -704, 14048, 14048, -704 } ; + +/* + * Maps G.723_16 code words to a set of values whose long and short + * term averages are computed and then compared to give an indication + * how stationary (steady state) the signal is. + */ + +/* Comes from FUNCTF */ +static short _fitab [4] = { 0, 0xE00, 0xE00, 0 } ; + +/* Comes from quantizer decision level tables (Table 7/G.726) + */ +static short qtab_723_16 [1] = { 261 } ; + + +/* + * g723_16_encoder () + * + * Encodes a linear PCM, A-law or u-law input sample and returns its 2-bit code. + * Returns -1 if invalid input coding value. + */ +int +g723_16_encoder ( + int sl, + G72x_STATE *state_ptr) +{ + short sei, sezi, se, sez ; /* ACCUM */ + short d ; /* SUBTA */ + short y ; /* MIX */ + short sr ; /* ADDB */ + short dqsez ; /* ADDC */ + short dq, i ; + + /* linearize input sample to 14-bit PCM */ + sl >>= 2 ; /* sl of 14-bit dynamic range */ + + sezi = predictor_zero (state_ptr) ; + sez = sezi >> 1 ; + sei = sezi + predictor_pole (state_ptr) ; + se = sei >> 1 ; /* se = estimated signal */ + + d = sl - se ; /* d = estimation diff. */ + + /* quantize prediction difference d */ + y = step_size (state_ptr) ; /* quantizer step size */ + i = quantize (d, y, qtab_723_16, 1) ; /* i = ADPCM code */ + + /* Since quantize () only produces a three level output + * (1, 2, or 3), we must create the fourth one on our own + */ + if (i == 3) /* i code for the zero region */ + if ((d & 0x8000) == 0) /* If d > 0, i=3 isn't right... */ + i = 0 ; + + dq = reconstruct (i & 2, _dqlntab [i], y) ; /* quantized diff. */ + + sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq ; /* reconstructed signal */ + + dqsez = sr + sez - se ; /* pole prediction diff. */ + + update (2, y, _witab [i], _fitab [i], dq, sr, dqsez, state_ptr) ; + + return i ; +} + +/* + * g723_16_decoder () + * + * Decodes a 2-bit CCITT G.723_16 ADPCM code and returns + * the resulting 16-bit linear PCM, A-law or u-law sample value. + * -1 is returned if the output coding is unknown. + */ +int +g723_16_decoder ( + int i, + G72x_STATE *state_ptr) +{ + short sezi, sei, sez, se ; /* ACCUM */ + short y ; /* MIX */ + short sr ; /* ADDB */ + short dq ; + short dqsez ; + + i &= 0x03 ; /* mask to get proper bits */ + sezi = predictor_zero (state_ptr) ; + sez = sezi >> 1 ; + sei = sezi + predictor_pole (state_ptr) ; + se = sei >> 1 ; /* se = estimated signal */ + + y = step_size (state_ptr) ; /* adaptive quantizer step size */ + dq = reconstruct (i & 0x02, _dqlntab [i], y) ; /* unquantize pred diff */ + + sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq) ; /* reconst. signal */ + + dqsez = sr - se + sez ; /* pole prediction diff. */ + + update (2, y, _witab [i], _fitab [i], dq, sr, dqsez, state_ptr) ; + + /* sr was of 14-bit dynamic range */ + return (sr << 2) ; +} + diff --git a/libsndfile-1.0.31/src/G72x/g723_24.c b/libsndfile-1.0.31/src/G72x/g723_24.c new file mode 100644 index 0000000..9cc2f6d --- /dev/null +++ b/libsndfile-1.0.31/src/G72x/g723_24.c @@ -0,0 +1,139 @@ +/* + * This source code is a product of Sun Microsystems, Inc. and is provided + * for unrestricted use. Users may copy or modify this source code without + * charge. + * + * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING + * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * Sun source code is provided with no support and without any obligation on + * the part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + * + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE + * OR ANY PART THEREOF. + * + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + * + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California 94043 + */ + +/* + * g723_24.c + * + * Description: + * + * g723_24_encoder (), g723_24_decoder () + * + * These routines comprise an implementation of the CCITT G.723 24 Kbps + * ADPCM coding algorithm. Essentially, this implementation is identical to + * the bit level description except for a few deviations which take advantage + * of workstation attributes, such as hardware 2's complement arithmetic. + * + */ + +#include "g72x.h" +#include "g72x_priv.h" + +/* + * Maps G.723_24 code word to reconstructed scale factor normalized log + * magnitude values. + */ +static short _dqlntab [8] = { -2048, 135, 273, 373, 373, 273, 135, -2048 } ; + +/* Maps G.723_24 code word to log of scale factor multiplier. */ +static short _witab [8] = { -128, 960, 4384, 18624, 18624, 4384, 960, -128 } ; + +/* + * Maps G.723_24 code words to a set of values whose long and short + * term averages are computed and then compared to give an indication + * how stationary (steady state) the signal is. + */ +static short _fitab [8] = { 0, 0x200, 0x400, 0xE00, 0xE00, 0x400, 0x200, 0 } ; + +static short qtab_723_24 [3] = { 8, 218, 331 } ; + +/* + * g723_24_encoder () + * + * Encodes a linear PCM, A-law or u-law input sample and returns its 3-bit code. + * Returns -1 if invalid input coding value. + */ +int +g723_24_encoder ( + int sl, + G72x_STATE *state_ptr) +{ + short sei, sezi, se, sez ; /* ACCUM */ + short d ; /* SUBTA */ + short y ; /* MIX */ + short sr ; /* ADDB */ + short dqsez ; /* ADDC */ + short dq, i ; + + /* linearize input sample to 14-bit PCM */ + sl >>= 2 ; /* sl of 14-bit dynamic range */ + + sezi = predictor_zero (state_ptr) ; + sez = sezi >> 1 ; + sei = sezi + predictor_pole (state_ptr) ; + se = sei >> 1 ; /* se = estimated signal */ + + d = sl - se ; /* d = estimation diff. */ + + /* quantize prediction difference d */ + y = step_size (state_ptr) ; /* quantizer step size */ + i = quantize (d, y, qtab_723_24, 3) ; /* i = ADPCM code */ + dq = reconstruct (i & 4, _dqlntab [i], y) ; /* quantized diff. */ + + sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq ; /* reconstructed signal */ + + dqsez = sr + sez - se ; /* pole prediction diff. */ + + update (3, y, _witab [i], _fitab [i], dq, sr, dqsez, state_ptr) ; + + return i ; +} + +/* + * g723_24_decoder () + * + * Decodes a 3-bit CCITT G.723_24 ADPCM code and returns + * the resulting 16-bit linear PCM, A-law or u-law sample value. + * -1 is returned if the output coding is unknown. + */ +int +g723_24_decoder ( + int i, + G72x_STATE *state_ptr) +{ + short sezi, sei, sez, se ; /* ACCUM */ + short y ; /* MIX */ + short sr ; /* ADDB */ + short dq ; + short dqsez ; + + i &= 0x07 ; /* mask to get proper bits */ + sezi = predictor_zero (state_ptr) ; + sez = sezi >> 1 ; + sei = sezi + predictor_pole (state_ptr) ; + se = sei >> 1 ; /* se = estimated signal */ + + y = step_size (state_ptr) ; /* adaptive quantizer step size */ + dq = reconstruct (i & 0x04, _dqlntab [i], y) ; /* unquantize pred diff */ + + sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq) ; /* reconst. signal */ + + dqsez = sr - se + sez ; /* pole prediction diff. */ + + update (3, y, _witab [i], _fitab [i], dq, sr, dqsez, state_ptr) ; + + return arith_shift_left (sr, 2) ; /* sr was of 14-bit dynamic range */ +} + diff --git a/libsndfile-1.0.31/src/G72x/g723_40.c b/libsndfile-1.0.31/src/G72x/g723_40.c new file mode 100644 index 0000000..f7f8f74 --- /dev/null +++ b/libsndfile-1.0.31/src/G72x/g723_40.c @@ -0,0 +1,153 @@ +/* + * This source code is a product of Sun Microsystems, Inc. and is provided + * for unrestricted use. Users may copy or modify this source code without + * charge. + * + * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING + * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * Sun source code is provided with no support and without any obligation on + * the part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + * + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE + * OR ANY PART THEREOF. + * + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + * + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California 94043 + */ + +/* + * g723_40.c + * + * Description: + * + * g723_40_encoder (), g723_40_decoder () + * + * These routines comprise an implementation of the CCITT G.723 40Kbps + * ADPCM coding algorithm. Essentially, this implementation is identical to + * the bit level description except for a few deviations which + * take advantage of workstation attributes, such as hardware 2's + * complement arithmetic. + * + * The deviation from the bit level specification (lookup tables), + * preserves the bit level performance specifications. + * + * As outlined in the G.723 Recommendation, the algorithm is broken + * down into modules. Each section of code below is preceded by + * the name of the module which it is implementing. + * + */ + +#include "g72x.h" +#include "g72x_priv.h" + +/* + * Maps G.723_40 code word to ructeconstructed scale factor normalized log + * magnitude values. + */ +static short _dqlntab [32] = { -2048, -66, 28, 104, 169, 224, 274, 318, + 358, 395, 429, 459, 488, 514, 539, 566, + 566, 539, 514, 488, 459, 429, 395, 358, + 318, 274, 224, 169, 104, 28, -66, -2048 } ; + +/* Maps G.723_40 code word to log of scale factor multiplier. */ +static short _witab [32] = { 448, 448, 768, 1248, 1280, 1312, 1856, 3200, + 4512, 5728, 7008, 8960, 11456, 14080, 16928, 22272, + 22272, 16928, 14080, 11456, 8960, 7008, 5728, 4512, + 3200, 1856, 1312, 1280, 1248, 768, 448, 448 } ; + +/* + * Maps G.723_40 code words to a set of values whose long and short + * term averages are computed and then compared to give an indication + * how stationary (steady state) the signal is. + */ +static short _fitab [32] = { 0, 0, 0, 0, 0, 0x200, 0x200, 0x200, + 0x200, 0x200, 0x400, 0x600, 0x800, 0xA00, 0xC00, 0xC00, + 0xC00, 0xC00, 0xA00, 0x800, 0x600, 0x400, 0x200, 0x200, + 0x200, 0x200, 0x200, 0, 0, 0, 0, 0 } ; + +static short qtab_723_40 [15] = { -122, -16, 68, 139, 198, 250, 298, 339, + 378, 413, 445, 475, 502, 528, 553 } ; + +/* + * g723_40_encoder () + * + * Encodes a 16-bit linear PCM, A-law or u-law input sample and retuens + * the resulting 5-bit CCITT G.723 40Kbps code. + * Returns -1 if the input coding value is invalid. + */ +int g723_40_encoder (int sl, G72x_STATE *state_ptr) +{ + short sei, sezi, se, sez ; /* ACCUM */ + short d ; /* SUBTA */ + short y ; /* MIX */ + short sr ; /* ADDB */ + short dqsez ; /* ADDC */ + short dq, i ; + + /* linearize input sample to 14-bit PCM */ + sl >>= 2 ; /* sl of 14-bit dynamic range */ + + sezi = predictor_zero (state_ptr) ; + sez = sezi >> 1 ; + sei = sezi + predictor_pole (state_ptr) ; + se = sei >> 1 ; /* se = estimated signal */ + + d = sl - se ; /* d = estimation difference */ + + /* quantize prediction difference */ + y = step_size (state_ptr) ; /* adaptive quantizer step size */ + i = quantize (d, y, qtab_723_40, 15) ; /* i = ADPCM code */ + + dq = reconstruct (i & 0x10, _dqlntab [i], y) ; /* quantized diff */ + + sr = (dq < 0) ? se - (dq & 0x7FFF) : se + dq ; /* reconstructed signal */ + + dqsez = sr + sez - se ; /* dqsez = pole prediction diff. */ + + update (5, y, _witab [i], _fitab [i], dq, sr, dqsez, state_ptr) ; + + return i ; +} + +/* + * g723_40_decoder () + * + * Decodes a 5-bit CCITT G.723 40Kbps code and returns + * the resulting 16-bit linear PCM, A-law or u-law sample value. + * -1 is returned if the output coding is unknown. + */ +int g723_40_decoder (int i, G72x_STATE *state_ptr) +{ + short sezi, sei, sez, se ; /* ACCUM */ + short y ; /* MIX */ + short sr ; /* ADDB */ + short dq ; + short dqsez ; + + i &= 0x1f ; /* mask to get proper bits */ + sezi = predictor_zero (state_ptr) ; + sez = sezi >> 1 ; + sei = sezi + predictor_pole (state_ptr) ; + se = sei >> 1 ; /* se = estimated signal */ + + y = step_size (state_ptr) ; /* adaptive quantizer step size */ + dq = reconstruct (i & 0x10, _dqlntab [i], y) ; /* estimation diff. */ + + sr = (dq < 0) ? (se - (dq & 0x7FFF)) : (se + dq) ; /* reconst. signal */ + + dqsez = sr - se + sez ; /* pole prediction diff. */ + + update (5, y, _witab [i], _fitab [i], dq, sr, dqsez, state_ptr) ; + + return arith_shift_left (sr, 2) ; /* sr was of 14-bit dynamic range */ +} + diff --git a/libsndfile-1.0.31/src/G72x/g72x.c b/libsndfile-1.0.31/src/G72x/g72x.c new file mode 100644 index 0000000..2d6469c --- /dev/null +++ b/libsndfile-1.0.31/src/G72x/g72x.c @@ -0,0 +1,645 @@ +/* + * This source code is a product of Sun Microsystems, Inc. and is provided + * for unrestricted use. Users may copy or modify this source code without + * charge. + * + * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING + * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * Sun source code is provided with no support and without any obligation on + * the part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + * + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE + * OR ANY PART THEREOF. + * + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + * + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California 94043 + */ + +/* + * g72x.c + * + * Common routines for G.721 and G.723 conversions. + */ + +#include +#include +#include + +#include "g72x.h" +#include "g72x_priv.h" + +static G72x_STATE * g72x_state_new (void) ; +static int unpack_bytes (int bits, int blocksize, const unsigned char * block, short * samples) ; +static int pack_bytes (int bits, const short * samples, unsigned char * block) ; + +static +short power2 [15] = +{ 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80, + 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000 +} ; + +/* + * quan () + * + * quantizes the input val against the table of size short integers. + * It returns i if table [i - 1] <= val < table [i]. + * + * Using linear search for simple coding. + */ +static +int quan (int val, short *table, int size) +{ + int i ; + + for (i = 0 ; i < size ; i++) + if (val < *table++) + break ; + return i ; +} + +/* + * fmult () + * + * returns the integer product of the 14-bit integer "an" and + * "floating point" representation (4-bit exponent, 6-bit mantessa) "srn". + */ +static +int fmult (int an, int srn) +{ + short anmag, anexp, anmant ; + short wanexp, wanmant ; + short retval ; + + anmag = (an > 0) ? an : ((-an) & 0x1FFF) ; + anexp = quan (anmag, power2, 15) - 6 ; + anmant = (anmag == 0) ? 32 : + (anexp >= 0) ? anmag >> anexp : anmag << -anexp ; + wanexp = anexp + ((srn >> 6) & 0xF) - 13 ; + + /* + ** The original was : + ** wanmant = (anmant * (srn & 0x3F) + 0x30) >> 4 ; + ** but could see no valid reason for the + 0x30. + ** Removed it and it improved the SNR of the codec. + */ + + wanmant = (anmant * (srn & 0x3F)) >> 4 ; + + retval = (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) : (wanmant >> -wanexp) ; + + return (((an ^ srn) < 0) ? -retval : retval) ; +} + +static G72x_STATE * g72x_state_new (void) +{ return calloc (1, sizeof (G72x_STATE)) ; +} + +/* + * private_init_state () + * + * This routine initializes and/or resets the G72x_PRIVATE structure + * pointed to by 'state_ptr'. + * All the initial state values are specified in the CCITT G.721 document. + */ +void private_init_state (G72x_STATE *state_ptr) +{ + int cnta ; + + state_ptr->yl = 34816 ; + state_ptr->yu = 544 ; + state_ptr->dms = 0 ; + state_ptr->dml = 0 ; + state_ptr->ap = 0 ; + for (cnta = 0 ; cnta < 2 ; cnta++) + { state_ptr->a [cnta] = 0 ; + state_ptr->pk [cnta] = 0 ; + state_ptr->sr [cnta] = 32 ; + } + for (cnta = 0 ; cnta < 6 ; cnta++) + { state_ptr->b [cnta] = 0 ; + state_ptr->dq [cnta] = 32 ; + } + state_ptr->td = 0 ; +} /* private_init_state */ + +struct g72x_state * g72x_reader_init (int codec, int *blocksize, int *samplesperblock) +{ G72x_STATE *pstate ; + + if ((pstate = g72x_state_new ()) == NULL) + return NULL ; + + private_init_state (pstate) ; + + pstate->encoder = NULL ; + + switch (codec) + { case G723_16_BITS_PER_SAMPLE : /* 2 bits per sample. */ + pstate->decoder = g723_16_decoder ; + *blocksize = G723_16_BYTES_PER_BLOCK ; + *samplesperblock = G723_16_SAMPLES_PER_BLOCK ; + pstate->codec_bits = 2 ; + pstate->blocksize = G723_16_BYTES_PER_BLOCK ; + pstate->samplesperblock = G723_16_SAMPLES_PER_BLOCK ; + break ; + + case G723_24_BITS_PER_SAMPLE : /* 3 bits per sample. */ + pstate->decoder = g723_24_decoder ; + *blocksize = G723_24_BYTES_PER_BLOCK ; + *samplesperblock = G723_24_SAMPLES_PER_BLOCK ; + pstate->codec_bits = 3 ; + pstate->blocksize = G723_24_BYTES_PER_BLOCK ; + pstate->samplesperblock = G723_24_SAMPLES_PER_BLOCK ; + break ; + + case G721_32_BITS_PER_SAMPLE : /* 4 bits per sample. */ + pstate->decoder = g721_decoder ; + *blocksize = G721_32_BYTES_PER_BLOCK ; + *samplesperblock = G721_32_SAMPLES_PER_BLOCK ; + pstate->codec_bits = 4 ; + pstate->blocksize = G721_32_BYTES_PER_BLOCK ; + pstate->samplesperblock = G721_32_SAMPLES_PER_BLOCK ; + break ; + + case G721_40_BITS_PER_SAMPLE : /* 5 bits per sample. */ + pstate->decoder = g723_40_decoder ; + *blocksize = G721_40_BYTES_PER_BLOCK ; + *samplesperblock = G721_40_SAMPLES_PER_BLOCK ; + pstate->codec_bits = 5 ; + pstate->blocksize = G721_40_BYTES_PER_BLOCK ; + pstate->samplesperblock = G721_40_SAMPLES_PER_BLOCK ; + break ; + + default : + free (pstate) ; + return NULL ; + } ; + + return pstate ; +} /* g72x_reader_init */ + +struct g72x_state * g72x_writer_init (int codec, int *blocksize, int *samplesperblock) +{ G72x_STATE *pstate ; + + if ((pstate = g72x_state_new ()) == NULL) + return NULL ; + + private_init_state (pstate) ; + pstate->decoder = NULL ; + + switch (codec) + { case G723_16_BITS_PER_SAMPLE : /* 2 bits per sample. */ + pstate->encoder = g723_16_encoder ; + *blocksize = G723_16_BYTES_PER_BLOCK ; + *samplesperblock = G723_16_SAMPLES_PER_BLOCK ; + pstate->codec_bits = 2 ; + pstate->blocksize = G723_16_BYTES_PER_BLOCK ; + pstate->samplesperblock = G723_16_SAMPLES_PER_BLOCK ; + break ; + + case G723_24_BITS_PER_SAMPLE : /* 3 bits per sample. */ + pstate->encoder = g723_24_encoder ; + *blocksize = G723_24_BYTES_PER_BLOCK ; + *samplesperblock = G723_24_SAMPLES_PER_BLOCK ; + pstate->codec_bits = 3 ; + pstate->blocksize = G723_24_BYTES_PER_BLOCK ; + pstate->samplesperblock = G723_24_SAMPLES_PER_BLOCK ; + break ; + + case G721_32_BITS_PER_SAMPLE : /* 4 bits per sample. */ + pstate->encoder = g721_encoder ; + *blocksize = G721_32_BYTES_PER_BLOCK ; + *samplesperblock = G721_32_SAMPLES_PER_BLOCK ; + pstate->codec_bits = 4 ; + pstate->blocksize = G721_32_BYTES_PER_BLOCK ; + pstate->samplesperblock = G721_32_SAMPLES_PER_BLOCK ; + break ; + + case G721_40_BITS_PER_SAMPLE : /* 5 bits per sample. */ + pstate->encoder = g723_40_encoder ; + *blocksize = G721_40_BYTES_PER_BLOCK ; + *samplesperblock = G721_40_SAMPLES_PER_BLOCK ; + pstate->codec_bits = 5 ; + pstate->blocksize = G721_40_BYTES_PER_BLOCK ; + pstate->samplesperblock = G721_40_SAMPLES_PER_BLOCK ; + break ; + + default : + free (pstate) ; + return NULL ; + } ; + + return pstate ; +} /* g72x_writer_init */ + +int g72x_decode_block (G72x_STATE *pstate, const unsigned char *block, short *samples) +{ int k, count ; + + count = unpack_bytes (pstate->codec_bits, pstate->blocksize, block, samples) ; + + for (k = 0 ; k < count ; k++) + samples [k] = pstate->decoder (samples [k], pstate) ; + + return 0 ; +} /* g72x_decode_block */ + +int g72x_encode_block (G72x_STATE *pstate, short *samples, unsigned char *block) +{ int k, count ; + + for (k = 0 ; k < pstate->samplesperblock ; k++) + samples [k] = pstate->encoder (samples [k], pstate) ; + + count = pack_bytes (pstate->codec_bits, samples, block) ; + + return count ; +} /* g72x_encode_block */ + +/* + * predictor_zero () + * + * computes the estimated signal from 6-zero predictor. + * + */ +int predictor_zero (G72x_STATE *state_ptr) +{ + int i ; + int sezi ; + + sezi = fmult (state_ptr->b [0] >> 2, state_ptr->dq [0]) ; + for (i = 1 ; i < 6 ; i++) /* ACCUM */ + sezi += fmult (state_ptr->b [i] >> 2, state_ptr->dq [i]) ; + return sezi ; +} +/* + * predictor_pole () + * + * computes the estimated signal from 2-pole predictor. + * + */ +int predictor_pole (G72x_STATE *state_ptr) +{ + return (fmult (state_ptr->a [1] >> 2, state_ptr->sr [1]) + + fmult (state_ptr->a [0] >> 2, state_ptr->sr [0])) ; +} +/* + * step_size () + * + * computes the quantization step size of the adaptive quantizer. + * + */ +int step_size (G72x_STATE *state_ptr) +{ + int y ; + int dif ; + int al ; + + if (state_ptr->ap >= 256) + return (state_ptr->yu) ; + else { + y = state_ptr->yl >> 6 ; + dif = state_ptr->yu - y ; + al = state_ptr->ap >> 2 ; + if (dif > 0) + y += (dif * al) >> 6 ; + else if (dif < 0) + y += (dif * al + 0x3F) >> 6 ; + return y ; + } +} + +/* + * quantize () + * + * Given a raw sample, 'd', of the difference signal and a + * quantization step size scale factor, 'y', this routine returns the + * ADPCM codeword to which that sample gets quantized. The step + * size scale factor division operation is done in the log base 2 domain + * as a subtraction. + */ +int quantize ( + int d, /* Raw difference signal sample */ + int y, /* Step size multiplier */ + short *table, /* quantization table */ + int size) /* table size of short integers */ +{ + short dqm ; /* Magnitude of 'd' */ + short expon ; /* Integer part of base 2 log of 'd' */ + short mant ; /* Fractional part of base 2 log */ + short dl ; /* Log of magnitude of 'd' */ + short dln ; /* Step size scale factor normalized log */ + int i ; + + /* + * LOG + * + * Compute base 2 log of 'd', and store in 'dl'. + */ + dqm = abs (d) ; + expon = quan (dqm >> 1, power2, 15) ; + mant = ((dqm << 7) >> expon) & 0x7F ; /* Fractional portion. */ + dl = (expon << 7) + mant ; + + /* + * SUBTB + * + * "Divide" by step size multiplier. + */ + dln = dl - (y >> 2) ; + + /* + * QUAN + * + * Obtain codword i for 'd'. + */ + i = quan (dln, table, size) ; + if (d < 0) /* take 1's complement of i */ + return ((size << 1) + 1 - i) ; + else if (i == 0) /* take 1's complement of 0 */ + return ((size << 1) + 1) ; /* new in 1988 */ + + return i ; +} +/* + * reconstruct () + * + * Returns reconstructed difference signal 'dq' obtained from + * codeword 'i' and quantization step size scale factor 'y'. + * Multiplication is performed in log base 2 domain as addition. + */ +int +reconstruct ( + int sign, /* 0 for non-negative value */ + int dqln, /* G.72x codeword */ + int y) /* Step size multiplier */ +{ + short dql ; /* Log of 'dq' magnitude */ + short dex ; /* Integer part of log */ + short dqt ; + short dq ; /* Reconstructed difference signal sample */ + + dql = dqln + (y >> 2) ; /* ADDA */ + + if (dql < 0) + return ((sign) ? -0x8000 : 0) ; + else /* ANTILOG */ + { dex = (dql >> 7) & 15 ; + dqt = 128 + (dql & 127) ; + dq = (dqt << 7) >> (14 - dex) ; + return ((sign) ? (dq - 0x8000) : dq) ; + } +} + + +/* + * update () + * + * updates the state variables for each output code + */ +void +update ( + int code_size, /* distinguish 723_40 with others */ + int y, /* quantizer step size */ + int wi, /* scale factor multiplier */ + int fi, /* for long/short term energies */ + int dq, /* quantized prediction difference */ + int sr, /* reconstructed signal */ + int dqsez, /* difference from 2-pole predictor */ + G72x_STATE *state_ptr) /* coder state pointer */ +{ + int cnt ; + short mag, expon ; /* Adaptive predictor, FLOAT A */ + short a2p = 0 ; /* LIMC */ + short a1ul ; /* UPA1 */ + short pks1 ; /* UPA2 */ + short fa1 ; + char tr ; /* tone/transition detector */ + short ylint, thr2, dqthr ; + short ylfrac, thr1 ; + short pk0 ; + + pk0 = (dqsez < 0) ? 1 : 0 ; /* needed in updating predictor poles */ + + mag = dq & 0x7FFF ; /* prediction difference magnitude */ + /* TRANS */ + ylint = state_ptr->yl >> 15 ; /* exponent part of yl */ + ylfrac = (state_ptr->yl >> 10) & 0x1F ; /* fractional part of yl */ + thr1 = (32 + ylfrac) << ylint ; /* threshold */ + thr2 = (ylint > 9) ? 31 << 10 : thr1 ; /* limit thr2 to 31 << 10 */ + dqthr = (thr2 + (thr2 >> 1)) >> 1 ; /* dqthr = 0.75 * thr2 */ + if (state_ptr->td == 0) /* signal supposed voice */ + tr = 0 ; + else if (mag <= dqthr) /* supposed data, but small mag */ + tr = 0 ; /* treated as voice */ + else /* signal is data (modem) */ + tr = 1 ; + + /* + * Quantizer scale factor adaptation. + */ + + /* FUNCTW & FILTD & DELAY */ + /* update non-steady state step size multiplier */ + state_ptr->yu = y + ((wi - y) >> 5) ; + + /* LIMB */ + if (state_ptr->yu < 544) /* 544 <= yu <= 5120 */ + state_ptr->yu = 544 ; + else if (state_ptr->yu > 5120) + state_ptr->yu = 5120 ; + + /* FILTE & DELAY */ + /* update steady state step size multiplier */ + state_ptr->yl += state_ptr->yu + ((-state_ptr->yl) >> 6) ; + + /* + * Adaptive predictor coefficients. + */ + if (tr == 1) { /* reset a's and b's for modem signal */ + state_ptr->a [0] = 0 ; + state_ptr->a [1] = 0 ; + state_ptr->b [0] = 0 ; + state_ptr->b [1] = 0 ; + state_ptr->b [2] = 0 ; + state_ptr->b [3] = 0 ; + state_ptr->b [4] = 0 ; + state_ptr->b [5] = 0 ; + } + else /* update a's and b's */ + { pks1 = pk0 ^ state_ptr->pk [0] ; /* UPA2 */ + + /* update predictor pole a [1] */ + a2p = state_ptr->a [1] - (state_ptr->a [1] >> 7) ; + if (dqsez != 0) + { fa1 = (pks1) ? state_ptr->a [0] : -state_ptr->a [0] ; + if (fa1 < -8191) /* a2p = function of fa1 */ + a2p -= 0x100 ; + else if (fa1 > 8191) + a2p += 0xFF ; + else + a2p += fa1 >> 5 ; + + if (pk0 ^ state_ptr->pk [1]) + { /* LIMC */ + if (a2p <= -12160) + a2p = -12288 ; + else if (a2p >= 12416) + a2p = 12288 ; + else + a2p -= 0x80 ; + } + else if (a2p <= -12416) + a2p = -12288 ; + else if (a2p >= 12160) + a2p = 12288 ; + else + a2p += 0x80 ; + } + + /* TRIGB & DELAY */ + state_ptr->a [1] = a2p ; + + /* UPA1 */ + /* update predictor pole a [0] */ + state_ptr->a [0] -= state_ptr->a [0] >> 8 ; + if (dqsez != 0) + { if (pks1 == 0) + state_ptr->a [0] += 192 ; + else + state_ptr->a [0] -= 192 ; + } ; + + /* LIMD */ + a1ul = 15360 - a2p ; + if (state_ptr->a [0] < -a1ul) + state_ptr->a [0] = -a1ul ; + else if (state_ptr->a [0] > a1ul) + state_ptr->a [0] = a1ul ; + + /* UPB : update predictor zeros b [6] */ + for (cnt = 0 ; cnt < 6 ; cnt++) + { if (code_size == 5) /* for 40Kbps G.723 */ + state_ptr->b [cnt] -= state_ptr->b [cnt] >> 9 ; + else /* for G.721 and 24Kbps G.723 */ + state_ptr->b [cnt] -= state_ptr->b [cnt] >> 8 ; + if (dq & 0x7FFF) /* XOR */ + { if ((dq ^ state_ptr->dq [cnt]) >= 0) + state_ptr->b [cnt] += 128 ; + else + state_ptr->b [cnt] -= 128 ; + } + } + } + + for (cnt = 5 ; cnt > 0 ; cnt--) + state_ptr->dq [cnt] = state_ptr->dq [cnt - 1] ; + /* FLOAT A : convert dq [0] to 4-bit exp, 6-bit mantissa f.p. */ + if (mag == 0) + state_ptr->dq [0] = (dq >= 0) ? 0x20 : 0xFC20 ; + else + { expon = quan (mag, power2, 15) ; + state_ptr->dq [0] = (dq >= 0) ? + (expon << 6) + ((mag << 6) >> expon) : + (expon << 6) + ((mag << 6) >> expon) - 0x400 ; + } + + state_ptr->sr [1] = state_ptr->sr [0] ; + /* FLOAT B : convert sr to 4-bit exp., 6-bit mantissa f.p. */ + if (sr == 0) + state_ptr->sr [0] = 0x20 ; + else if (sr > 0) + { expon = quan (sr, power2, 15) ; + state_ptr->sr [0] = (expon << 6) + ((sr << 6) >> expon) ; + } + else if (sr > -32768) + { mag = -sr ; + expon = quan (mag, power2, 15) ; + state_ptr->sr [0] = (expon << 6) + ((mag << 6) >> expon) - 0x400 ; + } + else + state_ptr->sr [0] = (short) 0xFC20 ; + + /* DELAY A */ + state_ptr->pk [1] = state_ptr->pk [0] ; + state_ptr->pk [0] = pk0 ; + + /* TONE */ + if (tr == 1) /* this sample has been treated as data */ + state_ptr->td = 0 ; /* next one will be treated as voice */ + else if (a2p < -11776) /* small sample-to-sample correlation */ + state_ptr->td = 1 ; /* signal may be data */ + else /* signal is voice */ + state_ptr->td = 0 ; + + /* + * Adaptation speed control. + */ + state_ptr->dms += (fi - state_ptr->dms) >> 5 ; /* FILTA */ + state_ptr->dml += (((fi << 2) - state_ptr->dml) >> 7) ; /* FILTB */ + + if (tr == 1) + state_ptr->ap = 256 ; + else if (y < 1536) /* SUBTC */ + state_ptr->ap += (0x200 - state_ptr->ap) >> 4 ; + else if (state_ptr->td == 1) + state_ptr->ap += (0x200 - state_ptr->ap) >> 4 ; + else if (abs ((state_ptr->dms << 2) - state_ptr->dml) >= (state_ptr->dml >> 3)) + state_ptr->ap += (0x200 - state_ptr->ap) >> 4 ; + else + state_ptr->ap += (-state_ptr->ap) >> 4 ; + + return ; +} /* update */ + +/*------------------------------------------------------------------------------ +*/ + +static int +unpack_bytes (int bits, int blocksize, const unsigned char * block, short * samples) +{ unsigned int in_buffer = 0 ; + unsigned char in_byte ; + int k, in_bits = 0, bindex = 0 ; + + for (k = 0 ; bindex <= blocksize && k < G72x_BLOCK_SIZE ; k++) + { if (in_bits < bits) + { in_byte = block [bindex++] ; + + in_buffer |= (in_byte << in_bits) ; + in_bits += 8 ; + } + samples [k] = in_buffer & ((1 << bits) - 1) ; + in_buffer >>= bits ; + in_bits -= bits ; + } ; + + return k ; +} /* unpack_bytes */ + +static int +pack_bytes (int bits, const short * samples, unsigned char * block) +{ + unsigned int out_buffer = 0 ; + int k, bindex = 0, out_bits = 0 ; + unsigned char out_byte ; + + for (k = 0 ; k < G72x_BLOCK_SIZE ; k++) + { out_buffer |= (samples [k] << out_bits) ; + out_bits += bits ; + if (out_bits >= 8) + { out_byte = out_buffer & 0xFF ; + out_bits -= 8 ; + out_buffer >>= 8 ; + block [bindex++] = out_byte ; + } + } ; + + return bindex ; +} /* pack_bytes */ + diff --git a/libsndfile-1.0.31/src/G72x/g72x.h b/libsndfile-1.0.31/src/G72x/g72x.h new file mode 100644 index 0000000..d7631e6 --- /dev/null +++ b/libsndfile-1.0.31/src/G72x/g72x.h @@ -0,0 +1,91 @@ +/* +** Copyright (C) 1999-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +/* +** This file is not the same as the original file from Sun Microsystems. Nearly +** all the original definitions and function prototypes that were in the file +** of this name have been moved to g72x_priv.h. +*/ + +#ifndef G72X_HEADER_FILE +#define G72X_HEADER_FILE + +/* +** Number of samples per block to process. +** Must be a common multiple of possible bits per sample : 2, 3, 4, 5 and 8. +*/ +#define G72x_BLOCK_SIZE (3 * 5 * 8) + +/* +** Identifiers for the differing kinds of G72x ADPCM codecs. +** The identifiers also define the number of encoded bits per sample. +*/ + +enum +{ G723_16_BITS_PER_SAMPLE = 2, + G723_24_BITS_PER_SAMPLE = 3, + G723_40_BITS_PER_SAMPLE = 5, + + G721_32_BITS_PER_SAMPLE = 4, + G721_40_BITS_PER_SAMPLE = 5, + + G723_16_SAMPLES_PER_BLOCK = G72x_BLOCK_SIZE, + G723_24_SAMPLES_PER_BLOCK = G723_24_BITS_PER_SAMPLE * (G72x_BLOCK_SIZE / G723_24_BITS_PER_SAMPLE), + G723_40_SAMPLES_PER_BLOCK = G723_40_BITS_PER_SAMPLE * (G72x_BLOCK_SIZE / G723_40_BITS_PER_SAMPLE), + + G721_32_SAMPLES_PER_BLOCK = G72x_BLOCK_SIZE, + G721_40_SAMPLES_PER_BLOCK = G721_40_BITS_PER_SAMPLE * (G72x_BLOCK_SIZE / G721_40_BITS_PER_SAMPLE), + + G723_16_BYTES_PER_BLOCK = (G723_16_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8, + G723_24_BYTES_PER_BLOCK = (G723_24_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8, + G723_40_BYTES_PER_BLOCK = (G723_40_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8, + + G721_32_BYTES_PER_BLOCK = (G721_32_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8, + G721_40_BYTES_PER_BLOCK = (G721_40_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8 +} ; + +/* Forward declaration of of g72x_state. */ + +struct g72x_state ; + +/* External function definitions. */ + +struct g72x_state * g72x_reader_init (int codec, int *blocksize, int *samplesperblock) ; +struct g72x_state * g72x_writer_init (int codec, int *blocksize, int *samplesperblock) ; +/* +** Initialize the ADPCM state table for the given codec. +** Return 0 on success, 1 on fail. +*/ + +int g72x_decode_block (struct g72x_state *pstate, const unsigned char *block, short *samples) ; +/* +** The caller fills data->block with data->bytes bytes before calling the +** function. The value data->bytes must be an integer multiple of +** data->blocksize and be <= data->max_bytes. +** When it returns, the caller can read out data->samples samples. +*/ + +int g72x_encode_block (struct g72x_state *pstate, short *samples, unsigned char *block) ; +/* +** The caller fills state->samples some integer multiple data->samples_per_block +** (up to G72x_BLOCK_SIZE) samples before calling the function. +** When it returns, the caller can read out bytes encoded bytes. +*/ + +#endif /* !G72X_HEADER_FILE */ + diff --git a/libsndfile-1.0.31/src/G72x/g72x_priv.h b/libsndfile-1.0.31/src/G72x/g72x_priv.h new file mode 100644 index 0000000..e418fb7 --- /dev/null +++ b/libsndfile-1.0.31/src/G72x/g72x_priv.h @@ -0,0 +1,127 @@ +/* + * This source code is a product of Sun Microsystems, Inc. and is provided + * for unrestricted use. Users may copy or modify this source code without + * charge. + * + * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING + * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * Sun source code is provided with no support and without any obligation on + * the part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + * + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE + * OR ANY PART THEREOF. + * + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + * + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California 94043 + */ + +#ifndef G72X_PRIVATE_H +#define G72X_PRIVATE_H + +#ifdef __cplusplus +#error "This code is not designed to be compiled with a C++ compiler." +#endif + +/* +** The following is the definition of the state structure used by the +** G.721/G.723 encoder and decoder to preserve their internal state +** between successive calls. The meanings of the majority of the state +** structure fields are explained in detail in the CCITT Recommendation +** G.721. The field names are essentially identical to variable names +** in the bit level description of the coding algorithm included in this +** Recommendation. +*/ + +struct g72x_state +{ long yl ; /* Locked or steady state step size multiplier. */ + short yu ; /* Unlocked or non-steady state step size multiplier. */ + short dms ; /* Short term energy estimate. */ + short dml ; /* Long term energy estimate. */ + short ap ; /* Linear weighting coefficient of 'yl' and 'yu'. */ + + short a [2] ; /* Coefficients of pole portion of prediction filter. */ + short b [6] ; /* Coefficients of zero portion of prediction filter. */ + short pk [2] ; /* + ** Signs of previous two samples of a partially + ** reconstructed signal. + **/ + short dq [6] ; /* + ** Previous 6 samples of the quantized difference + ** signal represented in an internal floating point + ** format. + **/ + short sr [2] ; /* + ** Previous 2 samples of the quantized difference + ** signal represented in an internal floating point + ** format. + */ + char td ; /* delayed tone detect, new in 1988 version */ + + /* The following struct members were added for libsndfile. The original + ** code worked by calling a set of functions on a sample by sample basis + ** which is slow on architectures like Intel x86. For libsndfile, this + ** was changed so that the encoding and decoding routines could work on + ** a block of samples at a time to reduce the function call overhead. + */ + int (*encoder) (int, struct g72x_state* state) ; + int (*decoder) (int, struct g72x_state* state) ; + + int codec_bits, blocksize, samplesperblock ; +} ; + +typedef struct g72x_state G72x_STATE ; + +int predictor_zero (G72x_STATE *state_ptr) ; + +int predictor_pole (G72x_STATE *state_ptr) ; + +int step_size (G72x_STATE *state_ptr) ; + +int quantize (int d, int y, short *table, int size) ; + +int reconstruct (int sign, int dqln, int y) ; + +void update (int code_size, int y, int wi, int fi, int dq, int sr, int dqsez, G72x_STATE *state_ptr) ; + +int g721_encoder (int sample, G72x_STATE *state_ptr) ; +int g721_decoder (int code, G72x_STATE *state_ptr) ; + +int g723_16_encoder (int sample, G72x_STATE *state_ptr) ; +int g723_16_decoder (int code, G72x_STATE *state_ptr) ; + +int g723_24_encoder (int sample, G72x_STATE *state_ptr) ; +int g723_24_decoder (int code, G72x_STATE *state_ptr) ; + +int g723_40_encoder (int sample, G72x_STATE *state_ptr) ; +int g723_40_decoder (int code, G72x_STATE *state_ptr) ; + +void private_init_state (G72x_STATE *state_ptr) ; + +#if __GNUC__ +#define ALWAYS_INLINE __attribute__ ((always_inline)) +#else +#define ALWAYS_INLINE +#endif + +static inline int ALWAYS_INLINE +arith_shift_left (int x, int shift) +{ return (int) (((unsigned int) x) << shift) ; +} /* arith_shift_left */ + +static inline int ALWAYS_INLINE +arith_shift_right (int x, int shift) +{ if (x >= 0) + return x << shift ; + return ~ ((~x) << shift) ; +} /* arith_shift_right */ + +#endif /* G72X_PRIVATE_H */ diff --git a/libsndfile-1.0.31/src/G72x/g72x_test.c b/libsndfile-1.0.31/src/G72x/g72x_test.c new file mode 100644 index 0000000..e8a9767 --- /dev/null +++ b/libsndfile-1.0.31/src/G72x/g72x_test.c @@ -0,0 +1,220 @@ +/* +** Copyright (C) 1999-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif +#include +#include +#include + +#include "g72x.h" +#include "g72x_priv.h" + +#ifndef M_PI +#define M_PI 3.14159265358979323846264338 +#endif + +#define BUFFER_SIZE (1 << 14) +#define SAMPLE_RATE 11025 + + +static void g721_test (void) ; +static void g723_test (double margin) ; + +static void gen_signal_double (double *data, double scale, int datalen) ; +static int error_function (double data, double orig, double margin) ; + +static int oct_save_short (short *a, short *b, int len) ; + +int +main (int argc, char *argv []) +{ int bDoAll = 0 ; + int nTests = 0 ; + + if (argc != 2) + { printf ("Usage : %s \n", argv [0]) ; + printf (" Where is one of the following:\n") ; + printf (" g721 - test G721 encoder and decoder\n") ; + printf (" g723 - test G721 encoder and decoder\n") ; + printf (" all - perform all tests\n") ; + exit (1) ; + } ; + + bDoAll = !strcmp (argv [1], "all") ; + + if (bDoAll || ! strcmp (argv [1], "g721")) + { g721_test () ; + nTests++ ; + } ; + + if (bDoAll || ! strcmp (argv [1], "g723")) + { g723_test (0.53) ; + nTests++ ; + } ; + + if (nTests == 0) + { printf ("Mono : ************************************\n") ; + printf ("Mono : * No '%s' test defined.\n", argv [1]) ; + printf ("Mono : ************************************\n") ; + return 1 ; + } ; + + return 0 ; +} /* main */ + +static void +g721_test (void) +{ + return ; +} /* g721_test */ + +static void +g723_test (double margin) +{ static double orig_buffer [BUFFER_SIZE] ; + static short orig [BUFFER_SIZE] ; + static short data [BUFFER_SIZE] ; + + G72x_STATE encoder_state, decoder_state ; + + long k ; + int code, position, max_err ; + + private_init_state (&encoder_state) ; + encoder_state.encoder = g723_24_encoder ; + encoder_state.codec_bits = 3 ; + + private_init_state (&decoder_state) ; + decoder_state.decoder = g723_24_decoder ; + decoder_state.codec_bits = 3 ; + + memset (data, 0, BUFFER_SIZE * sizeof (short)) ; + memset (orig, 0, BUFFER_SIZE * sizeof (short)) ; + + printf (" g723_test : ") ; + fflush (stdout) ; + + gen_signal_double (orig_buffer, 32000.0, BUFFER_SIZE) ; + for (k = 0 ; k < BUFFER_SIZE ; k++) + orig [k] = (short) orig_buffer [k] ; + + /* Write and read data here. */ + position = 0 ; + max_err = 0 ; + for (k = 0 ; k < BUFFER_SIZE ; k++) + { code = encoder_state.encoder (orig [k], &encoder_state) ; + data [k] = decoder_state.decoder (code, &decoder_state) ; + if (abs (orig [k] - data [k]) > max_err) + { position = k ; + max_err = abs (orig [k] - data [k]) ; + } ; + } ; + + printf ("\n\nMax error of %d at postion %d.\n", max_err, position) ; + + for (k = 0 ; k < BUFFER_SIZE ; k++) + { if (error_function (data [k], orig [k], margin)) + { printf ("Line %d: Incorrect sample A (#%ld : %d should be %d).\n", __LINE__, k, data [k], orig [k]) ; + oct_save_short (orig, data, BUFFER_SIZE) ; + exit (1) ; + } ; + } ; + + + printf ("ok\n") ; + + return ; +} /* g723_test */ + + +#define SIGNAL_MAXVAL 30000.0 +#define DECAY_COUNT 1000 + +static void +gen_signal_double (double *gendata, double scale, int gendatalen) +{ int k, ramplen ; + double amp = 0.0 ; + + ramplen = DECAY_COUNT ; + + for (k = 0 ; k < gendatalen ; k++) + { if (k <= ramplen) + amp = scale * k / ((double) ramplen) ; + else if (k > gendatalen - ramplen) + amp = scale * (gendatalen - k) / ((double) ramplen) ; + + gendata [k] = amp * (0.4 * sin (33.3 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE)) + + 0.3 * cos (201.1 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))) ; + } ; + + return ; +} /* gen_signal_double */ + +static int +error_function (double data, double orig, double margin) +{ double error ; + + if (fabs (orig) <= 500.0) + error = fabs (fabs (data) - fabs (orig)) / 2000.0 ; + else if (fabs (orig) <= 1000.0) + error = fabs (data - orig) / 3000.0 ; + else + error = fabs (data - orig) / fabs (orig) ; + + if (error > margin) + { printf ("\n\n*******************\nError : %f\n", error) ; + return 1 ; + } ; + return 0 ; +} /* error_function */ + +static int +oct_save_short (short *a, short *b, int len) +{ FILE *file ; + int k ; + + if (! (file = fopen ("error.dat", "w"))) + return 1 ; + + fprintf (file, "# Not created by Octave\n") ; + + fprintf (file, "# name: a\n") ; + fprintf (file, "# type: matrix\n") ; + fprintf (file, "# rows: %d\n", len) ; + fprintf (file, "# columns: 1\n") ; + + for (k = 0 ; k < len ; k++) + fprintf (file, "% d\n", a [k]) ; + + fprintf (file, "# name: b\n") ; + fprintf (file, "# type: matrix\n") ; + fprintf (file, "# rows: %d\n", len) ; + fprintf (file, "# columns: 1\n") ; + + for (k = 0 ; k < len ; k++) + fprintf (file, "% d\n", b [k]) ; + + fclose (file) ; + return 0 ; +} /* oct_save_short */ + diff --git a/libsndfile-1.0.31/src/GSM610/COPYRIGHT b/libsndfile-1.0.31/src/GSM610/COPYRIGHT new file mode 100644 index 0000000..eba0e52 --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/COPYRIGHT @@ -0,0 +1,16 @@ +Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, +Technische Universitaet Berlin + +Any use of this software is permitted provided that this notice is not +removed and that neither the authors nor the Technische Universitaet Berlin +are deemed to have made any representations as to the suitability of this +software for any purpose nor are held responsible for any defects of +this software. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + +As a matter of courtesy, the authors request to be informed about uses +this software has found, about bugs in this software, and about any +improvements that may be of general interest. + +Berlin, 28.11.1994 +Jutta Degener +Carsten Bormann diff --git a/libsndfile-1.0.31/src/GSM610/ChangeLog b/libsndfile-1.0.31/src/GSM610/ChangeLog new file mode 100644 index 0000000..24f5248 --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/ChangeLog @@ -0,0 +1,56 @@ +2004-05-12 Erik de Castro Lopo + + * gsm610_priv.h + Replace ugly macros with inline functions. + + * *.c + Remove temporary variables used by macros and other minor fixes required by + above change. + +2003-06-02 Erik de Castro Lopo + + * rpe.c + Renamed variables "exp" to "expon" to avoid shadowed parameter warnigns. + +2002-06-08 Erik de Castro Lopo + + * long_term.c + Changes tp removed compiler warnings about shadowed parameters. + +2002-06-08 Erik de Castro Lopo + + * private.h + Made declarations of gsm_A, gsm_B, gsm_MIC etc extern. This fixed a compile + problem on MacOSX. + +2002-05-10 Erik de Castro Lopo + + * *.[ch] + Removed all pre-ANSI prototype kludges. Removed proto.h and unproto.h. + Started work on making GSM 6.10 files seekable. Currently they are not. + + * code.c private.h + Function Gsm_Coder () used a statically defined array. This was obviously + not re-entrant so moved it to struct gsm_state. + +2001-09-16 Erik de Castro Lopo + + * code.c + Added #includes for string.h and stdlib.h. + +2000-10-27 Erik de Castro Lopo + + * config.h + Removed some commented out #defines (ie //*efine) which were causing problems on + the Sun cc compiler. + +2000-02-29 Erik de Castro Lopo + + * private.h + Added #defines to emulate normal compile time options. + +2000-02-28 Erik de Castro Lopo + + * everthing + Created this directory and copied files from libgsm. + http://kbs.cs.tu-berlin.de/~jutta/toast.html diff --git a/libsndfile-1.0.31/src/GSM610/README b/libsndfile-1.0.31/src/GSM610/README new file mode 100644 index 0000000..b57132b --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/README @@ -0,0 +1,36 @@ +GSM 06.10 13 kbit/s RPE/LTP speech codec +---------------------------------------- + +All the file in this directory were written by Jutta Degener +and Carsten Borman for The Communications and Operating Systems +Research Group (KBS) at the Technische Universitaet Berlin. + +Their work was released under the following license which is +assumed to be compatible with The GNU Lesser General Public License. + +---------------------------------------------------------------------------- + +Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, +Technische Universitaet Berlin + +Any use of this software is permitted provided that this notice is not +removed and that neither the authors nor the Technische Universitaet Berlin +are deemed to have made any representations as to the suitability of this +software for any purpose nor are held responsible for any defects of +this software. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + +As a matter of courtesy, the authors request to be informed about uses +this software has found, about bugs in this software, and about any +improvements that may be of general interest. + +Berlin, 28.11.1994 +Jutta Degener (jutta@cs.tu-berlin.de) +Carsten Bormann (cabo@cs.tu-berlin.de) + +---------------------------------------------------------------------------- + +Jutta Degener and Carsten Bormann's work can be found on their homepage +at: + + http://kbs.cs.tu-berlin.de/~jutta/toast.html + diff --git a/libsndfile-1.0.31/src/GSM610/add.c b/libsndfile-1.0.31/src/GSM610/add.c new file mode 100644 index 0000000..c943eec --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/add.c @@ -0,0 +1,243 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* + * See private.h for the more commonly used macro versions. + */ + +#include +#include + +#include "gsm610_priv.h" + +#define saturate(x) \ + ((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x)) + +int16_t gsm_add (int16_t a, int16_t b) +{ + int32_t sum = (int32_t) a + (int32_t) b ; + return saturate (sum) ; +} + +int16_t gsm_sub (int16_t a, int16_t b) +{ + int32_t diff = (int32_t) a - (int32_t) b ; + return saturate (diff) ; +} + +int16_t gsm_mult (int16_t a, int16_t b) +{ + if (a == MIN_WORD && b == MIN_WORD) + return MAX_WORD ; + + return SASR_L ((int32_t) a * (int32_t) b, 15) ; +} + +int16_t gsm_mult_r (int16_t a, int16_t b) +{ + if (b == MIN_WORD && a == MIN_WORD) + return MAX_WORD ; + else + { int32_t prod = (int32_t) a * (int32_t) b + 16384 ; + prod >>= 15 ; + return prod & 0xFFFF ; + } +} + +int16_t gsm_abs (int16_t a) +{ + return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a ; +} + +int32_t gsm_L_mult (int16_t a, int16_t b) +{ + assert (a != MIN_WORD || b != MIN_WORD) ; + return ((int32_t) a * (int32_t) b) << 1 ; +} + +int32_t gsm_L_add (int32_t a, int32_t b) +{ + if (a < 0) + { if (b >= 0) + return a + b ; + else + { uint32_t A = (uint32_t) - (a + 1) + (uint32_t) - (b + 1) ; + return A >= MAX_LONGWORD ? MIN_LONGWORD : - (int32_t) A - 2 ; + } + } + else if (b <= 0) + return a + b ; + else + { uint32_t A = (uint32_t) a + (uint32_t) b ; + return A > MAX_LONGWORD ? MAX_LONGWORD : A ; + } +} + +int32_t gsm_L_sub (int32_t a, int32_t b) +{ + if (a >= 0) + { if (b >= 0) + return a - b ; + else + { /* a>=0, b<0 */ + uint32_t A = (uint32_t) a + - (b + 1) ; + return A >= MAX_LONGWORD ? MAX_LONGWORD : (A + 1) ; + } + } + else if (b <= 0) + return a - b ; + else + { /* a<0, b>0 */ + uint32_t A = (uint32_t) - (a + 1) + b ; + return A >= MAX_LONGWORD ? MIN_LONGWORD : - (int32_t) A - 1 ; + } +} + +static unsigned char const bitoff [256] = { + 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +} ; + +int16_t gsm_norm (int32_t a) +/* + * the number of left shifts needed to normalize the 32 bit + * variable L_var1 for positive values on the interval + * + * with minimum of + * minimum of 1073741824 (01000000000000000000000000000000) and + * maximum of 2147483647 (01111111111111111111111111111111) + * + * + * and for negative values on the interval with + * minimum of -2147483648 (-10000000000000000000000000000000) and + * maximum of -1073741824 (-1000000000000000000000000000000). + * + * in order to normalize the result, the following + * operation must be done: L_norm_var1 = L_var1 << norm (L_var1) ; + * + * (That's 'ffs', only from the left, not the right..) + */ +{ + assert (a != 0) ; + + if (a < 0) + { if (a <= -1073741824) return 0 ; + a = ~a ; + } + + return a & 0xffff0000 + ? (a & 0xff000000 + ? -1 + bitoff [0xFF & (a >> 24)] + : 7 + bitoff [0xFF & (a >> 16)]) + : (a & 0xff00 + ? 15 + bitoff [0xFF & (a >> 8)] + : 23 + bitoff [0xFF & a]) ; +} + +int32_t gsm_L_asl (int32_t a, int n) +{ + if (n >= 32) return 0 ; + if (n <= -32) return - (a < 0) ; + if (n < 0) return gsm_L_asr (a, -n) ; + return a << n ; +} + +int16_t gsm_asr (int16_t a, int n) +{ + if (n >= 16) return - (a < 0) ; + if (n <= -16) return 0 ; + if (n < 0) return a << -n ; + + return SASR_W (a, (int16_t) n) ; +} + +int16_t gsm_asl (int16_t a, int n) +{ + if (n >= 16) return 0 ; + if (n <= -16) return - (a < 0) ; + if (n < 0) return gsm_asr (a, -n) ; + return a << n ; +} + +int32_t gsm_L_asr (int32_t a, int n) +{ + if (n >= 32) return - (a < 0) ; + if (n <= -32) return 0 ; + if (n < 0) return a << -n ; + + return SASR_L (a, (int16_t) n) ; +} + +/* +** int16_t gsm_asr (int16_t a, int n) +** { +** if (n >= 16) return - (a < 0) ; +** if (n <= -16) return 0 ; +** if (n < 0) return a << -n ; +** +** # ifdef SASR_W +** return a >> n ; +** # else +** if (a >= 0) return a >> n ; +** else return - (int16_t) (- (uint16_t)a >> n) ; +** # endif +** } +** +*/ +/* + * (From p. 46, end of section 4.2.5) + * + * NOTE: The following lines gives [sic] one correct implementation + * of the div (num, denum) arithmetic operation. Compute div + * which is the integer division of num by denum: with denum + * >= num > 0 + */ + +int16_t gsm_div (int16_t num, int16_t denum) +{ + int32_t L_num = num ; + int32_t L_denum = denum ; + int16_t div = 0 ; + int k = 15 ; + + /* The parameter num sometimes becomes zero. + * Although this is explicitly guarded against in 4.2.5, + * we assume that the result should then be zero as well. + */ + + /* assert (num != 0) ; */ + + assert (num >= 0 && denum >= num) ; + if (num == 0) + return 0 ; + + while (k--) + { div <<= 1 ; + L_num <<= 1 ; + + if (L_num >= L_denum) + { L_num -= L_denum ; + div++ ; + } + } + + return div ; +} + diff --git a/libsndfile-1.0.31/src/GSM610/code.c b/libsndfile-1.0.31/src/GSM610/code.c new file mode 100644 index 0000000..991913b --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/code.c @@ -0,0 +1,87 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + + +#include +#include + +#include "gsm610_priv.h" + +/* + * 4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER + */ + +void Gsm_Coder ( + + struct gsm_state * State, + + int16_t * s, /* [0..159] samples IN */ + +/* + * The RPE-LTD coder works on a frame by frame basis. The length of + * the frame is equal to 160 samples. Some computations are done + * once per frame to produce at the output of the coder the + * LARc [1..8] parameters which are the coded LAR coefficients and + * also to realize the inverse filtering operation for the entire + * frame (160 samples of signal d [0..159]). These parts produce at + * the output of the coder: + */ + + int16_t * LARc, /* [0..7] LAR coefficients OUT */ + +/* + * Procedure 4.2.11 to 4.2.18 are to be executed four times per + * frame. That means once for each sub-segment RPE-LTP analysis of + * 40 samples. These parts produce at the output of the coder: + */ + + int16_t *Nc, /* [0..3] LTP lag OUT */ + int16_t *bc, /* [0..3] coded LTP gain OUT */ + int16_t *Mc, /* [0..3] RPE grid selection OUT */ + int16_t *xmaxc, /* [0..3] Coded maximum amplitude OUT */ + int16_t *xMc /* [13*4] normalized RPE samples OUT */ +) +{ + int k ; + int16_t *dp = State->dp0 + 120 ; /* [-120...-1] */ + int16_t *dpp = dp ; /* [0...39] */ + + int16_t so [160] ; + + Gsm_Preprocess (State, s, so) ; + Gsm_LPC_Analysis (State, so, LARc) ; + Gsm_Short_Term_Analysis_Filter (State, LARc, so) ; + + for (k = 0 ; k <= 3 ; k++, xMc += 13) + { Gsm_Long_Term_Predictor (State, + so+k*40, /* d [0..39] IN */ + dp, /* dp [-120..-1] IN */ + State->e + 5, /* e [0..39] OUT */ + dpp, /* dpp [0..39] OUT */ + Nc++, + bc++) ; + + Gsm_RPE_Encoding (/*-S,-*/ + State->e + 5, /* e ][0..39][IN/OUT */ + xmaxc++, Mc++, xMc) ; + /* + * Gsm_Update_of_reconstructed_short_time_residual_signal + * (dpp, State->e + 5, dp) ; + */ + + { + register int i ; + for (i = 0 ; i <= 39 ; i++) + dp [i] = GSM_ADD (State->e [5 + i], dpp [i]) ; + } + dp += 40 ; + dpp += 40 ; + + } + memcpy ((char *) State->dp0, (char *) (State->dp0 + 160), + 120 * sizeof (*State->dp0)) ; +} + diff --git a/libsndfile-1.0.31/src/GSM610/config.h b/libsndfile-1.0.31/src/GSM610/config.h new file mode 100644 index 0000000..f3eeb82 --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/config.h @@ -0,0 +1,26 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +#ifndef CONFIG_H +#define CONFIG_H + +#define HAS_STDLIB_H 1 /* /usr/include/stdlib.h */ +#define HAS_FCNTL_H 1 /* /usr/include/fcntl.h */ + +#define HAS_FSTAT 1 /* fstat syscall */ +#define HAS_FCHMOD 1 /* fchmod syscall */ +#define HAS_CHMOD 1 /* chmod syscall */ +#define HAS_FCHOWN 1 /* fchown syscall */ +#define HAS_CHOWN 1 /* chown syscall */ + +#define HAS_STRING_H 1 /* /usr/include/string.h */ + +#define HAS_UNISTD_H 1 /* /usr/include/unistd.h */ +#define HAS_UTIME 1 /* POSIX utime(path, times) */ +#define HAS_UTIME_H 1 /* UTIME header file */ + +#endif /* CONFIG_H */ + diff --git a/libsndfile-1.0.31/src/GSM610/decode.c b/libsndfile-1.0.31/src/GSM610/decode.c new file mode 100644 index 0000000..2a0712f --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/decode.c @@ -0,0 +1,58 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +#include + +#include "gsm610_priv.h" + +/* + * 4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER + */ + +static void Postprocessing ( + struct gsm_state * S, + register int16_t * s) +{ + register int k ; + register int16_t msr = S->msr ; + register int16_t tmp ; + + for (k = 160 ; k-- ; s++) + { tmp = GSM_MULT_R (msr, 28180) ; + msr = GSM_ADD (*s, tmp) ; /* Deemphasis */ + *s = GSM_ADD (msr, msr) & 0xFFF8 ; /* Truncation & Upscaling */ + } + S->msr = msr ; +} + +void Gsm_Decoder ( + struct gsm_state * S, + + int16_t * LARcr, /* [0..7] IN */ + + int16_t * Ncr, /* [0..3] IN */ + int16_t * bcr, /* [0..3] IN */ + int16_t * Mcr, /* [0..3] IN */ + int16_t * xmaxcr, /* [0..3] IN */ + int16_t * xMcr, /* [0..13*4] IN */ + + int16_t * s) /* [0..159] OUT */ +{ + int j, k ; + int16_t erp [40], wt [160] ; + int16_t *drp = S->dp0 + 120 ; + + for (j = 0 ; j <= 3 ; j++, xmaxcr++, bcr++, Ncr++, Mcr++, xMcr += 13) + { Gsm_RPE_Decoding (/*-S,-*/ *xmaxcr, *Mcr, xMcr, erp) ; + Gsm_Long_Term_Synthesis_Filtering (S, *Ncr, *bcr, erp, drp) ; + + for (k = 0 ; k <= 39 ; k++) wt [j * 40 + k] = drp [k] ; + } + + Gsm_Short_Term_Synthesis_Filter (S, LARcr, wt, s) ; + Postprocessing (S, s) ; +} + diff --git a/libsndfile-1.0.31/src/GSM610/gsm.h b/libsndfile-1.0.31/src/GSM610/gsm.h new file mode 100644 index 0000000..6506a65 --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/gsm.h @@ -0,0 +1,52 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +#ifndef GSM_H +#define GSM_H + +#include /* for FILE * */ + +/* + * Interface + */ + +typedef struct gsm_state * gsm ; +typedef short gsm_signal ; /* signed 16 bit */ +typedef unsigned char gsm_byte ; +typedef gsm_byte gsm_frame [33] ; /* 33 * 8 bits */ + +#define GSM_MAGIC 0xD /* 13 kbit/s RPE-LTP */ + +#define GSM_PATCHLEVEL 10 +#define GSM_MINOR 0 +#define GSM_MAJOR 1 + +#define GSM_OPT_VERBOSE 1 +#define GSM_OPT_FAST 2 +#define GSM_OPT_LTP_CUT 3 +#define GSM_OPT_WAV49 4 +#define GSM_OPT_FRAME_INDEX 5 +#define GSM_OPT_FRAME_CHAIN 6 + +gsm gsm_create (void) ; + +/* Added for libsndfile : May 6, 2002 */ +void gsm_init (gsm) ; + +void gsm_destroy (gsm) ; + +int gsm_print (FILE *, gsm, gsm_byte *) ; +int gsm_option (gsm, int, int *) ; + +void gsm_encode (gsm, gsm_signal *, gsm_byte *) ; +int gsm_decode (gsm, gsm_byte *, gsm_signal *) ; + +int gsm_explode (gsm, gsm_byte *, gsm_signal *) ; +void gsm_implode (gsm, gsm_signal *, gsm_byte *) ; + +#endif /* GSM_H */ + + diff --git a/libsndfile-1.0.31/src/GSM610/gsm610_priv.h b/libsndfile-1.0.31/src/GSM610/gsm610_priv.h new file mode 100644 index 0000000..dc95e3a --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/gsm610_priv.h @@ -0,0 +1,335 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +#ifndef PRIVATE_H +#define PRIVATE_H + +#include + +/* Added by Erik de Castro Lopo */ +#define USE_FLOAT_MUL +#define FAST +#define WAV49 + +#ifdef __cplusplus +#error "This code is not designed to be compiled with a C++ compiler." +#endif +/* Added by Erik de Castro Lopo */ + +struct gsm_state +{ int16_t dp0 [280] ; + + int16_t z1 ; /* preprocessing.c, Offset_com. */ + int32_t L_z2 ; /* Offset_com. */ + int mp ; /* Preemphasis */ + + int16_t u [8] ; /* short_term_aly_filter.c */ + int16_t LARpp [2][8] ; /* */ + int16_t j ; /* */ + + int16_t ltp_cut ; /* long_term.c, LTP crosscorr. */ + int16_t nrp ; /* 40 */ /* long_term.c, synthesis */ + int16_t v [9] ; /* short_term.c, synthesis */ + int16_t msr ; /* decoder.c, Postprocessing */ + + char verbose ; /* only used if !NDEBUG */ + char fast ; /* only used if FAST */ + + char wav_fmt ; /* only used if WAV49 defined */ + unsigned char frame_index ; /* odd/even chaining */ + unsigned char frame_chain ; /* half-byte to carry forward */ + + /* Moved here from code.c where it was defined as static */ + int16_t e [50] ; +} ; + +typedef struct gsm_state GSM_STATE ; + +#define MIN_WORD (-32767 - 1) +#define MAX_WORD 32767 + +#define MIN_LONGWORD (-2147483647 - 1) +#define MAX_LONGWORD 2147483647 + +/* Signed arithmetic shift right. */ +static inline int16_t +SASR_W (int16_t x, int16_t by) +{ if (x >= 0) + return x >> by ; + return ~ ((~x) >> by) ; +} /* SASR_W */ + +static inline int32_t +SASR_L (int32_t x, int16_t by) +{ if (x >= 0) + return x >> by ; + return ~ ((~x) >> by) ; +} /* SASR_L */ + +/* Signed arithmetic shift left. */ +static inline int16_t +SASL_W (int16_t x, int16_t by) +{ if (x >= 0) + return x << by ; + return - ((-x) << by) ; +} /* SASR_W */ + +static inline int32_t +SASL_L (int32_t x, int16_t by) +{ if (x >= 0) + return x << by ; + return - ((-x) << by) ; +} /* SASR_L */ + +/* + * Prototypes from add.c + */ +int16_t gsm_mult (int16_t a, int16_t b) ; +int32_t gsm_L_mult (int16_t a, int16_t b) ; +int16_t gsm_mult_r (int16_t a, int16_t b) ; + +int16_t gsm_div (int16_t num, int16_t denum) ; + +int16_t gsm_add (int16_t a, int16_t b) ; +int32_t gsm_L_add (int32_t a, int32_t b) ; + +int16_t gsm_sub (int16_t a, int16_t b) ; +int32_t gsm_L_sub (int32_t a, int32_t b) ; + +int16_t gsm_abs (int16_t a) ; + +int16_t gsm_norm (int32_t a) ; + +int32_t gsm_L_asl (int32_t a, int n) ; +int16_t gsm_asl (int16_t a, int n) ; + +int32_t gsm_L_asr (int32_t a, int n) ; +int16_t gsm_asr (int16_t a, int n) ; + +/* + * Inlined functions from add.h + */ + +static inline int32_t +GSM_MULT_R (int16_t a, int16_t b) +{ return (((int32_t) (a)) * ((int32_t) (b)) + 16384) >> 15 ; +} /* GSM_MULT_R */ + +static inline int32_t +GSM_MULT (int16_t a, int16_t b) +{ return (((int32_t) (a)) * ((int32_t) (b))) >> 15 ; +} /* GSM_MULT */ + +static inline int32_t +GSM_L_MULT (int16_t a, int16_t b) +{ return ((int32_t) (a)) * ((int32_t) (b)) << 1 ; +} /* GSM_L_MULT */ + +static inline int32_t +GSM_L_ADD (int32_t a, int32_t b) +{ uint32_t utmp ; + + if (a < 0 && b < 0) + { utmp = (uint32_t) - ((a) + 1) + (uint32_t) - ((b) + 1) ; + return (utmp >= (uint32_t) MAX_LONGWORD) ? MIN_LONGWORD : - (int32_t) utmp - 2 ; + } ; + + if (a > 0 && b > 0) + { utmp = (uint32_t) a + (uint32_t) b ; + return (utmp >= (uint32_t) MAX_LONGWORD) ? MAX_LONGWORD : utmp ; + } ; + + return a + b ; +} /* GSM_L_ADD */ + +static inline int32_t +GSM_ADD (int16_t a, int16_t b) +{ int32_t ltmp ; + + ltmp = ((int32_t) a) + ((int32_t) b) ; + + if (ltmp >= MAX_WORD) + return MAX_WORD ; + if (ltmp <= MIN_WORD) + return MIN_WORD ; + + return ltmp ; +} /* GSM_ADD */ + +static inline int32_t +GSM_SUB (int16_t a, int16_t b) +{ int32_t ltmp ; + + ltmp = ((int32_t) a) - ((int32_t) b) ; + + if (ltmp >= MAX_WORD) + ltmp = MAX_WORD ; + else if (ltmp <= MIN_WORD) + ltmp = MIN_WORD ; + + return ltmp ; +} /* GSM_SUB */ + +static inline int16_t +GSM_ABS (int16_t a) +{ + if (a > 0) + return a ; + if (a == MIN_WORD) + return MAX_WORD ; + return -a ; +} /* GSM_ADD */ + + +/* + * More prototypes from implementations.. + */ +void Gsm_Coder ( + struct gsm_state * S, + int16_t * s, /* [0..159] samples IN */ + int16_t * LARc, /* [0..7] LAR coefficients OUT */ + int16_t * Nc, /* [0..3] LTP lag OUT */ + int16_t * bc, /* [0..3] coded LTP gain OUT */ + int16_t * Mc, /* [0..3] RPE grid selection OUT */ + int16_t * xmaxc, /* [0..3] Coded maximum amplitude OUT */ + int16_t * xMc) ; /* [13*4] normalized RPE samples OUT */ + +void Gsm_Long_Term_Predictor ( /* 4x for 160 samples */ + struct gsm_state * S, + int16_t * d, /* [0..39] residual signal IN */ + int16_t * dp, /* [-120..-1] d' IN */ + int16_t * e, /* [0..40] OUT */ + int16_t * dpp, /* [0..40] OUT */ + int16_t * Nc, /* correlation lag OUT */ + int16_t * bc) ; /* gain factor OUT */ + +void Gsm_LPC_Analysis ( + struct gsm_state * S, + int16_t * s, /* 0..159 signals IN/OUT */ + int16_t * LARc) ; /* 0..7 LARc's OUT */ + +void Gsm_Preprocess ( + struct gsm_state * S, + int16_t * s, int16_t * so) ; + +void Gsm_Encoding ( + struct gsm_state * S, + int16_t * e, + int16_t * ep, + int16_t * xmaxc, + int16_t * Mc, + int16_t * xMc) ; + +void Gsm_Short_Term_Analysis_Filter ( + struct gsm_state * S, + int16_t * LARc, /* coded log area ratio [0..7] IN */ + int16_t * d) ; /* st res. signal [0..159] IN/OUT */ + +void Gsm_Decoder ( + struct gsm_state * S, + int16_t * LARcr, /* [0..7] IN */ + int16_t * Ncr, /* [0..3] IN */ + int16_t * bcr, /* [0..3] IN */ + int16_t * Mcr, /* [0..3] IN */ + int16_t * xmaxcr, /* [0..3] IN */ + int16_t * xMcr, /* [0..13*4] IN */ + int16_t * s) ; /* [0..159] OUT */ + +void Gsm_Decoding ( + struct gsm_state * S, + int16_t xmaxcr, + int16_t Mcr, + int16_t * xMcr, /* [0..12] IN */ + int16_t * erp) ; /* [0..39] OUT */ + +void Gsm_Long_Term_Synthesis_Filtering ( + struct gsm_state* S, + int16_t Ncr, + int16_t bcr, + int16_t * erp, /* [0..39] IN */ + int16_t * drp) ; /* [-120..-1] IN, [0..40] OUT */ + +void Gsm_RPE_Decoding ( + /*-struct gsm_state *S,-*/ + int16_t xmaxcr, + int16_t Mcr, + int16_t * xMcr, /* [0..12], 3 bits IN */ + int16_t * erp) ; /* [0..39] OUT */ + +void Gsm_RPE_Encoding ( + /*-struct gsm_state * S,-*/ + int16_t * e, /* -5..-1][0..39][40..44 IN/OUT */ + int16_t * xmaxc, /* OUT */ + int16_t * Mc, /* OUT */ + int16_t * xMc) ; /* [0..12] OUT */ + +void Gsm_Short_Term_Synthesis_Filter ( + struct gsm_state * S, + int16_t * LARcr, /* log area ratios [0..7] IN */ + int16_t * drp, /* received d [0...39] IN */ + int16_t * s) ; /* signal s [0..159] OUT */ + +void Gsm_Update_of_reconstructed_short_time_residual_signal ( + int16_t * dpp, /* [0...39] IN */ + int16_t * ep, /* [0...39] IN */ + int16_t * dp) ; /* [-120...-1] IN/OUT */ + +/* + * Tables from table.c + */ +#ifndef GSM_TABLE_C + +extern int16_t gsm_A [8], gsm_B [8], gsm_MIC [8], gsm_MAC [8] ; +extern int16_t gsm_INVA [8] ; +extern int16_t gsm_DLB [4], gsm_QLB [4] ; +extern int16_t gsm_H [11] ; +extern int16_t gsm_NRFAC [8] ; +extern int16_t gsm_FAC [8] ; + +#endif /* GSM_TABLE_C */ + + +#if __GNUC__ +#define ALWAYS_INLINE __attribute__ ((always_inline)) +#else +#define ALWAYS_INLINE +#endif + + +static inline int32_t ALWAYS_INLINE +arith_shift_left (int32_t x, int shift) +{ return (int32_t) (((uint32_t) x) << shift) ; +} /* arith_shift_left */ + +static inline int32_t ALWAYS_INLINE +arith_shift_right (int32_t x, int shift) +{ if (x >= 0) + return x << shift ; + return ~ ((~x) << shift) ; +} /* arith_shift_right */ + + +/* + * Debugging + */ +#ifdef NDEBUG + +# define gsm_debug_int16_ts(a, b, c, d) /* nil */ +# define gsm_debug_int32_ts(a, b, c, d) /* nil */ +# define gsm_debug_int16_t(a, b) /* nil */ +# define gsm_debug_int32_t(a, b) /* nil */ + +#else /* !NDEBUG => DEBUG */ + + void gsm_debug_int16_ts (char * name, int, int, int16_t *) ; + void gsm_debug_int32_ts (char * name, int, int, int32_t *) ; + void gsm_debug_int32_t (char * name, int32_t) ; + void gsm_debug_int16_t (char * name, int16_t) ; + +#endif /* !NDEBUG */ + +#endif /* PRIVATE_H */ + diff --git a/libsndfile-1.0.31/src/GSM610/gsm_create.c b/libsndfile-1.0.31/src/GSM610/gsm_create.c new file mode 100644 index 0000000..05425dd --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/gsm_create.c @@ -0,0 +1,37 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +#include "config.h" + +#include +#include +#include + + + +#include "gsm.h" +#include "gsm610_priv.h" + +gsm gsm_create (void) +{ + gsm r ; + + r = malloc (sizeof (struct gsm_state)) ; + if (!r) return r ; + + memset ((char *) r, 0, sizeof (struct gsm_state)) ; + r->nrp = 40 ; + + return r ; +} + +/* Added for libsndfile : May 6, 2002. Not sure if it works. */ +void gsm_init (gsm state) +{ + memset (state, 0, sizeof (struct gsm_state)) ; + state->nrp = 40 ; +} + diff --git a/libsndfile-1.0.31/src/GSM610/gsm_decode.c b/libsndfile-1.0.31/src/GSM610/gsm_decode.c new file mode 100644 index 0000000..04411be --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/gsm_decode.c @@ -0,0 +1,357 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +#include "gsm610_priv.h" + +#include "gsm.h" + +int gsm_decode (gsm s, gsm_byte * c, gsm_signal * target) +{ + int16_t LARc [8], Nc [4], Mc [4], bc [4], xmaxc [4], xmc [13 * 4] ; + +#ifdef WAV49 + if (s->wav_fmt) + { uint16_t sr = 0 ; + + s->frame_index = !s->frame_index ; + if (s->frame_index) + { sr = *c++ ; + LARc [0] = sr & 0x3f ; sr >>= 6 ; + sr |= (uint16_t) *c++ << 2 ; + LARc [1] = sr & 0x3f ; sr >>= 6 ; + sr |= (uint16_t) *c++ << 4 ; + LARc [2] = sr & 0x1f ; sr >>= 5 ; + LARc [3] = sr & 0x1f ; sr >>= 5 ; + sr |= (uint16_t) *c++ << 2 ; + LARc [4] = sr & 0xf ; sr >>= 4 ; + LARc [5] = sr & 0xf ; sr >>= 4 ; + sr |= (uint16_t) *c++ << 2 ; /* 5 */ + LARc [6] = sr & 0x7 ; sr >>= 3 ; + LARc [7] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 4 ; + Nc [0] = sr & 0x7f ; sr >>= 7 ; + bc [0] = sr & 0x3 ; sr >>= 2 ; + Mc [0] = sr & 0x3 ; sr >>= 2 ; + sr |= (uint16_t) *c++ << 1 ; + xmaxc [0] = sr & 0x3f ; sr >>= 6 ; + xmc [0] = sr & 0x7 ; sr >>= 3 ; + sr = *c++ ; + xmc [1] = sr & 0x7 ; sr >>= 3 ; + xmc [2] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 2 ; + xmc [3] = sr & 0x7 ; sr >>= 3 ; + xmc [4] = sr & 0x7 ; sr >>= 3 ; + xmc [5] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 1 ; /* 10 */ + xmc [6] = sr & 0x7 ; sr >>= 3 ; + xmc [7] = sr & 0x7 ; sr >>= 3 ; + xmc [8] = sr & 0x7 ; sr >>= 3 ; + sr = *c++ ; + xmc [9] = sr & 0x7 ; sr >>= 3 ; + xmc [10] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 2 ; + xmc [11] = sr & 0x7 ; sr >>= 3 ; + xmc [12] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 4 ; + Nc [1] = sr & 0x7f ; sr >>= 7 ; + bc [1] = sr & 0x3 ; sr >>= 2 ; + Mc [1] = sr & 0x3 ; sr >>= 2 ; + sr |= (uint16_t) *c++ << 1 ; + xmaxc [1] = sr & 0x3f ; sr >>= 6 ; + xmc [13] = sr & 0x7 ; sr >>= 3 ; + sr = *c++ ; /* 15 */ + xmc [14] = sr & 0x7 ; sr >>= 3 ; + xmc [15] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 2 ; + xmc [16] = sr & 0x7 ; sr >>= 3 ; + xmc [17] = sr & 0x7 ; sr >>= 3 ; + xmc [18] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 1 ; + xmc [19] = sr & 0x7 ; sr >>= 3 ; + xmc [20] = sr & 0x7 ; sr >>= 3 ; + xmc [21] = sr & 0x7 ; sr >>= 3 ; + sr = *c++ ; + xmc [22] = sr & 0x7 ; sr >>= 3 ; + xmc [23] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 2 ; + xmc [24] = sr & 0x7 ; sr >>= 3 ; + xmc [25] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 4 ; /* 20 */ + Nc [2] = sr & 0x7f ; sr >>= 7 ; + bc [2] = sr & 0x3 ; sr >>= 2 ; + Mc [2] = sr & 0x3 ; sr >>= 2 ; + sr |= (uint16_t) *c++ << 1 ; + xmaxc [2] = sr & 0x3f ; sr >>= 6 ; + xmc [26] = sr & 0x7 ; sr >>= 3 ; + sr = *c++ ; + xmc [27] = sr & 0x7 ; sr >>= 3 ; + xmc [28] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 2 ; + xmc [29] = sr & 0x7 ; sr >>= 3 ; + xmc [30] = sr & 0x7 ; sr >>= 3 ; + xmc [31] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 1 ; + xmc [32] = sr & 0x7 ; sr >>= 3 ; + xmc [33] = sr & 0x7 ; sr >>= 3 ; + xmc [34] = sr & 0x7 ; sr >>= 3 ; + sr = *c++ ; /* 25 */ + xmc [35] = sr & 0x7 ; sr >>= 3 ; + xmc [36] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 2 ; + xmc [37] = sr & 0x7 ; sr >>= 3 ; + xmc [38] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 4 ; + Nc [3] = sr & 0x7f ; sr >>= 7 ; + bc [3] = sr & 0x3 ; sr >>= 2 ; + Mc [3] = sr & 0x3 ; sr >>= 2 ; + sr |= (uint16_t) *c++ << 1 ; + xmaxc [3] = sr & 0x3f ; sr >>= 6 ; + xmc [39] = sr & 0x7 ; sr >>= 3 ; + sr = *c++ ; + xmc [40] = sr & 0x7 ; sr >>= 3 ; + xmc [41] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 2 ; /* 30 */ + xmc [42] = sr & 0x7 ; sr >>= 3 ; + xmc [43] = sr & 0x7 ; sr >>= 3 ; + xmc [44] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 1 ; + xmc [45] = sr & 0x7 ; sr >>= 3 ; + xmc [46] = sr & 0x7 ; sr >>= 3 ; + xmc [47] = sr & 0x7 ; sr >>= 3 ; + sr = *c++ ; + xmc [48] = sr & 0x7 ; sr >>= 3 ; + xmc [49] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 2 ; + xmc [50] = sr & 0x7 ; sr >>= 3 ; + xmc [51] = sr & 0x7 ; sr >>= 3 ; + + s->frame_chain = sr & 0xf ; + } + else { + sr = s->frame_chain ; + sr |= (uint16_t) *c++ << 4 ; /* 1 */ + LARc [0] = sr & 0x3f ; sr >>= 6 ; + LARc [1] = sr & 0x3f ; sr >>= 6 ; + sr = *c++ ; + LARc [2] = sr & 0x1f ; sr >>= 5 ; + sr |= (uint16_t) *c++ << 3 ; + LARc [3] = sr & 0x1f ; sr >>= 5 ; + LARc [4] = sr & 0xf ; sr >>= 4 ; + sr |= (uint16_t) *c++ << 2 ; + LARc [5] = sr & 0xf ; sr >>= 4 ; + LARc [6] = sr & 0x7 ; sr >>= 3 ; + LARc [7] = sr & 0x7 ; sr >>= 3 ; + sr = *c++ ; /* 5 */ + Nc [0] = sr & 0x7f ; sr >>= 7 ; + sr |= (uint16_t) *c++ << 1 ; + bc [0] = sr & 0x3 ; sr >>= 2 ; + Mc [0] = sr & 0x3 ; sr >>= 2 ; + sr |= (uint16_t) *c++ << 5 ; + xmaxc [0] = sr & 0x3f ; sr >>= 6 ; + xmc [0] = sr & 0x7 ; sr >>= 3 ; + xmc [1] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 1 ; + xmc [2] = sr & 0x7 ; sr >>= 3 ; + xmc [3] = sr & 0x7 ; sr >>= 3 ; + xmc [4] = sr & 0x7 ; sr >>= 3 ; + sr = *c++ ; + xmc [5] = sr & 0x7 ; sr >>= 3 ; + xmc [6] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 2 ; /* 10 */ + xmc [7] = sr & 0x7 ; sr >>= 3 ; + xmc [8] = sr & 0x7 ; sr >>= 3 ; + xmc [9] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 1 ; + xmc [10] = sr & 0x7 ; sr >>= 3 ; + xmc [11] = sr & 0x7 ; sr >>= 3 ; + xmc [12] = sr & 0x7 ; sr >>= 3 ; + sr = *c++ ; + Nc [1] = sr & 0x7f ; sr >>= 7 ; + sr |= (uint16_t) *c++ << 1 ; + bc [1] = sr & 0x3 ; sr >>= 2 ; + Mc [1] = sr & 0x3 ; sr >>= 2 ; + sr |= (uint16_t) *c++ << 5 ; + xmaxc [1] = sr & 0x3f ; sr >>= 6 ; + xmc [13] = sr & 0x7 ; sr >>= 3 ; + xmc [14] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 1 ; /* 15 */ + xmc [15] = sr & 0x7 ; sr >>= 3 ; + xmc [16] = sr & 0x7 ; sr >>= 3 ; + xmc [17] = sr & 0x7 ; sr >>= 3 ; + sr = *c++ ; + xmc [18] = sr & 0x7 ; sr >>= 3 ; + xmc [19] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 2 ; + xmc [20] = sr & 0x7 ; sr >>= 3 ; + xmc [21] = sr & 0x7 ; sr >>= 3 ; + xmc [22] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 1 ; + xmc [23] = sr & 0x7 ; sr >>= 3 ; + xmc [24] = sr & 0x7 ; sr >>= 3 ; + xmc [25] = sr & 0x7 ; sr >>= 3 ; + sr = *c++ ; + Nc [2] = sr & 0x7f ; sr >>= 7 ; + sr |= (uint16_t) *c++ << 1 ; /* 20 */ + bc [2] = sr & 0x3 ; sr >>= 2 ; + Mc [2] = sr & 0x3 ; sr >>= 2 ; + sr |= (uint16_t) *c++ << 5 ; + xmaxc [2] = sr & 0x3f ; sr >>= 6 ; + xmc [26] = sr & 0x7 ; sr >>= 3 ; + xmc [27] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 1 ; + xmc [28] = sr & 0x7 ; sr >>= 3 ; + xmc [29] = sr & 0x7 ; sr >>= 3 ; + xmc [30] = sr & 0x7 ; sr >>= 3 ; + sr = *c++ ; + xmc [31] = sr & 0x7 ; sr >>= 3 ; + xmc [32] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 2 ; + xmc [33] = sr & 0x7 ; sr >>= 3 ; + xmc [34] = sr & 0x7 ; sr >>= 3 ; + xmc [35] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 1 ; /* 25 */ + xmc [36] = sr & 0x7 ; sr >>= 3 ; + xmc [37] = sr & 0x7 ; sr >>= 3 ; + xmc [38] = sr & 0x7 ; sr >>= 3 ; + sr = *c++ ; + Nc [3] = sr & 0x7f ; sr >>= 7 ; + sr |= (uint16_t) *c++ << 1 ; + bc [3] = sr & 0x3 ; sr >>= 2 ; + Mc [3] = sr & 0x3 ; sr >>= 2 ; + sr |= (uint16_t) *c++ << 5 ; + xmaxc [3] = sr & 0x3f ; sr >>= 6 ; + xmc [39] = sr & 0x7 ; sr >>= 3 ; + xmc [40] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 1 ; + xmc [41] = sr & 0x7 ; sr >>= 3 ; + xmc [42] = sr & 0x7 ; sr >>= 3 ; + xmc [43] = sr & 0x7 ; sr >>= 3 ; + sr = *c++ ; /* 30 */ + xmc [44] = sr & 0x7 ; sr >>= 3 ; + xmc [45] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 2 ; + xmc [46] = sr & 0x7 ; sr >>= 3 ; + xmc [47] = sr & 0x7 ; sr >>= 3 ; + xmc [48] = sr & 0x7 ; sr >>= 3 ; + sr |= (uint16_t) *c++ << 1 ; + xmc [49] = sr & 0x7 ; sr >>= 3 ; + xmc [50] = sr & 0x7 ; sr >>= 3 ; + xmc [51] = sr & 0x7 ; sr >>= 3 ; + } + } + else +#endif + { + /* GSM_MAGIC = (*c >> 4) & 0xF ; */ + + if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1 ; + + LARc [0] = (*c++ & 0xF) << 2 ; /* 1 */ + LARc [0] |= (*c >> 6) & 0x3 ; + LARc [1] = *c++ & 0x3F ; + LARc [2] = (*c >> 3) & 0x1F ; + LARc [3] = (*c++ & 0x7) << 2 ; + LARc [3] |= (*c >> 6) & 0x3 ; + LARc [4] = (*c >> 2) & 0xF ; + LARc [5] = (*c++ & 0x3) << 2 ; + LARc [5] |= (*c >> 6) & 0x3 ; + LARc [6] = (*c >> 3) & 0x7 ; + LARc [7] = *c++ & 0x7 ; + Nc [0] = (*c >> 1) & 0x7F ; + bc [0] = (*c++ & 0x1) << 1 ; + bc [0] |= (*c >> 7) & 0x1 ; + Mc [0] = (*c >> 5) & 0x3 ; + xmaxc [0] = (*c++ & 0x1F) << 1 ; + xmaxc [0] |= (*c >> 7) & 0x1 ; + xmc [0] = (*c >> 4) & 0x7 ; + xmc [1] = (*c >> 1) & 0x7 ; + xmc [2] = (*c++ & 0x1) << 2 ; + xmc [2] |= (*c >> 6) & 0x3 ; + xmc [3] = (*c >> 3) & 0x7 ; + xmc [4] = *c++ & 0x7 ; + xmc [5] = (*c >> 5) & 0x7 ; + xmc [6] = (*c >> 2) & 0x7 ; + xmc [7] = (*c++ & 0x3) << 1 ; /* 10 */ + xmc [7] |= (*c >> 7) & 0x1 ; + xmc [8] = (*c >> 4) & 0x7 ; + xmc [9] = (*c >> 1) & 0x7 ; + xmc [10] = (*c++ & 0x1) << 2 ; + xmc [10] |= (*c >> 6) & 0x3 ; + xmc [11] = (*c >> 3) & 0x7 ; + xmc [12] = *c++ & 0x7 ; + Nc [1] = (*c >> 1) & 0x7F ; + bc [1] = (*c++ & 0x1) << 1 ; + bc [1] |= (*c >> 7) & 0x1 ; + Mc [1] = (*c >> 5) & 0x3 ; + xmaxc [1] = (*c++ & 0x1F) << 1 ; + xmaxc [1] |= (*c >> 7) & 0x1 ; + xmc [13] = (*c >> 4) & 0x7 ; + xmc [14] = (*c >> 1) & 0x7 ; + xmc [15] = (*c++ & 0x1) << 2 ; + xmc [15] |= (*c >> 6) & 0x3 ; + xmc [16] = (*c >> 3) & 0x7 ; + xmc [17] = *c++ & 0x7 ; + xmc [18] = (*c >> 5) & 0x7 ; + xmc [19] = (*c >> 2) & 0x7 ; + xmc [20] = (*c++ & 0x3) << 1 ; + xmc [20] |= (*c >> 7) & 0x1 ; + xmc [21] = (*c >> 4) & 0x7 ; + xmc [22] = (*c >> 1) & 0x7 ; + xmc [23] = (*c++ & 0x1) << 2 ; + xmc [23] |= (*c >> 6) & 0x3 ; + xmc [24] = (*c >> 3) & 0x7 ; + xmc [25] = *c++ & 0x7 ; + Nc [2] = (*c >> 1) & 0x7F ; + bc [2] = (*c++ & 0x1) << 1 ; /* 20 */ + bc [2] |= (*c >> 7) & 0x1 ; + Mc [2] = (*c >> 5) & 0x3 ; + xmaxc [2] = (*c++ & 0x1F) << 1 ; + xmaxc [2] |= (*c >> 7) & 0x1 ; + xmc [26] = (*c >> 4) & 0x7 ; + xmc [27] = (*c >> 1) & 0x7 ; + xmc [28] = (*c++ & 0x1) << 2 ; + xmc [28] |= (*c >> 6) & 0x3 ; + xmc [29] = (*c >> 3) & 0x7 ; + xmc [30] = *c++ & 0x7 ; + xmc [31] = (*c >> 5) & 0x7 ; + xmc [32] = (*c >> 2) & 0x7 ; + xmc [33] = (*c++ & 0x3) << 1 ; + xmc [33] |= (*c >> 7) & 0x1 ; + xmc [34] = (*c >> 4) & 0x7 ; + xmc [35] = (*c >> 1) & 0x7 ; + xmc [36] = (*c++ & 0x1) << 2 ; + xmc [36] |= (*c >> 6) & 0x3 ; + xmc [37] = (*c >> 3) & 0x7 ; + xmc [38] = *c++ & 0x7 ; + Nc [3] = (*c >> 1) & 0x7F ; + bc [3] = (*c++ & 0x1) << 1 ; + bc [3] |= (*c >> 7) & 0x1 ; + Mc [3] = (*c >> 5) & 0x3 ; + xmaxc [3] = (*c++ & 0x1F) << 1 ; + xmaxc [3] |= (*c >> 7) & 0x1 ; + xmc [39] = (*c >> 4) & 0x7 ; + xmc [40] = (*c >> 1) & 0x7 ; + xmc [41] = (*c++ & 0x1) << 2 ; + xmc [41] |= (*c >> 6) & 0x3 ; + xmc [42] = (*c >> 3) & 0x7 ; + xmc [43] = *c++ & 0x7 ; /* 30 */ + xmc [44] = (*c >> 5) & 0x7 ; + xmc [45] = (*c >> 2) & 0x7 ; + xmc [46] = (*c++ & 0x3) << 1 ; + xmc [46] |= (*c >> 7) & 0x1 ; + xmc [47] = (*c >> 4) & 0x7 ; + xmc [48] = (*c >> 1) & 0x7 ; + xmc [49] = (*c++ & 0x1) << 2 ; + xmc [49] |= (*c >> 6) & 0x3 ; + xmc [50] = (*c >> 3) & 0x7 ; + xmc [51] = *c & 0x7 ; /* 33 */ + } + + Gsm_Decoder (s, LARc, Nc, bc, Mc, xmaxc, xmc, target) ; + + return 0 ; +} + diff --git a/libsndfile-1.0.31/src/GSM610/gsm_destroy.c b/libsndfile-1.0.31/src/GSM610/gsm_destroy.c new file mode 100644 index 0000000..03bf7c3 --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/gsm_destroy.c @@ -0,0 +1,25 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +#include "gsm.h" +#include "config.h" + +#ifdef HAS_STDLIB_H +# include +#else +# ifdef HAS_MALLOC_H +# include +# else + extern void free () ; +# endif +#endif + +void gsm_destroy (gsm S) +{ + if (S) + free ((char *) S) ; +} + diff --git a/libsndfile-1.0.31/src/GSM610/gsm_encode.c b/libsndfile-1.0.31/src/GSM610/gsm_encode.c new file mode 100644 index 0000000..5fd5351 --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/gsm_encode.c @@ -0,0 +1,448 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +#include "gsm610_priv.h" +#include "gsm.h" + +void gsm_encode (gsm s, gsm_signal * source, gsm_byte * c) +{ + int16_t LARc [8], Nc [4], Mc [4], bc [4], xmaxc [4], xmc [13 * 4] ; + + Gsm_Coder (s, source, LARc, Nc, bc, Mc, xmaxc, xmc) ; + + + /* variable size + + GSM_MAGIC 4 + + LARc [0] 6 + LARc [1] 6 + LARc [2] 5 + LARc [3] 5 + LARc [4] 4 + LARc [5] 4 + LARc [6] 3 + LARc [7] 3 + + Nc [0] 7 + bc [0] 2 + Mc [0] 2 + xmaxc [0] 6 + xmc [0] 3 + xmc [1] 3 + xmc [2] 3 + xmc [3] 3 + xmc [4] 3 + xmc [5] 3 + xmc [6] 3 + xmc [7] 3 + xmc [8] 3 + xmc [9] 3 + xmc [10] 3 + xmc [11] 3 + xmc [12] 3 + + Nc [1] 7 + bc [1] 2 + Mc [1] 2 + xmaxc [1] 6 + xmc [13] 3 + xmc [14] 3 + xmc [15] 3 + xmc [16] 3 + xmc [17] 3 + xmc [18] 3 + xmc [19] 3 + xmc [20] 3 + xmc [21] 3 + xmc [22] 3 + xmc [23] 3 + xmc [24] 3 + xmc [25] 3 + + Nc [2] 7 + bc [2] 2 + Mc [2] 2 + xmaxc [2] 6 + xmc [26] 3 + xmc [27] 3 + xmc [28] 3 + xmc [29] 3 + xmc [30] 3 + xmc [31] 3 + xmc [32] 3 + xmc [33] 3 + xmc [34] 3 + xmc [35] 3 + xmc [36] 3 + xmc [37] 3 + xmc [38] 3 + + Nc [3] 7 + bc [3] 2 + Mc [3] 2 + xmaxc [3] 6 + xmc [39] 3 + xmc [40] 3 + xmc [41] 3 + xmc [42] 3 + xmc [43] 3 + xmc [44] 3 + xmc [45] 3 + xmc [46] 3 + xmc [47] 3 + xmc [48] 3 + xmc [49] 3 + xmc [50] 3 + xmc [51] 3 + */ + +#ifdef WAV49 + + if (s->wav_fmt) + { s->frame_index = !s->frame_index ; + if (s->frame_index) + { uint16_t sr ; + + sr = 0 ; + sr = sr >> 6 | LARc [0] << 10 ; + sr = sr >> 6 | LARc [1] << 10 ; + *c++ = sr >> 4 ; + sr = sr >> 5 | LARc [2] << 11 ; + *c++ = sr >> 7 ; + sr = sr >> 5 | LARc [3] << 11 ; + sr = sr >> 4 | LARc [4] << 12 ; + *c++ = sr >> 6 ; + sr = sr >> 4 | LARc [5] << 12 ; + sr = sr >> 3 | LARc [6] << 13 ; + *c++ = sr >> 7 ; + sr = sr >> 3 | LARc [7] << 13 ; + sr = sr >> 7 | Nc [0] << 9 ; + *c++ = sr >> 5 ; + sr = sr >> 2 | bc [0] << 14 ; + sr = sr >> 2 | Mc [0] << 14 ; + sr = sr >> 6 | xmaxc [0] << 10 ; + *c++ = sr >> 3 ; + sr = sr >> 3 | xmc [0] << 13 ; + *c++ = sr >> 8 ; + sr = sr >> 3 | xmc [1] << 13 ; + sr = sr >> 3 | xmc [2] << 13 ; + sr = sr >> 3 | xmc [3] << 13 ; + *c++ = sr >> 7 ; + sr = sr >> 3 | xmc [4] << 13 ; + sr = sr >> 3 | xmc [5] << 13 ; + sr = sr >> 3 | xmc [6] << 13 ; + *c++ = sr >> 6 ; + sr = sr >> 3 | xmc [7] << 13 ; + sr = sr >> 3 | xmc [8] << 13 ; + *c++ = sr >> 8 ; + sr = sr >> 3 | xmc [9] << 13 ; + sr = sr >> 3 | xmc [10] << 13 ; + sr = sr >> 3 | xmc [11] << 13 ; + *c++ = sr >> 7 ; + sr = sr >> 3 | xmc [12] << 13 ; + sr = sr >> 7 | Nc [1] << 9 ; + *c++ = sr >> 5 ; + sr = sr >> 2 | bc [1] << 14 ; + sr = sr >> 2 | Mc [1] << 14 ; + sr = sr >> 6 | xmaxc [1] << 10 ; + *c++ = sr >> 3 ; + sr = sr >> 3 | xmc [13] << 13 ; + *c++ = sr >> 8 ; + sr = sr >> 3 | xmc [14] << 13 ; + sr = sr >> 3 | xmc [15] << 13 ; + sr = sr >> 3 | xmc [16] << 13 ; + *c++ = sr >> 7 ; + sr = sr >> 3 | xmc [17] << 13 ; + sr = sr >> 3 | xmc [18] << 13 ; + sr = sr >> 3 | xmc [19] << 13 ; + *c++ = sr >> 6 ; + sr = sr >> 3 | xmc [20] << 13 ; + sr = sr >> 3 | xmc [21] << 13 ; + *c++ = sr >> 8 ; + sr = sr >> 3 | xmc [22] << 13 ; + sr = sr >> 3 | xmc [23] << 13 ; + sr = sr >> 3 | xmc [24] << 13 ; + *c++ = sr >> 7 ; + sr = sr >> 3 | xmc [25] << 13 ; + sr = sr >> 7 | Nc [2] << 9 ; + *c++ = sr >> 5 ; + sr = sr >> 2 | bc [2] << 14 ; + sr = sr >> 2 | Mc [2] << 14 ; + sr = sr >> 6 | xmaxc [2] << 10 ; + *c++ = sr >> 3 ; + sr = sr >> 3 | xmc [26] << 13 ; + *c++ = sr >> 8 ; + sr = sr >> 3 | xmc [27] << 13 ; + sr = sr >> 3 | xmc [28] << 13 ; + sr = sr >> 3 | xmc [29] << 13 ; + *c++ = sr >> 7 ; + sr = sr >> 3 | xmc [30] << 13 ; + sr = sr >> 3 | xmc [31] << 13 ; + sr = sr >> 3 | xmc [32] << 13 ; + *c++ = sr >> 6 ; + sr = sr >> 3 | xmc [33] << 13 ; + sr = sr >> 3 | xmc [34] << 13 ; + *c++ = sr >> 8 ; + sr = sr >> 3 | xmc [35] << 13 ; + sr = sr >> 3 | xmc [36] << 13 ; + sr = sr >> 3 | xmc [37] << 13 ; + *c++ = sr >> 7 ; + sr = sr >> 3 | xmc [38] << 13 ; + sr = sr >> 7 | Nc [3] << 9 ; + *c++ = sr >> 5 ; + sr = sr >> 2 | bc [3] << 14 ; + sr = sr >> 2 | Mc [3] << 14 ; + sr = sr >> 6 | xmaxc [3] << 10 ; + *c++ = sr >> 3 ; + sr = sr >> 3 | xmc [39] << 13 ; + *c++ = sr >> 8 ; + sr = sr >> 3 | xmc [40] << 13 ; + sr = sr >> 3 | xmc [41] << 13 ; + sr = sr >> 3 | xmc [42] << 13 ; + *c++ = sr >> 7 ; + sr = sr >> 3 | xmc [43] << 13 ; + sr = sr >> 3 | xmc [44] << 13 ; + sr = sr >> 3 | xmc [45] << 13 ; + *c++ = sr >> 6 ; + sr = sr >> 3 | xmc [46] << 13 ; + sr = sr >> 3 | xmc [47] << 13 ; + *c++ = sr >> 8 ; + sr = sr >> 3 | xmc [48] << 13 ; + sr = sr >> 3 | xmc [49] << 13 ; + sr = sr >> 3 | xmc [50] << 13 ; + *c++ = sr >> 7 ; + sr = sr >> 3 | xmc [51] << 13 ; + sr = sr >> 4 ; + *c = sr >> 8 ; + s->frame_chain = *c ; + } + else { + uint16_t sr ; + + sr = 0 ; + sr = sr >> 4 | s->frame_chain << 12 ; + sr = sr >> 6 | LARc [0] << 10 ; + *c++ = sr >> 6 ; + sr = sr >> 6 | LARc [1] << 10 ; + *c++ = sr >> 8 ; + sr = sr >> 5 | LARc [2] << 11 ; + sr = sr >> 5 | LARc [3] << 11 ; + *c++ = sr >> 6 ; + sr = sr >> 4 | LARc [4] << 12 ; + sr = sr >> 4 | LARc [5] << 12 ; + *c++ = sr >> 6 ; + sr = sr >> 3 | LARc [6] << 13 ; + sr = sr >> 3 | LARc [7] << 13 ; + *c++ = sr >> 8 ; + sr = sr >> 7 | Nc [0] << 9 ; + sr = sr >> 2 | bc [0] << 14 ; + *c++ = sr >> 7 ; + sr = sr >> 2 | Mc [0] << 14 ; + sr = sr >> 6 | xmaxc [0] << 10 ; + *c++ = sr >> 7 ; + sr = sr >> 3 | xmc [0] << 13 ; + sr = sr >> 3 | xmc [1] << 13 ; + sr = sr >> 3 | xmc [2] << 13 ; + *c++ = sr >> 6 ; + sr = sr >> 3 | xmc [3] << 13 ; + sr = sr >> 3 | xmc [4] << 13 ; + *c++ = sr >> 8 ; + sr = sr >> 3 | xmc [5] << 13 ; + sr = sr >> 3 | xmc [6] << 13 ; + sr = sr >> 3 | xmc [7] << 13 ; + *c++ = sr >> 7 ; + sr = sr >> 3 | xmc [8] << 13 ; + sr = sr >> 3 | xmc [9] << 13 ; + sr = sr >> 3 | xmc [10] << 13 ; + *c++ = sr >> 6 ; + sr = sr >> 3 | xmc [11] << 13 ; + sr = sr >> 3 | xmc [12] << 13 ; + *c++ = sr >> 8 ; + sr = sr >> 7 | Nc [1] << 9 ; + sr = sr >> 2 | bc [1] << 14 ; + *c++ = sr >> 7 ; + sr = sr >> 2 | Mc [1] << 14 ; + sr = sr >> 6 | xmaxc [1] << 10 ; + *c++ = sr >> 7 ; + sr = sr >> 3 | xmc [13] << 13 ; + sr = sr >> 3 | xmc [14] << 13 ; + sr = sr >> 3 | xmc [15] << 13 ; + *c++ = sr >> 6 ; + sr = sr >> 3 | xmc [16] << 13 ; + sr = sr >> 3 | xmc [17] << 13 ; + *c++ = sr >> 8 ; + sr = sr >> 3 | xmc [18] << 13 ; + sr = sr >> 3 | xmc [19] << 13 ; + sr = sr >> 3 | xmc [20] << 13 ; + *c++ = sr >> 7 ; + sr = sr >> 3 | xmc [21] << 13 ; + sr = sr >> 3 | xmc [22] << 13 ; + sr = sr >> 3 | xmc [23] << 13 ; + *c++ = sr >> 6 ; + sr = sr >> 3 | xmc [24] << 13 ; + sr = sr >> 3 | xmc [25] << 13 ; + *c++ = sr >> 8 ; + sr = sr >> 7 | Nc [2] << 9 ; + sr = sr >> 2 | bc [2] << 14 ; + *c++ = sr >> 7 ; + sr = sr >> 2 | Mc [2] << 14 ; + sr = sr >> 6 | xmaxc [2] << 10 ; + *c++ = sr >> 7 ; + sr = sr >> 3 | xmc [26] << 13 ; + sr = sr >> 3 | xmc [27] << 13 ; + sr = sr >> 3 | xmc [28] << 13 ; + *c++ = sr >> 6 ; + sr = sr >> 3 | xmc [29] << 13 ; + sr = sr >> 3 | xmc [30] << 13 ; + *c++ = sr >> 8 ; + sr = sr >> 3 | xmc [31] << 13 ; + sr = sr >> 3 | xmc [32] << 13 ; + sr = sr >> 3 | xmc [33] << 13 ; + *c++ = sr >> 7 ; + sr = sr >> 3 | xmc [34] << 13 ; + sr = sr >> 3 | xmc [35] << 13 ; + sr = sr >> 3 | xmc [36] << 13 ; + *c++ = sr >> 6 ; + sr = sr >> 3 | xmc [37] << 13 ; + sr = sr >> 3 | xmc [38] << 13 ; + *c++ = sr >> 8 ; + sr = sr >> 7 | Nc [3] << 9 ; + sr = sr >> 2 | bc [3] << 14 ; + *c++ = sr >> 7 ; + sr = sr >> 2 | Mc [3] << 14 ; + sr = sr >> 6 | xmaxc [3] << 10 ; + *c++ = sr >> 7 ; + sr = sr >> 3 | xmc [39] << 13 ; + sr = sr >> 3 | xmc [40] << 13 ; + sr = sr >> 3 | xmc [41] << 13 ; + *c++ = sr >> 6 ; + sr = sr >> 3 | xmc [42] << 13 ; + sr = sr >> 3 | xmc [43] << 13 ; + *c++ = sr >> 8 ; + sr = sr >> 3 | xmc [44] << 13 ; + sr = sr >> 3 | xmc [45] << 13 ; + sr = sr >> 3 | xmc [46] << 13 ; + *c++ = sr >> 7 ; + sr = sr >> 3 | xmc [47] << 13 ; + sr = sr >> 3 | xmc [48] << 13 ; + sr = sr >> 3 | xmc [49] << 13 ; + *c++ = sr >> 6 ; + sr = sr >> 3 | xmc [50] << 13 ; + sr = sr >> 3 | xmc [51] << 13 ; + *c++ = sr >> 8 ; + } + } + + else + +#endif /* WAV49 */ + { + + *c++ = ((GSM_MAGIC & 0xF) << 4) /* 1 */ + | ((LARc [0] >> 2) & 0xF) ; + *c++ = ((LARc [0] & 0x3) << 6) + | (LARc [1] & 0x3F) ; + *c++ = ((LARc [2] & 0x1F) << 3) + | ((LARc [3] >> 2) & 0x7) ; + *c++ = ((LARc [3] & 0x3) << 6) + | ((LARc [4] & 0xF) << 2) + | ((LARc [5] >> 2) & 0x3) ; + *c++ = ((LARc [5] & 0x3) << 6) + | ((LARc [6] & 0x7) << 3) + | (LARc [7] & 0x7) ; + *c++ = ((Nc [0] & 0x7F) << 1) + | ((bc [0] >> 1) & 0x1) ; + *c++ = ((bc [0] & 0x1) << 7) + | ((Mc [0] & 0x3) << 5) + | ((xmaxc [0] >> 1) & 0x1F) ; + *c++ = ((xmaxc [0] & 0x1) << 7) + | ((xmc [0] & 0x7) << 4) + | ((xmc [1] & 0x7) << 1) + | ((xmc [2] >> 2) & 0x1) ; + *c++ = ((xmc [2] & 0x3) << 6) + | ((xmc [3] & 0x7) << 3) + | (xmc [4] & 0x7) ; + *c++ = ((xmc [5] & 0x7) << 5) /* 10 */ + | ((xmc [6] & 0x7) << 2) + | ((xmc [7] >> 1) & 0x3) ; + *c++ = ((xmc [7] & 0x1) << 7) + | ((xmc [8] & 0x7) << 4) + | ((xmc [9] & 0x7) << 1) + | ((xmc [10] >> 2) & 0x1) ; + *c++ = ((xmc [10] & 0x3) << 6) + | ((xmc [11] & 0x7) << 3) + | (xmc [12] & 0x7) ; + *c++ = ((Nc [1] & 0x7F) << 1) + | ((bc [1] >> 1) & 0x1) ; + *c++ = ((bc [1] & 0x1) << 7) + | ((Mc [1] & 0x3) << 5) + | ((xmaxc [1] >> 1) & 0x1F) ; + *c++ = ((xmaxc [1] & 0x1) << 7) + | ((xmc [13] & 0x7) << 4) + | ((xmc [14] & 0x7) << 1) + | ((xmc [15] >> 2) & 0x1) ; + *c++ = ((xmc [15] & 0x3) << 6) + | ((xmc [16] & 0x7) << 3) + | (xmc [17] & 0x7) ; + *c++ = ((xmc [18] & 0x7) << 5) + | ((xmc [19] & 0x7) << 2) + | ((xmc [20] >> 1) & 0x3) ; + *c++ = ((xmc [20] & 0x1) << 7) + | ((xmc [21] & 0x7) << 4) + | ((xmc [22] & 0x7) << 1) + | ((xmc [23] >> 2) & 0x1) ; + *c++ = ((xmc [23] & 0x3) << 6) + | ((xmc [24] & 0x7) << 3) + | (xmc [25] & 0x7) ; + *c++ = ((Nc [2] & 0x7F) << 1) /* 20 */ + | ((bc [2] >> 1) & 0x1) ; + *c++ = ((bc [2] & 0x1) << 7) + | ((Mc [2] & 0x3) << 5) + | ((xmaxc [2] >> 1) & 0x1F) ; + *c++ = ((xmaxc [2] & 0x1) << 7) + | ((xmc [26] & 0x7) << 4) + | ((xmc [27] & 0x7) << 1) + | ((xmc [28] >> 2) & 0x1) ; + *c++ = ((xmc [28] & 0x3) << 6) + | ((xmc [29] & 0x7) << 3) + | (xmc [30] & 0x7) ; + *c++ = ((xmc [31] & 0x7) << 5) + | ((xmc [32] & 0x7) << 2) + | ((xmc [33] >> 1) & 0x3) ; + *c++ = ((xmc [33] & 0x1) << 7) + | ((xmc [34] & 0x7) << 4) + | ((xmc [35] & 0x7) << 1) + | ((xmc [36] >> 2) & 0x1) ; + *c++ = ((xmc [36] & 0x3) << 6) + | ((xmc [37] & 0x7) << 3) + | (xmc [38] & 0x7) ; + *c++ = ((Nc [3] & 0x7F) << 1) + | ((bc [3] >> 1) & 0x1) ; + *c++ = ((bc [3] & 0x1) << 7) + | ((Mc [3] & 0x3) << 5) + | ((xmaxc [3] >> 1) & 0x1F) ; + *c++ = ((xmaxc [3] & 0x1) << 7) + | ((xmc [39] & 0x7) << 4) + | ((xmc [40] & 0x7) << 1) + | ((xmc [41] >> 2) & 0x1) ; + *c++ = ((xmc [41] & 0x3) << 6) /* 30 */ + | ((xmc [42] & 0x7) << 3) + | (xmc [43] & 0x7) ; + *c++ = ((xmc [44] & 0x7) << 5) + | ((xmc [45] & 0x7) << 2) + | ((xmc [46] >> 1) & 0x3) ; + *c++ = ((xmc [46] & 0x1) << 7) + | ((xmc [47] & 0x7) << 4) + | ((xmc [48] & 0x7) << 1) + | ((xmc [49] >> 2) & 0x1) ; + *c++ = ((xmc [49] & 0x3) << 6) + | ((xmc [50] & 0x7) << 3) + | (xmc [51] & 0x7) ; + + } +} + diff --git a/libsndfile-1.0.31/src/GSM610/gsm_option.c b/libsndfile-1.0.31/src/GSM610/gsm_option.c new file mode 100644 index 0000000..2087683 --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/gsm_option.c @@ -0,0 +1,66 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +#include "gsm610_priv.h" + +#include "gsm.h" + +int gsm_option (gsm r, int opt, int * val) +{ + int result = -1 ; + + switch (opt) { + case GSM_OPT_LTP_CUT: +#ifdef LTP_CUT + result = r->ltp_cut ; + if (val) r->ltp_cut = *val ; +#endif + break ; + + case GSM_OPT_VERBOSE: +#ifndef NDEBUG + result = r->verbose ; + if (val) r->verbose = *val ; +#endif + break ; + + case GSM_OPT_FAST: + +#if defined (FAST) && defined (USE_FLOAT_MUL) + result = r->fast ; + if (val) r->fast = !!*val ; +#endif + break ; + + case GSM_OPT_FRAME_CHAIN: + +#ifdef WAV49 + result = r->frame_chain ; + if (val) r->frame_chain = *val ; +#endif + break ; + + case GSM_OPT_FRAME_INDEX: + +#ifdef WAV49 + result = r->frame_index ; + if (val) r->frame_index = *val ; +#endif + break ; + + case GSM_OPT_WAV49: + +#ifdef WAV49 + result = r->wav_fmt ; + if (val) r->wav_fmt = !!*val ; +#endif + break ; + + default: + break ; + } + return result ; +} diff --git a/libsndfile-1.0.31/src/GSM610/long_term.c b/libsndfile-1.0.31/src/GSM610/long_term.c new file mode 100644 index 0000000..3276a46 --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/long_term.c @@ -0,0 +1,932 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +#include +#include + +#include "gsm610_priv.h" + +/* + * 4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION + */ + + +/* + * This module computes the LTP gain (bc) and the LTP lag (Nc) + * for the long term analysis filter. This is done by calculating a + * maximum of the cross-correlation function between the current + * sub-segment short term residual signal d [0..39] (output of + * the short term analysis filter ; for simplification the index + * of this array begins at 0 and ends at 39 for each sub-segment of the + * RPE-LTP analysis) and the previous reconstructed short term + * residual signal dp [-120 .. -1]. A dynamic scaling must be + * performed to avoid overflow. + */ + + /* The next procedure exists in six versions. First two integer + * version (if USE_FLOAT_MUL is not defined) ; then four floating + * point versions, twice with proper scaling (USE_FLOAT_MUL defined), + * once without (USE_FLOAT_MUL and FAST defined, and fast run-time + * option used). Every pair has first a Cut version (see the -C + * option to toast or the LTP_CUT option to gsm_option ()), then the + * uncut one. (For a detailed explanation of why this is altogether + * a bad idea, see Henry Spencer and Geoff Collyer, ``#ifdef Considered + * Harmful''.) + */ + +#ifndef USE_FLOAT_MUL + +#ifdef LTP_CUT + +static void Cut_Calculation_of_the_LTP_parameters ( + + struct gsm_state * st, + + register int16_t * d, /* [0..39] IN */ + register int16_t * dp, /* [-120..-1] IN */ + int16_t * bc_out, /* OUT */ + int16_t * Nc_out /* OUT */) +{ + register int k, lambda ; + int16_t Nc, bc ; + int16_t wt [40] ; + + int32_t L_result ; + int32_t L_max, L_power ; + int16_t R, S, dmax, scal, best_k ; + int16_t ltp_cut ; + + register int16_t temp, wt_k ; + + /* Search of the optimum scaling of d [0..39]. */ + dmax = 0 ; + for (k = 0 ; k <= 39 ; k++) + { temp = d [k] ; + temp = GSM_ABS (temp) ; + if (temp > dmax) + { dmax = temp ; + best_k = k ; + } + } + temp = 0 ; + if (dmax == 0) + scal = 0 ; + else + { assert (dmax > 0) ; + temp = gsm_norm ((int32_t) dmax << 16) ; + } + if (temp > 6) scal = 0 ; + else scal = 6 - temp ; + assert (scal >= 0) ; + + /* Search for the maximum cross-correlation and coding of the LTP lag + */ + L_max = 0 ; + Nc = 40 ; /* index for the maximum cross-correlation */ + wt_k = SASR_W (d [best_k], scal) ; + + for (lambda = 40 ; lambda <= 120 ; lambda++) + { L_result = (int32_t) wt_k * dp [best_k - lambda] ; + if (L_result > L_max) + { Nc = lambda ; + L_max = L_result ; + } + } + *Nc_out = Nc ; + L_max <<= 1 ; + + /* Rescaling of L_max + */ + assert (scal <= 100 && scal >= -100) ; + L_max = L_max >> (6 - scal) ; /* sub (6, scal) */ + + assert (Nc <= 120 && Nc >= 40) ; + + /* Compute the power of the reconstructed short term residual + * signal dp [..] + */ + L_power = 0 ; + for (k = 0 ; k <= 39 ; k++) + { register int32_t L_temp ; + + L_temp = SASR_W (dp [k - Nc], 3) ; + L_power += L_temp * L_temp ; + } + L_power <<= 1 ; /* from L_MULT */ + + /* Normalization of L_max and L_power */ + + if (L_max <= 0) + { *bc_out = 0 ; + return ; + } + if (L_max >= L_power) + { *bc_out = 3 ; + return ; + } + + temp = gsm_norm (L_power) ; + + R = SASR (L_max << temp, 16) ; + S = SASR (L_power << temp, 16) ; + + /* Coding of the LTP gain + */ + + /* Table 4.3a must be used to obtain the level DLB [i] for the + * quantization of the LTP gain b to get the coded version bc. + */ + for (bc = 0 ; bc <= 2 ; bc++) if (R <= gsm_mult (S, gsm_DLB [bc])) break ; + *bc_out = bc ; +} + +#endif /* LTP_CUT */ + +static void Calculation_of_the_LTP_parameters ( + register int16_t * d, /* [0..39] IN */ + register int16_t * dp, /* [-120..-1] IN */ + int16_t * bc_out, /* OUT */ + int16_t * Nc_out /* OUT */) +{ + register int k, lambda ; + int16_t Nc, bc ; + int16_t wt [40] ; + + int32_t L_max, L_power ; + int16_t R, S, dmax, scal ; + register int16_t temp ; + + /* Search of the optimum scaling of d [0..39]. + */ + dmax = 0 ; + + for (k = 0 ; k <= 39 ; k++) + { temp = d [k] ; + temp = GSM_ABS (temp) ; + if (temp > dmax) dmax = temp ; + } + + temp = 0 ; + if (dmax == 0) + scal = 0 ; + else + { assert (dmax > 0) ; + temp = gsm_norm ((int32_t) dmax << 16) ; + } + + if (temp > 6) scal = 0 ; + else scal = 6 - temp ; + + assert (scal >= 0) ; + + /* Initialization of a working array wt + */ + + for (k = 0 ; k <= 39 ; k++) wt [k] = SASR_W (d [k], scal) ; + + /* Search for the maximum cross-correlation and coding of the LTP lag */ + L_max = 0 ; + Nc = 40 ; /* index for the maximum cross-correlation */ + + for (lambda = 40 ; lambda <= 120 ; lambda++) + { + +# undef STEP +# define STEP(k) (int32_t) wt [k] * dp [k - lambda] + + register int32_t L_result ; + + L_result = STEP (0) ; L_result += STEP (1) ; + L_result += STEP (2) ; L_result += STEP (3) ; + L_result += STEP (4) ; L_result += STEP (5) ; + L_result += STEP (6) ; L_result += STEP (7) ; + L_result += STEP (8) ; L_result += STEP (9) ; + L_result += STEP (10) ; L_result += STEP (11) ; + L_result += STEP (12) ; L_result += STEP (13) ; + L_result += STEP (14) ; L_result += STEP (15) ; + L_result += STEP (16) ; L_result += STEP (17) ; + L_result += STEP (18) ; L_result += STEP (19) ; + L_result += STEP (20) ; L_result += STEP (21) ; + L_result += STEP (22) ; L_result += STEP (23) ; + L_result += STEP (24) ; L_result += STEP (25) ; + L_result += STEP (26) ; L_result += STEP (27) ; + L_result += STEP (28) ; L_result += STEP (29) ; + L_result += STEP (30) ; L_result += STEP (31) ; + L_result += STEP (32) ; L_result += STEP (33) ; + L_result += STEP (34) ; L_result += STEP (35) ; + L_result += STEP (36) ; L_result += STEP (37) ; + L_result += STEP (38) ; L_result += STEP (39) ; + + if (L_result > L_max) + { Nc = lambda ; + L_max = L_result ; + } + } + + *Nc_out = Nc ; + + L_max <<= 1 ; + + /* Rescaling of L_max + */ + assert (scal <= 100 && scal >= -100) ; + L_max = L_max >> (6 - scal) ; /* sub (6, scal) */ + + assert (Nc <= 120 && Nc >= 40) ; + + /* Compute the power of the reconstructed short term residual + * signal dp [..] + */ + L_power = 0 ; + for (k = 0 ; k <= 39 ; k++) + { register int32_t L_temp ; + + L_temp = SASR_W (dp [k - Nc], 3) ; + L_power += L_temp * L_temp ; + } + L_power <<= 1 ; /* from L_MULT */ + + /* Normalization of L_max and L_power + */ + + if (L_max <= 0) + { *bc_out = 0 ; + return ; + } + if (L_max >= L_power) + { *bc_out = 3 ; + return ; + } + + temp = gsm_norm (L_power) ; + + R = SASR_L (L_max << temp, 16) ; + S = SASR_L (L_power << temp, 16) ; + + /* Coding of the LTP gain + */ + + /* Table 4.3a must be used to obtain the level DLB [i] for the + * quantization of the LTP gain b to get the coded version bc. + */ + for (bc = 0 ; bc <= 2 ; bc++) if (R <= gsm_mult (S, gsm_DLB [bc])) break ; + *bc_out = bc ; +} + +#else /* USE_FLOAT_MUL */ + +#ifdef LTP_CUT + +static void Cut_Calculation_of_the_LTP_parameters ( + struct gsm_state * st, /* IN */ + register int16_t * d, /* [0..39] IN */ + register int16_t * dp, /* [-120..-1] IN */ + int16_t * bc_out, /* OUT */ + int16_t * Nc_out /* OUT */) +{ + register int k, lambda ; + int16_t Nc, bc ; + int16_t ltp_cut ; + + float wt_float [40] ; + float dp_float_base [120], * dp_float = dp_float_base + 120 ; + + int32_t L_max, L_power ; + int16_t R, S, dmax, scal ; + register int16_t temp ; + + /* Search of the optimum scaling of d [0..39]. + */ + dmax = 0 ; + + for (k = 0 ; k <= 39 ; k++) + { temp = d [k] ; + temp = GSM_ABS (temp) ; + if (temp > dmax) dmax = temp ; + } + + temp = 0 ; + if (dmax == 0) scal = 0 ; + else + { assert (dmax > 0) ; + temp = gsm_norm ((int32_t) dmax << 16) ; + } + + if (temp > 6) scal = 0 ; + else scal = 6 - temp ; + + assert (scal >= 0) ; + ltp_cut = (int32_t) SASR_W (dmax, scal) * st->ltp_cut / 100 ; + + /* Initialization of a working array wt */ + + for (k = 0 ; k < 40 ; k++) + { register int16_t w = SASR_W (d [k], scal) ; + if (w < 0 ? w > -ltp_cut : w < ltp_cut) + wt_float [k] = 0.0 ; + else + wt_float [k] = w ; + } + for (k = -120 ; k < 0 ; k++) dp_float [k] = dp [k] ; + + /* Search for the maximum cross-correlation and coding of the LTP lag + */ + L_max = 0 ; + Nc = 40 ; /* index for the maximum cross-correlation */ + + for (lambda = 40 ; lambda <= 120 ; lambda += 9) + { /* Calculate L_result for l = lambda .. lambda + 9. */ + register float *lp = dp_float - lambda ; + + register float W ; + register float a = lp [-8], b = lp [-7], c = lp [-6], + d = lp [-5], e = lp [-4], f = lp [-3], + g = lp [-2], h = lp [-1] ; + register float E ; + register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, + S5 = 0, S6 = 0, S7 = 0, S8 = 0 ; + +# undef STEP +# define STEP(K, a, b, c, d, e, f, g, h) \ + if ((W = wt_float [K]) != 0.0) { \ + E = W * a ; S8 += E ; \ + E = W * b ; S7 += E ; \ + E = W * c ; S6 += E ; \ + E = W * d ; S5 += E ; \ + E = W * e ; S4 += E ; \ + E = W * f ; S3 += E ; \ + E = W * g ; S2 += E ; \ + E = W * h ; S1 += E ; \ + a = lp [K] ; \ + E = W * a ; S0 += E ; } else (a = lp [K]) + +# define STEP_A(K) STEP (K, a, b, c, d, e, f, g, h) +# define STEP_B(K) STEP (K, b, c, d, e, f, g, h, a) +# define STEP_C(K) STEP (K, c, d, e, f, g, h, a, b) +# define STEP_D(K) STEP (K, d, e, f, g, h, a, b, c) +# define STEP_E(K) STEP (K, e, f, g, h, a, b, c, d) +# define STEP_F(K) STEP (K, f, g, h, a, b, c, d, e) +# define STEP_G(K) STEP (K, g, h, a, b, c, d, e, f) +# define STEP_H(K) STEP (K, h, a, b, c, d, e, f, g) + + STEP_A (0) ; STEP_B (1) ; STEP_C (2) ; STEP_D (3) ; + STEP_E (4) ; STEP_F (5) ; STEP_G (6) ; STEP_H (7) ; + + STEP_A (8) ; STEP_B (9) ; STEP_C (10) ; STEP_D (11) ; + STEP_E (12) ; STEP_F (13) ; STEP_G (14) ; STEP_H (15) ; + + STEP_A (16) ; STEP_B (17) ; STEP_C (18) ; STEP_D (19) ; + STEP_E (20) ; STEP_F (21) ; STEP_G (22) ; STEP_H (23) ; + + STEP_A (24) ; STEP_B (25) ; STEP_C (26) ; STEP_D (27) ; + STEP_E (28) ; STEP_F (29) ; STEP_G (30) ; STEP_H (31) ; + + STEP_A (32) ; STEP_B (33) ; STEP_C (34) ; STEP_D (35) ; + STEP_E (36) ; STEP_F (37) ; STEP_G (38) ; STEP_H (39) ; + +# undef STEP_A +# undef STEP_B +# undef STEP_C +# undef STEP_D +# undef STEP_E +# undef STEP_F +# undef STEP_G +# undef STEP_H + + if (S0 > L_max) { L_max = S0 ; Nc = lambda ; } + if (S1 > L_max) { L_max = S1 ; Nc = lambda + 1 ; } + if (S2 > L_max) { L_max = S2 ; Nc = lambda + 2 ; } + if (S3 > L_max) { L_max = S3 ; Nc = lambda + 3 ; } + if (S4 > L_max) { L_max = S4 ; Nc = lambda + 4 ; } + if (S5 > L_max) { L_max = S5 ; Nc = lambda + 5 ; } + if (S6 > L_max) { L_max = S6 ; Nc = lambda + 6 ; } + if (S7 > L_max) { L_max = S7 ; Nc = lambda + 7 ; } + if (S8 > L_max) { L_max = S8 ; Nc = lambda + 8 ; } + + } + *Nc_out = Nc ; + + L_max <<= 1 ; + + /* Rescaling of L_max + */ + assert (scal <= 100 && scal >= -100) ; + L_max = L_max >> (6 - scal) ; /* sub (6, scal) */ + + assert (Nc <= 120 && Nc >= 40) ; + + /* Compute the power of the reconstructed short term residual + * signal dp [..] + */ + L_power = 0 ; + for (k = 0 ; k <= 39 ; k++) + { register int32_t L_temp ; + + L_temp = SASR_W (dp [k - Nc], 3) ; + L_power += L_temp * L_temp ; + } + L_power <<= 1 ; /* from L_MULT */ + + /* Normalization of L_max and L_power + */ + + if (L_max <= 0) + { *bc_out = 0 ; + return ; + } + if (L_max >= L_power) + { *bc_out = 3 ; + return ; + } + + temp = gsm_norm (L_power) ; + + R = SASR (L_max << temp, 16) ; + S = SASR (L_power << temp, 16) ; + + /* Coding of the LTP gain + */ + + /* Table 4.3a must be used to obtain the level DLB [i] for the + * quantization of the LTP gain b to get the coded version bc. + */ + for (bc = 0 ; bc <= 2 ; bc++) if (R <= gsm_mult (S, gsm_DLB [bc])) break ; + *bc_out = bc ; +} + +#endif /* LTP_CUT */ + +static void Calculation_of_the_LTP_parameters ( + register int16_t * din, /* [0..39] IN */ + register int16_t * dp, /* [-120..-1] IN */ + int16_t * bc_out, /* OUT */ + int16_t * Nc_out /* OUT */) +{ + register int k, lambda ; + int16_t Nc, bc ; + + float wt_float [40] ; + float dp_float_base [120], * dp_float = dp_float_base + 120 ; + + int32_t L_max, L_power ; + int16_t R, S, dmax, scal ; + register int16_t temp ; + + /* Search of the optimum scaling of d [0..39]. + */ + dmax = 0 ; + + for (k = 0 ; k <= 39 ; k++) + { temp = din [k] ; + temp = GSM_ABS (temp) ; + if (temp > dmax) dmax = temp ; + } + + temp = 0 ; + if (dmax == 0) scal = 0 ; + else + { assert (dmax > 0) ; + temp = gsm_norm ((int32_t) dmax << 16) ; + } + + if (temp > 6) scal = 0 ; + else scal = 6 - temp ; + + assert (scal >= 0) ; + + /* Initialization of a working array wt */ + + for (k = 0 ; k < 40 ; k++) wt_float [k] = SASR_W (din [k], scal) ; + for (k = -120 ; k < 0 ; k++) dp_float [k] = dp [k] ; + + /* Search for the maximum cross-correlation and coding of the LTP lag + */ + L_max = 0 ; + Nc = 40 ; /* index for the maximum cross-correlation */ + + for (lambda = 40 ; lambda <= 120 ; lambda += 9) + { /* Calculate L_result for l = lambda .. lambda + 9. */ + register float *lp = dp_float - lambda ; + + register float W ; + register float a = lp [-8], b = lp [-7], c = lp [-6], + d = lp [-5], e = lp [-4], f = lp [-3], + g = lp [-2], h = lp [-1] ; + register float E ; + register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, + S5 = 0, S6 = 0, S7 = 0, S8 = 0 ; + +# undef STEP +# define STEP(K, a, b, c, d, e, f, g, h) \ + W = wt_float [K] ; \ + E = W * a ; S8 += E ; \ + E = W * b ; S7 += E ; \ + E = W * c ; S6 += E ; \ + E = W * d ; S5 += E ; \ + E = W * e ; S4 += E ; \ + E = W * f ; S3 += E ; \ + E = W * g ; S2 += E ; \ + E = W * h ; S1 += E ; \ + a = lp [K] ; \ + E = W * a ; S0 += E + +# define STEP_A(K) STEP (K, a, b, c, d, e, f, g, h) +# define STEP_B(K) STEP (K, b, c, d, e, f, g, h, a) +# define STEP_C(K) STEP (K, c, d, e, f, g, h, a, b) +# define STEP_D(K) STEP (K, d, e, f, g, h, a, b, c) +# define STEP_E(K) STEP (K, e, f, g, h, a, b, c, d) +# define STEP_F(K) STEP (K, f, g, h, a, b, c, d, e) +# define STEP_G(K) STEP (K, g, h, a, b, c, d, e, f) +# define STEP_H(K) STEP (K, h, a, b, c, d, e, f, g) + + STEP_A (0) ; STEP_B (1) ; STEP_C (2) ; STEP_D (3) ; + STEP_E (4) ; STEP_F (5) ; STEP_G (6) ; STEP_H (7) ; + + STEP_A (8) ; STEP_B (9) ; STEP_C (10) ; STEP_D (11) ; + STEP_E (12) ; STEP_F (13) ; STEP_G (14) ; STEP_H (15) ; + + STEP_A (16) ; STEP_B (17) ; STEP_C (18) ; STEP_D (19) ; + STEP_E (20) ; STEP_F (21) ; STEP_G (22) ; STEP_H (23) ; + + STEP_A (24) ; STEP_B (25) ; STEP_C (26) ; STEP_D (27) ; + STEP_E (28) ; STEP_F (29) ; STEP_G (30) ; STEP_H (31) ; + + STEP_A (32) ; STEP_B (33) ; STEP_C (34) ; STEP_D (35) ; + STEP_E (36) ; STEP_F (37) ; STEP_G (38) ; STEP_H (39) ; + +# undef STEP_A +# undef STEP_B +# undef STEP_C +# undef STEP_D +# undef STEP_E +# undef STEP_F +# undef STEP_G +# undef STEP_H + + if (S0 > L_max) { L_max = S0 ; Nc = lambda ; } + if (S1 > L_max) { L_max = S1 ; Nc = lambda + 1 ; } + if (S2 > L_max) { L_max = S2 ; Nc = lambda + 2 ; } + if (S3 > L_max) { L_max = S3 ; Nc = lambda + 3 ; } + if (S4 > L_max) { L_max = S4 ; Nc = lambda + 4 ; } + if (S5 > L_max) { L_max = S5 ; Nc = lambda + 5 ; } + if (S6 > L_max) { L_max = S6 ; Nc = lambda + 6 ; } + if (S7 > L_max) { L_max = S7 ; Nc = lambda + 7 ; } + if (S8 > L_max) { L_max = S8 ; Nc = lambda + 8 ; } + } + *Nc_out = Nc ; + + L_max <<= 1 ; + + /* Rescaling of L_max + */ + assert (scal <= 100 && scal >= -100) ; + L_max = L_max >> (6 - scal) ; /* sub (6, scal) */ + + assert (Nc <= 120 && Nc >= 40) ; + + /* Compute the power of the reconstructed short term residual + * signal dp [..] + */ + L_power = 0 ; + for (k = 0 ; k <= 39 ; k++) + { register int32_t L_temp ; + + L_temp = SASR_W (dp [k - Nc], 3) ; + L_power += L_temp * L_temp ; + } + L_power <<= 1 ; /* from L_MULT */ + + /* Normalization of L_max and L_power + */ + + if (L_max <= 0) + { *bc_out = 0 ; + return ; + } + if (L_max >= L_power) + { *bc_out = 3 ; + return ; + } + + temp = gsm_norm (L_power) ; + + R = SASR_L (L_max << temp, 16) ; + S = SASR_L (L_power << temp, 16) ; + + /* Coding of the LTP gain + */ + + /* Table 4.3a must be used to obtain the level DLB [i] for the + * quantization of the LTP gain b to get the coded version bc. + */ + for (bc = 0 ; bc <= 2 ; bc++) if (R <= gsm_mult (S, gsm_DLB [bc])) break ; + *bc_out = bc ; +} + +#ifdef FAST +#ifdef LTP_CUT + +static void Cut_Fast_Calculation_of_the_LTP_parameters ( + struct gsm_state * st, /* IN */ + register int16_t * d, /* [0..39] IN */ + register int16_t * dp, /* [-120..-1] IN */ + int16_t * bc_out, /* OUT */ + int16_t * Nc_out /* OUT */) +{ + register int k, lambda ; + register float wt_float ; + int16_t Nc, bc ; + int16_t wt_max, best_k, ltp_cut ; + + float dp_float_base [120], * dp_float = dp_float_base + 120 ; + + register float L_result, L_max, L_power ; + + wt_max = 0 ; + + for (k = 0 ; k < 40 ; ++k) + { if (d [k] > wt_max) wt_max = d [best_k = k] ; + else if (-d [k] > wt_max) wt_max = -d [best_k = k] ; + } + + assert (wt_max >= 0) ; + wt_float = (float) wt_max ; + + for (k = -120 ; k < 0 ; ++k) dp_float [k] = (float) dp [k] ; + + /* Search for the maximum cross-correlation and coding of the LTP lag */ + L_max = 0 ; + Nc = 40 ; /* index for the maximum cross-correlation */ + + for (lambda = 40 ; lambda <= 120 ; lambda++) + { L_result = wt_float * dp_float [best_k - lambda] ; + if (L_result > L_max) + { Nc = lambda ; + L_max = L_result ; + } + } + + *Nc_out = Nc ; + if (L_max <= 0.) + { *bc_out = 0 ; + return ; + } + + /* Compute the power of the reconstructed short term residual + * signal dp [..] + */ + dp_float -= Nc ; + L_power = 0 ; + for (k = 0 ; k < 40 ; ++k) + { register float f = dp_float [k] ; + L_power += f * f ; + } + + if (L_max >= L_power) + { *bc_out = 3 ; + return ; + } + + /* Coding of the LTP gain + * Table 4.3a must be used to obtain the level DLB [i] for the + * quantization of the LTP gain b to get the coded version bc. + */ + lambda = L_max / L_power * 32768.0 ; + for (bc = 0 ; bc <= 2 ; ++bc) if (lambda <= gsm_DLB [bc]) break ; + *bc_out = bc ; +} + +#endif /* LTP_CUT */ + +static void Fast_Calculation_of_the_LTP_parameters ( + register int16_t * din, /* [0..39] IN */ + register int16_t * dp, /* [-120..-1] IN */ + int16_t * bc_out, /* OUT */ + int16_t * Nc_out /* OUT */) +{ + register int k, lambda ; + int16_t Nc, bc ; + + float wt_float [40] ; + float dp_float_base [120], * dp_float = dp_float_base + 120 ; + + register float L_max, L_power ; + + for (k = 0 ; k < 40 ; ++k) wt_float [k] = (float) din [k] ; + for (k = -120 ; k < 0 ; ++k) dp_float [k] = (float) dp [k] ; + + /* Search for the maximum cross-correlation and coding of the LTP lag */ + L_max = 0 ; + Nc = 40 ; /* index for the maximum cross-correlation */ + + for (lambda = 40 ; lambda <= 120 ; lambda += 9) + { /* Calculate L_result for l = lambda .. lambda + 9. */ + register float *lp = dp_float - lambda ; + + register float W ; + register float a = lp [-8], b = lp [-7], c = lp [-6], + d = lp [-5], e = lp [-4], f = lp [-3], + g = lp [-2], h = lp [-1] ; + register float E ; + register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, + S5 = 0, S6 = 0, S7 = 0, S8 = 0 ; + +# undef STEP +# define STEP(K, a, b, c, d, e, f, g, h) \ + W = wt_float [K] ; \ + E = W * a ; S8 += E ; \ + E = W * b ; S7 += E ; \ + E = W * c ; S6 += E ; \ + E = W * d ; S5 += E ; \ + E = W * e ; S4 += E ; \ + E = W * f ; S3 += E ; \ + E = W * g ; S2 += E ; \ + E = W * h ; S1 += E ; \ + a = lp [K] ; \ + E = W * a ; S0 += E + +# define STEP_A(K) STEP (K, a, b, c, d, e, f, g, h) +# define STEP_B(K) STEP (K, b, c, d, e, f, g, h, a) +# define STEP_C(K) STEP (K, c, d, e, f, g, h, a, b) +# define STEP_D(K) STEP (K, d, e, f, g, h, a, b, c) +# define STEP_E(K) STEP (K, e, f, g, h, a, b, c, d) +# define STEP_F(K) STEP (K, f, g, h, a, b, c, d, e) +# define STEP_G(K) STEP (K, g, h, a, b, c, d, e, f) +# define STEP_H(K) STEP (K, h, a, b, c, d, e, f, g) + + STEP_A (0) ; STEP_B (1) ; STEP_C (2) ; STEP_D (3) ; + STEP_E (4) ; STEP_F (5) ; STEP_G (6) ; STEP_H (7) ; + + STEP_A (8) ; STEP_B (9) ; STEP_C (10) ; STEP_D (11) ; + STEP_E (12) ; STEP_F (13) ; STEP_G (14) ; STEP_H (15) ; + + STEP_A (16) ; STEP_B (17) ; STEP_C (18) ; STEP_D (19) ; + STEP_E (20) ; STEP_F (21) ; STEP_G (22) ; STEP_H (23) ; + + STEP_A (24) ; STEP_B (25) ; STEP_C (26) ; STEP_D (27) ; + STEP_E (28) ; STEP_F (29) ; STEP_G (30) ; STEP_H (31) ; + + STEP_A (32) ; STEP_B (33) ; STEP_C (34) ; STEP_D (35) ; + STEP_E (36) ; STEP_F (37) ; STEP_G (38) ; STEP_H (39) ; + + if (S0 > L_max) { L_max = S0 ; Nc = lambda ; } + if (S1 > L_max) { L_max = S1 ; Nc = lambda + 1 ; } + if (S2 > L_max) { L_max = S2 ; Nc = lambda + 2 ; } + if (S3 > L_max) { L_max = S3 ; Nc = lambda + 3 ; } + if (S4 > L_max) { L_max = S4 ; Nc = lambda + 4 ; } + if (S5 > L_max) { L_max = S5 ; Nc = lambda + 5 ; } + if (S6 > L_max) { L_max = S6 ; Nc = lambda + 6 ; } + if (S7 > L_max) { L_max = S7 ; Nc = lambda + 7 ; } + if (S8 > L_max) { L_max = S8 ; Nc = lambda + 8 ; } + } + *Nc_out = Nc ; + + if (L_max <= 0.0) + { *bc_out = 0 ; + return ; + } + + /* Compute the power of the reconstructed short term residual + * signal dp [..] + */ + dp_float -= Nc ; + L_power = 0 ; + for (k = 0 ; k < 40 ; ++k) + { register float f = dp_float [k] ; + L_power += f * f ; + } + + if (L_max >= L_power) + { *bc_out = 3 ; + return ; + } + + /* Coding of the LTP gain + * Table 4.3a must be used to obtain the level DLB [i] for the + * quantization of the LTP gain b to get the coded version bc. + */ + lambda = L_max / L_power * 32768.0 ; + for (bc = 0 ; bc <= 2 ; ++bc) if (lambda <= gsm_DLB [bc]) break ; + *bc_out = bc ; +} + +#endif /* FAST */ +#endif /* USE_FLOAT_MUL */ + + +/* 4.2.12 */ + +static void Long_term_analysis_filtering ( + int16_t bc, /* IN */ + int16_t Nc, /* IN */ + register int16_t * dp, /* previous d [-120..-1] IN */ + register int16_t * d, /* d [0..39] IN */ + register int16_t * dpp, /* estimate [0..39] OUT */ + register int16_t * e /* long term res. signal [0..39] OUT */) +/* + * In this part, we have to decode the bc parameter to compute + * the samples of the estimate dpp [0..39]. The decoding of bc needs the + * use of table 4.3b. The long term residual signal e [0..39] + * is then calculated to be fed to the RPE encoding section. + */ +{ + register int k ; + +# undef STEP +# define STEP(BP) \ + for (k = 0 ; k <= 39 ; k++) \ + { dpp [k] = GSM_MULT_R (BP, dp [k - Nc]) ; \ + e [k] = GSM_SUB (d [k], dpp [k]) ; \ + } + + switch (bc) + { case 0: STEP (3277) ; break ; + case 1: STEP (11469) ; break ; + case 2: STEP (21299) ; break ; + case 3: STEP (32767) ; break ; + } +} + +void Gsm_Long_Term_Predictor ( /* 4x for 160 samples */ + + struct gsm_state * S, + + int16_t * d, /* [0..39] residual signal IN */ + int16_t * dp, /* [-120..-1] d' IN */ + + int16_t * e, /* [0..39] OUT */ + int16_t * dpp, /* [0..39] OUT */ + int16_t * Nc, /* correlation lag OUT */ + int16_t * bc /* gain factor OUT */) +{ + assert (d) ; assert (dp) ; assert (e) ; + assert (dpp) ; assert (Nc) ; assert (bc) ; + +#if defined (FAST) && defined (USE_FLOAT_MUL) + if (S->fast) +#if defined (LTP_CUT) + if (S->ltp_cut) + Cut_Fast_Calculation_of_the_LTP_parameters (S, + d, dp, bc, Nc) ; + else +#endif /* LTP_CUT */ + Fast_Calculation_of_the_LTP_parameters (d, dp, bc, Nc) ; + else +#endif /* FAST & USE_FLOAT_MUL */ +#ifdef LTP_CUT + if (S->ltp_cut) + Cut_Calculation_of_the_LTP_parameters (S, d, dp, bc, Nc) ; + else +#endif + Calculation_of_the_LTP_parameters (d, dp, bc, Nc) ; + + Long_term_analysis_filtering (*bc, *Nc, dp, d, dpp, e) ; +} + +/* 4.3.2 */ +void Gsm_Long_Term_Synthesis_Filtering ( + struct gsm_state * S, + + int16_t Ncr, + int16_t bcr, + register int16_t * erp, /* [0..39] IN */ + register int16_t * drp /* [-120..-1] IN, [-120..40] OUT */) +/* + * This procedure uses the bcr and Ncr parameter to realize the + * long term synthesis filtering. The decoding of bcr needs + * table 4.3b. + */ +{ + register int k ; + int16_t brp, drpp, Nr ; + + /* Check the limits of Nr. + */ + Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr ; + S->nrp = Nr ; + assert (Nr >= 40 && Nr <= 120) ; + + /* Decoding of the LTP gain bcr + */ + brp = gsm_QLB [bcr] ; + + /* Computation of the reconstructed short term residual + * signal drp [0..39] + */ + assert (brp != MIN_WORD) ; + + for (k = 0 ; k <= 39 ; k++) + { drpp = GSM_MULT_R (brp, drp [k - Nr]) ; + drp [k] = GSM_ADD (erp [k], drpp) ; + } + + /* + * Update of the reconstructed short term residual signal + * drp [-1..-120] + */ + + for (k = 0 ; k <= 119 ; k++) drp [-120 + k] = drp [-80 + k] ; +} diff --git a/libsndfile-1.0.31/src/GSM610/lpc.c b/libsndfile-1.0.31/src/GSM610/lpc.c new file mode 100644 index 0000000..922421e --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/lpc.c @@ -0,0 +1,333 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +#include +#include +#include + +#include "gsm610_priv.h" + +/* + * 4.2.4 .. 4.2.7 LPC ANALYSIS SECTION + */ + +/* 4.2.4 */ + + +static void Autocorrelation ( + int16_t * s, /* [0..159] IN/OUT */ + int32_t * L_ACF) /* [0..8] OUT */ +/* + * The goal is to compute the array L_ACF [k]. The signal s [i] must + * be scaled in order to avoid an overflow situation. + */ +{ + register int k, i ; + + int16_t temp, smax, scalauto ; + +#ifdef USE_FLOAT_MUL + float float_s [160] ; +#endif + + /* Dynamic scaling of the array s [0..159] */ + + /* Search for the maximum. */ + smax = 0 ; + for (k = 0 ; k <= 159 ; k++) + { temp = GSM_ABS (s [k]) ; + if (temp > smax) smax = temp ; + } + + /* Computation of the scaling factor. + */ + if (smax == 0) + scalauto = 0 ; + else + { assert (smax > 0) ; + scalauto = 4 - gsm_norm ((int32_t) smax << 16) ; /* sub (4,..) */ + } + + /* Scaling of the array s [0...159] + */ + + if (scalauto > 0) + { + +# ifdef USE_FLOAT_MUL +# define SCALE(n) \ + case n: for (k = 0 ; k <= 159 ; k++) \ + float_s [k] = (float) \ + (s [k] = GSM_MULT_R (s [k], 16384 >> (n-1))) ;\ + break ; +# else +# define SCALE(n) \ + case n: for (k = 0 ; k <= 159 ; k++) \ + s [k] = GSM_MULT_R (s [k], 16384 >> (n-1)) ;\ + break ; +# endif /* USE_FLOAT_MUL */ + + switch (scalauto) { + SCALE (1) + SCALE (2) + SCALE (3) + SCALE (4) + } +# undef SCALE + } +# ifdef USE_FLOAT_MUL + else for (k = 0 ; k <= 159 ; k++) float_s [k] = (float) s [k] ; +# endif + + /* Compute the L_ACF [..]. + */ + { +# ifdef USE_FLOAT_MUL + register float *sp = float_s ; + register float sl = *sp ; + +# define STEP(k) L_ACF [k] += (int32_t) (sl * sp [- (k)]) ; +# else + int16_t *sp = s ; + int16_t sl = *sp ; + +# define STEP(k) L_ACF [k] += ((int32_t) sl * sp [- (k)]) ; +# endif + +# define NEXTI sl = *++sp + + + for (k = 9 ; k-- ; L_ACF [k] = 0) ; + + STEP (0) ; + NEXTI ; + STEP (0) ; STEP (1) ; + NEXTI ; + STEP (0) ; STEP (1) ; STEP (2) ; + NEXTI ; + STEP (0) ; STEP (1) ; STEP (2) ; STEP (3) ; + NEXTI ; + STEP (0) ; STEP (1) ; STEP (2) ; STEP (3) ; STEP (4) ; + NEXTI ; + STEP (0) ; STEP (1) ; STEP (2) ; STEP (3) ; STEP (4) ; STEP (5) ; + NEXTI ; + STEP (0) ; STEP (1) ; STEP (2) ; STEP (3) ; STEP (4) ; STEP (5) ; STEP (6) ; + NEXTI ; + STEP (0) ; STEP (1) ; STEP (2) ; STEP (3) ; STEP (4) ; STEP (5) ; STEP (6) ; STEP (7) ; + + for (i = 8 ; i <= 159 ; i++) + { NEXTI ; + + STEP (0) ; + STEP (1) ; STEP (2) ; STEP (3) ; STEP (4) ; + STEP (5) ; STEP (6) ; STEP (7) ; STEP (8) ; + } + + for (k = 9 ; k-- ; ) + L_ACF [k] = SASL_L (L_ACF [k], 1) ; + + } + /* Rescaling of the array s [0..159] + */ + if (scalauto > 0) + { assert (scalauto <= 4) ; + for (k = 160 ; k-- ; s++) + *s = SASL_W (*s, scalauto) ; + } +} + +#if defined (USE_FLOAT_MUL) && defined (FAST) + +static void Fast_Autocorrelation ( + int16_t * s, /* [0..159] IN/OUT */ + int32_t * L_ACF) /* [0..8] OUT */ +{ + register int k, i ; + float f_L_ACF [9] ; + float scale ; + + float s_f [160] ; + register float *sf = s_f ; + + for (i = 0 ; i < 160 ; ++i) sf [i] = s [i] ; + for (k = 0 ; k <= 8 ; k++) + { register float L_temp2 = 0 ; + register float *sfl = sf - k ; + for (i = k ; i < 160 ; ++i) L_temp2 += sf [i] * sfl [i] ; + f_L_ACF [k] = L_temp2 ; + } + scale = 2147483648.0f / f_L_ACF [0] ; + + for (k = 0 ; k <= 8 ; k++) + L_ACF [k] = f_L_ACF [k] * scale ; +} +#endif /* defined (USE_FLOAT_MUL) && defined (FAST) */ + +/* 4.2.5 */ + +static void Reflection_coefficients ( + int32_t * L_ACF, /* 0...8 IN */ + register int16_t * r /* 0...7 OUT */ +) +{ + register int i, m, n ; + register int16_t temp ; + int16_t ACF [9] ; /* 0..8 */ + int16_t P [9] ; /* 0..8 */ + int16_t K [9] ; /* 2..8 */ + + /* Schur recursion with 16 bits arithmetic. + */ + + if (L_ACF [0] == 0) + { memset (r, 0, 8 * sizeof (r [0])) ; + return ; + } + + assert (L_ACF [0] != 0) ; + temp = gsm_norm (L_ACF [0]) ; + + assert (temp >= 0 && temp < 32) ; + + /* ? overflow ? */ + for (i = 0 ; i <= 8 ; i++) ACF [i] = SASR_L (SASL_L (L_ACF [i], temp), 16) ; + + /* Initialize array P [..] and K [..] for the recursion. + */ + + for (i = 1 ; i <= 7 ; i++) K [i] = ACF [i] ; + for (i = 0 ; i <= 8 ; i++) P [i] = ACF [i] ; + + /* Compute reflection coefficients + */ + for (n = 1 ; n <= 8 ; n++, r++) + { temp = P [1] ; + temp = GSM_ABS (temp) ; + if (P [0] < temp) + { for (i = n ; i <= 8 ; i++) *r++ = 0 ; + return ; + } + + *r = gsm_div (temp, P [0]) ; + + assert (*r >= 0) ; + if (P [1] > 0) *r = -*r ; /* r [n] = sub (0, r [n]) */ + assert (*r != MIN_WORD) ; + if (n == 8) return ; + + /* Schur recursion + */ + temp = GSM_MULT_R (P [1], *r) ; + P [0] = GSM_ADD (P [0], temp) ; + + for (m = 1 ; m <= 8 - n ; m++) + { temp = GSM_MULT_R (K [m], *r) ; + P [m] = GSM_ADD (P [m + 1], temp) ; + + temp = GSM_MULT_R (P [m + 1], *r) ; + K [m] = GSM_ADD (K [m], temp) ; + } + } +} + +/* 4.2.6 */ + +static void Transformation_to_Log_Area_Ratios ( + register int16_t * r /* 0..7 IN/OUT */ +) +/* + * The following scaling for r [..] and LAR [..] has been used: + * + * r [..] = integer (real_r [..]*32768.) ; -1 <= real_r < 1. + * LAR [..] = integer (real_LAR [..] * 16384) ; + * with -1.625 <= real_LAR <= 1.625 + */ +{ + register int16_t temp ; + register int i ; + + + /* Computation of the LAR [0..7] from the r [0..7] + */ + for (i = 1 ; i <= 8 ; i++, r++) + { temp = *r ; + temp = GSM_ABS (temp) ; + assert (temp >= 0) ; + + if (temp < 22118) + { temp >>= 1 ; + } + else if (temp < 31130) + { assert (temp >= 11059) ; + temp -= 11059 ; + } + else + { assert (temp >= 26112) ; + temp -= 26112 ; + temp <<= 2 ; + } + + *r = *r < 0 ? -temp : temp ; + assert (*r != MIN_WORD) ; + } +} + +/* 4.2.7 */ + +static void Quantization_and_coding ( + register int16_t * LAR /* [0..7] IN/OUT */ +) +{ + register int16_t temp ; + + /* This procedure needs four tables ; the following equations + * give the optimum scaling for the constants: + * + * A [0..7] = integer (real_A [0..7] * 1024) + * B [0..7] = integer (real_B [0..7] * 512) + * MAC [0..7] = maximum of the LARc [0..7] + * MIC [0..7] = minimum of the LARc [0..7] + */ + +# undef STEP +# define STEP(A, B, MAC, MIC) \ + temp = GSM_MULT (A, *LAR) ; \ + temp = GSM_ADD (temp, B) ; \ + temp = GSM_ADD (temp, 256) ; \ + temp = SASR_W (temp, 9) ; \ + *LAR = temp > MAC ? MAC - MIC : (temp < MIC ? 0 : temp - MIC) ; \ + LAR++ ; + + STEP (20480, 0, 31, -32) ; + STEP (20480, 0, 31, -32) ; + STEP (20480, 2048, 15, -16) ; + STEP (20480, -2560, 15, -16) ; + + STEP (13964, 94, 7, -8) ; + STEP (15360, -1792, 7, -8) ; + STEP (8534, -341, 3, -4) ; + STEP (9036, -1144, 3, -4) ; + +# undef STEP +} + +void Gsm_LPC_Analysis ( + struct gsm_state *S, + int16_t * s, /* 0..159 signals IN/OUT */ + int16_t *LARc) /* 0..7 LARc's OUT */ +{ + int32_t L_ACF [9] ; + +#if defined (USE_FLOAT_MUL) && defined (FAST) + if (S->fast) + Fast_Autocorrelation (s, L_ACF) ; + else +#endif + Autocorrelation (s, L_ACF ) ; + Reflection_coefficients (L_ACF, LARc ) ; + Transformation_to_Log_Area_Ratios (LARc) ; + Quantization_and_coding (LARc) ; +} diff --git a/libsndfile-1.0.31/src/GSM610/preprocess.c b/libsndfile-1.0.31/src/GSM610/preprocess.c new file mode 100644 index 0000000..82f4fe2 --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/preprocess.c @@ -0,0 +1,101 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +#include +#include + +#include "gsm610_priv.h" + +/* 4.2.0 .. 4.2.3 PREPROCESSING SECTION + * + * After A-law to linear conversion (or directly from the + * Ato D converter) the following scaling is assumed for + * input to the RPE-LTP algorithm: + * + * in: 0.1.....................12 + * S.v.v.v.v.v.v.v.v.v.v.v.v.*.*.* + * + * Where S is the sign bit, v a valid bit, and * a "don't care" bit. + * The original signal is called sop[..] + * + * out: 0.1................... 12 + * S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0 + */ + + +void Gsm_Preprocess ( + struct gsm_state * S, + int16_t * s, + int16_t * so) /* [0..159] IN/OUT */ +{ + + int16_t z1 = S->z1 ; + int32_t L_z2 = S->L_z2 ; + int16_t mp = S->mp ; + + int16_t s1 ; + int32_t L_s2 ; + + int32_t L_temp ; + + int16_t msp, lsp ; + int16_t SO ; + + register int k = 160 ; + + while (k--) + { + + /* 4.2.1 Downscaling of the input signal */ + SO = arith_shift_left (SASR_W (*s, 3), 2) ; + s++ ; + + assert (SO >= -0x4000) ; /* downscaled by */ + assert (SO <= 0x3FFC) ; /* previous routine. */ + + + /* 4.2.2 Offset compensation + * + * This part implements a high-pass filter and requires extended + * arithmetic precision for the recursive part of this filter. + * The input of this procedure is the array so[0...159] and the + * output the array sof[ 0...159 ]. + */ + + /* Compute the non-recursive part */ + + s1 = SO - z1 ; /* s1 = gsm_sub (*so, z1) ; */ + z1 = SO ; + + assert (s1 != MIN_WORD) ; + + /* Compute the recursive part */ + L_s2 = s1 ; + L_s2 = arith_shift_left (L_s2, 15) ; + + /* Execution of a 31 bv 16 bits multiplication */ + + msp = SASR_L (L_z2, 15) ; + lsp = L_z2 - arith_shift_left ((int32_t) msp, 15) ; /* gsm_L_sub (L_z2,(msp<<15)) ; */ + + L_s2 += GSM_MULT_R (lsp, 32735) ; + L_temp = (int32_t) msp * 32735 ; /* GSM_L_MULT (msp,32735) >> 1 ;*/ + L_z2 = GSM_L_ADD (L_temp, L_s2) ; + + /* Compute sof[k] with rounding */ + L_temp = GSM_L_ADD (L_z2, 16384) ; + + /* 4.2.3 Preemphasis */ + + msp = GSM_MULT_R (mp, -28180) ; + mp = SASR_L (L_temp, 15) ; + *so++ = GSM_ADD (mp, msp) ; + } + + S->z1 = z1 ; + S->L_z2 = L_z2 ; + S->mp = mp ; +} diff --git a/libsndfile-1.0.31/src/GSM610/rpe.c b/libsndfile-1.0.31/src/GSM610/rpe.c new file mode 100644 index 0000000..d9e90f2 --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/rpe.c @@ -0,0 +1,460 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +#include +#include + +#include "gsm610_priv.h" + +/* 4.2.13 .. 4.2.17 RPE ENCODING SECTION + */ + +/* 4.2.13 */ + +static void Weighting_filter ( + register int16_t * e, /* signal [-5..0.39.44] IN */ + int16_t * x /* signal [0..39] OUT */ +) +/* + * The coefficients of the weighting filter are stored in a table + * (see table 4.4). The following scaling is used: + * + * H[0..10] = integer(real_H [0..10] * 8192) ; + */ +{ + /* int16_t wt [50] ; */ + + register int32_t L_result ; + register int k /* , i */ ; + + /* Initialization of a temporary working array wt[0...49] + */ + + /* for (k = 0 ; k <= 4 ; k++) wt[k] = 0 ; + * for (k = 5 ; k <= 44 ; k++) wt[k] = *e++; + * for (k = 45 ; k <= 49 ; k++) wt[k] = 0 ; + * + * (e[-5..-1] and e[40..44] are allocated by the caller, + * are initially zero and are not written anywhere.) + */ + e -= 5 ; + + /* Compute the signal x[0..39] + */ + for (k = 0 ; k <= 39 ; k++) + { L_result = 8192 >> 1 ; + + /* for (i = 0 ; i <= 10 ; i++) { + * L_temp = GSM_L_MULT(wt[k+i], gsm_H[i]) ; + * L_result = GSM_L_ADD(L_result, L_temp) ; + * } + */ + +#undef STEP +#define STEP(i, H) (e [k + i] * (int32_t) H) + + /* Every one of these multiplications is done twice -- + * but I don't see an elegant way to optimize this. + * Do you? + */ + +#ifdef STUPID_COMPILER + L_result += STEP (0, -134) ; + L_result += STEP (1, -374) ; + /* + STEP (2, 0) */ + L_result += STEP (3, 2054) ; + L_result += STEP (4, 5741) ; + L_result += STEP (5, 8192) ; + L_result += STEP (6, 5741) ; + L_result += STEP (7, 2054) ; + /* + STEP (8, 0) */ + L_result += STEP (9, -374) ; + L_result += STEP (10, -134) ; +#else + L_result += STEP (0, -134) + + STEP (1, -374) + /* + STEP (2, 0) */ + + STEP (3, 2054) + + STEP (4, 5741) + + STEP (5, 8192) + + STEP (6, 5741) + + STEP (7, 2054) + /* + STEP (8, 0) */ + + STEP (9, -374) + + STEP (10, -134) ; +#endif + + /* L_result = GSM_L_ADD(L_result, L_result) ; (* scaling(x2) *) + * L_result = GSM_L_ADD(L_result, L_result) ; (* scaling(x4) *) + * + * x[k] = SASR(L_result, 16) ; + */ + + /* 2 adds vs. >>16 => 14, minus one shift to compensate for + * those we lost when replacing L_MULT by '*'. + */ + + L_result = SASR_L (L_result, 13) ; + x [k] = (L_result < MIN_WORD ? MIN_WORD + : (L_result > MAX_WORD ? MAX_WORD : L_result)) ; + } +} + +/* 4.2.14 */ + +static void RPE_grid_selection ( + int16_t * x, /* [0..39] IN */ + int16_t * xM, /* [0..12] OUT */ + int16_t * Mc_out /* OUT */ +) +/* + * The signal x[0..39] is used to select the RPE grid which is + * represented by Mc. + */ +{ + register int i ; + register int32_t L_result, L_temp ; + int32_t EM ; /* xxx should be L_EM? */ + int16_t Mc ; + + int32_t L_common_0_3 ; + + EM = 0 ; + Mc = 0 ; + + /* for (m = 0 ; m <= 3 ; m++) { + * L_result = 0 ; + * + * + * for (i = 0 ; i <= 12 ; i++) { + * + * temp1 = SASR_W (x[m + 3*i], 2) ; + * + * assert (temp1 != MIN_WORD) ; + * + * L_temp = GSM_L_MULT(temp1, temp1) ; + * L_result = GSM_L_ADD(L_temp, L_result) ; + * } + * + * if (L_result > EM) { + * Mc = m ; + * EM = L_result ; + * } + * } + */ + +#undef STEP +#define STEP(m, i) L_temp = SASR_W (x [m + 3 * i], 2) ; \ + L_result += L_temp * L_temp ; + + /* common part of 0 and 3 */ + + L_result = 0 ; + STEP (0, 1) ; STEP (0, 2) ; STEP (0, 3) ; STEP (0, 4) ; + STEP (0, 5) ; STEP (0, 6) ; STEP (0, 7) ; STEP (0, 8) ; + STEP (0, 9) ; STEP (0, 10) ; STEP (0, 11) ; STEP (0, 12) ; + L_common_0_3 = L_result ; + + /* i = 0 */ + + STEP (0, 0) ; + L_result <<= 1 ; /* implicit in L_MULT */ + EM = L_result ; + + /* i = 1 */ + + L_result = 0 ; + STEP (1, 0) ; + STEP (1, 1) ; STEP (1, 2) ; STEP (1, 3) ; STEP (1, 4) ; + STEP (1, 5) ; STEP (1, 6) ; STEP (1, 7) ; STEP (1, 8) ; + STEP (1, 9) ; STEP (1, 10) ; STEP (1, 11) ; STEP (1, 12) ; + L_result <<= 1 ; + if (L_result > EM) + { Mc = 1 ; + EM = L_result ; + } + + /* i = 2 */ + + L_result = 0 ; + STEP (2, 0) ; + STEP (2, 1) ; STEP (2, 2) ; STEP (2, 3) ; STEP (2, 4) ; + STEP (2, 5) ; STEP (2, 6) ; STEP (2, 7) ; STEP (2, 8) ; + STEP (2, 9) ; STEP (2, 10) ; STEP (2, 11) ; STEP (2, 12) ; + L_result <<= 1 ; + if (L_result > EM) + { Mc = 2 ; + EM = L_result ; + } + + /* i = 3 */ + + L_result = L_common_0_3 ; + STEP (3, 12) ; + L_result <<= 1 ; + if (L_result > EM) + { Mc = 3 ; + EM = L_result ; + } + + /* Down-sampling by a factor 3 to get the selected xM [0..12] + * RPE sequence. + */ + for (i = 0 ; i <= 12 ; i ++) xM [i] = x [Mc + 3 * i] ; + *Mc_out = Mc ; +} + +/* 4.12.15 */ + +static void APCM_quantization_xmaxc_to_exp_mant ( + int16_t xmaxc, /* IN */ + int16_t * expon_out, /* OUT */ + int16_t * mant_out) /* OUT */ +{ + int16_t expon, mant ; + + /* Compute expononent and mantissa of the decoded version of xmaxc + */ + + expon = 0 ; + if (xmaxc > 15) expon = SASR_W (xmaxc, 3) - 1 ; + mant = xmaxc - (expon << 3) ; + + if (mant == 0) + { expon = -4 ; + mant = 7 ; + } + else + { while (mant <= 7) + { mant = mant << 1 | 1 ; + expon-- ; + } + mant -= 8 ; + } + + assert (expon >= -4 && expon <= 6) ; + assert (mant >= 0 && mant <= 7) ; + + *expon_out = expon ; + *mant_out = mant ; +} + +static void APCM_quantization ( + int16_t * xM, /* [0..12] IN */ + int16_t * xMc, /* [0..12] OUT */ + int16_t * mant_out, /* OUT */ + int16_t * expon_out, /* OUT */ + int16_t * xmaxc_out /* OUT */ +) +{ + int i, itest ; + + int16_t xmax, xmaxc, temp, temp1, temp2 ; + int16_t expon, mant ; + + + /* Find the maximum absolute value xmax of xM [0..12]. + */ + + xmax = 0 ; + for (i = 0 ; i <= 12 ; i++) + { temp = xM [i] ; + temp = GSM_ABS (temp) ; + if (temp > xmax) xmax = temp ; + } + + /* Qantizing and coding of xmax to get xmaxc. + */ + + expon = 0 ; + temp = SASR_W (xmax, 9) ; + itest = 0 ; + + for (i = 0 ; i <= 5 ; i++) + { itest |= (temp <= 0) ; + temp = SASR_W (temp, 1) ; + + assert (expon <= 5) ; + if (itest == 0) expon++ ; /* expon = add (expon, 1) */ + } + + assert (expon <= 6 && expon >= 0) ; + temp = expon + 5 ; + + assert (temp <= 11 && temp >= 0) ; + xmaxc = gsm_add (SASR_W (xmax, temp), (int16_t) (expon << 3)) ; + + /* Quantizing and coding of the xM [0..12] RPE sequence + * to get the xMc [0..12] + */ + + APCM_quantization_xmaxc_to_exp_mant (xmaxc, &expon, &mant) ; + + /* This computation uses the fact that the decoded version of xmaxc + * can be calculated by using the expononent and the mantissa part of + * xmaxc (logarithmic table). + * So, this method avoids any division and uses only a scaling + * of the RPE samples by a function of the expononent. A direct + * multiplication by the inverse of the mantissa (NRFAC[0..7] + * found in table 4.5) gives the 3 bit coded version xMc [0..12] + * of the RPE samples. + */ + + + /* Direct computation of xMc [0..12] using table 4.5 + */ + + assert (expon <= 4096 && expon >= -4096) ; + assert (mant >= 0 && mant <= 7) ; + + temp1 = 6 - expon ; /* normalization by the expononent */ + temp2 = gsm_NRFAC [mant] ; /* inverse mantissa */ + + for (i = 0 ; i <= 12 ; i++) + { assert (temp1 >= 0 && temp1 < 16) ; + + temp = arith_shift_left (xM [i], temp1) ; + temp = GSM_MULT (temp, temp2) ; + temp = SASR_W (temp, 12) ; + xMc [i] = temp + 4 ; /* see note below */ + } + + /* NOTE: This equation is used to make all the xMc [i] positive. + */ + + *mant_out = mant ; + *expon_out = expon ; + *xmaxc_out = xmaxc ; +} + +/* 4.2.16 */ + +static void APCM_inverse_quantization ( + register int16_t * xMc, /* [0..12] IN */ + int16_t mant, + int16_t expon, + register int16_t * xMp) /* [0..12] OUT */ +/* + * This part is for decoding the RPE sequence of coded xMc [0..12] + * samples to obtain the xMp[0..12] array. Table 4.6 is used to get + * the mantissa of xmaxc (FAC[0..7]). + */ +{ + int i ; + int16_t temp, temp1, temp2, temp3 ; + + assert (mant >= 0 && mant <= 7) ; + + temp1 = gsm_FAC [mant] ; /* see 4.2-15 for mant */ + temp2 = gsm_sub (6, expon) ; /* see 4.2-15 for exp */ + temp3 = gsm_asl (1, gsm_sub (temp2, 1)) ; + + for (i = 13 ; i-- ;) + { assert (*xMc <= 7 && *xMc >= 0) ; /* 3 bit unsigned */ + + /* temp = gsm_sub (*xMc++ << 1, 7) ; */ + temp = (*xMc++ << 1) - 7 ; /* restore sign */ + assert (temp <= 7 && temp >= -7) ; /* 4 bit signed */ + + temp = arith_shift_left (temp, 12) ; /* 16 bit signed */ + temp = GSM_MULT_R (temp1, temp) ; + temp = GSM_ADD (temp, temp3) ; + *xMp++ = gsm_asr (temp, temp2) ; + } +} + +/* 4.2.17 */ + +static void RPE_grid_positioning ( + int16_t Mc, /* grid position IN */ + register int16_t * xMp, /* [0..12] IN */ + register int16_t * ep /* [0..39] OUT */ +) +/* + * This procedure computes the reconstructed long term residual signal + * ep[0..39] for the LTP analysis filter. The inputs are the Mc + * which is the grid position selection and the xMp[0..12] decoded + * RPE samples which are upsampled by a factor of 3 by inserting zero + * values. + */ +{ + int i = 13 ; + + assert (0 <= Mc && Mc <= 3) ; + + switch (Mc) + { case 3: *ep++ = 0 ; + /* Falls through. */ + case 2: do + { *ep++ = 0 ; + /* Falls through. */ + case 1: *ep++ = 0 ; + /* Falls through. */ + case 0: *ep++ = *xMp++ ; + } while (--i) ; + } + while (++Mc < 4) *ep++ = 0 ; +} + +/* 4.2.18 */ + +/* This procedure adds the reconstructed long term residual signal + * ep[0..39] to the estimated signal dpp[0..39] from the long term + * analysis filter to compute the reconstructed short term residual + * signal dp[-40..-1] ; also the reconstructed short term residual + * array dp[-120..-41] is updated. + */ + +#if 0 /* Has been inlined in code.c */ +void Gsm_Update_of_reconstructed_short_time_residual_signal ( + int16_t * dpp, /* [0...39] IN */ + int16_t * ep, /* [0...39] IN */ + int16_t * dp) /* [-120...-1] IN/OUT */ +{ + int k ; + + for (k = 0 ; k <= 79 ; k++) + dp [-120 + k] = dp [-80 + k] ; + + for (k = 0 ; k <= 39 ; k++) + dp [-40 + k] = gsm_add (ep [k], dpp [k]) ; +} +#endif /* Has been inlined in code.c */ + +void Gsm_RPE_Encoding ( + int16_t * e, /* -5..-1][0..39][40..44 IN/OUT */ + int16_t * xmaxc, /* OUT */ + int16_t * Mc, /* OUT */ + int16_t * xMc) /* [0..12] OUT */ +{ + int16_t x [40] ; + int16_t xM [13], xMp [13] ; + int16_t mant, expon ; + + Weighting_filter (e, x) ; + RPE_grid_selection (x, xM, Mc) ; + + APCM_quantization (xM, xMc, &mant, &expon, xmaxc) ; + APCM_inverse_quantization (xMc, mant, expon, xMp) ; + + RPE_grid_positioning (*Mc, xMp, e) ; + +} + +void Gsm_RPE_Decoding ( + int16_t xmaxcr, + int16_t Mcr, + int16_t * xMcr, /* [0..12], 3 bits IN */ + int16_t * erp /* [0..39] OUT */ +) +{ + int16_t expon, mant ; + int16_t xMp [13] ; + + APCM_quantization_xmaxc_to_exp_mant (xmaxcr, &expon, &mant) ; + APCM_inverse_quantization (xMcr, mant, expon, xMp) ; + RPE_grid_positioning (Mcr, xMp, erp) ; +} diff --git a/libsndfile-1.0.31/src/GSM610/short_term.c b/libsndfile-1.0.31/src/GSM610/short_term.c new file mode 100644 index 0000000..e8cdac3 --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/short_term.c @@ -0,0 +1,412 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +#include +#include + +#include "gsm610_priv.h" + +/* + * SHORT TERM ANALYSIS FILTERING SECTION + */ + +/* 4.2.8 */ + +static void Decoding_of_the_coded_Log_Area_Ratios ( + int16_t * LARc, /* coded log area ratio [0..7] IN */ + int16_t * LARpp) /* out: decoded .. */ +{ + register int16_t temp1 ; + + /* This procedure requires for efficient implementation + * two tables. + * + * INVA[1..8] = integer((32768 * 8) / real_A[1..8]) + * MIC[1..8] = minimum value of the LARc[1..8] + */ + + /* Compute the LARpp[1..8] + */ + + /* for (i = 1; i <= 8; i++, B++, MIC++, INVA++, LARc++, LARpp++) { + * + * temp1 = GSM_ADD (*LARc, *MIC) << 10; + * temp2 = *B << 1; + * temp1 = GSM_SUB(temp1, temp2) ; + * + * assert(*INVA != MIN_WORD) ; + * + * temp1 = GSM_MULT_R (*INVA, temp1) ; + * *LARpp = GSM_ADD (temp1, temp1) ; + * } + */ + +#undef STEP +#define STEP(B, MIC, INVA) \ + temp1 = arith_shift_left (GSM_ADD (*LARc++, MIC), 10) ; \ + temp1 = GSM_SUB (temp1, B * 2) ; \ + temp1 = GSM_MULT_R (INVA, temp1) ; \ + *LARpp++ = GSM_ADD (temp1, temp1) ; + + STEP (0, -32, 13107) ; + STEP (0, -32, 13107) ; + STEP (2048, -16, 13107) ; + STEP (-2560, -16, 13107) ; + + STEP (94, -8, 19223) ; + STEP (-1792, -8, 17476) ; + STEP (-341, -4, 31454) ; + STEP (-1144, -4, 29708) ; + + /* NOTE: the addition of *MIC is used to restore + * the sign of *LARc. + */ +} + +/* 4.2.9 */ +/* Computation of the quantized reflection coefficients + */ + +/* 4.2.9.1 Interpolation of the LARpp[1..8] to get the LARp[1..8] + */ + +/* + * Within each frame of 160 analyzed speech samples the short term + * analysis and synthesis filters operate with four different sets of + * coefficients, derived from the previous set of decoded LARs(LARpp(j-1)) + * and the actual set of decoded LARs (LARpp(j)) + * + * (Initial value: LARpp(j-1)[1..8] = 0.) + */ + +static void Coefficients_0_12 ( + register int16_t * LARpp_j_1, + register int16_t * LARpp_j, + register int16_t * LARp) +{ + register int i ; + + for (i = 1 ; i <= 8 ; i++, LARp++, LARpp_j_1++, LARpp_j++) + { *LARp = GSM_ADD (SASR_W (*LARpp_j_1, 2), SASR_W (*LARpp_j, 2)) ; + *LARp = GSM_ADD (*LARp, SASR_W (*LARpp_j_1, 1)) ; + } +} + +static void Coefficients_13_26 ( + register int16_t * LARpp_j_1, + register int16_t * LARpp_j, + register int16_t * LARp) +{ + register int i ; + for (i = 1 ; i <= 8 ; i++, LARpp_j_1++, LARpp_j++, LARp++) + *LARp = GSM_ADD (SASR_W (*LARpp_j_1, 1), SASR_W (*LARpp_j, 1)) ; +} + +static void Coefficients_27_39 ( + register int16_t * LARpp_j_1, + register int16_t * LARpp_j, + register int16_t * LARp) +{ + register int i ; + + for (i = 1 ; i <= 8 ; i++, LARpp_j_1++, LARpp_j++, LARp++) + { *LARp = GSM_ADD (SASR_W (*LARpp_j_1, 2), SASR_W (*LARpp_j, 2)) ; + *LARp = GSM_ADD (*LARp, SASR_W (*LARpp_j, 1)) ; + } +} + + +static void Coefficients_40_159 ( + register int16_t * LARpp_j, + register int16_t * LARp) +{ + register int i ; + + for (i = 1 ; i <= 8 ; i++, LARp++, LARpp_j++) + *LARp = *LARpp_j ; +} + +/* 4.2.9.2 */ + +static void LARp_to_rp ( + register int16_t * LARp) /* [0..7] IN/OUT */ +/* + * The input of this procedure is the interpolated LARp[0..7] array. + * The reflection coefficients, rp[i], are used in the analysis + * filter and in the synthesis filter. + */ +{ + register int i ; + register int16_t temp ; + + for (i = 1 ; i <= 8 ; i++, LARp++) + { /* temp = GSM_ABS(*LARp) ; + * + * if (temp < 11059) temp <<= 1; + * else if (temp < 20070) temp += 11059; + * else temp = GSM_ADD (temp >> 2, 26112) ; + * + * *LARp = *LARp < 0 ? -temp : temp; + */ + + if (*LARp < 0) + { temp = *LARp == MIN_WORD ? MAX_WORD : - (*LARp) ; + *LARp = - ((temp < 11059) ? temp << 1 + : ((temp < 20070) ? temp + 11059 + : GSM_ADD ((int16_t) (temp >> 2), (int16_t) 26112))) ; + } + else + { temp = *LARp ; + *LARp = (temp < 11059) ? temp << 1 + : ((temp < 20070) ? temp + 11059 + : GSM_ADD ((int16_t) (temp >> 2), (int16_t) 26112)) ; + } + } +} + + +/* 4.2.10 */ +static void Short_term_analysis_filtering ( + struct gsm_state * S, + register int16_t * rp, /* [0..7] IN */ + register int k_n, /* k_end - k_start */ + register int16_t * s /* [0..n-1] IN/OUT */ +) +/* + * This procedure computes the short term residual signal d[..] to be fed + * to the RPE-LTP loop from the s[..] signal and from the local rp[..] + * array (quantized reflection coefficients). As the call of this + * procedure can be done in many ways (see the interpolation of the LAR + * coefficient), it is assumed that the computation begins with index + * k_start (for arrays d[..] and s[..]) and stops with index k_end + * (k_start and k_end are defined in 4.2.9.1). This procedure also + * needs to keep the array u [0..7] in memory for each call. + */ +{ + register int16_t * u = S->u ; + register int i ; + register int16_t di, zzz, ui, sav, rpi ; + + for ( ; k_n-- ; s++) + { di = sav = *s ; + + for (i = 0 ; i < 8 ; i++) + { /* YYY */ + ui = u [i] ; + rpi = rp [i] ; + u [i] = sav ; + + zzz = GSM_MULT_R (rpi, di) ; + sav = GSM_ADD (ui, zzz) ; + + zzz = GSM_MULT_R (rpi, ui) ; + di = GSM_ADD (di, zzz) ; + } + + *s = di ; + } +} + +#if defined (USE_FLOAT_MUL) && defined (FAST) + +static void Fast_Short_term_analysis_filtering ( + struct gsm_state * S, + register int16_t * rp, /* [0..7] IN */ + register int k_n, /* k_end - k_start */ + register int16_t * s /* [0..n-1] IN/OUT */ +) +{ + register int16_t * u = S->u ; + register int i ; + + float uf [8], rpf [8] ; + + register float scalef = 3.0517578125e-5 ; + register float sav, di, temp ; + + for (i = 0 ; i < 8 ; ++i) + { uf [i] = u [i] ; + rpf [i] = rp [i] * scalef ; + } + for ( ; k_n-- ; s++) + { sav = di = *s ; + for (i = 0 ; i < 8 ; i++) + { register float rpfi = rpf [i] ; + register float ufi = uf [i] ; + + uf [i] = sav ; + temp = rpfi * di + ufi ; + di += rpfi * ufi ; + sav = temp ; + } + *s = di ; + } + for (i = 0 ; i < 8 ; i++) u [i] = uf [i] ; +} +#endif /* ! (defined (USE_FLOAT_MUL) && defined (FAST)) */ + +static void Short_term_synthesis_filtering ( + struct gsm_state * S, + register int16_t * rrp, /* [0..7] IN */ + register int k, /* k_end - k_start */ + register int16_t * wt, /* [0..k-1] IN */ + register int16_t * sr /* [0..k-1] OUT */ +) +{ + register int16_t * v = S->v ; + register int i ; + register int16_t sri, tmp1, tmp2 ; + + while (k--) + { sri = *wt++ ; + for (i = 8 ; i-- ; ) + { /* sri = GSM_SUB(sri, gsm_mult_r(rrp[i], v [i])) ; + */ + tmp1 = rrp [i] ; + tmp2 = v [i] ; + tmp2 = (tmp1 == MIN_WORD && tmp2 == MIN_WORD + ? MAX_WORD + : 0x0FFFF & (((int32_t) tmp1 * (int32_t) tmp2 + + 16384) >> 15)) ; + + sri = GSM_SUB (sri, tmp2) ; + + /* v [i+1] = GSM_ADD (v [i], gsm_mult_r(rrp[i], sri)) ; + */ + tmp1 = (tmp1 == MIN_WORD && sri == MIN_WORD + ? MAX_WORD + : 0x0FFFF & (((int32_t) tmp1 * (int32_t) sri + + 16384) >> 15)) ; + + v [i + 1] = GSM_ADD (v [i], tmp1) ; + } + *sr++ = v [0] = sri ; + } +} + + +#if defined (FAST) && defined (USE_FLOAT_MUL) + +static void Fast_Short_term_synthesis_filtering ( + struct gsm_state * S, + register int16_t * rrp, /* [0..7] IN */ + register int k, /* k_end - k_start */ + register int16_t * wt, /* [0..k-1] IN */ + register int16_t * sr /* [0..k-1] OUT */ +) +{ + register int16_t * v = S->v ; + register int i ; + + float va [9], rrpa [8] ; + register float scalef = 3.0517578125e-5, temp ; + + for (i = 0 ; i < 8 ; ++i) + { va [i] = v [i] ; + rrpa [i] = (float) rrp [i] * scalef ; + } + while (k--) { + register float sri = *wt++ ; + for (i = 8 ; i-- ; ) + { sri -= rrpa [i] * va [i] ; + if (sri < -32768.0) sri = -32768.0 ; + else if (sri > 32767.0) sri = 32767.0 ; + + temp = va [i] + rrpa [i] * sri ; + if (temp < -32768.0) temp = -32768.0 ; + else if (temp > 32767.0) temp = 32767.0 ; + va [i+1] = temp ; + } + *sr++ = va [0] = sri ; + } + for (i = 0 ; i < 9 ; ++i) v [i] = va [i] ; +} + +#endif /* defined(FAST) && defined(USE_FLOAT_MUL) */ + +void Gsm_Short_Term_Analysis_Filter ( + struct gsm_state * S, + + int16_t * LARc, /* coded log area ratio [0..7] IN */ + int16_t * s /* signal [0..159] IN/OUT */ +) +{ + int16_t * LARpp_j = S->LARpp [S->j] ; + int16_t * LARpp_j_1 = S->LARpp [S->j ^= 1] ; + + int16_t LARp [8] ; + +#undef FILTER +#if defined (FAST) && defined (USE_FLOAT_MUL) +# define FILTER (* (S->fast \ + ? Fast_Short_term_analysis_filtering \ + : Short_term_analysis_filtering)) + +#else +# define FILTER Short_term_analysis_filtering +#endif + + Decoding_of_the_coded_Log_Area_Ratios (LARc, LARpp_j) ; + + Coefficients_0_12 (LARpp_j_1, LARpp_j, LARp) ; + LARp_to_rp (LARp) ; + FILTER (S, LARp, 13, s) ; + + Coefficients_13_26 (LARpp_j_1, LARpp_j, LARp) ; + LARp_to_rp (LARp) ; + FILTER (S, LARp, 14, s + 13) ; + + Coefficients_27_39 (LARpp_j_1, LARpp_j, LARp) ; + LARp_to_rp (LARp) ; + FILTER (S, LARp, 13, s + 27) ; + + Coefficients_40_159 (LARpp_j, LARp) ; + LARp_to_rp (LARp) ; + FILTER (S, LARp, 120, s + 40) ; +} + +void Gsm_Short_Term_Synthesis_Filter ( + struct gsm_state * S, + + int16_t * LARcr, /* received log area ratios [0..7] IN */ + int16_t * wt, /* received d [0..159] IN */ + + int16_t * s /* signal s [0..159] OUT */ +) +{ + int16_t * LARpp_j = S->LARpp [S->j] ; + int16_t * LARpp_j_1 = S->LARpp [S->j ^= 1] ; + + int16_t LARp [8] ; + +#undef FILTER +#if defined (FAST) && defined (USE_FLOAT_MUL) + +# define FILTER (* (S->fast \ + ? Fast_Short_term_synthesis_filtering \ + : Short_term_synthesis_filtering)) +#else +# define FILTER Short_term_synthesis_filtering +#endif + + Decoding_of_the_coded_Log_Area_Ratios (LARcr, LARpp_j) ; + + Coefficients_0_12 (LARpp_j_1, LARpp_j, LARp) ; + LARp_to_rp (LARp) ; + FILTER (S, LARp, 13, wt, s) ; + + Coefficients_13_26 (LARpp_j_1, LARpp_j, LARp) ; + LARp_to_rp (LARp) ; + FILTER (S, LARp, 14, wt + 13, s + 13) ; + + Coefficients_27_39 (LARpp_j_1, LARpp_j, LARp) ; + LARp_to_rp (LARp) ; + FILTER (S, LARp, 13, wt + 27, s + 27) ; + + Coefficients_40_159 (LARpp_j, LARp) ; + LARp_to_rp (LARp) ; + FILTER (S, LARp, 120, wt + 40, s + 40) ; +} diff --git a/libsndfile-1.0.31/src/GSM610/table.c b/libsndfile-1.0.31/src/GSM610/table.c new file mode 100644 index 0000000..30590af --- /dev/null +++ b/libsndfile-1.0.31/src/GSM610/table.c @@ -0,0 +1,60 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* Most of these tables are inlined at their point of use. + */ + +/* 4.4 TABLES USED IN THE FIXED POINT IMPLEMENTATION OF THE RPE-LTP + * CODER AND DECODER + * + * (Most of them inlined, so watch out.) + */ + +#define GSM_TABLE_C +#include "gsm610_priv.h" + +/* Table 4.1 Quantization of the Log.-Area Ratios + */ +/* i 1 2 3 4 5 6 7 8 */ +int16_t gsm_A [8] = { 20480, 20480, 20480, 20480, 13964, 15360, 8534, 9036 } ; +int16_t gsm_B [8] = { 0, 0, 2048, -2560, 94, -1792, -341, -1144 } ; +int16_t gsm_MIC [8] = { -32, -32, -16, -16, -8, -8, -4, -4 } ; +int16_t gsm_MAC [8] = { 31, 31, 15, 15, 7, 7, 3, 3 } ; + + +/* Table 4.2 Tabulation of 1/A[1..8] + */ +int16_t gsm_INVA [8] = { 13107, 13107, 13107, 13107, 19223, 17476, 31454, 29708 } ; + + +/* Table 4.3a Decision level of the LTP gain quantizer + */ +/* bc 0 1 2 3 */ +int16_t gsm_DLB [4] = { 6554, 16384, 26214, 32767 } ; + + +/* Table 4.3b Quantization levels of the LTP gain quantizer + */ +/* bc 0 1 2 3 */ +int16_t gsm_QLB [4] = { 3277, 11469, 21299, 32767 } ; + + +/* Table 4.4 Coefficients of the weighting filter + */ +/* i 0 1 2 3 4 5 6 7 8 9 10 */ +int16_t gsm_H [11] = { -134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134 } ; + + +/* Table 4.5 Normalized inverse mantissa used to compute xM/xmax + */ +/* i 0 1 2 3 4 5 6 7 */ +int16_t gsm_NRFAC [8] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 } ; + + +/* Table 4.6 Normalized direct mantissa used to compute xM/xmax + */ +/* i 0 1 2 3 4 5 6 7 */ +int16_t gsm_FAC [8] = { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 } ; diff --git a/libsndfile-1.0.31/src/Symbols.darwin b/libsndfile-1.0.31/src/Symbols.darwin new file mode 100644 index 0000000..3c1d1e7 --- /dev/null +++ b/libsndfile-1.0.31/src/Symbols.darwin @@ -0,0 +1,43 @@ +# Auto-generated by create_symbols_file.py + +_sf_command +_sf_open +_sf_close +_sf_seek +_sf_error +_sf_perror +_sf_error_str +_sf_error_number +_sf_format_check +_sf_read_raw +_sf_readf_short +_sf_readf_int +_sf_readf_float +_sf_readf_double +_sf_read_short +_sf_read_int +_sf_read_float +_sf_read_double +_sf_write_raw +_sf_writef_short +_sf_writef_int +_sf_writef_float +_sf_writef_double +_sf_write_short +_sf_write_int +_sf_write_float +_sf_write_double +_sf_strerror +_sf_get_string +_sf_set_string +_sf_version_string +_sf_open_fd +_sf_open_virtual +_sf_write_sync +_sf_set_chunk +_sf_get_chunk_size +_sf_get_chunk_data +_sf_get_chunk_iterator +_sf_next_chunk_iterator +_sf_current_byterate + diff --git a/libsndfile-1.0.31/src/Symbols.gnu-binutils b/libsndfile-1.0.31/src/Symbols.gnu-binutils new file mode 100644 index 0000000..63c7310 --- /dev/null +++ b/libsndfile-1.0.31/src/Symbols.gnu-binutils @@ -0,0 +1,49 @@ +# Auto-generated by create_symbols_file.py + +libsndfile.so.1.0 +{ + global: + sf_command ; + sf_open ; + sf_close ; + sf_seek ; + sf_error ; + sf_perror ; + sf_error_str ; + sf_error_number ; + sf_format_check ; + sf_read_raw ; + sf_readf_short ; + sf_readf_int ; + sf_readf_float ; + sf_readf_double ; + sf_read_short ; + sf_read_int ; + sf_read_float ; + sf_read_double ; + sf_write_raw ; + sf_writef_short ; + sf_writef_int ; + sf_writef_float ; + sf_writef_double ; + sf_write_short ; + sf_write_int ; + sf_write_float ; + sf_write_double ; + sf_strerror ; + sf_get_string ; + sf_set_string ; + sf_version_string ; + sf_open_fd ; + sf_open_virtual ; + sf_write_sync ; + sf_set_chunk ; + sf_get_chunk_size ; + sf_get_chunk_data ; + sf_get_chunk_iterator ; + sf_next_chunk_iterator ; + sf_current_byterate ; + local: + * ; +} ; + diff --git a/libsndfile-1.0.31/src/Symbols.os2 b/libsndfile-1.0.31/src/Symbols.os2 new file mode 100644 index 0000000..f2fdfed --- /dev/null +++ b/libsndfile-1.0.31/src/Symbols.os2 @@ -0,0 +1,49 @@ +; Auto-generated by create_symbols_file.py + +LIBRARY sndfile1 +INITINSTANCE TERMINSTANCE +CODE PRELOAD MOVEABLE DISCARDABLE +DATA PRELOAD MOVEABLE MULTIPLE NONSHARED +EXPORTS + +_sf_command @1 +_sf_open @2 +_sf_close @3 +_sf_seek @4 +_sf_error @7 +_sf_perror @8 +_sf_error_str @9 +_sf_error_number @10 +_sf_format_check @11 +_sf_read_raw @16 +_sf_readf_short @17 +_sf_readf_int @18 +_sf_readf_float @19 +_sf_readf_double @20 +_sf_read_short @21 +_sf_read_int @22 +_sf_read_float @23 +_sf_read_double @24 +_sf_write_raw @32 +_sf_writef_short @33 +_sf_writef_int @34 +_sf_writef_float @35 +_sf_writef_double @36 +_sf_write_short @37 +_sf_write_int @38 +_sf_write_float @39 +_sf_write_double @40 +_sf_strerror @50 +_sf_get_string @60 +_sf_set_string @61 +_sf_version_string @68 +_sf_open_fd @70 +_sf_open_virtual @80 +_sf_write_sync @90 +_sf_set_chunk @100 +_sf_get_chunk_size @101 +_sf_get_chunk_data @102 +_sf_get_chunk_iterator @103 +_sf_next_chunk_iterator @104 +_sf_current_byterate @110 + diff --git a/libsndfile-1.0.31/src/Symbols.static b/libsndfile-1.0.31/src/Symbols.static new file mode 100644 index 0000000..6b83a72 --- /dev/null +++ b/libsndfile-1.0.31/src/Symbols.static @@ -0,0 +1,41 @@ +sf_command +sf_open +sf_close +sf_seek +sf_error +sf_perror +sf_error_str +sf_error_number +sf_format_check +sf_read_raw +sf_readf_short +sf_readf_int +sf_readf_float +sf_readf_double +sf_read_short +sf_read_int +sf_read_float +sf_read_double +sf_write_raw +sf_writef_short +sf_writef_int +sf_writef_float +sf_writef_double +sf_write_short +sf_write_int +sf_write_float +sf_write_double +sf_strerror +sf_get_string +sf_set_string +sf_version_string +sf_open_fd +sf_wchar_open +sf_open_virtual +sf_write_sync +sf_set_chunk +sf_get_chunk_size +sf_get_chunk_data +sf_get_chunk_iterator +sf_next_chunk_iterator +sf_current_byterate diff --git a/libsndfile-1.0.31/src/aiff.c b/libsndfile-1.0.31/src/aiff.c new file mode 100644 index 0000000..d872a89 --- /dev/null +++ b/libsndfile-1.0.31/src/aiff.c @@ -0,0 +1,1834 @@ +/* +** Copyright (C) 1999-2018 Erik de Castro Lopo +** Copyright (C) 2005 David Viens +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" +#include "chanmap.h" + +/*------------------------------------------------------------------------------ + * Macros to handle big/little endian issues. + */ + +#define FORM_MARKER (MAKE_MARKER ('F', 'O', 'R', 'M')) +#define AIFF_MARKER (MAKE_MARKER ('A', 'I', 'F', 'F')) +#define AIFC_MARKER (MAKE_MARKER ('A', 'I', 'F', 'C')) +#define COMM_MARKER (MAKE_MARKER ('C', 'O', 'M', 'M')) +#define SSND_MARKER (MAKE_MARKER ('S', 'S', 'N', 'D')) +#define MARK_MARKER (MAKE_MARKER ('M', 'A', 'R', 'K')) +#define INST_MARKER (MAKE_MARKER ('I', 'N', 'S', 'T')) +#define APPL_MARKER (MAKE_MARKER ('A', 'P', 'P', 'L')) +#define CHAN_MARKER (MAKE_MARKER ('C', 'H', 'A', 'N')) + +#define c_MARKER (MAKE_MARKER ('(', 'c', ')', ' ')) +#define NAME_MARKER (MAKE_MARKER ('N', 'A', 'M', 'E')) +#define AUTH_MARKER (MAKE_MARKER ('A', 'U', 'T', 'H')) +#define ANNO_MARKER (MAKE_MARKER ('A', 'N', 'N', 'O')) +#define COMT_MARKER (MAKE_MARKER ('C', 'O', 'M', 'T')) +#define FVER_MARKER (MAKE_MARKER ('F', 'V', 'E', 'R')) +#define SFX_MARKER (MAKE_MARKER ('S', 'F', 'X', '!')) + +#define PEAK_MARKER (MAKE_MARKER ('P', 'E', 'A', 'K')) +#define basc_MARKER (MAKE_MARKER ('b', 'a', 's', 'c')) + +/* Supported AIFC encodings.*/ +#define NONE_MARKER (MAKE_MARKER ('N', 'O', 'N', 'E')) +#define sowt_MARKER (MAKE_MARKER ('s', 'o', 'w', 't')) +#define twos_MARKER (MAKE_MARKER ('t', 'w', 'o', 's')) +#define raw_MARKER (MAKE_MARKER ('r', 'a', 'w', ' ')) +#define in24_MARKER (MAKE_MARKER ('i', 'n', '2', '4')) +#define ni24_MARKER (MAKE_MARKER ('4', '2', 'n', '1')) +#define in32_MARKER (MAKE_MARKER ('i', 'n', '3', '2')) +#define ni32_MARKER (MAKE_MARKER ('2', '3', 'n', 'i')) + +#define fl32_MARKER (MAKE_MARKER ('f', 'l', '3', '2')) +#define FL32_MARKER (MAKE_MARKER ('F', 'L', '3', '2')) +#define fl64_MARKER (MAKE_MARKER ('f', 'l', '6', '4')) +#define FL64_MARKER (MAKE_MARKER ('F', 'L', '6', '4')) + +#define ulaw_MARKER (MAKE_MARKER ('u', 'l', 'a', 'w')) +#define ULAW_MARKER (MAKE_MARKER ('U', 'L', 'A', 'W')) +#define alaw_MARKER (MAKE_MARKER ('a', 'l', 'a', 'w')) +#define ALAW_MARKER (MAKE_MARKER ('A', 'L', 'A', 'W')) + +#define DWVW_MARKER (MAKE_MARKER ('D', 'W', 'V', 'W')) +#define GSM_MARKER (MAKE_MARKER ('G', 'S', 'M', ' ')) +#define ima4_MARKER (MAKE_MARKER ('i', 'm', 'a', '4')) + +/* +** This value is officially assigned to Mega Nerd Pty Ltd by Apple +** Corportation as the Application marker for libsndfile. +** +** See : http://developer.apple.com/faq/datatype.html +*/ +#define m3ga_MARKER (MAKE_MARKER ('m', '3', 'g', 'a')) + +/* Unsupported AIFC encodings.*/ + +#define MAC3_MARKER (MAKE_MARKER ('M', 'A', 'C', '3')) +#define MAC6_MARKER (MAKE_MARKER ('M', 'A', 'C', '6')) +#define ADP4_MARKER (MAKE_MARKER ('A', 'D', 'P', '4')) + +/* Predfined chunk sizes. */ +#define SIZEOF_AIFF_COMM 18 +#define SIZEOF_AIFC_COMM_MIN 22 +#define SIZEOF_AIFC_COMM 24 +#define SIZEOF_SSND_CHUNK 8 +#define SIZEOF_INST_CHUNK 20 + +/* Is it constant? */ + +/* AIFC/IMA4 defines. */ +#define AIFC_IMA4_BLOCK_LEN 34 +#define AIFC_IMA4_SAMPLES_PER_BLOCK 64 + +#define AIFF_PEAK_CHUNK_SIZE(ch) (2 * sizeof (int) + ch * (sizeof (float) + sizeof (int))) + +/*------------------------------------------------------------------------------ + * Typedefs for file chunks. + */ + +enum +{ HAVE_FORM = 0x01, + HAVE_AIFF = 0x02, + HAVE_AIFC = 0x04, + HAVE_FVER = 0x08, + HAVE_COMM = 0x10, + HAVE_SSND = 0x20 +} ; + +typedef struct +{ uint32_t size ; + int16_t numChannels ; + uint32_t numSampleFrames ; + int16_t sampleSize ; + uint8_t sampleRate [10] ; + uint32_t encoding ; + char zero_bytes [2] ; +} COMM_CHUNK ; + +typedef struct +{ uint32_t offset ; + uint32_t blocksize ; +} SSND_CHUNK ; + +typedef struct +{ int16_t playMode ; + uint16_t beginLoop ; + uint16_t endLoop ; +} INST_LOOP ; + +typedef struct +{ int8_t baseNote ; /* all notes are MIDI note numbers */ + int8_t detune ; /* cents off, only -50 to +50 are significant */ + int8_t lowNote ; + int8_t highNote ; + int8_t lowVelocity ; /* 1 to 127 */ + int8_t highVelocity ; /* 1 to 127 */ + int16_t gain ; /* in dB, 0 is normal */ + INST_LOOP sustain_loop ; + INST_LOOP release_loop ; +} INST_CHUNK ; + + +enum +{ basc_SCALE_MINOR = 1, + basc_SCALE_MAJOR, + basc_SCALE_NEITHER, + basc_SCALE_BOTH +} ; + +enum +{ basc_TYPE_LOOP = 0, + basc_TYPE_ONE_SHOT +} ; + + +typedef struct +{ uint32_t version ; + uint32_t numBeats ; + uint16_t rootNote ; + uint16_t scaleType ; + uint16_t sigNumerator ; + uint16_t sigDenominator ; + uint16_t loopType ; +} basc_CHUNK ; + +typedef struct +{ uint16_t markerID ; + uint32_t position ; +} MARK_ID_POS ; + +typedef struct +{ sf_count_t comm_offset ; + sf_count_t ssnd_offset ; + + int32_t chanmap_tag ; + + MARK_ID_POS *markstr ; +} AIFF_PRIVATE ; + +/*------------------------------------------------------------------------------ + * Private static functions. + */ + +static int aiff_close (SF_PRIVATE *psf) ; + +static int tenbytefloat2int (uint8_t *bytes) ; +static void uint2tenbytefloat (uint32_t num, uint8_t *bytes) ; + +static int aiff_read_comm_chunk (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt) ; + +static int aiff_read_header (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt) ; + +static int aiff_write_header (SF_PRIVATE *psf, int calc_length) ; +static int aiff_write_tailer (SF_PRIVATE *psf) ; +static void aiff_write_strings (SF_PRIVATE *psf, int location) ; + +static int aiff_command (SF_PRIVATE *psf, int command, void *data, int datasize) ; + +static const char *get_loop_mode_str (int16_t mode) ; + +static int16_t get_loop_mode (int16_t mode) ; + +static int aiff_read_basc_chunk (SF_PRIVATE * psf, int) ; + +static int aiff_read_chanmap (SF_PRIVATE * psf, unsigned dword) ; + +static uint32_t marker_to_position (const MARK_ID_POS *m, uint16_t n, int marksize) ; + +static int aiff_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info) ; +static SF_CHUNK_ITERATOR * aiff_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator) ; +static int aiff_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ; +static int aiff_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ; + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +aiff_open (SF_PRIVATE *psf) +{ COMM_CHUNK comm_fmt ; + int error, subformat ; + + memset (&comm_fmt, 0, sizeof (comm_fmt)) ; + + subformat = SF_CODEC (psf->sf.format) ; + + if ((psf->container_data = calloc (1, sizeof (AIFF_PRIVATE))) == NULL) + return SFE_MALLOC_FAILED ; + + psf->container_close = aiff_close ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = aiff_read_header (psf, &comm_fmt))) + return error ; + + psf->next_chunk_iterator = aiff_next_chunk_iterator ; + psf->get_chunk_size = aiff_get_chunk_size ; + psf->get_chunk_data = aiff_get_chunk_data ; + + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + } ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if (psf->is_pipe) + return SFE_NO_PIPE_WRITE ; + + if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_AIFF) + return SFE_BAD_OPEN_FORMAT ; + + if (psf->file.mode == SFM_WRITE && (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)) + { if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL) + return SFE_MALLOC_FAILED ; + psf->peak_info->peak_loc = SF_PEAK_START ; + } ; + + if (psf->file.mode != SFM_RDWR || psf->filelength < 40) + { psf->filelength = 0 ; + psf->datalength = 0 ; + psf->dataoffset = 0 ; + psf->sf.frames = 0 ; + } ; + + psf->strings.flags = SF_STR_ALLOW_START | SF_STR_ALLOW_END ; + + if ((error = aiff_write_header (psf, SF_FALSE))) + return error ; + + psf->write_header = aiff_write_header ; + psf->set_chunk = aiff_set_chunk ; + } ; + + psf->command = aiff_command ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_PCM_U8 : + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_PCM_S8 : + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_32 : + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_ULAW : + error = ulaw_init (psf) ; + break ; + + case SF_FORMAT_ALAW : + error = alaw_init (psf) ; + break ; + + /* Lite remove start */ + case SF_FORMAT_FLOAT : + error = float32_init (psf) ; + break ; + + case SF_FORMAT_DOUBLE : + error = double64_init (psf) ; + break ; + + case SF_FORMAT_DWVW_12 : + if (psf->sf.frames > comm_fmt.numSampleFrames) + psf->sf.frames = comm_fmt.numSampleFrames ; + break ; + + case SF_FORMAT_DWVW_16 : + error = dwvw_init (psf, 16) ; + if (psf->sf.frames > comm_fmt.numSampleFrames) + psf->sf.frames = comm_fmt.numSampleFrames ; + break ; + + case SF_FORMAT_DWVW_24 : + error = dwvw_init (psf, 24) ; + if (psf->sf.frames > comm_fmt.numSampleFrames) + psf->sf.frames = comm_fmt.numSampleFrames ; + break ; + + case SF_FORMAT_DWVW_N : + if (psf->file.mode != SFM_READ) + { error = SFE_DWVW_BAD_BITWIDTH ; + break ; + } ; + if (comm_fmt.sampleSize >= 8 && comm_fmt.sampleSize < 24) + { error = dwvw_init (psf, comm_fmt.sampleSize) ; + if (psf->sf.frames > comm_fmt.numSampleFrames) + psf->sf.frames = comm_fmt.numSampleFrames ; + break ; + } ; + psf_log_printf (psf, "AIFC/DWVW : Bad bitwidth %d\n", comm_fmt.sampleSize) ; + error = SFE_DWVW_BAD_BITWIDTH ; + break ; + + case SF_FORMAT_IMA_ADPCM : + /* + ** IMA ADPCM encoded AIFF files always have a block length + ** of 34 which decodes to 64 samples. + */ + error = aiff_ima_init (psf, AIFC_IMA4_BLOCK_LEN, AIFC_IMA4_SAMPLES_PER_BLOCK) ; + break ; + /* Lite remove end */ + + case SF_FORMAT_GSM610 : + error = gsm610_init (psf) ; + if (psf->sf.frames > comm_fmt.numSampleFrames) + psf->sf.frames = comm_fmt.numSampleFrames ; + break ; + + default : return SFE_UNIMPLEMENTED ; + } ; + + if (psf->file.mode != SFM_WRITE && psf->sf.frames - comm_fmt.numSampleFrames != 0) + { psf_log_printf (psf, + "*** Frame count read from 'COMM' chunk (%u) not equal to frame count\n" + "*** calculated from length of 'SSND' chunk (%u).\n", + comm_fmt.numSampleFrames, (uint32_t) psf->sf.frames) ; + } ; + + return error ; +} /* aiff_open */ + +/*========================================================================================== +** Private functions. +*/ + +/* This function ought to check size */ +static uint32_t +marker_to_position (const MARK_ID_POS *m, uint16_t n, int marksize) +{ int i ; + + for (i = 0 ; i < marksize ; i++) + if (m [i].markerID == n) + return m [i].position ; + return 0 ; +} /* marker_to_position */ + +static int +aiff_read_header (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt) +{ SSND_CHUNK ssnd_fmt ; + AIFF_PRIVATE *paiff ; + BUF_UNION ubuf ; + uint32_t chunk_size = 0, FORMsize, SSNDsize, bytesread, mark_count = 0 ; + int k, found_chunk = 0, done = 0, error = 0 ; + char *cptr ; + int instr_found = 0, mark_found = 0 ; + + if (psf->filelength > SF_PLATFORM_S64 (0xffffffff)) + psf_log_printf (psf, "Warning : filelength > 0xffffffff. This is bad!!!!\n") ; + + if ((paiff = psf->container_data) == NULL) + return SFE_INTERNAL ; + + paiff->comm_offset = 0 ; + paiff->ssnd_offset = 0 ; + + /* Set position to start of file to begin reading header. */ + psf_binheader_readf (psf, "p", 0) ; + + memset (comm_fmt, 0, sizeof (COMM_CHUNK)) ; + + /* Until recently AIF* file were all BIG endian. */ + psf->endian = SF_ENDIAN_BIG ; + + /* AIFF files can apparently have their chunks in any order. However, they + ** must have a FORM chunk. Approach here is to read all the chunks one by + ** one and then check for the mandatory chunks at the end. + */ + while (! done) + { unsigned marker ; + size_t jump = chunk_size & 1 ; + + marker = chunk_size = 0 ; + psf_binheader_readf (psf, "Ejm4", jump, &marker, &chunk_size) ; + if (marker == 0) + { sf_count_t pos = psf_ftell (psf) ; + psf_log_printf (psf, "Have 0 marker at position %D (0x%x).\n", pos, pos) ; + break ; + } ; + + if (psf->file.mode == SFM_RDWR && (found_chunk & HAVE_SSND)) + return SFE_AIFF_RW_SSND_NOT_LAST ; + + psf_store_read_chunk_u32 (&psf->rchunks, marker, psf_ftell (psf), chunk_size) ; + + switch (marker) + { case FORM_MARKER : + if (found_chunk) + return SFE_AIFF_NO_FORM ; + + FORMsize = chunk_size ; + + found_chunk |= HAVE_FORM ; + psf_binheader_readf (psf, "m", &marker) ; + switch (marker) + { case AIFC_MARKER : + case AIFF_MARKER : + found_chunk |= (marker == AIFC_MARKER) ? (HAVE_AIFC | HAVE_AIFF) : HAVE_AIFF ; + break ; + default : + break ; + } ; + + if (psf->fileoffset > 0 && psf->filelength > FORMsize + 8) + { /* Set file length. */ + psf->filelength = FORMsize + 8 ; + psf_log_printf (psf, "FORM : %u\n %M\n", FORMsize, marker) ; + } + else if (FORMsize != psf->filelength - 2 * SIGNED_SIZEOF (chunk_size)) + { chunk_size = psf->filelength - 2 * sizeof (chunk_size) ; + psf_log_printf (psf, "FORM : %u (should be %u)\n %M\n", FORMsize, chunk_size, marker) ; + FORMsize = chunk_size ; + } + else + psf_log_printf (psf, "FORM : %u\n %M\n", FORMsize, marker) ; + /* Set this to 0, so we don't jump a byte when parsing the next marker. */ + chunk_size = 0 ; + break ; + + + case COMM_MARKER : + paiff->comm_offset = psf_ftell (psf) - 8 ; + chunk_size += chunk_size & 1 ; + comm_fmt->size = chunk_size ; + if ((error = aiff_read_comm_chunk (psf, comm_fmt)) != 0) + return error ; + + found_chunk |= HAVE_COMM ; + break ; + + case PEAK_MARKER : + /* Must have COMM chunk before PEAK chunk. */ + if ((found_chunk & (HAVE_FORM | HAVE_AIFF | HAVE_COMM)) != (HAVE_FORM | HAVE_AIFF | HAVE_COMM)) + return SFE_AIFF_PEAK_B4_COMM ; + + psf_log_printf (psf, "%M : %d\n", marker, chunk_size) ; + if (chunk_size != AIFF_PEAK_CHUNK_SIZE (psf->sf.channels)) + { psf_binheader_readf (psf, "j", chunk_size) ; + psf_log_printf (psf, "*** File PEAK chunk too big.\n") ; + return SFE_WAV_BAD_PEAK ; + } ; + + if (psf->peak_info) + { psf_log_printf (psf, "*** Found existing peak info, using last one.\n") ; + free (psf->peak_info) ; + psf->peak_info = NULL ; + } ; + if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL) + return SFE_MALLOC_FAILED ; + + /* read in rest of PEAK chunk. */ + psf_binheader_readf (psf, "E44", &(psf->peak_info->version), &(psf->peak_info->timestamp)) ; + + if (psf->peak_info->version != 1) + psf_log_printf (psf, " version : %d *** (should be version 1)\n", psf->peak_info->version) ; + else + psf_log_printf (psf, " version : %d\n", psf->peak_info->version) ; + + psf_log_printf (psf, " time stamp : %d\n", psf->peak_info->timestamp) ; + psf_log_printf (psf, " Ch Position Value\n") ; + + cptr = ubuf.cbuf ; + for (k = 0 ; k < psf->sf.channels ; k++) + { float value ; + uint32_t position ; + + psf_binheader_readf (psf, "Ef4", &value, &position) ; + psf->peak_info->peaks [k].value = value ; + psf->peak_info->peaks [k].position = position ; + + snprintf (cptr, sizeof (ubuf.scbuf), " %2d %-12" PRId64 " %g\n", + k, psf->peak_info->peaks [k].position, psf->peak_info->peaks [k].value) ; + cptr [sizeof (ubuf.scbuf) - 1] = 0 ; + psf_log_printf (psf, "%s", cptr) ; + } ; + + psf->peak_info->peak_loc = ((found_chunk & HAVE_SSND) == 0) ? SF_PEAK_START : SF_PEAK_END ; + break ; + + case SSND_MARKER : + if ((found_chunk & HAVE_AIFC) && (found_chunk & HAVE_FVER) == 0) + psf_log_printf (psf, "*** Valid AIFC files should have an FVER chunk.\n") ; + + paiff->ssnd_offset = psf_ftell (psf) - 8 ; + SSNDsize = chunk_size ; + psf_binheader_readf (psf, "E44", &(ssnd_fmt.offset), &(ssnd_fmt.blocksize)) ; + + psf->datalength = SSNDsize - sizeof (ssnd_fmt) ; + psf->dataoffset = psf_ftell (psf) ; + + if (psf->datalength > psf->filelength - psf->dataoffset || psf->datalength < 0) + { psf_log_printf (psf, " SSND : %u (should be %D)\n", SSNDsize, psf->filelength - psf->dataoffset + sizeof (SSND_CHUNK)) ; + psf->datalength = psf->filelength - psf->dataoffset ; + } + else + psf_log_printf (psf, " SSND : %u\n", SSNDsize) ; + + if (ssnd_fmt.offset == 0 || psf->dataoffset + ssnd_fmt.offset == ssnd_fmt.blocksize) + { psf_log_printf (psf, " Offset : %u\n", ssnd_fmt.offset) ; + psf_log_printf (psf, " Block Size : %u\n", ssnd_fmt.blocksize) ; + + psf->dataoffset += ssnd_fmt.offset ; + psf->datalength -= ssnd_fmt.offset ; + } + else + { psf_log_printf (psf, " Offset : %u\n", ssnd_fmt.offset) ; + psf_log_printf (psf, " Block Size : %u ???\n", ssnd_fmt.blocksize) ; + psf->dataoffset += ssnd_fmt.offset ; + psf->datalength -= ssnd_fmt.offset ; + } ; + + /* Only set dataend if there really is data at the end. */ + if (psf->datalength + psf->dataoffset < psf->filelength) + psf->dataend = psf->datalength + psf->dataoffset ; + + found_chunk |= HAVE_SSND ; + + if (! psf->sf.seekable) + break ; + + /* Seek to end of SSND chunk. */ + psf_fseek (psf, psf->dataoffset + psf->datalength, SEEK_SET) ; + break ; + + case c_MARKER : + if (chunk_size == 0) + break ; + if (chunk_size >= SIGNED_SIZEOF (ubuf.scbuf)) + { psf_log_printf (psf, " %M : %d (too big)\n", marker, chunk_size) ; + return SFE_INTERNAL ; + } ; + + cptr = ubuf.cbuf ; + psf_binheader_readf (psf, "b", cptr, chunk_size + (chunk_size & 1)) ; + cptr [chunk_size] = 0 ; + + psf_sanitize_string (cptr, chunk_size) ; + + psf_log_printf (psf, " %M : %s\n", marker, cptr) ; + psf_store_string (psf, SF_STR_COPYRIGHT, cptr) ; + chunk_size += chunk_size & 1 ; + break ; + + case AUTH_MARKER : + if (chunk_size == 0) + break ; + if (chunk_size >= SIGNED_SIZEOF (ubuf.scbuf) - 1) + { psf_log_printf (psf, " %M : %d (too big)\n", marker, chunk_size) ; + return SFE_INTERNAL ; + } ; + + cptr = ubuf.cbuf ; + psf_binheader_readf (psf, "b", cptr, chunk_size + (chunk_size & 1)) ; + cptr [chunk_size] = 0 ; + psf_log_printf (psf, " %M : %s\n", marker, cptr) ; + psf_store_string (psf, SF_STR_ARTIST, cptr) ; + chunk_size += chunk_size & 1 ; + break ; + + case COMT_MARKER : + { uint16_t count, id, len ; + uint32_t timestamp, bytes ; + + if (chunk_size == 0) + break ; + bytes = chunk_size ; + bytes -= psf_binheader_readf (psf, "E2", &count) ; + psf_log_printf (psf, " %M : %d\n count : %d\n", marker, chunk_size, count) ; + + for (k = 0 ; k < count ; k++) + { bytes -= psf_binheader_readf (psf, "E422", ×tamp, &id, &len) ; + psf_log_printf (psf, " time : 0x%x\n marker : %x\n length : %d\n", timestamp, id, len) ; + + if (len + 1 > SIGNED_SIZEOF (ubuf.scbuf)) + { psf_log_printf (psf, "\nError : string length (%d) too big.\n", len) ; + return SFE_INTERNAL ; + } ; + + cptr = ubuf.cbuf ; + bytes -= psf_binheader_readf (psf, "b", cptr, len) ; + cptr [len] = 0 ; + psf_log_printf (psf, " string : %s\n", cptr) ; + } ; + + if (bytes > 0) + psf_binheader_readf (psf, "j", bytes) ; + } ; + break ; + + case APPL_MARKER : + { unsigned appl_marker ; + + if (chunk_size == 0) + break ; + if (chunk_size >= SIGNED_SIZEOF (ubuf.scbuf) - 1) + { psf_log_printf (psf, " %M : %u (too big, skipping)\n", marker, chunk_size) ; + psf_binheader_readf (psf, "j", chunk_size + (chunk_size & 1)) ; + break ; + } ; + + if (chunk_size < 4) + { psf_log_printf (psf, " %M : %d (too small, skipping)\n", marker, chunk_size) ; + psf_binheader_readf (psf, "j", chunk_size + (chunk_size & 1)) ; + break ; + } ; + + cptr = ubuf.cbuf ; + psf_binheader_readf (psf, "mb", &appl_marker, cptr, chunk_size + (chunk_size & 1) - 4) ; + cptr [chunk_size] = 0 ; + + for (k = 0 ; k < (int) chunk_size ; k++) + if (! psf_isprint (cptr [k])) + { cptr [k] = 0 ; + break ; + } ; + + psf_log_printf (psf, " %M : %d\n AppSig : %M\n Name : %s\n", marker, chunk_size, appl_marker, cptr) ; + psf_store_string (psf, SF_STR_SOFTWARE, cptr) ; + chunk_size += chunk_size & 1 ; + } ; + break ; + + case NAME_MARKER : + if (chunk_size == 0) + break ; + if (chunk_size >= SIGNED_SIZEOF (ubuf.scbuf) - 2) + { psf_log_printf (psf, " %M : %d (too big)\n", marker, chunk_size) ; + return SFE_INTERNAL ; + } ; + + cptr = ubuf.cbuf ; + psf_binheader_readf (psf, "b", cptr, chunk_size + (chunk_size & 1)) ; + cptr [chunk_size] = 0 ; + psf_log_printf (psf, " %M : %s\n", marker, cptr) ; + psf_store_string (psf, SF_STR_TITLE, cptr) ; + chunk_size += chunk_size & 1 ; + break ; + + case ANNO_MARKER : + if (chunk_size == 0) + break ; + if (chunk_size >= SIGNED_SIZEOF (ubuf.scbuf) - 2) + { psf_log_printf (psf, " %M : %d (too big)\n", marker, chunk_size) ; + return SFE_INTERNAL ; + } ; + + cptr = ubuf.cbuf ; + psf_binheader_readf (psf, "b", cptr, chunk_size + (chunk_size & 1)) ; + cptr [chunk_size] = 0 ; + psf_log_printf (psf, " %M : %s\n", marker, cptr) ; + psf_store_string (psf, SF_STR_COMMENT, cptr) ; + chunk_size += chunk_size & 1 ; + break ; + + case INST_MARKER : + if (chunk_size != SIZEOF_INST_CHUNK) + { psf_log_printf (psf, " %M : %d (should be %d)\n", marker, chunk_size, SIZEOF_INST_CHUNK) ; + psf_binheader_readf (psf, "j", chunk_size) ; + break ; + } ; + psf_log_printf (psf, " %M : %d\n", marker, chunk_size) ; + { uint8_t bytes [6] ; + int16_t gain ; + + if (psf->instrument == NULL && (psf->instrument = psf_instrument_alloc ()) == NULL) + return SFE_MALLOC_FAILED ; + + psf_binheader_readf (psf, "b", bytes, 6) ; + psf_log_printf (psf, " Base Note : %u\n Detune : %u\n" + " Low Note : %u\n High Note : %u\n" + " Low Vel. : %u\n High Vel. : %u\n", + bytes [0], bytes [1], bytes [2], bytes [3], bytes [4], bytes [5]) ; + psf->instrument->basenote = bytes [0] ; + psf->instrument->detune = bytes [1] ; + psf->instrument->key_lo = bytes [2] ; + psf->instrument->key_hi = bytes [3] ; + psf->instrument->velocity_lo = bytes [4] ; + psf->instrument->velocity_hi = bytes [5] ; + psf_binheader_readf (psf, "E2", &gain) ; + psf->instrument->gain = gain ; + psf_log_printf (psf, " Gain (dB) : %d\n", gain) ; + } ; + { int16_t mode ; /* 0 - no loop, 1 - forward looping, 2 - backward looping */ + const char *loop_mode ; + uint16_t begin, end ; + + psf_binheader_readf (psf, "E222", &mode, &begin, &end) ; + loop_mode = get_loop_mode_str (mode) ; + mode = get_loop_mode (mode) ; + if (mode == SF_LOOP_NONE) + { psf->instrument->loop_count = 0 ; + psf->instrument->loops [0].mode = SF_LOOP_NONE ; + } + else + { psf->instrument->loop_count = 1 ; + psf->instrument->loops [0].mode = SF_LOOP_FORWARD ; + psf->instrument->loops [0].start = begin ; + psf->instrument->loops [0].end = end ; + psf->instrument->loops [0].count = 0 ; + } ; + psf_log_printf (psf, " Sustain\n mode : %d => %s\n begin : %u\n end : %u\n", + mode, loop_mode, begin, end) ; + psf_binheader_readf (psf, "E222", &mode, &begin, &end) ; + loop_mode = get_loop_mode_str (mode) ; + mode = get_loop_mode (mode) ; + if (mode == SF_LOOP_NONE) + psf->instrument->loops [1].mode = SF_LOOP_NONE ; + else + { psf->instrument->loop_count += 1 ; + psf->instrument->loops [1].mode = SF_LOOP_FORWARD ; + psf->instrument->loops [1].start = begin ; + psf->instrument->loops [1].end = end ; + psf->instrument->loops [1].count = 0 ; + } ; + psf_log_printf (psf, " Release\n mode : %d => %s\n begin : %u\n end : %u\n", + mode, loop_mode, begin, end) ; + } ; + instr_found++ ; + break ; + + case basc_MARKER : + psf_log_printf (psf, " basc : %u\n", chunk_size) ; + + if ((error = aiff_read_basc_chunk (psf, chunk_size))) + return error ; + break ; + + case MARK_MARKER : + psf_log_printf (psf, " %M : %d\n", marker, chunk_size) ; + { uint16_t mark_id, n = 0 ; + uint32_t position ; + + bytesread = psf_binheader_readf (psf, "E2", &n) ; + mark_count = n ; + psf_log_printf (psf, " Count : %u\n", mark_count) ; + if (paiff->markstr != NULL) + { psf_log_printf (psf, "*** Second MARK chunk found. Throwing away the first.\n") ; + free (paiff->markstr) ; + } ; + paiff->markstr = calloc (mark_count, sizeof (MARK_ID_POS)) ; + if (paiff->markstr == NULL) + return SFE_MALLOC_FAILED ; + + if (mark_count > 2500) /* 2500 is close to the largest number of cues possible because of block sizes */ + { psf_log_printf (psf, " More than 2500 markers, skipping!\n") ; + psf_binheader_readf (psf, "j", chunk_size - bytesread) ; + break ; + } ; + + if (psf->cues) + { free (psf->cues) ; + psf->cues = NULL ; + } ; + if ((psf->cues = psf_cues_alloc (mark_count)) == NULL) + return SFE_MALLOC_FAILED ; + + for (n = 0 ; n < mark_count && bytesread < chunk_size ; n++) + { uint32_t pstr_len ; + uint8_t ch ; + + bytesread += psf_binheader_readf (psf, "E241", &mark_id, &position, &ch) ; + psf_log_printf (psf, " Mark ID : %u\n Position : %u\n", mark_id, position) ; + + psf->cues->cue_points [n].indx = mark_id ; + psf->cues->cue_points [n].position = 0 ; + psf->cues->cue_points [n].fcc_chunk = MAKE_MARKER ('d', 'a', 't', 'a') ; /* always data */ + psf->cues->cue_points [n].chunk_start = 0 ; + psf->cues->cue_points [n].block_start = 0 ; + psf->cues->cue_points [n].sample_offset = position ; + + pstr_len = (ch & 1) ? ch : ch + 1 ; + + if (pstr_len < sizeof (ubuf.scbuf) - 1) + { bytesread += psf_binheader_readf (psf, "b", ubuf.scbuf, pstr_len) ; + ubuf.scbuf [pstr_len] = 0 ; + } + else + { uint32_t read_len = pstr_len - (sizeof (ubuf.scbuf) - 1) ; + bytesread += psf_binheader_readf (psf, "bj", ubuf.scbuf, read_len, pstr_len - read_len) ; + ubuf.scbuf [sizeof (ubuf.scbuf) - 1] = 0 ; + } + + psf_log_printf (psf, " Name : %s\n", ubuf.scbuf) ; + + psf_strlcpy (psf->cues->cue_points [n].name, sizeof (psf->cues->cue_points [n].name), ubuf.cbuf) ; + + paiff->markstr [n].markerID = mark_id ; + paiff->markstr [n].position = position ; + /* + ** TODO if ubuf.scbuf is equal to + ** either Beg_loop, Beg loop or beg loop and spam + ** if (psf->instrument == NULL && (psf->instrument = psf_instrument_alloc ()) == NULL) + ** return SFE_MALLOC_FAILED ; + */ + } ; + } ; + mark_found++ ; + psf_binheader_readf (psf, "j", chunk_size - bytesread) ; + break ; + + case FVER_MARKER : + found_chunk |= HAVE_FVER ; + /* Falls through. */ + + case SFX_MARKER : + psf_log_printf (psf, " %M : %d\n", marker, chunk_size) ; + psf_binheader_readf (psf, "j", chunk_size) ; + break ; + + case NONE_MARKER : + /* Fix for broken AIFC files with incorrect COMM chunk length. */ + chunk_size = (chunk_size >> 24) - 3 ; + psf_log_printf (psf, " %M : %d\n", marker, chunk_size) ; + psf_binheader_readf (psf, "j", make_size_t (chunk_size)) ; + break ; + + case CHAN_MARKER : + if (chunk_size < 12) + { psf_log_printf (psf, " %M : %d (should be >= 12)\n", marker, chunk_size) ; + psf_binheader_readf (psf, "j", chunk_size) ; + break ; + } + + psf_log_printf (psf, " %M : %d\n", marker, chunk_size) ; + + if ((error = aiff_read_chanmap (psf, chunk_size))) + return error ; + break ; + + default : + if (chunk_size >= 0xffff0000) + { done = SF_TRUE ; + psf_log_printf (psf, "*** Unknown chunk marker (%X) at position %D with length %u. Exiting parser.\n", marker, psf_ftell (psf) - 8, chunk_size) ; + break ; + } ; + + if (psf_isprint ((marker >> 24) & 0xFF) && psf_isprint ((marker >> 16) & 0xFF) + && psf_isprint ((marker >> 8) & 0xFF) && psf_isprint (marker & 0xFF)) + { psf_log_printf (psf, " %M : %u (unknown marker)\n", marker, chunk_size) ; + + psf_binheader_readf (psf, "j", chunk_size) ; + break ; + } ; + + if (psf_ftell (psf) & 0x03) + { psf_log_printf (psf, " Unknown chunk marker at position %D. Resynching.\n", psf_ftell (psf) - 8) ; + psf_binheader_readf (psf, "j", -3) ; + break ; + } ; + psf_log_printf (psf, "*** Unknown chunk marker %X at position %D. Exiting parser.\n", marker, psf_ftell (psf)) ; + done = SF_TRUE ; + break ; + } ; /* switch (marker) */ + + if (chunk_size >= psf->filelength) + { psf_log_printf (psf, "*** Chunk size %u > file length %D. Exiting parser.\n", chunk_size, psf->filelength) ; + break ; + } ; + + if ((! psf->sf.seekable) && (found_chunk & HAVE_SSND)) + break ; + + if (psf_ftell (psf) >= psf->filelength - (2 * SIGNED_SIZEOF (int32_t))) + break ; + } ; /* while (1) */ + + if (instr_found && mark_found) + { int ji, str_index ; + /* Next loop will convert markers to loop positions for internal handling */ + for (ji = 0 ; ji < psf->instrument->loop_count ; ji ++) + { if (ji < ARRAY_LEN (psf->instrument->loops)) + { psf->instrument->loops [ji].start = marker_to_position (paiff->markstr, psf->instrument->loops [ji].start, mark_count) ; + psf->instrument->loops [ji].end = marker_to_position (paiff->markstr, psf->instrument->loops [ji].end, mark_count) ; + psf->instrument->loops [ji].mode = SF_LOOP_FORWARD ; + } ; + } ; + + /* The markers that correspond to loop positions can now be removed from cues struct */ + if (psf->cues->cue_count > (uint32_t) (psf->instrument->loop_count * 2)) + { uint32_t j ; + + for (j = 0 ; j < psf->cues->cue_count - (uint32_t) (psf->instrument->loop_count * 2) ; j ++) + { /* This simply copies the information in cues above loop positions and writes it at current count instead */ + psf->cues->cue_points [j].indx = psf->cues->cue_points [j + psf->instrument->loop_count * 2].indx ; + psf->cues->cue_points [j].position = psf->cues->cue_points [j + psf->instrument->loop_count * 2].position ; + psf->cues->cue_points [j].fcc_chunk = psf->cues->cue_points [j + psf->instrument->loop_count * 2].fcc_chunk ; + psf->cues->cue_points [j].chunk_start = psf->cues->cue_points [j + psf->instrument->loop_count * 2].chunk_start ; + psf->cues->cue_points [j].block_start = psf->cues->cue_points [j + psf->instrument->loop_count * 2].block_start ; + psf->cues->cue_points [j].sample_offset = psf->cues->cue_points [j + psf->instrument->loop_count * 2].sample_offset ; + for (str_index = 0 ; str_index < 256 ; str_index++) + psf->cues->cue_points [j].name [str_index] = psf->cues->cue_points [j + psf->instrument->loop_count * 2].name [str_index] ; + } ; + psf->cues->cue_count -= psf->instrument->loop_count * 2 ; + } else + { /* All the cues were in fact loop positions so we can actually remove the cues altogether */ + free (psf->cues) ; + psf->cues = NULL ; + } + } ; + + if (psf->sf.channels < 1) + return SFE_CHANNEL_COUNT_ZERO ; + + if (psf->sf.channels > SF_MAX_CHANNELS) + return SFE_CHANNEL_COUNT ; + + if (! (found_chunk & HAVE_FORM)) + return SFE_AIFF_NO_FORM ; + + if (! (found_chunk & HAVE_AIFF)) + return SFE_AIFF_COMM_NO_FORM ; + + if (! (found_chunk & HAVE_COMM)) + return SFE_AIFF_SSND_NO_COMM ; + + if (! psf->dataoffset) + return SFE_AIFF_NO_DATA ; + + return 0 ; +} /* aiff_read_header */ + +static int +aiff_close (SF_PRIVATE *psf) +{ AIFF_PRIVATE *paiff = psf->container_data ; + + if (paiff != NULL && paiff->markstr != NULL) + { free (paiff->markstr) ; + paiff->markstr = NULL ; + } ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { aiff_write_tailer (psf) ; + aiff_write_header (psf, SF_TRUE) ; + } ; + + return 0 ; +} /* aiff_close */ + +static int +aiff_read_comm_chunk (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt) +{ BUF_UNION ubuf ; + int subformat, samplerate ; + + ubuf.scbuf [0] = 0 ; + + /* The COMM chunk has an int aligned to an odd word boundary. Some + ** procesors are not able to deal with this (ie bus fault) so we have + ** to take special care. + */ + + psf_binheader_readf (psf, "E242b", &(comm_fmt->numChannels), &(comm_fmt->numSampleFrames), + &(comm_fmt->sampleSize), &(comm_fmt->sampleRate), SIGNED_SIZEOF (comm_fmt->sampleRate)) ; + + if (comm_fmt->size > 0x10000 && (comm_fmt->size & 0xffff) == 0) + { psf_log_printf (psf, " COMM : %d (0x%x) *** should be ", comm_fmt->size, comm_fmt->size) ; + comm_fmt->size = ENDSWAP_32 (comm_fmt->size) ; + psf_log_printf (psf, "%d (0x%x)\n", comm_fmt->size, comm_fmt->size) ; + } + else + psf_log_printf (psf, " COMM : %d\n", comm_fmt->size) ; + + if (comm_fmt->size == SIZEOF_AIFF_COMM) + comm_fmt->encoding = NONE_MARKER ; + else if (comm_fmt->size == SIZEOF_AIFC_COMM_MIN) + psf_binheader_readf (psf, "Em", &(comm_fmt->encoding)) ; + else if (comm_fmt->size >= SIZEOF_AIFC_COMM) + { uint8_t encoding_len ; + unsigned read_len ; + + psf_binheader_readf (psf, "Em1", &(comm_fmt->encoding), &encoding_len) ; + + comm_fmt->size = SF_MIN (sizeof (ubuf.scbuf), make_size_t (comm_fmt->size)) ; + memset (ubuf.scbuf, 0, comm_fmt->size) ; + read_len = comm_fmt->size - SIZEOF_AIFC_COMM + 1 ; + psf_binheader_readf (psf, "b", ubuf.scbuf, read_len) ; + ubuf.scbuf [read_len + 1] = 0 ; + } ; + + samplerate = tenbytefloat2int (comm_fmt->sampleRate) ; + + psf_log_printf (psf, " Sample Rate : %d\n", samplerate) ; + psf_log_printf (psf, " Frames : %u%s\n", comm_fmt->numSampleFrames, (comm_fmt->numSampleFrames == 0 && psf->filelength > 104) ? " (Should not be 0)" : "") ; + + if (comm_fmt->numChannels < 1 || comm_fmt->numChannels > SF_MAX_CHANNELS) + { psf_log_printf (psf, " Channels : %d (should be >= 1 and < %d)\n", comm_fmt->numChannels, SF_MAX_CHANNELS) ; + return SFE_CHANNEL_COUNT_BAD ; + } ; + + psf_log_printf (psf, " Channels : %d\n", comm_fmt->numChannels) ; + + /* Found some broken 'fl32' files with comm.samplesize == 16. Fix it here. */ + if ((comm_fmt->encoding == fl32_MARKER || comm_fmt->encoding == FL32_MARKER) && comm_fmt->sampleSize != 32) + { psf_log_printf (psf, " Sample Size : %d (should be 32)\n", comm_fmt->sampleSize) ; + comm_fmt->sampleSize = 32 ; + } + else if ((comm_fmt->encoding == fl64_MARKER || comm_fmt->encoding == FL64_MARKER) && comm_fmt->sampleSize != 64) + { psf_log_printf (psf, " Sample Size : %d (should be 64)\n", comm_fmt->sampleSize) ; + comm_fmt->sampleSize = 64 ; + } + else + psf_log_printf (psf, " Sample Size : %d\n", comm_fmt->sampleSize) ; + + subformat = s_bitwidth_to_subformat (comm_fmt->sampleSize) ; + + psf->sf.samplerate = samplerate ; + psf->sf.frames = comm_fmt->numSampleFrames ; + psf->sf.channels = comm_fmt->numChannels ; + psf->bytewidth = BITWIDTH2BYTES (comm_fmt->sampleSize) ; + + psf->endian = SF_ENDIAN_BIG ; + + switch (comm_fmt->encoding) + { case NONE_MARKER : + psf->sf.format = (SF_FORMAT_AIFF | subformat) ; + break ; + + case twos_MARKER : + case in24_MARKER : + case in32_MARKER : + psf->sf.format = (SF_ENDIAN_BIG | SF_FORMAT_AIFF | subformat) ; + break ; + + case sowt_MARKER : + case ni24_MARKER : + case ni32_MARKER : + psf->endian = SF_ENDIAN_LITTLE ; + psf->sf.format = (SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | subformat) ; + break ; + + case fl32_MARKER : + case FL32_MARKER : + psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_FLOAT) ; + break ; + + case ulaw_MARKER : + case ULAW_MARKER : + psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_ULAW) ; + break ; + + case alaw_MARKER : + case ALAW_MARKER : + psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_ALAW) ; + break ; + + case fl64_MARKER : + case FL64_MARKER : + psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_DOUBLE) ; + break ; + + case raw_MARKER : + psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_PCM_U8) ; + break ; + + case DWVW_MARKER : + psf->sf.format = SF_FORMAT_AIFF ; + switch (comm_fmt->sampleSize) + { case 12 : + psf->sf.format |= SF_FORMAT_DWVW_12 ; + break ; + case 16 : + psf->sf.format |= SF_FORMAT_DWVW_16 ; + break ; + case 24 : + psf->sf.format |= SF_FORMAT_DWVW_24 ; + break ; + + default : + psf->sf.format |= SF_FORMAT_DWVW_N ; + break ; + } ; + break ; + + case GSM_MARKER : + psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_GSM610) ; + break ; + + + case ima4_MARKER : + psf->endian = SF_ENDIAN_BIG ; + psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_IMA_ADPCM) ; + break ; + + default : + psf_log_printf (psf, "AIFC : Unimplemented format : %M\n", comm_fmt->encoding) ; + return SFE_UNIMPLEMENTED ; + } ; + + if (! ubuf.scbuf [0]) + psf_log_printf (psf, " Encoding : %M\n", comm_fmt->encoding) ; + else + psf_log_printf (psf, " Encoding : %M => %s\n", comm_fmt->encoding, ubuf.scbuf) ; + + return 0 ; +} /* aiff_read_comm_chunk */ + + +/*========================================================================================== +*/ + +static void +aiff_rewrite_header (SF_PRIVATE *psf) +{ + /* Assuming here that the header has already been written and just + ** needs to be corrected for new data length. That means that we + ** only change the length fields of the FORM and SSND chunks ; + ** everything else can be skipped over. + */ + int k, ch, comm_size, comm_frames ; + + psf_fseek (psf, 0, SEEK_SET) ; + psf_fread (psf->header.ptr, psf->dataoffset, 1, psf) ; + + psf->header.indx = 0 ; + + /* FORM chunk. */ + psf_binheader_writef (psf, "Etm8", BHWm (FORM_MARKER), BHW8 (psf->filelength - 8)) ; + + /* COMM chunk. */ + if ((k = psf_find_read_chunk_m32 (&psf->rchunks, COMM_MARKER)) >= 0) + { psf->header.indx = psf->rchunks.chunks [k].offset - 8 ; + comm_frames = psf->sf.frames ; + comm_size = psf->rchunks.chunks [k].len ; + psf_binheader_writef (psf, "Em42t4", BHWm (COMM_MARKER), BHW4 (comm_size), BHW2 (psf->sf.channels), BHW4 (comm_frames)) ; + } ; + + /* PEAK chunk. */ + if ((k = psf_find_read_chunk_m32 (&psf->rchunks, PEAK_MARKER)) >= 0) + { psf->header.indx = psf->rchunks.chunks [k].offset - 8 ; + psf_binheader_writef (psf, "Em4", BHWm (PEAK_MARKER), BHW4 (AIFF_PEAK_CHUNK_SIZE (psf->sf.channels))) ; + psf_binheader_writef (psf, "E44", BHW4 (1), BHW4 (time (NULL))) ; + for (ch = 0 ; ch < psf->sf.channels ; ch++) + psf_binheader_writef (psf, "Eft8", BHWf ((float) psf->peak_info->peaks [ch].value), BHW8 (psf->peak_info->peaks [ch].position)) ; + } ; + + + /* SSND chunk. */ + if ((k = psf_find_read_chunk_m32 (&psf->rchunks, SSND_MARKER)) >= 0) + { psf->header.indx = psf->rchunks.chunks [k].offset - 8 ; + psf_binheader_writef (psf, "Etm8", BHWm (SSND_MARKER), BHW8 (psf->datalength + SIZEOF_SSND_CHUNK)) ; + } ; + + /* Header mangling complete so write it out. */ + psf_fseek (psf, 0, SEEK_SET) ; + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + return ; +} /* aiff_rewrite_header */ + +static int +aiff_write_header (SF_PRIVATE *psf, int calc_length) +{ sf_count_t current ; + AIFF_PRIVATE *paiff ; + uint8_t comm_sample_rate [10], comm_zero_bytes [2] = { 0, 0 } ; + uint32_t comm_type, comm_size, comm_encoding, comm_frames = 0, uk ; + int k, endian, has_data = SF_FALSE ; + int16_t bit_width ; + + if ((paiff = psf->container_data) == NULL) + return SFE_INTERNAL ; + + current = psf_ftell (psf) ; + + if (current > psf->dataoffset) + has_data = SF_TRUE ; + + if (calc_length) + { psf->filelength = psf_get_filelen (psf) ; + + psf->datalength = psf->filelength - psf->dataoffset ; + if (psf->dataend) + psf->datalength -= psf->filelength - psf->dataend ; + + if (psf->bytewidth > 0) + psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; + } ; + + if (psf->file.mode == SFM_RDWR && psf->dataoffset > 0 && psf->rchunks.count > 0) + { aiff_rewrite_header (psf) ; + if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + return 0 ; + } ; + + endian = SF_ENDIAN (psf->sf.format) ; + if (CPU_IS_LITTLE_ENDIAN && endian == SF_ENDIAN_CPU) + endian = SF_ENDIAN_LITTLE ; + + /* Standard value here. */ + bit_width = psf->bytewidth * 8 ; + comm_frames = (psf->sf.frames > 0xFFFFFFFF) ? 0xFFFFFFFF : psf->sf.frames ; + + switch (SF_CODEC (psf->sf.format) | endian) + { case SF_FORMAT_PCM_S8 | SF_ENDIAN_BIG : + psf->endian = SF_ENDIAN_BIG ; + comm_type = AIFC_MARKER ; + comm_size = SIZEOF_AIFC_COMM ; + comm_encoding = twos_MARKER ; + break ; + + case SF_FORMAT_PCM_S8 | SF_ENDIAN_LITTLE : + psf->endian = SF_ENDIAN_LITTLE ; + comm_type = AIFC_MARKER ; + comm_size = SIZEOF_AIFC_COMM ; + comm_encoding = sowt_MARKER ; + break ; + + case SF_FORMAT_PCM_16 | SF_ENDIAN_BIG : + psf->endian = SF_ENDIAN_BIG ; + comm_type = AIFC_MARKER ; + comm_size = SIZEOF_AIFC_COMM ; + comm_encoding = twos_MARKER ; + break ; + + case SF_FORMAT_PCM_16 | SF_ENDIAN_LITTLE : + psf->endian = SF_ENDIAN_LITTLE ; + comm_type = AIFC_MARKER ; + comm_size = SIZEOF_AIFC_COMM ; + comm_encoding = sowt_MARKER ; + break ; + + case SF_FORMAT_PCM_24 | SF_ENDIAN_BIG : + psf->endian = SF_ENDIAN_BIG ; + comm_type = AIFC_MARKER ; + comm_size = SIZEOF_AIFC_COMM ; + comm_encoding = in24_MARKER ; + break ; + + case SF_FORMAT_PCM_24 | SF_ENDIAN_LITTLE : + psf->endian = SF_ENDIAN_LITTLE ; + comm_type = AIFC_MARKER ; + comm_size = SIZEOF_AIFC_COMM ; + comm_encoding = ni24_MARKER ; + break ; + + case SF_FORMAT_PCM_32 | SF_ENDIAN_BIG : + psf->endian = SF_ENDIAN_BIG ; + comm_type = AIFC_MARKER ; + comm_size = SIZEOF_AIFC_COMM ; + comm_encoding = in32_MARKER ; + break ; + + case SF_FORMAT_PCM_32 | SF_ENDIAN_LITTLE : + psf->endian = SF_ENDIAN_LITTLE ; + comm_type = AIFC_MARKER ; + comm_size = SIZEOF_AIFC_COMM ; + comm_encoding = ni32_MARKER ; + break ; + + case SF_FORMAT_PCM_S8 : /* SF_ENDIAN_FILE */ + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_32 : + psf->endian = SF_ENDIAN_BIG ; + comm_type = AIFF_MARKER ; + comm_size = SIZEOF_AIFF_COMM ; + comm_encoding = 0 ; + break ; + + case SF_FORMAT_FLOAT : /* Big endian floating point. */ + psf->endian = SF_ENDIAN_BIG ; + comm_type = AIFC_MARKER ; + comm_size = SIZEOF_AIFC_COMM ; + comm_encoding = FL32_MARKER ; /* Use 'FL32' because its easier to read. */ + break ; + + case SF_FORMAT_DOUBLE : /* Big endian double precision floating point. */ + psf->endian = SF_ENDIAN_BIG ; + comm_type = AIFC_MARKER ; + comm_size = SIZEOF_AIFC_COMM ; + comm_encoding = FL64_MARKER ; /* Use 'FL64' because its easier to read. */ + break ; + + case SF_FORMAT_ULAW : + psf->endian = SF_ENDIAN_BIG ; + comm_type = AIFC_MARKER ; + comm_size = SIZEOF_AIFC_COMM ; + comm_encoding = ulaw_MARKER ; + break ; + + case SF_FORMAT_ALAW : + psf->endian = SF_ENDIAN_BIG ; + comm_type = AIFC_MARKER ; + comm_size = SIZEOF_AIFC_COMM ; + comm_encoding = alaw_MARKER ; + break ; + + case SF_FORMAT_PCM_U8 : + psf->endian = SF_ENDIAN_BIG ; + comm_type = AIFC_MARKER ; + comm_size = SIZEOF_AIFC_COMM ; + comm_encoding = raw_MARKER ; + break ; + + case SF_FORMAT_DWVW_12 : + psf->endian = SF_ENDIAN_BIG ; + comm_type = AIFC_MARKER ; + comm_size = SIZEOF_AIFC_COMM ; + comm_encoding = DWVW_MARKER ; + + /* Override standard value here.*/ + bit_width = 12 ; + break ; + + case SF_FORMAT_DWVW_16 : + psf->endian = SF_ENDIAN_BIG ; + comm_type = AIFC_MARKER ; + comm_size = SIZEOF_AIFC_COMM ; + comm_encoding = DWVW_MARKER ; + + /* Override standard value here.*/ + bit_width = 16 ; + break ; + + case SF_FORMAT_DWVW_24 : + psf->endian = SF_ENDIAN_BIG ; + comm_type = AIFC_MARKER ; + comm_size = SIZEOF_AIFC_COMM ; + comm_encoding = DWVW_MARKER ; + + /* Override standard value here.*/ + bit_width = 24 ; + break ; + + case SF_FORMAT_GSM610 : + psf->endian = SF_ENDIAN_BIG ; + comm_type = AIFC_MARKER ; + comm_size = SIZEOF_AIFC_COMM ; + comm_encoding = GSM_MARKER ; + + /* Override standard value here.*/ + bit_width = 16 ; + break ; + + case SF_FORMAT_IMA_ADPCM : + psf->endian = SF_ENDIAN_BIG ; + comm_type = AIFC_MARKER ; + comm_size = SIZEOF_AIFC_COMM ; + comm_encoding = ima4_MARKER ; + + /* Override standard value here.*/ + bit_width = 16 ; + comm_frames = psf->sf.frames / AIFC_IMA4_SAMPLES_PER_BLOCK ; + break ; + + default : return SFE_BAD_OPEN_FORMAT ; + } ; + + /* Reset the current header length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + psf_fseek (psf, 0, SEEK_SET) ; + + psf_binheader_writef (psf, "Etm8", BHWm (FORM_MARKER), BHW8 (psf->filelength - 8)) ; + + /* Write AIFF/AIFC marker and COM chunk. */ + if (comm_type == AIFC_MARKER) + /* AIFC must have an FVER chunk. */ + psf_binheader_writef (psf, "Emm44", BHWm (comm_type), BHWm (FVER_MARKER), BHW4 (4), BHW4 (0xA2805140)) ; + else + psf_binheader_writef (psf, "Em", BHWm (comm_type)) ; + + paiff->comm_offset = psf->header.indx - 8 ; + + memset (comm_sample_rate, 0, sizeof (comm_sample_rate)) ; + uint2tenbytefloat (psf->sf.samplerate, comm_sample_rate) ; + + psf_binheader_writef (psf, "Em42t42", BHWm (COMM_MARKER), BHW4 (comm_size), BHW2 (psf->sf.channels), BHW4 (comm_frames), BHW2 (bit_width)) ; + psf_binheader_writef (psf, "b", BHWv (comm_sample_rate), BHWz (sizeof (comm_sample_rate))) ; + + /* AIFC chunks have some extra data. */ + if (comm_type == AIFC_MARKER) + psf_binheader_writef (psf, "mb", BHWm (comm_encoding), BHWv (comm_zero_bytes), BHWz (sizeof (comm_zero_bytes))) ; + + if (psf->channel_map && paiff->chanmap_tag) + psf_binheader_writef (psf, "Em4444", BHWm (CHAN_MARKER), BHW4 (12), BHW4 (paiff->chanmap_tag), BHW4 (0), BHW4 (0)) ; + + /* Check if there's a INST chunk to write */ + if (psf->instrument != NULL && psf->cues != NULL) + { /* Huge chunk of code removed here because it had egregious errors that were + ** not detected by either the compiler or the tests. It was found when updating + ** the way psf_binheader_writef works. + */ + } + else if (psf->instrument == NULL && psf->cues != NULL) + { /* There are cues but no loops */ + uint32_t idx ; + int totalStringLength = 0, stringLength ; + + /* Here we count how many bytes will the pascal strings need */ + for (idx = 0 ; idx < psf->cues->cue_count ; idx++) + { stringLength = strlen (psf->cues->cue_points [idx].name) + 1 ; /* We'll count the first byte also of every pascal string */ + totalStringLength += stringLength + (stringLength % 2 == 0 ? 0 : 1) ; + } ; + + psf_binheader_writef (psf, "Em42", + BHWm (MARK_MARKER), BHW4 (2 + psf->cues->cue_count * (2 + 4) + totalStringLength), BHW2 (psf->cues->cue_count)) ; + + for (idx = 0 ; idx < psf->cues->cue_count ; idx++) + psf_binheader_writef (psf, "E24p", BHW2 (psf->cues->cue_points [idx].indx), BHW4 (psf->cues->cue_points [idx].sample_offset), BHWp (psf->cues->cue_points [idx].name)) ; + } ; + + if (psf->strings.flags & SF_STR_LOCATE_START) + aiff_write_strings (psf, SF_STR_LOCATE_START) ; + + if (psf->peak_info != NULL && psf->peak_info->peak_loc == SF_PEAK_START) + { psf_binheader_writef (psf, "Em4", BHWm (PEAK_MARKER), BHW4 (AIFF_PEAK_CHUNK_SIZE (psf->sf.channels))) ; + psf_binheader_writef (psf, "E44", BHW4 (1), BHW4 (time (NULL))) ; + for (k = 0 ; k < psf->sf.channels ; k++) + psf_binheader_writef (psf, "Eft8", BHWf ((float) psf->peak_info->peaks [k].value), BHW8 (psf->peak_info->peaks [k].position)) ; + } ; + + /* Write custom headers. */ + for (uk = 0 ; uk < psf->wchunks.used ; uk++) + psf_binheader_writef (psf, "Em4b", BHWm (psf->wchunks.chunks [uk].mark32), BHW4 (psf->wchunks.chunks [uk].len), BHWv (psf->wchunks.chunks [uk].data), BHWz (psf->wchunks.chunks [uk].len)) ; + + /* Write SSND chunk. */ + paiff->ssnd_offset = psf->header.indx ; + psf_binheader_writef (psf, "Etm844", BHWm (SSND_MARKER), BHW8 (psf->datalength + SIZEOF_SSND_CHUNK), BHW4 (0), BHW4 (0)) ; + + /* Header construction complete so write it out. */ + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + if (psf->error) + return psf->error ; + + if (has_data && psf->dataoffset != psf->header.indx) + return psf->error = SFE_INTERNAL ; + + psf->dataoffset = psf->header.indx ; + + if (! has_data) + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + else if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + + return psf->error ; +} /* aiff_write_header */ + +static int +aiff_write_tailer (SF_PRIVATE *psf) +{ int k ; + + /* Reset the current header length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + + psf->dataend = psf_fseek (psf, 0, SEEK_END) ; + + /* Make sure tailer data starts at even byte offset. Pad if necessary. */ + if (psf->dataend % 2 == 1) + { psf_fwrite (psf->header.ptr, 1, 1, psf) ; + psf->dataend ++ ; + } ; + + if (psf->peak_info != NULL && psf->peak_info->peak_loc == SF_PEAK_END) + { psf_binheader_writef (psf, "Em4", BHWm (PEAK_MARKER), BHW4 (AIFF_PEAK_CHUNK_SIZE (psf->sf.channels))) ; + psf_binheader_writef (psf, "E44", BHW4 (1), BHW4 (time (NULL))) ; + for (k = 0 ; k < psf->sf.channels ; k++) + psf_binheader_writef (psf, "Eft8", BHWf ((float) psf->peak_info->peaks [k].value), BHW8 (psf->peak_info->peaks [k].position)) ; + } ; + + if (psf->strings.flags & SF_STR_LOCATE_END) + aiff_write_strings (psf, SF_STR_LOCATE_END) ; + + /* Write the tailer. */ + if (psf->header.indx > 0) + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + return 0 ; +} /* aiff_write_tailer */ + +static void +aiff_write_strings (SF_PRIVATE *psf, int location) +{ int k, slen ; + + for (k = 0 ; k < SF_MAX_STRINGS ; k++) + { if (psf->strings.data [k].type == 0) + break ; + + if (psf->strings.data [k].flags != location) + continue ; + + switch (psf->strings.data [k].type) + { case SF_STR_SOFTWARE : + slen = strlen (psf->strings.storage + psf->strings.data [k].offset) ; + psf_binheader_writef (psf, "Em4mb", BHWm (APPL_MARKER), BHW4 (slen + 4), BHWm (m3ga_MARKER), BHWv (psf->strings.storage + psf->strings.data [k].offset), BHWz (slen + (slen & 1))) ; + break ; + + case SF_STR_TITLE : + psf_binheader_writef (psf, "EmS", BHWm (NAME_MARKER), BHWS (psf->strings.storage + psf->strings.data [k].offset)) ; + break ; + + case SF_STR_COPYRIGHT : + psf_binheader_writef (psf, "EmS", BHWm (c_MARKER), BHWS (psf->strings.storage + psf->strings.data [k].offset)) ; + break ; + + case SF_STR_ARTIST : + psf_binheader_writef (psf, "EmS", BHWm (AUTH_MARKER), BHWS (psf->strings.storage + psf->strings.data [k].offset)) ; + break ; + + case SF_STR_COMMENT : + psf_binheader_writef (psf, "EmS", BHWm (ANNO_MARKER), BHWS (psf->strings.storage + psf->strings.data [k].offset)) ; + break ; + + /* + case SF_STR_DATE : + psf_binheader_writef (psf, "Ems", BHWm (ICRD_MARKER), BHWs (psf->strings.data [k].str)) ; + break ; + */ + } ; + } ; + + return ; +} /* aiff_write_strings */ + +static int +aiff_command (SF_PRIVATE * psf, int command, void * UNUSED (data), int UNUSED (datasize)) +{ AIFF_PRIVATE *paiff ; + + if ((paiff = psf->container_data) == NULL) + return SFE_INTERNAL ; + + switch (command) + { case SFC_SET_CHANNEL_MAP_INFO : + paiff->chanmap_tag = aiff_caf_find_channel_layout_tag (psf->channel_map, psf->sf.channels) ; + return (paiff->chanmap_tag != 0) ; + + default : + break ; + } ; + + return 0 ; +} /* aiff_command */ + +static const char* +get_loop_mode_str (int16_t mode) +{ switch (mode) + { case 0 : return "none" ; + case 1 : return "forward" ; + case 2 : return "backward" ; + } ; + + return "*** unknown" ; +} /* get_loop_mode_str */ + +static int16_t +get_loop_mode (int16_t mode) +{ switch (mode) + { case 0 : return SF_LOOP_NONE ; + case 1 : return SF_LOOP_FORWARD ; + case 2 : return SF_LOOP_BACKWARD ; + } ; + + return SF_LOOP_NONE ; +} /* get_loop_mode */ + +/*========================================================================================== +** Rough hack at converting from 80 bit IEEE float in AIFF header to an int and +** back again. It assumes that all sample rates are between 1 and 800MHz, which +** should be OK as other sound file formats use a 32 bit integer to store sample +** rate. +** There is another (probably better) version in the source code to the SoX but it +** has a copyright which probably prevents it from being allowable as GPL/LGPL. +*/ + +static int +tenbytefloat2int (uint8_t *bytes) +{ int val = 3 ; + + if (bytes [0] & 0x80) /* Negative number. */ + return 0 ; + + if (bytes [0] <= 0x3F) /* Less than 1. */ + return 1 ; + + if (bytes [0] > 0x40) /* Way too big. */ + return 0x4000000 ; + + if (bytes [0] == 0x40 && bytes [1] > 0x1C) /* Too big. */ + return 800000000 ; + + /* Ok, can handle it. */ + + val = (bytes [2] << 23) | (bytes [3] << 15) | (bytes [4] << 7) | (bytes [5] >> 1) ; + + val >>= (29 - bytes [1]) ; + + return val ; +} /* tenbytefloat2int */ + +static void +uint2tenbytefloat (uint32_t num, uint8_t *bytes) +{ uint32_t mask = 0x40000000 ; + int count ; + + if (num <= 1) + { bytes [0] = 0x3F ; + bytes [1] = 0xFF ; + bytes [2] = 0x80 ; + return ; + } ; + + bytes [0] = 0x40 ; + + if (num >= mask) + { bytes [1] = 0x1D ; + return ; + } ; + + for (count = 0 ; count < 32 ; count ++) + { if (num & mask) + break ; + mask >>= 1 ; + } ; + + num = count < 31 ? num << (count + 1) : 0 ; + bytes [1] = 29 - count ; + bytes [2] = (num >> 24) & 0xFF ; + bytes [3] = (num >> 16) & 0xFF ; + bytes [4] = (num >> 8) & 0xFF ; + bytes [5] = num & 0xFF ; + +} /* uint2tenbytefloat */ + +static int +aiff_read_basc_chunk (SF_PRIVATE * psf, int datasize) +{ const char * type_str ; + basc_CHUNK bc ; + int count ; + + count = psf_binheader_readf (psf, "E442", &bc.version, &bc.numBeats, &bc.rootNote) ; + count += psf_binheader_readf (psf, "E222", &bc.scaleType, &bc.sigNumerator, &bc.sigDenominator) ; + count += psf_binheader_readf (psf, "E2j", &bc.loopType, datasize - sizeof (bc)) ; + + psf_log_printf (psf, " Version ? : %u\n Num Beats : %u\n Root Note : 0x%x\n", + bc.version, bc.numBeats, bc.rootNote) ; + + switch (bc.scaleType) + { case basc_SCALE_MINOR : + type_str = "MINOR" ; + break ; + case basc_SCALE_MAJOR : + type_str = "MAJOR" ; + break ; + case basc_SCALE_NEITHER : + type_str = "NEITHER" ; + break ; + case basc_SCALE_BOTH : + type_str = "BOTH" ; + break ; + default : + type_str = "!!WRONG!!" ; + break ; + } ; + + psf_log_printf (psf, " ScaleType : 0x%x (%s)\n", bc.scaleType, type_str) ; + psf_log_printf (psf, " Time Sig : %d/%d\n", bc.sigNumerator, bc.sigDenominator) ; + + switch (bc.loopType) + { case basc_TYPE_ONE_SHOT : + type_str = "One Shot" ; + break ; + case basc_TYPE_LOOP : + type_str = "Loop" ; + break ; + default: + type_str = "!!WRONG!!" ; + break ; + } ; + + psf_log_printf (psf, " Loop Type : 0x%x (%s)\n", bc.loopType, type_str) ; + + if (psf->loop_info) + { psf_log_printf (psf, " Found existing loop info, using last one.\n") ; + free (psf->loop_info) ; + psf->loop_info = NULL ; + } ; + if ((psf->loop_info = calloc (1, sizeof (SF_LOOP_INFO))) == NULL) + return SFE_MALLOC_FAILED ; + + psf->loop_info->time_sig_num = bc.sigNumerator ; + psf->loop_info->time_sig_den = bc.sigDenominator ; + psf->loop_info->loop_mode = (bc.loopType == basc_TYPE_ONE_SHOT) ? SF_LOOP_NONE : SF_LOOP_FORWARD ; + psf->loop_info->num_beats = bc.numBeats ; + + /* Can always be recalculated from other known fields. */ + psf->loop_info->bpm = (1.0 / psf->sf.frames) * psf->sf.samplerate + * ((bc.numBeats * 4.0) / bc.sigDenominator) * 60.0 ; + psf->loop_info->root_key = bc.rootNote ; + + if (count < datasize) + psf_binheader_readf (psf, "j", datasize - count) ; + + return 0 ; +} /* aiff_read_basc_chunk */ + + +static int +aiff_read_chanmap (SF_PRIVATE * psf, unsigned dword) +{ const AIFF_CAF_CHANNEL_MAP * map_info ; + unsigned channel_bitmap, channel_decriptions, bytesread ; + int layout_tag ; + + bytesread = psf_binheader_readf (psf, "444", &layout_tag, &channel_bitmap, &channel_decriptions) ; + + if ((map_info = aiff_caf_of_channel_layout_tag (layout_tag)) == NULL) + return 0 ; + + psf_log_printf (psf, " Tag : %x\n", layout_tag) ; + if (map_info) + psf_log_printf (psf, " Layout : %s\n", map_info->name) ; + + if (bytesread < dword) + psf_binheader_readf (psf, "j", dword - bytesread) ; + + if (map_info->channel_map != NULL) + { size_t chanmap_size = SF_MIN (psf->sf.channels, layout_tag & 0xffff) * sizeof (psf->channel_map [0]) ; + + free (psf->channel_map) ; + + if ((psf->channel_map = malloc (chanmap_size)) == NULL) + return SFE_MALLOC_FAILED ; + + memcpy (psf->channel_map, map_info->channel_map, chanmap_size) ; + } ; + + return 0 ; +} /* aiff_read_chanmap */ + +/*============================================================================== +*/ + +static int +aiff_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info) +{ return psf_save_write_chunk (&psf->wchunks, chunk_info) ; +} /* aiff_set_chunk */ + +static SF_CHUNK_ITERATOR * +aiff_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator) +{ return psf_next_chunk_iterator (&psf->rchunks, iterator) ; +} /* aiff_next_chunk_iterator */ + +static int +aiff_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) +{ int indx ; + + if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0) + return SFE_UNKNOWN_CHUNK ; + + chunk_info->datalen = psf->rchunks.chunks [indx].len ; + + return SFE_NO_ERROR ; +} /* aiff_get_chunk_size */ + +static int +aiff_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) +{ sf_count_t pos ; + int indx ; + + if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0) + return SFE_UNKNOWN_CHUNK ; + + if (chunk_info->data == NULL) + return SFE_BAD_CHUNK_DATA_PTR ; + + chunk_info->id_size = psf->rchunks.chunks [indx].id_size ; + memcpy (chunk_info->id, psf->rchunks.chunks [indx].id, sizeof (chunk_info->id) / sizeof (*chunk_info->id)) ; + + pos = psf_ftell (psf) ; + psf_fseek (psf, psf->rchunks.chunks [indx].offset, SEEK_SET) ; + psf_fread (chunk_info->data, SF_MIN (chunk_info->datalen, psf->rchunks.chunks [indx].len), 1, psf) ; + psf_fseek (psf, pos, SEEK_SET) ; + + return SFE_NO_ERROR ; +} /* aiff_get_chunk_data */ diff --git a/libsndfile-1.0.31/src/alac.c b/libsndfile-1.0.31/src/alac.c new file mode 100644 index 0000000..f83dd2f --- /dev/null +++ b/libsndfile-1.0.31/src/alac.c @@ -0,0 +1,997 @@ +/* +** Copyright (C) 2011-2016 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" +#include "ALAC/alac_codec.h" +#include "ALAC/ALACBitUtilities.h" + +#define ALAC_MAX_FRAME_SIZE 8192 +#define ALAC_BYTE_BUFFER_SIZE 0x20000 +#define ALAC_MAX_CHANNEL_COUNT 8 // Same as kALACMaxChannels in /ALACAudioTypes.h + +typedef struct +{ uint32_t current, count, allocated ; + uint32_t packet_size [] ; +} PAKT_INFO ; + +typedef struct +{ sf_count_t input_data_pos ; + + PAKT_INFO * pakt_info ; + + int channels, final_write_block ; + + uint32_t frames_this_block, partial_block_frames, frames_per_block ; + uint32_t bits_per_sample, kuki_size ; + + + /* Can't have a decoder and an encoder at the same time so stick + ** them in an un-named union. + */ + union + { ALAC_DECODER decoder ; + ALAC_ENCODER encoder ; + } ; + + char enctmpname [512] ; + FILE *enctmp ; + + uint8_t byte_buffer [ALAC_MAX_CHANNEL_COUNT * ALAC_BYTE_BUFFER_SIZE] ; + + int buffer [] ; + +} ALAC_PRIVATE ; + +/*============================================================================================ +*/ + +static int alac_reader_init (SF_PRIVATE *psf, const ALAC_DECODER_INFO * info) ; +static int alac_writer_init (SF_PRIVATE *psf) ; + +static sf_count_t alac_reader_calc_frames (SF_PRIVATE *psf, ALAC_PRIVATE *plac) ; + +static sf_count_t alac_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t alac_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t alac_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t alac_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t alac_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t alac_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t alac_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t alac_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +static sf_count_t alac_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; + +static int alac_close (SF_PRIVATE *psf) ; +static int alac_byterate (SF_PRIVATE *psf) ; + +static int alac_decode_block (SF_PRIVATE *psf, ALAC_PRIVATE *plac) ; +static int alac_encode_block (ALAC_PRIVATE *plac) ; + +static uint32_t alac_kuki_read (SF_PRIVATE * psf, uint32_t kuki_offset, uint8_t * kuki, size_t kuki_maxlen) ; + +static PAKT_INFO * alac_pakt_alloc (uint32_t initial_count) ; +static PAKT_INFO * alac_pakt_read_decode (SF_PRIVATE * psf, uint32_t pakt_offset) ; +static PAKT_INFO * alac_pakt_append (PAKT_INFO * info, uint32_t value) ; +static uint8_t * alac_pakt_encode (const SF_PRIVATE *psf, uint32_t * pakt_size) ; +static sf_count_t alac_pakt_block_offset (const PAKT_INFO *info, uint32_t block) ; + +static const char * alac_error_string (int error) ; + +/*============================================================================================ +** ALAC Reader initialisation function. +*/ + +int +alac_init (SF_PRIVATE *psf, const ALAC_DECODER_INFO * info) +{ int error ; + + if ((psf->codec_data = calloc (1, sizeof (ALAC_PRIVATE) + psf->sf.channels * sizeof (int) * ALAC_MAX_FRAME_SIZE)) == NULL) + return SFE_MALLOC_FAILED ; + + psf->codec_close = alac_close ; + + switch (psf->file.mode) + { case SFM_RDWR : + return SFE_BAD_MODE_RW ; + + case SFM_READ : + if ((error = alac_reader_init (psf, info))) + return error ; + break ; + + case SFM_WRITE : + if ((error = alac_writer_init (psf))) + return error ; + break ; + + default : + psf_log_printf (psf, "%s : Bad psf->file.mode.\n", __func__) ; + return SFE_INTERNAL ; + } ; + + psf->byterate = alac_byterate ; + + return 0 ; +} /* aiff_alac_init */ + +void +alac_get_desc_chunk_items (int subformat, uint32_t *fmt_flags, uint32_t *frames_per_packet) +{ switch (subformat) + { case SF_FORMAT_ALAC_16 : + *fmt_flags = 1 ; + break ; + case SF_FORMAT_ALAC_20 : + *fmt_flags = 2 ; + break ; + case SF_FORMAT_ALAC_24 : + *fmt_flags = 3 ; + break ; + case SF_FORMAT_ALAC_32 : + *fmt_flags = 4 ; + break ; + default : + break ; + } ; + *frames_per_packet = ALAC_FRAME_LENGTH ; +} /* alac_get_desc_chunk_items */ + +static int +alac_close (SF_PRIVATE *psf) +{ ALAC_PRIVATE *plac ; + BUF_UNION ubuf ; + + plac = psf->codec_data ; + + if (psf->file.mode == SFM_WRITE) + { ALAC_ENCODER *penc = &plac->encoder ; + SF_CHUNK_INFO chunk_info ; + sf_count_t readcount ; + uint8_t kuki_data [1024] ; + uint32_t pakt_size = 0, saved_partial_block_frames ; + + plac->final_write_block = 1 ; + saved_partial_block_frames = plac->partial_block_frames ; + + /* If a block has been partially assembled, write it out as the final block. */ + if (plac->partial_block_frames && plac->partial_block_frames < plac->frames_per_block) + alac_encode_block (plac) ; + + plac->partial_block_frames = saved_partial_block_frames ; + + alac_get_magic_cookie (penc, kuki_data, &plac->kuki_size) ; + + memset (&chunk_info, 0, sizeof (chunk_info)) ; + chunk_info.id_size = snprintf (chunk_info.id, sizeof (chunk_info.id), "kuki") ; + chunk_info.data = kuki_data ; + chunk_info.datalen = plac->kuki_size ; + psf_save_write_chunk (&psf->wchunks, &chunk_info) ; + + memset (&chunk_info, 0, sizeof (chunk_info)) ; + chunk_info.id_size = snprintf (chunk_info.id, sizeof (chunk_info.id), "pakt") ; + chunk_info.data = alac_pakt_encode (psf, &pakt_size) ; + chunk_info.datalen = pakt_size ; + psf_save_write_chunk (&psf->wchunks, &chunk_info) ; + + free (chunk_info.data) ; + chunk_info.data = NULL ; + + psf->write_header (psf, 1) ; + + if (plac->enctmp != NULL) + { fseek (plac->enctmp, 0, SEEK_SET) ; + + while ((readcount = fread (ubuf.ucbuf, 1, sizeof (ubuf.ucbuf), plac->enctmp)) > 0) + psf_fwrite (ubuf.ucbuf, 1, readcount, psf) ; + fclose (plac->enctmp) ; + remove (plac->enctmpname) ; + } ; + } ; + + if (plac->pakt_info) + free (plac->pakt_info) ; + plac->pakt_info = NULL ; + + return 0 ; +} /* alac_close */ + +static int +alac_byterate (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_READ) + return (psf->datalength * psf->sf.samplerate) / psf->sf.frames ; + + return -1 ; +} /* alac_byterate */ + +/*============================================================================================ +** ALAC initialisation Functions. +*/ + +static int +alac_reader_init (SF_PRIVATE *psf, const ALAC_DECODER_INFO * info) +{ ALAC_PRIVATE *plac ; + uint32_t kuki_size ; + int error ; + union { uint8_t kuki [512] ; uint32_t alignment ; } u ; + + if (info == NULL) + { psf_log_printf (psf, "%s : ALAC_DECODER_INFO is NULL.\n", __func__) ; + return SFE_INTERNAL ; + } ; + + if (info->frames_per_packet > ALAC_FRAME_LENGTH) + { psf_log_printf (psf, "*** Error : frames_per_packet (%u) is too big. ***\n", info->frames_per_packet) ; + return SFE_INTERNAL ; + } ; + + plac = psf->codec_data ; + + plac->channels = psf->sf.channels ; + plac->frames_per_block = info->frames_per_packet ; + plac->bits_per_sample = info->bits_per_sample ; + + if (plac->pakt_info != NULL) + free (plac->pakt_info) ; + plac->pakt_info = alac_pakt_read_decode (psf, info->pakt_offset) ; + + if (plac->pakt_info == NULL) + { psf_log_printf (psf, "%s : alac_pkt_read() returns NULL.\n", __func__) ; + return SFE_INTERNAL ; + } ; + + /* Read in the ALAC cookie data and pass it to the init function. */ + kuki_size = alac_kuki_read (psf, info->kuki_offset, u.kuki, sizeof (u.kuki)) ; + + if ((error = alac_decoder_init (&plac->decoder, u.kuki, kuki_size)) != ALAC_noErr) + { psf_log_printf (psf, "*** alac_decoder_init() returned %s. ***\n", alac_error_string (error)) ; + return SFE_INTERNAL ; + } ; + + + if (plac->decoder.mNumChannels != (unsigned) psf->sf.channels) + { psf_log_printf (psf, "*** Initialized decoder has %u channels, but it should be %d. ***\n", plac->decoder.mNumChannels, psf->sf.channels) ; + return SFE_INTERNAL ; + } ; + + switch (info->bits_per_sample) + { case 16 : + case 20 : + case 24 : + case 32 : + psf->read_short = alac_read_s ; + psf->read_int = alac_read_i ; + psf->read_float = alac_read_f ; + psf->read_double = alac_read_d ; + break ; + + default : + printf ("%s : info->bits_per_sample %u\n", __func__, info->bits_per_sample) ; + return SFE_UNSUPPORTED_ENCODING ; + } ; + + psf->codec_close = alac_close ; + psf->seek = alac_seek ; + + psf->sf.frames = alac_reader_calc_frames (psf, plac) ; + alac_seek (psf, SFM_READ, 0) ; + + return 0 ; +} /* alac_reader_init */ + +static int +alac_writer_init (SF_PRIVATE *psf) +{ ALAC_PRIVATE *plac ; + uint32_t alac_format_flags = 0 ; + + plac = psf->codec_data ; + + if (psf->file.mode != SFM_WRITE) + return SFE_BAD_MODE_RW ; + + plac->channels = psf->sf.channels ; + plac->kuki_size = alac_get_magic_cookie_size (psf->sf.channels) ; + + psf->write_short = alac_write_s ; + psf->write_int = alac_write_i ; + psf->write_float = alac_write_f ; + psf->write_double = alac_write_d ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_ALAC_16 : + alac_format_flags = 1 ; + plac->bits_per_sample = 16 ; + break ; + + case SF_FORMAT_ALAC_20 : + alac_format_flags = 2 ; + plac->bits_per_sample = 20 ; + break ; + + case SF_FORMAT_ALAC_24 : + alac_format_flags = 3 ; + plac->bits_per_sample = 24 ; + break ; + + case SF_FORMAT_ALAC_32 : + alac_format_flags = 4 ; + plac->bits_per_sample = 32 ; + break ; + + default : + psf_log_printf (psf, "%s : Can't figure out bits per sample.\n", __func__) ; + return SFE_UNIMPLEMENTED ; + } ; + + plac->frames_per_block = ALAC_FRAME_LENGTH ; + + plac->pakt_info = alac_pakt_alloc (2000) ; + + if ((plac->enctmp = psf_open_tmpfile (plac->enctmpname, sizeof (plac->enctmpname))) == NULL) + { psf_log_printf (psf, "Error : Failed to open temp file '%s' : \n", plac->enctmpname, strerror (errno)) ; + return SFE_ALAC_FAIL_TMPFILE ; + } ; + + alac_encoder_init (&plac->encoder, psf->sf.samplerate, psf->sf.channels, alac_format_flags, ALAC_FRAME_LENGTH) ; + + return 0 ; +} /* alac_writer_init */ + +/*============================================================================================ +** ALAC block decoder and encoder. +*/ + +static inline uint32_t +alac_reader_next_packet_size (PAKT_INFO * info) +{ if (info->current >= info->count) + return 0 ; + return info->packet_size [info->current++] ; +} /* alac_reader_next_packet_size */ + +static sf_count_t +alac_reader_calc_frames (SF_PRIVATE *psf, ALAC_PRIVATE *plac) +{ sf_count_t frames = 0 ; + uint32_t current_pos = 1, blocks = 0 ; + + plac->pakt_info->current = 0 ; + + while (current_pos < psf->filelength && current_pos > 0) + { current_pos = alac_reader_next_packet_size (plac->pakt_info) ; + blocks = current_pos > 0 ? blocks + 1 : blocks ; + } ; + + if (blocks == 0) + return 0 ; + + /* Only count full blocks. */ + frames = plac->frames_per_block * (blocks - 1) ; + + alac_seek (psf, SFM_READ, frames) ; + alac_decode_block (psf, plac) ; + frames += plac->frames_this_block ; + + plac->pakt_info->current = 0 ; + + return frames ; +} /* alac_reader_calc_frames */ + +static int +alac_decode_block (SF_PRIVATE *psf, ALAC_PRIVATE *plac) +{ ALAC_DECODER *pdec = &plac->decoder ; + uint32_t packet_size ; + BitBuffer bit_buffer ; + + packet_size = alac_reader_next_packet_size (plac->pakt_info) ; + if (packet_size == 0) + { if (plac->pakt_info->current < plac->pakt_info->count) + psf_log_printf (psf, "packet_size is 0 (%d of %d)\n", plac->pakt_info->current, plac->pakt_info->count) ; + return 0 ; + } ; + + psf_fseek (psf, plac->input_data_pos, SEEK_SET) ; + + if (packet_size > sizeof (plac->byte_buffer)) + { psf_log_printf (psf, "%s : bad packet_size (%u)\n", __func__, packet_size) ; + return 0 ; + } ; + + if ((packet_size != psf_fread (plac->byte_buffer, 1, packet_size, psf))) + return 0 ; + + BitBufferInit (&bit_buffer, plac->byte_buffer, packet_size) ; + + plac->input_data_pos += packet_size ; + plac->frames_this_block = 0 ; + alac_decode (pdec, &bit_buffer, plac->buffer, plac->frames_per_block, &plac->frames_this_block) ; + + plac->partial_block_frames = 0 ; + + return 1 ; +} /* alac_decode_block */ + + +static int +alac_encode_block (ALAC_PRIVATE *plac) +{ ALAC_ENCODER *penc = &plac->encoder ; + uint32_t num_bytes = 0 ; + + alac_encode (penc, plac->partial_block_frames, plac->buffer, plac->byte_buffer, &num_bytes) ; + + if (fwrite (plac->byte_buffer, 1, num_bytes, plac->enctmp) != num_bytes) + return 0 ; + if ((plac->pakt_info = alac_pakt_append (plac->pakt_info, num_bytes)) == NULL) + return 0 ; + + plac->partial_block_frames = 0 ; + + return 1 ; +} /* alac_encode_block */ + +/*============================================================================================ +** ALAC read functions. +*/ + +static sf_count_t +alac_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ ALAC_PRIVATE *plac ; + int *iptr ; + int k, readcount ; + sf_count_t total = 0 ; + + if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL) + return 0 ; + + while (len > 0) + { if (plac->partial_block_frames >= plac->frames_this_block && alac_decode_block (psf, plac) == 0) + break ; + + readcount = (plac->frames_this_block - plac->partial_block_frames) * plac->channels ; + readcount = readcount > len ? len : readcount ; + + iptr = plac->buffer + plac->partial_block_frames * plac->channels ; + + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = iptr [k] >> 16 ; + + plac->partial_block_frames += readcount / plac->channels ; + total += readcount ; + len -= readcount ; + } ; + + return total ; +} /* alac_read_s */ + +static sf_count_t +alac_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ ALAC_PRIVATE *plac ; + int *iptr ; + int k, readcount ; + sf_count_t total = 0 ; + + if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL) + return 0 ; + + while (len > 0) + { if (plac->partial_block_frames >= plac->frames_this_block && alac_decode_block (psf, plac) == 0) + break ; + + readcount = (plac->frames_this_block - plac->partial_block_frames) * plac->channels ; + readcount = readcount > len ? len : readcount ; + + iptr = plac->buffer + plac->partial_block_frames * plac->channels ; + + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = iptr [k] ; + + plac->partial_block_frames += readcount / plac->channels ; + total += readcount ; + len -= readcount ; + } ; + + return total ; +} /* alac_read_i */ + +static sf_count_t +alac_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ ALAC_PRIVATE *plac ; + int *iptr ; + int k, readcount ; + sf_count_t total = 0 ; + float normfact ; + + if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL) + return 0 ; + + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ; + + while (len > 0) + { if (plac->partial_block_frames >= plac->frames_this_block && alac_decode_block (psf, plac) == 0) + break ; + + readcount = (plac->frames_this_block - plac->partial_block_frames) * plac->channels ; + readcount = readcount > len ? len : readcount ; + + iptr = plac->buffer + plac->partial_block_frames * plac->channels ; + + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * iptr [k] ; + + plac->partial_block_frames += readcount / plac->channels ; + total += readcount ; + len -= readcount ; + } ; + + return total ; +} /* alac_read_f */ + +static sf_count_t +alac_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ ALAC_PRIVATE *plac ; + int *iptr ; + int k, readcount ; + sf_count_t total = 0 ; + double normfact ; + + if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL) + return 0 ; + + normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ; + + while (len > 0) + { if (plac->partial_block_frames >= plac->frames_this_block && alac_decode_block (psf, plac) == 0) + break ; + + readcount = (plac->frames_this_block - plac->partial_block_frames) * plac->channels ; + readcount = readcount > len ? len : readcount ; + + iptr = plac->buffer + plac->partial_block_frames * plac->channels ; + + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * iptr [k] ; + + plac->partial_block_frames += readcount / plac->channels ; + total += readcount ; + len -= readcount ; + } ; + + return total ; +} /* alac_read_d */ + +/*============================================================================================ +*/ + +static sf_count_t +alac_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) +{ ALAC_PRIVATE *plac ; + int newblock, newsample ; + + if (! psf->codec_data) + return 0 ; + plac = (ALAC_PRIVATE*) psf->codec_data ; + + if (psf->datalength < 0 || psf->dataoffset < 0) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + if (offset == 0) + { psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + + plac->frames_this_block = 0 ; + plac->input_data_pos = psf->dataoffset ; + plac->pakt_info->current = 0 ; + return 0 ; + } ; + + if (offset < 0 || offset > plac->pakt_info->count * plac->frames_per_block) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + newblock = offset / plac->frames_per_block ; + newsample = offset % plac->frames_per_block ; + + if (mode == SFM_READ) + { plac->input_data_pos = psf->dataoffset + alac_pakt_block_offset (plac->pakt_info, newblock) ; + + plac->pakt_info->current = newblock ; + alac_decode_block (psf, plac) ; + plac->partial_block_frames = newsample ; + } + else + { /* What to do about write??? */ + psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + return newblock * plac->frames_per_block + newsample ; +} /* alac_seek */ + +/*========================================================================================== +** ALAC Write Functions. +*/ + +static sf_count_t +alac_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ ALAC_PRIVATE *plac ; + int *iptr ; + int k, writecount ; + sf_count_t total = 0 ; + + if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL) + return 0 ; + + while (len > 0) + { writecount = (plac->frames_per_block - plac->partial_block_frames) * plac->channels ; + writecount = (writecount == 0 || writecount > len) ? len : writecount ; + + iptr = plac->buffer + plac->partial_block_frames * plac->channels ; + + for (k = 0 ; k < writecount ; k++) + iptr [k] = arith_shift_left (ptr [k], 16) ; + + plac->partial_block_frames += writecount / plac->channels ; + total += writecount ; + len -= writecount ; + ptr += writecount ; + + if (plac->partial_block_frames >= plac->frames_per_block) + alac_encode_block (plac) ; + } ; + + return total ; +} /* alac_write_s */ + +static sf_count_t +alac_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ ALAC_PRIVATE *plac ; + int *iptr ; + int k, writecount ; + sf_count_t total = 0 ; + + if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL) + return 0 ; + + while (len > 0) + { writecount = (plac->frames_per_block - plac->partial_block_frames) * plac->channels ; + writecount = (writecount == 0 || writecount > len) ? len : writecount ; + + iptr = plac->buffer + plac->partial_block_frames * plac->channels ; + + for (k = 0 ; k < writecount ; k++) + iptr [k] = ptr [k] ; + + plac->partial_block_frames += writecount / plac->channels ; + total += writecount ; + len -= writecount ; + ptr += writecount ; + + if (plac->partial_block_frames >= plac->frames_per_block) + alac_encode_block (plac) ; + } ; + + return total ; +} /* alac_write_i */ + +static sf_count_t +alac_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ ALAC_PRIVATE *plac ; + void (*convert) (const float *, int *t, int, int) ; + int *iptr ; + int writecount ; + sf_count_t total = 0 ; + + if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL) + return 0 ; + + convert = (psf->add_clipping) ? psf_f2i_clip_array : psf_f2i_array ; + + while (len > 0) + { writecount = (plac->frames_per_block - plac->partial_block_frames) * plac->channels ; + writecount = (writecount == 0 || writecount > len) ? len : writecount ; + + iptr = plac->buffer + plac->partial_block_frames * plac->channels ; + + convert (ptr, iptr, writecount, psf->norm_float) ; + + plac->partial_block_frames += writecount / plac->channels ; + total += writecount ; + len -= writecount ; + ptr += writecount ; + + if (plac->partial_block_frames >= plac->frames_per_block) + alac_encode_block (plac) ; + } ; + + return total ; +} /* alac_write_f */ + +static sf_count_t +alac_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ ALAC_PRIVATE *plac ; + void (*convert) (const double *, int *t, int, int) ; + int *iptr ; + int writecount ; + sf_count_t total = 0 ; + + if ((plac = (ALAC_PRIVATE*) psf->codec_data) == NULL) + return 0 ; + + convert = (psf->add_clipping) ? psf_d2i_clip_array : psf_d2i_array ; + + while (len > 0) + { writecount = (plac->frames_per_block - plac->partial_block_frames) * plac->channels ; + writecount = (writecount == 0 || writecount > len) ? len : writecount ; + + iptr = plac->buffer + plac->partial_block_frames * plac->channels ; + + convert (ptr, iptr, writecount, psf->norm_float) ; + + plac->partial_block_frames += writecount / plac->channels ; + total += writecount ; + len -= writecount ; + ptr += writecount ; + + if (plac->partial_block_frames >= plac->frames_per_block) + alac_encode_block (plac) ; + } ; + + return total ; +} /* alac_write_d */ + +/*============================================================================== +** PAKT_INFO handling. +*/ + +static PAKT_INFO * +alac_pakt_alloc (uint32_t initial_count) +{ PAKT_INFO * info ; + + if ((info = calloc (1, sizeof (PAKT_INFO) + initial_count * sizeof (info->packet_size [0]))) == NULL) + return NULL ; + + info->allocated = initial_count ; + info->current = 0 ; + info->count = 0 ; + + return info ; +} /* alac_pakt_alloc */ + +static PAKT_INFO * +alac_pakt_append (PAKT_INFO * info, uint32_t value) +{ + if (info->count >= info->allocated) + { PAKT_INFO * temp ; + uint32_t newcount = info->allocated + info->allocated / 2 ; + + if ((temp = realloc (info, sizeof (PAKT_INFO) + newcount * sizeof (info->packet_size [0]))) == NULL) + return NULL ; + + info = temp ; + info->allocated = newcount ; + } ; + + info->packet_size [info->count++] = value ; + return info ; +} /* alac_pakt_append */ + +static PAKT_INFO * +alac_pakt_read_decode (SF_PRIVATE * psf, uint32_t UNUSED (pakt_offset)) +{ SF_CHUNK_INFO chunk_info ; + PAKT_INFO * info = NULL ; + uint8_t *pakt_data = NULL ; + uint32_t bcount, value = 1, pakt_size ; + SF_CHUNK_ITERATOR * chunk_iterator ; + + + memset (&chunk_info, 0, sizeof (chunk_info)) ; + snprintf (chunk_info.id, sizeof (chunk_info.id), "pakt") ; + chunk_info.id_size = 4 ; + + if ((chunk_iterator = psf_get_chunk_iterator (psf, chunk_info.id)) == NULL) + { psf_log_printf (psf, "%s : no chunk iterator found\n", __func__) ; + free (chunk_info.data) ; + chunk_info.data = NULL ; + return NULL ; + } ; + + psf->get_chunk_size (psf, chunk_iterator, &chunk_info) ; + + pakt_size = chunk_info.datalen ; + chunk_info.data = pakt_data = malloc (pakt_size + 5) ; + + if ((bcount = psf->get_chunk_data (psf, chunk_iterator, &chunk_info)) != SF_ERR_NO_ERROR) + { while (chunk_iterator) + chunk_iterator = psf->next_chunk_iterator (psf, chunk_iterator) ; + free (chunk_info.data) ; + chunk_info.data = NULL ; + return NULL ; + } ; + + while (chunk_iterator) + chunk_iterator = psf->next_chunk_iterator (psf, chunk_iterator) ; + + info = alac_pakt_alloc (pakt_size / 4) ; + + /* Start at 24 bytes in, skipping over the 'pakt' chunks header. */ + for (bcount = 24 ; bcount < pakt_size && value != 0 ; ) + { uint8_t byte ; + int32_t count = 0 ; + + value = 0 ; + do + { byte = pakt_data [bcount + count] ; + value = (value << 7) + (byte & 0x7F) ; + + count ++ ; + if (count > 5 || bcount + count > pakt_size) + { printf ("%s %d : Ooops! count %d bcount %d\n", __func__, __LINE__, count, bcount) ; + value = 0 ; + break ; + } ; + } + while (byte & 0x80) ; + + bcount += count ; + + if ((info = alac_pakt_append (info, value)) == NULL) + goto FreeExit ; + } ; + + free (pakt_data) ; + + return info ; + +FreeExit : + free (pakt_data) ; + free (info) ; + return NULL ; +} /* alac_pakt_read_decode */ + +static uint8_t * +alac_pakt_encode (const SF_PRIVATE *psf, uint32_t * pakt_size_out) +{ const ALAC_PRIVATE *plac ; + const PAKT_INFO *info ; + uint8_t *data ; + uint32_t k, allocated, pakt_size ; + + plac = psf->codec_data ; + info = plac->pakt_info ; + + allocated = 100 + 2 * info->count ; + if ((data = calloc (1, allocated)) == NULL) + return NULL ; + + psf_put_be64 (data, 0, info->count) ; + psf_put_be64 (data, 8, psf->sf.frames) ; + psf_put_be32 (data, 20, kALACDefaultFramesPerPacket - plac->partial_block_frames) ; + + /* Real 'pakt' data starts after 24 byte header. */ + pakt_size = 24 ; + + for (k = 0 ; k < info->count ; k++) + { int32_t value = info->packet_size [k] ; + + if ((value & 0x7f) == value) + { data [pakt_size++] = value ; + continue ; + } ; + + if ((value & 0x3fff) == value) + { data [pakt_size++] = (value >> 7) | 0x80 ; + data [pakt_size++] = value & 0x7f ; + continue ; + } ; + + if ((value & 0x1fffff) == value) + { data [pakt_size++] = (value >> 14) | 0x80 ; + data [pakt_size++] = ((value >> 7) & 0x7f) | 0x80 ; + data [pakt_size++] = value & 0x7f ; + continue ; + } ; + + if ((value & 0x0fffffff) == value) + { data [pakt_size++] = (value >> 21) | 0x80 ; + data [pakt_size++] = ((value >> 14) & 0x7f) | 0x80 ; + data [pakt_size++] = ((value >> 7) & 0x7f) | 0x80 ; + data [pakt_size++] = value & 0x7f ; + continue ; + } ; + + *pakt_size_out = 0 ; + free (data) ; + return NULL ; + } ; + + *pakt_size_out = pakt_size ; + return data ; +} /* alac_pakt_encode */ + +static sf_count_t +alac_pakt_block_offset (const PAKT_INFO *info, uint32_t block) +{ sf_count_t offset = 0 ; + uint32_t k ; + + for (k = 0 ; k < block ; k++) + offset += info->packet_size [k] ; + + return offset ; +} /* alac_pakt_block_offset */ + +static uint32_t +alac_kuki_read (SF_PRIVATE * psf, uint32_t kuki_offset, uint8_t * kuki, size_t kuki_maxlen) +{ uint32_t marker ; + uint64_t kuki_size ; + + if (psf_fseek (psf, kuki_offset, SEEK_SET) != kuki_offset) + return 0 ; + + psf_fread (&marker, 1, sizeof (marker), psf) ; + if (marker != MAKE_MARKER ('k', 'u', 'k', 'i')) + return 0 ; + + psf_fread (&kuki_size, 1, sizeof (kuki_size), psf) ; + kuki_size = BE2H_64 (kuki_size) ; + + if (kuki_size == 0 || kuki_size > kuki_maxlen) + { psf_log_printf (psf, "%s : Bad size (%D) of 'kuki' chunk.\n", __func__, kuki_size) ; + return 0 ; + } ; + + psf_fread (kuki, 1, kuki_size, psf) ; + + return kuki_size ; +} /* alac_kuki_read */ + +#define CASE_NAME(x) case x : return #x ; break ; + +static const char * +alac_error_string (int error) +{ static char errstr [128] ; + switch (error) + { CASE_NAME (kALAC_UnimplementedError) ; + CASE_NAME (kALAC_FileNotFoundError) ; + CASE_NAME (kALAC_ParamError) ; + CASE_NAME (kALAC_MemFullError) ; + CASE_NAME (fALAC_FrameLengthError) ; + + /* Added for libsndfile */ + CASE_NAME (kALAC_BadBitWidth) ; + CASE_NAME (kALAC_IncompatibleVersion) ; + CASE_NAME (kALAC_BadSpecificConfigSize) ; + CASE_NAME (kALAC_ZeroChannelCount) ; + CASE_NAME (kALAC_NumSamplesTooBig) ; + CASE_NAME (kALAC_UnsupportedElement) ; + default : + break ; + } ; + + snprintf (errstr, sizeof (errstr), "Unknown error %d", error) ; + return errstr ; +} /* alac_error_string */ + diff --git a/libsndfile-1.0.31/src/alaw.c b/libsndfile-1.0.31/src/alaw.c new file mode 100644 index 0000000..6e0a794 --- /dev/null +++ b/libsndfile-1.0.31/src/alaw.c @@ -0,0 +1,553 @@ +/* +** Copyright (C) 1999-2013 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include + +#include "sndfile.h" +#include "common.h" + +static sf_count_t alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t alaw_write_s2alaw (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t alaw_write_i2alaw (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t alaw_write_f2alaw (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t alaw_write_d2alaw (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +static void alaw2s_array (unsigned char *buffer, int count, short *ptr) ; +static void alaw2i_array (unsigned char *buffer, int count, int *ptr) ; +static void alaw2f_array (unsigned char *buffer, int count, float *ptr, float normfact) ; +static void alaw2d_array (unsigned char *buffer, int count, double *ptr, double normfact) ; + +static void s2alaw_array (const short *buffer, int count, unsigned char *ptr) ; +static void i2alaw_array (const int *buffer, int count, unsigned char *ptr) ; +static void f2alaw_array (const float *buffer, int count, unsigned char *ptr, float normfact) ; +static void d2alaw_array (const double *buffer, int count, unsigned char *ptr, double normfact) ; + + +int +alaw_init (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR) + { psf->read_short = alaw_read_alaw2s ; + psf->read_int = alaw_read_alaw2i ; + psf->read_float = alaw_read_alaw2f ; + psf->read_double = alaw_read_alaw2d ; + } ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { psf->write_short = alaw_write_s2alaw ; + psf->write_int = alaw_write_i2alaw ; + psf->write_float = alaw_write_f2alaw ; + psf->write_double = alaw_write_d2alaw ; + } ; + + psf->bytewidth = 1 ; + psf->blockwidth = psf->sf.channels ; + + if (psf->filelength > psf->dataoffset) + psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : psf->filelength - psf->dataoffset ; + else + psf->datalength = 0 ; + + psf->sf.frames = psf->blockwidth > 0 ? psf->datalength / psf->blockwidth : 0 ; + + return 0 ; +} /* alaw_init */ + +/*============================================================================== + * Private static functions and data. + */ + +static +short alaw_decode [256] = +{ -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736, + -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784, + -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368, + -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392, + -22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944, + -30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136, + -11008, -10496, -12032, -11520, -8960, -8448, -9984, -9472, + -15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568, + -344, -328, -376, -360, -280, -264, -312, -296, + -472, -456, -504, -488, -408, -392, -440, -424, + -88, -72, -120, -104, -24, -8, -56, -40, + -216, -200, -248, -232, -152, -136, -184, -168, + -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184, + -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696, + -688, -656, -752, -720, -560, -528, -624, -592, + -944, -912, -1008, -976, -816, -784, -880, -848, + 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, + 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, + 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, + 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, + 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, + 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, + 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, + 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, + 344, 328, 376, 360, 280, 264, 312, 296, + 472, 456, 504, 488, 408, 392, 440, 424, + 88, 72, 120, 104, 24, 8, 56, 40, + 216, 200, 248, 232, 152, 136, 184, 168, + 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, + 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, + 688, 656, 752, 720, 560, 528, 624, 592, + 944, 912, 1008, 976, 816, 784, 880, 848 +} ; /* alaw_decode */ + +static +unsigned char alaw_encode [2048 + 1] = +{ 0xd5, 0xd4, 0xd7, 0xd6, 0xd1, 0xd0, 0xd3, 0xd2, 0xdd, 0xdc, 0xdf, 0xde, + 0xd9, 0xd8, 0xdb, 0xda, 0xc5, 0xc4, 0xc7, 0xc6, 0xc1, 0xc0, 0xc3, 0xc2, + 0xcd, 0xcc, 0xcf, 0xce, 0xc9, 0xc8, 0xcb, 0xca, 0xf5, 0xf5, 0xf4, 0xf4, + 0xf7, 0xf7, 0xf6, 0xf6, 0xf1, 0xf1, 0xf0, 0xf0, 0xf3, 0xf3, 0xf2, 0xf2, + 0xfd, 0xfd, 0xfc, 0xfc, 0xff, 0xff, 0xfe, 0xfe, 0xf9, 0xf9, 0xf8, 0xf8, + 0xfb, 0xfb, 0xfa, 0xfa, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe1, 0xe1, 0xe1, 0xe1, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, + 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xef, 0xef, 0xef, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, + 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0x95, 0x95, 0x95, 0x95, + 0x95, 0x95, 0x95, 0x95, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, + 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, 0x96, 0x96, 0x96, + 0x96, 0x96, 0x96, 0x96, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x93, 0x93, 0x93, 0x93, + 0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, + 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9c, 0x9c, 0x9c, 0x9c, + 0x9c, 0x9c, 0x9c, 0x9c, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, + 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, + 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x9a, + 0x9a, 0x9a, 0x9a, 0x9a, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xb9, 0xb9, 0xb9, 0xb9, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, + 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, + 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, + 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, + 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, + 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa1, 0xa1, 0xa1, 0xa1, + 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, + 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, + 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, + 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, + 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa +} ; /* alaw_encode */ + +static inline void +alaw2s_array (unsigned char *buffer, int count, short *ptr) +{ while (--count >= 0) + ptr [count] = alaw_decode [(int) buffer [count]] ; +} /* alaw2s_array */ + +static inline void +alaw2i_array (unsigned char *buffer, int count, int *ptr) +{ while (--count >= 0) + ptr [count] = ((uint32_t) alaw_decode [(int) buffer [count]]) << 16 ; +} /* alaw2i_array */ + +static inline void +alaw2f_array (unsigned char *buffer, int count, float *ptr, float normfact) +{ while (--count >= 0) + ptr [count] = normfact * alaw_decode [(int) buffer [count]] ; +} /* alaw2f_array */ + +static inline void +alaw2d_array (unsigned char *buffer, int count, double *ptr, double normfact) +{ while (--count >= 0) + ptr [count] = normfact * alaw_decode [(int) buffer [count]] ; +} /* alaw2d_array */ + +static inline void +s2alaw_array (const short *ptr, int count, unsigned char *buffer) +{ while (--count >= 0) + { if (ptr [count] >= 0) + buffer [count] = alaw_encode [ptr [count] / 16] ; + else + buffer [count] = 0x7F & alaw_encode [ptr [count] / -16] ; + } ; +} /* s2alaw_array */ + +static inline void +i2alaw_array (const int *ptr, int count, unsigned char *buffer) +{ while (--count >= 0) + { if (ptr [count] == INT_MIN) + buffer [count] = alaw_encode [INT_MAX >> (16 + 4)] ; + else if (ptr [count] >= 0) + buffer [count] = alaw_encode [ptr [count] >> (16 + 4)] ; + else + buffer [count] = 0x7F & alaw_encode [- ptr [count] >> (16 + 4)] ; + } ; +} /* i2alaw_array */ + +static inline void +f2alaw_array (const float *ptr, int count, unsigned char *buffer, float normfact) +{ while (--count >= 0) + { if (ptr [count] >= 0) + buffer [count] = alaw_encode [psf_lrintf (normfact * ptr [count])] ; + else + buffer [count] = 0x7F & alaw_encode [- psf_lrintf (normfact * ptr [count])] ; + } ; +} /* f2alaw_array */ + +static inline void +d2alaw_array (const double *ptr, int count, unsigned char *buffer, double normfact) +{ while (--count >= 0) + { if (!isfinite (ptr [count])) + buffer [count] = 0 ; + else if (ptr [count] >= 0) + buffer [count] = alaw_encode [psf_lrint (normfact * ptr [count])] ; + else + buffer [count] = 0x7F & alaw_encode [- psf_lrint (normfact * ptr [count])] ; + } ; +} /* d2alaw_array */ + +/*============================================================================== +*/ + +static sf_count_t +alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ; + alaw2s_array (ubuf.ucbuf, readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* alaw_read_alaw2s */ + +static sf_count_t +alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ; + alaw2i_array (ubuf.ucbuf, readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* alaw_read_alaw2i */ + +static sf_count_t +alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + float normfact ; + + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ; + alaw2f_array (ubuf.ucbuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* alaw_read_alaw2f */ + +static sf_count_t +alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + double normfact ; + + normfact = (psf->norm_double) ? 1.0 / ((double) 0x8000) : 1.0 ; + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ; + alaw2d_array (ubuf.ucbuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* alaw_read_alaw2d */ + +/*============================================================================================= +*/ + +static sf_count_t +alaw_write_s2alaw (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + s2alaw_array (ptr + total, bufferlen, ubuf.ucbuf) ; + writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* alaw_write_s2alaw */ + +static sf_count_t +alaw_write_i2alaw (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + i2alaw_array (ptr + total, bufferlen, ubuf.ucbuf) ; + writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* alaw_write_i2alaw */ + +static sf_count_t +alaw_write_f2alaw (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + float normfact ; + + normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) / 16.0 : 1.0 / 16 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + f2alaw_array (ptr + total, bufferlen, ubuf.ucbuf, normfact) ; + writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* alaw_write_f2alaw */ + +static sf_count_t +alaw_write_d2alaw (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + double normfact ; + + normfact = (psf->norm_double) ? (1.0 * 0x7FFF) / 16.0 : 1.0 / 16.0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + d2alaw_array (ptr + total, bufferlen, ubuf.ucbuf, normfact) ; + writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* alaw_write_d2alaw */ + diff --git a/libsndfile-1.0.31/src/au.c b/libsndfile-1.0.31/src/au.c new file mode 100644 index 0000000..62bd691 --- /dev/null +++ b/libsndfile-1.0.31/src/au.c @@ -0,0 +1,454 @@ +/* +** Copyright (C) 1999-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +/*------------------------------------------------------------------------------ +** Macros to handle big/little endian issues. +*/ + +#define DOTSND_MARKER (MAKE_MARKER ('.', 's', 'n', 'd')) +#define DNSDOT_MARKER (MAKE_MARKER ('d', 'n', 's', '.')) + +#define AU_DATA_OFFSET 24 + +/*------------------------------------------------------------------------------ +** Known AU file encoding types. +*/ + +enum +{ AU_ENCODING_ULAW_8 = 1, /* 8-bit u-law samples */ + AU_ENCODING_PCM_8 = 2, /* 8-bit linear samples */ + AU_ENCODING_PCM_16 = 3, /* 16-bit linear samples */ + AU_ENCODING_PCM_24 = 4, /* 24-bit linear samples */ + AU_ENCODING_PCM_32 = 5, /* 32-bit linear samples */ + + AU_ENCODING_FLOAT = 6, /* floating-point samples */ + AU_ENCODING_DOUBLE = 7, /* double-precision float samples */ + AU_ENCODING_INDIRECT = 8, /* fragmented sampled data */ + AU_ENCODING_NESTED = 9, /* ? */ + AU_ENCODING_DSP_CORE = 10, /* DSP program */ + AU_ENCODING_DSP_DATA_8 = 11, /* 8-bit fixed-point samples */ + AU_ENCODING_DSP_DATA_16 = 12, /* 16-bit fixed-point samples */ + AU_ENCODING_DSP_DATA_24 = 13, /* 24-bit fixed-point samples */ + AU_ENCODING_DSP_DATA_32 = 14, /* 32-bit fixed-point samples */ + + AU_ENCODING_DISPLAY = 16, /* non-audio display data */ + AU_ENCODING_MULAW_SQUELCH = 17, /* ? */ + AU_ENCODING_EMPHASIZED = 18, /* 16-bit linear with emphasis */ + AU_ENCODING_NEXT = 19, /* 16-bit linear with compression (NEXT) */ + AU_ENCODING_COMPRESSED_EMPHASIZED = 20, /* A combination of the two above */ + AU_ENCODING_DSP_COMMANDS = 21, /* Music Kit DSP commands */ + AU_ENCODING_DSP_COMMANDS_SAMPLES = 22, /* ? */ + + AU_ENCODING_ADPCM_G721_32 = 23, /* G721 32 kbs ADPCM - 4 bits per sample. */ + AU_ENCODING_ADPCM_G722 = 24, /* G722 64 kbs ADPCM */ + AU_ENCODING_ADPCM_G723_24 = 25, /* G723 24 kbs ADPCM - 3 bits per sample. */ + AU_ENCODING_ADPCM_G723_40 = 26, /* G723 40 kbs ADPCM - 5 bits per sample. */ + + AU_ENCODING_ALAW_8 = 27 +} ; + +/*------------------------------------------------------------------------------ +** Typedefs. +*/ + +typedef struct +{ int dataoffset ; + int datasize ; + int encoding ; + int samplerate ; + int channels ; +} AU_FMT ; + + +/*------------------------------------------------------------------------------ +** Private static functions. +*/ + +static int au_close (SF_PRIVATE *psf) ; + +static int au_format_to_encoding (int format) ; + +static int au_write_header (SF_PRIVATE *psf, int calc_length) ; +static int au_read_header (SF_PRIVATE *psf) ; + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +au_open (SF_PRIVATE *psf) +{ int subformat ; + int error = 0 ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = au_read_header (psf))) + return error ; + } ; + + if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_AU) + return SFE_BAD_OPEN_FORMAT ; + + subformat = SF_CODEC (psf->sf.format) ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { psf->endian = SF_ENDIAN (psf->sf.format) ; + if (CPU_IS_LITTLE_ENDIAN && psf->endian == SF_ENDIAN_CPU) + psf->endian = SF_ENDIAN_LITTLE ; + else if (psf->endian != SF_ENDIAN_LITTLE) + psf->endian = SF_ENDIAN_BIG ; + + if (au_write_header (psf, SF_FALSE)) + return psf->error ; + + psf->write_header = au_write_header ; + } ; + + psf->container_close = au_close ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + + switch (subformat) + { case SF_FORMAT_ULAW : /* 8-bit Ulaw encoding. */ + ulaw_init (psf) ; + break ; + + case SF_FORMAT_PCM_S8 : /* 8-bit linear PCM. */ + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_PCM_16 : /* 16-bit linear PCM. */ + case SF_FORMAT_PCM_24 : /* 24-bit linear PCM */ + case SF_FORMAT_PCM_32 : /* 32-bit linear PCM. */ + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_ALAW : /* 8-bit Alaw encoding. */ + alaw_init (psf) ; + break ; + + /* Lite remove start */ + case SF_FORMAT_FLOAT : /* 32-bit floats. */ + error = float32_init (psf) ; + break ; + + case SF_FORMAT_DOUBLE : /* 64-bit double precision floats. */ + error = double64_init (psf) ; + break ; + + case SF_FORMAT_G721_32 : + error = g72x_init (psf) ; + psf->sf.seekable = SF_FALSE ; + break ; + + case SF_FORMAT_G723_24 : + error = g72x_init (psf) ; + psf->sf.seekable = SF_FALSE ; + break ; + + case SF_FORMAT_G723_40 : + error = g72x_init (psf) ; + psf->sf.seekable = SF_FALSE ; + break ; + /* Lite remove end */ + + default : break ; + } ; + + return error ; +} /* au_open */ + +/*------------------------------------------------------------------------------ +*/ + +static int +au_close (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + au_write_header (psf, SF_TRUE) ; + + return 0 ; +} /* au_close */ + +static int +au_write_header (SF_PRIVATE *psf, int calc_length) +{ sf_count_t current ; + int encoding, datalength ; + + if (psf->pipeoffset > 0) + return 0 ; + + current = psf_ftell (psf) ; + + if (calc_length) + { psf->filelength = psf_get_filelen (psf) ; + + psf->datalength = psf->filelength - psf->dataoffset ; + if (psf->dataend) + psf->datalength -= psf->filelength - psf->dataend ; + } ; + + encoding = au_format_to_encoding (SF_CODEC (psf->sf.format)) ; + if (! encoding) + return (psf->error = SFE_BAD_OPEN_FORMAT) ; + + /* Reset the current header length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + + /* + ** Only attempt to seek if we are not writng to a pipe. If we are + ** writing to a pipe we shouldn't be here anyway. + */ + if (psf->is_pipe == SF_FALSE) + psf_fseek (psf, 0, SEEK_SET) ; + + /* + ** AU format files allow a datalength value of -1 if the datalength + ** is not know at the time the header is written. + ** Also use this value of -1 if the datalength > 2 gigabytes. + */ + if (psf->datalength < 0 || psf->datalength > 0x7FFFFFFF) + datalength = -1 ; + else + datalength = (int) (psf->datalength & 0x7FFFFFFF) ; + + if (psf->endian == SF_ENDIAN_BIG) + { psf_binheader_writef (psf, "Em4", BHWm (DOTSND_MARKER), BHW4 (AU_DATA_OFFSET)) ; + psf_binheader_writef (psf, "E4444", BHW4 (datalength), BHW4 (encoding), BHW4 (psf->sf.samplerate), BHW4 (psf->sf.channels)) ; + } + else if (psf->endian == SF_ENDIAN_LITTLE) + { psf_binheader_writef (psf, "em4", BHWm (DNSDOT_MARKER), BHW4 (AU_DATA_OFFSET)) ; + psf_binheader_writef (psf, "e4444", BHW4 (datalength), BHW4 (encoding), BHW4 (psf->sf.samplerate), BHW4 (psf->sf.channels)) ; + } + else + return (psf->error = SFE_BAD_OPEN_FORMAT) ; + + /* Header construction complete so write it out. */ + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + if (psf->error) + return psf->error ; + + psf->dataoffset = psf->header.indx ; + + if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + + return psf->error ; +} /* au_write_header */ + +static int +au_format_to_encoding (int format) +{ + switch (format) + { case SF_FORMAT_PCM_S8 : return AU_ENCODING_PCM_8 ; + case SF_FORMAT_PCM_16 : return AU_ENCODING_PCM_16 ; + case SF_FORMAT_PCM_24 : return AU_ENCODING_PCM_24 ; + case SF_FORMAT_PCM_32 : return AU_ENCODING_PCM_32 ; + + case SF_FORMAT_FLOAT : return AU_ENCODING_FLOAT ; + case SF_FORMAT_DOUBLE : return AU_ENCODING_DOUBLE ; + + case SF_FORMAT_ULAW : return AU_ENCODING_ULAW_8 ; + case SF_FORMAT_ALAW : return AU_ENCODING_ALAW_8 ; + + case SF_FORMAT_G721_32 : return AU_ENCODING_ADPCM_G721_32 ; + case SF_FORMAT_G723_24 : return AU_ENCODING_ADPCM_G723_24 ; + case SF_FORMAT_G723_40 : return AU_ENCODING_ADPCM_G723_40 ; + + default : break ; + } ; + return 0 ; +} /* au_format_to_encoding */ + +static int +au_read_header (SF_PRIVATE *psf) +{ AU_FMT au_fmt ; + int marker, dword ; + + memset (&au_fmt, 0, sizeof (au_fmt)) ; + psf_binheader_readf (psf, "pm", 0, &marker) ; + psf_log_printf (psf, "%M\n", marker) ; + + if (marker == DOTSND_MARKER) + { psf->endian = SF_ENDIAN_BIG ; + + psf_binheader_readf (psf, "E44444", &(au_fmt.dataoffset), &(au_fmt.datasize), + &(au_fmt.encoding), &(au_fmt.samplerate), &(au_fmt.channels)) ; + } + else if (marker == DNSDOT_MARKER) + { psf->endian = SF_ENDIAN_LITTLE ; + psf_binheader_readf (psf, "e44444", &(au_fmt.dataoffset), &(au_fmt.datasize), + &(au_fmt.encoding), &(au_fmt.samplerate), &(au_fmt.channels)) ; + } + else + return SFE_AU_NO_DOTSND ; + + psf_log_printf (psf, " Data Offset : %d\n", au_fmt.dataoffset) ; + + if (psf->fileoffset > 0 && au_fmt.datasize == -1) + { psf_log_printf (psf, " Data Size : -1\n") ; + return SFE_AU_EMBED_BAD_LEN ; + } ; + + if (psf->fileoffset > 0) + { psf->filelength = au_fmt.dataoffset + au_fmt.datasize ; + psf_log_printf (psf, " Data Size : %d\n", au_fmt.datasize) ; + } + else if (au_fmt.datasize == -1 || au_fmt.dataoffset + au_fmt.datasize == psf->filelength) + psf_log_printf (psf, " Data Size : %d\n", au_fmt.datasize) ; + else if (au_fmt.dataoffset + au_fmt.datasize < psf->filelength) + { psf->filelength = au_fmt.dataoffset + au_fmt.datasize ; + psf_log_printf (psf, " Data Size : %d\n", au_fmt.datasize) ; + } + else + { dword = psf->filelength - au_fmt.dataoffset ; + psf_log_printf (psf, " Data Size : %d (should be %d)\n", au_fmt.datasize, dword) ; + au_fmt.datasize = dword ; + } ; + + psf->dataoffset = au_fmt.dataoffset ; + psf->datalength = psf->filelength - psf->dataoffset ; + + if (psf_ftell (psf) < psf->dataoffset) + psf_binheader_readf (psf, "j", psf->dataoffset - psf_ftell (psf)) ; + + psf->sf.samplerate = au_fmt.samplerate ; + psf->sf.channels = au_fmt.channels ; + + /* Only fill in type major. */ + if (psf->endian == SF_ENDIAN_BIG) + psf->sf.format = SF_FORMAT_AU ; + else if (psf->endian == SF_ENDIAN_LITTLE) + psf->sf.format = SF_ENDIAN_LITTLE | SF_FORMAT_AU ; + + psf_log_printf (psf, " Encoding : %d => ", au_fmt.encoding) ; + + psf->sf.format = SF_ENDIAN (psf->sf.format) ; + + switch (au_fmt.encoding) + { case AU_ENCODING_ULAW_8 : + psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_ULAW ; + psf->bytewidth = 1 ; /* Before decoding */ + psf_log_printf (psf, "8-bit ISDN u-law\n") ; + break ; + + case AU_ENCODING_PCM_8 : + psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_PCM_S8 ; + psf->bytewidth = 1 ; + psf_log_printf (psf, "8-bit linear PCM\n") ; + break ; + + case AU_ENCODING_PCM_16 : + psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_PCM_16 ; + psf->bytewidth = 2 ; + psf_log_printf (psf, "16-bit linear PCM\n") ; + break ; + + case AU_ENCODING_PCM_24 : + psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_PCM_24 ; + psf->bytewidth = 3 ; + psf_log_printf (psf, "24-bit linear PCM\n") ; + break ; + + case AU_ENCODING_PCM_32 : + psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_PCM_32 ; + psf->bytewidth = 4 ; + psf_log_printf (psf, "32-bit linear PCM\n") ; + break ; + + case AU_ENCODING_FLOAT : + psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_FLOAT ; + psf->bytewidth = 4 ; + psf_log_printf (psf, "32-bit float\n") ; + break ; + + case AU_ENCODING_DOUBLE : + psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_DOUBLE ; + psf->bytewidth = 8 ; + psf_log_printf (psf, "64-bit double precision float\n") ; + break ; + + case AU_ENCODING_ALAW_8 : + psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_ALAW ; + psf->bytewidth = 1 ; /* Before decoding */ + psf_log_printf (psf, "8-bit ISDN A-law\n") ; + break ; + + case AU_ENCODING_ADPCM_G721_32 : + psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_G721_32 ; + psf->bytewidth = 0 ; + psf_log_printf (psf, "G721 32kbs ADPCM\n") ; + break ; + + case AU_ENCODING_ADPCM_G723_24 : + psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_G723_24 ; + psf->bytewidth = 0 ; + psf_log_printf (psf, "G723 24kbs ADPCM\n") ; + break ; + + case AU_ENCODING_ADPCM_G723_40 : + psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_G723_40 ; + psf->bytewidth = 0 ; + psf_log_printf (psf, "G723 40kbs ADPCM\n") ; + break ; + + case AU_ENCODING_ADPCM_G722 : + psf_log_printf (psf, "G722 64 kbs ADPCM (unsupported)\n") ; + break ; + + case AU_ENCODING_NEXT : + psf_log_printf (psf, "Weird NeXT encoding format (unsupported)\n") ; + break ; + + default : + psf_log_printf (psf, "Unknown!!\n") ; + break ; + } ; + + psf_log_printf (psf, " Sample Rate : %d\n", au_fmt.samplerate) ; + if (au_fmt.channels < 1) + { psf_log_printf (psf, " Channels : %d **** should be >= 1\n", au_fmt.channels) ; + return SFE_CHANNEL_COUNT_ZERO ; + } + else if (au_fmt.channels > SF_MAX_CHANNELS) + { psf_log_printf (psf, " Channels : %d **** should be <= %d\n", au_fmt.channels, SF_MAX_CHANNELS) ; + return SFE_CHANNEL_COUNT ; + } ; + + psf_log_printf (psf, " Channels : %d\n", au_fmt.channels) ; + + psf->blockwidth = psf->sf.channels * psf->bytewidth ; + + if (! psf->sf.frames && psf->blockwidth) + psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ; + + return 0 ; +} /* au_read_header */ + diff --git a/libsndfile-1.0.31/src/audio_detect.c b/libsndfile-1.0.31/src/audio_detect.c new file mode 100644 index 0000000..b2671e8 --- /dev/null +++ b/libsndfile-1.0.31/src/audio_detect.c @@ -0,0 +1,107 @@ +/* +** Copyright (C) 1999-2012 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + + +#include "sfconfig.h" + +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include +#include + +#include "common.h" + +typedef struct +{ int le_float ; + int be_float ; + int le_int_24_32 ; + int be_int_24_32 ; +} VOTE ; + + +static void vote_for_format (VOTE * vote, const unsigned char * data, int datalen) ; + +int +audio_detect (SF_PRIVATE * psf, AUDIO_DETECT *ad, const unsigned char * data, int datalen) +{ VOTE vote ; + + if (psf == NULL) + return 0 ; + + if (ad == NULL || datalen < 256) + return 0 ; + + vote_for_format (&vote, data, datalen) ; + + psf_log_printf (psf, "audio_detect :\n" + " le_float : %d\n" + " be_float : %d\n" + " le_int_24_32 : %d\n" + " be_int_24_32 : %d\n", + vote.le_float, vote.be_float, vote.le_int_24_32, vote.be_int_24_32) ; + + if (0) puts (psf->parselog.buf) ; + + if (ad->endianness == SF_ENDIAN_LITTLE && vote.le_float > (3 * datalen) / 4) + { /* Almost certainly 32 bit floats. */ + return SF_FORMAT_FLOAT ; + } ; + + if (ad->endianness == SF_ENDIAN_LITTLE && vote.le_int_24_32 > (3 * datalen) / 4) + { /* Almost certainly 24 bit data stored in 32 bit ints. */ + return SF_FORMAT_PCM_32 ; + } ; + + return 0 ; +} /* data_detect */ + +static void +vote_for_format (VOTE * vote, const unsigned char * data, int datalen) +{ + int k ; + + memset (vote, 0, sizeof (VOTE)) ; + + datalen -= datalen % 4 ; + + for (k = 0 ; k < datalen ; k ++) + { if ((k % 4) == 0) + { if (data [k] == 0 && data [k + 1] != 0) + vote->le_int_24_32 += 4 ; + + if (data [2] != 0 && data [3] == 0) + vote->le_int_24_32 += 4 ; + + if (data [0] != 0 && data [3] > 0x43 && data [3] < 0x4B) + vote->le_float += 4 ; + + if (data [3] != 0 && data [0] > 0x43 && data [0] < 0x4B) + vote->be_float += 4 ; + } ; + } ; + + return ; +} /* vote_for_format */ + diff --git a/libsndfile-1.0.31/src/avr.c b/libsndfile-1.0.31/src/avr.c new file mode 100644 index 0000000..bd6b00f --- /dev/null +++ b/libsndfile-1.0.31/src/avr.c @@ -0,0 +1,246 @@ +/* +** Copyright (C) 2004-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +#define TWOBIT_MARKER (MAKE_MARKER ('2', 'B', 'I', 'T')) +#define AVR_HDR_SIZE 128 + +#define SFE_AVR_X 666 + +/* +** From: hyc@hanauma.Jpl.Nasa.Gov (Howard Chu) +** +** A lot of PD software exists to play Mac .snd files on the ST. One other +** format that seems pretty popular (used by a number of commercial packages) +** is the AVR format (from Audio Visual Research). This format has a 128 byte +** header that looks like this (its actually packed, but thats not portable): +*/ + +typedef struct +{ int marker ; /* 2BIT */ + char name [8] ; /* null-padded sample name */ + short mono ; /* 0 = mono, 0xffff = stereo */ + short rez ; /* 8 = 8 bit, 16 = 16 bit */ + short sign ; /* 0 = unsigned, 0xffff = signed */ + + short loop ; /* 0 = no loop, 0xffff = looping sample */ + short midi ; /* 0xffff = no MIDI note assigned, */ + /* 0xffXX = single key note assignment */ + /* 0xLLHH = key split, low/hi note */ + int srate ; /* sample frequency in hertz */ + int frames ; /* sample length in bytes or words (see rez) */ + int lbeg ; /* offset to start of loop in bytes or words. */ + /* set to zero if unused */ + int lend ; /* offset to end of loop in bytes or words. */ + /* set to sample length if unused */ + short res1 ; /* Reserved, MIDI keyboard split */ + short res2 ; /* Reserved, sample compression */ + short res3 ; /* Reserved */ + char ext [20] ; /* Additional filename space, used if (name[7] != 0) */ + char user [64] ; /* User defined. Typically ASCII message */ +} AVR_HEADER ; + +/*------------------------------------------------------------------------------ +** Private static functions. +*/ + +static int avr_close (SF_PRIVATE *psf) ; + +static int avr_read_header (SF_PRIVATE *psf) ; +static int avr_write_header (SF_PRIVATE *psf, int calc_length) ; + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +avr_open (SF_PRIVATE *psf) +{ int error = 0 ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = avr_read_header (psf))) + return error ; + } ; + + if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_AVR) + return SFE_BAD_OPEN_FORMAT ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { psf->endian = SF_ENDIAN_BIG ; + + if (avr_write_header (psf, SF_FALSE)) + return psf->error ; + + psf->write_header = avr_write_header ; + } ; + + psf->container_close = avr_close ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + + error = pcm_init (psf) ; + + return error ; +} /* avr_open */ + +static int +avr_read_header (SF_PRIVATE *psf) +{ AVR_HEADER hdr ; + + memset (&hdr, 0, sizeof (hdr)) ; + + psf_binheader_readf (psf, "pmb", 0, &hdr.marker, &hdr.name, sizeof (hdr.name)) ; + psf_log_printf (psf, "%M\n", hdr.marker) ; + + if (hdr.marker != TWOBIT_MARKER) + return SFE_AVR_X ; + + psf_log_printf (psf, " Name : %s\n", hdr.name) ; + + psf_binheader_readf (psf, "E22222", &hdr.mono, &hdr.rez, &hdr.sign, &hdr.loop, &hdr.midi) ; + + psf->sf.channels = (hdr.mono & 1) + 1 ; + + psf_log_printf (psf, " Channels : %d\n Bit width : %d\n Signed : %s\n", + (hdr.mono & 1) + 1, hdr.rez, hdr.sign ? "yes" : "no") ; + + switch (arith_shift_left (hdr.rez, 16) + (hdr.sign & 1)) + { case ((8 << 16) + 0) : + psf->sf.format = SF_FORMAT_AVR | SF_FORMAT_PCM_U8 ; + psf->bytewidth = 1 ; + break ; + + case ((8 << 16) + 1) : + psf->sf.format = SF_FORMAT_AVR | SF_FORMAT_PCM_S8 ; + psf->bytewidth = 1 ; + break ; + + case ((16 << 16) + 1) : + psf->sf.format = SF_FORMAT_AVR | SF_FORMAT_PCM_16 ; + psf->bytewidth = 2 ; + break ; + + default : + psf_log_printf (psf, "Error : bad rez/sign combination.\n") ; + return SFE_AVR_X ; + } ; + + psf_binheader_readf (psf, "E4444", &hdr.srate, &hdr.frames, &hdr.lbeg, &hdr.lend) ; + + psf->sf.frames = hdr.frames ; + psf->sf.samplerate = hdr.srate ; + + psf_log_printf (psf, " Frames : %D\n", psf->sf.frames) ; + psf_log_printf (psf, " Sample rate : %d\n", psf->sf.samplerate) ; + + psf_binheader_readf (psf, "E222", &hdr.res1, &hdr.res2, &hdr.res3) ; + psf_binheader_readf (psf, "bb", hdr.ext, sizeof (hdr.ext), hdr.user, sizeof (hdr.user)) ; + + psf_log_printf (psf, " Ext : %s\n User : %s\n", hdr.ext, hdr.user) ; + + psf->endian = SF_ENDIAN_BIG ; + + psf->dataoffset = AVR_HDR_SIZE ; + psf->datalength = hdr.frames * (hdr.rez / 8) ; + + if (psf->fileoffset > 0) + psf->filelength = AVR_HDR_SIZE + psf->datalength ; + + if (psf_ftell (psf) != psf->dataoffset) + psf_binheader_readf (psf, "j", psf->dataoffset - psf_ftell (psf)) ; + + psf->blockwidth = psf->sf.channels * psf->bytewidth ; + + if (psf->sf.frames == 0 && psf->blockwidth) + psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ; + + return 0 ; +} /* avr_read_header */ + +static int +avr_write_header (SF_PRIVATE *psf, int calc_length) +{ sf_count_t current ; + int sign ; + + if (psf->pipeoffset > 0) + return 0 ; + + current = psf_ftell (psf) ; + + if (calc_length) + { psf->filelength = psf_get_filelen (psf) ; + + psf->datalength = psf->filelength - psf->dataoffset ; + if (psf->dataend) + psf->datalength -= psf->filelength - psf->dataend ; + + psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; + } ; + + /* Reset the current header length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + + /* + ** Only attempt to seek if we are not writng to a pipe. If we are + ** writing to a pipe we shouldn't be here anyway. + */ + if (psf->is_pipe == SF_FALSE) + psf_fseek (psf, 0, SEEK_SET) ; + + psf_binheader_writef (psf, "Emz22", BHWm (TWOBIT_MARKER), BHWz (8), + BHW2 (psf->sf.channels == 2 ? 0xFFFF : 0), BHW2 (psf->bytewidth * 8)) ; + + sign = ((SF_CODEC (psf->sf.format)) == SF_FORMAT_PCM_U8) ? 0 : 0xFFFF ; + + psf_binheader_writef (psf, "E222", BHW2 (sign), BHW2 (0), BHW2 (0xFFFF)) ; + psf_binheader_writef (psf, "E4444", BHW4 (psf->sf.samplerate), BHW4 (psf->sf.frames), BHW4 (0), BHW4 (0)) ; + + psf_binheader_writef (psf, "E222zz", BHW2 (0), BHW2 (0), BHW2 (0), BHWz (20), BHWz (64)) ; + + /* Header construction complete so write it out. */ + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + if (psf->error) + return psf->error ; + + psf->dataoffset = psf->header.indx ; + + if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + + return psf->error ; +} /* avr_write_header */ + +static int +avr_close (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + avr_write_header (psf, SF_TRUE) ; + + return 0 ; +} /* avr_close */ + diff --git a/libsndfile-1.0.31/src/binheader_writef_check.py b/libsndfile-1.0.31/src/binheader_writef_check.py new file mode 100755 index 0000000..09ebc92 --- /dev/null +++ b/libsndfile-1.0.31/src/binheader_writef_check.py @@ -0,0 +1,114 @@ +#!/usr/bin/python + +# Copyright (C) 2006-2017 Erik de Castro Lopo +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the author nor the names of any contributors may be used +# to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +# This parses C code using regexes (yes, thats horrible) and makes sure +# that calling conventions to the function psf_binheader_writef are +# correct. + + + +import re, string, sys + +_whitespace_re = re.compile ("\s+", re.MULTILINE) + +def find_binheader_writefs (data): + lst = re.findall ('psf_binheader_writef\s*\(\s*[a-zA-Z_]+\s*,\s*\"[^;]+;', data, re.MULTILINE) + return [_whitespace_re.sub (" ", x) for x in lst] + +def find_format_string (s): + fmt = re.search ('"([^"]+)"', s) + if not fmt: + print ("Bad format in :\n\n\t%s\n\n" % s) + sys.exit (1) + fmt = fmt.groups () + if len (fmt) != 1: + print ("Bad format in :\n\n\t%s\n\n" % s) + sys.exit (1) + return _whitespace_re.sub ("", fmt [0]) + +def get_param_list (data): + dlist = re.search ("\((.+)\)\s*;", data) + dlist = dlist.groups ()[0] + dlist = dlist.split(",") + dlist = [x.strip() for x in dlist] + return dlist [2:] + +def handle_file (fname): + errors = 0 + data = open (fname, "r").read () + + # return errors + + writefs = find_binheader_writefs (data) + for item in writefs: + fmt = find_format_string (item) + params = get_param_list (item) + param_index = 0 + + # print item + + for ch in fmt: + if ch in 'Eet ': + continue + + if ch == 'b': + if params [param_index][:4] == "BHWv" and params [param_index + 1][:4] == "BHWz": + param_index += 2 + continue + + if "BHW" + ch == params [param_index][:4]: + param_index += 1 + continue + + if errors == 0: sys.stdout.write ("\n") + print ("\n%s: error for format specifier '%c' (index %d) in:\n %s\n" % (fname, ch, param_index, item)) + errors += 1 + # Break out of 'for ch in fmt' loop + break + + return errors + +#=============================================================================== + +if len (sys.argv) > 1: + sys.stdout.write ("\n binheader_writef_check : ") + sys.stdout.flush () + errors = 0 + for fname in sys.argv [1:]: + errors += handle_file (fname) + if errors > 0: + print ("\nErrors : %d\n" % errors) + sys.exit (1) + +print ("ok\n") + diff --git a/libsndfile-1.0.31/src/broadcast.c b/libsndfile-1.0.31/src/broadcast.c new file mode 100644 index 0000000..16575bb --- /dev/null +++ b/libsndfile-1.0.31/src/broadcast.c @@ -0,0 +1,190 @@ +/* +** Copyright (C) 2006-2016 Erik de Castro Lopo +** Copyright (C) 2006 Paul Davis +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#include "common.h" + + +static int gen_coding_history (char * added_history, int added_history_max, const SF_INFO * psfinfo) ; + +static inline size_t +bc_min_size (const SF_BROADCAST_INFO* info) +{ if (info == NULL) + return 0 ; + + return offsetof (SF_BROADCAST_INFO, coding_history) + info->coding_history_size ; +} /* bc_min_size */ + +SF_BROADCAST_INFO_16K* +broadcast_var_alloc (void) +{ return calloc (1, sizeof (SF_BROADCAST_INFO_16K)) ; +} /* broadcast_var_alloc */ + +int +broadcast_var_set (SF_PRIVATE *psf, const SF_BROADCAST_INFO * info, size_t datasize) +{ size_t len ; + + if (info == NULL) + return SF_FALSE ; + + if (bc_min_size (info) > datasize) + { psf->error = SFE_BAD_BROADCAST_INFO_SIZE ; + return SF_FALSE ; + } ; + + if (datasize >= sizeof (SF_BROADCAST_INFO_16K)) + { psf->error = SFE_BAD_BROADCAST_INFO_TOO_BIG ; + return SF_FALSE ; + } ; + + if (psf->broadcast_16k == NULL) + { if ((psf->broadcast_16k = broadcast_var_alloc ()) == NULL) + { psf->error = SFE_MALLOC_FAILED ; + return SF_FALSE ; + } ; + } ; + + /* Only copy the first part of the struct. */ + memcpy (psf->broadcast_16k, info, offsetof (SF_BROADCAST_INFO, coding_history)) ; + + psf_strlcpy_crlf (psf->broadcast_16k->coding_history, info->coding_history, sizeof (psf->broadcast_16k->coding_history), datasize - offsetof (SF_BROADCAST_INFO, coding_history)) ; + len = strlen (psf->broadcast_16k->coding_history) ; + + if (len > 0 && psf->broadcast_16k->coding_history [len - 1] != '\n') + psf_strlcat (psf->broadcast_16k->coding_history, sizeof (psf->broadcast_16k->coding_history), "\r\n") ; + + if (psf->file.mode == SFM_WRITE) + { char added_history [256] ; + + gen_coding_history (added_history, sizeof (added_history), &(psf->sf)) ; + psf_strlcat (psf->broadcast_16k->coding_history, sizeof (psf->broadcast_16k->coding_history), added_history) ; + } ; + + /* Force coding_history_size to be even. */ + len = strlen (psf->broadcast_16k->coding_history) ; + len += (len & 1) ? 1 : 0 ; + psf->broadcast_16k->coding_history_size = len ; + + /* Currently writing this version. */ + psf->broadcast_16k->version = 2 ; + + return SF_TRUE ; +} /* broadcast_var_set */ + + +int +broadcast_var_get (SF_PRIVATE *psf, SF_BROADCAST_INFO * data, size_t datasize) +{ size_t size ; + + if (psf->broadcast_16k == NULL) + return SF_FALSE ; + + size = SF_MIN (datasize, bc_min_size ((const SF_BROADCAST_INFO *) psf->broadcast_16k)) ; + + memcpy (data, psf->broadcast_16k, size) ; + + return SF_TRUE ; +} /* broadcast_var_get */ + +/*------------------------------------------------------------------------------ +*/ + +static int +gen_coding_history (char * added_history, int added_history_max, const SF_INFO * psfinfo) +{ char chnstr [16] ; + int count, width ; + + /* + ** From : http://www.sr.se/utveckling/tu/bwf/docs/codhist2.htm + ** + ** Parameter Variable string Unit + ** ========================================================================================== + ** Coding Algorithm A= + ** Sampling frequency F=<11000,22050,24000,32000,44100,48000> [Hz] + ** Bit-rate B= + ** Word Length W=<8, 12, 14, 16, 18, 20, 22, 24> [bits] + ** Mode M= + ** Text, free string T= + */ + + switch (psfinfo->channels) + { case 0 : + return SF_FALSE ; + + case 1 : + psf_strlcpy (chnstr, sizeof (chnstr), "mono") ; + break ; + + case 2 : + psf_strlcpy (chnstr, sizeof (chnstr), "stereo") ; + break ; + + default : + snprintf (chnstr, sizeof (chnstr), "%uchn", psfinfo->channels) ; + break ; + } ; + + switch (SF_CODEC (psfinfo->format)) + { case SF_FORMAT_PCM_U8 : + case SF_FORMAT_PCM_S8 : + width = 8 ; + break ; + case SF_FORMAT_PCM_16 : + width = 16 ; + break ; + case SF_FORMAT_PCM_24 : + width = 24 ; + break ; + case SF_FORMAT_PCM_32 : + width = 32 ; + break ; + case SF_FORMAT_FLOAT : + width = 24 ; /* Bits in the mantissa + 1 */ + break ; + case SF_FORMAT_DOUBLE : + width = 53 ; /* Bits in the mantissa + 1 */ + break ; + case SF_FORMAT_ULAW : + case SF_FORMAT_ALAW : + width = 12 ; + break ; + default : + width = 42 ; + break ; + } ; + + count = snprintf (added_history, added_history_max, + "A=PCM,F=%u,W=%d,M=%s,T=%s-%s\r\n", + psfinfo->samplerate, width, chnstr, PACKAGE_NAME, PACKAGE_VERSION) ; + + if (count >= added_history_max) + return 0 ; + + return count ; +} /* gen_coding_history */ diff --git a/libsndfile-1.0.31/src/caf.c b/libsndfile-1.0.31/src/caf.c new file mode 100644 index 0000000..45b1dba --- /dev/null +++ b/libsndfile-1.0.31/src/caf.c @@ -0,0 +1,1033 @@ +/* +** Copyright (C) 2005-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" +#include "chanmap.h" + +/*------------------------------------------------------------------------------ +** Macros to handle big/little endian issues. +*/ + +#define aac_MARKER MAKE_MARKER ('a', 'a', 'c', ' ') +#define alac_MARKER MAKE_MARKER ('a', 'l', 'a', 'c') +#define alaw_MARKER MAKE_MARKER ('a', 'l', 'a', 'w') +#define caff_MARKER MAKE_MARKER ('c', 'a', 'f', 'f') +#define chan_MARKER MAKE_MARKER ('c', 'h', 'a', 'n') +#define data_MARKER MAKE_MARKER ('d', 'a', 't', 'a') +#define desc_MARKER MAKE_MARKER ('d', 'e', 's', 'c') +#define edct_MARKER MAKE_MARKER ('e', 'd', 'c', 't') +#define free_MARKER MAKE_MARKER ('f', 'r', 'e', 'e') +#define ima4_MARKER MAKE_MARKER ('i', 'm', 'a', '4') +#define info_MARKER MAKE_MARKER ('i', 'n', 'f', 'o') +#define inst_MARKER MAKE_MARKER ('i', 'n', 's', 't') +#define kuki_MARKER MAKE_MARKER ('k', 'u', 'k', 'i') +#define lpcm_MARKER MAKE_MARKER ('l', 'p', 'c', 'm') +#define mark_MARKER MAKE_MARKER ('m', 'a', 'r', 'k') +#define midi_MARKER MAKE_MARKER ('m', 'i', 'd', 'i') +#define mp1_MARKER MAKE_MARKER ('.', 'm', 'p', '1') +#define mp2_MARKER MAKE_MARKER ('.', 'm', 'p', '2') +#define mp3_MARKER MAKE_MARKER ('.', 'm', 'p', '3') +#define ovvw_MARKER MAKE_MARKER ('o', 'v', 'v', 'w') +#define pakt_MARKER MAKE_MARKER ('p', 'a', 'k', 't') +#define peak_MARKER MAKE_MARKER ('p', 'e', 'a', 'k') +#define regn_MARKER MAKE_MARKER ('r', 'e', 'g', 'n') +#define strg_MARKER MAKE_MARKER ('s', 't', 'r', 'g') +#define umid_MARKER MAKE_MARKER ('u', 'm', 'i', 'd') +#define uuid_MARKER MAKE_MARKER ('u', 'u', 'i', 'd') +#define ulaw_MARKER MAKE_MARKER ('u', 'l', 'a', 'w') +#define MAC3_MARKER MAKE_MARKER ('M', 'A', 'C', '3') +#define MAC6_MARKER MAKE_MARKER ('M', 'A', 'C', '6') + +#define CAF_PEAK_CHUNK_SIZE(ch) ((int) (sizeof (int) + ch * (sizeof (float) + 8))) + +#define SFE_CAF_NOT_CAF 666 +#define SFE_CAF_NO_DESC 667 +#define SFE_CAF_BAD_PEAK 668 + +/*------------------------------------------------------------------------------ +** Typedefs. +*/ + +typedef struct +{ uint8_t srate [8] ; + uint32_t fmt_id ; + uint32_t fmt_flags ; + uint32_t pkt_bytes ; + uint32_t frames_per_packet ; + uint32_t channels_per_frame ; + uint32_t bits_per_chan ; +} DESC_CHUNK ; + +typedef struct +{ int chanmap_tag ; + + ALAC_DECODER_INFO alac ; +} CAF_PRIVATE ; + +/*------------------------------------------------------------------------------ +** Private static functions. +*/ + +static int caf_close (SF_PRIVATE *psf) ; +static int caf_read_header (SF_PRIVATE *psf) ; +static int caf_write_header (SF_PRIVATE *psf, int calc_length) ; +static int caf_write_tailer (SF_PRIVATE *psf) ; +static int caf_command (SF_PRIVATE *psf, int command, void *data, int datasize) ; +static int caf_read_chanmap (SF_PRIVATE * psf, sf_count_t chunk_size) ; +static int caf_read_strings (SF_PRIVATE * psf, sf_count_t chunk_size) ; +static void caf_write_strings (SF_PRIVATE * psf, int location) ; + + +static int caf_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info) ; +static SF_CHUNK_ITERATOR * caf_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator) ; +static int caf_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ; +static int caf_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ; + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +caf_open (SF_PRIVATE *psf) +{ CAF_PRIVATE * pcaf ; + int subformat, format, error = 0 ; + + if ((psf->container_data = calloc (1, sizeof (CAF_PRIVATE))) == NULL) + return SFE_MALLOC_FAILED ; + + pcaf = psf->container_data ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = caf_read_header (psf))) + return error ; + + psf->next_chunk_iterator = caf_next_chunk_iterator ; + psf->get_chunk_size = caf_get_chunk_size ; + psf->get_chunk_data = caf_get_chunk_data ; + } ; + + subformat = SF_CODEC (psf->sf.format) ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if (psf->is_pipe) + return SFE_NO_PIPE_WRITE ; + + format = SF_CONTAINER (psf->sf.format) ; + if (format != SF_FORMAT_CAF) + return SFE_BAD_OPEN_FORMAT ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + + if (psf->file.mode != SFM_RDWR || psf->filelength < 44) + { psf->filelength = 0 ; + psf->datalength = 0 ; + psf->dataoffset = 0 ; + psf->sf.frames = 0 ; + } ; + + psf->strings.flags = SF_STR_ALLOW_START | SF_STR_ALLOW_END ; + + /* + ** By default, add the peak chunk to floating point files. Default behaviour + ** can be switched off using sf_command (SFC_SET_PEAK_CHUNK, SF_FALSE). + */ + if (psf->file.mode == SFM_WRITE && (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)) + { if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL) + return SFE_MALLOC_FAILED ; + psf->peak_info->peak_loc = SF_PEAK_START ; + } ; + + if ((error = caf_write_header (psf, SF_FALSE)) != 0) + return error ; + + psf->write_header = caf_write_header ; + psf->set_chunk = caf_set_chunk ; + } ; + + psf->container_close = caf_close ; + psf->command = caf_command ; + + switch (subformat) + { case SF_FORMAT_PCM_S8 : + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_32 : + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_ULAW : + error = ulaw_init (psf) ; + break ; + + case SF_FORMAT_ALAW : + error = alaw_init (psf) ; + break ; + + /* Lite remove start */ + case SF_FORMAT_FLOAT : + error = float32_init (psf) ; + break ; + + case SF_FORMAT_DOUBLE : + error = double64_init (psf) ; + break ; + + case SF_FORMAT_ALAC_16 : + case SF_FORMAT_ALAC_20 : + case SF_FORMAT_ALAC_24 : + case SF_FORMAT_ALAC_32 : + if (psf->file.mode == SFM_READ) + /* Only pass the ALAC_DECODER_INFO in read mode. */ + error = alac_init (psf, &pcaf->alac) ; + else + error = alac_init (psf, NULL) ; + break ; + + /* Lite remove end */ + + default : + return SFE_UNSUPPORTED_ENCODING ; + } ; + + return error ; +} /* caf_open */ + +static int +caf_close (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { caf_write_tailer (psf) ; + caf_write_header (psf, SF_TRUE) ; + } ; + + return 0 ; +} /* caf_close */ + +static int +caf_command (SF_PRIVATE * psf, int command, void * UNUSED (data), int UNUSED (datasize)) +{ CAF_PRIVATE *pcaf ; + + if ((pcaf = psf->container_data) == NULL) + return SFE_INTERNAL ; + + switch (command) + { case SFC_SET_CHANNEL_MAP_INFO : + pcaf->chanmap_tag = aiff_caf_find_channel_layout_tag (psf->channel_map, psf->sf.channels) ; + return (pcaf->chanmap_tag != 0) ; + + default : + break ; + } ; + + return 0 ; +} /* caf_command */ + +/*------------------------------------------------------------------------------ +*/ + +static int +decode_desc_chunk (SF_PRIVATE *psf, const DESC_CHUNK *desc) +{ int format = SF_FORMAT_CAF ; + + psf->sf.channels = desc->channels_per_frame ; + + if (desc->fmt_id == alac_MARKER) + { CAF_PRIVATE *pcaf ; + + if ((pcaf = psf->container_data) != NULL) + { switch (desc->fmt_flags) + { case 1 : + pcaf->alac.bits_per_sample = 16 ; + format |= SF_FORMAT_ALAC_16 ; + break ; + case 2 : + pcaf->alac.bits_per_sample = 20 ; + format |= SF_FORMAT_ALAC_20 ; + break ; + case 3 : + pcaf->alac.bits_per_sample = 24 ; + format |= SF_FORMAT_ALAC_24 ; + break ; + case 4 : + pcaf->alac.bits_per_sample = 32 ; + format |= SF_FORMAT_ALAC_32 ; + break ; + default : + psf_log_printf (psf, "Bad ALAC format flag value of %d\n", desc->fmt_flags) ; + } ; + + pcaf->alac.frames_per_packet = desc->frames_per_packet ; + } ; + + return format ; + } ; + + format |= psf->endian == SF_ENDIAN_LITTLE ? SF_ENDIAN_LITTLE : 0 ; + + if (desc->fmt_id == lpcm_MARKER && desc->fmt_flags & 1) + { /* Floating point data. */ + if (desc->bits_per_chan == 32 && desc->pkt_bytes == 4 * desc->channels_per_frame) + { psf->bytewidth = 4 ; + return format | SF_FORMAT_FLOAT ; + } ; + if (desc->bits_per_chan == 64 && desc->pkt_bytes == 8 * desc->channels_per_frame) + { psf->bytewidth = 8 ; + return format | SF_FORMAT_DOUBLE ; + } ; + } ; + + if (desc->fmt_id == lpcm_MARKER && (desc->fmt_flags & 1) == 0) + { /* Integer data. */ + if (desc->bits_per_chan == 32 && desc->pkt_bytes == 4 * desc->channels_per_frame) + { psf->bytewidth = 4 ; + return format | SF_FORMAT_PCM_32 ; + } ; + if (desc->bits_per_chan == 24 && desc->pkt_bytes == 3 * desc->channels_per_frame) + { psf->bytewidth = 3 ; + return format | SF_FORMAT_PCM_24 ; + } ; + if (desc->bits_per_chan == 16 && desc->pkt_bytes == 2 * desc->channels_per_frame) + { psf->bytewidth = 2 ; + return format | SF_FORMAT_PCM_16 ; + } ; + if (desc->bits_per_chan == 8 && desc->pkt_bytes == 1 * desc->channels_per_frame) + { psf->bytewidth = 1 ; + return format | SF_FORMAT_PCM_S8 ; + } ; + } ; + + if (desc->fmt_id == alaw_MARKER && desc->bits_per_chan == 8) + { psf->bytewidth = 1 ; + return format | SF_FORMAT_ALAW ; + } ; + + if (desc->fmt_id == ulaw_MARKER && desc->bits_per_chan == 8) + { psf->bytewidth = 1 ; + return format | SF_FORMAT_ULAW ; + } ; + + psf_log_printf (psf, "**** Unknown format identifier.\n") ; + + return 0 ; +} /* decode_desc_chunk */ + +static int +caf_read_header (SF_PRIVATE *psf) +{ CAF_PRIVATE *pcaf ; + BUF_UNION ubuf ; + DESC_CHUNK desc ; + sf_count_t chunk_size ; + double srate ; + short version, flags ; + int marker, k, have_data = 0, error ; + + if ((pcaf = psf->container_data) == NULL) + return SFE_INTERNAL ; + + memset (&desc, 0, sizeof (desc)) ; + + /* Set position to start of file to begin reading header. */ + psf_binheader_readf (psf, "pmE2E2", 0, &marker, &version, &flags) ; + psf_log_printf (psf, "%M\n Version : %d\n Flags : %x\n", marker, version, flags) ; + if (marker != caff_MARKER) + return SFE_CAF_NOT_CAF ; + + psf_binheader_readf (psf, "mE8b", &marker, &chunk_size, ubuf.ucbuf, 8) ; + srate = double64_be_read (ubuf.ucbuf) ; + snprintf (ubuf.cbuf, sizeof (ubuf.cbuf), "%5.3f", srate) ; + psf_log_printf (psf, "%M : %D\n Sample rate : %s\n", marker, chunk_size, ubuf.cbuf) ; + if (marker != desc_MARKER) + return SFE_CAF_NO_DESC ; + + if (chunk_size < SIGNED_SIZEOF (DESC_CHUNK)) + { psf_log_printf (psf, "**** Chunk size too small. Should be > 32 bytes.\n") ; + return SFE_MALFORMED_FILE ; + } ; + + psf->sf.samplerate = psf_lrint (srate) ; + + psf_binheader_readf (psf, "mE44444", &desc.fmt_id, &desc.fmt_flags, &desc.pkt_bytes, &desc.frames_per_packet, + &desc.channels_per_frame, &desc.bits_per_chan) ; + psf_log_printf (psf, " Format id : %M\n Format flags : %x\n Bytes / packet : %u\n" + " Frames / packet : %u\n Channels / frame : %u\n Bits / channel : %u\n", + desc.fmt_id, desc.fmt_flags, desc.pkt_bytes, desc.frames_per_packet, desc.channels_per_frame, desc.bits_per_chan) ; + + if (desc.channels_per_frame > SF_MAX_CHANNELS) + { psf_log_printf (psf, "**** Bad channels per frame value %u.\n", desc.channels_per_frame) ; + return SFE_MALFORMED_FILE ; + } ; + + if (chunk_size > SIGNED_SIZEOF (DESC_CHUNK)) + psf_binheader_readf (psf, "j", (int) (chunk_size - sizeof (DESC_CHUNK))) ; + + psf->sf.channels = desc.channels_per_frame ; + + while (1) + { marker = 0 ; + chunk_size = 0 ; + + psf_binheader_readf (psf, "mE8", &marker, &chunk_size) ; + if (marker == 0) + { sf_count_t pos = psf_ftell (psf) ; + psf_log_printf (psf, "Have 0 marker at position %D (0x%x).\n", pos, pos) ; + break ; + } ; + if (chunk_size < 0) + { psf_log_printf (psf, "%M : %D *** Should be >= 0 ***\n", marker, chunk_size) ; + break ; + } ; + if (chunk_size > psf->filelength) + break ; + + psf_store_read_chunk_u32 (&psf->rchunks, marker, psf_ftell (psf), chunk_size) ; + + switch (marker) + { case peak_MARKER : + psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ; + if (chunk_size != CAF_PEAK_CHUNK_SIZE (psf->sf.channels)) + { psf_binheader_readf (psf, "j", make_size_t (chunk_size)) ; + psf_log_printf (psf, "*** File PEAK chunk %D should be %d.\n", chunk_size, CAF_PEAK_CHUNK_SIZE (psf->sf.channels)) ; + return SFE_CAF_BAD_PEAK ; + } ; + + if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL) + return SFE_MALLOC_FAILED ; + + /* read in rest of PEAK chunk. */ + psf_binheader_readf (psf, "E4", & (psf->peak_info->edit_number)) ; + psf_log_printf (psf, " edit count : %d\n", psf->peak_info->edit_number) ; + + psf_log_printf (psf, " Ch Position Value\n") ; + for (k = 0 ; k < psf->sf.channels ; k++) + { sf_count_t position ; + float value ; + + psf_binheader_readf (psf, "Ef8", &value, &position) ; + psf->peak_info->peaks [k].value = value ; + psf->peak_info->peaks [k].position = position ; + + snprintf (ubuf.cbuf, sizeof (ubuf.cbuf), " %2d %-12" PRId64 " %g\n", k, position, value) ; + psf_log_printf (psf, ubuf.cbuf) ; + } ; + + psf->peak_info->peak_loc = SF_PEAK_START ; + break ; + + case chan_MARKER : + if (chunk_size < 12) + { psf_log_printf (psf, "%M : %D (should be >= 12)\n", marker, chunk_size) ; + psf_binheader_readf (psf, "j", make_size_t (chunk_size)) ; + break ; + } + + psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ; + + if ((error = caf_read_chanmap (psf, chunk_size))) + return error ; + break ; + + case free_MARKER : + psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ; + psf_binheader_readf (psf, "j", make_size_t (chunk_size)) ; + break ; + + case data_MARKER : + psf_binheader_readf (psf, "E4", &k) ; + if (chunk_size == -1) + { psf_log_printf (psf, "%M : -1\n") ; + chunk_size = psf->filelength - psf->header.indx ; + } + else if (psf->filelength > 0 && chunk_size > psf->filelength - psf->header.indx + 10) + { psf_log_printf (psf, "%M : %D (should be %D)\n", marker, chunk_size, psf->filelength - psf->header.indx - 8) ; + psf->datalength = psf->filelength - psf->header.indx - 8 ; + } + else + { psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ; + /* Subtract the 4 bytes of the 'edit' field above. */ + psf->datalength = chunk_size - 4 ; + } ; + + psf_log_printf (psf, " edit : %u\n", k) ; + + psf->dataoffset = psf->header.indx ; + if (psf->datalength + psf->dataoffset < psf->filelength) + psf->dataend = psf->datalength + psf->dataoffset ; + + psf_binheader_readf (psf, "j", make_size_t (psf->datalength)) ; + have_data = 1 ; + break ; + + case kuki_MARKER : + psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ; + pcaf->alac.kuki_offset = psf_ftell (psf) - 12 ; + psf_binheader_readf (psf, "j", make_size_t (chunk_size)) ; + break ; + + case pakt_MARKER : + if (chunk_size < 24) + { psf_log_printf (psf, "%M : %D (should be > 24)\n", marker, chunk_size) ; + return SFE_MALFORMED_FILE ; + } + else if (chunk_size > psf->filelength - psf->header.indx) + { psf_log_printf (psf, "%M : %D (should be < %D)\n", marker, chunk_size, psf->filelength - psf->header.indx) ; + return SFE_MALFORMED_FILE ; + } + else + psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ; + + psf_binheader_readf (psf, "E8844", &pcaf->alac.packets, &pcaf->alac.valid_frames, + &pcaf->alac.priming_frames, &pcaf->alac.remainder_frames) ; + + psf_log_printf (psf, + " Packets : %D\n" + " Valid frames : %D\n" + " Priming frames : %d\n" + " Remainder frames : %d\n", + pcaf->alac.packets, pcaf->alac.valid_frames, pcaf->alac.priming_frames, + pcaf->alac.remainder_frames + ) ; + + if (pcaf->alac.packets == 0 && pcaf->alac.valid_frames == 0 + && pcaf->alac.priming_frames == 0 && pcaf->alac.remainder_frames == 0) + psf_log_printf (psf, "*** 'pakt' chunk header is all zero.\n") ; + + pcaf->alac.pakt_offset = psf_ftell (psf) - 12 ; + psf_binheader_readf (psf, "j", make_size_t (chunk_size) - 24) ; + break ; + + case info_MARKER : + if (chunk_size < 4) + { psf_log_printf (psf, "%M : %D (should be > 4)\n", marker, chunk_size) ; + return SFE_MALFORMED_FILE ; + } + else if (chunk_size > psf->filelength - psf->header.indx) + { psf_log_printf (psf, "%M : %D (should be < %D)\n", marker, chunk_size, psf->filelength - psf->header.indx) ; + return SFE_MALFORMED_FILE ; + } ; + psf_log_printf (psf, "%M : %D\n", marker, chunk_size) ; + if (chunk_size > 4) + caf_read_strings (psf, chunk_size - 4) ; + break ; + + default : + psf_log_printf (psf, "%M : %D (skipped)\n", marker, chunk_size) ; + psf_binheader_readf (psf, "j", make_size_t (chunk_size)) ; + break ; + } ; + + if (marker != data_MARKER && chunk_size >= 0xffffff00) + break ; + + if (! psf->sf.seekable && have_data) + break ; + + if (psf_ftell (psf) >= psf->filelength - SIGNED_SIZEOF (chunk_size)) + { psf_log_printf (psf, "End\n") ; + break ; + } ; + } ; + + if (have_data == 0) + { psf_log_printf (psf, "**** Error, could not find 'data' chunk.\n") ; + return SFE_MALFORMED_FILE ; + } ; + + psf->endian = (desc.fmt_flags & 2) ? SF_ENDIAN_LITTLE : SF_ENDIAN_BIG ; + + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + + if ((psf->sf.format = decode_desc_chunk (psf, &desc)) == 0) + return SFE_UNSUPPORTED_ENCODING ; + + if (psf->bytewidth > 0) + psf->sf.frames = psf->datalength / psf->bytewidth ; + + return 0 ; +} /* caf_read_header */ + +/*------------------------------------------------------------------------------ +*/ + +static int +caf_write_header (SF_PRIVATE *psf, int calc_length) +{ BUF_UNION ubuf ; + CAF_PRIVATE *pcaf ; + DESC_CHUNK desc ; + sf_count_t current ; + uint32_t uk ; + int subformat, append_free_block = SF_TRUE ; + + if ((pcaf = psf->container_data) == NULL) + return SFE_INTERNAL ; + + memset (&desc, 0, sizeof (desc)) ; + + current = psf_ftell (psf) ; + + if (calc_length) + { psf->filelength = psf_get_filelen (psf) ; + + psf->datalength = psf->filelength - psf->dataoffset ; + + if (psf->dataend) + psf->datalength -= psf->filelength - psf->dataend ; + + if (psf->bytewidth > 0) + psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; + } ; + + /* Reset the current header length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + psf_fseek (psf, 0, SEEK_SET) ; + + /* 'caff' marker, version and flags. */ + psf_binheader_writef (psf, "Em22", BHWm (caff_MARKER), BHW2 (1), BHW2 (0)) ; + + /* 'desc' marker and chunk size. */ + psf_binheader_writef (psf, "Em8", BHWm (desc_MARKER), BHW8 ((sf_count_t) (sizeof (DESC_CHUNK)))) ; + + double64_be_write (1.0 * psf->sf.samplerate, ubuf.ucbuf) ; + psf_binheader_writef (psf, "b", BHWv (ubuf.ucbuf), BHWz (8)) ; + + subformat = SF_CODEC (psf->sf.format) ; + + psf->endian = SF_ENDIAN (psf->sf.format) ; + + if (CPU_IS_BIG_ENDIAN && (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU)) + psf->endian = SF_ENDIAN_BIG ; + else if (CPU_IS_LITTLE_ENDIAN && (psf->endian == SF_ENDIAN_LITTLE || psf->endian == SF_ENDIAN_CPU)) + psf->endian = SF_ENDIAN_LITTLE ; + + if (psf->endian == SF_ENDIAN_LITTLE) + desc.fmt_flags = 2 ; + else + psf->endian = SF_ENDIAN_BIG ; + + /* initial section (same for all, it appears) */ + switch (subformat) + { case SF_FORMAT_PCM_S8 : + desc.fmt_id = lpcm_MARKER ; + psf->bytewidth = 1 ; + desc.pkt_bytes = psf->bytewidth * psf->sf.channels ; + desc.frames_per_packet = 1 ; + desc.channels_per_frame = psf->sf.channels ; + desc.bits_per_chan = 8 ; + break ; + + case SF_FORMAT_PCM_16 : + desc.fmt_id = lpcm_MARKER ; + psf->bytewidth = 2 ; + desc.pkt_bytes = psf->bytewidth * psf->sf.channels ; + desc.frames_per_packet = 1 ; + desc.channels_per_frame = psf->sf.channels ; + desc.bits_per_chan = 16 ; + break ; + + case SF_FORMAT_PCM_24 : + psf->bytewidth = 3 ; + desc.pkt_bytes = psf->bytewidth * psf->sf.channels ; + desc.frames_per_packet = 1 ; + desc.channels_per_frame = psf->sf.channels ; + desc.bits_per_chan = 24 ; + desc.fmt_id = lpcm_MARKER ; + break ; + + case SF_FORMAT_PCM_32 : + desc.fmt_id = lpcm_MARKER ; + psf->bytewidth = 4 ; + desc.pkt_bytes = psf->bytewidth * psf->sf.channels ; + desc.frames_per_packet = 1 ; + desc.channels_per_frame = psf->sf.channels ; + desc.bits_per_chan = 32 ; + break ; + + case SF_FORMAT_FLOAT : + desc.fmt_id = lpcm_MARKER ; + desc.fmt_flags |= 1 ; + psf->bytewidth = 4 ; + desc.pkt_bytes = psf->bytewidth * psf->sf.channels ; + desc.frames_per_packet = 1 ; + desc.channels_per_frame = psf->sf.channels ; + desc.bits_per_chan = 32 ; + break ; + + case SF_FORMAT_DOUBLE : + desc.fmt_id = lpcm_MARKER ; + desc.fmt_flags |= 1 ; + psf->bytewidth = 8 ; + desc.pkt_bytes = psf->bytewidth * psf->sf.channels ; + desc.frames_per_packet = 1 ; + desc.channels_per_frame = psf->sf.channels ; + desc.bits_per_chan = 64 ; + break ; + + case SF_FORMAT_ALAW : + desc.fmt_id = alaw_MARKER ; + psf->bytewidth = 1 ; + desc.pkt_bytes = psf->bytewidth * psf->sf.channels ; + desc.frames_per_packet = 1 ; + desc.channels_per_frame = psf->sf.channels ; + desc.bits_per_chan = 8 ; + break ; + + case SF_FORMAT_ULAW : + desc.fmt_id = ulaw_MARKER ; + psf->bytewidth = 1 ; + desc.pkt_bytes = psf->bytewidth * psf->sf.channels ; + desc.frames_per_packet = 1 ; + desc.channels_per_frame = psf->sf.channels ; + desc.bits_per_chan = 8 ; + break ; + + case SF_FORMAT_ALAC_16 : + case SF_FORMAT_ALAC_20 : + case SF_FORMAT_ALAC_24 : + case SF_FORMAT_ALAC_32 : + desc.fmt_id = alac_MARKER ; + desc.pkt_bytes = psf->bytewidth * psf->sf.channels ; + desc.channels_per_frame = psf->sf.channels ; + alac_get_desc_chunk_items (subformat, &desc.fmt_flags, &desc.frames_per_packet) ; + append_free_block = SF_FALSE ; + break ; + + default : + return SFE_UNIMPLEMENTED ; + } ; + + psf_binheader_writef (psf, "mE44444", BHWm (desc.fmt_id), BHW4 (desc.fmt_flags), BHW4 (desc.pkt_bytes), BHW4 (desc.frames_per_packet), BHW4 (desc.channels_per_frame), BHW4 (desc.bits_per_chan)) ; + + caf_write_strings (psf, SF_STR_LOCATE_START) ; + + if (psf->peak_info != NULL) + { int k ; + psf_binheader_writef (psf, "Em84", BHWm (peak_MARKER), BHW8 ((sf_count_t) CAF_PEAK_CHUNK_SIZE (psf->sf.channels)), BHW4 (psf->peak_info->edit_number)) ; + for (k = 0 ; k < psf->sf.channels ; k++) + psf_binheader_writef (psf, "Ef8", BHWf ((float) psf->peak_info->peaks [k].value), BHW8 (psf->peak_info->peaks [k].position)) ; + } ; + + if (psf->channel_map && pcaf->chanmap_tag) + psf_binheader_writef (psf, "Em8444", BHWm (chan_MARKER), BHW8 ((sf_count_t) 12), BHW4 (pcaf->chanmap_tag), BHW4 (0), BHW4 (0)) ; + + /* Write custom headers. */ + for (uk = 0 ; uk < psf->wchunks.used ; uk++) + psf_binheader_writef (psf, "m44b", BHWm ((int) psf->wchunks.chunks [uk].mark32), BHW4 (0), BHW4 (psf->wchunks.chunks [uk].len), BHWv (psf->wchunks.chunks [uk].data), BHWz (psf->wchunks.chunks [uk].len)) ; + + if (append_free_block) + { /* Add free chunk so that the actual audio data starts at a multiple 0x1000. */ + sf_count_t free_len = 0x1000 - psf->header.indx - 16 - 12 ; + while (free_len < 0) + free_len += 0x1000 ; + psf_binheader_writef (psf, "Em8z", BHWm (free_MARKER), BHW8 (free_len), BHWz (free_len)) ; + } ; + + psf_binheader_writef (psf, "Em84", BHWm (data_MARKER), BHW8 (psf->datalength + 4), BHW4 (0)) ; + + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + if (psf->error) + return psf->error ; + + psf->dataoffset = psf->header.indx ; + if (current < psf->dataoffset) + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + else if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + + return psf->error ; +} /* caf_write_header */ + +static int +caf_write_tailer (SF_PRIVATE *psf) +{ + /* Reset the current header buffer length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + + if (psf->bytewidth > 0 && psf->sf.seekable == SF_TRUE) + { psf->datalength = psf->sf.frames * psf->bytewidth * psf->sf.channels ; + psf->dataend = psf->dataoffset + psf->datalength ; + } ; + + if (psf->dataend > 0) + psf_fseek (psf, psf->dataend, SEEK_SET) ; + else + psf->dataend = psf_fseek (psf, 0, SEEK_END) ; + + if (psf->dataend & 1) + psf_binheader_writef (psf, "z", BHWz (1)) ; + + if (psf->strings.flags & SF_STR_LOCATE_END) + caf_write_strings (psf, SF_STR_LOCATE_END) ; + + /* Write the tailer. */ + if (psf->header.indx > 0) + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + return 0 ; +} /* caf_write_tailer */ + +static int +caf_read_chanmap (SF_PRIVATE * psf, sf_count_t chunk_size) +{ const AIFF_CAF_CHANNEL_MAP * map_info ; + unsigned channel_bitmap, channel_decriptions, bytesread ; + int layout_tag ; + + bytesread = psf_binheader_readf (psf, "E444", &layout_tag, &channel_bitmap, &channel_decriptions) ; + + map_info = aiff_caf_of_channel_layout_tag (layout_tag) ; + + psf_log_printf (psf, " Tag : %x\n", layout_tag) ; + if (map_info) + psf_log_printf (psf, " Layout : %s\n", map_info->name) ; + + if (bytesread < chunk_size) + psf_binheader_readf (psf, "j", chunk_size - bytesread) ; + + if (map_info && map_info->channel_map != NULL) + { size_t chanmap_size = SF_MIN (psf->sf.channels, layout_tag & 0xff) * sizeof (psf->channel_map [0]) ; + + free (psf->channel_map) ; + + if ((psf->channel_map = malloc (chanmap_size)) == NULL) + return SFE_MALLOC_FAILED ; + + memcpy (psf->channel_map, map_info->channel_map, chanmap_size) ; + } ; + + return 0 ; +} /* caf_read_chanmap */ + + +static uint32_t +string_hash32 (const char * str) +{ uint32_t hash = 0x87654321 ; + + while (str [0]) + { hash = hash * 333 + str [0] ; + str ++ ; + } ; + + return hash ; +} /* string_hash32 */ + +static int +caf_read_strings (SF_PRIVATE * psf, sf_count_t chunk_size) +{ char *buf ; + char *key, *value ; + uint32_t count, hash ; + + if ((buf = malloc (chunk_size + 1)) == NULL) + return (psf->error = SFE_MALLOC_FAILED) ; + + psf_binheader_readf (psf, "E4b", &count, buf, make_size_t (chunk_size)) ; + psf_log_printf (psf, " count: %u\n", count) ; + + /* Force terminate `buf` to make sure. */ + buf [chunk_size] = 0 ; + + for (key = buf ; key < buf + chunk_size ; ) + { value = key + strlen (key) + 1 ; + if (value > buf + chunk_size) + break ; + psf_log_printf (psf, " %-12s : %s\n", key, value) ; + + hash = string_hash32 (key) ; + switch (hash) + { case 0xC4861943 : /* 'title' */ + psf_store_string (psf, SF_STR_TITLE, value) ; + break ; + case 0xAD47A394 : /* 'software' */ + psf_store_string (psf, SF_STR_SOFTWARE, value) ; + break ; + case 0x5D178E2A : /* 'copyright' */ + psf_store_string (psf, SF_STR_COPYRIGHT, value) ; + break ; + case 0x60E4D0C8 : /* 'artist' */ + psf_store_string (psf, SF_STR_ARTIST, value) ; + break ; + case 0x83B5D16A : /* 'genre' */ + psf_store_string (psf, SF_STR_GENRE, value) ; + break ; + case 0x15E5FC88 : /* 'comment' */ + case 0x7C297D5B : /* 'comments' */ + psf_store_string (psf, SF_STR_COMMENT, value) ; + break ; + case 0x24A7C347 : /* 'tracknumber' */ + psf_store_string (psf, SF_STR_TRACKNUMBER, value) ; + break ; + case 0x50A31EB7 : /* 'date' */ + psf_store_string (psf, SF_STR_DATE, value) ; + break ; + case 0x6583545A : /* 'album' */ + psf_store_string (psf, SF_STR_ALBUM, value) ; + break ; + case 0xE7C64B6C : /* 'license' */ + psf_store_string (psf, SF_STR_LICENSE, value) ; + break ; + default : + psf_log_printf (psf, " Unhandled hash 0x%x : /* '%s' */\n", hash, key) ; + break ; + } ; + + key = value + strlen (value) + 1 ; + } ; + + free (buf) ; + + return 0 ; +} /* caf_read_strings */ + +struct put_buffer +{ uint32_t index ; + char s [16 * 1024] ; +} ; + +static uint32_t +put_key_value (struct put_buffer * buf, const char * key, const char * value) +{ uint32_t written ; + + if (buf->index + strlen (key) + strlen (value) + 2 > sizeof (buf->s)) + return 0 ; + + written = snprintf (buf->s + buf->index, sizeof (buf->s) - buf->index, "%s%c%s%c", key, 0, value, 0) ; + + if (buf->index + written >= sizeof (buf->s)) + return 0 ; + + buf->index += written ; + return 1 ; +} /* put_key_value */ + +static void +caf_write_strings (SF_PRIVATE * psf, int location) +{ struct put_buffer buf ; + const char * cptr ; + uint32_t k, string_count = 0 ; + + memset (&buf, 0, sizeof (buf)) ; + + for (k = 0 ; k < SF_MAX_STRINGS ; k++) + { if (psf->strings.data [k].type == 0) + break ; + + if (psf->strings.data [k].flags != location) + continue ; + + if ((cptr = psf_get_string (psf, psf->strings.data [k].type)) == NULL) + continue ; + + switch (psf->strings.data [k].type) + { case SF_STR_TITLE : + string_count += put_key_value (&buf, "title", cptr) ; + break ; + case SF_STR_COPYRIGHT : + string_count += put_key_value (&buf, "copyright", cptr) ; + break ; + case SF_STR_SOFTWARE : + string_count += put_key_value (&buf, "software", cptr) ; + break ; + case SF_STR_ARTIST : + string_count += put_key_value (&buf, "artist", cptr) ; + break ; + case SF_STR_COMMENT : + string_count += put_key_value (&buf, "comment", cptr) ; + break ; + case SF_STR_DATE : + string_count += put_key_value (&buf, "date", cptr) ; + break ; + case SF_STR_ALBUM : + string_count += put_key_value (&buf, "album", cptr) ; + break ; + case SF_STR_LICENSE : + string_count += put_key_value (&buf, "license", cptr) ; + break ; + case SF_STR_TRACKNUMBER : + string_count += put_key_value (&buf, "tracknumber", cptr) ; + break ; + case SF_STR_GENRE : + string_count += put_key_value (&buf, "genre", cptr) ; + break ; + + default : + break ; + } ; + } ; + + if (string_count == 0 || buf.index == 0) + return ; + + psf_binheader_writef (psf, "Em84b", BHWm (info_MARKER), BHW8 (buf.index + 4), BHW4 (string_count), BHWv (buf.s), BHWz (buf.index)) ; +} /* caf_write_strings */ + +/*============================================================================== +*/ + +static int +caf_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info) +{ return psf_save_write_chunk (&psf->wchunks, chunk_info) ; +} /* caf_set_chunk */ + +static SF_CHUNK_ITERATOR * +caf_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator) +{ return psf_next_chunk_iterator (&psf->rchunks, iterator) ; +} /* caf_next_chunk_iterator */ + +static int +caf_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) +{ int indx ; + + if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0) + return SFE_UNKNOWN_CHUNK ; + + chunk_info->datalen = psf->rchunks.chunks [indx].len ; + + return SFE_NO_ERROR ; +} /* caf_get_chunk_size */ + +static int +caf_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) +{ int indx ; + sf_count_t pos ; + + if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0) + return SFE_UNKNOWN_CHUNK ; + + if (chunk_info->data == NULL) + return SFE_BAD_CHUNK_DATA_PTR ; + + chunk_info->id_size = psf->rchunks.chunks [indx].id_size ; + memcpy (chunk_info->id, psf->rchunks.chunks [indx].id, sizeof (chunk_info->id) / sizeof (*chunk_info->id)) ; + + pos = psf_ftell (psf) ; + psf_fseek (psf, psf->rchunks.chunks [indx].offset, SEEK_SET) ; + psf_fread (chunk_info->data, SF_MIN (chunk_info->datalen, psf->rchunks.chunks [indx].len), 1, psf) ; + psf_fseek (psf, pos, SEEK_SET) ; + + return SFE_NO_ERROR ; +} /* caf_get_chunk_data */ diff --git a/libsndfile-1.0.31/src/cart.c b/libsndfile-1.0.31/src/cart.c new file mode 100644 index 0000000..a56ed60 --- /dev/null +++ b/libsndfile-1.0.31/src/cart.c @@ -0,0 +1,101 @@ +/* +** Copyright (C) 2012 Chris Roberts +** Copyright (C) 2006-2013 Erik de Castro Lopo +** Copyright (C) 2006 Paul Davis +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include "common.h" + + + +static inline size_t +cart_min_size (const SF_CART_INFO* info) +{ if (info == NULL) + return 0 ; + + return offsetof (SF_CART_INFO, tag_text) + info->tag_text_size ; +} /* cart_min_size */ + +SF_CART_INFO_16K* +cart_var_alloc (void) +{ SF_CART_INFO_16K* thing ; + thing = malloc (sizeof (SF_CART_INFO_16K)) ; + return thing ; +} /* cart_var_alloc */ + +int +cart_var_set (SF_PRIVATE *psf, const SF_CART_INFO * info, size_t datasize) +{ size_t len ; + + if (info == NULL) + return SF_FALSE ; + + if (cart_min_size (info) > datasize) + { psf->error = SFE_BAD_CART_INFO_SIZE ; + return SF_FALSE ; + } ; + + if (datasize >= sizeof (SF_CART_INFO_16K)) + { psf->error = SFE_BAD_CART_INFO_TOO_BIG ; + return SF_FALSE ; + } ; + + if (psf->cart_16k == NULL) + { if ((psf->cart_16k = cart_var_alloc ()) == NULL) + { psf->error = SFE_MALLOC_FAILED ; + return SF_FALSE ; + } ; + } ; + + memcpy (psf->cart_16k, info, offsetof (SF_CART_INFO, tag_text)) ; + psf_strlcpy_crlf (psf->cart_16k->tag_text, info->tag_text, sizeof (psf->cart_16k->tag_text), datasize - offsetof (SF_CART_INFO, tag_text)) ; + + len = strlen (psf->cart_16k->tag_text) ; + + if (len > 0 && psf->cart_16k->tag_text [len - 1] != '\n') + psf_strlcat (psf->cart_16k->tag_text, sizeof (psf->cart_16k->tag_text), "\r\n") ; + + /* Force tag_text_size to be even. */ + len = strlen (psf->cart_16k->tag_text) ; + len += (len & 1) ? 1 : 2 ; + + psf->cart_16k->tag_text_size = len ; + + return SF_TRUE ; +} /* cart_var_set */ + + +int +cart_var_get (SF_PRIVATE *psf, SF_CART_INFO * data, size_t datasize) +{ size_t size ; + if (psf->cart_16k == NULL) + return SF_FALSE ; + + size = SF_MIN (datasize, cart_min_size ((const SF_CART_INFO *) psf->cart_16k)) ; + + memcpy (data, psf->cart_16k, size) ; + + return SF_TRUE ; +} /* cart_var_get */ + + diff --git a/libsndfile-1.0.31/src/chanmap.c b/libsndfile-1.0.31/src/chanmap.c new file mode 100644 index 0000000..c06702c --- /dev/null +++ b/libsndfile-1.0.31/src/chanmap.c @@ -0,0 +1,262 @@ +/* +** Copyright (C) 2009-2014 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +/* +** Mostly from "Apple Core Audio Format Specification 1.0": +** +** http://developer.apple.com/documentation/MusicAudio/Reference/CAFSpec/CAFSpec.pdf +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#include "sndfile.h" +#include "common.h" +#include "chanmap.h" + + +static const AIFF_CAF_CHANNEL_MAP zero_chan [] = +{ { (0 << 16) | 0, NULL, "Use channel descriptions." }, + { (1 << 16) | 0, NULL, "Use channel bitmap." } +} ; /* zero_chan */ + + +static const int one_chan_mono [1] = { SF_CHANNEL_MAP_MONO } ; + +static const AIFF_CAF_CHANNEL_MAP one_chan [] = +{ { (100 << 16) | 1, one_chan_mono, "mono" } +} ; /* one_chan */ + + +static const int two_channel_stereo [2] = { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT } ; + +static const AIFF_CAF_CHANNEL_MAP two_chan [] = +{ { (101 << 16) | 2, two_channel_stereo, "stereo (L, R)" }, + { (102 << 16) | 2, two_channel_stereo, "stereo headphones (L, R)" }, +#if 0 + { (103 << 16) | 2, NULL, "matrix stereo (Lt, Rt)" }, + { (104 << 16) | 2, NULL, "2 channels (mid, side)" }, + { (105 << 16) | 2, NULL, "coincident mic pair" }, + { (106 << 16) | 2, NULL, "binaural stereo (L, R)" + } +#endif +} ; /* two_chan */ + + +static const int three_channel_mpeg_30a [3] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER } ; +static const int three_channel_mpeg_30b [3] = + { SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT } ; +static const int three_channel_itu_21 [3] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_CENTER } ; +static const int three_channel_dvd_4 [3] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_LFE } ; + +static const AIFF_CAF_CHANNEL_MAP three_chan [] = +{ { (113 << 16) | 3, three_channel_mpeg_30a, "MPEG 3 0 A (L, R, C)" }, + { (114 << 16) | 3, three_channel_mpeg_30b, "MPEG 3 0 B (C, L, R)" }, + { (131 << 16) | 3, three_channel_itu_21, "ITU 2.1 (L, R, Cs)" }, + { (133 << 16) | 3, three_channel_dvd_4, "DVD 4 (L, R, LFE)" } +} ; /* three_chan */ + + +static const int four_channel_ambisonc_b [4] = + { SF_CHANNEL_MAP_AMBISONIC_B_W, SF_CHANNEL_MAP_AMBISONIC_B_X, SF_CHANNEL_MAP_AMBISONIC_B_Y, SF_CHANNEL_MAP_AMBISONIC_B_Z } ; +static const int four_channel_quad [4] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ; +static const int four_channel_mpeg_40a [4] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_REAR_CENTER } ; +static const int four_channel_mpeg_40b [4] = + { SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_CENTER } ; +static const int four_channel_itu_23 [4] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ; +static const int four_channel_dvd_5 [4] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_LFE, SF_CHANNEL_MAP_REAR_CENTER } ; +static const int four_channel_dvd_10 [4] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LFE } ; + +static const AIFF_CAF_CHANNEL_MAP four_chan [] = +{ { (107 << 16) | 4, four_channel_ambisonc_b, "ambisonic B (W, X, Y, Z)" }, + { (108 << 16) | 4, four_channel_quad, "quad (Lfront, Rfront, Lrear, Rrear)" }, + { (115 << 16) | 4, four_channel_mpeg_40a, "MPEG 4.0 A (L, R, C, Cs)" }, + { (116 << 16) | 4, four_channel_mpeg_40b, "MPEG 4.0 B (C, L, R, Cs)" }, + { (132 << 16) | 4, four_channel_itu_23, "ITU 2.3 (L, R, Ls, Rs)" }, + { (134 << 16) | 4, four_channel_dvd_5, "DVD 5 (L, R, LFE, Cs)" }, + { (136 << 16) | 4, four_channel_dvd_10, "DVD 10 (L, R, C, LFE)" } +} ; /* four_chan */ + + +static const int five_channel_pentagonal [5] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_CENTER } ; +static const int five_channel_mpeg_50_a [5] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ; +static const int five_channel_mpeg_50_b [5] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_CENTER } ; +static const int five_channel_mpeg_50_c [5] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ; +static const int five_channel_mpeg_50_d [5] = + { SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ; +static const int five_channel_dvd_6 [5] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_LFE, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ; +static const int five_channel_dvd_11 [5] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LFE, SF_CHANNEL_MAP_REAR_CENTER } ; +static const int five_channel_dvd_18 [5] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_LFE } ; + +static const AIFF_CAF_CHANNEL_MAP five_chan [] = +{ { (109 << 16) | 5, five_channel_pentagonal, "pentagonal (L, R, Lrear, Rrear, C)" }, + { (117 << 16) | 5, five_channel_mpeg_50_a, "MPEG 5.0 A (L, R, C, Ls, Rs)" }, + { (118 << 16) | 5, five_channel_mpeg_50_b, "MPEG 5.0 B (L, R, Ls, Rs, C)" }, + { (119 << 16) | 5, five_channel_mpeg_50_c, "MPEG 5.0 C (L, C, R, Ls, Rs,)" }, + { (120 << 16) | 5, five_channel_mpeg_50_d, "MPEG 5.0 D (C, L, R, Ls, Rs)" }, + { (135 << 16) | 5, five_channel_dvd_6, "DVD 6 (L, R, LFE, Ls, Rs)" }, + { (137 << 16) | 5, five_channel_dvd_11, "DVD 11 (L, R, C, LFE, Cs)" }, + { (138 << 16) | 5, five_channel_dvd_18, "DVD 18 (L, R, Ls, Rs, LFE)" } +} ; /* five_chan */ + + +static const int six_channel_mpeg_51_a [6] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LFE, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT } ; +static const int six_channel_mpeg_51_b [6] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LFE } ; +static const int six_channel_mpeg_51_c [6] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_LFE } ; +static const int six_channel_mpeg_51_d [6] = + { SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_LFE } ; +static const int six_channel_audio_unit_60 [6] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_REAR_CENTER } ; +static const int six_channel_aac_60 [6] = + { SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_REAR_CENTER } ; + +static const AIFF_CAF_CHANNEL_MAP six_chan [] = +{ { (110 << 16) | 6, NULL, "hexagonal (L, R, Lr, Rr, C, Rear)" }, + { (121 << 16) | 6, six_channel_mpeg_51_a, "MPEG 5.1 A (L, R, C, LFE, Ls, Rs)" }, + { (122 << 16) | 6, six_channel_mpeg_51_b, "MPEG 5.1 B (L, R, Ls, Rs, C, LFE)" }, + { (123 << 16) | 6, six_channel_mpeg_51_c, "MPEG 5.1 C (L, C, R, Ls, Rs, LFE)" }, + { (124 << 16) | 6, six_channel_mpeg_51_d, "MPEG 5.1 D (C, L, R, Ls, Rs, LFE)" }, + { (139 << 16) | 6, six_channel_audio_unit_60, "AudioUnit 6.0 (L, R, Ls, Rs, C, Cs)" }, + { (141 << 16) | 6, six_channel_aac_60, "AAC 6.0 (C, L, R, Ls, Rs, Cs)" } +} ; /* six_chan */ + + +static const int six_channel_mpeg_61a [7] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LFE, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_REAR_CENTER } ; +static const int six_channel_aac_61 [7] = + { SF_CHANNEL_MAP_CENTER, SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_REAR_LEFT, SF_CHANNEL_MAP_REAR_RIGHT, SF_CHANNEL_MAP_REAR_CENTER, SF_CHANNEL_MAP_LFE } ; + +static const AIFF_CAF_CHANNEL_MAP seven_chan [] = +{ { (125 << 16) | 7, six_channel_mpeg_61a, "MPEG 6.1 A (L, R, C, LFE, Ls, Rs, Cs)" }, + { (140 << 16) | 7, NULL, "AudioUnit 7.0 (L, R, Ls, Rs, C, Rls, Rrs)" }, + { (142 << 16) | 7, six_channel_aac_61, "AAC 6.1 (C, L, R, Ls, Rs, Cs, Lfe)" }, + { (143 << 16) | 7, NULL, "AAC 7.0 (C, L, R, Ls, Rs, Rls, Rrs,)" } +} ; /* seven_chan */ + + +static const AIFF_CAF_CHANNEL_MAP eight_chan [] = +{ { (111 << 16) | 8, NULL, + // front left, front right, rear left, rear right, + // front center, rear center, side left, side right + "octagonal (Lf, Rf, Lr, Rr, Cf, Cr, Ls, Rs)" + }, + { (112 << 16) | 8, NULL, + // left, right, rear left, rear right + // top left, top right, top rear left, top rear right + "cube (L, R, Lrear, Rrear, Ltop, Rtop, Ltoprear, Rtoprear)" + }, + { (126 << 16) | 8, NULL, "MPEG 7.1 A (L, R, C, LFE, Ls, Rs, Lc, Rc)" }, + { (127 << 16) | 8, NULL, "MPEG 7.1 B (C, Lc, Rc, L, R, Ls, Rs, LFE)" }, + { (128 << 16) | 8, NULL, "MPEG 7.1 C (L, R, C, LFE, Ls, R, Rls, Rrs)" }, + { (129 << 16) | 8, NULL, "Emagic Default 7.1 (L, R, Ls, Rs, C, LFE, Lc, Rc)" }, + { (130 << 16) | 8, NULL, + // (ITU_5_1 plus a matrix encoded stereo mix) + "SMPTE DTV (L, R, C, LFE, Ls, Rs, Lt, Rt)" + }, + { (144 << 16) | 8, NULL, "AAC octagonal (C, L, R, Ls, Rs, Rls, Rrs, Cs)" } +} ; /* eight_chan */ + + + +#if 0 + +TMH_10_2_std = (145 << 16) | 16, +// L R C Vhc Lsd Rsd Ls Rs Vhl Vhr Lw Rw Csd Cs LFE1 LFE2 + +TMH_10_2_full = (146 << 16) | 21, +// TMH_10_2_std plus: Lc Rc HI VI Haptic + +#endif + + +typedef struct +{ const AIFF_CAF_CHANNEL_MAP * map ; + int len ; +} MAP_MAP ; + +static const MAP_MAP map [] = +{ { zero_chan, ARRAY_LEN (zero_chan) }, + { one_chan, ARRAY_LEN (one_chan) }, + { two_chan, ARRAY_LEN (two_chan) }, + { three_chan, ARRAY_LEN (three_chan) }, + { four_chan, ARRAY_LEN (four_chan) }, + { five_chan, ARRAY_LEN (five_chan) }, + { six_chan, ARRAY_LEN (six_chan) }, + { seven_chan, ARRAY_LEN (seven_chan) }, + { eight_chan, ARRAY_LEN (eight_chan) } +} ; /* map */ + + +int +aiff_caf_find_channel_layout_tag (const int *chan_map, int channels) +{ const AIFF_CAF_CHANNEL_MAP * curr_map ; + unsigned k, len ; + + if (channels < 1 || channels >= ARRAY_LEN (map)) + return 0 ; + + curr_map = map [channels].map ; + len = map [channels].len ; + + for (k = 0 ; k < len ; k++) + if (curr_map [k].channel_map != NULL) + if (memcmp (chan_map, curr_map [k].channel_map, channels * sizeof (chan_map [0])) == 0) + return curr_map [k].channel_layout_tag ; + + return 0 ; +} /* aiff_caf_find_channel_layout_tag */ + +const AIFF_CAF_CHANNEL_MAP * +aiff_caf_of_channel_layout_tag (int tag) +{ const AIFF_CAF_CHANNEL_MAP * curr_map ; + unsigned k, len ; + int channels = tag & 0xffff ; + + if (channels < 0 || channels >= ARRAY_LEN (map)) + return NULL ; + + curr_map = map [channels].map ; + len = map [channels].len ; + + for (k = 0 ; k < len ; k++) + if (curr_map [k].channel_layout_tag == tag) + return curr_map + k ; + + return NULL ; +} /* aiff_caf_of_channel_layout_tag */ diff --git a/libsndfile-1.0.31/src/chanmap.h b/libsndfile-1.0.31/src/chanmap.h new file mode 100644 index 0000000..8af409d --- /dev/null +++ b/libsndfile-1.0.31/src/chanmap.h @@ -0,0 +1,32 @@ +/* +** Copyright (C) 2009-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +typedef struct +{ /* The tag in the AIFF or CAF file. */ + int channel_layout_tag ; + + /* The equivalent array of SF_CHANNEL_MAP_* entries. */ + const int * channel_map ; + + const char * name ; +} AIFF_CAF_CHANNEL_MAP ; + + +int aiff_caf_find_channel_layout_tag (const int *chan_map, int channels) ; + +const AIFF_CAF_CHANNEL_MAP * aiff_caf_of_channel_layout_tag (int tag) ; diff --git a/libsndfile-1.0.31/src/chunk.c b/libsndfile-1.0.31/src/chunk.c new file mode 100644 index 0000000..471c5a4 --- /dev/null +++ b/libsndfile-1.0.31/src/chunk.c @@ -0,0 +1,256 @@ +/* +** Copyright (C) 2008-2016 Erik de Castro Lopo +** Copyright (C) 2012 IOhannes m zmoelnig, IEM +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +static int64_t +hash_of_str (const char * str) +{ int64_t marker = 0 ; + int k ; + + for (k = 0 ; str [k] ; k++) + marker = marker * 0x7f + ((const uint8_t *) str) [k] ; + + return marker ; +} /* hash_of_str */ + +SF_CHUNK_ITERATOR * +psf_get_chunk_iterator (SF_PRIVATE * psf, const char * marker_str) +{ const READ_CHUNKS * pchk = &psf->rchunks ; + int idx ; + + if (marker_str) + idx = psf_find_read_chunk_str (pchk, marker_str) ; + else + idx = pchk->used > 0 ? 0 : -1 ; + + if (idx < 0) + return NULL ; + + if (psf->iterator == NULL) + { psf->iterator = calloc (1, sizeof (SF_CHUNK_ITERATOR)) ; + if (psf->iterator == NULL) + return NULL ; + } ; + + psf->iterator->sndfile = (SNDFILE *) psf ; + + if (marker_str) + { int64_t hash ; + size_t marker_len ; + union + { uint32_t marker ; + char str [5] ; + } u ; + + snprintf (u.str, sizeof (u.str), "%s", marker_str) ; + + marker_len = strlen (marker_str) ; + if (marker_len > 64) + marker_len = 64 ; + + hash = marker_len > 4 ? hash_of_str (marker_str) : u.marker ; + + memcpy (psf->iterator->id, marker_str, marker_len) ; + psf->iterator->id_size = marker_len ; + psf->iterator->hash = hash ; + } + + psf->iterator->current = idx ; + + return psf->iterator ; +} /* psf_get_chunk_iterator */ + +SF_CHUNK_ITERATOR * +psf_next_chunk_iterator (const READ_CHUNKS * pchk , SF_CHUNK_ITERATOR * iterator) +{ uint64_t hash = iterator->hash ; + uint32_t k ; + + iterator->current++ ; + + if (hash) + { for (k = iterator->current ; k < pchk->used ; k++) + if (pchk->chunks [k].hash == hash) + { iterator->current = k ; + return iterator ; + } + } + else if (iterator->current < pchk->used) + return iterator ; + + /* No match, clear iterator and return NULL */ + memset (iterator, 0, sizeof (*iterator)) ; + return NULL ; +} /* psf_next_chunk_iterator */ + +static int +psf_store_read_chunk (READ_CHUNKS * pchk, const READ_CHUNK * rchunk) +{ if (pchk->count == 0) + { pchk->used = 0 ; + pchk->count = 20 ; + pchk->chunks = calloc (pchk->count, sizeof (READ_CHUNK)) ; + } + else if (pchk->used > pchk->count) + return SFE_INTERNAL ; + else if (pchk->used == pchk->count) + { READ_CHUNK * old_ptr = pchk->chunks ; + int new_count = 3 * (pchk->count + 1) / 2 ; + + pchk->chunks = realloc (old_ptr, new_count * sizeof (READ_CHUNK)) ; + if (pchk->chunks == NULL) + { pchk->chunks = old_ptr ; + return SFE_MALLOC_FAILED ; + } ; + pchk->count = new_count ; + } ; + + pchk->chunks [pchk->used] = *rchunk ; + + pchk->used ++ ; + + return SFE_NO_ERROR ; +} /* psf_store_read_chunk */ + +int +psf_store_read_chunk_u32 (READ_CHUNKS * pchk, uint32_t marker, sf_count_t offset, uint32_t len) +{ READ_CHUNK rchunk ; + + memset (&rchunk, 0, sizeof (rchunk)) ; + + rchunk.hash = marker ; + rchunk.mark32 = marker ; + rchunk.offset = offset ; + rchunk.len = len ; + + rchunk.id_size = 4 ; + memcpy (rchunk.id, &marker, rchunk.id_size) ; + + return psf_store_read_chunk (pchk, &rchunk) ; +} /* psf_store_read_chunk_u32 */ + +int +psf_find_read_chunk_str (const READ_CHUNKS * pchk, const char * marker_str) +{ uint64_t hash ; + uint32_t k ; + union + { uint32_t marker ; + char str [5] ; + } u ; + + snprintf (u.str, sizeof (u.str), "%s", marker_str) ; + + hash = strlen (marker_str) > 4 ? hash_of_str (marker_str) : u.marker ; + + for (k = 0 ; k < pchk->used ; k++) + if (pchk->chunks [k].hash == hash) + return k ; + + return -1 ; +} /* psf_find_read_chunk_str */ + +int +psf_find_read_chunk_m32 (const READ_CHUNKS * pchk, uint32_t marker) +{ uint32_t k ; + + for (k = 0 ; k < pchk->used ; k++) + if (pchk->chunks [k].mark32 == marker) + return k ; + + return -1 ; +} /* psf_find_read_chunk_m32 */ +int +psf_find_read_chunk_iterator (const READ_CHUNKS * pchk, const SF_CHUNK_ITERATOR * marker) +{ if (marker->current < pchk->used) + return marker->current ; + + return -1 ; +} /* psf_find_read_chunk_iterator */ + +int +psf_store_read_chunk_str (READ_CHUNKS * pchk, const char * marker_str, sf_count_t offset, uint32_t len) +{ READ_CHUNK rchunk ; + union + { uint32_t marker ; + char str [5] ; + } u ; + size_t marker_len ; + + memset (&rchunk, 0, sizeof (rchunk)) ; + snprintf (u.str, sizeof (u.str), "%s", marker_str) ; + + marker_len = strlen (marker_str) ; + + rchunk.hash = marker_len > 4 ? hash_of_str (marker_str) : u.marker ; + rchunk.mark32 = u.marker ; + rchunk.offset = offset ; + rchunk.len = len ; + + rchunk.id_size = marker_len > 64 ? 64 : marker_len ; + memcpy (rchunk.id, marker_str, rchunk.id_size) ; + + return psf_store_read_chunk (pchk, &rchunk) ; +} /* psf_store_read_chunk_str */ + +int +psf_save_write_chunk (WRITE_CHUNKS * pchk, const SF_CHUNK_INFO * chunk_info) +{ union + { uint32_t marker ; + char str [5] ; + /* Update snprintf() format string below when changing this */ + } u ; + uint32_t len ; + + if (pchk->count == 0) + { pchk->used = 0 ; + pchk->count = 20 ; + pchk->chunks = calloc (pchk->count, sizeof (WRITE_CHUNK)) ; + } + else if (pchk->used >= pchk->count) + { WRITE_CHUNK * old_ptr = pchk->chunks ; + int new_count = 3 * (pchk->count + 1) / 2 ; + + pchk->chunks = realloc (old_ptr, new_count * sizeof (WRITE_CHUNK)) ; + if (pchk->chunks == NULL) + { pchk->chunks = old_ptr ; + return SFE_MALLOC_FAILED ; + } ; + } ; + + len = chunk_info->datalen ; + while (len & 3) len ++ ; + + snprintf (u.str, sizeof (u.str), "%.4s", chunk_info->id) ; + + pchk->chunks [pchk->used].hash = strlen (chunk_info->id) > 4 ? hash_of_str (chunk_info->id) : u.marker ; + pchk->chunks [pchk->used].mark32 = u.marker ; + pchk->chunks [pchk->used].len = len ; + pchk->chunks [pchk->used].data = psf_memdup (chunk_info->data, chunk_info->datalen) ; + + pchk->used ++ ; + + return SFE_NO_ERROR ; +} /* psf_save_write_chunk */ + diff --git a/libsndfile-1.0.31/src/command.c b/libsndfile-1.0.31/src/command.c new file mode 100644 index 0000000..15037ab --- /dev/null +++ b/libsndfile-1.0.31/src/command.c @@ -0,0 +1,400 @@ +/* +** Copyright (C) 2001-2016 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#include "sndfile.h" +#include "common.h" + +static SF_FORMAT_INFO const simple_formats [] = +{ + { SF_FORMAT_AIFF | SF_FORMAT_PCM_16, + "AIFF (Apple/SGI 16 bit PCM)", "aiff" + }, + + { SF_FORMAT_AIFF | SF_FORMAT_FLOAT, + "AIFF (Apple/SGI 32 bit float)", "aifc" + }, + + { SF_FORMAT_AIFF | SF_FORMAT_PCM_S8, + "AIFF (Apple/SGI 8 bit PCM)", "aiff" + }, + + { SF_FORMAT_AU | SF_FORMAT_PCM_16, + "AU (Sun/Next 16 bit PCM)", "au" + }, + + { SF_FORMAT_AU | SF_FORMAT_ULAW, + "AU (Sun/Next 8-bit u-law)", "au" + }, + + { SF_FORMAT_CAF | SF_FORMAT_ALAC_16, + "CAF (Apple 16 bit ALAC)", "caf" + }, + + { SF_FORMAT_CAF | SF_FORMAT_PCM_16, + "CAF (Apple 16 bit PCM)", "caf" + }, + +#if HAVE_EXTERNAL_XIPH_LIBS + { SF_FORMAT_FLAC | SF_FORMAT_PCM_16, + "FLAC 16 bit", "flac" + }, +#endif + + { SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, + "OKI Dialogic VOX ADPCM", "vox" + }, + +#if HAVE_EXTERNAL_XIPH_LIBS + { SF_FORMAT_OGG | SF_FORMAT_OPUS, + "Ogg Opus (Xiph Foundation)", "opus" + }, + + { SF_FORMAT_OGG | SF_FORMAT_VORBIS, + "Ogg Vorbis (Xiph Foundation)", "ogg" + }, +#endif + + { SF_FORMAT_WAV | SF_FORMAT_PCM_16, + "WAV (Microsoft 16 bit PCM)", "wav" + }, + + { SF_FORMAT_WAV | SF_FORMAT_FLOAT, + "WAV (Microsoft 32 bit float)", "wav" + }, + + { SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, + "WAV (Microsoft 4 bit IMA ADPCM)", "wav" + }, + + { SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, + "WAV (Microsoft 4 bit MS ADPCM)", "wav" + }, + + { SF_FORMAT_WAV | SF_FORMAT_PCM_U8, + "WAV (Microsoft 8 bit PCM)", "wav" + }, + +} ; /* simple_formats */ + +int +psf_get_format_simple_count (void) +{ return (sizeof (simple_formats) / sizeof (SF_FORMAT_INFO)) ; +} /* psf_get_format_simple_count */ + +int +psf_get_format_simple (SF_FORMAT_INFO *data) +{ int indx ; + + if (data->format < 0 || data->format >= (SIGNED_SIZEOF (simple_formats) / SIGNED_SIZEOF (SF_FORMAT_INFO))) + return SFE_BAD_COMMAND_PARAM ; + + indx = data->format ; + memcpy (data, &(simple_formats [indx]), SIGNED_SIZEOF (SF_FORMAT_INFO)) ; + + return 0 ; +} /* psf_get_format_simple */ + +/*============================================================================ +** Major format info. +*/ + +static SF_FORMAT_INFO const major_formats [] = +{ + { SF_FORMAT_AIFF, "AIFF (Apple/SGI)", "aiff" }, + { SF_FORMAT_AU, "AU (Sun/NeXT)", "au" }, + { SF_FORMAT_AVR, "AVR (Audio Visual Research)", "avr" }, + { SF_FORMAT_CAF, "CAF (Apple Core Audio File)", "caf" }, +#if HAVE_EXTERNAL_XIPH_LIBS + { SF_FORMAT_FLAC, "FLAC (Free Lossless Audio Codec)", "flac" }, +#endif + { SF_FORMAT_HTK, "HTK (HMM Tool Kit)", "htk" }, + { SF_FORMAT_SVX, "IFF (Amiga IFF/SVX8/SV16)", "iff" }, + { SF_FORMAT_MAT4, "MAT4 (GNU Octave 2.0 / Matlab 4.2)", "mat" }, + { SF_FORMAT_MAT5, "MAT5 (GNU Octave 2.1 / Matlab 5.0)", "mat" }, + { SF_FORMAT_MPC2K, "MPC (Akai MPC 2k)", "mpc" }, +#if HAVE_EXTERNAL_XIPH_LIBS + { SF_FORMAT_OGG, "OGG (OGG Container format)", "oga" }, +#endif + { SF_FORMAT_PAF, "PAF (Ensoniq PARIS)", "paf" }, + { SF_FORMAT_PVF, "PVF (Portable Voice Format)", "pvf" }, + { SF_FORMAT_RAW, "RAW (header-less)", "raw" }, + { SF_FORMAT_RF64, "RF64 (RIFF 64)", "rf64" }, + { SF_FORMAT_SD2, "SD2 (Sound Designer II)", "sd2" }, + { SF_FORMAT_SDS, "SDS (Midi Sample Dump Standard)", "sds" }, + { SF_FORMAT_IRCAM, "SF (Berkeley/IRCAM/CARL)", "sf" }, + { SF_FORMAT_VOC, "VOC (Creative Labs)", "voc" }, + { SF_FORMAT_W64, "W64 (SoundFoundry WAVE 64)", "w64" }, + { SF_FORMAT_WAV, "WAV (Microsoft)", "wav" }, + { SF_FORMAT_NIST, "WAV (NIST Sphere)", "wav" }, + { SF_FORMAT_WAVEX, "WAVEX (Microsoft)", "wav" }, + { SF_FORMAT_WVE, "WVE (Psion Series 3)", "wve" }, + { SF_FORMAT_XI, "XI (FastTracker 2)", "xi" }, + +} ; /* major_formats */ + +int +psf_get_format_major_count (void) +{ return (sizeof (major_formats) / sizeof (SF_FORMAT_INFO)) ; +} /* psf_get_format_major_count */ + +int +psf_get_format_major (SF_FORMAT_INFO *data) +{ int indx ; + + if (data->format < 0 || data->format >= (SIGNED_SIZEOF (major_formats) / SIGNED_SIZEOF (SF_FORMAT_INFO))) + return SFE_BAD_COMMAND_PARAM ; + + indx = data->format ; + memcpy (data, &(major_formats [indx]), SIGNED_SIZEOF (SF_FORMAT_INFO)) ; + + return 0 ; +} /* psf_get_format_major */ + +/*============================================================================ +** Subtype format info. +*/ + +static SF_FORMAT_INFO subtype_formats [] = +{ + { SF_FORMAT_PCM_S8, "Signed 8 bit PCM", NULL }, + { SF_FORMAT_PCM_16, "Signed 16 bit PCM", NULL }, + { SF_FORMAT_PCM_24, "Signed 24 bit PCM", NULL }, + { SF_FORMAT_PCM_32, "Signed 32 bit PCM", NULL }, + + { SF_FORMAT_PCM_U8, "Unsigned 8 bit PCM", NULL }, + + { SF_FORMAT_FLOAT, "32 bit float", NULL }, + { SF_FORMAT_DOUBLE, "64 bit float", NULL }, + + { SF_FORMAT_ULAW, "U-Law", NULL }, + { SF_FORMAT_ALAW, "A-Law", NULL }, + { SF_FORMAT_IMA_ADPCM, "IMA ADPCM", NULL }, + { SF_FORMAT_MS_ADPCM, "Microsoft ADPCM", NULL }, + + { SF_FORMAT_GSM610, "GSM 6.10", NULL }, + + { SF_FORMAT_G721_32, "32kbs G721 ADPCM", NULL }, + { SF_FORMAT_G723_24, "24kbs G723 ADPCM", NULL }, + { SF_FORMAT_G723_40, "40kbs G723 ADPCM", NULL }, + + { SF_FORMAT_DWVW_12, "12 bit DWVW", NULL }, + { SF_FORMAT_DWVW_16, "16 bit DWVW", NULL }, + { SF_FORMAT_DWVW_24, "24 bit DWVW", NULL }, + { SF_FORMAT_VOX_ADPCM, "VOX ADPCM", "vox" }, + + { SF_FORMAT_NMS_ADPCM_16, "16kbs NMS ADPCM", NULL }, + { SF_FORMAT_NMS_ADPCM_24, "24kbs NMS ADPCM", NULL }, + { SF_FORMAT_NMS_ADPCM_32, "32kbs NMS ADPCM", NULL }, + + { SF_FORMAT_DPCM_16, "16 bit DPCM", NULL }, + { SF_FORMAT_DPCM_8, "8 bit DPCM", NULL }, + +#if HAVE_EXTERNAL_XIPH_LIBS + { SF_FORMAT_VORBIS, "Vorbis", NULL }, + { SF_FORMAT_OPUS, "Opus", NULL }, +#endif + + { SF_FORMAT_ALAC_16, "16 bit ALAC", NULL }, + { SF_FORMAT_ALAC_20, "20 bit ALAC", NULL }, + { SF_FORMAT_ALAC_24, "24 bit ALAC", NULL }, + { SF_FORMAT_ALAC_32, "32 bit ALAC", NULL }, +} ; /* subtype_formats */ + +int +psf_get_format_subtype_count (void) +{ return (sizeof (subtype_formats) / sizeof (SF_FORMAT_INFO)) ; +} /* psf_get_format_subtype_count */ + +int +psf_get_format_subtype (SF_FORMAT_INFO *data) +{ int indx ; + + if (data->format < 0 || data->format >= (SIGNED_SIZEOF (subtype_formats) / SIGNED_SIZEOF (SF_FORMAT_INFO))) + { data->format = 0 ; + return SFE_BAD_COMMAND_PARAM ; + } ; + + indx = data->format ; + memcpy (data, &(subtype_formats [indx]), sizeof (SF_FORMAT_INFO)) ; + + return 0 ; +} /* psf_get_format_subtype */ + +/*============================================================================== +*/ + +int +psf_get_format_info (SF_FORMAT_INFO *data) +{ int k, format ; + + if (SF_CONTAINER (data->format)) + { format = SF_CONTAINER (data->format) ; + + for (k = 0 ; k < (SIGNED_SIZEOF (major_formats) / SIGNED_SIZEOF (SF_FORMAT_INFO)) ; k++) + { if (format == major_formats [k].format) + { memcpy (data, &(major_formats [k]), sizeof (SF_FORMAT_INFO)) ; + return 0 ; + } ; + } ; + } + else if (SF_CODEC (data->format)) + { format = SF_CODEC (data->format) ; + + for (k = 0 ; k < (SIGNED_SIZEOF (subtype_formats) / SIGNED_SIZEOF (SF_FORMAT_INFO)) ; k++) + { if (format == subtype_formats [k].format) + { memcpy (data, &(subtype_formats [k]), sizeof (SF_FORMAT_INFO)) ; + return 0 ; + } ; + } ; + } ; + + memset (data, 0, sizeof (SF_FORMAT_INFO)) ; + + return SFE_BAD_COMMAND_PARAM ; +} /* psf_get_format_info */ + +/*============================================================================== +*/ + +double +psf_calc_signal_max (SF_PRIVATE *psf, int normalize) +{ BUF_UNION ubuf ; + sf_count_t position ; + double max_val, temp, *data ; + int k, len, readcount, save_state ; + + /* If the file is not seekable, there is nothing we can do. */ + if (! psf->sf.seekable) + { psf->error = SFE_NOT_SEEKABLE ; + return 0.0 ; + } ; + + if (! psf->read_double) + { psf->error = SFE_UNIMPLEMENTED ; + return 0.0 ; + } ; + + save_state = sf_command ((SNDFILE*) psf, SFC_GET_NORM_DOUBLE, NULL, 0) ; + sf_command ((SNDFILE*) psf, SFC_SET_NORM_DOUBLE, NULL, normalize) ; + + /* Brute force. Read the whole file and find the biggest sample. */ + /* Get current position in file */ + position = sf_seek ((SNDFILE*) psf, 0, SEEK_CUR) ; + /* Go to start of file. */ + sf_seek ((SNDFILE*) psf, 0, SEEK_SET) ; + + data = ubuf.dbuf ; + /* Make sure len is an integer multiple of the channel count. */ + len = ARRAY_LEN (ubuf.dbuf) - (ARRAY_LEN (ubuf.dbuf) % psf->sf.channels) ; + + for (readcount = 1, max_val = 0.0 ; readcount > 0 ; /* nothing */) + { readcount = sf_read_double ((SNDFILE*) psf, data, len) ; + for (k = 0 ; k < readcount ; k++) + { temp = fabs (data [k]) ; + max_val = temp > max_val ? temp : max_val ; + } ; + } ; + + /* Return to SNDFILE to original state. */ + sf_seek ((SNDFILE*) psf, position, SEEK_SET) ; + sf_command ((SNDFILE*) psf, SFC_SET_NORM_DOUBLE, NULL, save_state) ; + + return max_val ; +} /* psf_calc_signal_max */ + +int +psf_calc_max_all_channels (SF_PRIVATE *psf, double *peaks, int normalize) +{ BUF_UNION ubuf ; + sf_count_t position ; + double temp, *data ; + int k, len, readcount, save_state ; + int chan ; + + /* If the file is not seekable, there is nothing we can do. */ + if (! psf->sf.seekable) + return (psf->error = SFE_NOT_SEEKABLE) ; + + if (! psf->read_double) + return (psf->error = SFE_UNIMPLEMENTED) ; + + save_state = sf_command ((SNDFILE*) psf, SFC_GET_NORM_DOUBLE, NULL, 0) ; + sf_command ((SNDFILE*) psf, SFC_SET_NORM_DOUBLE, NULL, normalize) ; + + memset (peaks, 0, sizeof (double) * psf->sf.channels) ; + + /* Brute force. Read the whole file and find the biggest sample for each channel. */ + position = sf_seek ((SNDFILE*) psf, 0, SEEK_CUR) ; /* Get current position in file */ + sf_seek ((SNDFILE*) psf, 0, SEEK_SET) ; /* Go to start of file. */ + + len = ARRAY_LEN (ubuf.dbuf) - (ARRAY_LEN (ubuf.dbuf) % psf->sf.channels) ; + + data = ubuf.dbuf ; + + chan = 0 ; + readcount = len ; + while (readcount > 0) + { readcount = sf_read_double ((SNDFILE*) psf, data, len) ; + for (k = 0 ; k < readcount ; k++) + { temp = fabs (data [k]) ; + peaks [chan] = temp > peaks [chan] ? temp : peaks [chan] ; + chan = (chan + 1) % psf->sf.channels ; + } ; + } ; + + sf_seek ((SNDFILE*) psf, position, SEEK_SET) ; /* Return to original position. */ + + sf_command ((SNDFILE*) psf, SFC_SET_NORM_DOUBLE, NULL, save_state) ; + + return 0 ; +} /* psf_calc_max_all_channels */ + +int +psf_get_signal_max (SF_PRIVATE *psf, double *peak) +{ int k ; + + if (psf->peak_info == NULL) + return SF_FALSE ; + + peak [0] = psf->peak_info->peaks [0].value ; + + for (k = 1 ; k < psf->sf.channels ; k++) + peak [0] = SF_MAX (peak [0], psf->peak_info->peaks [k].value) ; + + return SF_TRUE ; +} /* psf_get_signal_max */ + +int +psf_get_max_all_channels (SF_PRIVATE *psf, double *peaks) +{ int k ; + + if (psf->peak_info == NULL) + return SF_FALSE ; + + for (k = 0 ; k < psf->sf.channels ; k++) + peaks [k] = psf->peak_info->peaks [k].value ; + + return SF_TRUE ; +} /* psf_get_max_all_channels */ + + diff --git a/libsndfile-1.0.31/src/common.c b/libsndfile-1.0.31/src/common.c new file mode 100644 index 0000000..c9737a9 --- /dev/null +++ b/libsndfile-1.0.31/src/common.c @@ -0,0 +1,1765 @@ +/* +** Copyright (C) 1999-2019 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include + +#include +#include +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif +#include +#include +#include +#if HAVE_SYS_TIME_H +#include +#endif +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +#define INITIAL_HEADER_SIZE 256 + +/* Allocate and initialize the SF_PRIVATE struct. */ +SF_PRIVATE * +psf_allocate (void) +{ SF_PRIVATE * psf ; + + if ((psf = calloc (1, sizeof (SF_PRIVATE))) == NULL) + return NULL ; + + if ((psf->header.ptr = calloc (1, INITIAL_HEADER_SIZE)) == NULL) + { free (psf) ; + return NULL ; + } ; + psf->header.len = INITIAL_HEADER_SIZE ; + + return psf ; +} /* psf_allocate */ + +static int +psf_bump_header_allocation (SF_PRIVATE * psf, sf_count_t needed) +{ + sf_count_t newlen, smallest = INITIAL_HEADER_SIZE ; + void * ptr ; + + newlen = (needed > psf->header.len) ? 2 * SF_MAX (needed, smallest) : 2 * psf->header.len ; + + if (newlen > 100 * 1024) + { psf_log_printf (psf, "Request for header allocation of %D denied.\n", newlen) ; + return 1 ; + } + + if ((ptr = realloc (psf->header.ptr, newlen)) == NULL) + { psf_log_printf (psf, "realloc (%p, %D) failed\n", psf->header.ptr, newlen) ; + psf->error = SFE_MALLOC_FAILED ; + return 1 ; + } ; + + /* Always zero-out new header memory to avoid un-initializer memory accesses. */ + if (newlen > psf->header.len) + memset ((char *) ptr + psf->header.len, 0, newlen - psf->header.len) ; + + psf->header.ptr = ptr ; + psf->header.len = newlen ; + return 0 ; +} /* psf_bump_header_allocation */ + +/*----------------------------------------------------------------------------------------------- +** psf_log_printf allows libsndfile internal functions to print to an internal parselog which +** can later be displayed. +** The format specifiers are as for printf but without the field width and other modifiers. +** Printing is performed to the parselog char array of the SF_PRIVATE struct. +** Printing is done in such a way as to guarantee that the log never overflows the end of the +** parselog array. +*/ + +static inline void +log_putchar (SF_PRIVATE *psf, char ch) +{ if (psf->parselog.indx < SIGNED_SIZEOF (psf->parselog.buf) - 1) + { psf->parselog.buf [psf->parselog.indx++] = ch ; + psf->parselog.buf [psf->parselog.indx] = 0 ; + } ; + return ; +} /* log_putchar */ + +void +psf_log_printf (SF_PRIVATE *psf, const char *format, ...) +{ va_list ap ; + uint32_t u ; + int d, tens, shift, width, width_specifier, left_align, slen ; + char c, *strptr, istr [5], lead_char, sign_char ; + + va_start (ap, format) ; + + while ((c = *format++)) + { if (c != '%') + { log_putchar (psf, c) ; + continue ; + } ; + + if (format [0] == '%') /* Handle %% */ + { log_putchar (psf, '%') ; + format ++ ; + continue ; + } ; + + sign_char = 0 ; + left_align = SF_FALSE ; + while (1) + { switch (format [0]) + { case ' ' : + case '+' : + sign_char = format [0] ; + format ++ ; + continue ; + + case '-' : + left_align = SF_TRUE ; + format ++ ; + continue ; + + default : break ; + } ; + + break ; + } ; + + if (format [0] == 0) + break ; + + lead_char = ' ' ; + if (format [0] == '0') + lead_char = '0' ; + + width_specifier = 0 ; + while ((c = *format++) && isdigit (c)) + width_specifier = width_specifier * 10 + (c - '0') ; + + switch (c) + { case 0 : /* NULL character. */ + va_end (ap) ; + return ; + + case 's': /* string */ + strptr = va_arg (ap, char *) ; + if (strptr == NULL) + break ; + slen = strlen (strptr) ; + width_specifier = width_specifier >= slen ? width_specifier - slen : 0 ; + if (left_align == SF_FALSE) + while (width_specifier -- > 0) + log_putchar (psf, ' ') ; + while (*strptr) + log_putchar (psf, *strptr++) ; + while (width_specifier -- > 0) + log_putchar (psf, ' ') ; + break ; + + case 'd': /* int */ + d = va_arg (ap, int) ; + + if (d < 0) + { d = -d ; + sign_char = '-' ; + if (lead_char != '0' && left_align == SF_FALSE) + width_specifier -- ; + } ; + + tens = 1 ; + width = 1 ; + while (d / tens >= 10) + { tens *= 10 ; + width ++ ; + } ; + + width_specifier -= width ; + + if (sign_char == ' ') + { log_putchar (psf, ' ') ; + width_specifier -- ; + } ; + + if (left_align == SF_FALSE && lead_char != '0') + { if (sign_char == '+') + width_specifier -- ; + + while (width_specifier -- > 0) + log_putchar (psf, lead_char) ; + } ; + + if (sign_char == '+' || sign_char == '-') + { log_putchar (psf, sign_char) ; + width_specifier -- ; + } ; + + if (left_align == SF_FALSE) + while (width_specifier -- > 0) + log_putchar (psf, lead_char) ; + + while (tens > 0) + { log_putchar (psf, '0' + d / tens) ; + d %= tens ; + tens /= 10 ; + } ; + + while (width_specifier -- > 0) + log_putchar (psf, lead_char) ; + break ; + + case 'D': /* sf_count_t */ + { sf_count_t D, Tens ; + + D = va_arg (ap, sf_count_t) ; + + if (D == 0) + { while (-- width_specifier > 0) + log_putchar (psf, lead_char) ; + log_putchar (psf, '0') ; + break ; + } + if (D < 0) + { log_putchar (psf, '-') ; + D = -D ; + } ; + Tens = 1 ; + width = 1 ; + while (D / Tens >= 10) + { Tens *= 10 ; + width ++ ; + } ; + + while (width_specifier > width) + { log_putchar (psf, lead_char) ; + width_specifier-- ; + } ; + + while (Tens > 0) + { log_putchar (psf, '0' + D / Tens) ; + D %= Tens ; + Tens /= 10 ; + } ; + } ; + break ; + + case 'u': /* unsigned int */ + u = va_arg (ap, unsigned int) ; + + tens = 1 ; + width = 1 ; + while (u / tens >= 10) + { tens *= 10 ; + width ++ ; + } ; + + width_specifier -= width ; + + if (sign_char == ' ') + { log_putchar (psf, ' ') ; + width_specifier -- ; + } ; + + if (left_align == SF_FALSE && lead_char != '0') + { if (sign_char == '+') + width_specifier -- ; + + while (width_specifier -- > 0) + log_putchar (psf, lead_char) ; + } ; + + if (sign_char == '+' || sign_char == '-') + { log_putchar (psf, sign_char) ; + width_specifier -- ; + } ; + + if (left_align == SF_FALSE) + while (width_specifier -- > 0) + log_putchar (psf, lead_char) ; + + while (tens > 0) + { log_putchar (psf, '0' + u / tens) ; + u %= tens ; + tens /= 10 ; + } ; + + while (width_specifier -- > 0) + log_putchar (psf, lead_char) ; + break ; + + case 'c': /* char */ + c = va_arg (ap, int) & 0xFF ; + log_putchar (psf, c) ; + break ; + + case 'x': /* hex */ + case 'X': /* hex */ + d = va_arg (ap, int) ; + + if (d == 0) + { while (--width_specifier > 0) + log_putchar (psf, lead_char) ; + log_putchar (psf, '0') ; + break ; + } ; + shift = 28 ; + width = (width_specifier < 8) ? 8 : width_specifier ; + while (! ((((uint32_t) 0xF) << shift) & d)) + { shift -= 4 ; + width -- ; + } ; + + while (width > 0 && width_specifier > width) + { log_putchar (psf, lead_char) ; + width_specifier-- ; + } ; + + while (shift >= 0) + { c = (d >> shift) & 0xF ; + log_putchar (psf, (c > 9) ? c + 'A' - 10 : c + '0') ; + shift -= 4 ; + } ; + break ; + + case 'M': /* int2str */ + d = va_arg (ap, int) ; + if (CPU_IS_LITTLE_ENDIAN) + { istr [0] = d & 0xFF ; + istr [1] = (d >> 8) & 0xFF ; + istr [2] = (d >> 16) & 0xFF ; + istr [3] = (d >> 24) & 0xFF ; + } + else + { istr [3] = d & 0xFF ; + istr [2] = (d >> 8) & 0xFF ; + istr [1] = (d >> 16) & 0xFF ; + istr [0] = (d >> 24) & 0xFF ; + } ; + istr [4] = 0 ; + strptr = istr ; + while (*strptr) + { c = *strptr++ ; + log_putchar (psf, c) ; + } ; + break ; + + default : + log_putchar (psf, '*') ; + log_putchar (psf, c) ; + log_putchar (psf, '*') ; + break ; + } /* switch */ + } /* while */ + + va_end (ap) ; + return ; +} /* psf_log_printf */ + +/*----------------------------------------------------------------------------------------------- +** ASCII header printf functions. +** Some formats (ie NIST) use ascii text in their headers. +** Format specifiers are the same as the standard printf specifiers (uses vsnprintf). +** If this generates a compile error on any system, the author should be notified +** so an alternative vsnprintf can be provided. +*/ + +void +psf_asciiheader_printf (SF_PRIVATE *psf, const char *format, ...) +{ va_list argptr ; + int maxlen ; + char *start ; + + if (! format) + return ; + + maxlen = strlen ((char*) psf->header.ptr) ; + start = ((char*) psf->header.ptr) + maxlen ; + maxlen = psf->header.len - maxlen ; + + va_start (argptr, format) ; + vsnprintf (start, maxlen, format, argptr) ; + va_end (argptr) ; + + /* Make sure the string is properly terminated. */ + start [maxlen - 1] = 0 ; + + psf->header.indx = strlen ((char*) psf->header.ptr) ; + + return ; +} /* psf_asciiheader_printf */ + +/*----------------------------------------------------------------------------------------------- +** Binary header writing functions. Returns number of bytes written. +** +** Format specifiers for psf_binheader_writef are as follows +** m - marker - four bytes - no endian manipulation +** +** e - all following numerical values will be little endian +** E - all following numerical values will be big endian +** +** t - all following O types will be truncated to 4 bytes +** T - switch off truncation of all following O types +** +** 1 - single byte value +** 2 - two byte value +** 3 - three byte value +** 4 - four byte value +** 8 - eight byte value (sometimes written as 4 bytes) +** +** s - string preceded by a four byte length +** S - string including null terminator +** p - a Pascal string +** +** f - floating point data +** d - double precision floating point data +** h - 16 binary bytes value +** +** b - binary data (see below) +** z - zero bytes (ses below) +** j - jump forwards or backwards +** +** To write a word followed by an int (both little endian) use: +** psf_binheader_writef ("e24", wordval, longval) ; +** +** To write binary data use: +** psf_binheader_writef ("b", &bindata, sizeof (bindata)) ; +** +** To write N zero bytes use: +** NOTE: due to platform issues (ie x86-64) you should cast the +** argument to size_t or ensure the variable type is size_t. +** psf_binheader_writef ("z", N) ; +*/ + +/* These macros may seem a bit messy but do prevent problems with processors which +** seg. fault when asked to write an int or short to a non-int/short aligned address. +*/ + +static inline void +header_put_byte (SF_PRIVATE *psf, char x) +{ psf->header.ptr [psf->header.indx++] = x ; +} /* header_put_byte */ + +#if (CPU_IS_BIG_ENDIAN == 1) +static inline void +header_put_marker (SF_PRIVATE *psf, int x) +{ psf->header.ptr [psf->header.indx++] = (x >> 24) ; + psf->header.ptr [psf->header.indx++] = (x >> 16) ; + psf->header.ptr [psf->header.indx++] = (x >> 8) ; + psf->header.ptr [psf->header.indx++] = x ; +} /* header_put_marker */ + +#elif (CPU_IS_LITTLE_ENDIAN == 1) +static inline void +header_put_marker (SF_PRIVATE *psf, int x) +{ psf->header.ptr [psf->header.indx++] = x ; + psf->header.ptr [psf->header.indx++] = (x >> 8) ; + psf->header.ptr [psf->header.indx++] = (x >> 16) ; + psf->header.ptr [psf->header.indx++] = (x >> 24) ; +} /* header_put_marker */ + +#else +# error "Cannot determine endian-ness of processor." +#endif + + +static inline void +header_put_be_short (SF_PRIVATE *psf, int x) +{ psf->header.ptr [psf->header.indx++] = (x >> 8) ; + psf->header.ptr [psf->header.indx++] = x ; +} /* header_put_be_short */ + +static inline void +header_put_le_short (SF_PRIVATE *psf, int x) +{ psf->header.ptr [psf->header.indx++] = x ; + psf->header.ptr [psf->header.indx++] = (x >> 8) ; +} /* header_put_le_short */ + +static inline void +header_put_be_3byte (SF_PRIVATE *psf, int x) +{ psf->header.ptr [psf->header.indx++] = (x >> 16) ; + psf->header.ptr [psf->header.indx++] = (x >> 8) ; + psf->header.ptr [psf->header.indx++] = x ; +} /* header_put_be_3byte */ + +static inline void +header_put_le_3byte (SF_PRIVATE *psf, int x) +{ psf->header.ptr [psf->header.indx++] = x ; + psf->header.ptr [psf->header.indx++] = (x >> 8) ; + psf->header.ptr [psf->header.indx++] = (x >> 16) ; +} /* header_put_le_3byte */ + +static inline void +header_put_be_int (SF_PRIVATE *psf, int x) +{ psf->header.ptr [psf->header.indx++] = (x >> 24) ; + psf->header.ptr [psf->header.indx++] = (x >> 16) ; + psf->header.ptr [psf->header.indx++] = (x >> 8) ; + psf->header.ptr [psf->header.indx++] = x ; +} /* header_put_be_int */ + +static inline void +header_put_le_int (SF_PRIVATE *psf, int x) +{ psf->header.ptr [psf->header.indx++] = x ; + psf->header.ptr [psf->header.indx++] = (x >> 8) ; + psf->header.ptr [psf->header.indx++] = (x >> 16) ; + psf->header.ptr [psf->header.indx++] = (x >> 24) ; +} /* header_put_le_int */ + +#if (SIZEOF_SF_COUNT_T == 8) + +static inline void +header_put_be_8byte (SF_PRIVATE *psf, sf_count_t x) +{ psf->header.ptr [psf->header.indx++] = (x >> 56) ; + psf->header.ptr [psf->header.indx++] = (x >> 48) ; + psf->header.ptr [psf->header.indx++] = (x >> 40) ; + psf->header.ptr [psf->header.indx++] = (x >> 32) ; + psf->header.ptr [psf->header.indx++] = (x >> 24) ; + psf->header.ptr [psf->header.indx++] = (x >> 16) ; + psf->header.ptr [psf->header.indx++] = (x >> 8) ; + psf->header.ptr [psf->header.indx++] = x ; +} /* header_put_be_8byte */ + +static inline void +header_put_le_8byte (SF_PRIVATE *psf, sf_count_t x) +{ psf->header.ptr [psf->header.indx++] = x ; + psf->header.ptr [psf->header.indx++] = (x >> 8) ; + psf->header.ptr [psf->header.indx++] = (x >> 16) ; + psf->header.ptr [psf->header.indx++] = (x >> 24) ; + psf->header.ptr [psf->header.indx++] = (x >> 32) ; + psf->header.ptr [psf->header.indx++] = (x >> 40) ; + psf->header.ptr [psf->header.indx++] = (x >> 48) ; + psf->header.ptr [psf->header.indx++] = (x >> 56) ; +} /* header_put_le_8byte */ + +#else +#error "SIZEOF_SF_COUNT_T != 8" +#endif + +int +psf_binheader_writef (SF_PRIVATE *psf, const char *format, ...) +{ va_list argptr ; + sf_count_t countdata ; + unsigned long longdata ; + unsigned int data ; + float floatdata ; + double doubledata ; + void *bindata ; + size_t size ; + char c, *strptr ; + int count = 0, trunc_8to4 = SF_FALSE ; + + if (! format) + return psf_ftell (psf) ; + + va_start (argptr, format) ; + + while ((c = *format++)) + { + if (psf->header.indx + 16 >= psf->header.len && psf_bump_header_allocation (psf, 16)) + return count ; + + switch (c) + { case ' ' : /* Do nothing. Just used to space out format string. */ + break ; + + case 'e' : /* All conversions are now from LE to host. */ + psf->rwf_endian = SF_ENDIAN_LITTLE ; + break ; + + case 'E' : /* All conversions are now from BE to host. */ + psf->rwf_endian = SF_ENDIAN_BIG ; + break ; + + case 't' : /* All 8 byte values now get written as 4 bytes. */ + trunc_8to4 = SF_TRUE ; + break ; + + case 'T' : /* All 8 byte values now get written as 8 bytes. */ + trunc_8to4 = SF_FALSE ; + break ; + + case 'm' : + data = va_arg (argptr, unsigned int) ; + header_put_marker (psf, data) ; + count += 4 ; + break ; + + case '1' : + data = va_arg (argptr, unsigned int) ; + header_put_byte (psf, data) ; + count += 1 ; + break ; + + case '2' : + data = va_arg (argptr, unsigned int) ; + if (psf->rwf_endian == SF_ENDIAN_BIG) + { header_put_be_short (psf, data) ; + } + else + { header_put_le_short (psf, data) ; + } ; + count += 2 ; + break ; + + case '3' : /* tribyte */ + data = va_arg (argptr, unsigned int) ; + if (psf->rwf_endian == SF_ENDIAN_BIG) + { header_put_be_3byte (psf, data) ; + } + else + { header_put_le_3byte (psf, data) ; + } ; + count += 3 ; + break ; + + case '4' : + data = va_arg (argptr, unsigned int) ; + if (psf->rwf_endian == SF_ENDIAN_BIG) + { header_put_be_int (psf, data) ; + } + else + { header_put_le_int (psf, data) ; + } ; + count += 4 ; + break ; + + case '8' : + countdata = va_arg (argptr, sf_count_t) ; + if (psf->rwf_endian == SF_ENDIAN_BIG && trunc_8to4 == SF_FALSE) + { header_put_be_8byte (psf, countdata) ; + count += 8 ; + } + else if (psf->rwf_endian == SF_ENDIAN_LITTLE && trunc_8to4 == SF_FALSE) + { header_put_le_8byte (psf, countdata) ; + count += 8 ; + } + else if (psf->rwf_endian == SF_ENDIAN_BIG && trunc_8to4 == SF_TRUE) + { longdata = countdata & 0xFFFFFFFF ; + header_put_be_int (psf, longdata) ; + count += 4 ; + } + else if (psf->rwf_endian == SF_ENDIAN_LITTLE && trunc_8to4 == SF_TRUE) + { longdata = countdata & 0xFFFFFFFF ; + header_put_le_int (psf, longdata) ; + count += 4 ; + } + break ; + + case 'f' : + /* Floats are passed as doubles. Is this always true? */ + floatdata = (float) va_arg (argptr, double) ; + if (psf->rwf_endian == SF_ENDIAN_BIG) + float32_be_write (floatdata, psf->header.ptr + psf->header.indx) ; + else + float32_le_write (floatdata, psf->header.ptr + psf->header.indx) ; + psf->header.indx += 4 ; + count += 4 ; + break ; + + case 'd' : + doubledata = va_arg (argptr, double) ; + if (psf->rwf_endian == SF_ENDIAN_BIG) + double64_be_write (doubledata, psf->header.ptr + psf->header.indx) ; + else + double64_le_write (doubledata, psf->header.ptr + psf->header.indx) ; + psf->header.indx += 8 ; + count += 8 ; + break ; + + case 's' : + /* Write a C string (guaranteed to have a zero terminator). */ + strptr = va_arg (argptr, char *) ; + size = strlen (strptr) + 1 ; + + if (psf->header.indx + 4 + (sf_count_t) size + (sf_count_t) (size & 1) > psf->header.len && psf_bump_header_allocation (psf, 4 + size + (size & 1))) + return count ; + + if (psf->rwf_endian == SF_ENDIAN_BIG) + header_put_be_int (psf, size + (size & 1)) ; + else + header_put_le_int (psf, size + (size & 1)) ; + memcpy (&(psf->header.ptr [psf->header.indx]), strptr, size) ; + size += (size & 1) ; + psf->header.indx += size ; + psf->header.ptr [psf->header.indx - 1] = 0 ; + count += 4 + size ; + break ; + + case 'S' : + /* + ** Write an AIFF style string (no zero terminator but possibly + ** an extra pad byte if the string length is odd). + */ + strptr = va_arg (argptr, char *) ; + size = strlen (strptr) ; + if (psf->header.indx + 4 + (sf_count_t) size + (sf_count_t) (size & 1) > psf->header.len && psf_bump_header_allocation (psf, 4 + size + (size & 1))) + return count ; + if (psf->rwf_endian == SF_ENDIAN_BIG) + header_put_be_int (psf, size) ; + else + header_put_le_int (psf, size) ; + memcpy (&(psf->header.ptr [psf->header.indx]), strptr, size + (size & 1)) ; + size += (size & 1) ; + psf->header.indx += size ; + count += 4 + size ; + break ; + + case 'p' : + /* Write a PASCAL string (as used by AIFF files). + */ + strptr = va_arg (argptr, char *) ; + size = strlen (strptr) ; + size = (size & 1) ? size : size + 1 ; + size = (size > 254) ? 254 : size ; + + if (psf->header.indx + 1 + (sf_count_t) size > psf->header.len && psf_bump_header_allocation (psf, 1 + size)) + return count ; + + header_put_byte (psf, size) ; + memcpy (&(psf->header.ptr [psf->header.indx]), strptr, size) ; + psf->header.indx += size ; + count += 1 + size ; + break ; + + case 'b' : + bindata = va_arg (argptr, void *) ; + size = va_arg (argptr, size_t) ; + + if (psf->header.indx + (sf_count_t) size > psf->header.len && psf_bump_header_allocation (psf, size)) + return count ; + + memcpy (&(psf->header.ptr [psf->header.indx]), bindata, size) ; + psf->header.indx += size ; + count += size ; + break ; + + case 'z' : + size = va_arg (argptr, size_t) ; + + if (psf->header.indx + (sf_count_t) size > psf->header.len && psf_bump_header_allocation (psf, size)) + return count ; + + count += size ; + while (size) + { psf->header.ptr [psf->header.indx] = 0 ; + psf->header.indx ++ ; + size -- ; + } ; + break ; + + case 'h' : + bindata = va_arg (argptr, void *) ; + memcpy (&(psf->header.ptr [psf->header.indx]), bindata, 16) ; + psf->header.indx += 16 ; + count += 16 ; + break ; + + case 'j' : /* Jump forwards/backwards by specified amount. */ + size = va_arg (argptr, size_t) ; + + if (psf->header.indx + (sf_count_t) size > psf->header.len && psf_bump_header_allocation (psf, size)) + return count ; + + psf->header.indx += size ; + count += size ; + break ; + + case 'o' : /* Jump to specified offset. */ + size = va_arg (argptr, size_t) ; + + if ((sf_count_t) size >= psf->header.len && psf_bump_header_allocation (psf, size)) + return count ; + + psf->header.indx = size ; + break ; + + default : + psf_log_printf (psf, "*** Invalid format specifier `%c'\n", c) ; + psf->error = SFE_INTERNAL ; + break ; + } ; + } ; + + va_end (argptr) ; + return count ; +} /* psf_binheader_writef */ + +/*----------------------------------------------------------------------------------------------- +** Binary header reading functions. Returns number of bytes read. +** +** Format specifiers are the same as for header write function above with the following +** additions: +** +** p - jump a given number of position from start of file. +** +** If format is NULL, psf_binheader_readf returns the current offset. +*/ + +#if (CPU_IS_BIG_ENDIAN == 1) +#define GET_MARKER(ptr) ( (((uint32_t) (ptr) [0]) << 24) | ((ptr) [1] << 16) | \ + ((ptr) [2] << 8) | ((ptr) [3])) + +#elif (CPU_IS_LITTLE_ENDIAN == 1) +#define GET_MARKER(ptr) ( ((ptr) [0]) | ((ptr) [1] << 8) | \ + ((ptr) [2] << 16) | (((uint32_t) (ptr) [3]) << 24)) + +#else +# error "Cannot determine endian-ness of processor." +#endif + +#define GET_LE_SHORT(ptr) (((ptr) [1] << 8) | ((ptr) [0])) +#define GET_BE_SHORT(ptr) (((ptr) [0] << 8) | ((ptr) [1])) + +#define GET_LE_3BYTE(ptr) ( ((ptr) [2] << 16) | ((ptr) [1] << 8) | ((ptr) [0])) +#define GET_BE_3BYTE(ptr) ( ((ptr) [0] << 16) | ((ptr) [1] << 8) | ((ptr) [2])) + +#define GET_LE_INT(ptr) ( ((ptr) [3] << 24) | ((ptr) [2] << 16) | \ + ((ptr) [1] << 8) | ((ptr) [0])) + +#define GET_BE_INT(ptr) ( ((ptr) [0] << 24) | ((ptr) [1] << 16) | \ + ((ptr) [2] << 8) | ((ptr) [3])) + +#define GET_LE_8BYTE(ptr) ( (((sf_count_t) (ptr) [7]) << 56) | (((sf_count_t) (ptr) [6]) << 48) | \ + (((sf_count_t) (ptr) [5]) << 40) | (((sf_count_t) (ptr) [4]) << 32) | \ + (((sf_count_t) (ptr) [3]) << 24) | (((sf_count_t) (ptr) [2]) << 16) | \ + (((sf_count_t) (ptr) [1]) << 8) | ((ptr) [0])) + +#define GET_BE_8BYTE(ptr) ( (((sf_count_t) (ptr) [0]) << 56) | (((sf_count_t) (ptr) [1]) << 48) | \ + (((sf_count_t) (ptr) [2]) << 40) | (((sf_count_t) (ptr) [3]) << 32) | \ + (((sf_count_t) (ptr) [4]) << 24) | (((sf_count_t) (ptr) [5]) << 16) | \ + (((sf_count_t) (ptr) [6]) << 8) | ((ptr) [7])) + + + +static int +header_read (SF_PRIVATE *psf, void *ptr, int bytes) +{ int count = 0 ; + + if (psf->header.indx + bytes >= psf->header.len && psf_bump_header_allocation (psf, bytes)) + return count ; + + if (psf->header.indx + bytes > psf->header.end) + { count = psf_fread (psf->header.ptr + psf->header.end, 1, bytes - (psf->header.end - psf->header.indx), psf) ; + if (count != bytes - (int) (psf->header.end - psf->header.indx)) + { psf_log_printf (psf, "Error : psf_fread returned short count.\n") ; + return count ; + } ; + psf->header.end += count ; + } ; + + memcpy (ptr, psf->header.ptr + psf->header.indx, bytes) ; + psf->header.indx += bytes ; + + return bytes ; +} /* header_read */ + +static void +header_seek (SF_PRIVATE *psf, sf_count_t position, int whence) +{ + switch (whence) + { case SEEK_SET : + if (psf->header.indx + position >= psf->header.len) + psf_bump_header_allocation (psf, position) ; + if (position > psf->header.len) + { /* Too much header to cache so just seek instead. */ + psf->header.indx = psf->header.end ; + psf_fseek (psf, position, whence) ; + return ; + } ; + if (position > psf->header.end) + psf->header.end += psf_fread (psf->header.ptr + psf->header.end, 1, position - psf->header.end, psf) ; + psf->header.indx = position ; + break ; + + case SEEK_CUR : + if (psf->header.indx + position >= psf->header.len) + psf_bump_header_allocation (psf, position) ; + + if (psf->header.indx + position < 0) + break ; + + if (psf->header.indx >= psf->header.len) + { psf_fseek (psf, position, whence) ; + return ; + } ; + + if (psf->header.indx + position <= psf->header.end) + { psf->header.indx += position ; + break ; + } ; + + if (psf->header.indx + position > psf->header.len) + { /* Need to jump this without caching it. */ + psf->header.indx = psf->header.end ; + psf_fseek (psf, position, SEEK_CUR) ; + break ; + } ; + + psf->header.end += psf_fread (psf->header.ptr + psf->header.end, 1, position - (psf->header.end - psf->header.indx), psf) ; + psf->header.indx = psf->header.end ; + break ; + + case SEEK_END : + default : + psf_log_printf (psf, "Bad whence param in header_seek().\n") ; + break ; + } ; + + return ; +} /* header_seek */ + +static int +header_gets (SF_PRIVATE *psf, char *ptr, int bufsize) +{ int k ; + + if (psf->header.indx + bufsize >= psf->header.len && psf_bump_header_allocation (psf, bufsize)) + return 0 ; + + for (k = 0 ; k < bufsize - 1 ; k++) + { if (psf->header.indx < psf->header.end) + { ptr [k] = psf->header.ptr [psf->header.indx] ; + psf->header.indx ++ ; + } + else + { psf->header.end += psf_fread (psf->header.ptr + psf->header.end, 1, 1, psf) ; + ptr [k] = psf->header.ptr [psf->header.indx] ; + psf->header.indx = psf->header.end ; + } ; + + if (ptr [k] == '\n') + break ; + } ; + + ptr [k] = 0 ; + + return k ; +} /* header_gets */ + +int +psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...) +{ va_list argptr ; + sf_count_t *countptr, countdata ; + unsigned char *ucptr, sixteen_bytes [16] ; + unsigned int *intptr, intdata ; + unsigned short *shortptr ; + char *charptr ; + float *floatptr ; + double *doubleptr ; + char c ; + int byte_count = 0, count = 0 ; + + if (! format) + return psf_ftell (psf) ; + + va_start (argptr, format) ; + + while ((c = *format++)) + { + if (psf->header.indx + 16 >= psf->header.len && psf_bump_header_allocation (psf, 16)) + return count ; + + switch (c) + { case 'e' : /* All conversions are now from LE to host. */ + psf->rwf_endian = SF_ENDIAN_LITTLE ; + break ; + + case 'E' : /* All conversions are now from BE to host. */ + psf->rwf_endian = SF_ENDIAN_BIG ; + break ; + + case 'm' : /* 4 byte marker value eg 'RIFF' */ + intptr = va_arg (argptr, unsigned int*) ; + *intptr = 0 ; + ucptr = (unsigned char*) intptr ; + byte_count += header_read (psf, ucptr, sizeof (int)) ; + *intptr = GET_MARKER (ucptr) ; + break ; + + case 'h' : + intptr = va_arg (argptr, unsigned int*) ; + *intptr = 0 ; + ucptr = (unsigned char*) intptr ; + byte_count += header_read (psf, sixteen_bytes, sizeof (sixteen_bytes)) ; + { int k ; + intdata = 0 ; + for (k = 0 ; k < 16 ; k++) + intdata ^= sixteen_bytes [k] << k ; + } + *intptr = intdata ; + break ; + + case '1' : + charptr = va_arg (argptr, char*) ; + *charptr = 0 ; + byte_count += header_read (psf, charptr, sizeof (char)) ; + break ; + + case '2' : /* 2 byte value with the current endian-ness */ + shortptr = va_arg (argptr, unsigned short*) ; + *shortptr = 0 ; + ucptr = (unsigned char*) shortptr ; + byte_count += header_read (psf, ucptr, sizeof (short)) ; + if (psf->rwf_endian == SF_ENDIAN_BIG) + *shortptr = GET_BE_SHORT (ucptr) ; + else + *shortptr = GET_LE_SHORT (ucptr) ; + break ; + + case '3' : /* 3 byte value with the current endian-ness */ + intptr = va_arg (argptr, unsigned int*) ; + *intptr = 0 ; + byte_count += header_read (psf, sixteen_bytes, 3) ; + if (psf->rwf_endian == SF_ENDIAN_BIG) + *intptr = GET_BE_3BYTE (sixteen_bytes) ; + else + *intptr = GET_LE_3BYTE (sixteen_bytes) ; + break ; + + case '4' : /* 4 byte value with the current endian-ness */ + intptr = va_arg (argptr, unsigned int*) ; + *intptr = 0 ; + ucptr = (unsigned char*) intptr ; + byte_count += header_read (psf, ucptr, sizeof (int)) ; + if (psf->rwf_endian == SF_ENDIAN_BIG) + *intptr = psf_get_be32 (ucptr, 0) ; + else + *intptr = psf_get_le32 (ucptr, 0) ; + break ; + + case '8' : /* 8 byte value with the current endian-ness */ + countptr = va_arg (argptr, sf_count_t *) ; + *countptr = 0 ; + byte_count += header_read (psf, sixteen_bytes, 8) ; + if (psf->rwf_endian == SF_ENDIAN_BIG) + countdata = psf_get_be64 (sixteen_bytes, 0) ; + else + countdata = psf_get_le64 (sixteen_bytes, 0) ; + *countptr = countdata ; + break ; + + case 'f' : /* Float conversion */ + floatptr = va_arg (argptr, float *) ; + *floatptr = 0.0 ; + byte_count += header_read (psf, floatptr, sizeof (float)) ; + if (psf->rwf_endian == SF_ENDIAN_BIG) + *floatptr = float32_be_read ((unsigned char*) floatptr) ; + else + *floatptr = float32_le_read ((unsigned char*) floatptr) ; + break ; + + case 'd' : /* double conversion */ + doubleptr = va_arg (argptr, double *) ; + *doubleptr = 0.0 ; + byte_count += header_read (psf, doubleptr, sizeof (double)) ; + if (psf->rwf_endian == SF_ENDIAN_BIG) + *doubleptr = double64_be_read ((unsigned char*) doubleptr) ; + else + *doubleptr = double64_le_read ((unsigned char*) doubleptr) ; + break ; + + case 's' : + psf_log_printf (psf, "Format conversion 's' not implemented yet.\n") ; + /* + strptr = va_arg (argptr, char *) ; + size = strlen (strptr) + 1 ; + size += (size & 1) ; + longdata = H2LE_32 (size) ; + get_int (psf, longdata) ; + memcpy (&(psf->header.ptr [psf->header.indx]), strptr, size) ; + psf->header.indx += size ; + */ + break ; + + case 'b' : /* Raw bytes */ + charptr = va_arg (argptr, char*) ; + count = va_arg (argptr, size_t) ; + memset (charptr, 0, count) ; + byte_count += header_read (psf, charptr, count) ; + break ; + + case 'G' : + charptr = va_arg (argptr, char*) ; + count = va_arg (argptr, size_t) ; + memset (charptr, 0, count) ; + + if (psf->header.indx + count >= psf->header.len && psf_bump_header_allocation (psf, count)) + return 0 ; + + byte_count += header_gets (psf, charptr, count) ; + break ; + + case 'z' : + psf_log_printf (psf, "Format conversion 'z' not implemented yet.\n") ; + /* + size = va_arg (argptr, size_t) ; + while (size) + { psf->header.ptr [psf->header.indx] = 0 ; + psf->header.indx ++ ; + size -- ; + } ; + */ + break ; + + case 'p' : /* Seek to position from start. */ + count = va_arg (argptr, size_t) ; + header_seek (psf, count, SEEK_SET) ; + byte_count = count ; + break ; + + case 'j' : /* Seek to position from current position. */ + count = va_arg (argptr, size_t) ; + header_seek (psf, count, SEEK_CUR) ; + byte_count += count ; + break ; + + default : + psf_log_printf (psf, "*** Invalid format specifier `%c'\n", c) ; + psf->error = SFE_INTERNAL ; + break ; + } ; + } ; + + va_end (argptr) ; + + return byte_count ; +} /* psf_binheader_readf */ + +/*----------------------------------------------------------------------------------------------- +*/ + +sf_count_t +psf_default_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t samples_from_start) +{ sf_count_t position, retval ; + + if (! (psf->blockwidth && psf->dataoffset >= 0)) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + if (! psf->sf.seekable) + { psf->error = SFE_NOT_SEEKABLE ; + return PSF_SEEK_ERROR ; + } ; + + position = psf->dataoffset + psf->blockwidth * samples_from_start ; + + if ((retval = psf_fseek (psf, position, SEEK_SET)) != position) + { psf->error = SFE_SEEK_FAILED ; + return PSF_SEEK_ERROR ; + } ; + + return samples_from_start ; +} /* psf_default_seek */ + +/*----------------------------------------------------------------------------------------------- +*/ + +void +psf_hexdump (const void *ptr, int len) +{ const char *data ; + char ascii [17] ; + int k, m ; + + if ((data = ptr) == NULL) + return ; + if (len <= 0) + return ; + + puts ("") ; + for (k = 0 ; k < len ; k += 16) + { memset (ascii, ' ', sizeof (ascii)) ; + + printf ("%08X: ", k) ; + for (m = 0 ; m < 16 && k + m < len ; m++) + { printf (m == 8 ? " %02X " : "%02X ", data [k + m] & 0xFF) ; + ascii [m] = psf_isprint (data [k + m]) ? data [k + m] : '.' ; + } ; + + if (m <= 8) printf (" ") ; + for ( ; m < 16 ; m++) printf (" ") ; + + ascii [16] = 0 ; + printf (" %s\n", ascii) ; + } ; + + puts ("") ; +} /* psf_hexdump */ + +void +psf_log_SF_INFO (SF_PRIVATE *psf) +{ psf_log_printf (psf, "---------------------------------\n") ; + + psf_log_printf (psf, " Sample rate : %d\n", psf->sf.samplerate) ; + if (psf->sf.frames == SF_COUNT_MAX) + psf_log_printf (psf, " Frames : unknown\n") ; + else + psf_log_printf (psf, " Frames : %D\n", psf->sf.frames) ; + psf_log_printf (psf, " Channels : %d\n", psf->sf.channels) ; + + psf_log_printf (psf, " Format : 0x%X\n", psf->sf.format) ; + psf_log_printf (psf, " Sections : %d\n", psf->sf.sections) ; + psf_log_printf (psf, " Seekable : %s\n", psf->sf.seekable ? "TRUE" : "FALSE") ; + + psf_log_printf (psf, "---------------------------------\n") ; +} /* psf_dump_SFINFO */ + +/*======================================================================================== +*/ + +void* +psf_memset (void *s, int c, sf_count_t len) +{ char *ptr ; + int setcount ; + + ptr = (char *) s ; + + while (len > 0) + { setcount = (len > 0x10000000) ? 0x10000000 : (int) len ; + + memset (ptr, c, setcount) ; + + ptr += setcount ; + len -= setcount ; + } ; + + return s ; +} /* psf_memset */ + + +/* +** Clang refuses to do sizeof (SF_CUES_VAR (cue_count)) so we have to manually +** bodgy something up instead. +*/ + +typedef SF_CUES_VAR (0) SF_CUES_0 ; + +/* calculate size of SF_CUES struct given number of cues */ +#define SF_CUES_VAR_SIZE(count) (sizeof (SF_CUES_0) + count * sizeof (SF_CUE_POINT)) + +/* calculate number of cues in SF_CUES struct given data size */ +#define SF_CUES_COUNT(datasize) (((datasize) - sizeof (uint32_t)) / sizeof (SF_CUE_POINT)) + +SF_CUES * +psf_cues_alloc (uint32_t cue_count) +{ SF_CUES *pcues = calloc (1, SF_CUES_VAR_SIZE (cue_count)) ; + + pcues->cue_count = cue_count ; + return pcues ; +} /* psf_cues_alloc */ + +SF_CUES * +psf_cues_dup (const void * ptr, size_t datasize) +{ const SF_CUES *pcues = ptr ; + SF_CUES *pnew = NULL ; + + if (pcues->cue_count <= SF_CUES_COUNT (datasize)) + { /* check that passed-in datasize is consistent with cue_count in passed-in SF_CUES struct */ + pnew = psf_cues_alloc (pcues->cue_count) ; + memcpy (pnew, pcues, SF_CUES_VAR_SIZE (pcues->cue_count)) ; + } + + return pnew ; +} /* psf_cues_dup */ + +void +psf_get_cues (SF_PRIVATE * psf, void * data, size_t datasize) +{ + if (psf->cues) + { uint32_t cue_count = SF_CUES_COUNT (datasize) ; + + cue_count = SF_MIN (cue_count, psf->cues->cue_count) ; + memcpy (data, psf->cues, SF_CUES_VAR_SIZE (cue_count)) ; + ((SF_CUES*) data)->cue_count = cue_count ; + } ; + + return ; +} /* psf_get_cues */ + + +SF_INSTRUMENT * +psf_instrument_alloc (void) +{ SF_INSTRUMENT *instr ; + + instr = calloc (1, sizeof (SF_INSTRUMENT)) ; + + if (instr == NULL) + return NULL ; + + /* Set non-zero default values. */ + instr->basenote = -1 ; + instr->velocity_lo = -1 ; + instr->velocity_hi = -1 ; + instr->key_lo = -1 ; + instr->key_hi = -1 ; + + return instr ; +} /* psf_instrument_alloc */ + +void +psf_sanitize_string (char * cptr, int len) +{ + do + { + len -- ; + cptr [len] = psf_isprint (cptr [len]) ? cptr [len] : '.' ; + } + while (len > 0) ; +} /* psf_sanitize_string */ + +void +psf_get_date_str (char *str, int maxlen) +{ time_t current ; + struct tm timedata, *tmptr ; + + time (¤t) ; + +#if defined (HAVE_GMTIME_R) + /* If the re-entrant version is available, use it. */ + tmptr = gmtime_r (¤t, &timedata) ; +#elif defined (HAVE_GMTIME) + /* Otherwise use the standard one and copy the data to local storage. */ + tmptr = gmtime (¤t) ; + memcpy (&timedata, tmptr, sizeof (timedata)) ; +#else + tmptr = NULL ; +#endif + + if (tmptr) + snprintf (str, maxlen, "%4d-%02d-%02d %02d:%02d:%02d UTC", + 1900 + timedata.tm_year, timedata.tm_mon, timedata.tm_mday, + timedata.tm_hour, timedata.tm_min, timedata.tm_sec) ; + else + snprintf (str, maxlen, "Unknown date") ; + + return ; +} /* psf_get_date_str */ + +int +subformat_to_bytewidth (int format) +{ + switch (format) + { case SF_FORMAT_PCM_U8 : + case SF_FORMAT_PCM_S8 : + return 1 ; + case SF_FORMAT_PCM_16 : + return 2 ; + case SF_FORMAT_PCM_24 : + return 3 ; + case SF_FORMAT_PCM_32 : + case SF_FORMAT_FLOAT : + return 4 ; + case SF_FORMAT_DOUBLE : + return 8 ; + } ; + + return 0 ; +} /* subformat_to_bytewidth */ + +int +s_bitwidth_to_subformat (int bits) +{ static int array [] = + { SF_FORMAT_PCM_S8, SF_FORMAT_PCM_16, SF_FORMAT_PCM_24, SF_FORMAT_PCM_32 + } ; + + if (bits < 8 || bits > 32) + return 0 ; + + return array [((bits + 7) / 8) - 1] ; +} /* bitwidth_to_subformat */ + +int +u_bitwidth_to_subformat (int bits) +{ static int array [] = + { SF_FORMAT_PCM_U8, SF_FORMAT_PCM_16, SF_FORMAT_PCM_24, SF_FORMAT_PCM_32 + } ; + + if (bits < 8 || bits > 32) + return 0 ; + + return array [((bits + 7) / 8) - 1] ; +} /* bitwidth_to_subformat */ + +/* +** psf_rand_int32 : Not crypto quality, but more than adequate for things +** like stream serial numbers in Ogg files or the unique_id field of the +** SF_PRIVATE struct. +*/ + +int32_t +psf_rand_int32 (void) +{ static uint64_t value = 0 ; + int k, count ; + + if (value == 0) + { +#if HAVE_GETTIMEOFDAY + struct timeval tv ; + gettimeofday (&tv, NULL) ; + value = tv.tv_sec + tv.tv_usec ; +#else + value = time (NULL) ; +#endif + } ; + + count = 4 + (value & 7) ; + for (k = 0 ; k < count ; k++) + value = (11117 * value + 211231) & 0x7fffffff ; + + return (int32_t) value ; +} /* psf_rand_int32 */ + +void +append_snprintf (char * dest, size_t maxlen, const char * fmt, ...) +{ size_t len = strlen (dest) ; + + if (len < maxlen) + { va_list ap ; + + va_start (ap, fmt) ; + vsnprintf (dest + len, maxlen - len, fmt, ap) ; + va_end (ap) ; + } ; + + return ; +} /* append_snprintf */ + + +void +psf_strlcpy_crlf (char *dest, const char *src, size_t destmax, size_t srcmax) +{ /* Must be minus 2 so it can still expand a single trailing '\n' or '\r'. */ + char * destend = dest + destmax - 2 ; + const char * srcend = src + srcmax ; + + while (dest < destend && src < srcend) + { if ((src [0] == '\r' && src [1] == '\n') || (src [0] == '\n' && src [1] == '\r')) + { *dest++ = '\r' ; + *dest++ = '\n' ; + src += 2 ; + continue ; + } ; + + if (src [0] == '\r') + { *dest++ = '\r' ; + *dest++ = '\n' ; + src += 1 ; + continue ; + } ; + + if (src [0] == '\n') + { *dest++ = '\r' ; + *dest++ = '\n' ; + src += 1 ; + continue ; + } ; + + *dest++ = *src++ ; + } ; + + /* Make sure dest is terminated. */ + *dest = 0 ; +} /* psf_strlcpy_crlf */ + +sf_count_t +psf_decode_frame_count (SF_PRIVATE *psf) +{ sf_count_t count, readlen, total = 0 ; + BUF_UNION ubuf ; + + /* If we're reading from a pipe or the file is too long, just return SF_COUNT_MAX. */ + if (psf_is_pipe (psf) || psf->datalength > 0x1000000) + return SF_COUNT_MAX ; + + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + + readlen = ARRAY_LEN (ubuf.ibuf) / psf->sf.channels ; + readlen *= psf->sf.channels ; + + while ((count = psf->read_int (psf, ubuf.ibuf, readlen)) > 0) + total += count ; + + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + + return total / psf->sf.channels ; +} /* psf_decode_frame_count */ + +/*============================================================================== +*/ + +#define CASE_NAME(x) case x : return #x ; break ; + +const char * +str_of_major_format (int format) +{ switch (SF_CONTAINER (format)) + { CASE_NAME (SF_FORMAT_WAV) ; + CASE_NAME (SF_FORMAT_AIFF) ; + CASE_NAME (SF_FORMAT_AU) ; + CASE_NAME (SF_FORMAT_RAW) ; + CASE_NAME (SF_FORMAT_PAF) ; + CASE_NAME (SF_FORMAT_SVX) ; + CASE_NAME (SF_FORMAT_NIST) ; + CASE_NAME (SF_FORMAT_VOC) ; + CASE_NAME (SF_FORMAT_IRCAM) ; + CASE_NAME (SF_FORMAT_W64) ; + CASE_NAME (SF_FORMAT_MAT4) ; + CASE_NAME (SF_FORMAT_MAT5) ; + CASE_NAME (SF_FORMAT_PVF) ; + CASE_NAME (SF_FORMAT_XI) ; + CASE_NAME (SF_FORMAT_HTK) ; + CASE_NAME (SF_FORMAT_SDS) ; + CASE_NAME (SF_FORMAT_AVR) ; + CASE_NAME (SF_FORMAT_WAVEX) ; + CASE_NAME (SF_FORMAT_SD2) ; + CASE_NAME (SF_FORMAT_FLAC) ; + CASE_NAME (SF_FORMAT_CAF) ; + CASE_NAME (SF_FORMAT_WVE) ; + CASE_NAME (SF_FORMAT_OGG) ; + default : + break ; + } ; + + return "BAD_MAJOR_FORMAT" ; +} /* str_of_major_format */ + +const char * +str_of_minor_format (int format) +{ switch (SF_CODEC (format)) + { CASE_NAME (SF_FORMAT_PCM_S8) ; + CASE_NAME (SF_FORMAT_PCM_16) ; + CASE_NAME (SF_FORMAT_PCM_24) ; + CASE_NAME (SF_FORMAT_PCM_32) ; + CASE_NAME (SF_FORMAT_PCM_U8) ; + CASE_NAME (SF_FORMAT_FLOAT) ; + CASE_NAME (SF_FORMAT_DOUBLE) ; + CASE_NAME (SF_FORMAT_ULAW) ; + CASE_NAME (SF_FORMAT_ALAW) ; + CASE_NAME (SF_FORMAT_IMA_ADPCM) ; + CASE_NAME (SF_FORMAT_MS_ADPCM) ; + CASE_NAME (SF_FORMAT_GSM610) ; + CASE_NAME (SF_FORMAT_VOX_ADPCM) ; + CASE_NAME (SF_FORMAT_NMS_ADPCM_16) ; + CASE_NAME (SF_FORMAT_NMS_ADPCM_24) ; + CASE_NAME (SF_FORMAT_NMS_ADPCM_32) ; + CASE_NAME (SF_FORMAT_G721_32) ; + CASE_NAME (SF_FORMAT_G723_24) ; + CASE_NAME (SF_FORMAT_G723_40) ; + CASE_NAME (SF_FORMAT_DWVW_12) ; + CASE_NAME (SF_FORMAT_DWVW_16) ; + CASE_NAME (SF_FORMAT_DWVW_24) ; + CASE_NAME (SF_FORMAT_DWVW_N) ; + CASE_NAME (SF_FORMAT_DPCM_8) ; + CASE_NAME (SF_FORMAT_DPCM_16) ; + CASE_NAME (SF_FORMAT_VORBIS) ; + default : + break ; + } ; + + return "BAD_MINOR_FORMAT" ; +} /* str_of_minor_format */ + +const char * +str_of_open_mode (int mode) +{ switch (mode) + { CASE_NAME (SFM_READ) ; + CASE_NAME (SFM_WRITE) ; + CASE_NAME (SFM_RDWR) ; + + default : + break ; + } ; + + return "BAD_MODE" ; +} /* str_of_open_mode */ + +const char * +str_of_endianness (int end) +{ switch (end) + { CASE_NAME (SF_ENDIAN_BIG) ; + CASE_NAME (SF_ENDIAN_LITTLE) ; + CASE_NAME (SF_ENDIAN_CPU) ; + default : + break ; + } ; + + /* Zero length string for SF_ENDIAN_FILE. */ + return "" ; +} /* str_of_endianness */ + +/*============================================================================== +*/ + +void +psf_f2s_array (const float *src, short *dest, int count, int normalize) +{ float normfact ; + + normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ; + while (--count >= 0) + dest [count] = psf_lrintf (src [count] * normfact) ; + + return ; +} /* psf_f2s_array */ + +void +psf_f2s_clip_array (const float *src, short *dest, int count, int normalize) +{ float normfact, scaled_value ; + + normfact = normalize ? (1.0 * 0x8000) : 1.0 ; + + while (--count >= 0) + { scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFF)) + { dest [count] = 0x7FFF ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x1000)) + { dest [count] = 0x8000 ; + continue ; + } ; + + dest [count] = psf_lrintf (scaled_value) ; + } ; + + return ; +} /* psf_f2s_clip_array */ + +void +psf_d2s_array (const double *src, short *dest, int count, int normalize) +{ double normfact ; + + normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ; + while (--count >= 0) + dest [count] = psf_lrint (src [count] * normfact) ; + + return ; +} /* psf_f2s_array */ + +void +psf_d2s_clip_array (const double *src, short *dest, int count, int normalize) +{ double normfact, scaled_value ; + + normfact = normalize ? (1.0 * 0x8000) : 1.0 ; + + while (--count >= 0) + { scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFF)) + { dest [count] = 0x7FFF ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x1000)) + { dest [count] = 0x8000 ; + continue ; + } ; + + dest [count] = psf_lrint (scaled_value) ; + } ; + + return ; +} /* psf_d2s_clip_array */ + + +void +psf_f2i_array (const float *src, int *dest, int count, int normalize) +{ float normfact ; + + normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ; + while (--count >= 0) + dest [count] = psf_lrintf (src [count] * normfact) ; + + return ; +} /* psf_f2i_array */ + +void +psf_f2i_clip_array (const float *src, int *dest, int count, int normalize) +{ float normfact, scaled_value ; + + normfact = normalize ? (8.0 * 0x10000000) : 1.0 ; + + while (--count >= 0) + { scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) + { dest [count] = 0x7FFFFFFF ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) + { dest [count] = 0x80000000 ; + continue ; + } ; + + dest [count] = psf_lrintf (scaled_value) ; + } ; + + return ; +} /* psf_f2i_clip_array */ + +void +psf_d2i_array (const double *src, int *dest, int count, int normalize) +{ double normfact ; + + normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ; + while (--count >= 0) + dest [count] = psf_lrint (src [count] * normfact) ; + + return ; +} /* psf_f2i_array */ + +void +psf_d2i_clip_array (const double *src, int *dest, int count, int normalize) +{ double normfact, scaled_value ; + + normfact = normalize ? (8.0 * 0x10000000) : 1.0 ; + + while (--count >= 0) + { scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) + { dest [count] = 0x7FFFFFFF ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) + { dest [count] = 0x80000000 ; + continue ; + } ; + + dest [count] = psf_lrint (scaled_value) ; + } ; + + return ; +} /* psf_d2i_clip_array */ + +FILE * +psf_open_tmpfile (char * fname, size_t fnamelen) +{ const char * tmpdir ; + FILE * file ; + + if (OS_IS_WIN32) + tmpdir = getenv ("TEMP") ; + else + { tmpdir = getenv ("TMPDIR") ; + tmpdir = tmpdir == NULL ? "/tmp" : tmpdir ; + } ; + + if (tmpdir && access (tmpdir, R_OK | W_OK | X_OK) == 0) + { snprintf (fname, fnamelen, "%s/%x%x-alac.tmp", tmpdir, psf_rand_int32 (), psf_rand_int32 ()) ; + if ((file = fopen (fname, "wb+")) != NULL) + return file ; + } ; + + snprintf (fname, fnamelen, "%x%x-alac.tmp", psf_rand_int32 (), psf_rand_int32 ()) ; + if ((file = fopen (fname, "wb+")) != NULL) + return file ; + + memset (fname, 0, fnamelen) ; + return NULL ; +} /* psf_open_tmpfile */ diff --git a/libsndfile-1.0.31/src/common.h b/libsndfile-1.0.31/src/common.h new file mode 100644 index 0000000..08360d0 --- /dev/null +++ b/libsndfile-1.0.31/src/common.h @@ -0,0 +1,1144 @@ +/* +** Copyright (C) 1999-2018 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#ifndef SNDFILE_COMMON_H +#define SNDFILE_COMMON_H + +#include "sfconfig.h" + +#include +#include + +#if HAVE_INTTYPES_H +#include +#elif HAVE_STDINT_H +#include +#endif +#if HAVE_SYS_TYPES_H +#include +#endif + +#ifndef SNDFILE_H +#include "sndfile.h" +#endif + +#include + +#ifdef USE_SSE2 +#include +#endif + +#ifdef __cplusplus +#error "This code is not designed to be compiled with a C++ compiler." +#endif + +#ifdef INT64_C +# define SF_PLATFORM_S64(x) INT64_C (x) +#elif (SIZEOF_LONG == 8) +# define SF_PLATFORM_S64(x) x##l +#elif (SIZEOF_LONG_LONG == 8) +# define SF_PLATFORM_S64(x) x##ll +#elif COMPILER_IS_GCC +# define SF_PLATFORM_S64(x) x##ll +#elif OS_IS_WIN32 +# define SF_PLATFORM_S64(x) x##I64 +#else +# error "Don't know how to define a 64 bit integer constant." +#endif + + + +/* +** Inspiration : http://sourcefrog.net/weblog/software/languages/C/unused.html +*/ +#ifdef UNUSED +#elif defined (__GNUC__) +# define UNUSED(x) UNUSED_ ## x __attribute__ ((unused)) +#elif defined (__LCLINT__) +# define UNUSED(x) /*@unused@*/ x +#else +# define UNUSED(x) x +#endif + +#ifdef __GNUC__ +# define WARN_UNUSED __attribute__ ((warn_unused_result)) +#else +# define WARN_UNUSED +#endif + +#define SF_BUFFER_LEN (8192) +#define SF_FILENAME_LEN (1024) +#define SF_SYSERR_LEN (256) +#define SF_MAX_STRINGS (32) +#define SF_PARSELOG_LEN (2048) + +#define PSF_SEEK_ERROR ((sf_count_t) -1) + +#define BITWIDTH2BYTES(x) (((x) + 7) / 8) + +/* For some reason sizeof returns an unsigned value which causes +** a warning when that value is added or subtracted from a signed +** value. Use SIGNED_SIZEOF instead. +*/ +#define SIGNED_SIZEOF(x) ((int) sizeof (x)) + +#define ARRAY_LEN(x) ((int) (sizeof (x) / sizeof ((x) [0]))) + +#define NOT(x) (! (x)) + +#if COMPILER_IS_GCC +#define SF_MAX(x, y) ({ \ + typeof (x) sf_max_x1 = (x) ; \ + typeof (y) sf_max_y1 = (y) ; \ + (void) (&sf_max_x1 == &sf_max_y1) ; \ + sf_max_x1 > sf_max_y1 ? sf_max_x1 : sf_max_y1 ; }) + +#define SF_MIN(x, y) ({ \ + typeof (x) sf_min_x2 = (x) ; \ + typeof (y) sf_min_y2 = (y) ; \ + (void) (&sf_min_x2 == &sf_min_y2) ; \ + sf_min_x2 < sf_min_y2 ? sf_min_x2 : sf_min_y2 ; }) +#else +#define SF_MAX(a, b) ((a) > (b) ? (a) : (b)) +#define SF_MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif + + +#define COMPILE_TIME_ASSERT(e) (sizeof (struct { int : - !! (e) ; })) + + +#define SF_MAX_CHANNELS 1024 + + +/* +* Macros for spliting the format file of SF_INFO into container type, +** codec type and endian-ness. +*/ +#define SF_CONTAINER(x) ((x) & SF_FORMAT_TYPEMASK) +#define SF_CODEC(x) ((x) & SF_FORMAT_SUBMASK) +#define SF_ENDIAN(x) ((x) & SF_FORMAT_ENDMASK) + +/* +** Binheader cast macros. +*/ + +#define BHW1(x) ((uint8_t) (x)) +#define BHW2(x) ((uint16_t) (x)) +#define BHW3(x) ((uint32_t) (x)) +#define BHW4(x) ((uint32_t) (x)) +#define BHW8(x) ((uint64_t) (x)) + +#define BHWm(x) ((uint32_t) (x)) +#define BHWS(x) ((char *) (x)) + +#define BHWf(x) ((double) (x)) +#define BHWd(x) ((double) (x)) + +#define BHWh(x) ((void *) (x)) +#define BHWj(x) ((size_t) (x)) +#define BHWp(x) ((char *) (x)) +#define BHWo(x) ((size_t) (x)) +#define BHWs(x) ((char *) (x)) +#define BHWv(x) ((const void *) (x)) +#define BHWz(x) ((size_t) (x)) + +/*------------------------------------------------------------------------------ +*/ + +enum +{ /* PEAK chunk location. */ + SF_PEAK_START = 42, + SF_PEAK_END = 43, + + /* PEAK chunk location. */ + SF_SCALE_MAX = 52, + SF_SCALE_MIN = 53, + + /* str_flags values. */ + SF_STR_ALLOW_START = 0x0100, + SF_STR_ALLOW_END = 0x0200, + + /* Location of strings. */ + SF_STR_LOCATE_START = 0x0400, + SF_STR_LOCATE_END = 0x0800, + + SFD_TYPEMASK = 0x0FFFFFFF +} ; + +#define SFM_MASK (SFM_READ | SFM_WRITE | SFM_RDWR) +#define SFM_UNMASK (~SFM_MASK) + +/*--------------------------------------------------------------------------------------- +** Formats that may be supported at some time in the future. +** When support is finalised, these values move to src/sndfile.h. +*/ + +enum +{ /* Work in progress. */ + SF_FORMAT_SPEEX = 0x5000000, + SF_FORMAT_OGGFLAC = 0x5000001, + + /* Formats supported read only. */ + SF_FORMAT_TXW = 0x4030000, /* Yamaha TX16 sampler file */ + SF_FORMAT_DWD = 0x4040000, /* DiamondWare Digirized */ + + /* Following are detected but not supported. */ + SF_FORMAT_REX = 0x40A0000, /* Propellorheads Rex/Rcy */ + SF_FORMAT_REX2 = 0x40D0000, /* Propellorheads Rex2 */ + SF_FORMAT_KRZ = 0x40E0000, /* Kurzweil sampler file */ + SF_FORMAT_WMA = 0x4100000, /* Windows Media Audio. */ + SF_FORMAT_SHN = 0x4110000, /* Shorten. */ + + /* Unsupported encodings. */ + SF_FORMAT_SVX_FIB = 0x1020, /* SVX Fibonacci Delta encoding. */ + SF_FORMAT_SVX_EXP = 0x1021, /* SVX Exponential Delta encoding. */ + + SF_FORMAT_PCM_N = 0x1030 +} ; + +/*--------------------------------------------------------------------------------------- +*/ + +typedef struct +{ unsigned kuki_offset ; + unsigned pakt_offset ; + + unsigned bits_per_sample ; + unsigned frames_per_packet ; + + int64_t packets ; + int64_t valid_frames ; + int32_t priming_frames ; + int32_t remainder_frames ; +} ALAC_DECODER_INFO ; + +/*--------------------------------------------------------------------------------------- +** PEAK_CHUNK - This chunk type is common to both AIFF and WAVE files although their +** endian encodings are different. +*/ + +typedef struct +{ double value ; /* signed value of peak */ + sf_count_t position ; /* the sample frame for the peak */ +} PEAK_POS ; + +typedef struct +{ /* libsndfile internal : write a PEAK chunk at the start or end of the file? */ + int peak_loc ; + + /* WAV/AIFF */ + unsigned int version ; /* version of the PEAK chunk */ + unsigned int timestamp ; /* secs since 1/1/1970 */ + + /* CAF */ + unsigned int edit_number ; + + /* the per channel peak info */ + PEAK_POS peaks [] ; +} PEAK_INFO ; + +static inline PEAK_INFO * +peak_info_calloc (int channels) +{ return calloc (1, sizeof (PEAK_INFO) + channels * sizeof (PEAK_POS)) ; +} /* peak_info_calloc */ + +typedef struct +{ int type ; + int flags ; + size_t offset ; +} STR_DATA ; + +typedef struct +{ uint64_t hash ; + char id [64] ; + unsigned id_size ; + uint32_t mark32 ; + sf_count_t offset ; + uint32_t len ; +} READ_CHUNK ; + +typedef struct +{ uint64_t hash ; + uint32_t mark32 ; + uint32_t len ; + void *data ; +} WRITE_CHUNK ; + +typedef struct +{ uint32_t count ; + uint32_t used ; + READ_CHUNK *chunks ; +} READ_CHUNKS ; +typedef struct +{ uint32_t count ; + uint32_t used ; + WRITE_CHUNK *chunks ; +} WRITE_CHUNKS ; + +struct SF_CHUNK_ITERATOR +{ uint32_t current ; + int64_t hash ; + char id [64] ; + unsigned id_size ; + SNDFILE *sndfile ; +} ; + +static inline size_t +make_size_t (int x) +{ return (size_t) x ; +} /* make_size_t */ + +typedef SF_BROADCAST_INFO_VAR (16 * 1024) SF_BROADCAST_INFO_16K ; + +typedef SF_CART_INFO_VAR (16 * 1024) SF_CART_INFO_16K ; + +#if SIZEOF_WCHAR_T == 2 +typedef wchar_t sfwchar_t ; +#else +typedef int16_t sfwchar_t ; +#endif + + +static inline void * +psf_memdup (const void *src, size_t n) +{ void * mem = calloc (1, n & 3 ? n + 4 - (n & 3) : n) ; + return memcpy (mem, src, n) ; +} /* psf_memdup */ + +/* +** This version of isprint specifically ignores any locale info. Its used for +** determining which characters can be printed in things like hexdumps. +*/ +static inline int +psf_isprint (int ch) +{ return (ch >= ' ' && ch <= '~') ; +} /* psf_isprint */ + +/*======================================================================================= +** SF_PRIVATE stuct - a pointer to this struct is passed back to the caller of the +** sf_open_XXXX functions. The caller however has no knowledge of the struct's +** contents. +*/ + +typedef struct +{ + union + { char c [SF_FILENAME_LEN] ; + sfwchar_t wc [SF_FILENAME_LEN] ; + } path ; + + union + { char c [SF_FILENAME_LEN] ; + sfwchar_t wc [SF_FILENAME_LEN] ; + } dir ; + + union + { char c [SF_FILENAME_LEN / 4] ; + sfwchar_t wc [SF_FILENAME_LEN / 4] ; + } name ; + +#if USE_WINDOWS_API + /* + ** These fields can only be used in src/file_io.c. + ** They are basically the same as a windows file HANDLE. + */ + void *handle, *hsaved ; + + int use_wchar ; +#else + /* These fields can only be used in src/file_io.c. */ + int filedes, savedes ; +#endif + + int do_not_close_descriptor ; + int mode ; /* Open mode : SFM_READ, SFM_WRITE or SFM_RDWR. */ +} PSF_FILE ; + + + +typedef union +{ double dbuf [SF_BUFFER_LEN / sizeof (double)] ; +#if (defined (SIZEOF_INT64_T) && (SIZEOF_INT64_T == 8)) + int64_t lbuf [SF_BUFFER_LEN / sizeof (int64_t)] ; +#else + long lbuf [SF_BUFFER_LEN / sizeof (double)] ; +#endif + float fbuf [SF_BUFFER_LEN / sizeof (float)] ; + int ibuf [SF_BUFFER_LEN / sizeof (int)] ; + short sbuf [SF_BUFFER_LEN / sizeof (short)] ; + char cbuf [SF_BUFFER_LEN / sizeof (char)] ; + signed char scbuf [SF_BUFFER_LEN / sizeof (signed char)] ; + unsigned char ucbuf [SF_BUFFER_LEN / sizeof (signed char)] ; +} BUF_UNION ; + + + +typedef struct sf_private_tag +{ + /* Canary in a coal mine. */ + union + { /* Place a double here to encourage double alignment. */ + double d [2] ; + char c [16] ; + } canary ; + + PSF_FILE file, rsrc ; + + char syserr [SF_SYSERR_LEN] ; + + /* parselog and indx should only be changed within the logging functions + ** of common.c + */ + struct + { char buf [SF_PARSELOG_LEN] ; + int indx ; + } parselog ; + + + struct + { unsigned char * ptr ; + sf_count_t indx, end, len ; + } header ; + + int rwf_endian ; /* Header endian-ness flag. */ + + /* Storage and housekeeping data for adding/reading strings from + ** sound files. + */ + struct + { STR_DATA data [SF_MAX_STRINGS] ; + char *storage ; + size_t storage_len ; + size_t storage_used ; + uint32_t flags ; + } strings ; + + /* Guard value. If this changes the buffers above have overflowed. */ + int Magick ; + + unsigned unique_id ; + + int error ; + + int endian ; /* File endianness : SF_ENDIAN_LITTLE or SF_ENDIAN_BIG. */ + int data_endswap ; /* Need to endswap data? */ + + /* + ** Maximum float value for calculating the multiplier for + ** float/double to short/int conversions. + */ + int float_int_mult ; + float float_max ; + + int scale_int_float ; + + /* Vairables for handling pipes. */ + int is_pipe ; /* True if file is a pipe. */ + sf_count_t pipeoffset ; /* Number of bytes read from a pipe. */ + + /* True if clipping must be performed on float->int conversions. */ + int add_clipping ; + + SF_INFO sf ; + + int have_written ; /* Has a single write been done to the file? */ + PEAK_INFO *peak_info ; + + /* Cue Marker Info */ + SF_CUES *cues ; + + /* Loop Info */ + SF_LOOP_INFO *loop_info ; + SF_INSTRUMENT *instrument ; + + /* Broadcast (EBU) Info */ + SF_BROADCAST_INFO_16K *broadcast_16k ; + + /* Cart (AES46) Info */ + SF_CART_INFO_16K *cart_16k ; + + /* Channel map data (if present) : an array of ints. */ + int *channel_map ; + + sf_count_t filelength ; /* Overall length of (embedded) file. */ + sf_count_t fileoffset ; /* Offset in number of bytes from beginning of file. */ + + sf_count_t rsrclength ; /* Length of the resource fork (if it exists). */ + + sf_count_t dataoffset ; /* Offset in number of bytes from beginning of file. */ + sf_count_t datalength ; /* Length in bytes of the audio data. */ + sf_count_t dataend ; /* Offset to file tailer. */ + + int blockwidth ; /* Size in bytes of one set of interleaved samples. */ + int bytewidth ; /* Size in bytes of one sample (one channel). */ + + void *dither ; + void *interleave ; + + int last_op ; /* Last operation; either SFM_READ or SFM_WRITE */ + sf_count_t read_current ; + sf_count_t write_current ; + + void *container_data ; /* This is a pointer to dynamically allocated file + ** container format specific data. + */ + + void *codec_data ; /* This is a pointer to dynamically allocated file + ** codec format specific data. + */ + + SF_DITHER_INFO write_dither ; + SF_DITHER_INFO read_dither ; + + int norm_double ; + int norm_float ; + + int auto_header ; + + int ieee_replace ; + + /* A set of file specific function pointers */ + sf_count_t (*read_short) (struct sf_private_tag*, short *ptr, sf_count_t len) ; + sf_count_t (*read_int) (struct sf_private_tag*, int *ptr, sf_count_t len) ; + sf_count_t (*read_float) (struct sf_private_tag*, float *ptr, sf_count_t len) ; + sf_count_t (*read_double) (struct sf_private_tag*, double *ptr, sf_count_t len) ; + + sf_count_t (*write_short) (struct sf_private_tag*, const short *ptr, sf_count_t len) ; + sf_count_t (*write_int) (struct sf_private_tag*, const int *ptr, sf_count_t len) ; + sf_count_t (*write_float) (struct sf_private_tag*, const float *ptr, sf_count_t len) ; + sf_count_t (*write_double) (struct sf_private_tag*, const double *ptr, sf_count_t len) ; + + sf_count_t (*seek) (struct sf_private_tag*, int mode, sf_count_t samples_from_start) ; + int (*write_header) (struct sf_private_tag*, int calc_length) ; + int (*command) (struct sf_private_tag*, int command, void *data, int datasize) ; + int (*byterate) (struct sf_private_tag*) ; + + /* + ** Separate close functions for the codec and the container. + ** The codec close function is always called first. + */ + int (*codec_close) (struct sf_private_tag*) ; + int (*container_close) (struct sf_private_tag*) ; + + char *format_desc ; + + /* Virtual I/O functions. */ + int virtual_io ; + SF_VIRTUAL_IO vio ; + void *vio_user_data ; + + /* Chunk get/set. */ + SF_CHUNK_ITERATOR *iterator ; + + READ_CHUNKS rchunks ; + WRITE_CHUNKS wchunks ; + + int (*set_chunk) (struct sf_private_tag*, const SF_CHUNK_INFO * chunk_info) ; + SF_CHUNK_ITERATOR * (*next_chunk_iterator) (struct sf_private_tag*, SF_CHUNK_ITERATOR * iterator) ; + int (*get_chunk_size) (struct sf_private_tag*, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ; + int (*get_chunk_data) (struct sf_private_tag*, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ; + + int cpu_flags ; +} SF_PRIVATE ; + + + +enum +{ SFE_NO_ERROR = SF_ERR_NO_ERROR, + SFE_BAD_OPEN_FORMAT = SF_ERR_UNRECOGNISED_FORMAT, + SFE_SYSTEM = SF_ERR_SYSTEM, + SFE_MALFORMED_FILE = SF_ERR_MALFORMED_FILE, + SFE_UNSUPPORTED_ENCODING = SF_ERR_UNSUPPORTED_ENCODING, + + SFE_ZERO_MAJOR_FORMAT, + SFE_ZERO_MINOR_FORMAT, + SFE_BAD_FILE, + SFE_BAD_FILE_READ, + SFE_OPEN_FAILED, + SFE_BAD_SNDFILE_PTR, + SFE_BAD_SF_INFO_PTR, + SFE_BAD_SF_INCOMPLETE, + SFE_BAD_FILE_PTR, + SFE_BAD_INT_PTR, + SFE_BAD_STAT_SIZE, + SFE_NO_TEMP_DIR, + SFE_MALLOC_FAILED, + SFE_UNIMPLEMENTED, + SFE_BAD_READ_ALIGN, + SFE_BAD_WRITE_ALIGN, + SFE_NOT_READMODE, + SFE_NOT_WRITEMODE, + SFE_BAD_MODE_RW, + SFE_BAD_SF_INFO, + SFE_BAD_OFFSET, + SFE_NO_EMBED_SUPPORT, + SFE_NO_EMBEDDED_RDWR, + SFE_NO_PIPE_WRITE, + + SFE_INTERNAL, + SFE_BAD_COMMAND_PARAM, + SFE_BAD_ENDIAN, + SFE_CHANNEL_COUNT_ZERO, + SFE_CHANNEL_COUNT, + SFE_CHANNEL_COUNT_BAD, + + SFE_BAD_VIRTUAL_IO, + + SFE_INTERLEAVE_MODE, + SFE_INTERLEAVE_SEEK, + SFE_INTERLEAVE_READ, + + SFE_BAD_SEEK, + SFE_NOT_SEEKABLE, + SFE_AMBIGUOUS_SEEK, + SFE_WRONG_SEEK, + SFE_SEEK_FAILED, + + SFE_BAD_OPEN_MODE, + SFE_OPEN_PIPE_RDWR, + SFE_RDWR_POSITION, + SFE_RDWR_BAD_HEADER, + SFE_CMD_HAS_DATA, + SFE_BAD_BROADCAST_INFO_SIZE, + SFE_BAD_BROADCAST_INFO_TOO_BIG, + SFE_BAD_CART_INFO_SIZE, + SFE_BAD_CART_INFO_TOO_BIG, + + SFE_STR_NO_SUPPORT, + SFE_STR_NOT_WRITE, + SFE_STR_MAX_DATA, + SFE_STR_MAX_COUNT, + SFE_STR_BAD_TYPE, + SFE_STR_NO_ADD_END, + SFE_STR_BAD_STRING, + SFE_STR_WEIRD, + + SFE_WAV_NO_RIFF, + SFE_WAV_NO_WAVE, + SFE_WAV_NO_FMT, + SFE_WAV_BAD_FMT, + SFE_WAV_FMT_SHORT, + SFE_WAV_BAD_FACT, + SFE_WAV_BAD_PEAK, + SFE_WAV_PEAK_B4_FMT, + SFE_WAV_BAD_FORMAT, + SFE_WAV_BAD_BLOCKALIGN, + SFE_WAV_NO_DATA, + SFE_WAV_BAD_LIST, + SFE_WAV_ADPCM_NOT4BIT, + SFE_WAV_ADPCM_CHANNELS, + SFE_WAV_ADPCM_SAMPLES, + SFE_WAV_GSM610_FORMAT, + SFE_WAV_UNKNOWN_CHUNK, + SFE_WAV_WVPK_DATA, + SFE_WAV_NMS_FORMAT, + + SFE_AIFF_NO_FORM, + SFE_AIFF_AIFF_NO_FORM, + SFE_AIFF_COMM_NO_FORM, + SFE_AIFF_SSND_NO_COMM, + SFE_AIFF_UNKNOWN_CHUNK, + SFE_AIFF_COMM_CHUNK_SIZE, + SFE_AIFF_BAD_COMM_CHUNK, + SFE_AIFF_PEAK_B4_COMM, + SFE_AIFF_BAD_PEAK, + SFE_AIFF_NO_SSND, + SFE_AIFF_NO_DATA, + SFE_AIFF_RW_SSND_NOT_LAST, + + SFE_AU_UNKNOWN_FORMAT, + SFE_AU_NO_DOTSND, + SFE_AU_EMBED_BAD_LEN, + + SFE_RAW_READ_BAD_SPEC, + SFE_RAW_BAD_BITWIDTH, + SFE_RAW_BAD_FORMAT, + + SFE_PAF_NO_MARKER, + SFE_PAF_VERSION, + SFE_PAF_UNKNOWN_FORMAT, + SFE_PAF_SHORT_HEADER, + SFE_PAF_BAD_CHANNELS, + + SFE_SVX_NO_FORM, + SFE_SVX_NO_BODY, + SFE_SVX_NO_DATA, + SFE_SVX_BAD_COMP, + SFE_SVX_BAD_NAME_LENGTH, + + SFE_NIST_BAD_HEADER, + SFE_NIST_CRLF_CONVERISON, + SFE_NIST_BAD_ENCODING, + + SFE_VOC_NO_CREATIVE, + SFE_VOC_BAD_FORMAT, + SFE_VOC_BAD_VERSION, + SFE_VOC_BAD_MARKER, + SFE_VOC_BAD_SECTIONS, + SFE_VOC_MULTI_SAMPLERATE, + SFE_VOC_MULTI_SECTION, + SFE_VOC_MULTI_PARAM, + SFE_VOC_SECTION_COUNT, + SFE_VOC_NO_PIPE, + + SFE_IRCAM_NO_MARKER, + SFE_IRCAM_BAD_CHANNELS, + SFE_IRCAM_UNKNOWN_FORMAT, + + SFE_W64_64_BIT, + SFE_W64_NO_RIFF, + SFE_W64_NO_WAVE, + SFE_W64_NO_DATA, + SFE_W64_ADPCM_NOT4BIT, + SFE_W64_ADPCM_CHANNELS, + SFE_W64_GSM610_FORMAT, + + SFE_MAT4_BAD_NAME, + SFE_MAT4_NO_SAMPLERATE, + + SFE_MAT5_BAD_ENDIAN, + SFE_MAT5_NO_BLOCK, + SFE_MAT5_SAMPLE_RATE, + + SFE_PVF_NO_PVF1, + SFE_PVF_BAD_HEADER, + SFE_PVF_BAD_BITWIDTH, + + SFE_DWVW_BAD_BITWIDTH, + SFE_G72X_NOT_MONO, + SFE_NMS_ADPCM_NOT_MONO, + + SFE_XI_BAD_HEADER, + SFE_XI_EXCESS_SAMPLES, + SFE_XI_NO_PIPE, + + SFE_HTK_NO_PIPE, + + SFE_SDS_NOT_SDS, + SFE_SDS_BAD_BIT_WIDTH, + + SFE_SD2_FD_DISALLOWED, + SFE_SD2_BAD_DATA_OFFSET, + SFE_SD2_BAD_MAP_OFFSET, + SFE_SD2_BAD_DATA_LENGTH, + SFE_SD2_BAD_MAP_LENGTH, + SFE_SD2_BAD_RSRC, + SFE_SD2_BAD_SAMPLE_SIZE, + + SFE_FLAC_BAD_HEADER, + SFE_FLAC_NEW_DECODER, + SFE_FLAC_INIT_DECODER, + SFE_FLAC_LOST_SYNC, + SFE_FLAC_BAD_SAMPLE_RATE, + SFE_FLAC_CHANNEL_COUNT_CHANGED, + SFE_FLAC_UNKOWN_ERROR, + + SFE_WVE_NOT_WVE, + SFE_WVE_NO_PIPE, + + SFE_VORBIS_ENCODER_BUG, + + SFE_RF64_NOT_RF64, + SFE_RF64_PEAK_B4_FMT, + SFE_RF64_NO_DATA, + + SFE_BAD_CHUNK_PTR, + SFE_UNKNOWN_CHUNK, + SFE_BAD_CHUNK_FORMAT, + SFE_BAD_CHUNK_MARKER, + SFE_BAD_CHUNK_DATA_PTR, + SFE_ALAC_FAIL_TMPFILE, + SFE_FILENAME_TOO_LONG, + SFE_NEGATIVE_RW_LEN, + + SFE_OPUS_BAD_SAMPLERATE, + + SFE_MAX_ERROR /* This must be last in list. */ +} ; + +/* Allocate and initialize the SF_PRIVATE struct. */ +SF_PRIVATE * psf_allocate (void) ; + +int subformat_to_bytewidth (int format) ; +int s_bitwidth_to_subformat (int bits) ; +int u_bitwidth_to_subformat (int bits) ; + +/* Functions for reading and writing floats and doubles on processors +** with non-IEEE floats/doubles. +*/ +float float32_be_read (const unsigned char *cptr) ; +float float32_le_read (const unsigned char *cptr) ; +void float32_be_write (float in, unsigned char *out) ; +void float32_le_write (float in, unsigned char *out) ; + +double double64_be_read (const unsigned char *cptr) ; +double double64_le_read (const unsigned char *cptr) ; +void double64_be_write (double in, unsigned char *out) ; +void double64_le_write (double in, unsigned char *out) ; + +/* Functions for writing to the internal logging buffer. */ + +void psf_log_printf (SF_PRIVATE *psf, const char *format, ...) ; +void psf_log_SF_INFO (SF_PRIVATE *psf) ; + +int32_t psf_rand_int32 (void) ; + +void append_snprintf (char * dest, size_t maxlen, const char * fmt, ...) ; +void psf_strlcpy_crlf (char *dest, const char *src, size_t destmax, size_t srcmax) ; + +sf_count_t psf_decode_frame_count (SF_PRIVATE *psf) ; + +/* Functions used when writing file headers. */ + +int psf_binheader_writef (SF_PRIVATE *psf, const char *format, ...) ; +void psf_asciiheader_printf (SF_PRIVATE *psf, const char *format, ...) ; + +/* Functions used when reading file headers. */ + +int psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...) ; + +/* Functions used in the write function for updating the peak chunk. */ + +void peak_update_short (SF_PRIVATE *psf, short *ptr, size_t items) ; +void peak_update_int (SF_PRIVATE *psf, int *ptr, size_t items) ; +void peak_update_double (SF_PRIVATE *psf, double *ptr, size_t items) ; + +/* Functions defined in command.c. */ + +int psf_get_format_simple_count (void) ; +int psf_get_format_simple (SF_FORMAT_INFO *data) ; + +int psf_get_format_info (SF_FORMAT_INFO *data) ; + +int psf_get_format_major_count (void) ; +int psf_get_format_major (SF_FORMAT_INFO *data) ; + +int psf_get_format_subtype_count (void) ; +int psf_get_format_subtype (SF_FORMAT_INFO *data) ; + +void psf_generate_format_desc (SF_PRIVATE *psf) ; + +double psf_calc_signal_max (SF_PRIVATE *psf, int normalize) ; +int psf_calc_max_all_channels (SF_PRIVATE *psf, double *peaks, int normalize) ; + +int psf_get_signal_max (SF_PRIVATE *psf, double *peak) ; +int psf_get_max_all_channels (SF_PRIVATE *psf, double *peaks) ; + +/* Functions in strings.c. */ + +const char* psf_get_string (SF_PRIVATE *psf, int str_type) ; +int psf_set_string (SF_PRIVATE *psf, int str_type, const char *str) ; +int psf_store_string (SF_PRIVATE *psf, int str_type, const char *str) ; +int psf_location_string_count (const SF_PRIVATE * psf, int location) ; + +/* Default seek function. Use for PCM and float encoded data. */ +sf_count_t psf_default_seek (SF_PRIVATE *psf, int mode, sf_count_t samples_from_start) ; + +int macos_guess_file_type (SF_PRIVATE *psf, const char *filename) ; + +/*------------------------------------------------------------------------------------ +** File I/O functions which will allow access to large files (> 2 Gig) on +** some 32 bit OSes. Implementation in file_io.c. +*/ + +int psf_fopen (SF_PRIVATE *psf) ; +int psf_set_stdio (SF_PRIVATE *psf) ; +int psf_file_valid (SF_PRIVATE *psf) ; +void psf_set_file (SF_PRIVATE *psf, int fd) ; +void psf_init_files (SF_PRIVATE *psf) ; +void psf_use_rsrc (SF_PRIVATE *psf, int on_off) ; + +SNDFILE * psf_open_file (SF_PRIVATE *psf, SF_INFO *sfinfo) ; + +sf_count_t psf_fseek (SF_PRIVATE *psf, sf_count_t offset, int whence) ; +sf_count_t psf_fread (void *ptr, sf_count_t bytes, sf_count_t count, SF_PRIVATE *psf) ; +sf_count_t psf_fwrite (const void *ptr, sf_count_t bytes, sf_count_t count, SF_PRIVATE *psf) ; +sf_count_t psf_fgets (char *buffer, sf_count_t bufsize, SF_PRIVATE *psf) ; +sf_count_t psf_ftell (SF_PRIVATE *psf) ; +sf_count_t psf_get_filelen (SF_PRIVATE *psf) ; + +void psf_fsync (SF_PRIVATE *psf) ; + +int psf_is_pipe (SF_PRIVATE *psf) ; + +int psf_ftruncate (SF_PRIVATE *psf, sf_count_t len) ; +int psf_fclose (SF_PRIVATE *psf) ; + +/* Open and close the resource fork of a file. */ +int psf_open_rsrc (SF_PRIVATE *psf) ; +int psf_close_rsrc (SF_PRIVATE *psf) ; + +/* +void psf_fclearerr (SF_PRIVATE *psf) ; +int psf_ferror (SF_PRIVATE *psf) ; +*/ + +/*------------------------------------------------------------------------------------ +** Functions for reading and writing different file formats. +*/ + +int aiff_open (SF_PRIVATE *psf) ; +int au_open (SF_PRIVATE *psf) ; +int avr_open (SF_PRIVATE *psf) ; +int htk_open (SF_PRIVATE *psf) ; +int ircam_open (SF_PRIVATE *psf) ; +int mat4_open (SF_PRIVATE *psf) ; +int mat5_open (SF_PRIVATE *psf) ; +int nist_open (SF_PRIVATE *psf) ; +int paf_open (SF_PRIVATE *psf) ; +int pvf_open (SF_PRIVATE *psf) ; +int raw_open (SF_PRIVATE *psf) ; +int sd2_open (SF_PRIVATE *psf) ; +int sds_open (SF_PRIVATE *psf) ; +int svx_open (SF_PRIVATE *psf) ; +int voc_open (SF_PRIVATE *psf) ; +int w64_open (SF_PRIVATE *psf) ; +int wav_open (SF_PRIVATE *psf) ; +int xi_open (SF_PRIVATE *psf) ; +int flac_open (SF_PRIVATE *psf) ; +int caf_open (SF_PRIVATE *psf) ; +int mpc2k_open (SF_PRIVATE *psf) ; +int rf64_open (SF_PRIVATE *psf) ; + +int ogg_vorbis_open (SF_PRIVATE *psf) ; +int ogg_speex_open (SF_PRIVATE *psf) ; +int ogg_pcm_open (SF_PRIVATE *psf) ; +int ogg_opus_open (SF_PRIVATE *psf) ; +int ogg_open (SF_PRIVATE *psf) ; + + +/* In progress. Do not currently work. */ + +int mpeg_open (SF_PRIVATE *psf) ; +int rx2_open (SF_PRIVATE *psf) ; +int txw_open (SF_PRIVATE *psf) ; +int wve_open (SF_PRIVATE *psf) ; +int dwd_open (SF_PRIVATE *psf) ; + +/*------------------------------------------------------------------------------------ +** Init functions for a number of common data encodings. +*/ + +int pcm_init (SF_PRIVATE *psf) ; +int ulaw_init (SF_PRIVATE *psf) ; +int alaw_init (SF_PRIVATE *psf) ; +int float32_init (SF_PRIVATE *psf) ; +int double64_init (SF_PRIVATE *psf) ; +int dwvw_init (SF_PRIVATE *psf, int bitwidth) ; +int gsm610_init (SF_PRIVATE *psf) ; +int nms_adpcm_init (SF_PRIVATE *psf) ; +int vox_adpcm_init (SF_PRIVATE *psf) ; +int flac_init (SF_PRIVATE *psf) ; +int g72x_init (SF_PRIVATE * psf) ; +int alac_init (SF_PRIVATE *psf, const ALAC_DECODER_INFO * info) ; + +int dither_init (SF_PRIVATE *psf, int mode) ; + +int wavlike_ima_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ; +int wavlike_msadpcm_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ; + +int aiff_ima_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ; + +int interleave_init (SF_PRIVATE *psf) ; + +/*------------------------------------------------------------------------------------ +** Chunk logging functions. +*/ + +SF_CHUNK_ITERATOR * psf_get_chunk_iterator (SF_PRIVATE * psf, const char * marker_str) ; +SF_CHUNK_ITERATOR * psf_next_chunk_iterator (const READ_CHUNKS * pchk , SF_CHUNK_ITERATOR *iterator) ; +int psf_store_read_chunk_u32 (READ_CHUNKS * pchk, uint32_t marker, sf_count_t offset, uint32_t len) ; +int psf_store_read_chunk_str (READ_CHUNKS * pchk, const char * marker, sf_count_t offset, uint32_t len) ; +int psf_save_write_chunk (WRITE_CHUNKS * pchk, const SF_CHUNK_INFO * chunk_info) ; +int psf_find_read_chunk_str (const READ_CHUNKS * pchk, const char * marker) ; +int psf_find_read_chunk_m32 (const READ_CHUNKS * pchk, uint32_t marker) ; +int psf_find_read_chunk_iterator (const READ_CHUNKS * pchk, const SF_CHUNK_ITERATOR * marker) ; + +int psf_find_write_chunk (WRITE_CHUNKS * pchk, const char * marker) ; + +static inline int +fourcc_to_marker (const SF_CHUNK_INFO * chunk_info) +{ const unsigned char * cptr ; + + if (chunk_info->id_size != 4) + return 0 ; + + cptr = (const unsigned char *) chunk_info->id ; + return (cptr [3] << 24) + (cptr [2] << 16) + (cptr [1] << 8) + cptr [0] ; +} /* fourcc_to_marker */ + +/*------------------------------------------------------------------------------------ +** Functions that work like OpenBSD's strlcpy/strlcat to replace strncpy/strncat. +** +** See : http://www.gratisoft.us/todd/papers/strlcpy.html +** +** These functions are available on *BSD, but are not avaialble everywhere so we +** implement them here. +** +** The argument order has been changed to that of strncpy/strncat to cause +** compiler errors if code is carelessly converted from one to the other. +*/ + +static inline void +psf_strlcat (char *dest, size_t n, const char *src) +{ strncat (dest, src, n - strlen (dest) - 1) ; + dest [n - 1] = 0 ; +} /* psf_strlcat */ + +static inline void +psf_strlcpy (char *dest, size_t n, const char *src) +{ strncpy (dest, src, n - 1) ; + dest [n - 1] = 0 ; +} /* psf_strlcpy */ + +/*------------------------------------------------------------------------------------ +** SIMD optimized math functions. +*/ + +static inline int psf_lrintf (float x) +{ + #ifdef USE_SSE2 + return _mm_cvtss_si32 (_mm_load_ss (&x)) ; + #else + return lrintf (x) ; + #endif +} /* psf_lrintf */ + +static inline int psf_lrint (double x) +{ + #ifdef USE_SSE2 + return _mm_cvtsd_si32 (_mm_load_sd (&x)) ; + #else + return lrint (x) ; + #endif +} /* psf_lrintf */ + +/*------------------------------------------------------------------------------------ +** Other helper functions. +*/ + +void *psf_memset (void *s, int c, sf_count_t n) ; + +SF_CUES * psf_cues_dup (const void * ptr, size_t datasize) ; +SF_CUES * psf_cues_alloc (uint32_t cue_count) ; +void psf_get_cues (SF_PRIVATE * psf, void * data, size_t datasize) ; + +SF_INSTRUMENT * psf_instrument_alloc (void) ; + +void psf_sanitize_string (char * cptr, int len) ; + +/* Generate the current date as a string. */ +void psf_get_date_str (char *str, int maxlen) ; + +SF_BROADCAST_INFO_16K * broadcast_var_alloc (void) ; +int broadcast_var_set (SF_PRIVATE *psf, const SF_BROADCAST_INFO * data, size_t datasize) ; +int broadcast_var_get (SF_PRIVATE *psf, SF_BROADCAST_INFO * data, size_t datasize) ; + + +SF_CART_INFO_16K * cart_var_alloc (void) ; +int cart_var_set (SF_PRIVATE *psf, const SF_CART_INFO * date, size_t datasize) ; +int cart_var_get (SF_PRIVATE *psf, SF_CART_INFO * data, size_t datasize) ; + +typedef struct +{ int channels ; + int endianness ; +} AUDIO_DETECT ; + +int audio_detect (SF_PRIVATE * psf, AUDIO_DETECT *ad, const unsigned char * data, int datalen) ; +int id3_skip (SF_PRIVATE * psf) ; + +void alac_get_desc_chunk_items (int subformat, uint32_t *fmt_flags, uint32_t *frames_per_packet) ; + +FILE * psf_open_tmpfile (char * fname, size_t fnamelen) ; + +/*------------------------------------------------------------------------------------ +** Helper/debug functions. +*/ + +void psf_hexdump (const void *ptr, int len) ; + +const char * str_of_major_format (int format) ; +const char * str_of_minor_format (int format) ; +const char * str_of_open_mode (int mode) ; +const char * str_of_endianness (int end) ; + +/*------------------------------------------------------------------------------------ +** Extra commands for sf_command(). Not for public use yet. +*/ + +enum +{ SFC_TEST_AIFF_ADD_INST_CHUNK = 0x2000, + SFC_TEST_WAV_ADD_INFO_CHUNK = 0x2010 +} ; + +/* +** Maybe, one day, make these functions or something like them, public. +** +** Buffer to buffer dithering. Pointer in and out are allowed to point +** to the same buffer for in-place dithering. +*/ + +#if 0 +int sf_dither_short (const SF_DITHER_INFO *dither, const short *in, short *out, int count) ; +int sf_dither_int (const SF_DITHER_INFO *dither, const int *in, int *out, int count) ; +int sf_dither_float (const SF_DITHER_INFO *dither, const float *in, float *out, int count) ; +int sf_dither_double (const SF_DITHER_INFO *dither, const double *in, double *out, int count) ; +#endif + +/*------------------------------------------------------------------------------------ +** Data conversion functions. +*/ + +void psf_f2s_array (const float *src, short *dest, int count, int normalize) ; +void psf_f2s_clip_array (const float *src, short *dest, int count, int normalize) ; + +void psf_d2s_array (const double *src, short *dest, int count, int normalize) ; +void psf_d2s_clip_array (const double *src, short *dest, int count, int normalize) ; + +void psf_f2i_array (const float *src, int *dest, int count, int normalize) ; +void psf_f2i_clip_array (const float *src, int *dest, int count, int normalize) ; + +void psf_d2i_array (const double *src, int *dest, int count, int normalize) ; +void psf_d2i_clip_array (const double *src, int *dest, int count, int normalize) ; + + +/*------------------------------------------------------------------------------------ +** Left and right shift on int. According to the C standard, the left and right +** shift operations applied to a negative integer results in undefined behavior. +** These twp functions work around that. +*/ + +#if __GNUC__ +#define ALWAYS_INLINE __attribute__ ((always_inline)) +#else +#define ALWAYS_INLINE +#endif + +static inline int32_t ALWAYS_INLINE +arith_shift_left (int32_t x, int shift) +{ return (int32_t) (((uint32_t) x) << shift) ; +} /* arith_shift_left */ + +static inline int32_t ALWAYS_INLINE +arith_shift_right (int32_t x, int shift) +{ if (x >= 0) + return x >> shift ; + return ~ ((~x) >> shift) ; +} /* arith_shift_right */ + +#endif /* SNDFILE_COMMON_H */ diff --git a/libsndfile-1.0.31/src/config.h.cmake b/libsndfile-1.0.31/src/config.h.cmake new file mode 100644 index 0000000..c33bcbc --- /dev/null +++ b/libsndfile-1.0.31/src/config.h.cmake @@ -0,0 +1,314 @@ +/* Set to 1 if the compile is GNU GCC. */ +#cmakedefine01 COMPILER_IS_GCC + +/* Target processor clips on negative float to int conversion. */ +#cmakedefine01 CPU_CLIPS_NEGATIVE + +/* Target processor clips on positive float to int conversion. */ +#cmakedefine01 CPU_CLIPS_POSITIVE + +/* Target processor is big endian. */ +#cmakedefine01 CPU_IS_BIG_ENDIAN + +/* Target processor is little endian. */ +#cmakedefine01 CPU_IS_LITTLE_ENDIAN + +/* Set to 1 to enable experimental code. */ +#cmakedefine01 ENABLE_EXPERIMENTAL_CODE + +/* Define to 1 if you have the header file. */ +#cmakedefine01 HAVE_ALSA_ASOUNDLIB_H + +/* Define to 1 if you have the header file. */ +#cmakedefine01 HAVE_BYTESWAP_H + +/* Define to 1 if you have the `calloc' function. */ +#cmakedefine01 HAVE_CALLOC + +/* Define to 1 if you have the `ceil' function. */ +#cmakedefine01 HAVE_CEIL + +/* Set to 1 if S_IRGRP is defined. */ +#cmakedefine01 HAVE_DECL_S_IRGRP + +/* Define to 1 if you have the header file. */ +#cmakedefine01 HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_DIRECT_H + +/* Define to 1 if you have the header file. */ +#cmakedefine01 HAVE_ENDIAN_H + +/* Will be set to 1 if flac, ogg and vorbis are available. */ +#cmakedefine01 HAVE_EXTERNAL_XIPH_LIBS + +/* Define to 1 if you have the `floor' function. */ +#cmakedefine01 HAVE_FLOOR + +/* Define to 1 if you have the `fmod' function. */ +#cmakedefine01 HAVE_FMOD + +/* Define to 1 if you have the `free' function. */ +#cmakedefine01 HAVE_FREE + +/* Define to 1 if you have the `fstat' function. */ +#cmakedefine01 HAVE_FSTAT + +/* Define to 1 if you have the `fstat64' function. */ +#cmakedefine01 HAVE_FSTAT64 + +/* Define to 1 if you have the `fsync' function. */ +#cmakedefine01 HAVE_FSYNC + +/* Define to 1 if you have the `ftruncate' function. */ +#cmakedefine01 HAVE_FTRUNCATE + +/* Define to 1 if you have the `getpagesize' function. */ +#cmakedefine01 HAVE_GETPAGESIZE + +/* Define to 1 if you have the `gettimeofday' function. */ +#cmakedefine01 HAVE_GETTIMEOFDAY + +/* Define if you have the `gmtime' function. */ +#cmakedefine HAVE_GMTIME + +/* Define if you have the `gmtime_r' function. */ +#cmakedefine HAVE_GMTIME_R + +/* Define to 1 if you have the header file. */ +#cmakedefine01 HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_IO_H + +/* Define to 1 if you have the `m' library (-lm). */ +#cmakedefine01 HAVE_LIBM + +/* Define to 1 if you have the header file. */ +#cmakedefine01 HAVE_LOCALE_H + +/* Define if you have the `localtime' function. */ +#cmakedefine HAVE_LOCALTIME + +/* Define if you have the `localtime_r' function. */ +#cmakedefine HAVE_LOCALTIME_R + +/* Define if you have C99's lrint function. */ +#cmakedefine01 HAVE_LRINT + +/* Define if you have C99's lrintf function. */ +#cmakedefine01 HAVE_LRINTF + +/* Define to 1 if you have the `lround' function. */ +#cmakedefine01 HAVE_LROUND + +/* Define to 1 if you have the `lseek' function. */ +#cmakedefine01 HAVE_LSEEK + +/* Define to 1 if you have the `lseek64' function. */ +#cmakedefine01 HAVE_LSEEK64 + +/* Define to 1 if you have the `malloc' function. */ +#cmakedefine01 HAVE_MALLOC + +/* Define to 1 if you have the header file. */ +#cmakedefine01 HAVE_MEMORY_H + +/* Define to 1 if you have the `mmap' function. */ +#cmakedefine01 HAVE_MMAP + +/* Define to 1 if you have the `open' function. */ +#cmakedefine01 HAVE_OPEN + +/* Define to 1 if you have the `pipe' function. */ +#cmakedefine01 HAVE_PIPE + +/* Define to 1 if you have the `read' function. */ +#cmakedefine01 HAVE_READ + +/* Define to 1 if you have the `realloc' function. */ +#cmakedefine01 HAVE_REALLOC + +/* Define to 1 if you have the `setlocale' function. */ +#cmakedefine01 HAVE_SETLOCALE + +/* Set to 1 if is available. */ +#cmakedefine01 HAVE_SNDIO_H + +/* Define to 1 if you have the `snprintf' function. */ +#cmakedefine01 HAVE_SNPRINTF + +/* Set to 1 if you have libsqlite3. */ +#cmakedefine01 HAVE_SQLITE3 + +/* Define to 1 if the system has the type `ssize_t'. */ +#cmakedefine01 HAVE_SSIZE_T + +/* Define to 1 if you have the header file. */ +#cmakedefine01 HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#cmakedefine01 HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#cmakedefine01 HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#cmakedefine01 HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#cmakedefine01 HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#cmakedefine01 HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#cmakedefine01 HAVE_SYS_TYPES_H + +/* Define to 1 if you have that is POSIX.1 compatible. */ +#cmakedefine01 HAVE_SYS_WAIT_H + +/* Define to 1 if you have the header file. */ +#cmakedefine01 HAVE_UNISTD_H + +/* Define to 1 if you have the header file. */ +#cmakedefine01 HAVE_IMMINTRIN_H + +/* Define to 1 if you have the `vsnprintf' function. */ +#cmakedefine01 HAVE_VSNPRINTF + +/* Define to 1 if you have the `waitpid' function. */ +#cmakedefine01 HAVE_WAITPID + +/* Define to 1 if you have the `write' function. */ +#cmakedefine01 HAVE_WRITE + +/* The darwin version, no-zero is valid */ +#cmakedefine01 OSX_DARWIN_VERSION + +/* Set to 1 if compiling for OpenBSD */ +#cmakedefine01 OS_IS_OPENBSD + +/* Set to 1 if compiling for Win32 */ +#cmakedefine01 OS_IS_WIN32 + +/* Set to 1 if SSE2 is enabled */ +#cmakedefine USE_SSE2 + +/* Name of package */ +#define PACKAGE "@PACKAGE_NAME@" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "@PACKAGE_BUGREPORT@" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "@PACKAGE_NAME@" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "@PACKAGE_NAME@ @CPACK_PACKAGE_VERSION_FULL@" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "@PACKAGE_NAME@" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "@PACKAGE_URL@" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "@CPACK_PACKAGE_VERSION_FULL@" + +/* Set to maximum allowed value of sf_count_t type. */ +#define SF_COUNT_MAX @SF_COUNT_MAX@ + +/* The size of `double', as computed by sizeof. */ +@SIZEOF_DOUBLE_CODE@ + +/* The size of `float', as computed by sizeof. */ +@SIZEOF_FLOAT_CODE@ + +/* The size of `int', as computed by sizeof. */ +@SIZEOF_INT_CODE@ + +/* The size of `int64_t', as computed by sizeof. */ +@SIZEOF_INT64_T_CODE@ + +/* The size of `loff_t', as computed by sizeof. */ +@SIZEOF_LOFF_T_CODE@ + +/* The size of `long', as computed by sizeof. */ +@SIZEOF_LONG_CODE@ + +/* The size of `long long', as computed by sizeof. */ +@SIZEOF_LONG_LONG_CODE@ + +/* The size of `off64_t', as computed by sizeof. */ +@SIZEOF_OFF64_T_CODE@ + +/* The size of `off_t', as computed by sizeof. */ +@SIZEOF_OFF_T_CODE@ + +/* Set to sizeof (long) if unknown. */ +@SIZEOF_SF_COUNT_T_CODE@ + +/* The size of `short', as computed by sizeof. */ +@SIZEOF_SHORT_CODE@ + +/* The size of `size_t', as computed by sizeof. */ +@SIZEOF_SIZE_T_CODE@ + +/* The size of `ssize_t', as computed by sizeof. */ +@SIZEOF_SSIZE_T_CODE@ + +/* The size of `void*', as computed by sizeof. */ +@SIZEOF_VOIDP_CODE@ + +/* The size of `wchar_t', as computed by sizeof. */ +@SIZEOF_WCHAR_T_CODE@ + +/* Set to long if unknown. */ +#define TYPEOF_SF_COUNT_T @TYPEOF_SF_COUNT_T@ + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif + + +/* Set to 1 to use the native windows API */ +#cmakedefine01 USE_WINDOWS_API + +/* Version number of package */ +#define VERSION "@PROJECT_VERSION@" + +/* Set to 1 if windows DLL is being built. */ +#cmakedefine01 WIN32_TARGET_DLL + +/* Target processor is big endian. */ +#cmakedefine01 WORDS_BIGENDIAN + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Define to 1 if on MINIX. */ +#cmakedefine01 _MINIX + +/* Define as `__inline' or '__inline__' if that's what the C compiler calls it, or to nothing if it is not supported. */ +@INLINE_CODE@ diff --git a/libsndfile-1.0.31/src/config.h.in b/libsndfile-1.0.31/src/config.h.in new file mode 100644 index 0000000..8cb1a1f --- /dev/null +++ b/libsndfile-1.0.31/src/config.h.in @@ -0,0 +1,326 @@ +/* src/config.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* Set to 1 if the compile is GNU GCC. */ +#undef COMPILER_IS_GCC + +/* Host processor clips on negative float to int conversion. */ +#undef CPU_CLIPS_NEGATIVE + +/* Host processor clips on positive float to int conversion. */ +#undef CPU_CLIPS_POSITIVE + +/* Host processor is big endian. */ +#undef CPU_IS_BIG_ENDIAN + +/* Host processor is little endian. */ +#undef CPU_IS_LITTLE_ENDIAN + +/* Set to 1 to enable experimental code. */ +#undef ENABLE_EXPERIMENTAL_CODE + +/* Set to 1 if you have alsa */ +#undef HAVE_ALSA + +/* Define to 1 if you have the header file. */ +#undef HAVE_ALSA_ASOUNDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_BYTESWAP_H + +/* Define to 1 if you have the `calloc' function. */ +#undef HAVE_CALLOC + +/* Define to 1 if you have the `ceil' function. */ +#undef HAVE_CEIL + +/* Set to 0 if S_IRGRP is not defined. */ +#undef HAVE_DECL_S_IRGRP + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ENDIAN_H + +/* Will be set to 1 if flac, ogg, vorbis, and opus are available. */ +#undef HAVE_EXTERNAL_XIPH_LIBS + +/* Define to 1 if you have the `floor' function. */ +#undef HAVE_FLOOR + +/* Define to 1 if you have the `fmod' function. */ +#undef HAVE_FMOD + +/* Define to 1 if you have the `free' function. */ +#undef HAVE_FREE + +/* Define to 1 if you have the `fstat' function. */ +#undef HAVE_FSTAT + +/* Define to 1 if you have the `fstat64' function. */ +#undef HAVE_FSTAT64 + +/* Define to 1 if you have the `fsync' function. */ +#undef HAVE_FSYNC + +/* Define to 1 if you have the `ftruncate' function. */ +#undef HAVE_FTRUNCATE + +/* Define to 1 if you have the `getpagesize' function. */ +#undef HAVE_GETPAGESIZE + +/* Define to 1 if you have the `gettimeofday' function. */ +#undef HAVE_GETTIMEOFDAY + +/* Define to 1 if you have the `gmtime' function. */ +#undef HAVE_GMTIME + +/* Define to 1 if you have the `gmtime_r' function. */ +#undef HAVE_GMTIME_R + +/* Define to 1 if you have the header file. */ +#undef HAVE_IMMINTRIN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define to 1 if you have the `localtime' function. */ +#undef HAVE_LOCALTIME + +/* Define to 1 if you have the `localtime_r' function. */ +#undef HAVE_LOCALTIME_R + +/* Define to 1 if you have the `lrint' function. */ +#undef HAVE_LRINT + +/* Define to 1 if you have the `lrintf' function. */ +#undef HAVE_LRINTF + +/* Define to 1 if you have the `lseek' function. */ +#undef HAVE_LSEEK + +/* Define to 1 if you have the `lseek64' function. */ +#undef HAVE_LSEEK64 + +/* Define to 1 if you have the `malloc' function. */ +#undef HAVE_MALLOC + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `mmap' function. */ +#undef HAVE_MMAP + +/* Define to 1 if you have the `open' function. */ +#undef HAVE_OPEN + +/* Define to 1 if you have the `pipe' function. */ +#undef HAVE_PIPE + +/* Define to 1 if you have the `read' function. */ +#undef HAVE_READ + +/* Define to 1 if you have the `realloc' function. */ +#undef HAVE_REALLOC + +/* Define to 1 if you have the `setlocale' function. */ +#undef HAVE_SETLOCALE + +/* Set to 1 if is available. */ +#undef HAVE_SNDIO_H + +/* Define to 1 if you have the `snprintf' function. */ +#undef HAVE_SNPRINTF + +/* Set to 1 if you have libsqlite3. */ +#undef HAVE_SQLITE3 + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have that is POSIX.1 compatible. */ +#undef HAVE_SYS_WAIT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the `vsnprintf' function. */ +#undef HAVE_VSNPRINTF + +/* Define to 1 if you have the `waitpid' function. */ +#undef HAVE_WAITPID + +/* Define to 1 if you have the `write' function. */ +#undef HAVE_WRITE + +/* The host triplet of the compiled binary. */ +#undef HOST_TRIPLET + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#undef LT_OBJDIR + +/* Set to 1 if compiling for OpenBSD */ +#undef OS_IS_OPENBSD + +/* Set to 1 if compiling for Win32 */ +#undef OS_IS_WIN32 + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Set to maximum allowed value of sf_count_t type. */ +#undef SF_COUNT_MAX + +/* The size of `double', as computed by sizeof. */ +#undef SIZEOF_DOUBLE + +/* The size of `float', as computed by sizeof. */ +#undef SIZEOF_FLOAT + +/* The size of `int', as computed by sizeof. */ +#undef SIZEOF_INT + +/* The size of `int64_t', as computed by sizeof. */ +#undef SIZEOF_INT64_T + +/* The size of `long', as computed by sizeof. */ +#undef SIZEOF_LONG + +/* The size of `long long', as computed by sizeof. */ +#undef SIZEOF_LONG_LONG + +/* The size of `off_t', as computed by sizeof. */ +#undef SIZEOF_OFF_T + +/* Set to sizeof (long) if unknown. */ +#undef SIZEOF_SF_COUNT_T + +/* The size of `short', as computed by sizeof. */ +#undef SIZEOF_SHORT + +/* The size of `size_t', as computed by sizeof. */ +#undef SIZEOF_SIZE_T + +/* The size of `void*', as computed by sizeof. */ +#undef SIZEOF_VOIDP + +/* The size of `wchar_t', as computed by sizeof. */ +#undef SIZEOF_WCHAR_T + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Set to long if unknown. */ +#undef TYPEOF_SF_COUNT_T + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif + + +/* Set to 1 to use the native windows API */ +#undef USE_WINDOWS_API + +/* Version number of package */ +#undef VERSION + +/* Set to 1 if windows DLL is being built. */ +#undef WIN32_TARGET_DLL + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +#undef _FILE_OFFSET_BITS + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES + +/* Define to 1 if on MINIX. */ +#undef _MINIX + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +#undef _POSIX_1_SOURCE + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +#undef _POSIX_SOURCE + +/* Set to 1 to use C99 printf/snprintf in MinGW. */ +#undef __USE_MINGW_ANSI_STDIO + +/* Define to `int' if does not define. */ +#undef ssize_t diff --git a/libsndfile-1.0.31/src/create_symbols_file.py b/libsndfile-1.0.31/src/create_symbols_file.py new file mode 100644 index 0000000..8271746 --- /dev/null +++ b/libsndfile-1.0.31/src/create_symbols_file.py @@ -0,0 +1,181 @@ +#!/usr/bin/python + +# Copyright (C) 2003-2017 Erik de Castro Lopo +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the author nor the names of any contributors may be used +# to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import re, sys + +#---------------------------------------------------------------- +# These are all of the public functions exported from libsndfile. +# +# Its important not to change the order they are listed in or +# the ordinal values in the second column. + +ALL_SYMBOLS = ( + ( "sf_command", 1 ), + ( "sf_open", 2 ), + ( "sf_close", 3 ), + ( "sf_seek", 4 ), + ( "sf_error", 7 ), + ( "sf_perror", 8 ), + ( "sf_error_str", 9 ), + ( "sf_error_number", 10 ), + ( "sf_format_check", 11 ), + ( "sf_read_raw", 16 ), + ( "sf_readf_short", 17 ), + ( "sf_readf_int", 18 ), + ( "sf_readf_float", 19 ), + ( "sf_readf_double", 20 ), + ( "sf_read_short", 21 ), + ( "sf_read_int", 22 ), + ( "sf_read_float", 23 ), + ( "sf_read_double", 24 ), + ( "sf_write_raw", 32 ), + ( "sf_writef_short", 33 ), + ( "sf_writef_int", 34 ), + ( "sf_writef_float", 35 ), + ( "sf_writef_double", 36 ), + ( "sf_write_short", 37 ), + ( "sf_write_int", 38 ), + ( "sf_write_float", 39 ), + ( "sf_write_double", 40 ), + ( "sf_strerror", 50 ), + ( "sf_get_string", 60 ), + ( "sf_set_string", 61 ), + ( "sf_version_string", 68 ), + ( "sf_open_fd", 70 ), + ( "sf_wchar_open", 71 ), + ( "sf_open_virtual", 80 ), + ( "sf_write_sync", 90 ), + ( "sf_set_chunk", 100 ), + ( "sf_get_chunk_size", 101 ), + ( "sf_get_chunk_data", 102 ), + ( "sf_get_chunk_iterator", 103 ), + ( "sf_next_chunk_iterator", 104 ), + ( "sf_current_byterate", 110 ) + ) + +#------------------------------------------------------------------------------- + +def linux_symbols (progname, version): + print ("# Auto-generated by %s\n" %progname) + print ("libsndfile.so.%s" % version) + print ("{") + print (" global:") + for name, ordinal in ALL_SYMBOLS: + if name == "sf_wchar_open": + continue + print (" %s ;" % name) + print (" local:") + print (" * ;") + print ("} ;") + sys.stdout.write ("\n") + return + +def darwin_symbols (progname, version): + print ("# Auto-generated by %s\n" %progname) + for name, ordinal in ALL_SYMBOLS: + if name == "sf_wchar_open": + continue + print ("_%s" % name) + sys.stdout.write ("\n") + return + +def win32_symbols (progname, version, name): + print ("; Auto-generated by %s\n" %progname) + print ("EXPORTS\n") + for name, ordinal in ALL_SYMBOLS: + print ("%-20s @%s" % (name, ordinal)) + sys.stdout.write ("\n") + return + +def os2_symbols (progname, version, name): + print ("; Auto-generated by %s\n" %progname) + print ("LIBRARY %s%s" % (name, re.sub ("\..*", "", version))) + print ("INITINSTANCE TERMINSTANCE") + print ("CODE PRELOAD MOVEABLE DISCARDABLE") + print ("DATA PRELOAD MOVEABLE MULTIPLE NONSHARED") + print ("EXPORTS\n") + for name, ordinal in ALL_SYMBOLS: + if name == "sf_wchar_open": + continue + print ("_%-20s @%s" % (name, ordinal)) + sys.stdout.write ("\n") + return + +def plain_symbols (progname, version, name): + for name, ordinal in ALL_SYMBOLS: + print (name) + +def no_symbols (os_name): + sys.stdout.write ("\n") + print ("No known way of restricting exported symbols on '%s'." % os_name) + print ("If you know a way, please contact the author.") + sys.stdout.write ("\n") + return + +#------------------------------------------------------------------------------- + +progname = re.sub (".*[\\/]", "", sys.argv [0]) + +if len (sys.argv) != 3: + sys.stdout.write ("\n") + print ("Usage : %s ." % progname) + sys.stdout.write ("\n") + print (" Currently supported values for target OS are:") + print (" linux") + print (" darwin (ie MacOSX)") + print (" win32 (ie wintendo)") + print (" cygwin (Cygwin on wintendo)") + print (" os2 (OS/2)") + print (" plain (plain list of symbols)") + sys.stdout.write ("\n") + sys.exit (1) + +os_name = sys.argv [1] +version = re.sub ("\.[a-z0-9]+$", "", sys.argv [2]) + +if os_name == "linux" or os_name == "gnu" or os_name == "binutils": + linux_symbols (progname, version) +elif os_name == "darwin": + darwin_symbols (progname, version) +elif os_name == "win32": + win32_symbols (progname, version, "libsndfile") +elif os_name == "cygwin": + win32_symbols (progname, version, "cygsndfile") +elif os_name == "os2": + os2_symbols (progname, version, "sndfile") +elif os_name == "static": + plain_symbols (progname, version, "") +else: + no_symbols (os_name) + +sys.exit (0) + diff --git a/libsndfile-1.0.31/src/dither.c b/libsndfile-1.0.31/src/dither.c new file mode 100644 index 0000000..a36705e --- /dev/null +++ b/libsndfile-1.0.31/src/dither.c @@ -0,0 +1,534 @@ +/* +** Copyright (C) 2003-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +/*============================================================================ +** Rule number 1 is to only apply dither when going from a larger bitwidth +** to a smaller bitwidth. This can happen on both read and write. +** +** Need to apply dither on all conversions marked X below. +** +** Dither on write: +** +** Input +** | short int float double +** --------+----------------------------------------------- +** O 8 bit | X X X X +** u 16 bit | none X X X +** t 24 bit | none X X X +** p 32 bit | none none X X +** u float | none none none none +** t double | none none none none +** +** Dither on read: +** +** Input +** O | 8 bit 16 bit 24 bit 32 bit float double +** u --------+------------------------------------------------- +** t short | none none X X X X +** p int | none none none X X X +** u float | none none none none none none +** t double | none none none none none none +*/ + +#define SFE_DITHER_BAD_PTR 666 +#define SFE_DITHER_BAD_TYPE 667 + +typedef struct +{ int read_short_dither_bits, read_int_dither_bits ; + int write_short_dither_bits, write_int_dither_bits ; + double read_float_dither_scale, read_double_dither_bits ; + double write_float_dither_scale, write_double_dither_bits ; + + sf_count_t (*read_short) (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; + sf_count_t (*read_int) (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; + sf_count_t (*read_float) (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; + sf_count_t (*read_double) (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + + sf_count_t (*write_short) (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; + sf_count_t (*write_int) (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; + sf_count_t (*write_float) (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; + sf_count_t (*write_double) (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + + double buffer [SF_BUFFER_LEN / sizeof (double)] ; +} DITHER_DATA ; + +static sf_count_t dither_read_short (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t dither_read_int (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; + +static sf_count_t dither_write_short (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t dither_write_int (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t dither_write_float (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t dither_write_double (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +int +dither_init (SF_PRIVATE *psf, int mode) +{ DITHER_DATA *pdither ; + + pdither = psf->dither ; /* This may be NULL. */ + + /* Turn off dither on read. */ + if (mode == SFM_READ && psf->read_dither.type == SFD_NO_DITHER) + { if (pdither == NULL) + return 0 ; /* Dither is already off, so just return. */ + + if (pdither->read_short) + psf->read_short = pdither->read_short ; + if (pdither->read_int) + psf->read_int = pdither->read_int ; + if (pdither->read_float) + psf->read_float = pdither->read_float ; + if (pdither->read_double) + psf->read_double = pdither->read_double ; + return 0 ; + } ; + + /* Turn off dither on write. */ + if (mode == SFM_WRITE && psf->write_dither.type == SFD_NO_DITHER) + { if (pdither == NULL) + return 0 ; /* Dither is already off, so just return. */ + + if (pdither->write_short) + psf->write_short = pdither->write_short ; + if (pdither->write_int) + psf->write_int = pdither->write_int ; + if (pdither->write_float) + psf->write_float = pdither->write_float ; + if (pdither->write_double) + psf->write_double = pdither->write_double ; + return 0 ; + } ; + + /* Turn on dither on read if asked. */ + if (mode == SFM_READ && psf->read_dither.type != 0) + { if (pdither == NULL) + pdither = psf->dither = calloc (1, sizeof (DITHER_DATA)) ; + if (pdither == NULL) + return SFE_MALLOC_FAILED ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_DOUBLE : + case SF_FORMAT_FLOAT : + pdither->read_int = psf->read_int ; + psf->read_int = dither_read_int ; + break ; + + case SF_FORMAT_PCM_32 : + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_S8 : + case SF_FORMAT_PCM_U8 : + pdither->read_short = psf->read_short ; + psf->read_short = dither_read_short ; + break ; + + default : break ; + } ; + } ; + + /* Turn on dither on write if asked. */ + if (mode == SFM_WRITE && psf->write_dither.type != 0) + { if (pdither == NULL) + pdither = psf->dither = calloc (1, sizeof (DITHER_DATA)) ; + if (pdither == NULL) + return SFE_MALLOC_FAILED ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_DOUBLE : + case SF_FORMAT_FLOAT : + pdither->write_int = psf->write_int ; + psf->write_int = dither_write_int ; + break ; + + case SF_FORMAT_PCM_32 : + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_S8 : + case SF_FORMAT_PCM_U8 : + break ; + + default : break ; + } ; + + pdither->write_short = psf->write_short ; + psf->write_short = dither_write_short ; + + pdither->write_int = psf->write_int ; + psf->write_int = dither_write_int ; + + pdither->write_float = psf->write_float ; + psf->write_float = dither_write_float ; + + pdither->write_double = psf->write_double ; + psf->write_double = dither_write_double ; + } ; + + return 0 ; +} /* dither_init */ + +/*============================================================================== +*/ + +static void dither_short (const short *in, short *out, int frames, int channels) ; +static void dither_int (const int *in, int *out, int frames, int channels) ; + +static void dither_float (const float *in, float *out, int frames, int channels) ; +static void dither_double (const double *in, double *out, int frames, int channels) ; + +static sf_count_t +dither_read_short (SF_PRIVATE * UNUSED (psf), short * UNUSED (ptr), sf_count_t len) +{ + return len ; +} /* dither_read_short */ + +static sf_count_t +dither_read_int (SF_PRIVATE * UNUSED (psf), int * UNUSED (ptr), sf_count_t len) +{ + return len ; +} /* dither_read_int */ + +/*------------------------------------------------------------------------------ +*/ + +static sf_count_t +dither_write_short (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ DITHER_DATA *pdither ; + int bufferlen, writecount, thiswrite ; + sf_count_t total = 0 ; + + if ((pdither = psf->dither) == NULL) + { psf->error = SFE_DITHER_BAD_PTR ; + return 0 ; + } ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_PCM_S8 : + case SF_FORMAT_PCM_U8 : + case SF_FORMAT_DPCM_8 : + break ; + + default : + return pdither->write_short (psf, ptr, len) ; + } ; + + bufferlen = sizeof (pdither->buffer) / (sizeof (short)) ; + + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : (int) len ; + writecount /= psf->sf.channels ; + writecount *= psf->sf.channels ; + + dither_short (ptr, (short*) pdither->buffer, writecount / psf->sf.channels, psf->sf.channels) ; + + thiswrite = pdither->write_short (psf, (short*) pdither->buffer, writecount) ; + total += thiswrite ; + len -= thiswrite ; + if (thiswrite < writecount) + break ; + } ; + + return total ; +} /* dither_write_short */ + +static sf_count_t +dither_write_int (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ DITHER_DATA *pdither ; + int bufferlen, writecount, thiswrite ; + sf_count_t total = 0 ; + + if ((pdither = psf->dither) == NULL) + { psf->error = SFE_DITHER_BAD_PTR ; + return 0 ; + } ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_PCM_S8 : + case SF_FORMAT_PCM_U8 : + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + break ; + + case SF_FORMAT_DPCM_8 : + case SF_FORMAT_DPCM_16 : + break ; + + default : + return pdither->write_int (psf, ptr, len) ; + } ; + + + bufferlen = sizeof (pdither->buffer) / (sizeof (int)) ; + + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : (int) len ; + writecount /= psf->sf.channels ; + writecount *= psf->sf.channels ; + + dither_int (ptr, (int*) pdither->buffer, writecount / psf->sf.channels, psf->sf.channels) ; + + thiswrite = pdither->write_int (psf, (int*) pdither->buffer, writecount) ; + total += thiswrite ; + len -= thiswrite ; + if (thiswrite < writecount) + break ; + } ; + + return total ; +} /* dither_write_int */ + +static sf_count_t +dither_write_float (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ DITHER_DATA *pdither ; + int bufferlen, writecount, thiswrite ; + sf_count_t total = 0 ; + + if ((pdither = psf->dither) == NULL) + { psf->error = SFE_DITHER_BAD_PTR ; + return 0 ; + } ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_PCM_S8 : + case SF_FORMAT_PCM_U8 : + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + break ; + + case SF_FORMAT_DPCM_8 : + case SF_FORMAT_DPCM_16 : + break ; + + default : + return pdither->write_float (psf, ptr, len) ; + } ; + + bufferlen = sizeof (pdither->buffer) / (sizeof (float)) ; + + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : (float) len ; + writecount /= psf->sf.channels ; + writecount *= psf->sf.channels ; + + dither_float (ptr, (float*) pdither->buffer, writecount / psf->sf.channels, psf->sf.channels) ; + + thiswrite = pdither->write_float (psf, (float*) pdither->buffer, writecount) ; + total += thiswrite ; + len -= thiswrite ; + if (thiswrite < writecount) + break ; + } ; + + return total ; +} /* dither_write_float */ + +static sf_count_t +dither_write_double (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ DITHER_DATA *pdither ; + int bufferlen, writecount, thiswrite ; + sf_count_t total = 0 ; + + if ((pdither = psf->dither) == NULL) + { psf->error = SFE_DITHER_BAD_PTR ; + return 0 ; + } ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_PCM_S8 : + case SF_FORMAT_PCM_U8 : + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + break ; + + case SF_FORMAT_DPCM_8 : + case SF_FORMAT_DPCM_16 : + break ; + + default : + return pdither->write_double (psf, ptr, len) ; + } ; + + + bufferlen = sizeof (pdither->buffer) / sizeof (double) ; + + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : (double) len ; + writecount /= psf->sf.channels ; + writecount *= psf->sf.channels ; + + dither_double (ptr, (double*) pdither->buffer, writecount / psf->sf.channels, psf->sf.channels) ; + + thiswrite = pdither->write_double (psf, (double*) pdither->buffer, writecount) ; + total += thiswrite ; + len -= thiswrite ; + if (thiswrite < writecount) + break ; + } ; + + return total ; +} /* dither_write_double */ + +/*============================================================================== +*/ + +static void +dither_short (const short *in, short *out, int frames, int channels) +{ int ch, k ; + + for (ch = 0 ; ch < channels ; ch++) + for (k = ch ; k < channels * frames ; k += channels) + out [k] = in [k] ; + +} /* dither_short */ + +static void +dither_int (const int *in, int *out, int frames, int channels) +{ int ch, k ; + + for (ch = 0 ; ch < channels ; ch++) + for (k = ch ; k < channels * frames ; k += channels) + out [k] = in [k] ; + +} /* dither_int */ + +static void +dither_float (const float *in, float *out, int frames, int channels) +{ int ch, k ; + + for (ch = 0 ; ch < channels ; ch++) + for (k = ch ; k < channels * frames ; k += channels) + out [k] = in [k] ; + +} /* dither_float */ + +static void +dither_double (const double *in, double *out, int frames, int channels) +{ int ch, k ; + + for (ch = 0 ; ch < channels ; ch++) + for (k = ch ; k < channels * frames ; k += channels) + out [k] = in [k] ; + +} /* dither_double */ + +/*============================================================================== +*/ +#if 0 + +/* +** Not made public because this (maybe) requires storage of state information. +** +** Also maybe need separate state info for each channel!!!! +*/ + +int +DO_NOT_USE_sf_dither_short (const SF_DITHER_INFO *dither, const short *in, short *out, int frames, int channels) +{ int ch, k ; + + if (! dither) + return SFE_DITHER_BAD_PTR ; + + switch (dither->type & SFD_TYPEMASK) + { case SFD_WHITE : + case SFD_TRIANGULAR_PDF : + for (ch = 0 ; ch < channels ; ch++) + for (k = ch ; k < channels * frames ; k += channels) + out [k] = in [k] ; + break ; + + default : + return SFE_DITHER_BAD_TYPE ; + } ; + + return 0 ; +} /* DO_NOT_USE_sf_dither_short */ + +int +DO_NOT_USE_sf_dither_int (const SF_DITHER_INFO *dither, const int *in, int *out, int frames, int channels) +{ int ch, k ; + + if (! dither) + return SFE_DITHER_BAD_PTR ; + + switch (dither->type & SFD_TYPEMASK) + { case SFD_WHITE : + case SFD_TRIANGULAR_PDF : + for (ch = 0 ; ch < channels ; ch++) + for (k = ch ; k < channels * frames ; k += channels) + out [k] = in [k] ; + break ; + + default : + return SFE_DITHER_BAD_TYPE ; + } ; + + return 0 ; +} /* DO_NOT_USE_sf_dither_int */ + +int +DO_NOT_USE_sf_dither_float (const SF_DITHER_INFO *dither, const float *in, float *out, int frames, int channels) +{ int ch, k ; + + if (! dither) + return SFE_DITHER_BAD_PTR ; + + switch (dither->type & SFD_TYPEMASK) + { case SFD_WHITE : + case SFD_TRIANGULAR_PDF : + for (ch = 0 ; ch < channels ; ch++) + for (k = ch ; k < channels * frames ; k += channels) + out [k] = in [k] ; + break ; + + default : + return SFE_DITHER_BAD_TYPE ; + } ; + + return 0 ; +} /* DO_NOT_USE_sf_dither_float */ + +int +DO_NOT_USE_sf_dither_double (const SF_DITHER_INFO *dither, const double *in, double *out, int frames, int channels) +{ int ch, k ; + + if (! dither) + return SFE_DITHER_BAD_PTR ; + + switch (dither->type & SFD_TYPEMASK) + { case SFD_WHITE : + case SFD_TRIANGULAR_PDF : + for (ch = 0 ; ch < channels ; ch++) + for (k = ch ; k < channels * frames ; k += channels) + out [k] = in [k] ; + break ; + + default : + return SFE_DITHER_BAD_TYPE ; + } ; + + return 0 ; +} /* DO_NOT_USE_sf_dither_double */ + +#endif + diff --git a/libsndfile-1.0.31/src/double64.c b/libsndfile-1.0.31/src/double64.c new file mode 100644 index 0000000..fb6d468 --- /dev/null +++ b/libsndfile-1.0.31/src/double64.c @@ -0,0 +1,1063 @@ +/* +** Copyright (C) 1999-2015 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +#if CPU_IS_LITTLE_ENDIAN + #define DOUBLE64_READ double64_le_read + #define DOUBLE64_WRITE double64_le_write +#elif CPU_IS_BIG_ENDIAN + #define DOUBLE64_READ double64_be_read + #define DOUBLE64_WRITE double64_be_write +#endif + +/* A 32 number which will not overflow when multiplied by sizeof (double). */ +#define SENSIBLE_LEN (0x8000000) + +/*-------------------------------------------------------------------------------------------- +** Processor floating point capabilities. double64_get_capability () returns one of the +** latter three values. +*/ + +enum +{ DOUBLE_UNKNOWN = 0x00, + DOUBLE_CAN_RW_LE = 0x23, + DOUBLE_CAN_RW_BE = 0x34, + DOUBLE_BROKEN_LE = 0x45, + DOUBLE_BROKEN_BE = 0x56 +} ; + +/*-------------------------------------------------------------------------------------------- +** Prototypes for private functions. +*/ + +static sf_count_t host_read_d2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t host_read_d2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t host_read_d2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t host_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t host_write_s2d (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t host_write_i2d (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t host_write_f2d (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t host_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +static void double64_peak_update (SF_PRIVATE *psf, const double *buffer, int count, sf_count_t indx) ; + +static int double64_get_capability (SF_PRIVATE *psf) ; + +static sf_count_t replace_read_d2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t replace_read_d2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t replace_read_d2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t replace_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t replace_write_s2d (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t replace_write_i2d (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t replace_write_f2d (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t replace_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +static void d2bd_read (double *buffer, int count) ; +static void bd2d_write (double *buffer, int count) ; + +/*-------------------------------------------------------------------------------------------- +** Exported functions. +*/ + +int +double64_init (SF_PRIVATE *psf) +{ static int double64_caps ; + + if (psf->sf.channels < 1 || psf->sf.channels > SF_MAX_CHANNELS) + { psf_log_printf (psf, "double64_init : internal error : channels = %d\n", psf->sf.channels) ; + return SFE_INTERNAL ; + } ; + + double64_caps = double64_get_capability (psf) ; + + psf->blockwidth = sizeof (double) * psf->sf.channels ; + + if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR) + { switch (psf->endian + double64_caps) + { case (SF_ENDIAN_BIG + DOUBLE_CAN_RW_BE) : + psf->data_endswap = SF_FALSE ; + psf->read_short = host_read_d2s ; + psf->read_int = host_read_d2i ; + psf->read_float = host_read_d2f ; + psf->read_double = host_read_d ; + break ; + + case (SF_ENDIAN_LITTLE + DOUBLE_CAN_RW_LE) : + psf->data_endswap = SF_FALSE ; + psf->read_short = host_read_d2s ; + psf->read_int = host_read_d2i ; + psf->read_float = host_read_d2f ; + psf->read_double = host_read_d ; + break ; + + case (SF_ENDIAN_BIG + DOUBLE_CAN_RW_LE) : + psf->data_endswap = SF_TRUE ; + psf->read_short = host_read_d2s ; + psf->read_int = host_read_d2i ; + psf->read_float = host_read_d2f ; + psf->read_double = host_read_d ; + break ; + + case (SF_ENDIAN_LITTLE + DOUBLE_CAN_RW_BE) : + psf->data_endswap = SF_TRUE ; + psf->read_short = host_read_d2s ; + psf->read_int = host_read_d2i ; + psf->read_float = host_read_d2f ; + psf->read_double = host_read_d ; + break ; + + /* When the CPU is not IEEE compatible. */ + case (SF_ENDIAN_BIG + DOUBLE_BROKEN_BE) : + psf->data_endswap = SF_FALSE ; + psf->read_short = replace_read_d2s ; + psf->read_int = replace_read_d2i ; + psf->read_float = replace_read_d2f ; + psf->read_double = replace_read_d ; + break ; + + case (SF_ENDIAN_LITTLE + DOUBLE_BROKEN_LE) : + psf->data_endswap = SF_FALSE ; + psf->read_short = replace_read_d2s ; + psf->read_int = replace_read_d2i ; + psf->read_float = replace_read_d2f ; + psf->read_double = replace_read_d ; + break ; + + case (SF_ENDIAN_BIG + DOUBLE_BROKEN_LE) : + psf->data_endswap = SF_TRUE ; + psf->read_short = replace_read_d2s ; + psf->read_int = replace_read_d2i ; + psf->read_float = replace_read_d2f ; + psf->read_double = replace_read_d ; + break ; + + case (SF_ENDIAN_LITTLE + DOUBLE_BROKEN_BE) : + psf->data_endswap = SF_TRUE ; + psf->read_short = replace_read_d2s ; + psf->read_int = replace_read_d2i ; + psf->read_float = replace_read_d2f ; + psf->read_double = replace_read_d ; + break ; + + default : break ; + } ; + } ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { switch (psf->endian + double64_caps) + { case (SF_ENDIAN_LITTLE + DOUBLE_CAN_RW_LE) : + psf->data_endswap = SF_FALSE ; + psf->write_short = host_write_s2d ; + psf->write_int = host_write_i2d ; + psf->write_float = host_write_f2d ; + psf->write_double = host_write_d ; + break ; + + case (SF_ENDIAN_BIG + DOUBLE_CAN_RW_BE) : + psf->data_endswap = SF_FALSE ; + psf->write_short = host_write_s2d ; + psf->write_int = host_write_i2d ; + psf->write_float = host_write_f2d ; + psf->write_double = host_write_d ; + break ; + + case (SF_ENDIAN_BIG + DOUBLE_CAN_RW_LE) : + psf->data_endswap = SF_TRUE ; + psf->write_short = host_write_s2d ; + psf->write_int = host_write_i2d ; + psf->write_float = host_write_f2d ; + psf->write_double = host_write_d ; + break ; + + case (SF_ENDIAN_LITTLE + DOUBLE_CAN_RW_BE) : + psf->data_endswap = SF_TRUE ; + psf->write_short = host_write_s2d ; + psf->write_int = host_write_i2d ; + psf->write_float = host_write_f2d ; + psf->write_double = host_write_d ; + break ; + + /* When the CPU is not IEEE compatible. */ + case (SF_ENDIAN_LITTLE + DOUBLE_BROKEN_LE) : + psf->data_endswap = SF_FALSE ; + psf->write_short = replace_write_s2d ; + psf->write_int = replace_write_i2d ; + psf->write_float = replace_write_f2d ; + psf->write_double = replace_write_d ; + break ; + + case (SF_ENDIAN_BIG + DOUBLE_BROKEN_BE) : + psf->data_endswap = SF_FALSE ; + psf->write_short = replace_write_s2d ; + psf->write_int = replace_write_i2d ; + psf->write_float = replace_write_f2d ; + psf->write_double = replace_write_d ; + break ; + + case (SF_ENDIAN_BIG + DOUBLE_BROKEN_LE) : + psf->data_endswap = SF_TRUE ; + psf->write_short = replace_write_s2d ; + psf->write_int = replace_write_i2d ; + psf->write_float = replace_write_f2d ; + psf->write_double = replace_write_d ; + break ; + + case (SF_ENDIAN_LITTLE + DOUBLE_BROKEN_BE) : + psf->data_endswap = SF_TRUE ; + psf->write_short = replace_write_s2d ; + psf->write_int = replace_write_i2d ; + psf->write_float = replace_write_f2d ; + psf->write_double = replace_write_d ; + break ; + + default : break ; + } ; + } ; + + if (psf->filelength > psf->dataoffset) + { psf->datalength = (psf->dataend > 0) ? psf->dataend - psf->dataoffset : + psf->filelength - psf->dataoffset ; + } + else + psf->datalength = 0 ; + + psf->sf.frames = psf->datalength / psf->blockwidth ; + + return 0 ; +} /* double64_init */ + +/*---------------------------------------------------------------------------- +** From : http://www.hpcf.cam.ac.uk/fp_formats.html +** +** 64 bit double precision layout (big endian) +** Sign bit 0 +** Exponent bits 1-11 +** Mantissa bits 12-63 +** Exponent Offset 1023 +** +** double single +** +** +INF 7FF0000000000000 7F800000 +** -INF FFF0000000000000 FF800000 +** NaN 7FF0000000000001 7F800001 +** to to +** 7FFFFFFFFFFFFFFF 7FFFFFFF +** and and +** FFF0000000000001 FF800001 +** to to +** FFFFFFFFFFFFFFFF FFFFFFFF +** +OVER 7FEFFFFFFFFFFFFF 7F7FFFFF +** -OVER FFEFFFFFFFFFFFFF FF7FFFFF +** +UNDER 0010000000000000 00800000 +** -UNDER 8010000000000000 80800000 +*/ + +double +double64_be_read (const unsigned char *cptr) +{ int exponent, negative, upper, lower ; + double dvalue ; + + negative = (cptr [0] & 0x80) ? 1 : 0 ; + exponent = ((cptr [0] & 0x7F) << 4) | ((cptr [1] >> 4) & 0xF) ; + + /* Might not have a 64 bit long, so load the mantissa into a double. */ + upper = (((cptr [1] & 0xF) << 24) | (cptr [2] << 16) | (cptr [3] << 8) | cptr [4]) ; + lower = (cptr [5] << 16) | (cptr [6] << 8) | cptr [7] ; + + if (exponent == 0 && upper == 0 && lower == 0) + return 0.0 ; + + dvalue = upper + lower / ((double) 0x1000000) ; + dvalue += 0x10000000 ; + + exponent = exponent - 0x3FF ; + + dvalue = dvalue / ((double) 0x10000000) ; + + if (negative) + dvalue *= -1 ; + + if (exponent > 0) + dvalue *= pow (2.0, exponent) ; + else if (exponent < 0) + dvalue /= pow (2.0, abs (exponent)) ; + + return dvalue ; +} /* double64_be_read */ + +double +double64_le_read (const unsigned char *cptr) +{ int exponent, negative, upper, lower ; + double dvalue ; + + negative = (cptr [7] & 0x80) ? 1 : 0 ; + exponent = ((cptr [7] & 0x7F) << 4) | ((cptr [6] >> 4) & 0xF) ; + + /* Might not have a 64 bit long, so load the mantissa into a double. */ + upper = ((cptr [6] & 0xF) << 24) | (cptr [5] << 16) | (cptr [4] << 8) | cptr [3] ; + lower = (cptr [2] << 16) | (cptr [1] << 8) | cptr [0] ; + + if (exponent == 0 && upper == 0 && lower == 0) + return 0.0 ; + + dvalue = upper + lower / ((double) 0x1000000) ; + dvalue += 0x10000000 ; + + exponent = exponent - 0x3FF ; + + dvalue = dvalue / ((double) 0x10000000) ; + + if (negative) + dvalue *= -1 ; + + if (exponent > 0) + dvalue *= pow (2.0, exponent) ; + else if (exponent < 0) + dvalue /= pow (2.0, abs (exponent)) ; + + return dvalue ; +} /* double64_le_read */ + +void +double64_be_write (double in, unsigned char *out) +{ int exponent, mantissa ; + + memset (out, 0, sizeof (double)) ; + + if (fabs (in) < 1e-30) + return ; + + if (in < 0.0) + { in *= -1.0 ; + out [0] |= 0x80 ; + } ; + + in = frexp (in, &exponent) ; + + exponent += 1022 ; + + out [0] |= (exponent >> 4) & 0x7F ; + out [1] |= (exponent << 4) & 0xF0 ; + + in *= 0x20000000 ; + mantissa = psf_lrint (floor (in)) ; + + out [1] |= (mantissa >> 24) & 0xF ; + out [2] = (mantissa >> 16) & 0xFF ; + out [3] = (mantissa >> 8) & 0xFF ; + out [4] = mantissa & 0xFF ; + + in = fmod (in, 1.0) ; + in *= 0x1000000 ; + mantissa = psf_lrint (floor (in)) ; + + out [5] = (mantissa >> 16) & 0xFF ; + out [6] = (mantissa >> 8) & 0xFF ; + out [7] = mantissa & 0xFF ; + + return ; +} /* double64_be_write */ + +void +double64_le_write (double in, unsigned char *out) +{ int exponent, mantissa ; + + memset (out, 0, sizeof (double)) ; + + if (fabs (in) < 1e-30) + return ; + + if (in < 0.0) + { in *= -1.0 ; + out [7] |= 0x80 ; + } ; + + in = frexp (in, &exponent) ; + + exponent += 1022 ; + + out [7] |= (exponent >> 4) & 0x7F ; + out [6] |= (exponent << 4) & 0xF0 ; + + in *= 0x20000000 ; + mantissa = psf_lrint (floor (in)) ; + + out [6] |= (mantissa >> 24) & 0xF ; + out [5] = (mantissa >> 16) & 0xFF ; + out [4] = (mantissa >> 8) & 0xFF ; + out [3] = mantissa & 0xFF ; + + in = fmod (in, 1.0) ; + in *= 0x1000000 ; + mantissa = psf_lrint (floor (in)) ; + + out [2] = (mantissa >> 16) & 0xFF ; + out [1] = (mantissa >> 8) & 0xFF ; + out [0] = mantissa & 0xFF ; + + return ; +} /* double64_le_write */ + +/*============================================================================================== +** Private functions. +*/ + +static void +double64_peak_update (SF_PRIVATE *psf, const double *buffer, int count, sf_count_t indx) +{ int chan ; + int k, position ; + float fmaxval ; + + for (chan = 0 ; chan < psf->sf.channels ; chan++) + { fmaxval = fabs (buffer [chan]) ; + position = 0 ; + for (k = chan ; k < count ; k += psf->sf.channels) + if (fmaxval < fabs (buffer [k])) + { fmaxval = fabs (buffer [k]) ; + position = k ; + } ; + + if (fmaxval > psf->peak_info->peaks [chan].value) + { psf->peak_info->peaks [chan].value = fmaxval ; + psf->peak_info->peaks [chan].position = psf->write_current + indx + (position / psf->sf.channels) ; + } ; + } ; + + return ; +} /* double64_peak_update */ + +static int +double64_get_capability (SF_PRIVATE *psf) +{ union + { double d ; + unsigned char c [8] ; + } data ; + + data.d = 1.234567890123456789 ; /* Some abitrary value. */ + + if (! psf->ieee_replace) + { /* If this test is true ints and floats are compatible and little endian. */ + if (data.c [0] == 0xfb && data.c [1] == 0x59 && data.c [2] == 0x8c && data.c [3] == 0x42 && + data.c [4] == 0xca && data.c [5] == 0xc0 && data.c [6] == 0xf3 && data.c [7] == 0x3f) + return DOUBLE_CAN_RW_LE ; + + /* If this test is true ints and floats are compatible and big endian. */ + if (data.c [0] == 0x3f && data.c [1] == 0xf3 && data.c [2] == 0xc0 && data.c [3] == 0xca && + data.c [4] == 0x42 && data.c [5] == 0x8c && data.c [6] == 0x59 && data.c [7] == 0xfb) + return DOUBLE_CAN_RW_BE ; + } ; + + /* Doubles are broken. Don't expect reading or writing to be fast. */ + psf_log_printf (psf, "Using IEEE replacement code for double.\n") ; + + return (CPU_IS_LITTLE_ENDIAN) ? DOUBLE_BROKEN_LE : DOUBLE_BROKEN_BE ; +} /* double64_get_capability */ + +/*======================================================================================= +*/ + +static void +d2s_array (const double *src, int count, short *dest, double scale) +{ while (--count >= 0) + { dest [count] = psf_lrint (scale * src [count]) ; + } ; +} /* d2s_array */ + +static void +d2s_clip_array (const double *src, int count, short *dest, double scale) +{ while (--count >= 0) + { double tmp = scale * src [count] ; + + if (CPU_CLIPS_POSITIVE == 0 && tmp > 32767.0) + dest [count] = SHRT_MAX ; + else if (CPU_CLIPS_NEGATIVE == 0 && tmp < -32768.0) + dest [count] = SHRT_MIN ; + else + dest [count] = psf_lrint (tmp) ; + } ; +} /* d2s_clip_array */ + +static void +d2i_array (const double *src, int count, int *dest, double scale) +{ while (--count >= 0) + { dest [count] = psf_lrint (scale * src [count]) ; + } ; +} /* d2i_array */ + +static void +d2i_clip_array (const double *src, int count, int *dest, double scale) +{ while (--count >= 0) + { float tmp = scale * src [count] ; + + if (CPU_CLIPS_POSITIVE == 0 && tmp > (1.0 * INT_MAX)) + dest [count] = INT_MAX ; + else if (CPU_CLIPS_NEGATIVE == 0 && tmp < (-1.0 * INT_MAX)) + dest [count] = INT_MIN ; + else + dest [count] = psf_lrint (tmp) ; + } ; +} /* d2i_clip_array */ + +static inline void +d2f_array (const double *src, int count, float *dest) +{ while (--count >= 0) + { dest [count] = src [count] ; + } ; +} /* d2f_array */ + +static inline void +s2d_array (const short *src, double *dest, int count, double scale) +{ while (--count >= 0) + { dest [count] = scale * src [count] ; + } ; +} /* s2d_array */ + +static inline void +i2d_array (const int *src, double *dest, int count, double scale) +{ while (--count >= 0) + { dest [count] = scale * src [count] ; + } ; +} /* i2d_array */ + +static inline void +f2d_array (const float *src, double *dest, int count) +{ while (--count >= 0) + { dest [count] = src [count] ; + } ; +} /* f2d_array */ + +/*---------------------------------------------------------------------------------------------- +*/ + +static sf_count_t +host_read_d2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const double *, int, short *, double) ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + double scale ; + + convert = (psf->add_clipping) ? d2s_clip_array : d2s_array ; + bufferlen = ARRAY_LEN (ubuf.dbuf) ; + scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ; + + if (psf->data_endswap == SF_TRUE) + endswap_double_array (ubuf.dbuf, readcount) ; + + convert (ubuf.dbuf, readcount, ptr + total, scale) ; + total += readcount ; + len -= readcount ; + if (readcount < bufferlen) + break ; + } ; + + return total ; +} /* host_read_d2s */ + +static sf_count_t +host_read_d2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const double *, int, int *, double) ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + double scale ; + + convert = (psf->add_clipping) ? d2i_clip_array : d2i_array ; + bufferlen = ARRAY_LEN (ubuf.dbuf) ; + scale = (psf->float_int_mult == 0) ? 1.0 : 2147483648.0f / psf->float_max ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ; + + if (psf->data_endswap == SF_TRUE) + endswap_double_array (ubuf.dbuf, bufferlen) ; + + convert (ubuf.dbuf, readcount, ptr + total, scale) ; + total += readcount ; + len -= readcount ; + if (readcount < bufferlen) + break ; + } ; + + return total ; +} /* host_read_d2i */ + +static sf_count_t +host_read_d2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.dbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ; + + if (psf->data_endswap == SF_TRUE) + endswap_double_array (ubuf.dbuf, readcount) ; + + d2f_array (ubuf.dbuf, readcount, ptr + total) ; + total += readcount ; + len -= readcount ; + if (readcount < bufferlen) + break ; + } ; + + return total ; +} /* host_read_d2f */ + +static sf_count_t +host_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ int bufferlen ; + sf_count_t readcount, total = 0 ; + + readcount = psf_fread (ptr, sizeof (double), len, psf) ; + + if (psf->data_endswap != SF_TRUE) + return readcount ; + + /* If the read length was sensible, endswap output in one go. */ + if (readcount < SENSIBLE_LEN) + { endswap_double_array (ptr, readcount) ; + return readcount ; + } ; + + bufferlen = SENSIBLE_LEN ; + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + + endswap_double_array (ptr + total, bufferlen) ; + + total += bufferlen ; + len -= bufferlen ; + } ; + + return total ; +} /* host_read_d */ + +static sf_count_t +host_write_s2d (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + double scale ; + + scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ; + bufferlen = ARRAY_LEN (ubuf.dbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + + s2d_array (ptr + total, ubuf.dbuf, bufferlen, scale) ; + + if (psf->peak_info) + double64_peak_update (psf, ubuf.dbuf, bufferlen, total / psf->sf.channels) ; + + if (psf->data_endswap == SF_TRUE) + endswap_double_array (ubuf.dbuf, bufferlen) ; + + writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* host_write_s2d */ + +static sf_count_t +host_write_i2d (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + double scale ; + + scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ; + bufferlen = ARRAY_LEN (ubuf.dbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + i2d_array (ptr + total, ubuf.dbuf, bufferlen, scale) ; + + if (psf->peak_info) + double64_peak_update (psf, ubuf.dbuf, bufferlen, total / psf->sf.channels) ; + + if (psf->data_endswap == SF_TRUE) + endswap_double_array (ubuf.dbuf, bufferlen) ; + + writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* host_write_i2d */ + +static sf_count_t +host_write_f2d (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.dbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + f2d_array (ptr + total, ubuf.dbuf, bufferlen) ; + + if (psf->peak_info) + double64_peak_update (psf, ubuf.dbuf, bufferlen, total / psf->sf.channels) ; + + if (psf->data_endswap == SF_TRUE) + endswap_double_array (ubuf.dbuf, bufferlen) ; + + writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* host_write_f2d */ + +static sf_count_t +host_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + if (psf->peak_info) + double64_peak_update (psf, ptr, len, 0) ; + + if (psf->data_endswap != SF_TRUE) + return psf_fwrite (ptr, sizeof (double), len, psf) ; + + bufferlen = ARRAY_LEN (ubuf.dbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + + endswap_double_copy (ubuf.dbuf, ptr + total, bufferlen) ; + + writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* host_write_d */ + +/*======================================================================================= +*/ + +static sf_count_t +replace_read_d2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + double scale ; + + bufferlen = ARRAY_LEN (ubuf.dbuf) ; + scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ; + + if (psf->data_endswap == SF_TRUE) + endswap_double_array (ubuf.dbuf, bufferlen) ; + + d2bd_read (ubuf.dbuf, bufferlen) ; + + d2s_array (ubuf.dbuf, readcount, ptr + total, scale) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* replace_read_d2s */ + +static sf_count_t +replace_read_d2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + double scale ; + + bufferlen = ARRAY_LEN (ubuf.dbuf) ; + scale = (psf->float_int_mult == 0) ? 1.0 : 2147483648.0f / psf->float_max ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ; + + if (psf->data_endswap == SF_TRUE) + endswap_double_array (ubuf.dbuf, bufferlen) ; + + d2bd_read (ubuf.dbuf, bufferlen) ; + + d2i_array (ubuf.dbuf, readcount, ptr + total, scale) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* replace_read_d2i */ + +static sf_count_t +replace_read_d2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.dbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ; + + if (psf->data_endswap == SF_TRUE) + endswap_double_array (ubuf.dbuf, bufferlen) ; + + d2bd_read (ubuf.dbuf, bufferlen) ; + + memcpy (ptr + total, ubuf.dbuf, bufferlen * sizeof (double)) ; + + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* replace_read_d2f */ + +static sf_count_t +replace_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + /* FIXME : This is probably nowhere near optimal. */ + bufferlen = ARRAY_LEN (ubuf.dbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.dbuf, sizeof (double), bufferlen, psf) ; + + if (psf->data_endswap == SF_TRUE) + endswap_double_array (ubuf.dbuf, readcount) ; + + d2bd_read (ubuf.dbuf, readcount) ; + + memcpy (ptr + total, ubuf.dbuf, readcount * sizeof (double)) ; + + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* replace_read_d */ + +static sf_count_t +replace_write_s2d (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + double scale ; + + scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ; + bufferlen = ARRAY_LEN (ubuf.dbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + s2d_array (ptr + total, ubuf.dbuf, bufferlen, scale) ; + + if (psf->peak_info) + double64_peak_update (psf, ubuf.dbuf, bufferlen, total / psf->sf.channels) ; + + bd2d_write (ubuf.dbuf, bufferlen) ; + + if (psf->data_endswap == SF_TRUE) + endswap_double_array (ubuf.dbuf, bufferlen) ; + + writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* replace_write_s2d */ + +static sf_count_t +replace_write_i2d (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + double scale ; + + scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ; + bufferlen = ARRAY_LEN (ubuf.dbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + i2d_array (ptr + total, ubuf.dbuf, bufferlen, scale) ; + + if (psf->peak_info) + double64_peak_update (psf, ubuf.dbuf, bufferlen, total / psf->sf.channels) ; + + bd2d_write (ubuf.dbuf, bufferlen) ; + + if (psf->data_endswap == SF_TRUE) + endswap_double_array (ubuf.dbuf, bufferlen) ; + + writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* replace_write_i2d */ + +static sf_count_t +replace_write_f2d (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.dbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + f2d_array (ptr + total, ubuf.dbuf, bufferlen) ; + + bd2d_write (ubuf.dbuf, bufferlen) ; + + if (psf->data_endswap == SF_TRUE) + endswap_double_array (ubuf.dbuf, bufferlen) ; + + writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* replace_write_f2d */ + +static sf_count_t +replace_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + /* FIXME : This is probably nowhere near optimal. */ + if (psf->peak_info) + double64_peak_update (psf, ptr, len, 0) ; + + bufferlen = ARRAY_LEN (ubuf.dbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + + memcpy (ubuf.dbuf, ptr + total, bufferlen * sizeof (double)) ; + + bd2d_write (ubuf.dbuf, bufferlen) ; + + if (psf->data_endswap == SF_TRUE) + endswap_double_array (ubuf.dbuf, bufferlen) ; + + writecount = psf_fwrite (ubuf.dbuf, sizeof (double), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* replace_write_d */ + +/*---------------------------------------------------------------------------------------------- +*/ + +static void +d2bd_read (double *buffer, int count) +{ while (--count >= 0) + { buffer [count] = DOUBLE64_READ ((unsigned char *) (buffer + count)) ; + } ; +} /* d2bd_read */ + +static void +bd2d_write (double *buffer, int count) +{ while (--count >= 0) + { DOUBLE64_WRITE (buffer [count], (unsigned char*) (buffer + count)) ; + } ; +} /* bd2d_write */ + diff --git a/libsndfile-1.0.31/src/dwd.c b/libsndfile-1.0.31/src/dwd.c new file mode 100644 index 0000000..af4d9f0 --- /dev/null +++ b/libsndfile-1.0.31/src/dwd.c @@ -0,0 +1,201 @@ +/* +** Copyright (C) 2002-2012 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +#if (ENABLE_EXPERIMENTAL_CODE == 0) + +int +dwd_open (SF_PRIVATE *psf) +{ if (psf) + return SFE_UNIMPLEMENTED ; + return 0 ; +} /* dwd_open */ + +#else + +/*------------------------------------------------------------------------------ +** Macros to handle big/little endian issues. +*/ + +#define SFE_DWD_NO_DWD 1666 +#define SFE_DWD_BAND_BIT_WIDTH 1667 +#define SFE_DWD_COMPRESSION 1668 + +#define DWD_IDENTIFIER "DiamondWare Digitized\n\0\x1a" +#define DWD_IDENTIFIER_LEN 24 + +#define DWD_HEADER_LEN 57 + +/*------------------------------------------------------------------------------ +** Typedefs. +*/ + +/*------------------------------------------------------------------------------ +** Private static functions. +*/ + +static int dwd_read_header (SF_PRIVATE *psf) ; + +static int dwd_close (SF_PRIVATE *psf) ; + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +dwd_open (SF_PRIVATE *psf) +{ int error = 0 ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = dwd_read_header (psf))) + return error ; + } ; + + if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_DWD) + return SFE_BAD_OPEN_FORMAT ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { + /*-psf->endian = SF_ENDIAN (psf->sf.format) ; + if (CPU_IS_LITTLE_ENDIAN && psf->endian == SF_ENDIAN_CPU) + psf->endian = SF_ENDIAN_LITTLE ; + else if (psf->endian != SF_ENDIAN_LITTLE) + psf->endian = SF_ENDIAN_BIG ; + + if (! (encoding = dwd_write_header (psf, SF_FALSE))) + return psf->error ; + + psf->write_header = dwd_write_header ; + -*/ + } ; + + psf->container_close = dwd_close ; + + /*-psf->blockwidth = psf->bytewidth * psf->sf.channels ;-*/ + + return error ; +} /* dwd_open */ + +/*------------------------------------------------------------------------------ +*/ + +static int +dwd_close (SF_PRIVATE * UNUSED (psf)) +{ + return 0 ; +} /* dwd_close */ + +/* This struct contains all the fields of interest om the DWD header, but does not +** do so in the same order and layout as the actual file, header. +** No assumptions are made about the packing of this struct. +*/ +typedef struct +{ unsigned char major, minor, compression, channels, bitwidth ; + unsigned short srate, maxval ; + unsigned int id, datalen, frames, offset ; +} DWD_HEADER ; + +static int +dwd_read_header (SF_PRIVATE *psf) +{ BUF_UNION ubuf ; + DWD_HEADER dwdh ; + + memset (ubuf.cbuf, 0, sizeof (ubuf.cbuf)) ; + /* Set position to start of file to begin reading header. */ + psf_binheader_readf (psf, "pb", 0, ubuf.cbuf, DWD_IDENTIFIER_LEN) ; + + if (memcmp (ubuf.cbuf, DWD_IDENTIFIER, DWD_IDENTIFIER_LEN) != 0) + return SFE_DWD_NO_DWD ; + + psf_log_printf (psf, "Read only : DiamondWare Digitized (.dwd)\n", ubuf.cbuf) ; + + psf_binheader_readf (psf, "11", &dwdh.major, &dwdh.minor) ; + psf_binheader_readf (psf, "e4j1", &dwdh.id, 1, &dwdh.compression) ; + psf_binheader_readf (psf, "e211", &dwdh.srate, &dwdh.channels, &dwdh.bitwidth) ; + psf_binheader_readf (psf, "e24", &dwdh.maxval, &dwdh.datalen) ; + psf_binheader_readf (psf, "e44", &dwdh.frames, &dwdh.offset) ; + + psf_log_printf (psf, " Version Major : %d\n Version Minor : %d\n Unique ID : %08X\n", + dwdh.major, dwdh.minor, dwdh.id) ; + psf_log_printf (psf, " Compression : %d => ", dwdh.compression) ; + + if (dwdh.compression != 0) + { psf_log_printf (psf, "Unsupported compression\n") ; + return SFE_DWD_COMPRESSION ; + } + else + psf_log_printf (psf, "None\n") ; + + psf_log_printf (psf, " Sample Rate : %d\n Channels : %d\n" + " Bit Width : %d\n", + dwdh.srate, dwdh.channels, dwdh.bitwidth) ; + + switch (dwdh.bitwidth) + { case 8 : + psf->sf.format = SF_FORMAT_DWD | SF_FORMAT_PCM_S8 ; + psf->bytewidth = 1 ; + break ; + + case 16 : + psf->sf.format = SF_FORMAT_DWD | SF_FORMAT_PCM_16 ; + psf->bytewidth = 2 ; + break ; + + default : + psf_log_printf (psf, "*** Bad bit width %d\n", dwdh.bitwidth) ; + return SFE_DWD_BAND_BIT_WIDTH ; + } ; + + if (psf->filelength != dwdh.offset + dwdh.datalen) + { psf_log_printf (psf, " Data Length : %d (should be %D)\n", dwdh.datalen, psf->filelength - dwdh.offset) ; + dwdh.datalen = (unsigned int) (psf->filelength - dwdh.offset) ; + } + else + psf_log_printf (psf, " Data Length : %d\n", dwdh.datalen) ; + + psf_log_printf (psf, " Max Value : %d\n", dwdh.maxval) ; + psf_log_printf (psf, " Frames : %d\n", dwdh.frames) ; + psf_log_printf (psf, " Data Offset : %d\n", dwdh.offset) ; + + psf->datalength = dwdh.datalen ; + psf->dataoffset = dwdh.offset ; + + psf->endian = SF_ENDIAN_LITTLE ; + + psf->sf.samplerate = dwdh.srate ; + psf->sf.channels = dwdh.channels ; + psf->sf.sections = 1 ; + + return pcm_init (psf) ; +} /* dwd_read_header */ + +/*------------------------------------------------------------------------------ +*/ + +#endif + diff --git a/libsndfile-1.0.31/src/dwvw.c b/libsndfile-1.0.31/src/dwvw.c new file mode 100644 index 0000000..13985ad --- /dev/null +++ b/libsndfile-1.0.31/src/dwvw.c @@ -0,0 +1,674 @@ +/* +** Copyright (C) 2002-2014 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +/*=========================================================================== +** Delta Word Variable Width +** +** This decoder and encoder were implemented using information found in this +** document : http://home.swbell.net/rubywand/R011SNDFMTS.TXT +** +** According to the document, the algorithm "was invented 1991 by Magnus +** Lidstrom and is copyright 1993 by NuEdge Development". +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +typedef struct +{ int bit_width, dwm_maxsize, max_delta, span ; + int samplecount ; + int bit_count, bits, last_delta_width, last_sample ; + struct + { int index, end ; + unsigned char buffer [256] ; + } b ; +} DWVW_PRIVATE ; + +/*============================================================================================ +*/ + +static sf_count_t dwvw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t dwvw_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t dwvw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t dwvw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t dwvw_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t dwvw_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t dwvw_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t dwvw_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +static sf_count_t dwvw_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; +static int dwvw_close (SF_PRIVATE *psf) ; +static int dwvw_byterate (SF_PRIVATE *psf) ; + +static int dwvw_decode_data (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int *ptr, int len) ; +static int dwvw_decode_load_bits (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int bit_count) ; + +static int dwvw_encode_data (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, const int *ptr, int len) ; +static void dwvw_encode_store_bits (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int data, int new_bits) ; +static void dwvw_read_reset (DWVW_PRIVATE *pdwvw) ; + +/*============================================================================================ +** DWVW initialisation function. +*/ + +int +dwvw_init (SF_PRIVATE *psf, int bitwidth) +{ DWVW_PRIVATE *pdwvw ; + + if (psf->codec_data != NULL) + { psf_log_printf (psf, "*** psf->codec_data is not NULL.\n") ; + return SFE_INTERNAL ; + } ; + + if (bitwidth > 24) + return SFE_DWVW_BAD_BITWIDTH ; + + if (psf->file.mode == SFM_RDWR) + return SFE_BAD_MODE_RW ; + + if ((pdwvw = calloc (1, sizeof (DWVW_PRIVATE))) == NULL) + return SFE_MALLOC_FAILED ; + + psf->codec_data = (void*) pdwvw ; + pdwvw->bit_width = bitwidth ; + dwvw_read_reset (pdwvw) ; + + if (psf->file.mode == SFM_READ) + { psf->read_short = dwvw_read_s ; + psf->read_int = dwvw_read_i ; + psf->read_float = dwvw_read_f ; + psf->read_double = dwvw_read_d ; + } ; + + if (psf->file.mode == SFM_WRITE) + { psf->write_short = dwvw_write_s ; + psf->write_int = dwvw_write_i ; + psf->write_float = dwvw_write_f ; + psf->write_double = dwvw_write_d ; + } ; + + psf->codec_close = dwvw_close ; + psf->seek = dwvw_seek ; + psf->byterate = dwvw_byterate ; + + if (psf->file.mode == SFM_READ) + { psf->sf.frames = psf_decode_frame_count (psf) ; + dwvw_read_reset (pdwvw) ; + } ; + + return 0 ; +} /* dwvw_init */ + +/*-------------------------------------------------------------------------------------------- +*/ + +static int +dwvw_close (SF_PRIVATE *psf) +{ DWVW_PRIVATE *pdwvw ; + + if (psf->codec_data == NULL) + return 0 ; + pdwvw = (DWVW_PRIVATE*) psf->codec_data ; + + if (psf->file.mode == SFM_WRITE) + { static int last_values [12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ; + + /* Write 8 zero samples to fully flush output. */ + dwvw_encode_data (psf, pdwvw, last_values, 12) ; + + /* Write the last buffer worth of data to disk. */ + psf_fwrite (pdwvw->b.buffer, 1, pdwvw->b.index, psf) ; + + if (psf->write_header) + psf->write_header (psf, SF_TRUE) ; + } ; + + return 0 ; +} /* dwvw_close */ + +static sf_count_t +dwvw_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t offset) +{ DWVW_PRIVATE *pdwvw ; + + if (! psf->codec_data) + { psf->error = SFE_INTERNAL ; + return PSF_SEEK_ERROR ; + } ; + + pdwvw = (DWVW_PRIVATE*) psf->codec_data ; + + if (offset == 0) + { psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + dwvw_read_reset (pdwvw) ; + return 0 ; + } ; + + psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; +} /* dwvw_seek */ + +static int +dwvw_byterate (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_READ) + return (psf->datalength * psf->sf.samplerate) / psf->sf.frames ; + + return -1 ; +} /* dwvw_byterate */ + +/*============================================================================== +*/ + +static sf_count_t +dwvw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ DWVW_PRIVATE *pdwvw ; + BUF_UNION ubuf ; + int *iptr ; + int k, bufferlen, readcount = 0, count ; + sf_count_t total = 0 ; + + if (! psf->codec_data) + return 0 ; + pdwvw = (DWVW_PRIVATE*) psf->codec_data ; + + iptr = ubuf.ibuf ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = dwvw_decode_data (psf, pdwvw, iptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = iptr [k] >> 16 ; + + total += count ; + len -= readcount ; + if (count != readcount) + break ; + } ; + + return total ; +} /* dwvw_read_s */ + +static sf_count_t +dwvw_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ DWVW_PRIVATE *pdwvw ; + int readcount, count ; + sf_count_t total = 0 ; + + if (! psf->codec_data) + return 0 ; + pdwvw = (DWVW_PRIVATE*) psf->codec_data ; + + while (len > 0) + { readcount = (len > 0x10000000) ? 0x10000000 : (int) len ; + + count = dwvw_decode_data (psf, pdwvw, ptr, readcount) ; + + total += count ; + len -= count ; + + if (count != readcount) + break ; + } ; + + return total ; +} /* dwvw_read_i */ + +static sf_count_t +dwvw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ DWVW_PRIVATE *pdwvw ; + BUF_UNION ubuf ; + int *iptr ; + int k, bufferlen, readcount = 0, count ; + sf_count_t total = 0 ; + float normfact ; + + if (! psf->codec_data) + return 0 ; + pdwvw = (DWVW_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ; + + iptr = ubuf.ibuf ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = dwvw_decode_data (psf, pdwvw, iptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * (float) (iptr [k]) ; + + total += count ; + len -= readcount ; + if (count != readcount) + break ; + } ; + + return total ; +} /* dwvw_read_f */ + +static sf_count_t +dwvw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ DWVW_PRIVATE *pdwvw ; + BUF_UNION ubuf ; + int *iptr ; + int k, bufferlen, readcount = 0, count ; + sf_count_t total = 0 ; + double normfact ; + + if (! psf->codec_data) + return 0 ; + pdwvw = (DWVW_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 ; + + iptr = ubuf.ibuf ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = dwvw_decode_data (psf, pdwvw, iptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * (double) (iptr [k]) ; + + total += count ; + len -= readcount ; + if (count != readcount) + break ; + } ; + + return total ; +} /* dwvw_read_d */ + +static int +dwvw_decode_data (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int *ptr, int len) +{ int count ; + int delta_width_modifier, delta_width, delta_negative, delta, sample ; + + /* Restore state from last decode call. */ + delta_width = pdwvw->last_delta_width ; + sample = pdwvw->last_sample ; + + for (count = 0 ; count < len ; count++) + { /* If bit_count parameter is zero get the delta_width_modifier. */ + delta_width_modifier = dwvw_decode_load_bits (psf, pdwvw, -1) ; + + /* Check for end of input bit stream. Break loop if end. */ + if (delta_width_modifier < 0 || (pdwvw->b.end == 0 && count == 0)) + break ; + + if (delta_width_modifier && dwvw_decode_load_bits (psf, pdwvw, 1)) + delta_width_modifier = - delta_width_modifier ; + + /* Calculate the current word width. */ + delta_width = (delta_width + delta_width_modifier + pdwvw->bit_width) % pdwvw->bit_width ; + + /* Load the delta. */ + delta = 0 ; + if (delta_width) + { delta = dwvw_decode_load_bits (psf, pdwvw, delta_width - 1) | (1 << (delta_width - 1)) ; + delta_negative = dwvw_decode_load_bits (psf, pdwvw, 1) ; + if (delta == pdwvw->max_delta - 1) + delta += dwvw_decode_load_bits (psf, pdwvw, 1) ; + if (delta_negative) + delta = -delta ; + } ; + + /* Calculate the sample */ + sample += delta ; + + if (sample >= pdwvw->max_delta) + sample -= pdwvw->span ; + else if (sample < - pdwvw->max_delta) + sample += pdwvw->span ; + + /* Store the sample justifying to the most significant bit. */ + ptr [count] = arith_shift_left (sample, 32 - pdwvw->bit_width) ; + + if (pdwvw->b.end == 0 && pdwvw->bit_count == 0) + break ; + } ; + + pdwvw->last_delta_width = delta_width ; + pdwvw->last_sample = sample ; + + pdwvw->samplecount += count ; + + return count ; +} /* dwvw_decode_data */ + +static int +dwvw_decode_load_bits (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int bit_count) +{ int output = 0, get_dwm = SF_FALSE ; + + /* + ** Depending on the value of parameter bit_count, either get the + ** required number of bits (ie bit_count > 0) or the + ** delta_width_modifier (otherwise). + */ + + if (bit_count < 0) + { get_dwm = SF_TRUE ; + /* modify bit_count to ensure we have enought bits for finding dwm. */ + bit_count = pdwvw->dwm_maxsize ; + } ; + + /* Load bits in bit reseviour. */ + while (pdwvw->bit_count < bit_count) + { if (pdwvw->b.index >= pdwvw->b.end) + { pdwvw->b.end = psf_fread (pdwvw->b.buffer, 1, sizeof (pdwvw->b.buffer), psf) ; + pdwvw->b.index = 0 ; + } ; + + /* Check for end of input stream. */ + if (bit_count < 8 && pdwvw->b.end == 0) + return -1 ; + + pdwvw->bits = arith_shift_left (pdwvw->bits, 8) ; + + if (pdwvw->b.index < pdwvw->b.end) + { pdwvw->bits |= pdwvw->b.buffer [pdwvw->b.index] ; + pdwvw->b.index ++ ; + } ; + pdwvw->bit_count += 8 ; + } ; + + /* If asked to get bits do so. */ + if (! get_dwm) + { output = (pdwvw->bits >> (pdwvw->bit_count - bit_count)) & ((1 << bit_count) - 1) ; + pdwvw->bit_count -= bit_count ; + return output ; + } ; + + /* Otherwise must have been asked to get delta_width_modifier. */ + while (output < (pdwvw->dwm_maxsize)) + { pdwvw->bit_count -= 1 ; + if (pdwvw->bits & (1 << pdwvw->bit_count)) + break ; + output += 1 ; + } ; + + return output ; +} /* dwvw_decode_load_bits */ + +static void +dwvw_read_reset (DWVW_PRIVATE *pdwvw) +{ int bitwidth = pdwvw->bit_width ; + + memset (pdwvw, 0, sizeof (DWVW_PRIVATE)) ; + + pdwvw->bit_width = bitwidth ; + pdwvw->dwm_maxsize = bitwidth / 2 ; + pdwvw->max_delta = 1 << (bitwidth - 1) ; + pdwvw->span = 1 << bitwidth ; +} /* dwvw_read_reset */ + +static void +dwvw_encode_store_bits (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, int data, int new_bits) +{ int byte ; + + /* Shift the bits into the resevoir. */ + pdwvw->bits = arith_shift_left (pdwvw->bits, new_bits) | (data & (arith_shift_left (1, new_bits) - 1)) ; + pdwvw->bit_count += new_bits ; + + /* Transfer bit to buffer. */ + while (pdwvw->bit_count >= 8) + { byte = pdwvw->bits >> (pdwvw->bit_count - 8) ; + pdwvw->bit_count -= 8 ; + pdwvw->b.buffer [pdwvw->b.index] = byte & 0xFF ; + pdwvw->b.index ++ ; + } ; + + if (pdwvw->b.index > SIGNED_SIZEOF (pdwvw->b.buffer) - 4) + { psf_fwrite (pdwvw->b.buffer, 1, pdwvw->b.index, psf) ; + pdwvw->b.index = 0 ; + } ; + + return ; +} /* dwvw_encode_store_bits */ + +#if 0 +/* Debigging routine. */ +static void +dump_bits (DWVW_PRIVATE *pdwvw) +{ int k, mask ; + + for (k = 0 ; k < 10 && k < pdwvw->b.index ; k++) + { mask = 0x80 ; + while (mask) + { putchar (mask & pdwvw->b.buffer [k] ? '1' : '0') ; + mask >>= 1 ; + } ; + putchar (' ') ; + } + + for (k = pdwvw->bit_count - 1 ; k >= 0 ; k --) + putchar (pdwvw->bits & (1 << k) ? '1' : '0') ; + + putchar ('\n') ; +} /* dump_bits */ +#endif + +#define HIGHEST_BIT(x, count) \ + { int y = x ; \ + (count) = 0 ; \ + while (y) \ + { (count) ++ ; \ + y >>= 1 ; \ + } ; \ + } ; + +static int +dwvw_encode_data (SF_PRIVATE *psf, DWVW_PRIVATE *pdwvw, const int *ptr, int len) +{ int count ; + int delta_width_modifier, delta, delta_negative, delta_width, extra_bit ; + + for (count = 0 ; count < len ; count++) + { delta = (ptr [count] >> (32 - pdwvw->bit_width)) - pdwvw->last_sample ; + + /* Calculate extra_bit if needed. */ + extra_bit = -1 ; + delta_negative = 0 ; + if (delta < -pdwvw->max_delta) + delta = pdwvw->max_delta + (delta % pdwvw->max_delta) ; + else if (delta == -pdwvw->max_delta) + { extra_bit = 1 ; + delta_negative = 1 ; + delta = pdwvw->max_delta - 1 ; + } + else if (delta > pdwvw->max_delta) + { delta_negative = 1 ; + delta = pdwvw->span - delta ; + delta = abs (delta) ; + } + else if (delta == pdwvw->max_delta) + { extra_bit = 1 ; + delta = pdwvw->max_delta - 1 ; + } + else if (delta < 0) + { delta_negative = 1 ; + delta = abs (delta) ; + } ; + + if (delta == pdwvw->max_delta - 1 && extra_bit == -1) + extra_bit = 0 ; + + /* Find width in bits of delta */ + HIGHEST_BIT (delta, delta_width) ; + + /* Calculate the delta_width_modifier */ + delta_width_modifier = (delta_width - pdwvw->last_delta_width) % pdwvw->bit_width ; + if (delta_width_modifier > pdwvw->dwm_maxsize) + delta_width_modifier -= pdwvw->bit_width ; + if (delta_width_modifier < -pdwvw->dwm_maxsize) + delta_width_modifier += pdwvw->bit_width ; + + /* Write delta_width_modifier zeros, followed by terminating '1'. */ + dwvw_encode_store_bits (psf, pdwvw, 0, abs (delta_width_modifier)) ; + if (abs (delta_width_modifier) != pdwvw->dwm_maxsize) + dwvw_encode_store_bits (psf, pdwvw, 1, 1) ; + + /* Write delta_width_modifier sign. */ + if (delta_width_modifier < 0) + dwvw_encode_store_bits (psf, pdwvw, 1, 1) ; + if (delta_width_modifier > 0) + dwvw_encode_store_bits (psf, pdwvw, 0, 1) ; + + /* Write delta and delta sign bit. */ + if (delta_width) + { dwvw_encode_store_bits (psf, pdwvw, delta, abs (delta_width) - 1) ; + dwvw_encode_store_bits (psf, pdwvw, (delta_negative ? 1 : 0), 1) ; + } ; + + /* Write extra bit!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ + if (extra_bit >= 0) + dwvw_encode_store_bits (psf, pdwvw, extra_bit, 1) ; + + pdwvw->last_sample = ptr [count] >> (32 - pdwvw->bit_width) ; + pdwvw->last_delta_width = delta_width ; + } ; + + pdwvw->samplecount += count ; + + return count ; +} /* dwvw_encode_data */ + +static sf_count_t +dwvw_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ DWVW_PRIVATE *pdwvw ; + BUF_UNION ubuf ; + int *iptr ; + int k, bufferlen, writecount = 0, count ; + sf_count_t total = 0 ; + + if (! psf->codec_data) + return 0 ; + pdwvw = (DWVW_PRIVATE*) psf->codec_data ; + + iptr = ubuf.ibuf ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + iptr [k] = arith_shift_left (ptr [total + k], 16) ; + count = dwvw_encode_data (psf, pdwvw, iptr, writecount) ; + + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + + return total ; +} /* dwvw_write_s */ + +static sf_count_t +dwvw_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ DWVW_PRIVATE *pdwvw ; + int writecount, count ; + sf_count_t total = 0 ; + + if (! psf->codec_data) + return 0 ; + pdwvw = (DWVW_PRIVATE*) psf->codec_data ; + + while (len > 0) + { writecount = (len > 0x10000000) ? 0x10000000 : (int) len ; + + count = dwvw_encode_data (psf, pdwvw, ptr, writecount) ; + + total += count ; + len -= count ; + + if (count != writecount) + break ; + } ; + + return total ; +} /* dwvw_write_i */ + +static sf_count_t +dwvw_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ DWVW_PRIVATE *pdwvw ; + BUF_UNION ubuf ; + int *iptr ; + int k, bufferlen, writecount = 0, count ; + sf_count_t total = 0 ; + float normfact ; + + if (! psf->codec_data) + return 0 ; + pdwvw = (DWVW_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : 1.0 ; + + iptr = ubuf.ibuf ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + iptr [k] = psf_lrintf (normfact * ptr [total + k]) ; + count = dwvw_encode_data (psf, pdwvw, iptr, writecount) ; + + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + + return total ; +} /* dwvw_write_f */ + +static sf_count_t +dwvw_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ DWVW_PRIVATE *pdwvw ; + BUF_UNION ubuf ; + int *iptr ; + int k, bufferlen, writecount = 0, count ; + sf_count_t total = 0 ; + double normfact ; + + if (! psf->codec_data) + return 0 ; + pdwvw = (DWVW_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : 1.0 ; + + iptr = ubuf.ibuf ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + iptr [k] = psf_lrint (normfact * ptr [total + k]) ; + count = dwvw_encode_data (psf, pdwvw, iptr, writecount) ; + + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + + return total ; +} /* dwvw_write_d */ + diff --git a/libsndfile-1.0.31/src/file_io.c b/libsndfile-1.0.31/src/file_io.c new file mode 100644 index 0000000..9cd9379 --- /dev/null +++ b/libsndfile-1.0.31/src/file_io.c @@ -0,0 +1,1572 @@ +/* +** Copyright (C) 2002-2014 Erik de Castro Lopo +** Copyright (C) 2003 Ross Bencina +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +/* +** The file is split into three sections as follows: +** - The top section (USE_WINDOWS_API == 0) for Linux, Unix and MacOSX +** systems (including Cygwin). +** - The middle section (USE_WINDOWS_API == 1) for microsoft windows +** (including MinGW) using the native windows API. +** - A legacy windows section which attempted to work around grevious +** bugs in microsoft's POSIX implementation. +*/ + +/* +** The header file sfconfig.h MUST be included before the others to ensure +** that large file support is enabled correctly on Unix systems. +*/ + +#include "sfconfig.h" + +#if USE_WINDOWS_API + +/* Don't include rarely used headers, speed up build */ +#define WIN32_LEAN_AND_MEAN + +#include +#endif + +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include +#endif + +#if (HAVE_DECL_S_IRGRP == 0) +#include +#endif + +#include +#include +#include +#include + +#include "sndfile.h" +#include "common.h" + +#define SENSIBLE_SIZE (0x40000000) + +/* +** Neat solution to the Win32/OS2 binary file flage requirement. +** If O_BINARY isn't already defined by the inclusion of the system +** headers, set it to zero. +*/ +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +static void psf_log_syserr (SF_PRIVATE *psf, int error) ; + +#if (USE_WINDOWS_API == 0) + +/*------------------------------------------------------------------------------ +** Win32 stuff at the bottom of the file. Unix and other sensible OSes here. +*/ + +static int psf_close_fd (int fd) ; +static int psf_open_fd (PSF_FILE * pfile) ; +static sf_count_t psf_get_filelen_fd (int fd) ; + +int +psf_fopen (SF_PRIVATE *psf) +{ + psf->error = 0 ; + psf->file.filedes = psf_open_fd (&psf->file) ; + + if (psf->file.filedes == - SFE_BAD_OPEN_MODE) + { psf->error = SFE_BAD_OPEN_MODE ; + psf->file.filedes = -1 ; + return psf->error ; + } ; + + if (psf->file.filedes == -1) + psf_log_syserr (psf, errno) ; + + return psf->error ; +} /* psf_fopen */ + +int +psf_fclose (SF_PRIVATE *psf) +{ int retval ; + + if (psf->virtual_io) + return 0 ; + + if (psf->file.do_not_close_descriptor) + { psf->file.filedes = -1 ; + return 0 ; + } ; + + if ((retval = psf_close_fd (psf->file.filedes)) == -1) + psf_log_syserr (psf, errno) ; + + psf->file.filedes = -1 ; + + return retval ; +} /* psf_fclose */ + +int +psf_open_rsrc (SF_PRIVATE *psf) +{ size_t count ; + + if (psf->rsrc.filedes > 0) + return 0 ; + + /* Test for MacOSX style resource fork on HPFS or HPFS+ filesystems. */ + count = snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s/..namedfork/rsrc", psf->file.path.c) ; + psf->error = SFE_NO_ERROR ; + if (count < sizeof (psf->rsrc.path.c)) + { if ((psf->rsrc.filedes = psf_open_fd (&psf->rsrc)) >= 0) + { psf->rsrclength = psf_get_filelen_fd (psf->rsrc.filedes) ; + if (psf->rsrclength > 0 || (psf->rsrc.mode & SFM_WRITE)) + return SFE_NO_ERROR ; + psf_close_fd (psf->rsrc.filedes) ; + psf->rsrc.filedes = -1 ; + } ; + + if (psf->rsrc.filedes == - SFE_BAD_OPEN_MODE) + { psf->error = SFE_BAD_OPEN_MODE ; + return psf->error ; + } ; + } ; + + /* + ** Now try for a resource fork stored as a separate file in the same + ** directory, but preceded with a dot underscore. + */ + count = snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s._%s", psf->file.dir.c, psf->file.name.c) ; + psf->error = SFE_NO_ERROR ; + if (count < sizeof (psf->rsrc.path.c) && (psf->rsrc.filedes = psf_open_fd (&psf->rsrc)) >= 0) + { psf->rsrclength = psf_get_filelen_fd (psf->rsrc.filedes) ; + return SFE_NO_ERROR ; + } ; + + /* + ** Now try for a resource fork stored in a separate file in the + ** .AppleDouble/ directory. + */ + count = snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s.AppleDouble/%s", psf->file.dir.c, psf->file.name.c) ; + psf->error = SFE_NO_ERROR ; + if (count < sizeof (psf->rsrc.path.c)) + { if ((psf->rsrc.filedes = psf_open_fd (&psf->rsrc)) >= 0) + { psf->rsrclength = psf_get_filelen_fd (psf->rsrc.filedes) ; + return SFE_NO_ERROR ; + } ; + + /* No resource file found. */ + if (psf->rsrc.filedes == -1) + psf_log_syserr (psf, errno) ; + } + else + { psf->error = SFE_OPEN_FAILED ; + } ; + + psf->rsrc.filedes = -1 ; + + return psf->error ; +} /* psf_open_rsrc */ + +sf_count_t +psf_get_filelen (SF_PRIVATE *psf) +{ sf_count_t filelen ; + + if (psf->virtual_io) + return psf->vio.get_filelen (psf->vio_user_data) ; + + filelen = psf_get_filelen_fd (psf->file.filedes) ; + + if (filelen == -1) + { psf_log_syserr (psf, errno) ; + return (sf_count_t) -1 ; + } ; + + if (filelen == -SFE_BAD_STAT_SIZE) + { psf->error = SFE_BAD_STAT_SIZE ; + return (sf_count_t) -1 ; + } ; + + switch (psf->file.mode) + { case SFM_WRITE : + filelen = filelen - psf->fileoffset ; + break ; + + case SFM_READ : + if (psf->fileoffset > 0 && psf->filelength > 0) + filelen = psf->filelength ; + break ; + + case SFM_RDWR : + /* + ** Cannot open embedded files SFM_RDWR so we don't need to + ** subtract psf->fileoffset. We already have the answer we + ** need. + */ + break ; + + default : + /* Shouldn't be here, so return error. */ + filelen = -1 ; + } ; + + return filelen ; +} /* psf_get_filelen */ + +int +psf_close_rsrc (SF_PRIVATE *psf) +{ psf_close_fd (psf->rsrc.filedes) ; + psf->rsrc.filedes = -1 ; + return 0 ; +} /* psf_close_rsrc */ + +int +psf_set_stdio (SF_PRIVATE *psf) +{ int error = 0 ; + + switch (psf->file.mode) + { case SFM_RDWR : + error = SFE_OPEN_PIPE_RDWR ; + break ; + + case SFM_READ : + psf->file.filedes = 0 ; + break ; + + case SFM_WRITE : + psf->file.filedes = 1 ; + break ; + + default : + error = SFE_BAD_OPEN_MODE ; + break ; + } ; + psf->filelength = 0 ; + + return error ; +} /* psf_set_stdio */ + +void +psf_set_file (SF_PRIVATE *psf, int fd) +{ psf->file.filedes = fd ; +} /* psf_set_file */ + +int +psf_file_valid (SF_PRIVATE *psf) +{ return (psf->file.filedes >= 0) ? SF_TRUE : SF_FALSE ; +} /* psf_set_file */ + +sf_count_t +psf_fseek (SF_PRIVATE *psf, sf_count_t offset, int whence) +{ sf_count_t absolute_position ; + + if (psf->virtual_io) + return psf->vio.seek (offset, whence, psf->vio_user_data) ; + + /* When decoding from pipes sometimes see seeks to the pipeoffset, which appears to mean do nothing. */ + if (psf->is_pipe) + { if (whence != SEEK_SET || offset != psf->pipeoffset) + psf_log_printf (psf, "psf_fseek : pipe seek to value other than pipeoffset\n") ; + return offset ; + } + + switch (whence) + { case SEEK_SET : + offset += psf->fileoffset ; + break ; + + case SEEK_END : + break ; + + case SEEK_CUR : + break ; + + default : + /* We really should not be here. */ + psf_log_printf (psf, "psf_fseek : whence is %d *****.\n", whence) ; + return 0 ; + } ; + + absolute_position = lseek (psf->file.filedes, offset, whence) ; + + if (absolute_position < 0) + psf_log_syserr (psf, errno) ; + + return absolute_position - psf->fileoffset ; +} /* psf_fseek */ + +sf_count_t +psf_fread (void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf) +{ sf_count_t total = 0 ; + ssize_t count ; + + if (psf->virtual_io) + return psf->vio.read (ptr, bytes*items, psf->vio_user_data) / bytes ; + + items *= bytes ; + + /* Do this check after the multiplication above. */ + if (items <= 0) + return 0 ; + + while (items > 0) + { /* Break the read down to a sensible size. */ + count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : (ssize_t) items ; + + count = read (psf->file.filedes, ((char*) ptr) + total, (size_t) count) ; + + if (count == -1) + { if (errno == EINTR) + continue ; + + psf_log_syserr (psf, errno) ; + break ; + } ; + + if (count == 0) + break ; + + total += count ; + items -= count ; + } ; + + if (psf->is_pipe) + psf->pipeoffset += total ; + + return total / bytes ; +} /* psf_fread */ + +sf_count_t +psf_fwrite (const void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf) +{ sf_count_t total = 0 ; + ssize_t count ; + + if (bytes == 0 || items == 0) + return 0 ; + + if (psf->virtual_io) + return psf->vio.write (ptr, bytes*items, psf->vio_user_data) / bytes ; + + items *= bytes ; + + /* Do this check after the multiplication above. */ + if (items <= 0) + return 0 ; + + while (items > 0) + { /* Break the writes down to a sensible size. */ + count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : items ; + + count = write (psf->file.filedes, ((const char*) ptr) + total, count) ; + + if (count == -1) + { if (errno == EINTR) + continue ; + + psf_log_syserr (psf, errno) ; + break ; + } ; + + if (count == 0) + break ; + + total += count ; + items -= count ; + } ; + + if (psf->is_pipe) + psf->pipeoffset += total ; + + return total / bytes ; +} /* psf_fwrite */ + +sf_count_t +psf_ftell (SF_PRIVATE *psf) +{ sf_count_t pos ; + + if (psf->virtual_io) + return psf->vio.tell (psf->vio_user_data) ; + + if (psf->is_pipe) + return psf->pipeoffset ; + + pos = lseek (psf->file.filedes, 0, SEEK_CUR) ; + + if (pos == ((sf_count_t) -1)) + { psf_log_syserr (psf, errno) ; + return -1 ; + } ; + + return pos - psf->fileoffset ; +} /* psf_ftell */ + +static int +psf_close_fd (int fd) +{ int retval ; + + if (fd < 0) + return 0 ; + + while ((retval = close (fd)) == -1 && errno == EINTR) + /* Do nothing. */ ; + + return retval ; +} /* psf_close_fd */ + +sf_count_t +psf_fgets (char *buffer, sf_count_t bufsize, SF_PRIVATE *psf) +{ sf_count_t k = 0 ; + sf_count_t count ; + + while (k < bufsize - 1) + { count = read (psf->file.filedes, &(buffer [k]), 1) ; + + if (count == -1) + { if (errno == EINTR) + continue ; + + psf_log_syserr (psf, errno) ; + break ; + } ; + + if (count == 0 || buffer [k++] == '\n') + break ; + } ; + + buffer [k] = 0 ; + + return k ; +} /* psf_fgets */ + +int +psf_is_pipe (SF_PRIVATE *psf) +{ struct stat statbuf ; + + if (psf->virtual_io) + return SF_FALSE ; + + if (fstat (psf->file.filedes, &statbuf) == -1) + { psf_log_syserr (psf, errno) ; + /* Default to maximum safety. */ + return SF_TRUE ; + } ; + + if (S_ISFIFO (statbuf.st_mode) || S_ISSOCK (statbuf.st_mode)) + return SF_TRUE ; + + return SF_FALSE ; +} /* psf_is_pipe */ + +static sf_count_t +psf_get_filelen_fd (int fd) +{ +#if (SIZEOF_OFF_T == 4 && SIZEOF_SF_COUNT_T == 8 && HAVE_FSTAT64) + struct stat64 statbuf ; + + if (fstat64 (fd, &statbuf) == -1) + return (sf_count_t) -1 ; + + return statbuf.st_size ; +#else + struct stat statbuf ; + + if (fstat (fd, &statbuf) == -1) + return (sf_count_t) -1 ; + + return statbuf.st_size ; +#endif +} /* psf_get_filelen_fd */ + +int +psf_ftruncate (SF_PRIVATE *psf, sf_count_t len) +{ int retval ; + + /* Returns 0 on success, non-zero on failure. */ + if (len < 0) + return -1 ; + + if ((sizeof (off_t) < sizeof (sf_count_t)) && len > 0x7FFFFFFF) + return -1 ; + + retval = ftruncate (psf->file.filedes, len) ; + + if (retval == -1) + psf_log_syserr (psf, errno) ; + + return retval ; +} /* psf_ftruncate */ + +void +psf_init_files (SF_PRIVATE *psf) +{ psf->file.filedes = -1 ; + psf->rsrc.filedes = -1 ; + psf->file.savedes = -1 ; +} /* psf_init_files */ + +void +psf_use_rsrc (SF_PRIVATE *psf, int on_off) +{ + if (on_off) + { if (psf->file.filedes != psf->rsrc.filedes) + { psf->file.savedes = psf->file.filedes ; + psf->file.filedes = psf->rsrc.filedes ; + } ; + } + else if (psf->file.filedes == psf->rsrc.filedes) + psf->file.filedes = psf->file.savedes ; + + return ; +} /* psf_use_rsrc */ + +static int +psf_open_fd (PSF_FILE * pfile) +{ int fd, oflag, mode ; + + /* + ** Sanity check. If everything is OK, this test and the printfs will + ** be optimised out. This is meant to catch the problems caused by + ** "sfconfig.h" being included after . + */ + if (sizeof (sf_count_t) != 8) + { puts ("\n\n*** Fatal error : sizeof (sf_count_t) != 8") ; + puts ("*** This means that libsndfile was not configured correctly.\n") ; + exit (1) ; + } ; + + switch (pfile->mode) + { case SFM_READ : + oflag = O_RDONLY | O_BINARY ; + mode = 0 ; + break ; + + case SFM_WRITE : + oflag = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ; + mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH ; + break ; + + case SFM_RDWR : + oflag = O_RDWR | O_CREAT | O_BINARY ; + mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH ; + break ; + + default : + return - SFE_BAD_OPEN_MODE ; + break ; + } ; + + if (mode == 0) + fd = open (pfile->path.c, oflag) ; + else + fd = open (pfile->path.c, oflag, mode) ; + + return fd ; +} /* psf_open_fd */ + +static void +psf_log_syserr (SF_PRIVATE *psf, int error) +{ + /* Only log an error if no error has been set yet. */ + if (psf->error == 0) + { psf->error = SFE_SYSTEM ; + snprintf (psf->syserr, sizeof (psf->syserr), "System error : %s.", strerror (error)) ; + } ; + + return ; +} /* psf_log_syserr */ + +void +psf_fsync (SF_PRIVATE *psf) +{ +#if HAVE_FSYNC + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + fsync (psf->file.filedes) ; +#else + psf = NULL ; +#endif +} /* psf_fsync */ + +#elif USE_WINDOWS_API + +/* Win32 file i/o functions implemented using native Win32 API */ + +#ifndef WINAPI_PARTITION_SYSTEM +#define WINAPI_PARTITION_SYSTEM 0 +#endif + +static int psf_close_handle (HANDLE handle) ; +static HANDLE psf_open_handle (PSF_FILE * pfile) ; +static sf_count_t psf_get_filelen_handle (HANDLE handle) ; + +/* USE_WINDOWS_API */ int +psf_fopen (SF_PRIVATE *psf) +{ + psf->error = 0 ; + psf->file.handle = psf_open_handle (&psf->file) ; + + if (psf->file.handle == NULL) + psf_log_syserr (psf, GetLastError ()) ; + + return psf->error ; +} /* psf_fopen */ + +/* USE_WINDOWS_API */ int +psf_fclose (SF_PRIVATE *psf) +{ int retval ; + + if (psf->virtual_io) + return 0 ; + + if (psf->file.do_not_close_descriptor) + { psf->file.handle = NULL ; + return 0 ; + } ; + + if ((retval = psf_close_handle (psf->file.handle)) == -1) + psf_log_syserr (psf, GetLastError ()) ; + + psf->file.handle = NULL ; + + return retval ; +} /* psf_fclose */ + +/* USE_WINDOWS_API */ int +psf_open_rsrc (SF_PRIVATE *psf) +{ + if (psf->rsrc.handle != NULL) + return 0 ; + + /* Test for MacOSX style resource fork on HPFS or HPFS+ filesystems. */ + snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s/rsrc", psf->file.path.c) ; + psf->error = SFE_NO_ERROR ; + if ((psf->rsrc.handle = psf_open_handle (&psf->rsrc)) != NULL) + { psf->rsrclength = psf_get_filelen_handle (psf->rsrc.handle) ; + return SFE_NO_ERROR ; + } ; + + /* + ** Now try for a resource fork stored as a separate file in the same + ** directory, but preceded with a dot underscore. + */ + snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s._%s", psf->file.dir.c, psf->file.name.c) ; + psf->error = SFE_NO_ERROR ; + if ((psf->rsrc.handle = psf_open_handle (&psf->rsrc)) != NULL) + { psf->rsrclength = psf_get_filelen_handle (psf->rsrc.handle) ; + return SFE_NO_ERROR ; + } ; + + /* + ** Now try for a resource fork stored in a separate file in the + ** .AppleDouble/ directory. + */ + snprintf (psf->rsrc.path.c, sizeof (psf->rsrc.path.c), "%s.AppleDouble/%s", psf->file.dir.c, psf->file.name.c) ; + psf->error = SFE_NO_ERROR ; + if ((psf->rsrc.handle = psf_open_handle (&psf->rsrc)) != NULL) + { psf->rsrclength = psf_get_filelen_handle (psf->rsrc.handle) ; + return SFE_NO_ERROR ; + } ; + + /* No resource file found. */ + if (psf->rsrc.handle == NULL) + psf_log_syserr (psf, GetLastError ()) ; + + psf->rsrc.handle = NULL ; + + return psf->error ; +} /* psf_open_rsrc */ + +/* USE_WINDOWS_API */ sf_count_t +psf_get_filelen (SF_PRIVATE *psf) +{ sf_count_t filelen ; + + if (psf->virtual_io) + return psf->vio.get_filelen (psf->vio_user_data) ; + + filelen = psf_get_filelen_handle (psf->file.handle) ; + + if (filelen == -1) + { psf_log_syserr (psf, errno) ; + return (sf_count_t) -1 ; + } ; + + if (filelen == -SFE_BAD_STAT_SIZE) + { psf->error = SFE_BAD_STAT_SIZE ; + return (sf_count_t) -1 ; + } ; + + switch (psf->file.mode) + { case SFM_WRITE : + filelen = filelen - psf->fileoffset ; + break ; + + case SFM_READ : + if (psf->fileoffset > 0 && psf->filelength > 0) + filelen = psf->filelength ; + break ; + + case SFM_RDWR : + /* + ** Cannot open embedded files SFM_RDWR so we don't need to + ** subtract psf->fileoffset. We already have the answer we + ** need. + */ + break ; + + default : + /* Shouldn't be here, so return error. */ + filelen = -1 ; + } ; + + return filelen ; +} /* psf_get_filelen */ + +/* USE_WINDOWS_API */ void +psf_init_files (SF_PRIVATE *psf) +{ psf->file.handle = NULL ; + psf->rsrc.handle = NULL ; + psf->file.hsaved = NULL ; +} /* psf_init_files */ + +/* USE_WINDOWS_API */ void +psf_use_rsrc (SF_PRIVATE *psf, int on_off) +{ + if (on_off) + { if (psf->file.handle != psf->rsrc.handle) + { psf->file.hsaved = psf->file.handle ; + psf->file.handle = psf->rsrc.handle ; + } ; + } + else if (psf->file.handle == psf->rsrc.handle) + psf->file.handle = psf->file.hsaved ; + + return ; +} /* psf_use_rsrc */ + +/* USE_WINDOWS_API */ static HANDLE +psf_open_handle (PSF_FILE * pfile) +{ DWORD dwDesiredAccess ; + DWORD dwShareMode ; + DWORD dwCreationDistribution ; + HANDLE handle ; + + switch (pfile->mode) + { case SFM_READ : + dwDesiredAccess = GENERIC_READ ; + dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE ; + dwCreationDistribution = OPEN_EXISTING ; + break ; + + case SFM_WRITE : + dwDesiredAccess = GENERIC_WRITE ; + dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE ; + dwCreationDistribution = CREATE_ALWAYS ; + break ; + + case SFM_RDWR : + dwDesiredAccess = GENERIC_READ | GENERIC_WRITE ; + dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE ; + dwCreationDistribution = OPEN_ALWAYS ; + break ; + + default : + return NULL ; + } ; + +#if defined (WINAPI_FAMILY_PARTITION) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) + if (!pfile->use_wchar) + return NULL ; + + CREATEFILE2_EXTENDED_PARAMETERS cfParams = { 0 } ; + cfParams.dwSize = sizeof (CREATEFILE2_EXTENDED_PARAMETERS) ; + cfParams.dwFileAttributes = FILE_ATTRIBUTE_NORMAL ; + + handle = CreateFile2 (pfile->path.wc, dwDesiredAccess, dwShareMode, dwCreationDistribution, &cfParams) ; + + if (handle == INVALID_HANDLE_VALUE) + return NULL ; + + return handle ; +#else + if (pfile->use_wchar) + handle = CreateFileW ( + pfile->path.wc, /* pointer to name of the file */ + dwDesiredAccess, /* access (read-write) mode */ + dwShareMode, /* share mode */ + 0, /* pointer to security attributes */ + dwCreationDistribution, /* how to create */ + FILE_ATTRIBUTE_NORMAL, /* file attributes (could use FILE_FLAG_SEQUENTIAL_SCAN) */ + NULL /* handle to file with attributes to copy */ + ) ; + else + handle = CreateFileA ( + pfile->path.c, /* pointer to name of the file */ + dwDesiredAccess, /* access (read-write) mode */ + dwShareMode, /* share mode */ + 0, /* pointer to security attributes */ + dwCreationDistribution, /* how to create */ + FILE_ATTRIBUTE_NORMAL, /* file attributes (could use FILE_FLAG_SEQUENTIAL_SCAN) */ + NULL /* handle to file with attributes to copy */ + ) ; + + if (handle == INVALID_HANDLE_VALUE) + return NULL ; + + return handle ; +#endif +} /* psf_open_handle */ + +/* USE_WINDOWS_API */ static void +psf_log_syserr (SF_PRIVATE *psf, int error) +{ LPVOID lpMsgBuf ; + + /* Only log an error if no error has been set yet. */ + if (psf->error == 0) + { psf->error = SFE_SYSTEM ; + + FormatMessage ( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + error, + MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &lpMsgBuf, + 0, + NULL + ) ; + + snprintf (psf->syserr, sizeof (psf->syserr), "System error : %s", (char*) lpMsgBuf) ; + LocalFree (lpMsgBuf) ; + } ; + + return ; +} /* psf_log_syserr */ + + +/* USE_WINDOWS_API */ int +psf_close_rsrc (SF_PRIVATE *psf) +{ psf_close_handle (psf->rsrc.handle) ; + psf->rsrc.handle = NULL ; + return 0 ; +} /* psf_close_rsrc */ + + +/* USE_WINDOWS_API */ int +psf_set_stdio (SF_PRIVATE *psf) +{ HANDLE handle = NULL ; + int error = 0 ; + + switch (psf->file.mode) + { case SFM_RDWR : + error = SFE_OPEN_PIPE_RDWR ; + break ; + + case SFM_READ : + handle = GetStdHandle (STD_INPUT_HANDLE) ; + psf->file.do_not_close_descriptor = 1 ; + break ; + + case SFM_WRITE : + handle = GetStdHandle (STD_OUTPUT_HANDLE) ; + psf->file.do_not_close_descriptor = 1 ; + break ; + + default : + error = SFE_BAD_OPEN_MODE ; + break ; + } ; + + psf->file.handle = handle ; + psf->filelength = 0 ; + + return error ; +} /* psf_set_stdio */ + +/* USE_WINDOWS_API */ void +psf_set_file (SF_PRIVATE *psf, int fd) +{ HANDLE handle ; + intptr_t osfhandle ; + + osfhandle = _get_osfhandle (fd) ; + handle = (HANDLE) osfhandle ; + + psf->file.handle = handle ; +} /* psf_set_file */ + +/* USE_WINDOWS_API */ int +psf_file_valid (SF_PRIVATE *psf) +{ if (psf->file.handle == NULL) + return SF_FALSE ; + if (psf->file.handle == INVALID_HANDLE_VALUE) + return SF_FALSE ; + return SF_TRUE ; +} /* psf_set_file */ + +/* USE_WINDOWS_API */ sf_count_t +psf_fseek (SF_PRIVATE *psf, sf_count_t offset, int whence) +{ sf_count_t new_position ; + LARGE_INTEGER liDistanceToMove, liNewFilePointer ; + DWORD dwMoveMethod ; + BOOL fResult ; + DWORD dwError ; + + if (psf->virtual_io) + return psf->vio.seek (offset, whence, psf->vio_user_data) ; + + switch (whence) + { case SEEK_SET : + offset += psf->fileoffset ; + dwMoveMethod = FILE_BEGIN ; + break ; + + case SEEK_END : + dwMoveMethod = FILE_END ; + break ; + + default : + dwMoveMethod = FILE_CURRENT ; + break ; + } ; + + liDistanceToMove.QuadPart = offset ; + + fResult = SetFilePointerEx (psf->file.handle, liDistanceToMove, &liNewFilePointer, dwMoveMethod) ; + + if (fResult == FALSE) + dwError = GetLastError () ; + else + dwError = NO_ERROR ; + + if (dwError != NO_ERROR) + { psf_log_syserr (psf, dwError) ; + return -1 ; + } ; + + new_position = liNewFilePointer.QuadPart - psf->fileoffset ; + + return new_position ; +} /* psf_fseek */ + +/* USE_WINDOWS_API */ sf_count_t +psf_fread (void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf) +{ sf_count_t total = 0 ; + ssize_t count ; + DWORD dwNumberOfBytesRead ; + + if (psf->virtual_io) + return psf->vio.read (ptr, bytes*items, psf->vio_user_data) / bytes ; + + items *= bytes ; + + /* Do this check after the multiplication above. */ + if (items <= 0) + return 0 ; + + while (items > 0) + { /* Break the writes down to a sensible size. */ + count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : (ssize_t) items ; + + if (ReadFile (psf->file.handle, ((char*) ptr) + total, count, &dwNumberOfBytesRead, 0) == 0) + { psf_log_syserr (psf, GetLastError ()) ; + break ; + } + else + count = dwNumberOfBytesRead ; + + if (count == 0) + break ; + + total += count ; + items -= count ; + } ; + + if (psf->is_pipe) + psf->pipeoffset += total ; + + return total / bytes ; +} /* psf_fread */ + +/* USE_WINDOWS_API */ sf_count_t +psf_fwrite (const void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf) +{ sf_count_t total = 0 ; + ssize_t count ; + DWORD dwNumberOfBytesWritten ; + + if (psf->virtual_io) + return psf->vio.write (ptr, bytes * items, psf->vio_user_data) / bytes ; + + items *= bytes ; + + /* Do this check after the multiplication above. */ + if (items <= 0) + return 0 ; + + while (items > 0) + { /* Break the writes down to a sensible size. */ + count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : (ssize_t) items ; + + if (WriteFile (psf->file.handle, ((const char*) ptr) + total, count, &dwNumberOfBytesWritten, 0) == 0) + { psf_log_syserr (psf, GetLastError ()) ; + break ; + } + else + count = dwNumberOfBytesWritten ; + + if (count == 0) + break ; + + total += count ; + items -= count ; + } ; + + if (psf->is_pipe) + psf->pipeoffset += total ; + + return total / bytes ; +} /* psf_fwrite */ + +/* USE_WINDOWS_API */ sf_count_t +psf_ftell (SF_PRIVATE *psf) +{ sf_count_t pos ; + LARGE_INTEGER liDistanceToMove, liNewFilePointer ; + BOOL fResult ; + DWORD dwError ; + + if (psf->virtual_io) + return psf->vio.tell (psf->vio_user_data) ; + + if (psf->is_pipe) + return psf->pipeoffset ; + + liDistanceToMove.QuadPart = 0 ; + + fResult = SetFilePointerEx (psf->file.handle, liDistanceToMove, &liNewFilePointer, FILE_CURRENT) ; + + if (fResult == FALSE) + dwError = GetLastError () ; + else + dwError = NO_ERROR ; + + if (dwError != NO_ERROR) + { psf_log_syserr (psf, dwError) ; + return -1 ; + } ; + + pos = liNewFilePointer.QuadPart ; + + return pos - psf->fileoffset ; +} /* psf_ftell */ + +/* USE_WINDOWS_API */ static int +psf_close_handle (HANDLE handle) +{ if (handle == NULL) + return 0 ; + + if (CloseHandle (handle) == 0) + return -1 ; + + return 0 ; +} /* psf_close_handle */ + +/* USE_WINDOWS_API */ sf_count_t +psf_fgets (char *buffer, sf_count_t bufsize, SF_PRIVATE *psf) +{ sf_count_t k = 0 ; + sf_count_t count ; + DWORD dwNumberOfBytesRead ; + + while (k < bufsize - 1) + { if (ReadFile (psf->file.handle, &(buffer [k]), 1, &dwNumberOfBytesRead, 0) == 0) + { psf_log_syserr (psf, GetLastError ()) ; + break ; + } + else + { count = dwNumberOfBytesRead ; + /* note that we only check for '\n' not other line endings such as CRLF */ + if (count == 0 || buffer [k++] == '\n') + break ; + } ; + } ; + + buffer [k] = 0 ; + + return k ; +} /* psf_fgets */ + +/* USE_WINDOWS_API */ int +psf_is_pipe (SF_PRIVATE *psf) +{ + if (psf->virtual_io) + return SF_FALSE ; + + if (GetFileType (psf->file.handle) == FILE_TYPE_DISK) + return SF_FALSE ; + + /* Default to maximum safety. */ + return SF_TRUE ; +} /* psf_is_pipe */ + +/* USE_WINDOWS_API */ sf_count_t +psf_get_filelen_handle (HANDLE handle) +{ sf_count_t filelen ; + LARGE_INTEGER liFileSize ; + BOOL fResult ; + DWORD dwError = NO_ERROR ; + + fResult = GetFileSizeEx (handle, &liFileSize) ; + + if (fResult == FALSE) + dwError = GetLastError () ; + + if (dwError != NO_ERROR) + return (sf_count_t) -1 ; + + filelen = liFileSize.QuadPart ; + + return filelen ; +} /* psf_get_filelen_handle */ + +/* USE_WINDOWS_API */ void +psf_fsync (SF_PRIVATE *psf) +{ FlushFileBuffers (psf->file.handle) ; +} /* psf_fsync */ + + +/* USE_WINDOWS_API */ int +psf_ftruncate (SF_PRIVATE *psf, sf_count_t len) +{ int retval = 0 ; + LARGE_INTEGER liDistanceToMove ; + BOOL fResult ; + DWORD dwError = NO_ERROR ; + + /* This implementation trashes the current file position. + ** should it save and restore it? what if the current position is past + ** the new end of file? + */ + + /* Returns 0 on success, non-zero on failure. */ + if (len < 0) + return 1 ; + + liDistanceToMove.QuadPart = (sf_count_t) len ; + + fResult = SetFilePointerEx (psf->file.handle, liDistanceToMove, NULL, FILE_BEGIN) ; + + if (fResult == FALSE) + dwError = GetLastError () ; + + if (dwError != NO_ERROR) + { retval = -1 ; + psf_log_syserr (psf, dwError) ; + } + else + { /* Note: when SetEndOfFile is used to extend a file, the contents of the + ** new portion of the file is undefined. This is unlike chsize(), + ** which guarantees that the new portion of the file will be zeroed. + ** Not sure if this is important or not. + */ + if (SetEndOfFile (psf->file.handle) == 0) + { retval = -1 ; + psf_log_syserr (psf, GetLastError ()) ; + } ; + } ; + + return retval ; +} /* psf_ftruncate */ + + +#else +/* Win32 file i/o functions implemented using Unix-style file i/o API */ + +/* Win32 has a 64 file offset seek function: +** +** __int64 _lseeki64 (int handle, __int64 offset, int origin) ; +** +** It also has a 64 bit fstat function: +** +** int fstati64 (int, struct _stati64) ; +** +** but the fscking thing doesn't work!!!!! The file size parameter returned +** by this function is only valid up until more data is written at the end of +** the file. That makes this function completely 100% useless. +*/ + +#include +#include + +/* Win32 */ int +psf_fopen (SF_PRIVATE *psf, const char *pathname, int open_mode) +{ int oflag, mode ; + + switch (open_mode) + { case SFM_READ : + oflag = O_RDONLY | O_BINARY ; + mode = 0 ; + break ; + + case SFM_WRITE : + oflag = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ; + mode = S_IRUSR | S_IWUSR | S_IRGRP ; + break ; + + case SFM_RDWR : + oflag = O_RDWR | O_CREAT | O_BINARY ; + mode = S_IRUSR | S_IWUSR | S_IRGRP ; + break ; + + default : + psf->error = SFE_BAD_OPEN_MODE ; + return -1 ; + break ; + } ; + + if (mode == 0) + psf->file.filedes = open (pathname, oflag) ; + else + psf->file.filedes = open (pathname, oflag, mode) ; + + if (psf->file.filedes == -1) + psf_log_syserr (psf, errno) ; + + return psf->file.filedes ; +} /* psf_fopen */ + +/* Win32 */ sf_count_t +psf_fseek (SF_PRIVATE *psf, sf_count_t offset, int whence) +{ sf_count_t new_position ; + + if (psf->virtual_io) + return psf->vio.seek (offset, whence, psf->vio_user_data) ; + + switch (whence) + { case SEEK_SET : + offset += psf->fileoffset ; + break ; + + case SEEK_END : + if (psf->file.mode == SFM_WRITE) + { new_position = _lseeki64 (psf->file.filedes, offset, whence) ; + + if (new_position < 0) + psf_log_syserr (psf, errno) ; + + return new_position - psf->fileoffset ; + } ; + + /* Transform SEEK_END into a SEEK_SET, ie find the file + ** length add the requested offset (should be <= 0) to + ** get the offset wrt the start of file. + */ + whence = SEEK_SET ; + offset = _lseeki64 (psf->file.filedes, 0, SEEK_END) + offset ; + break ; + + default : + /* No need to do anything about SEEK_CUR. */ + break ; + } ; + + /* + ** Bypass weird Win32-ism if necessary. + ** _lseeki64() returns an "invalid parameter" error if called with the + ** offset == 0 and whence == SEEK_CUR. + *** Use the _telli64() function instead. + */ + if (offset == 0 && whence == SEEK_CUR) + new_position = _telli64 (psf->file.filedes) ; + else + new_position = _lseeki64 (psf->file.filedes, offset, whence) ; + + if (new_position < 0) + psf_log_syserr (psf, errno) ; + + new_position -= psf->fileoffset ; + + return new_position ; +} /* psf_fseek */ + +/* Win32 */ sf_count_t +psf_fread (void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf) +{ sf_count_t total = 0 ; + ssize_t count ; + + if (psf->virtual_io) + return psf->vio.read (ptr, bytes*items, psf->vio_user_data) / bytes ; + + items *= bytes ; + + /* Do this check after the multiplication above. */ + if (items <= 0) + return 0 ; + + while (items > 0) + { /* Break the writes down to a sensible size. */ + count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : (ssize_t) items ; + + count = read (psf->file.filedes, ((char*) ptr) + total, (size_t) count) ; + + if (count == -1) + { if (errno == EINTR) + continue ; + + psf_log_syserr (psf, errno) ; + break ; + } ; + + if (count == 0) + break ; + + total += count ; + items -= count ; + } ; + + return total / bytes ; +} /* psf_fread */ + +/* Win32 */ sf_count_t +psf_fwrite (const void *ptr, sf_count_t bytes, sf_count_t items, SF_PRIVATE *psf) +{ sf_count_t total = 0 ; + ssize_t count ; + + if (psf->virtual_io) + return psf->vio.write (ptr, bytes*items, psf->vio_user_data) / bytes ; + + items *= bytes ; + + /* Do this check after the multiplication above. */ + if (items <= 0) + return 0 ; + + while (items > 0) + { /* Break the writes down to a sensible size. */ + count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : items ; + + count = write (psf->file.filedes, ((const char*) ptr) + total, count) ; + + if (count == -1) + { if (errno == EINTR) + continue ; + + psf_log_syserr (psf, errno) ; + break ; + } ; + + if (count == 0) + break ; + + total += count ; + items -= count ; + } ; + + return total / bytes ; +} /* psf_fwrite */ + +/* Win32 */ sf_count_t +psf_ftell (SF_PRIVATE *psf) +{ sf_count_t pos ; + + if (psf->virtual_io) + return psf->vio.tell (psf->vio_user_data) ; + + pos = _telli64 (psf->file.filedes) ; + + if (pos == ((sf_count_t) -1)) + { psf_log_syserr (psf, errno) ; + return -1 ; + } ; + + return pos - psf->fileoffset ; +} /* psf_ftell */ + +/* Win32 */ int +psf_fclose (SF_PRIVATE *psf) +{ int retval ; + + while ((retval = close (psf->file.filedes)) == -1 && errno == EINTR) + /* Do nothing. */ ; + + if (retval == -1) + psf_log_syserr (psf, errno) ; + + psf->file.filedes = -1 ; + + return retval ; +} /* psf_fclose */ + +/* Win32 */ sf_count_t +psf_fgets (char *buffer, sf_count_t bufsize, SF_PRIVATE *psf) +{ sf_count_t k = 0 ; + sf_count_t count ; + + while (k < bufsize - 1) + { count = read (psf->file.filedes, &(buffer [k]), 1) ; + + if (count == -1) + { if (errno == EINTR) + continue ; + + psf_log_syserr (psf, errno) ; + break ; + } ; + + if (count == 0 || buffer [k++] == '\n') + break ; + } ; + + buffer [k] = 0 ; + + return k ; +} /* psf_fgets */ + +/* Win32 */ int +psf_is_pipe (SF_PRIVATE *psf) +{ struct stat statbuf ; + + if (psf->virtual_io) + return SF_FALSE ; + + /* Not sure if this works. */ + if (fstat (psf->file.filedes, &statbuf) == -1) + { psf_log_syserr (psf, errno) ; + /* Default to maximum safety. */ + return SF_TRUE ; + } ; + + /* These macros are defined in Win32/unistd.h. */ + if (S_ISFIFO (statbuf.st_mode) || S_ISSOCK (statbuf.st_mode)) + return SF_TRUE ; + + return SF_FALSE ; +} /* psf_checkpipe */ + +/* Win32 */ sf_count_t +psf_get_filelen (SF_PRIVATE *psf) +{ +#if 0 + /* + ** Windoze is SOOOOO FUCKED!!!!!!! + ** This code should work but doesn't. Why? + ** Code below does work. + */ + struct _stati64 statbuf ; + + if (_fstati64 (psf->file.filedes, &statbuf)) + { psf_log_syserr (psf, errno) ; + return (sf_count_t) -1 ; + } ; + + return statbuf.st_size ; +#else + sf_count_t current, filelen ; + + if (psf->virtual_io) + return psf->vio.get_filelen (psf->vio_user_data) ; + + if ((current = _telli64 (psf->file.filedes)) < 0) + { psf_log_syserr (psf, errno) ; + return (sf_count_t) -1 ; + } ; + + /* + ** Lets face it, windoze if FUBAR!!! + ** + ** For some reason, I have to call _lseeki64() TWICE to get to the + ** end of the file. + ** + ** This might have been avoided if windows had implemented the POSIX + ** standard function fsync() but NO, that would have been too easy. + ** + ** I am VERY close to saying that windoze will no longer be supported + ** by libsndfile and changing the license to GPL at the same time. + */ + + _lseeki64 (psf->file.filedes, 0, SEEK_END) ; + + if ((filelen = _lseeki64 (psf->file.filedes, 0, SEEK_END)) < 0) + { psf_log_syserr (psf, errno) ; + return (sf_count_t) -1 ; + } ; + + if (filelen > current) + _lseeki64 (psf->file.filedes, current, SEEK_SET) ; + + switch (psf->file.mode) + { case SFM_WRITE : + filelen = filelen - psf->fileoffset ; + break ; + + case SFM_READ : + if (psf->fileoffset > 0 && psf->filelength > 0) + filelen = psf->filelength ; + break ; + + case SFM_RDWR : + /* + ** Cannot open embedded files SFM_RDWR so we don't need to + ** subtract psf->fileoffset. We already have the answer we + ** need. + */ + break ; + + default : + filelen = 0 ; + } ; + + return filelen ; +#endif +} /* psf_get_filelen */ + +/* Win32 */ int +psf_ftruncate (SF_PRIVATE *psf, sf_count_t len) +{ int retval ; + + /* Returns 0 on success, non-zero on failure. */ + if (len < 0) + return 1 ; + + /* The global village idiots at micorsoft decided to implement + ** nearly all the required 64 bit file offset functions except + ** for one, truncate. The fscking morons! + ** + ** This is not 64 bit file offset clean. Somone needs to clean + ** this up. + */ + if (len > 0x7FFFFFFF) + return -1 ; + + retval = chsize (psf->file.filedes, len) ; + + if (retval == -1) + psf_log_syserr (psf, errno) ; + + return retval ; +} /* psf_ftruncate */ + + +static void +psf_log_syserr (SF_PRIVATE *psf, int error) +{ + /* Only log an error if no error has been set yet. */ + if (psf->error == 0) + { psf->error = SFE_SYSTEM ; + snprintf (psf->syserr, sizeof (psf->syserr), "System error : %s", strerror (error)) ; + } ; + + return ; +} /* psf_log_syserr */ + +#endif + diff --git a/libsndfile-1.0.31/src/flac.c b/libsndfile-1.0.31/src/flac.c new file mode 100644 index 0000000..e332045 --- /dev/null +++ b/libsndfile-1.0.31/src/flac.c @@ -0,0 +1,1454 @@ +/* +** Copyright (C) 2004-2017 Erik de Castro Lopo +** Copyright (C) 2004 Tobias Gehrig +** +** This program is free software ; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation ; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY ; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include +#include + +#include "sndfile.h" +#include "common.h" + +#if HAVE_EXTERNAL_XIPH_LIBS + +#include +#include +#include + +/*------------------------------------------------------------------------------ +** Private static functions. +*/ + +#define FLAC_DEFAULT_COMPRESSION_LEVEL 5 + +#define ENC_BUFFER_SIZE 8192 + +typedef enum +{ PFLAC_PCM_SHORT = 50, + PFLAC_PCM_INT = 51, + PFLAC_PCM_FLOAT = 52, + PFLAC_PCM_DOUBLE = 53 +} PFLAC_PCM ; + +typedef struct +{ + FLAC__StreamDecoder *fsd ; + FLAC__StreamEncoder *fse ; + + PFLAC_PCM pcmtype ; + void* ptr ; + unsigned pos, len, remain ; + + FLAC__StreamMetadata *metadata ; + + const int32_t * const * wbuffer ; + int32_t * rbuffer [FLAC__MAX_CHANNELS] ; + + int32_t* encbuffer ; + unsigned bufferpos ; + + const FLAC__Frame *frame ; + + unsigned compression ; + +} FLAC_PRIVATE ; + +typedef struct +{ const char *tag ; + int type ; +} FLAC_TAG ; + +static sf_count_t flac_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; +static int flac_byterate (SF_PRIVATE *psf) ; +static int flac_close (SF_PRIVATE *psf) ; + +static int flac_enc_init (SF_PRIVATE *psf) ; +static int flac_read_header (SF_PRIVATE *psf) ; + +static sf_count_t flac_read_flac2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t flac_read_flac2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t flac_read_flac2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t flac_read_flac2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t flac_write_s2flac (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t flac_write_i2flac (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t flac_write_f2flac (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t flac_write_d2flac (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +static void f2flac8_array (const float *src, int32_t *dest, int count, int normalize) ; +static void f2flac16_array (const float *src, int32_t *dest, int count, int normalize) ; +static void f2flac24_array (const float *src, int32_t *dest, int count, int normalize) ; +static void f2flac8_clip_array (const float *src, int32_t *dest, int count, int normalize) ; +static void f2flac16_clip_array (const float *src, int32_t *dest, int count, int normalize) ; +static void f2flac24_clip_array (const float *src, int32_t *dest, int count, int normalize) ; +static void d2flac8_array (const double *src, int32_t *dest, int count, int normalize) ; +static void d2flac16_array (const double *src, int32_t *dest, int count, int normalize) ; +static void d2flac24_array (const double *src, int32_t *dest, int count, int normalize) ; +static void d2flac8_clip_array (const double *src, int32_t *dest, int count, int normalize) ; +static void d2flac16_clip_array (const double *src, int32_t *dest, int count, int normalize) ; +static void d2flac24_clip_array (const double *src, int32_t *dest, int count, int normalize) ; + +static int flac_command (SF_PRIVATE *psf, int command, void *data, int datasize) ; + +/* Decoder Callbacks */ +static FLAC__StreamDecoderReadStatus sf_flac_read_callback (const FLAC__StreamDecoder *decoder, FLAC__byte buffer [], size_t *bytes, void *client_data) ; +static FLAC__StreamDecoderSeekStatus sf_flac_seek_callback (const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) ; +static FLAC__StreamDecoderTellStatus sf_flac_tell_callback (const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) ; +static FLAC__StreamDecoderLengthStatus sf_flac_length_callback (const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) ; +static FLAC__bool sf_flac_eof_callback (const FLAC__StreamDecoder *decoder, void *client_data) ; +static FLAC__StreamDecoderWriteStatus sf_flac_write_callback (const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const int32_t * const buffer [], void *client_data) ; +static void sf_flac_meta_callback (const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) ; +static void sf_flac_error_callback (const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) ; + +/* Encoder Callbacks */ +static FLAC__StreamEncoderSeekStatus sf_flac_enc_seek_callback (const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) ; +static FLAC__StreamEncoderTellStatus sf_flac_enc_tell_callback (const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) ; +static FLAC__StreamEncoderWriteStatus sf_flac_enc_write_callback (const FLAC__StreamEncoder *encoder, const FLAC__byte buffer [], size_t bytes, unsigned samples, unsigned current_frame, void *client_data) ; + +static void +s2flac8_array (const short *src, int32_t *dest, int count) +{ while (--count >= 0) + dest [count] = src [count] >> 8 ; +} /* s2flac8_array */ + +static void +s2flac16_array (const short *src, int32_t *dest, int count) +{ while (--count >= 0) + dest [count] = src [count] ; +} /* s2flac16_array */ + +static void +s2flac24_array (const short *src, int32_t *dest, int count) +{ while (--count >= 0) + dest [count] = src [count] << 8 ; +} /* s2flac24_array */ + +static void +i2flac8_array (const int *src, int32_t *dest, int count) +{ while (--count >= 0) + dest [count] = src [count] >> 24 ; +} /* i2flac8_array */ + +static void +i2flac16_array (const int *src, int32_t *dest, int count) +{ + while (--count >= 0) + dest [count] = src [count] >> 16 ; +} /* i2flac16_array */ + +static void +i2flac24_array (const int *src, int32_t *dest, int count) +{ while (--count >= 0) + dest [count] = src [count] >> 8 ; +} /* i2flac24_array */ + +static sf_count_t +flac_buffer_copy (SF_PRIVATE *psf) +{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; + const FLAC__Frame *frame = pflac->frame ; + const int32_t* const *buffer = pflac->wbuffer ; + unsigned i = 0, j, offset, channels, len ; + + if (psf->sf.channels != (int) frame->header.channels) + { psf_log_printf (psf, "Error: FLAC frame changed from %d to %d channels\n" + "Nothing to do but to error out.\n" , + psf->sf.channels, frame->header.channels) ; + psf->error = SFE_FLAC_CHANNEL_COUNT_CHANGED ; + return 0 ; + } ; + + /* + ** frame->header.blocksize is variable and we're using a constant blocksize + ** of FLAC__MAX_BLOCK_SIZE. + ** Check our assumptions here. + */ + if (frame->header.blocksize > FLAC__MAX_BLOCK_SIZE) + { psf_log_printf (psf, "Ooops : frame->header.blocksize (%d) > FLAC__MAX_BLOCK_SIZE (%d)\n", __func__, __LINE__, frame->header.blocksize, FLAC__MAX_BLOCK_SIZE) ; + psf->error = SFE_INTERNAL ; + return 0 ; + } ; + + if (frame->header.channels > FLAC__MAX_CHANNELS) + psf_log_printf (psf, "Ooops : frame->header.channels (%d) > FLAC__MAX_BLOCK_SIZE (%d)\n", __func__, __LINE__, frame->header.channels, FLAC__MAX_CHANNELS) ; + + channels = SF_MIN (frame->header.channels, FLAC__MAX_CHANNELS) ; + + if (pflac->ptr == NULL) + { /* + ** This pointer is reset to NULL each time the current frame has been + ** decoded. Somehow its used during encoding and decoding. + */ + for (i = 0 ; i < channels ; i++) + { + if (pflac->rbuffer [i] == NULL) + pflac->rbuffer [i] = calloc (FLAC__MAX_BLOCK_SIZE, sizeof (int32_t)) ; + + memcpy (pflac->rbuffer [i], buffer [i], frame->header.blocksize * sizeof (int32_t)) ; + } ; + pflac->wbuffer = (const int32_t* const*) pflac->rbuffer ; + + return 0 ; + } ; + + len = SF_MIN (pflac->len, frame->header.blocksize) ; + + if (pflac->remain % channels != 0) + { psf_log_printf (psf, "Error: pflac->remain %u channels %u\n", pflac->remain, channels) ; + return 0 ; + } ; + + switch (pflac->pcmtype) + { case PFLAC_PCM_SHORT : + { short *retpcm = (short*) pflac->ptr ; + int shift = 16 - frame->header.bits_per_sample ; + if (shift < 0) + { shift = abs (shift) ; + for (i = 0 ; i < len && pflac->remain > 0 ; i++) + { offset = pflac->pos + i * channels ; + + if (pflac->bufferpos >= frame->header.blocksize) + break ; + + if (offset + channels > pflac->len) + break ; + + for (j = 0 ; j < channels ; j++) + retpcm [offset + j] = buffer [j][pflac->bufferpos] >> shift ; + pflac->remain -= channels ; + pflac->bufferpos ++ ; + } + } + else + { for (i = 0 ; i < len && pflac->remain > 0 ; i++) + { offset = pflac->pos + i * channels ; + + if (pflac->bufferpos >= frame->header.blocksize) + break ; + + if (offset + channels > pflac->len) + break ; + + for (j = 0 ; j < channels ; j++) + retpcm [offset + j] = ((uint16_t) buffer [j][pflac->bufferpos]) << shift ; + + pflac->remain -= channels ; + pflac->bufferpos ++ ; + } ; + } ; + } ; + break ; + + case PFLAC_PCM_INT : + { int *retpcm = (int*) pflac->ptr ; + int shift = 32 - frame->header.bits_per_sample ; + for (i = 0 ; i < len && pflac->remain > 0 ; i++) + { offset = pflac->pos + i * channels ; + + if (pflac->bufferpos >= frame->header.blocksize) + break ; + + if (offset + channels > pflac->len) + break ; + + for (j = 0 ; j < channels ; j++) + retpcm [offset + j] = ((uint32_t) buffer [j][pflac->bufferpos]) << shift ; + pflac->remain -= channels ; + pflac->bufferpos++ ; + } ; + } ; + break ; + + case PFLAC_PCM_FLOAT : + { float *retpcm = (float*) pflac->ptr ; + float norm = (psf->norm_float == SF_TRUE) ? 1.0 / (1 << (frame->header.bits_per_sample - 1)) : 1.0 ; + + for (i = 0 ; i < len && pflac->remain > 0 ; i++) + { offset = pflac->pos + i * channels ; + + if (pflac->bufferpos >= frame->header.blocksize) + break ; + + if (offset + channels > pflac->len) + break ; + + for (j = 0 ; j < channels ; j++) + retpcm [offset + j] = buffer [j][pflac->bufferpos] * norm ; + pflac->remain -= channels ; + pflac->bufferpos++ ; + } ; + } ; + break ; + + case PFLAC_PCM_DOUBLE : + { double *retpcm = (double*) pflac->ptr ; + double norm = (psf->norm_double == SF_TRUE) ? 1.0 / (1 << (frame->header.bits_per_sample - 1)) : 1.0 ; + + for (i = 0 ; i < len && pflac->remain > 0 ; i++) + { offset = pflac->pos + i * channels ; + + if (pflac->bufferpos >= frame->header.blocksize) + break ; + + if (offset + channels > pflac->len) + break ; + + for (j = 0 ; j < channels ; j++) + retpcm [offset + j] = buffer [j][pflac->bufferpos] * norm ; + pflac->remain -= channels ; + pflac->bufferpos++ ; + } ; + } ; + break ; + + default : + return 0 ; + } ; + + offset = i * channels ; + pflac->pos += i * channels ; + + return offset ; +} /* flac_buffer_copy */ + + +static FLAC__StreamDecoderReadStatus +sf_flac_read_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__byte buffer [], size_t *bytes, void *client_data) +{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; + + *bytes = psf_fread (buffer, 1, *bytes, psf) ; + if (*bytes > 0 && psf->error == 0) + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE ; + + return FLAC__STREAM_DECODER_READ_STATUS_ABORT ; +} /* sf_flac_read_callback */ + +static FLAC__StreamDecoderSeekStatus +sf_flac_seek_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__uint64 absolute_byte_offset, void *client_data) +{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; + + psf_fseek (psf, absolute_byte_offset, SEEK_SET) ; + if (psf->error) + return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR ; + + return FLAC__STREAM_DECODER_SEEK_STATUS_OK ; +} /* sf_flac_seek_callback */ + +static FLAC__StreamDecoderTellStatus +sf_flac_tell_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__uint64 *absolute_byte_offset, void *client_data) +{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; + + *absolute_byte_offset = psf_ftell (psf) ; + if (psf->error) + return FLAC__STREAM_DECODER_TELL_STATUS_ERROR ; + + return FLAC__STREAM_DECODER_TELL_STATUS_OK ; +} /* sf_flac_tell_callback */ + +static FLAC__StreamDecoderLengthStatus +sf_flac_length_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__uint64 *stream_length, void *client_data) +{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; + + if ((*stream_length = psf->filelength) == 0) + return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR ; + + return FLAC__STREAM_DECODER_LENGTH_STATUS_OK ; +} /* sf_flac_length_callback */ + +static FLAC__bool +sf_flac_eof_callback (const FLAC__StreamDecoder *UNUSED (decoder), void *client_data) +{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; + + if (psf_ftell (psf) == psf->filelength) + return SF_TRUE ; + + return SF_FALSE ; +} /* sf_flac_eof_callback */ + +static FLAC__StreamDecoderWriteStatus +sf_flac_write_callback (const FLAC__StreamDecoder * UNUSED (decoder), const FLAC__Frame *frame, const int32_t * const buffer [], void *client_data) +{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; + FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; + + pflac->frame = frame ; + pflac->bufferpos = 0 ; + + pflac->wbuffer = buffer ; + + flac_buffer_copy (psf) ; + + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE ; +} /* sf_flac_write_callback */ + +static void +sf_flac_meta_get_vorbiscomments (SF_PRIVATE *psf, const FLAC__StreamMetadata *metadata) +{ static FLAC_TAG tags [] = + { { "title", SF_STR_TITLE }, + { "copyright", SF_STR_COPYRIGHT }, + { "software", SF_STR_SOFTWARE }, + { "artist", SF_STR_ARTIST }, + { "comment", SF_STR_COMMENT }, + { "date", SF_STR_DATE }, + { "album", SF_STR_ALBUM }, + { "license", SF_STR_LICENSE }, + { "tracknumber", SF_STR_TRACKNUMBER }, + { "genre", SF_STR_GENRE } + } ; + + const char *value, *cptr ; + int k, tag_num ; + + for (k = 0 ; k < ARRAY_LEN (tags) ; k++) + { tag_num = FLAC__metadata_object_vorbiscomment_find_entry_from (metadata, 0, tags [k].tag) ; + + if (tag_num < 0) + continue ; + + value = (const char*) metadata->data.vorbis_comment.comments [tag_num].entry ; + if ((cptr = strchr (value, '=')) != NULL) + value = cptr + 1 ; + + psf_log_printf (psf, " %-12s : %s\n", tags [k].tag, value) ; + psf_store_string (psf, tags [k].type, value) ; + } ; + + return ; +} /* sf_flac_meta_get_vorbiscomments */ + +static void +sf_flac_meta_callback (const FLAC__StreamDecoder * UNUSED (decoder), const FLAC__StreamMetadata *metadata, void *client_data) +{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; + int bitwidth = 0 ; + + switch (metadata->type) + { case FLAC__METADATA_TYPE_STREAMINFO : + if (psf->sf.channels > 0 && psf->sf.channels != (int) metadata->data.stream_info.channels) + { psf_log_printf (psf, "Error: FLAC stream changed from %d to %d channels\n" + "Nothing to do but to error out.\n" , + psf->sf.channels, metadata->data.stream_info.channels) ; + psf->error = SFE_FLAC_CHANNEL_COUNT_CHANGED ; + return ; + } ; + + if (psf->sf.channels > 0 && psf->sf.samplerate != (int) metadata->data.stream_info.sample_rate) + { psf_log_printf (psf, "Warning: FLAC stream changed sample rates from %d to %d.\n" + "Carrying on as if nothing happened.", + psf->sf.samplerate, metadata->data.stream_info.sample_rate) ; + } ; + psf->sf.channels = metadata->data.stream_info.channels ; + psf->sf.samplerate = metadata->data.stream_info.sample_rate ; + psf->sf.frames = metadata->data.stream_info.total_samples ; + + psf_log_printf (psf, "FLAC Stream Metadata\n Channels : %d\n Sample rate : %d\n", psf->sf.channels, psf->sf.samplerate) ; + + if (psf->sf.frames == 0) + { psf_log_printf (psf, " Frames : 0 (bumping to SF_COUNT_MAX)\n") ; + psf->sf.frames = SF_COUNT_MAX ; + } + else + psf_log_printf (psf, " Frames : %D\n", psf->sf.frames) ; + + switch (metadata->data.stream_info.bits_per_sample) + { case 8 : + psf->sf.format |= SF_FORMAT_PCM_S8 ; + bitwidth = 8 ; + break ; + case 16 : + psf->sf.format |= SF_FORMAT_PCM_16 ; + bitwidth = 16 ; + break ; + case 24 : + psf->sf.format |= SF_FORMAT_PCM_24 ; + bitwidth = 24 ; + break ; + default : + psf_log_printf (psf, "sf_flac_meta_callback : bits_per_sample %d not yet implemented.\n", metadata->data.stream_info.bits_per_sample) ; + break ; + } ; + + if (bitwidth > 0) + psf_log_printf (psf, " Bit width : %d\n", bitwidth) ; + break ; + + case FLAC__METADATA_TYPE_VORBIS_COMMENT : + psf_log_printf (psf, "Vorbis Comment Metadata\n") ; + sf_flac_meta_get_vorbiscomments (psf, metadata) ; + break ; + + case FLAC__METADATA_TYPE_PADDING : + psf_log_printf (psf, "Padding Metadata\n") ; + break ; + + case FLAC__METADATA_TYPE_APPLICATION : + psf_log_printf (psf, "Application Metadata\n") ; + break ; + + case FLAC__METADATA_TYPE_SEEKTABLE : + psf_log_printf (psf, "Seektable Metadata\n") ; + break ; + + case FLAC__METADATA_TYPE_CUESHEET : + psf_log_printf (psf, "Cuesheet Metadata\n") ; + break ; + + case FLAC__METADATA_TYPE_PICTURE : + psf_log_printf (psf, "Picture Metadata\n") ; + break ; + + case FLAC__METADATA_TYPE_UNDEFINED : + psf_log_printf (psf, "Undefined Metadata\n") ; + break ; + + default : + psf_log_printf (psf, "sf_flac_meta_callback : metadata-type %d not yet implemented.\n", metadata->type) ; + break ; + } ; + + return ; +} /* sf_flac_meta_callback */ + +static void +sf_flac_error_callback (const FLAC__StreamDecoder * UNUSED (decoder), FLAC__StreamDecoderErrorStatus status, void *client_data) +{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; + + psf_log_printf (psf, "ERROR : %s\n", FLAC__StreamDecoderErrorStatusString [status]) ; + + switch (status) + { case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC : + psf->error = SFE_FLAC_LOST_SYNC ; + break ; + case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER : + psf->error = SFE_FLAC_BAD_HEADER ; + break ; + default : + psf->error = SFE_FLAC_UNKOWN_ERROR ; + break ; + } ; + + return ; +} /* sf_flac_error_callback */ + +static FLAC__StreamEncoderSeekStatus +sf_flac_enc_seek_callback (const FLAC__StreamEncoder * UNUSED (encoder), FLAC__uint64 absolute_byte_offset, void *client_data) +{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; + + psf_fseek (psf, absolute_byte_offset, SEEK_SET) ; + if (psf->error) + return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR ; + + return FLAC__STREAM_ENCODER_SEEK_STATUS_OK ; +} /* sf_flac_enc_seek_callback */ + +static FLAC__StreamEncoderTellStatus +sf_flac_enc_tell_callback (const FLAC__StreamEncoder *UNUSED (encoder), FLAC__uint64 *absolute_byte_offset, void *client_data) +{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; + + *absolute_byte_offset = psf_ftell (psf) ; + if (psf->error) + return FLAC__STREAM_ENCODER_TELL_STATUS_ERROR ; + + return FLAC__STREAM_ENCODER_TELL_STATUS_OK ; +} /* sf_flac_enc_tell_callback */ + +static FLAC__StreamEncoderWriteStatus +sf_flac_enc_write_callback (const FLAC__StreamEncoder * UNUSED (encoder), const FLAC__byte buffer [], size_t bytes, unsigned UNUSED (samples), unsigned UNUSED (current_frame), void *client_data) +{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; + + if (psf_fwrite (buffer, 1, bytes, psf) == (sf_count_t) bytes && psf->error == 0) + return FLAC__STREAM_ENCODER_WRITE_STATUS_OK ; + + return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR ; +} /* sf_flac_enc_write_callback */ + +static void +flac_write_strings (SF_PRIVATE *psf, FLAC_PRIVATE* pflac) +{ FLAC__StreamMetadata_VorbisComment_Entry entry ; + int k, string_count = 0 ; + + for (k = 0 ; k < SF_MAX_STRINGS ; k++) + { if (psf->strings.data [k].type != 0) + string_count ++ ; + } ; + + if (string_count == 0) + return ; + + if (pflac->metadata == NULL && (pflac->metadata = FLAC__metadata_object_new (FLAC__METADATA_TYPE_VORBIS_COMMENT)) == NULL) + { psf_log_printf (psf, "FLAC__metadata_object_new returned NULL\n") ; + return ; + } ; + + for (k = 0 ; k < SF_MAX_STRINGS && psf->strings.data [k].type != 0 ; k++) + { const char * key, * value ; + + switch (psf->strings.data [k].type) + { case SF_STR_SOFTWARE : + key = "software" ; + break ; + case SF_STR_TITLE : + key = "title" ; + break ; + case SF_STR_COPYRIGHT : + key = "copyright" ; + break ; + case SF_STR_ARTIST : + key = "artist" ; + break ; + case SF_STR_COMMENT : + key = "comment" ; + break ; + case SF_STR_DATE : + key = "date" ; + break ; + case SF_STR_ALBUM : + key = "album" ; + break ; + case SF_STR_LICENSE : + key = "license" ; + break ; + case SF_STR_TRACKNUMBER : + key = "tracknumber" ; + break ; + case SF_STR_GENRE : + key = "genre" ; + break ; + default : + continue ; + } ; + + value = psf->strings.storage + psf->strings.data [k].offset ; + + FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair (&entry, key, value) ; + FLAC__metadata_object_vorbiscomment_append_comment (pflac->metadata, entry, /* copy */ SF_FALSE) ; + } ; + + if (! FLAC__stream_encoder_set_metadata (pflac->fse, &pflac->metadata, 1)) + { printf ("%s %d : fail\n", __func__, __LINE__) ; + return ; + } ; + + return ; +} /* flac_write_strings */ + +static int +flac_write_header (SF_PRIVATE *psf, int UNUSED (calc_length)) +{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; + int err ; + + flac_write_strings (psf, pflac) ; + + if ((err = FLAC__stream_encoder_init_stream (pflac->fse, sf_flac_enc_write_callback, sf_flac_enc_seek_callback, sf_flac_enc_tell_callback, NULL, psf)) != FLAC__STREAM_DECODER_INIT_STATUS_OK) + { psf_log_printf (psf, "Error : FLAC encoder init returned error : %s\n", FLAC__StreamEncoderInitStatusString [err]) ; + return SFE_FLAC_INIT_DECODER ; + } ; + + if (psf->error == 0) + psf->dataoffset = psf_ftell (psf) ; + pflac->encbuffer = calloc (ENC_BUFFER_SIZE, sizeof (int32_t)) ; + + /* can only call init_stream once */ + psf->write_header = NULL ; + + return psf->error ; +} /* flac_write_header */ + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +flac_open (SF_PRIVATE *psf) +{ int subformat ; + int error = 0 ; + + FLAC_PRIVATE* pflac = calloc (1, sizeof (FLAC_PRIVATE)) ; + psf->codec_data = pflac ; + + /* Set the default value here. Over-ridden later if necessary. */ + pflac->compression = FLAC_DEFAULT_COMPRESSION_LEVEL ; + + if (psf->file.mode == SFM_RDWR) + return SFE_BAD_MODE_RW ; + + if (psf->file.mode == SFM_READ) + { if ((error = flac_read_header (psf))) + return error ; + } ; + + subformat = SF_CODEC (psf->sf.format) ; + + if (psf->file.mode == SFM_WRITE) + { if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_FLAC) + return SFE_BAD_OPEN_FORMAT ; + + psf->endian = SF_ENDIAN_BIG ; + psf->sf.seekable = 0 ; + + psf->strings.flags = SF_STR_ALLOW_START ; + + if ((error = flac_enc_init (psf))) + return error ; + + /* In an ideal world we would write the header at this point. Unfortunately + ** that would prevent string metadata being added so we have to hold off. + */ + + psf->write_header = flac_write_header ; + } ; + + psf->datalength = psf->filelength ; + psf->dataoffset = 0 ; + + psf->container_close = flac_close ; + psf->seek = flac_seek ; + psf->byterate = flac_byterate ; + + psf->command = flac_command ; + + switch (subformat) + { case SF_FORMAT_PCM_S8 : /* 8-bit FLAC. */ + case SF_FORMAT_PCM_16 : /* 16-bit FLAC. */ + case SF_FORMAT_PCM_24 : /* 24-bit FLAC. */ + error = flac_init (psf) ; + break ; + + default : return SFE_UNIMPLEMENTED ; + } ; + + return error ; +} /* flac_open */ + +/*------------------------------------------------------------------------------ +*/ + +static int +flac_close (SF_PRIVATE *psf) +{ FLAC_PRIVATE* pflac ; + int k ; + + if ((pflac = (FLAC_PRIVATE*) psf->codec_data) == NULL) + return 0 ; + + if (pflac->metadata != NULL) + FLAC__metadata_object_delete (pflac->metadata) ; + + if (psf->file.mode == SFM_WRITE) + { FLAC__stream_encoder_finish (pflac->fse) ; + FLAC__stream_encoder_delete (pflac->fse) ; + free (pflac->encbuffer) ; + } ; + + if (psf->file.mode == SFM_READ) + { FLAC__stream_decoder_finish (pflac->fsd) ; + FLAC__stream_decoder_delete (pflac->fsd) ; + } ; + + for (k = 0 ; k < ARRAY_LEN (pflac->rbuffer) ; k++) + free (pflac->rbuffer [k]) ; + + free (pflac) ; + psf->codec_data = NULL ; + + return 0 ; +} /* flac_close */ + +static int +flac_enc_init (SF_PRIVATE *psf) +{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; + unsigned bps ; + + /* To cite the flac FAQ at + ** http://flac.sourceforge.net/faq.html#general__samples + ** "FLAC supports linear sample rates from 1Hz - 655350Hz in 1Hz + ** increments." + */ + if (psf->sf.samplerate < 1 || psf->sf.samplerate > 655350) + { psf_log_printf (psf, "flac sample rate out of range.\n", psf->sf.samplerate) ; + return SFE_FLAC_BAD_SAMPLE_RATE ; + } ; + + psf_fseek (psf, 0, SEEK_SET) ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_PCM_S8 : + bps = 8 ; + break ; + case SF_FORMAT_PCM_16 : + bps = 16 ; + break ; + case SF_FORMAT_PCM_24 : + bps = 24 ; + break ; + + default : + bps = 0 ; + break ; + } ; + + if (pflac->fse) + FLAC__stream_encoder_delete (pflac->fse) ; + if ((pflac->fse = FLAC__stream_encoder_new ()) == NULL) + return SFE_FLAC_NEW_DECODER ; + + if (! FLAC__stream_encoder_set_channels (pflac->fse, psf->sf.channels)) + { psf_log_printf (psf, "FLAC__stream_encoder_set_channels (%d) return false.\n", psf->sf.channels) ; + return SFE_FLAC_INIT_DECODER ; + } ; + + if (! FLAC__stream_encoder_set_sample_rate (pflac->fse, psf->sf.samplerate)) + { psf_log_printf (psf, "FLAC__stream_encoder_set_sample_rate (%d) returned false.\n", psf->sf.samplerate) ; + return SFE_FLAC_BAD_SAMPLE_RATE ; + } ; + + if (! FLAC__stream_encoder_set_bits_per_sample (pflac->fse, bps)) + { psf_log_printf (psf, "FLAC__stream_encoder_set_bits_per_sample (%d) return false.\n", bps) ; + return SFE_FLAC_INIT_DECODER ; + } ; + + if (! FLAC__stream_encoder_set_compression_level (pflac->fse, pflac->compression)) + { psf_log_printf (psf, "FLAC__stream_encoder_set_compression_level (%d) return false.\n", pflac->compression) ; + return SFE_FLAC_INIT_DECODER ; + } ; + + return 0 ; +} /* flac_enc_init */ + +static int +flac_read_header (SF_PRIVATE *psf) +{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; + + psf_fseek (psf, 0, SEEK_SET) ; + if (pflac->fsd) + FLAC__stream_decoder_delete (pflac->fsd) ; + if ((pflac->fsd = FLAC__stream_decoder_new ()) == NULL) + return SFE_FLAC_NEW_DECODER ; + + FLAC__stream_decoder_set_metadata_respond_all (pflac->fsd) ; + + if (FLAC__stream_decoder_init_stream (pflac->fsd, sf_flac_read_callback, sf_flac_seek_callback, sf_flac_tell_callback, sf_flac_length_callback, sf_flac_eof_callback, sf_flac_write_callback, sf_flac_meta_callback, sf_flac_error_callback, psf) != FLAC__STREAM_DECODER_INIT_STATUS_OK) + return SFE_FLAC_INIT_DECODER ; + + FLAC__stream_decoder_process_until_end_of_metadata (pflac->fsd) ; + + psf_log_printf (psf, "End\n") ; + + if (psf->error != 0) + FLAC__stream_decoder_delete (pflac->fsd) ; + else + { FLAC__uint64 position ; + + FLAC__stream_decoder_get_decode_position (pflac->fsd, &position) ; + psf->dataoffset = position ; + } ; + + return psf->error ; +} /* flac_read_header */ + +static int +flac_command (SF_PRIVATE * psf, int command, void * data, int datasize) +{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; + double quality ; + + switch (command) + { case SFC_SET_COMPRESSION_LEVEL : + if (data == NULL || datasize != sizeof (double)) + return SF_FALSE ; + + if (psf->have_written) + return SF_FALSE ; + + /* FLAC compression level is in the range [0, 8] while libsndfile takes + ** values in the range [0.0, 1.0]. Massage the libsndfile value here. + */ + quality = (*((double *) data)) * 8.0 ; + /* Clip range. */ + pflac->compression = psf_lrint (SF_MAX (0.0, SF_MIN (8.0, quality))) ; + + psf_log_printf (psf, "%s : Setting SFC_SET_COMPRESSION_LEVEL to %u.\n", __func__, pflac->compression) ; + + if (flac_enc_init (psf)) + return SF_FALSE ; + + return SF_TRUE ; + + default : + return SF_FALSE ; + } ; + + return SF_FALSE ; +} /* flac_command */ + +int +flac_init (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_RDWR) + return SFE_BAD_MODE_RW ; + + if (psf->file.mode == SFM_READ) + { psf->read_short = flac_read_flac2s ; + psf->read_int = flac_read_flac2i ; + psf->read_float = flac_read_flac2f ; + psf->read_double = flac_read_flac2d ; + } ; + + if (psf->file.mode == SFM_WRITE) + { psf->write_short = flac_write_s2flac ; + psf->write_int = flac_write_i2flac ; + psf->write_float = flac_write_f2flac ; + psf->write_double = flac_write_d2flac ; + } ; + + if (psf->filelength > psf->dataoffset) + psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : psf->filelength - psf->dataoffset ; + else + psf->datalength = 0 ; + + return 0 ; +} /* flac_init */ + +static unsigned +flac_read_loop (SF_PRIVATE *psf, unsigned len) +{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; + FLAC__StreamDecoderState state ; + + pflac->pos = 0 ; + pflac->len = len ; + pflac->remain = len ; + + state = FLAC__stream_decoder_get_state (pflac->fsd) ; + if (state > FLAC__STREAM_DECODER_END_OF_STREAM) + { psf_log_printf (psf, "FLAC__stream_decoder_get_state returned %s\n", FLAC__StreamDecoderStateString [state]) ; + /* Current frame is busted, so NULL the pointer. */ + pflac->frame = NULL ; + } ; + + /* First copy data that has already been decoded and buffered. */ + if (pflac->frame != NULL && pflac->bufferpos < pflac->frame->header.blocksize) + flac_buffer_copy (psf) ; + + /* Decode some more. */ + while (pflac->pos < pflac->len) + { if (FLAC__stream_decoder_process_single (pflac->fsd) == 0) + { psf_log_printf (psf, "FLAC__stream_decoder_process_single returned false\n") ; + /* Current frame is busted, so NULL the pointer. */ + pflac->frame = NULL ; + break ; + } ; + state = FLAC__stream_decoder_get_state (pflac->fsd) ; + if (state >= FLAC__STREAM_DECODER_END_OF_STREAM) + { psf_log_printf (psf, "FLAC__stream_decoder_get_state returned %s\n", FLAC__StreamDecoderStateString [state]) ; + /* Current frame is busted, so NULL the pointer. */ + pflac->frame = NULL ; + break ; + } ; + } ; + + pflac->ptr = NULL ; + + return pflac->pos ; +} /* flac_read_loop */ + +static sf_count_t +flac_read_flac2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; + sf_count_t total = 0, current ; + unsigned readlen ; + + pflac->pcmtype = PFLAC_PCM_SHORT ; + + while (total < len) + { pflac->ptr = ptr + total ; + readlen = (len - total > 0x1000000) ? 0x1000000 : (unsigned) (len - total) ; + current = flac_read_loop (psf, readlen) ; + if (current == 0) + break ; + total += current ; + } ; + + return total ; +} /* flac_read_flac2s */ + +static sf_count_t +flac_read_flac2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; + sf_count_t total = 0, current ; + unsigned readlen ; + + pflac->pcmtype = PFLAC_PCM_INT ; + + while (total < len) + { pflac->ptr = ptr + total ; + readlen = (len - total > 0x1000000) ? 0x1000000 : (unsigned) (len - total) ; + current = flac_read_loop (psf, readlen) ; + if (current == 0) + break ; + total += current ; + } ; + + return total ; +} /* flac_read_flac2i */ + +static sf_count_t +flac_read_flac2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; + sf_count_t total = 0, current ; + unsigned readlen ; + + pflac->pcmtype = PFLAC_PCM_FLOAT ; + + while (total < len) + { pflac->ptr = ptr + total ; + readlen = (len - total > 0x1000000) ? 0x1000000 : (unsigned) (len - total) ; + current = flac_read_loop (psf, readlen) ; + if (current == 0) + break ; + total += current ; + } ; + + return total ; +} /* flac_read_flac2f */ + +static sf_count_t +flac_read_flac2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; + sf_count_t total = 0, current ; + unsigned readlen ; + + pflac->pcmtype = PFLAC_PCM_DOUBLE ; + + while (total < len) + { pflac->ptr = ptr + total ; + readlen = (len - total > 0x1000000) ? 0x1000000 : (unsigned) (len - total) ; + + current = flac_read_loop (psf, readlen) ; + if (current == 0) + break ; + total += current ; + } ; + + return total ; +} /* flac_read_flac2d */ + +static sf_count_t +flac_write_s2flac (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; + void (*convert) (const short *, int32_t *, int) ; + int bufferlen, writecount, thiswrite ; + sf_count_t total = 0 ; + int32_t* buffer = pflac->encbuffer ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_PCM_S8 : + convert = s2flac8_array ; + break ; + case SF_FORMAT_PCM_16 : + convert = s2flac16_array ; + break ; + case SF_FORMAT_PCM_24 : + convert = s2flac24_array ; + break ; + default : + return -1 ; + } ; + + bufferlen = ENC_BUFFER_SIZE / (sizeof (int32_t) * psf->sf.channels) ; + bufferlen *= psf->sf.channels ; + + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : (int) len ; + convert (ptr + total, buffer, writecount) ; + if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount / psf->sf.channels)) + thiswrite = writecount ; + else + break ; + total += thiswrite ; + if (thiswrite < writecount) + break ; + + len -= thiswrite ; + } ; + + return total ; +} /* flac_write_s2flac */ + +static sf_count_t +flac_write_i2flac (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; + void (*convert) (const int *, int32_t *, int) ; + int bufferlen, writecount, thiswrite ; + sf_count_t total = 0 ; + int32_t* buffer = pflac->encbuffer ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_PCM_S8 : + convert = i2flac8_array ; + break ; + case SF_FORMAT_PCM_16 : + convert = i2flac16_array ; + break ; + case SF_FORMAT_PCM_24 : + convert = i2flac24_array ; + break ; + default : + return -1 ; + } ; + + bufferlen = ENC_BUFFER_SIZE / (sizeof (int32_t) * psf->sf.channels) ; + bufferlen *= psf->sf.channels ; + + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : (int) len ; + convert (ptr + total, buffer, writecount) ; + if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount / psf->sf.channels)) + thiswrite = writecount ; + else + break ; + total += thiswrite ; + if (thiswrite < writecount) + break ; + + len -= thiswrite ; + } ; + + return total ; +} /* flac_write_i2flac */ + +static sf_count_t +flac_write_f2flac (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; + void (*convert) (const float *, int32_t *, int, int) ; + int bufferlen, writecount, thiswrite ; + sf_count_t total = 0 ; + int32_t* buffer = pflac->encbuffer ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_PCM_S8 : + convert = (psf->add_clipping) ? f2flac8_clip_array : f2flac8_array ; + break ; + case SF_FORMAT_PCM_16 : + convert = (psf->add_clipping) ? f2flac16_clip_array : f2flac16_array ; + break ; + case SF_FORMAT_PCM_24 : + convert = (psf->add_clipping) ? f2flac24_clip_array : f2flac24_array ; + break ; + default : + return -1 ; + } ; + + bufferlen = ENC_BUFFER_SIZE / (sizeof (int32_t) * psf->sf.channels) ; + bufferlen *= psf->sf.channels ; + + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : (int) len ; + convert (ptr + total, buffer, writecount, psf->norm_float) ; + if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount / psf->sf.channels)) + thiswrite = writecount ; + else + break ; + total += thiswrite ; + if (thiswrite < writecount) + break ; + + len -= thiswrite ; + } ; + + return total ; +} /* flac_write_f2flac */ + +static void +f2flac8_clip_array (const float *src, int32_t *dest, int count, int normalize) +{ float normfact, scaled_value ; + + normfact = normalize ? (8.0 * 0x10) : 1.0 ; + + while (--count >= 0) + { scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7F)) + { dest [count] = 0x7F ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10)) + { dest [count] = -0x80 ; + continue ; + } ; + dest [count] = psf_lrintf (scaled_value) ; + } ; + + return ; +} /* f2flac8_clip_array */ + +static void +f2flac16_clip_array (const float *src, int32_t *dest, int count, int normalize) +{ float normfact, scaled_value ; + + normfact = normalize ? (8.0 * 0x1000) : 1.0 ; + + while (--count >= 0) + { scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFF)) + { dest [count] = 0x7FFF ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x1000)) + { dest [count] = -0x8000 ; + continue ; + } ; + dest [count] = psf_lrintf (scaled_value) ; + } ; +} /* f2flac16_clip_array */ + +static void +f2flac24_clip_array (const float *src, int32_t *dest, int count, int normalize) +{ float normfact, scaled_value ; + + normfact = normalize ? (8.0 * 0x100000) : 1.0 ; + + while (--count >= 0) + { scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFF)) + { dest [count] = 0x7FFFFF ; + continue ; + } ; + + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x100000)) + { dest [count] = -0x800000 ; + continue ; + } + dest [count] = psf_lrintf (scaled_value) ; + } ; + + return ; +} /* f2flac24_clip_array */ + +static void +f2flac8_array (const float *src, int32_t *dest, int count, int normalize) +{ float normfact = normalize ? (1.0 * 0x7F) : 1.0 ; + + while (--count >= 0) + dest [count] = psf_lrintf (src [count] * normfact) ; +} /* f2flac8_array */ + +static void +f2flac16_array (const float *src, int32_t *dest, int count, int normalize) +{ float normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ; + + while (--count >= 0) + dest [count] = psf_lrintf (src [count] * normfact) ; +} /* f2flac16_array */ + +static void +f2flac24_array (const float *src, int32_t *dest, int count, int normalize) +{ float normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ; + + while (--count >= 0) + dest [count] = psf_lrintf (src [count] * normfact) ; +} /* f2flac24_array */ + +static sf_count_t +flac_write_d2flac (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; + void (*convert) (const double *, int32_t *, int, int) ; + int bufferlen, writecount, thiswrite ; + sf_count_t total = 0 ; + int32_t* buffer = pflac->encbuffer ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_PCM_S8 : + convert = (psf->add_clipping) ? d2flac8_clip_array : d2flac8_array ; + break ; + case SF_FORMAT_PCM_16 : + convert = (psf->add_clipping) ? d2flac16_clip_array : d2flac16_array ; + break ; + case SF_FORMAT_PCM_24 : + convert = (psf->add_clipping) ? d2flac24_clip_array : d2flac24_array ; + break ; + default : + return -1 ; + } ; + + bufferlen = ENC_BUFFER_SIZE / (sizeof (int32_t) * psf->sf.channels) ; + bufferlen *= psf->sf.channels ; + + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : (int) len ; + convert (ptr + total, buffer, writecount, psf->norm_double) ; + if (FLAC__stream_encoder_process_interleaved (pflac->fse, buffer, writecount / psf->sf.channels)) + thiswrite = writecount ; + else + break ; + total += thiswrite ; + if (thiswrite < writecount) + break ; + + len -= thiswrite ; + } ; + + return total ; +} /* flac_write_d2flac */ + +static void +d2flac8_clip_array (const double *src, int32_t *dest, int count, int normalize) +{ double normfact, scaled_value ; + + normfact = normalize ? (8.0 * 0x10) : 1.0 ; + + while (--count >= 0) + { scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7F)) + { dest [count] = 0x7F ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10)) + { dest [count] = -0x80 ; + continue ; + } ; + dest [count] = psf_lrint (scaled_value) ; + } ; + + return ; +} /* d2flac8_clip_array */ + +static void +d2flac16_clip_array (const double *src, int32_t *dest, int count, int normalize) +{ double normfact, scaled_value ; + + normfact = normalize ? (8.0 * 0x1000) : 1.0 ; + + while (--count >= 0) + { scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFF)) + { dest [count] = 0x7FFF ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x1000)) + { dest [count] = -0x8000 ; + continue ; + } ; + dest [count] = psf_lrint (scaled_value) ; + } ; + + return ; +} /* d2flac16_clip_array */ + +static void +d2flac24_clip_array (const double *src, int32_t *dest, int count, int normalize) +{ double normfact, scaled_value ; + + normfact = normalize ? (8.0 * 0x100000) : 1.0 ; + + while (--count >= 0) + { scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFF)) + { dest [count] = 0x7FFFFF ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x100000)) + { dest [count] = -0x800000 ; + continue ; + } ; + dest [count] = psf_lrint (scaled_value) ; + } ; + + return ; +} /* d2flac24_clip_array */ + +static void +d2flac8_array (const double *src, int32_t *dest, int count, int normalize) +{ double normfact = normalize ? (1.0 * 0x7F) : 1.0 ; + + while (--count >= 0) + dest [count] = psf_lrint (src [count] * normfact) ; +} /* d2flac8_array */ + +static void +d2flac16_array (const double *src, int32_t *dest, int count, int normalize) +{ double normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ; + + while (--count >= 0) + dest [count] = psf_lrint (src [count] * normfact) ; +} /* d2flac16_array */ + +static void +d2flac24_array (const double *src, int32_t *dest, int count, int normalize) +{ double normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ; + + while (--count >= 0) + dest [count] = psf_lrint (src [count] * normfact) ; +} /* d2flac24_array */ + +static sf_count_t +flac_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t offset) +{ FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; + + if (pflac == NULL) + return 0 ; + + if (psf->dataoffset < 0) + { psf->error = SFE_BAD_SEEK ; + return ((sf_count_t) -1) ; + } ; + + pflac->frame = NULL ; + + if (psf->file.mode == SFM_READ) + { if (FLAC__stream_decoder_seek_absolute (pflac->fsd, offset)) + return offset ; + + if (offset == psf->sf.frames) + { /* + ** If we've been asked to seek to the very end of the file, libFLAC + ** will return an error. However, we know the length of the file so + ** instead of returning an error, we can return the offset. + */ + return offset ; + } ; + + psf->error = SFE_BAD_SEEK ; + return ((sf_count_t) -1) ; + } ; + + /* Seeking in write mode not yet supported. */ + psf->error = SFE_BAD_SEEK ; + + return ((sf_count_t) -1) ; +} /* flac_seek */ + +static int +flac_byterate (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_READ) + return (psf->datalength * psf->sf.samplerate) / psf->sf.frames ; + + return -1 ; +} /* flac_byterate */ + + +#else /* HAVE_EXTERNAL_XIPH_LIBS */ + +int +flac_open (SF_PRIVATE *psf) +{ + psf_log_printf (psf, "This version of libsndfile was compiled without FLAC support.\n") ; + return SFE_UNIMPLEMENTED ; +} /* flac_open */ + +#endif diff --git a/libsndfile-1.0.31/src/float32.c b/libsndfile-1.0.31/src/float32.c new file mode 100644 index 0000000..a63413d --- /dev/null +++ b/libsndfile-1.0.31/src/float32.c @@ -0,0 +1,1017 @@ +/* +** Copyright (C) 1999-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +#if CPU_IS_LITTLE_ENDIAN + #define FLOAT32_READ float32_le_read + #define FLOAT32_WRITE float32_le_write +#elif CPU_IS_BIG_ENDIAN + #define FLOAT32_READ float32_be_read + #define FLOAT32_WRITE float32_be_write +#endif + +/*-------------------------------------------------------------------------------------------- +** Processor floating point capabilities. float32_get_capability () returns one of the +** latter four values. +*/ + +enum +{ FLOAT_UNKNOWN = 0x00, + FLOAT_CAN_RW_LE = 0x12, + FLOAT_CAN_RW_BE = 0x23, + FLOAT_BROKEN_LE = 0x34, + FLOAT_BROKEN_BE = 0x45 +} ; + +/*-------------------------------------------------------------------------------------------- +** Prototypes for private functions. +*/ + +static sf_count_t host_read_f2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t host_read_f2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t host_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t host_read_f2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t host_write_s2f (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t host_write_i2f (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t host_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t host_write_d2f (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +static void float32_peak_update (SF_PRIVATE *psf, const float *buffer, int count, sf_count_t indx) ; + +static sf_count_t replace_read_f2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t replace_read_f2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t replace_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t replace_read_f2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t replace_write_s2f (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t replace_write_i2f (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t replace_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t replace_write_d2f (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +static void bf2f_array (float *buffer, int count) ; +static void f2bf_array (float *buffer, int count) ; + +static int float32_get_capability (SF_PRIVATE *psf) ; + +/*-------------------------------------------------------------------------------------------- +** Exported functions. +*/ + +int +float32_init (SF_PRIVATE *psf) +{ static int float_caps ; + + if (psf->sf.channels < 1) + { psf_log_printf (psf, "float32_init : internal error : channels = %d\n", psf->sf.channels) ; + return SFE_INTERNAL ; + } ; + + float_caps = float32_get_capability (psf) ; + + psf->blockwidth = sizeof (float) * psf->sf.channels ; + + if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR) + { switch (psf->endian + float_caps) + { case (SF_ENDIAN_BIG + FLOAT_CAN_RW_BE) : + psf->data_endswap = SF_FALSE ; + psf->read_short = host_read_f2s ; + psf->read_int = host_read_f2i ; + psf->read_float = host_read_f ; + psf->read_double = host_read_f2d ; + break ; + + case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_LE) : + psf->data_endswap = SF_FALSE ; + psf->read_short = host_read_f2s ; + psf->read_int = host_read_f2i ; + psf->read_float = host_read_f ; + psf->read_double = host_read_f2d ; + break ; + + case (SF_ENDIAN_BIG + FLOAT_CAN_RW_LE) : + psf->data_endswap = SF_TRUE ; + psf->read_short = host_read_f2s ; + psf->read_int = host_read_f2i ; + psf->read_float = host_read_f ; + psf->read_double = host_read_f2d ; + break ; + + case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_BE) : + psf->data_endswap = SF_TRUE ; + psf->read_short = host_read_f2s ; + psf->read_int = host_read_f2i ; + psf->read_float = host_read_f ; + psf->read_double = host_read_f2d ; + break ; + + /* When the CPU is not IEEE compatible. */ + case (SF_ENDIAN_BIG + FLOAT_BROKEN_LE) : + psf->data_endswap = SF_TRUE ; + psf->read_short = replace_read_f2s ; + psf->read_int = replace_read_f2i ; + psf->read_float = replace_read_f ; + psf->read_double = replace_read_f2d ; + break ; + + case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_LE) : + psf->data_endswap = SF_FALSE ; + psf->read_short = replace_read_f2s ; + psf->read_int = replace_read_f2i ; + psf->read_float = replace_read_f ; + psf->read_double = replace_read_f2d ; + break ; + + case (SF_ENDIAN_BIG + FLOAT_BROKEN_BE) : + psf->data_endswap = SF_FALSE ; + psf->read_short = replace_read_f2s ; + psf->read_int = replace_read_f2i ; + psf->read_float = replace_read_f ; + psf->read_double = replace_read_f2d ; + break ; + + case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_BE) : + psf->data_endswap = SF_TRUE ; + psf->read_short = replace_read_f2s ; + psf->read_int = replace_read_f2i ; + psf->read_float = replace_read_f ; + psf->read_double = replace_read_f2d ; + break ; + + default : break ; + } ; + } ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { switch (psf->endian + float_caps) + { case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_LE) : + psf->data_endswap = SF_FALSE ; + psf->write_short = host_write_s2f ; + psf->write_int = host_write_i2f ; + psf->write_float = host_write_f ; + psf->write_double = host_write_d2f ; + break ; + + case (SF_ENDIAN_BIG + FLOAT_CAN_RW_BE) : + psf->data_endswap = SF_FALSE ; + psf->write_short = host_write_s2f ; + psf->write_int = host_write_i2f ; + psf->write_float = host_write_f ; + psf->write_double = host_write_d2f ; + break ; + + case (SF_ENDIAN_BIG + FLOAT_CAN_RW_LE) : + psf->data_endswap = SF_TRUE ; + psf->write_short = host_write_s2f ; + psf->write_int = host_write_i2f ; + psf->write_float = host_write_f ; + psf->write_double = host_write_d2f ; + break ; + + case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_BE) : + psf->data_endswap = SF_TRUE ; + psf->write_short = host_write_s2f ; + psf->write_int = host_write_i2f ; + psf->write_float = host_write_f ; + psf->write_double = host_write_d2f ; + break ; + + /* When the CPU is not IEEE compatible. */ + case (SF_ENDIAN_BIG + FLOAT_BROKEN_LE) : + psf->data_endswap = SF_TRUE ; + psf->write_short = replace_write_s2f ; + psf->write_int = replace_write_i2f ; + psf->write_float = replace_write_f ; + psf->write_double = replace_write_d2f ; + break ; + + case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_LE) : + psf->data_endswap = SF_FALSE ; + psf->write_short = replace_write_s2f ; + psf->write_int = replace_write_i2f ; + psf->write_float = replace_write_f ; + psf->write_double = replace_write_d2f ; + break ; + + case (SF_ENDIAN_BIG + FLOAT_BROKEN_BE) : + psf->data_endswap = SF_FALSE ; + psf->write_short = replace_write_s2f ; + psf->write_int = replace_write_i2f ; + psf->write_float = replace_write_f ; + psf->write_double = replace_write_d2f ; + break ; + + case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_BE) : + psf->data_endswap = SF_TRUE ; + psf->write_short = replace_write_s2f ; + psf->write_int = replace_write_i2f ; + psf->write_float = replace_write_f ; + psf->write_double = replace_write_d2f ; + break ; + + default : break ; + } ; + } ; + + if (psf->filelength > psf->dataoffset) + { psf->datalength = (psf->dataend > 0) ? psf->dataend - psf->dataoffset : + psf->filelength - psf->dataoffset ; + } + else + psf->datalength = 0 ; + + psf->sf.frames = psf->blockwidth > 0 ? psf->datalength / psf->blockwidth : 0 ; + + return 0 ; +} /* float32_init */ + +float +float32_be_read (const unsigned char *cptr) +{ int exponent, mantissa, negative ; + float fvalue ; + + negative = cptr [0] & 0x80 ; + exponent = ((cptr [0] & 0x7F) << 1) | ((cptr [1] & 0x80) ? 1 : 0) ; + mantissa = ((cptr [1] & 0x7F) << 16) | (cptr [2] << 8) | (cptr [3]) ; + + if (! (exponent || mantissa)) + return 0.0 ; + + mantissa |= 0x800000 ; + exponent = exponent ? exponent - 127 : 0 ; + + fvalue = mantissa ? ((float) mantissa) / ((float) 0x800000) : 0.0 ; + + if (negative) + fvalue *= -1 ; + + if (exponent > 0) + fvalue *= pow (2.0, exponent) ; + else if (exponent < 0) + fvalue /= pow (2.0, abs (exponent)) ; + + return fvalue ; +} /* float32_be_read */ + +float +float32_le_read (const unsigned char *cptr) +{ int exponent, mantissa, negative ; + float fvalue ; + + negative = cptr [3] & 0x80 ; + exponent = ((cptr [3] & 0x7F) << 1) | ((cptr [2] & 0x80) ? 1 : 0) ; + mantissa = ((cptr [2] & 0x7F) << 16) | (cptr [1] << 8) | (cptr [0]) ; + + if (! (exponent || mantissa)) + return 0.0 ; + + mantissa |= 0x800000 ; + exponent = exponent ? exponent - 127 : 0 ; + + fvalue = mantissa ? ((float) mantissa) / ((float) 0x800000) : 0.0 ; + + if (negative) + fvalue *= -1 ; + + if (exponent > 0) + fvalue *= pow (2.0, exponent) ; + else if (exponent < 0) + fvalue /= pow (2.0, abs (exponent)) ; + + return fvalue ; +} /* float32_le_read */ + +void +float32_le_write (float in, unsigned char *out) +{ int exponent, mantissa, negative = 0 ; + + memset (out, 0, sizeof (int)) ; + + if (fabs (in) < 1e-30) + return ; + + if (in < 0.0) + { in *= -1.0 ; + negative = 1 ; + } ; + + in = frexp (in, &exponent) ; + + exponent += 126 ; + + in *= (float) 0x1000000 ; + mantissa = (((int) in) & 0x7FFFFF) ; + + if (negative) + out [3] |= 0x80 ; + + if (exponent & 0x01) + out [2] |= 0x80 ; + + out [0] = mantissa & 0xFF ; + out [1] = (mantissa >> 8) & 0xFF ; + out [2] |= (mantissa >> 16) & 0x7F ; + out [3] |= (exponent >> 1) & 0x7F ; + + return ; +} /* float32_le_write */ + +void +float32_be_write (float in, unsigned char *out) +{ int exponent, mantissa, negative = 0 ; + + memset (out, 0, sizeof (int)) ; + + if (fabs (in) < 1e-30) + return ; + + if (in < 0.0) + { in *= -1.0 ; + negative = 1 ; + } ; + + in = frexp (in, &exponent) ; + + exponent += 126 ; + + in *= (float) 0x1000000 ; + mantissa = (((int) in) & 0x7FFFFF) ; + + if (negative) + out [0] |= 0x80 ; + + if (exponent & 0x01) + out [1] |= 0x80 ; + + out [3] = mantissa & 0xFF ; + out [2] = (mantissa >> 8) & 0xFF ; + out [1] |= (mantissa >> 16) & 0x7F ; + out [0] |= (exponent >> 1) & 0x7F ; + + return ; +} /* float32_be_write */ + +/*============================================================================================== +** Private functions. +*/ + +static void +float32_peak_update (SF_PRIVATE *psf, const float *buffer, int count, sf_count_t indx) +{ int chan ; + int k, position ; + float fmaxval ; + + for (chan = 0 ; chan < psf->sf.channels ; chan++) + { fmaxval = fabs (buffer [chan]) ; + position = 0 ; + for (k = chan ; k < count ; k += psf->sf.channels) + if (fmaxval < fabs (buffer [k])) + { fmaxval = fabs (buffer [k]) ; + position = k ; + } ; + + if (fmaxval > psf->peak_info->peaks [chan].value) + { psf->peak_info->peaks [chan].value = fmaxval ; + psf->peak_info->peaks [chan].position = psf->write_current + indx + (position / psf->sf.channels) ; + } ; + } ; + + return ; +} /* float32_peak_update */ + +static int +float32_get_capability (SF_PRIVATE *psf) +{ union + { float f ; + int i ; + unsigned char c [4] ; + } data ; + + data.f = (float) 1.23456789 ; /* Some abitrary value. */ + + if (! psf->ieee_replace) + { /* If this test is true ints and floats are compatible and little endian. */ + if (data.c [0] == 0x52 && data.c [1] == 0x06 && data.c [2] == 0x9e && data.c [3] == 0x3f) + return FLOAT_CAN_RW_LE ; + + /* If this test is true ints and floats are compatible and big endian. */ + if (data.c [3] == 0x52 && data.c [2] == 0x06 && data.c [1] == 0x9e && data.c [0] == 0x3f) + return FLOAT_CAN_RW_BE ; + } ; + + /* Floats are broken. Don't expect reading or writing to be fast. */ + psf_log_printf (psf, "Using IEEE replacement code for float.\n") ; + + return (CPU_IS_LITTLE_ENDIAN) ? FLOAT_BROKEN_LE : FLOAT_BROKEN_BE ; +} /* float32_get_capability */ + +/*======================================================================================= +*/ + +static void +f2s_array (const float *src, int count, short *dest, float scale) +{ + while (--count >= 0) + { dest [count] = psf_lrintf (scale * src [count]) ; + } ; +} /* f2s_array */ + +static void +f2s_clip_array (const float *src, int count, short *dest, float scale) +{ while (--count >= 0) + { float tmp = scale * src [count] ; + + if (CPU_CLIPS_POSITIVE == 0 && tmp > 32767.0) + dest [count] = SHRT_MAX ; + else if (CPU_CLIPS_NEGATIVE == 0 && tmp < -32768.0) + dest [count] = SHRT_MIN ; + else + dest [count] = psf_lrintf (tmp) ; + } ; +} /* f2s_clip_array */ + +static inline void +f2i_array (const float *src, int count, int *dest, float scale) +{ while (--count >= 0) + { dest [count] = psf_lrintf (scale * src [count]) ; + } ; +} /* f2i_array */ + +static inline void +f2i_clip_array (const float *src, int count, int *dest, float scale) +{ while (--count >= 0) + { float tmp = scale * src [count] ; + + if (CPU_CLIPS_POSITIVE == 0 && tmp > (1.0 * INT_MAX)) + dest [count] = INT_MAX ; + else if (CPU_CLIPS_NEGATIVE == 0 && tmp < (-1.0 * INT_MAX)) + dest [count] = INT_MIN ; + else + dest [count] = psf_lrintf (tmp) ; + } ; +} /* f2i_clip_array */ + +static inline void +f2d_array (const float *src, int count, double *dest) +{ while (--count >= 0) + { dest [count] = src [count] ; + } ; +} /* f2d_array */ + +static inline void +s2f_array (const short *src, float *dest, int count, float scale) +{ while (--count >= 0) + { dest [count] = scale * src [count] ; + } ; +} /* s2f_array */ + +static inline void +i2f_array (const int *src, float *dest, int count, float scale) +{ while (--count >= 0) + { dest [count] = scale * src [count] ; + } ; +} /* i2f_array */ + +static inline void +d2f_array (const double *src, float *dest, int count) +{ while (--count >= 0) + { dest [count] = src [count] ; + } ; +} /* d2f_array */ + +/*---------------------------------------------------------------------------------------------- +*/ + +static sf_count_t +host_read_f2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const float *, int, short *, float) ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + float scale ; + + convert = (psf->add_clipping) ? f2s_clip_array : f2s_array ; + bufferlen = ARRAY_LEN (ubuf.fbuf) ; + scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ; + +/* Fix me : Need lef2s_array */ + if (psf->data_endswap == SF_TRUE) + endswap_int_array (ubuf.ibuf, readcount) ; + + convert (ubuf.fbuf, readcount, ptr + total, scale) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* host_read_f2s */ + +static sf_count_t +host_read_f2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const float *, int, int *, float) ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + float scale ; + + convert = (psf->add_clipping) ? f2i_clip_array : f2i_array ; + bufferlen = ARRAY_LEN (ubuf.fbuf) ; + scale = (psf->float_int_mult == 0) ? 1.0 : 2147483648.0f / psf->float_max ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ; + + if (psf->data_endswap == SF_TRUE) + endswap_int_array (ubuf.ibuf, bufferlen) ; + + convert (ubuf.fbuf, readcount, ptr + total, scale) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* host_read_f2i */ + +static sf_count_t +host_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + if (psf->data_endswap != SF_TRUE) + return psf_fread (ptr, sizeof (float), len, psf) ; + + bufferlen = ARRAY_LEN (ubuf.fbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ; + + endswap_int_copy ((int*) (ptr + total), ubuf.ibuf, readcount) ; + + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* host_read_f */ + +static sf_count_t +host_read_f2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.fbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ; + + if (psf->data_endswap == SF_TRUE) + endswap_int_array (ubuf.ibuf, bufferlen) ; + +/* Fix me : Need lef2d_array */ + f2d_array (ubuf.fbuf, readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* host_read_f2d */ + +static sf_count_t +host_write_s2f (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + float scale ; + +/* Erik */ + scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ; + bufferlen = ARRAY_LEN (ubuf.fbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + s2f_array (ptr + total, ubuf.fbuf, bufferlen, scale) ; + + if (psf->peak_info) + float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ; + + if (psf->data_endswap == SF_TRUE) + endswap_int_array (ubuf.ibuf, bufferlen) ; + + writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* host_write_s2f */ + +static sf_count_t +host_write_i2f (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + float scale ; + + scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ; + bufferlen = ARRAY_LEN (ubuf.fbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + i2f_array (ptr + total, ubuf.fbuf, bufferlen, scale) ; + + if (psf->peak_info) + float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ; + + if (psf->data_endswap == SF_TRUE) + endswap_int_array (ubuf.ibuf, bufferlen) ; + + writecount = psf_fwrite (ubuf.fbuf, sizeof (float) , bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* host_write_i2f */ + +static sf_count_t +host_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + if (psf->peak_info) + float32_peak_update (psf, ptr, len, 0) ; + + if (psf->data_endswap != SF_TRUE) + return psf_fwrite (ptr, sizeof (float), len, psf) ; + + bufferlen = ARRAY_LEN (ubuf.fbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + + endswap_int_copy (ubuf.ibuf, (const int*) (ptr + total), bufferlen) ; + + writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* host_write_f */ + +static sf_count_t +host_write_d2f (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.fbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + + d2f_array (ptr + total, ubuf.fbuf, bufferlen) ; + + if (psf->peak_info) + float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ; + + if (psf->data_endswap == SF_TRUE) + endswap_int_array (ubuf.ibuf, bufferlen) ; + + writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* host_write_d2f */ + +/*======================================================================================= +*/ + +static sf_count_t +replace_read_f2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + float scale ; + + bufferlen = ARRAY_LEN (ubuf.fbuf) ; + scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ; + + if (psf->data_endswap == SF_TRUE) + endswap_int_array (ubuf.ibuf, bufferlen) ; + + bf2f_array (ubuf.fbuf, bufferlen) ; + + f2s_array (ubuf.fbuf, readcount, ptr + total, scale) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* replace_read_f2s */ + +static sf_count_t +replace_read_f2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + float scale ; + + bufferlen = ARRAY_LEN (ubuf.fbuf) ; + scale = (psf->float_int_mult == 0) ? 1.0 : 0x7FFF / psf->float_max ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ; + + if (psf->data_endswap == SF_TRUE) + endswap_int_array (ubuf.ibuf, bufferlen) ; + + bf2f_array (ubuf.fbuf, bufferlen) ; + + f2i_array (ubuf.fbuf, readcount, ptr + total, scale) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* replace_read_f2i */ + +static sf_count_t +replace_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + /* FIX THIS */ + + bufferlen = ARRAY_LEN (ubuf.fbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ; + + if (psf->data_endswap == SF_TRUE) + endswap_int_array (ubuf.ibuf, bufferlen) ; + + bf2f_array (ubuf.fbuf, bufferlen) ; + + memcpy (ptr + total, ubuf.fbuf, bufferlen * sizeof (float)) ; + + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* replace_read_f */ + +static sf_count_t +replace_read_f2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.fbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.fbuf, sizeof (float), bufferlen, psf) ; + + if (psf->data_endswap == SF_TRUE) + endswap_int_array (ubuf.ibuf, bufferlen) ; + + bf2f_array (ubuf.fbuf, bufferlen) ; + + f2d_array (ubuf.fbuf, readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* replace_read_f2d */ + +static sf_count_t +replace_write_s2f (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + float scale ; + + scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / 0x8000 ; + bufferlen = ARRAY_LEN (ubuf.fbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + s2f_array (ptr + total, ubuf.fbuf, bufferlen, scale) ; + + if (psf->peak_info) + float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ; + + f2bf_array (ubuf.fbuf, bufferlen) ; + + if (psf->data_endswap == SF_TRUE) + endswap_int_array (ubuf.ibuf, bufferlen) ; + + writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* replace_write_s2f */ + +static sf_count_t +replace_write_i2f (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + float scale ; + + scale = (psf->scale_int_float == 0) ? 1.0 : 1.0 / (8.0 * 0x10000000) ; + bufferlen = ARRAY_LEN (ubuf.fbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + i2f_array (ptr + total, ubuf.fbuf, bufferlen, scale) ; + + if (psf->peak_info) + float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ; + + f2bf_array (ubuf.fbuf, bufferlen) ; + + if (psf->data_endswap == SF_TRUE) + endswap_int_array (ubuf.ibuf, bufferlen) ; + + writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* replace_write_i2f */ + +static sf_count_t +replace_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + /* FIX THIS */ + if (psf->peak_info) + float32_peak_update (psf, ptr, len, 0) ; + + bufferlen = ARRAY_LEN (ubuf.fbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + + memcpy (ubuf.fbuf, ptr + total, bufferlen * sizeof (float)) ; + + f2bf_array (ubuf.fbuf, bufferlen) ; + + if (psf->data_endswap == SF_TRUE) + endswap_int_array (ubuf.ibuf, bufferlen) ; + + writecount = psf_fwrite (ubuf.fbuf, sizeof (float) , bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* replace_write_f */ + +static sf_count_t +replace_write_d2f (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.fbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + d2f_array (ptr + total, ubuf.fbuf, bufferlen) ; + + if (psf->peak_info) + float32_peak_update (psf, ubuf.fbuf, bufferlen, total / psf->sf.channels) ; + + f2bf_array (ubuf.fbuf, bufferlen) ; + + if (psf->data_endswap == SF_TRUE) + endswap_int_array (ubuf.ibuf, bufferlen) ; + + writecount = psf_fwrite (ubuf.fbuf, sizeof (float), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* replace_write_d2f */ + +/*---------------------------------------------------------------------------------------------- +*/ + +static void +bf2f_array (float *buffer, int count) +{ while (--count >= 0) + { buffer [count] = FLOAT32_READ ((unsigned char *) (buffer + count)) ; + } ; +} /* bf2f_array */ + +static void +f2bf_array (float *buffer, int count) +{ while (--count >= 0) + { FLOAT32_WRITE (buffer [count], (unsigned char*) (buffer + count)) ; + } ; +} /* f2bf_array */ + diff --git a/libsndfile-1.0.31/src/g72x.c b/libsndfile-1.0.31/src/g72x.c new file mode 100644 index 0000000..563a909 --- /dev/null +++ b/libsndfile-1.0.31/src/g72x.c @@ -0,0 +1,608 @@ +/* +** Copyright (C) 1999-2014 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" +#include "G72x/g72x.h" + +/* This struct is private to the G72x code. */ +struct g72x_state ; +typedef struct g72x_state G72x_STATE ; + +typedef struct +{ /* Private data. Don't mess with it. */ + struct g72x_state * private ; + + /* Public data. Read only. */ + int blocksize, samplesperblock, bytesperblock ; + + /* Public data. Read and write. */ + int blocks_total, block_curr, sample_curr ; + unsigned char block [G72x_BLOCK_SIZE] ; + short samples [G72x_BLOCK_SIZE] ; +} G72x_PRIVATE ; + +static int psf_g72x_decode_block (SF_PRIVATE *psf, G72x_PRIVATE *pg72x) ; +static int psf_g72x_encode_block (SF_PRIVATE *psf, G72x_PRIVATE *pg72x) ; + +static sf_count_t g72x_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t g72x_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t g72x_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t g72x_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t g72x_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t g72x_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t g72x_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t g72x_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +static sf_count_t g72x_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; + +static int g72x_close (SF_PRIVATE *psf) ; + + +/*============================================================================================ +** WAV G721 Reader initialisation function. +*/ + +int +g72x_init (SF_PRIVATE * psf) +{ G72x_PRIVATE *pg72x ; + int bitspersample, bytesperblock, codec ; + + if (psf->codec_data != NULL) + { psf_log_printf (psf, "*** psf->codec_data is not NULL.\n") ; + return SFE_INTERNAL ; + } ; + + psf->sf.seekable = SF_FALSE ; + + if (psf->sf.channels != 1) + return SFE_G72X_NOT_MONO ; + + if ((pg72x = calloc (1, sizeof (G72x_PRIVATE))) == NULL) + return SFE_MALLOC_FAILED ; + + psf->codec_data = (void*) pg72x ; + + pg72x->block_curr = 0 ; + pg72x->sample_curr = 0 ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_G721_32 : + codec = G721_32_BITS_PER_SAMPLE ; + bytesperblock = G721_32_BYTES_PER_BLOCK ; + bitspersample = G721_32_BITS_PER_SAMPLE ; + break ; + + case SF_FORMAT_G723_24: + codec = G723_24_BITS_PER_SAMPLE ; + bytesperblock = G723_24_BYTES_PER_BLOCK ; + bitspersample = G723_24_BITS_PER_SAMPLE ; + break ; + + case SF_FORMAT_G723_40: + codec = G723_40_BITS_PER_SAMPLE ; + bytesperblock = G723_40_BYTES_PER_BLOCK ; + bitspersample = G723_40_BITS_PER_SAMPLE ; + break ; + + default : return SFE_UNIMPLEMENTED ; + } ; + + psf->filelength = psf_get_filelen (psf) ; + if (psf->filelength < psf->dataoffset) + psf->filelength = psf->dataoffset ; + + psf->datalength = psf->filelength - psf->dataoffset ; + if (psf->dataend > 0) + psf->datalength -= psf->filelength - psf->dataend ; + + if (psf->file.mode == SFM_READ) + { pg72x->private = g72x_reader_init (codec, &(pg72x->blocksize), &(pg72x->samplesperblock)) ; + if (pg72x->private == NULL) + return SFE_MALLOC_FAILED ; + + pg72x->bytesperblock = bytesperblock ; + + psf->read_short = g72x_read_s ; + psf->read_int = g72x_read_i ; + psf->read_float = g72x_read_f ; + psf->read_double = g72x_read_d ; + + psf->seek = g72x_seek ; + + if (psf->datalength % pg72x->blocksize) + { psf_log_printf (psf, "*** Odd psf->datalength (%D) should be a multiple of %d\n", psf->datalength, pg72x->blocksize) ; + pg72x->blocks_total = (psf->datalength / pg72x->blocksize) + 1 ; + } + else + pg72x->blocks_total = psf->datalength / pg72x->blocksize ; + + psf->sf.frames = pg72x->blocks_total * pg72x->samplesperblock ; + + psf_g72x_decode_block (psf, pg72x) ; + } + else if (psf->file.mode == SFM_WRITE) + { pg72x->private = g72x_writer_init (codec, &(pg72x->blocksize), &(pg72x->samplesperblock)) ; + if (pg72x->private == NULL) + return SFE_MALLOC_FAILED ; + + pg72x->bytesperblock = bytesperblock ; + + psf->write_short = g72x_write_s ; + psf->write_int = g72x_write_i ; + psf->write_float = g72x_write_f ; + psf->write_double = g72x_write_d ; + + if (psf->datalength % pg72x->blocksize) + pg72x->blocks_total = (psf->datalength / pg72x->blocksize) + 1 ; + else + pg72x->blocks_total = psf->datalength / pg72x->blocksize ; + + if (psf->datalength > 0) + psf->sf.frames = (8 * psf->datalength) / bitspersample ; + + if ((psf->sf.frames * bitspersample) / 8 != psf->datalength) + psf_log_printf (psf, "*** Warning : weird psf->datalength.\n") ; + } ; + + psf->codec_close = g72x_close ; + + return 0 ; +} /* g72x_init */ + +/*============================================================================================ +** G721 Read Functions. +*/ + +static int +psf_g72x_decode_block (SF_PRIVATE *psf, G72x_PRIVATE *pg72x) +{ int k ; + + pg72x->block_curr ++ ; + pg72x->sample_curr = 0 ; + + if (pg72x->block_curr > pg72x->blocks_total) + { memset (pg72x->samples, 0, G72x_BLOCK_SIZE * sizeof (short)) ; + return 1 ; + } ; + + if ((k = psf_fread (pg72x->block, 1, pg72x->bytesperblock, psf)) != pg72x->bytesperblock) + psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pg72x->bytesperblock) ; + + pg72x->blocksize = k ; + g72x_decode_block (pg72x->private, pg72x->block, pg72x->samples) ; + + return 1 ; +} /* psf_g72x_decode_block */ + +static int +g72x_read_block (SF_PRIVATE *psf, G72x_PRIVATE *pg72x, short *ptr, int len) +{ int count, total = 0, indx = 0 ; + + while (indx < len) + { if (pg72x->block_curr > pg72x->blocks_total) + { memset (&(ptr [indx]), 0, (len - indx) * sizeof (short)) ; + return total ; + } ; + + if (pg72x->sample_curr >= pg72x->samplesperblock) + psf_g72x_decode_block (psf, pg72x) ; + + count = pg72x->samplesperblock - pg72x->sample_curr ; + count = (len - indx > count) ? count : len - indx ; + + memcpy (&(ptr [indx]), &(pg72x->samples [pg72x->sample_curr]), count * sizeof (short)) ; + indx += count ; + pg72x->sample_curr += count ; + total = indx ; + } ; + + return total ; +} /* g72x_read_block */ + +static sf_count_t +g72x_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ G72x_PRIVATE *pg72x ; + int readcount, count ; + sf_count_t total = 0 ; + + if (psf->codec_data == NULL) + return 0 ; + pg72x = (G72x_PRIVATE*) psf->codec_data ; + + while (len > 0) + { readcount = (len > 0x10000000) ? 0x10000000 : (int) len ; + + count = g72x_read_block (psf, pg72x, ptr, readcount) ; + + total += count ; + len -= count ; + + if (count != readcount) + break ; + } ; + + return total ; +} /* g72x_read_s */ + +static sf_count_t +g72x_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + G72x_PRIVATE *pg72x ; + short *sptr ; + int k, bufferlen, readcount = 0, count ; + sf_count_t total = 0 ; + + if (psf->codec_data == NULL) + return 0 ; + pg72x = (G72x_PRIVATE*) psf->codec_data ; + + sptr = ubuf.sbuf ; + bufferlen = SF_BUFFER_LEN / sizeof (short) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = g72x_read_block (psf, pg72x, sptr, readcount) ; + + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = arith_shift_left (sptr [k], 16) ; + + total += count ; + len -= readcount ; + if (count != readcount) + break ; + } ; + + return total ; +} /* g72x_read_i */ + +static sf_count_t +g72x_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + G72x_PRIVATE *pg72x ; + short *sptr ; + int k, bufferlen, readcount = 0, count ; + sf_count_t total = 0 ; + float normfact ; + + if (psf->codec_data == NULL) + return 0 ; + pg72x = (G72x_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = SF_BUFFER_LEN / sizeof (short) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = g72x_read_block (psf, pg72x, sptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * sptr [k] ; + + total += count ; + len -= readcount ; + if (count != readcount) + break ; + } ; + + return total ; +} /* g72x_read_f */ + +static sf_count_t +g72x_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + G72x_PRIVATE *pg72x ; + short *sptr ; + int k, bufferlen, readcount = 0, count ; + sf_count_t total = 0 ; + double normfact ; + + if (psf->codec_data == NULL) + return 0 ; + pg72x = (G72x_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = SF_BUFFER_LEN / sizeof (short) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = g72x_read_block (psf, pg72x, sptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * (double) (sptr [k]) ; + + total += count ; + len -= readcount ; + if (count != readcount) + break ; + } ; + + return total ; +} /* g72x_read_d */ + +static sf_count_t +g72x_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t UNUSED (offset)) +{ + psf_log_printf (psf, "seek unsupported\n") ; + + /* No simple solution. To do properly, would need to seek + ** to start of file and decode everything up to seek position. + ** Maybe implement SEEK_SET to 0 only? + */ + return 0 ; + +/* +** G72x_PRIVATE *pg72x ; +** int newblock, newsample, sample_curr ; +** +** if (psf->codec_data == NULL) +** return 0 ; +** pg72x = (G72x_PRIVATE*) psf->codec_data ; +** +** if (! (psf->datalength && psf->dataoffset)) +** { psf->error = SFE_BAD_SEEK ; +** return PSF_SEEK_ERROR ; +** } ; +** +** sample_curr = (8 * psf->datalength) / G721_32_BITS_PER_SAMPLE ; +** +** switch (whence) +** { case SEEK_SET : +** if (offset < 0 || offset > sample_curr) +** { psf->error = SFE_BAD_SEEK ; +** return PSF_SEEK_ERROR ; +** } ; +** newblock = offset / pg72x->samplesperblock ; +** newsample = offset % pg72x->samplesperblock ; +** break ; +** +** case SEEK_CUR : +** if (psf->current + offset < 0 || psf->current + offset > sample_curr) +** { psf->error = SFE_BAD_SEEK ; +** return PSF_SEEK_ERROR ; +** } ; +** newblock = (8 * (psf->current + offset)) / pg72x->samplesperblock ; +** newsample = (8 * (psf->current + offset)) % pg72x->samplesperblock ; +** break ; +** +** case SEEK_END : +** if (offset > 0 || sample_curr + offset < 0) +** { psf->error = SFE_BAD_SEEK ; +** return PSF_SEEK_ERROR ; +** } ; +** newblock = (sample_curr + offset) / pg72x->samplesperblock ; +** newsample = (sample_curr + offset) % pg72x->samplesperblock ; +** break ; +** +** default : +** psf->error = SFE_BAD_SEEK ; +** return PSF_SEEK_ERROR ; +** } ; +** +** if (psf->file.mode == SFM_READ) +** { psf_fseek (psf, psf->dataoffset + newblock * pg72x->blocksize, SEEK_SET) ; +** pg72x->block_curr = newblock ; +** psf_g72x_decode_block (psf, pg72x) ; +** pg72x->sample_curr = newsample ; +** } +** else +** { /+* What to do about write??? *+/ +** psf->error = SFE_BAD_SEEK ; +** return PSF_SEEK_ERROR ; +** } ; +** +** psf->current = newblock * pg72x->samplesperblock + newsample ; +** return psf->current ; +** +*/ +} /* g72x_seek */ + +/*========================================================================================== +** G72x Write Functions. +*/ + +static int +psf_g72x_encode_block (SF_PRIVATE *psf, G72x_PRIVATE *pg72x) +{ int k ; + + /* Encode the samples. */ + g72x_encode_block (pg72x->private, pg72x->samples, pg72x->block) ; + + /* Write the block to disk. */ + if ((k = psf_fwrite (pg72x->block, 1, pg72x->blocksize, psf)) != pg72x->blocksize) + psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pg72x->blocksize) ; + + pg72x->sample_curr = 0 ; + pg72x->block_curr ++ ; + + /* Set samples to zero for next block. */ + memset (pg72x->samples, 0, G72x_BLOCK_SIZE * sizeof (short)) ; + + return 1 ; +} /* psf_g72x_encode_block */ + +static int +g72x_write_block (SF_PRIVATE *psf, G72x_PRIVATE *pg72x, const short *ptr, int len) +{ int count, total = 0, indx = 0 ; + + while (indx < len) + { count = pg72x->samplesperblock - pg72x->sample_curr ; + + if (count > len - indx) + count = len - indx ; + + memcpy (&(pg72x->samples [pg72x->sample_curr]), &(ptr [indx]), count * sizeof (short)) ; + indx += count ; + pg72x->sample_curr += count ; + total = indx ; + + if (pg72x->sample_curr >= pg72x->samplesperblock) + psf_g72x_encode_block (psf, pg72x) ; + } ; + + return total ; +} /* g72x_write_block */ + +static sf_count_t +g72x_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ G72x_PRIVATE *pg72x ; + int writecount, count ; + sf_count_t total = 0 ; + + if (psf->codec_data == NULL) + return 0 ; + pg72x = (G72x_PRIVATE*) psf->codec_data ; + + while (len > 0) + { writecount = (len > 0x10000000) ? 0x10000000 : (int) len ; + + count = g72x_write_block (psf, pg72x, ptr, writecount) ; + + total += count ; + len -= count ; + if (count != writecount) + break ; + } ; + + return total ; +} /* g72x_write_s */ + +static sf_count_t +g72x_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + G72x_PRIVATE *pg72x ; + short *sptr ; + int k, bufferlen, writecount = 0, count ; + sf_count_t total = 0 ; + + if (psf->codec_data == NULL) + return 0 ; + pg72x = (G72x_PRIVATE*) psf->codec_data ; + + sptr = ubuf.sbuf ; + bufferlen = SF_BUFFER_LEN / sizeof (short) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + sptr [k] = ptr [total + k] >> 16 ; + count = g72x_write_block (psf, pg72x, sptr, writecount) ; + + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + return total ; +} /* g72x_write_i */ + +static sf_count_t +g72x_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + G72x_PRIVATE *pg72x ; + short *sptr ; + int k, bufferlen, writecount = 0, count ; + sf_count_t total = 0 ; + float normfact ; + + if (psf->codec_data == NULL) + return 0 ; + pg72x = (G72x_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x8000) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = SF_BUFFER_LEN / sizeof (short) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + sptr [k] = psf_lrintf (normfact * ptr [total + k]) ; + count = g72x_write_block (psf, pg72x, sptr, writecount) ; + + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + + return total ; +} /* g72x_write_f */ + +static sf_count_t +g72x_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + G72x_PRIVATE *pg72x ; + short *sptr ; + int k, bufferlen, writecount = 0, count ; + sf_count_t total = 0 ; + double normfact ; + + if (psf->codec_data == NULL) + return 0 ; + pg72x = (G72x_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x8000) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = SF_BUFFER_LEN / sizeof (short) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + sptr [k] = psf_lrint (normfact * ptr [total + k]) ; + count = g72x_write_block (psf, pg72x, sptr, writecount) ; + + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + + return total ; +} /* g72x_write_d */ + +static int +g72x_close (SF_PRIVATE *psf) +{ G72x_PRIVATE *pg72x ; + + pg72x = (G72x_PRIVATE*) psf->codec_data ; + + if (psf->file.mode == SFM_WRITE) + { /* If a block has been partially assembled, write it out + ** as the final block. + */ + + if (pg72x->sample_curr && pg72x->sample_curr < G72x_BLOCK_SIZE) + psf_g72x_encode_block (psf, pg72x) ; + + if (psf->write_header) + psf->write_header (psf, SF_FALSE) ; + } ; + + /* Only free the pointer allocated by g72x_(reader|writer)_init. */ + free (pg72x->private) ; + + return 0 ; +} /* g72x_close */ + diff --git a/libsndfile-1.0.31/src/gsm610.c b/libsndfile-1.0.31/src/gsm610.c new file mode 100644 index 0000000..06519bc --- /dev/null +++ b/libsndfile-1.0.31/src/gsm610.c @@ -0,0 +1,629 @@ +/* +** Copyright (C) 1999-2019 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" +#include "wavlike.h" +#include "GSM610/gsm.h" + +#define GSM610_BLOCKSIZE 33 +#define GSM610_SAMPLES 160 + +typedef struct gsm610_tag +{ int blocks ; + int blockcount, samplecount ; + int samplesperblock, blocksize ; + + int (*decode_block) (SF_PRIVATE *psf, struct gsm610_tag *pgsm610) ; + int (*encode_block) (SF_PRIVATE *psf, struct gsm610_tag *pgsm610) ; + + short samples [WAVLIKE_GSM610_SAMPLES] ; + unsigned char block [WAVLIKE_GSM610_BLOCKSIZE] ; + + /* Damn I hate typedef-ed pointers; yes, gsm is a pointer type. */ + gsm gsm_data ; +} GSM610_PRIVATE ; + +static sf_count_t gsm610_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t gsm610_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t gsm610_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t gsm610_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t gsm610_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t gsm610_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t gsm610_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t gsm610_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +static int gsm610_read_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len) ; +static int gsm610_write_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, const short *ptr, int len) ; + +static int gsm610_decode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) ; +static int gsm610_encode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) ; + +static int gsm610_wav_decode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) ; +static int gsm610_wav_encode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) ; + +static sf_count_t gsm610_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; + +static int gsm610_close (SF_PRIVATE *psf) ; + +/*============================================================================================ +** WAV GSM610 initialisation function. +*/ + +int +gsm610_init (SF_PRIVATE *psf) +{ GSM610_PRIVATE *pgsm610 ; + int true_flag = 1 ; + + if (psf->codec_data != NULL) + { psf_log_printf (psf, "*** psf->codec_data is not NULL.\n") ; + return SFE_INTERNAL ; + } ; + + if (psf->file.mode == SFM_RDWR) + return SFE_BAD_MODE_RW ; + + psf->sf.seekable = SF_FALSE ; + + if ((pgsm610 = calloc (1, sizeof (GSM610_PRIVATE))) == NULL) + return SFE_MALLOC_FAILED ; + + psf->codec_data = pgsm610 ; + + memset (pgsm610, 0, sizeof (GSM610_PRIVATE)) ; + +/*============================================================ + +Need separate gsm_data structs for encode and decode. + +============================================================*/ + + if ((pgsm610->gsm_data = gsm_create ()) == NULL) + return SFE_MALLOC_FAILED ; + + switch (SF_CONTAINER (psf->sf.format)) + { case SF_FORMAT_WAV : + case SF_FORMAT_WAVEX : + case SF_FORMAT_W64 : + gsm_option (pgsm610->gsm_data, GSM_OPT_WAV49, &true_flag) ; + + pgsm610->encode_block = gsm610_wav_encode_block ; + pgsm610->decode_block = gsm610_wav_decode_block ; + + pgsm610->samplesperblock = WAVLIKE_GSM610_SAMPLES ; + pgsm610->blocksize = WAVLIKE_GSM610_BLOCKSIZE ; + break ; + + case SF_FORMAT_AIFF : + case SF_FORMAT_RAW : + pgsm610->encode_block = gsm610_encode_block ; + pgsm610->decode_block = gsm610_decode_block ; + + pgsm610->samplesperblock = GSM610_SAMPLES ; + pgsm610->blocksize = GSM610_BLOCKSIZE ; + break ; + + default : + return SFE_INTERNAL ; + break ; + } ; + + if (psf->file.mode == SFM_READ) + { if (psf->datalength % pgsm610->blocksize == 0) + pgsm610->blocks = psf->datalength / pgsm610->blocksize ; + else if (psf->datalength % pgsm610->blocksize == 1 && pgsm610->blocksize == GSM610_BLOCKSIZE) + { /* + ** Weird AIFF specific case. + ** AIFF chunks must be at an even offset from the start of file and + ** GSM610_BLOCKSIZE is odd which can result in an odd length SSND + ** chunk. The SSND chunk then gets padded on write which means that + ** when it is read the datalength is too big by 1. + */ + pgsm610->blocks = psf->datalength / pgsm610->blocksize ; + } + else + { psf_log_printf (psf, "*** Warning : data chunk seems to be truncated.\n") ; + pgsm610->blocks = psf->datalength / pgsm610->blocksize + 1 ; + } ; + + psf->sf.frames = pgsm610->samplesperblock * pgsm610->blocks ; + + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + + pgsm610->decode_block (psf, pgsm610) ; /* Read first block. */ + + psf->read_short = gsm610_read_s ; + psf->read_int = gsm610_read_i ; + psf->read_float = gsm610_read_f ; + psf->read_double = gsm610_read_d ; + } ; + + if (psf->file.mode == SFM_WRITE) + { pgsm610->blockcount = 0 ; + pgsm610->samplecount = 0 ; + + psf->write_short = gsm610_write_s ; + psf->write_int = gsm610_write_i ; + psf->write_float = gsm610_write_f ; + psf->write_double = gsm610_write_d ; + } ; + + psf->codec_close = gsm610_close ; + + psf->seek = gsm610_seek ; + + psf->filelength = psf_get_filelen (psf) ; + psf->datalength = psf->filelength - psf->dataoffset ; + + return 0 ; +} /* gsm610_init */ + +/*============================================================================================ +** GSM 6.10 Read Functions. +*/ + +static int +gsm610_wav_decode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) +{ int k ; + + pgsm610->blockcount ++ ; + pgsm610->samplecount = 0 ; + + if (pgsm610->blockcount > pgsm610->blocks) + { memset (pgsm610->samples, 0, sizeof (pgsm610->samples)) ; + return 1 ; + } ; + + if ((k = psf_fread (pgsm610->block, 1, WAVLIKE_GSM610_BLOCKSIZE, psf)) != WAVLIKE_GSM610_BLOCKSIZE) + psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, WAVLIKE_GSM610_BLOCKSIZE) ; + + if (gsm_decode (pgsm610->gsm_data, pgsm610->block, pgsm610->samples) < 0) + { psf_log_printf (psf, "Error from WAV gsm_decode() on frame : %d\n", pgsm610->blockcount) ; + return 0 ; + } ; + + if (gsm_decode (pgsm610->gsm_data, pgsm610->block + (WAVLIKE_GSM610_BLOCKSIZE + 1) / 2, pgsm610->samples + WAVLIKE_GSM610_SAMPLES / 2) < 0) + { psf_log_printf (psf, "Error from WAV gsm_decode() on frame : %d.5\n", pgsm610->blockcount) ; + return 0 ; + } ; + + return 1 ; +} /* gsm610_wav_decode_block */ + +static int +gsm610_decode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) +{ int k ; + + pgsm610->blockcount ++ ; + pgsm610->samplecount = 0 ; + + if (pgsm610->blockcount > pgsm610->blocks) + { memset (pgsm610->samples, 0, sizeof (pgsm610->samples)) ; + return 1 ; + } ; + + if ((k = psf_fread (pgsm610->block, 1, GSM610_BLOCKSIZE, psf)) != GSM610_BLOCKSIZE) + psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, GSM610_BLOCKSIZE) ; + + if (gsm_decode (pgsm610->gsm_data, pgsm610->block, pgsm610->samples) < 0) + { psf_log_printf (psf, "Error from standard gsm_decode() on frame : %d\n", pgsm610->blockcount) ; + return 0 ; + } ; + + return 1 ; +} /* gsm610_decode_block */ + +static int +gsm610_read_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len) +{ int count, total = 0, indx = 0 ; + + while (indx < len) + { if (pgsm610->blockcount >= pgsm610->blocks && pgsm610->samplecount >= pgsm610->samplesperblock) + { memset (ptr + indx, 0, (len - indx) * sizeof (short)) ; + return total ; + } ; + + if (pgsm610->samplecount >= pgsm610->samplesperblock) + pgsm610->decode_block (psf, pgsm610) ; + + count = pgsm610->samplesperblock - pgsm610->samplecount ; + count = (len - indx > count) ? count : len - indx ; + + memcpy (&(ptr [indx]), &(pgsm610->samples [pgsm610->samplecount]), count * sizeof (short)) ; + indx += count ; + pgsm610->samplecount += count ; + total = indx ; + } ; + + return total ; +} /* gsm610_read_block */ + +static sf_count_t +gsm610_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ GSM610_PRIVATE *pgsm610 ; + int readcount, count ; + sf_count_t total = 0 ; + + if (psf->codec_data == NULL) + return 0 ; + pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; + + while (len > 0) + { readcount = (len > 0x10000000) ? 0x1000000 : (int) len ; + + count = gsm610_read_block (psf, pgsm610, ptr, readcount) ; + + total += count ; + len -= count ; + + if (count != readcount) + break ; + } ; + + return total ; +} /* gsm610_read_s */ + +static sf_count_t +gsm610_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ GSM610_PRIVATE *pgsm610 ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, readcount = 0, count ; + sf_count_t total = 0 ; + + if (psf->codec_data == NULL) + return 0 ; + pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = gsm610_read_block (psf, pgsm610, sptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = arith_shift_left (sptr [k], 16) ; + + total += count ; + len -= readcount ; + } ; + return total ; +} /* gsm610_read_i */ + +static sf_count_t +gsm610_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ GSM610_PRIVATE *pgsm610 ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, readcount = 0, count ; + sf_count_t total = 0 ; + float normfact ; + + if (psf->codec_data == NULL) + return 0 ; + pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = gsm610_read_block (psf, pgsm610, sptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * sptr [k] ; + + total += count ; + len -= readcount ; + } ; + return total ; +} /* gsm610_read_f */ + +static sf_count_t +gsm610_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ GSM610_PRIVATE *pgsm610 ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, readcount = 0, count ; + sf_count_t total = 0 ; + double normfact ; + + normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ; + + if (psf->codec_data == NULL) + return 0 ; + pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = gsm610_read_block (psf, pgsm610, sptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * sptr [k] ; + + total += count ; + len -= readcount ; + } ; + return total ; +} /* gsm610_read_d */ + +static sf_count_t +gsm610_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t offset) +{ GSM610_PRIVATE *pgsm610 ; + int newblock, newsample ; + + if (psf->codec_data == NULL) + return 0 ; + pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; + + if (psf->dataoffset < 0) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + if (offset == 0) + { int true_flag = 1 ; + + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + pgsm610->blockcount = 0 ; + + gsm_init (pgsm610->gsm_data) ; + if ((SF_CONTAINER (psf->sf.format)) == SF_FORMAT_WAV || + (SF_CONTAINER (psf->sf.format)) == SF_FORMAT_W64) + gsm_option (pgsm610->gsm_data, GSM_OPT_WAV49, &true_flag) ; + + pgsm610->decode_block (psf, pgsm610) ; + pgsm610->samplecount = 0 ; + return 0 ; + } ; + + if (offset < 0 || offset > pgsm610->blocks * pgsm610->samplesperblock) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + newblock = offset / pgsm610->samplesperblock ; + newsample = offset % pgsm610->samplesperblock ; + + if (psf->file.mode == SFM_READ) + { if (psf->read_current != newblock * pgsm610->samplesperblock + newsample) + { psf_fseek (psf, psf->dataoffset + newblock * pgsm610->samplesperblock, SEEK_SET) ; + pgsm610->blockcount = newblock ; + pgsm610->decode_block (psf, pgsm610) ; + pgsm610->samplecount = newsample ; + } ; + + return newblock * pgsm610->samplesperblock + newsample ; + } ; + + /* What to do about write??? */ + psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; +} /* gsm610_seek */ + +/*========================================================================================== +** GSM 6.10 Write Functions. +*/ + +static int +gsm610_encode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) +{ int k ; + + /* Encode the samples. */ + gsm_encode (pgsm610->gsm_data, pgsm610->samples, pgsm610->block) ; + + /* Write the block to disk. */ + if ((k = psf_fwrite (pgsm610->block, 1, GSM610_BLOCKSIZE, psf)) != GSM610_BLOCKSIZE) + psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, GSM610_BLOCKSIZE) ; + + pgsm610->samplecount = 0 ; + pgsm610->blockcount ++ ; + + /* Set samples to zero for next block. */ + memset (pgsm610->samples, 0, sizeof (pgsm610->samples)) ; + + return 1 ; +} /* gsm610_encode_block */ + +static int +gsm610_wav_encode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) +{ int k ; + + /* Encode the samples. */ + gsm_encode (pgsm610->gsm_data, pgsm610->samples, pgsm610->block) ; + gsm_encode (pgsm610->gsm_data, pgsm610->samples+WAVLIKE_GSM610_SAMPLES / 2, pgsm610->block+WAVLIKE_GSM610_BLOCKSIZE / 2) ; + + /* Write the block to disk. */ + if ((k = psf_fwrite (pgsm610->block, 1, WAVLIKE_GSM610_BLOCKSIZE, psf)) != WAVLIKE_GSM610_BLOCKSIZE) + psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, WAVLIKE_GSM610_BLOCKSIZE) ; + + pgsm610->samplecount = 0 ; + pgsm610->blockcount ++ ; + + /* Set samples to zero for next block. */ + memset (pgsm610->samples, 0, sizeof (pgsm610->samples)) ; + + return 1 ; +} /* gsm610_wav_encode_block */ + +static int +gsm610_write_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, const short *ptr, int len) +{ int count, total = 0, indx = 0 ; + + while (indx < len) + { count = pgsm610->samplesperblock - pgsm610->samplecount ; + + if (count > len - indx) + count = len - indx ; + + memcpy (&(pgsm610->samples [pgsm610->samplecount]), &(ptr [indx]), count * sizeof (short)) ; + indx += count ; + pgsm610->samplecount += count ; + total = indx ; + + if (pgsm610->samplecount >= pgsm610->samplesperblock) + pgsm610->encode_block (psf, pgsm610) ; + } ; + + return total ; +} /* gsm610_write_block */ + +static sf_count_t +gsm610_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ GSM610_PRIVATE *pgsm610 ; + int writecount, count ; + sf_count_t total = 0 ; + + if (psf->codec_data == NULL) + return 0 ; + pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; + + while (len > 0) + { writecount = (len > 0x10000000) ? 0x10000000 : (int) len ; + + count = gsm610_write_block (psf, pgsm610, ptr, writecount) ; + + total += count ; + len -= count ; + + if (count != writecount) + break ; + } ; + + return total ; +} /* gsm610_write_s */ + +static sf_count_t +gsm610_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ GSM610_PRIVATE *pgsm610 ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, writecount = 0, count ; + sf_count_t total = 0 ; + + if (psf->codec_data == NULL) + return 0 ; + pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + sptr [k] = ptr [total + k] >> 16 ; + count = gsm610_write_block (psf, pgsm610, sptr, writecount) ; + + total += count ; + len -= writecount ; + } ; + return total ; +} /* gsm610_write_i */ + +static sf_count_t +gsm610_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ GSM610_PRIVATE *pgsm610 ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, writecount = 0, count ; + sf_count_t total = 0 ; + float normfact ; + + if (psf->codec_data == NULL) + return 0 ; + pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + sptr [k] = psf_lrintf (normfact * ptr [total + k]) ; + count = gsm610_write_block (psf, pgsm610, sptr, writecount) ; + + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + return total ; +} /* gsm610_write_f */ + +static sf_count_t +gsm610_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ GSM610_PRIVATE *pgsm610 ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, writecount = 0, count ; + sf_count_t total = 0 ; + double normfact ; + + if (psf->codec_data == NULL) + return 0 ; + pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + sptr [k] = psf_lrint (normfact * ptr [total + k]) ; + count = gsm610_write_block (psf, pgsm610, sptr, writecount) ; + + total += count ; + len -= writecount ; + } ; + return total ; +} /* gsm610_write_d */ + +static int +gsm610_close (SF_PRIVATE *psf) +{ GSM610_PRIVATE *pgsm610 ; + + if (psf->codec_data == NULL) + return 0 ; + + pgsm610 = (GSM610_PRIVATE*) psf->codec_data ; + + if (psf->file.mode == SFM_WRITE) + { /* If a block has been partially assembled, write it out + ** as the final block. + */ + + if (pgsm610->samplecount && pgsm610->samplecount < pgsm610->samplesperblock) + pgsm610->encode_block (psf, pgsm610) ; + } ; + + if (pgsm610->gsm_data) + gsm_destroy (pgsm610->gsm_data) ; + + return 0 ; +} /* gsm610_close */ + diff --git a/libsndfile-1.0.31/src/htk.c b/libsndfile-1.0.31/src/htk.c new file mode 100644 index 0000000..1041a84 --- /dev/null +++ b/libsndfile-1.0.31/src/htk.c @@ -0,0 +1,226 @@ +/* +** Copyright (C) 2002-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +/*------------------------------------------------------------------------------ +** Macros to handle big/little endian issues. +*/ + +#define SFE_HTK_BAD_FILE_LEN 1666 +#define SFE_HTK_NOT_WAVEFORM 1667 + +/*------------------------------------------------------------------------------ +** Private static functions. +*/ + +static int htk_close (SF_PRIVATE *psf) ; + +static int htk_write_header (SF_PRIVATE *psf, int calc_length) ; +static int htk_read_header (SF_PRIVATE *psf) ; + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +htk_open (SF_PRIVATE *psf) +{ int subformat ; + int error = 0 ; + + if (psf->is_pipe) + return SFE_HTK_NO_PIPE ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = htk_read_header (psf))) + return error ; + } ; + + subformat = SF_CODEC (psf->sf.format) ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_HTK) + return SFE_BAD_OPEN_FORMAT ; + + psf->endian = SF_ENDIAN_BIG ; + + if (htk_write_header (psf, SF_FALSE)) + return psf->error ; + + psf->write_header = htk_write_header ; + } ; + + psf->container_close = htk_close ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + + switch (subformat) + { case SF_FORMAT_PCM_16 : /* 16-bit linear PCM. */ + error = pcm_init (psf) ; + break ; + + default : break ; + } ; + + return error ; +} /* htk_open */ + +/*------------------------------------------------------------------------------ +*/ + +static int +htk_close (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + htk_write_header (psf, SF_TRUE) ; + + return 0 ; +} /* htk_close */ + +static int +htk_write_header (SF_PRIVATE *psf, int calc_length) +{ sf_count_t current ; + int sample_count, sample_period ; + + current = psf_ftell (psf) ; + + if (calc_length) + psf->filelength = psf_get_filelen (psf) ; + + /* Reset the current header length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + psf_fseek (psf, 0, SEEK_SET) ; + + if (psf->filelength > 12) + sample_count = (psf->filelength - 12) / 2 ; + else + sample_count = 0 ; + + sample_period = 10000000 / psf->sf.samplerate ; + + psf_binheader_writef (psf, "E444", BHW4 (sample_count), BHW4 (sample_period), BHW4 (0x20000)) ; + + /* Header construction complete so write it out. */ + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + if (psf->error) + return psf->error ; + + psf->dataoffset = psf->header.indx ; + + if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + + return psf->error ; +} /* htk_write_header */ + +/* +** Found the following info in a comment block within Bill Schottstaedt's +** sndlib library. +** +** HTK format files consist of a contiguous sequence of samples preceded by a +** header. Each sample is a vector of either 2-byte integers or 4-byte floats. +** 2-byte integers are used for compressed forms as described below and for +** vector quantised data as described later in section 5.11. HTK format data +** files can also be used to store speech waveforms as described in section 5.8. +** +** The HTK file format header is 12 bytes long and contains the following data +** nSamples -- number of samples in file (4-byte integer) +** sampPeriod -- sample period in 100ns units (4-byte integer) +** sampSize -- number of bytes per sample (2-byte integer) +** parmKind -- a code indicating the sample kind (2-byte integer) +** +** The parameter kind consists of a 6 bit code representing the basic +** parameter kind plus additional bits for each of the possible qualifiers. +** The basic parameter kind codes are +** +** 0 WAVEFORM sampled waveform +** 1 LPC linear prediction filter coefficients +** 2 LPREFC linear prediction reflection coefficients +** 3 LPCEPSTRA LPC cepstral coefficients +** 4 LPDELCEP LPC cepstra plus delta coefficients +** 5 IREFC LPC reflection coef in 16 bit integer format +** 6 MFCC mel-frequency cepstral coefficients +** 7 FBANK log mel-filter bank channel outputs +** 8 MELSPEC linear mel-filter bank channel outputs +** 9 USER user defined sample kind +** 10 DISCRETE vector quantised data +** +** and the bit-encoding for the qualifiers (in octal) is +** _E 000100 has energy +** _N 000200 absolute energy suppressed +** _D 000400 has delta coefficients +** _A 001000 has acceleration coefficients +** _C 002000 is compressed +** _Z 004000 has zero mean static coef. +** _K 010000 has CRC checksum +** _O 020000 has 0'th cepstral coef. +*/ + +static int +htk_read_header (SF_PRIVATE *psf) +{ int sample_count, sample_period, marker ; + + psf_binheader_readf (psf, "pE444", 0, &sample_count, &sample_period, &marker) ; + + if (2 * sample_count + 12 != psf->filelength) + return SFE_HTK_BAD_FILE_LEN ; + + if (marker != 0x20000) + return SFE_HTK_NOT_WAVEFORM ; + + psf->sf.channels = 1 ; + + if (sample_period > 0) + { psf->sf.samplerate = 10000000 / sample_period ; + psf_log_printf (psf, "HTK Waveform file\n Sample Count : %d\n Sample Period : %d => %d Hz\n", + sample_count, sample_period, psf->sf.samplerate) ; + } + else + { psf->sf.samplerate = 16000 ; + psf_log_printf (psf, "HTK Waveform file\n Sample Count : %d\n Sample Period : %d (should be > 0) => Guessed sample rate %d Hz\n", + sample_count, sample_period, psf->sf.samplerate) ; + } ; + + psf->sf.format = SF_FORMAT_HTK | SF_FORMAT_PCM_16 ; + psf->bytewidth = 2 ; + + /* HTK always has a 12 byte header. */ + psf->dataoffset = 12 ; + psf->endian = SF_ENDIAN_BIG ; + + psf->datalength = psf->filelength - psf->dataoffset ; + + psf->blockwidth = psf->sf.channels * psf->bytewidth ; + + if (! psf->sf.frames && psf->blockwidth) + psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ; + + return 0 ; +} /* htk_read_header */ + diff --git a/libsndfile-1.0.31/src/id3.c b/libsndfile-1.0.31/src/id3.c new file mode 100644 index 0000000..2b82d0f --- /dev/null +++ b/libsndfile-1.0.31/src/id3.c @@ -0,0 +1,59 @@ +/* +** Copyright (C) 2010-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +int +id3_skip (SF_PRIVATE * psf) +{ unsigned char buf [10] ; + + memset (buf, 0, sizeof (buf)) ; + psf_binheader_readf (psf, "pb", 0, buf, 10) ; + + if (buf [0] == 'I' && buf [1] == 'D' && buf [2] == '3') + { int offset = buf [6] & 0x7f ; + offset = (offset << 7) | (buf [7] & 0x7f) ; + offset = (offset << 7) | (buf [8] & 0x7f) ; + offset = (offset << 7) | (buf [9] & 0x7f) ; + + psf_log_printf (psf, "ID3 length : %d\n--------------------\n", offset) ; + + /* Never want to jump backwards in a file. */ + if (offset < 0) + return 0 ; + + /* Calculate new file offset and position ourselves there. */ + offset += 10 ; + if (psf->fileoffset + offset < psf->filelength) + { psf_binheader_readf (psf, "p", offset) ; + psf->fileoffset += offset ; + return 1 ; + } ; + } ; + + return 0 ; +} /* id3_skip */ diff --git a/libsndfile-1.0.31/src/ima_adpcm.c b/libsndfile-1.0.31/src/ima_adpcm.c new file mode 100644 index 0000000..8c9bbff --- /dev/null +++ b/libsndfile-1.0.31/src/ima_adpcm.c @@ -0,0 +1,1003 @@ +/* +** Copyright (C) 1999-2020 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +typedef struct IMA_ADPCM_PRIVATE_tag +{ int (*decode_block) (SF_PRIVATE *psf, struct IMA_ADPCM_PRIVATE_tag *pima) ; + int (*encode_block) (SF_PRIVATE *psf, struct IMA_ADPCM_PRIVATE_tag *pima) ; + + int channels, blocksize, samplesperblock, blocks ; + int blockcount, samplecount ; + int previous [2] ; + int stepindx [2] ; + unsigned char *block ; + short *samples ; + short data [] ; /* ISO C99 struct flexible array. */ +} IMA_ADPCM_PRIVATE ; + +/*============================================================================================ +** Predefined IMA ADPCM data. +*/ + +static int ima_indx_adjust [16] = +{ -1, -1, -1, -1, /* +0 - +3, decrease the step size */ + +2, +4, +6, +8, /* +4 - +7, increase the step size */ + -1, -1, -1, -1, /* -0 - -3, decrease the step size */ + +2, +4, +6, +8, /* -4 - -7, increase the step size */ +} ; + +static int ima_step_size [89] = +{ 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, + 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, + 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, + 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, + 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, + 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, + 32767 +} ; + +static int ima_reader_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ; +static int ima_writer_init (SF_PRIVATE *psf, int blockalign) ; + +static int ima_read_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len) ; +static int ima_write_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, const short *ptr, int len) ; + +static sf_count_t ima_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t ima_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t ima_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t ima_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t ima_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t ima_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t ima_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t ima_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +static sf_count_t aiff_ima_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; +static sf_count_t wavlike_ima_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; + +static int ima_close (SF_PRIVATE *psf) ; + +static int wavlike_ima_decode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ; +static int wavlike_ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ; + +/*-static int aiff_ima_reader_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ;-*/ +static int aiff_ima_decode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ; +static int aiff_ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ; + + +static inline int +clamp_ima_step_index (int indx) +{ if (indx < 0) + return 0 ; + if (indx >= ARRAY_LEN (ima_step_size)) + return ARRAY_LEN (ima_step_size) - 1 ; + + return indx ; +} /* clamp_ima_step_index */ + +/*============================================================================================ +** IMA ADPCM Reader initialisation function. +*/ + +int +wavlike_ima_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) +{ int error ; + + if (psf->codec_data != NULL) + { psf_log_printf (psf, "*** psf->codec_data is not NULL.\n") ; + return SFE_INTERNAL ; + } ; + + if (psf->file.mode == SFM_RDWR) + return SFE_BAD_MODE_RW ; + + if (psf->file.mode == SFM_READ) + if ((error = ima_reader_init (psf, blockalign, samplesperblock))) + return error ; + + if (psf->file.mode == SFM_WRITE) + if ((error = ima_writer_init (psf, blockalign))) + return error ; + + psf->codec_close = ima_close ; + psf->seek = wavlike_ima_seek ; + + return 0 ; +} /* wavlike_ima_init */ + +int +aiff_ima_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) +{ int error ; + + if (psf->file.mode == SFM_RDWR) + return SFE_BAD_MODE_RW ; + + if (psf->file.mode == SFM_READ) + if ((error = ima_reader_init (psf, blockalign, samplesperblock))) + return error ; + + if (psf->file.mode == SFM_WRITE) + if ((error = ima_writer_init (psf, blockalign))) + return error ; + + psf->codec_close = ima_close ; + psf->seek = aiff_ima_seek ; + + return 0 ; +} /* aiff_ima_init */ + +static int +ima_close (SF_PRIVATE *psf) +{ IMA_ADPCM_PRIVATE *pima ; + + pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; + + if (psf->file.mode == SFM_WRITE) + { /* If a block has been partially assembled, write it out + ** as the final block. + */ + if (pima->samplecount && pima->samplecount < pima->samplesperblock) + pima->encode_block (psf, pima) ; + + psf->sf.frames = pima->samplesperblock * pima->blockcount / psf->sf.channels ; + } ; + + return 0 ; +} /* ima_close */ + +/*============================================================================================ +** IMA ADPCM Read Functions. +*/ + +static int +ima_reader_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) +{ IMA_ADPCM_PRIVATE *pima ; + int pimasize, count ; + + if (psf->file.mode != SFM_READ) + return SFE_BAD_MODE_RW ; + + pimasize = sizeof (IMA_ADPCM_PRIVATE) + blockalign * psf->sf.channels + 3 * psf->sf.channels * samplesperblock ; + + if (! (pima = calloc (1, pimasize))) + return SFE_MALLOC_FAILED ; + + psf->codec_data = (void*) pima ; + + pima->samples = pima->data ; + pima->block = (unsigned char*) (pima->data + samplesperblock * psf->sf.channels) ; + + pima->channels = psf->sf.channels ; + pima->blocksize = blockalign ; + pima->samplesperblock = samplesperblock ; + + psf->filelength = psf_get_filelen (psf) ; + psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : + psf->filelength - psf->dataoffset ; + + if (pima->blocksize <= 0) + { psf_log_printf (psf, "*** Error : pima->blocksize should be > 0.\n") ; + return SFE_INTERNAL ; + } ; + + if (pima->samplesperblock <= 0) + { psf_log_printf (psf, "*** Error : pima->samplesperblock should be > 0.\n") ; + return SFE_INTERNAL ; + } ; + + if (psf->datalength % pima->blocksize) + pima->blocks = psf->datalength / pima->blocksize + 1 ; + else + pima->blocks = psf->datalength / pima->blocksize ; + + switch (SF_CONTAINER (psf->sf.format)) + { case SF_FORMAT_WAV : + case SF_FORMAT_W64 : + count = 2 * (pima->blocksize - 4 * pima->channels) / pima->channels + 1 ; + + if (pima->samplesperblock != count) + { psf_log_printf (psf, "*** Error : samplesperblock should be %d.\n", count) ; + return SFE_INTERNAL ; + } ; + + pima->decode_block = wavlike_ima_decode_block ; + + psf->sf.frames = pima->samplesperblock * pima->blocks ; + break ; + + case SF_FORMAT_AIFF : + psf_log_printf (psf, "still need to check block count\n") ; + pima->decode_block = aiff_ima_decode_block ; + psf->sf.frames = pima->samplesperblock * pima->blocks / pima->channels ; + break ; + + default : + psf_log_printf (psf, "ima_reader_init: bad psf->sf.format\n") ; + return SFE_INTERNAL ; + } ; + + pima->decode_block (psf, pima) ; /* Read first block. */ + + psf->read_short = ima_read_s ; + psf->read_int = ima_read_i ; + psf->read_float = ima_read_f ; + psf->read_double = ima_read_d ; + + return 0 ; +} /* ima_reader_init */ + +static int +aiff_ima_decode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) +{ unsigned char *blockdata ; + int chan, k, diff, bytecode, predictor ; + short step, stepindx, *sampledata ; + +static int count = 0 ; +count ++ ; + + pima->blockcount += pima->channels ; + pima->samplecount = 0 ; + + if (pima->blockcount > pima->blocks) + { memset (pima->samples, 0, pima->samplesperblock * pima->channels * sizeof (short)) ; + return 1 ; + } ; + + if ((k = psf_fread (pima->block, 1, pima->blocksize * pima->channels, psf)) != pima->blocksize * pima->channels) + psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pima->blocksize) ; + + /* Read and check the block header. */ + for (chan = 0 ; chan < pima->channels ; chan++) + { blockdata = pima->block + chan * 34 ; + sampledata = pima->samples + chan ; + + /* Sign-extend from 16 bits to 32. */ + predictor = (int) ((short) ((blockdata [0] << 8) | (blockdata [1] & 0x80))) ; + + stepindx = blockdata [1] & 0x7F ; + stepindx = clamp_ima_step_index (stepindx) ; + + /* + ** Pull apart the packed 4 bit samples and store them in their + ** correct sample positions. + */ + for (k = 0 ; k < pima->blocksize - 2 ; k++) + { bytecode = blockdata [k + 2] ; + sampledata [pima->channels * (2 * k + 0)] = bytecode & 0xF ; + sampledata [pima->channels * (2 * k + 1)] = (bytecode >> 4) & 0xF ; + } ; + + /* Decode the encoded 4 bit samples. */ + for (k = 0 ; k < pima->samplesperblock ; k ++) + { step = ima_step_size [stepindx] ; + + bytecode = pima->samples [pima->channels * k + chan] ; + + stepindx += ima_indx_adjust [bytecode] ; + stepindx = clamp_ima_step_index (stepindx) ; + + diff = step >> 3 ; + if (bytecode & 1) diff += step >> 2 ; + if (bytecode & 2) diff += step >> 1 ; + if (bytecode & 4) diff += step ; + if (bytecode & 8) diff = -diff ; + + predictor += diff ; + if (predictor < -32768) + predictor = -32768 ; + else if (predictor > 32767) + predictor = 32767 ; + + pima->samples [pima->channels * k + chan] = predictor ; + } ; + } ; + + return 1 ; +} /* aiff_ima_decode_block */ + +static int +aiff_ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) +{ int chan, k, step, diff, vpdiff, blockindx, indx ; + short bytecode, mask ; + + k = 0 ; + for (chan = 0 ; chan < pima->channels ; chan ++) + { blockindx = chan * pima->blocksize ; + /* Encode the block header. */ + pima->block [blockindx++] = (pima->previous [chan] >> 8) & 0xFF ; + pima->block [blockindx++] = (pima->previous [chan] & 0x80) + (pima->stepindx [chan] & 0x7F) ; + + /* Encode the samples as 4 bit. */ + for (indx = chan ; indx < pima->samplesperblock * pima->channels ; indx += pima->channels) + { diff = pima->samples [indx] - pima->previous [chan] ; + + bytecode = 0 ; + step = ima_step_size [pima->stepindx [chan]] ; + vpdiff = step >> 3 ; + if (diff < 0) + { bytecode = 8 ; + diff = -diff ; + } ; + mask = 4 ; + while (mask) + { if (diff >= step) + { bytecode |= mask ; + diff -= step ; + vpdiff += step ; + } ; + step >>= 1 ; + mask >>= 1 ; + } ; + + if (bytecode & 8) + vpdiff = -vpdiff ; + pima->previous [chan] += vpdiff ; + + if (pima->previous [chan] > 32767) + pima->previous [chan] = 32767 ; + else if (pima->previous [chan] < -32768) + pima->previous [chan] = -32768 ; + + pima->stepindx [chan] += ima_indx_adjust [bytecode] ; + + pima->stepindx [chan] = clamp_ima_step_index (pima->stepindx [chan]) ; + pima->block [blockindx] = (bytecode << (4 * k)) | pima->block [blockindx] ; + blockindx += k ; + k = 1 - k ; + } ; + } ; + + /* Write the block to disk. */ + if ((k = psf_fwrite (pima->block, 1, pima->channels * pima->blocksize, psf)) != pima->channels * pima->blocksize) + psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pima->channels * pima->blocksize) ; + + memset (pima->block, 0, pima->channels * pima->blocksize) ; + pima->samplecount = 0 ; + pima->blockcount ++ ; + + return 1 ; +} /* aiff_ima_encode_block */ + +static int +wavlike_ima_decode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) +{ int chan, k, predictor, blockindx, indx, indxstart, diff ; + short step, bytecode, stepindx [2] ; + + pima->blockcount ++ ; + pima->samplecount = 0 ; + + if (pima->blockcount > pima->blocks) + { memset (pima->samples, 0, pima->samplesperblock * pima->channels * sizeof (short)) ; + return 1 ; + } ; + + if ((k = psf_fread (pima->block, 1, pima->blocksize, psf)) != pima->blocksize) + psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pima->blocksize) ; + + /* Read and check the block header. */ + + for (chan = 0 ; chan < pima->channels ; chan++) + { predictor = pima->block [chan*4] | (pima->block [chan*4+1] << 8) ; + if (predictor & 0x8000) + predictor -= 0x10000 ; + + stepindx [chan] = pima->block [chan*4+2] ; + stepindx [chan] = clamp_ima_step_index (stepindx [chan]) ; + + + if (pima->block [chan*4+3] != 0) + psf_log_printf (psf, "IMA ADPCM synchronisation error.\n") ; + + pima->samples [chan] = predictor ; + } ; + + /* + ** Pull apart the packed 4 bit samples and store them in their + ** correct sample positions. + */ + + blockindx = 4 * pima->channels ; + + indxstart = pima->channels ; + while (blockindx < pima->blocksize) + { for (chan = 0 ; chan < pima->channels ; chan++) + { indx = indxstart + chan ; + for (k = 0 ; k < 4 ; k++) + { bytecode = pima->block [blockindx++] ; + pima->samples [indx] = bytecode & 0x0F ; + indx += pima->channels ; + pima->samples [indx] = (bytecode >> 4) & 0x0F ; + indx += pima->channels ; + } ; + } ; + indxstart += 8 * pima->channels ; + } ; + + /* Decode the encoded 4 bit samples. */ + + for (k = pima->channels ; k < (pima->samplesperblock * pima->channels) ; k ++) + { chan = (pima->channels > 1) ? (k % 2) : 0 ; + + bytecode = pima->samples [k] & 0xF ; + + step = ima_step_size [stepindx [chan]] ; + predictor = pima->samples [k - pima->channels] ; + + diff = step >> 3 ; + if (bytecode & 1) + diff += step >> 2 ; + if (bytecode & 2) + diff += step >> 1 ; + if (bytecode & 4) + diff += step ; + if (bytecode & 8) + diff = -diff ; + + predictor += diff ; + + if (predictor > 32767) + predictor = 32767 ; + else if (predictor < -32768) + predictor = -32768 ; + + stepindx [chan] += ima_indx_adjust [bytecode] ; + stepindx [chan] = clamp_ima_step_index (stepindx [chan]) ; + + pima->samples [k] = predictor ; + } ; + + return 1 ; +} /* wavlike_ima_decode_block */ + +static int +wavlike_ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) +{ int chan, k, step, diff, vpdiff, blockindx, indx, indxstart ; + short bytecode, mask ; + + /* Encode the block header. */ + for (chan = 0 ; chan < pima->channels ; chan++) + { pima->block [chan*4] = pima->samples [chan] & 0xFF ; + pima->block [chan*4+1] = (pima->samples [chan] >> 8) & 0xFF ; + + pima->block [chan*4+2] = pima->stepindx [chan] ; + pima->block [chan*4+3] = 0 ; + + pima->previous [chan] = pima->samples [chan] ; + } ; + + /* Encode the samples as 4 bit. */ + + for (k = pima->channels ; k < (pima->samplesperblock * pima->channels) ; k ++) + { chan = (pima->channels > 1) ? (k % 2) : 0 ; + + diff = pima->samples [k] - pima->previous [chan] ; + + bytecode = 0 ; + step = ima_step_size [pima->stepindx [chan]] ; + vpdiff = step >> 3 ; + if (diff < 0) + { bytecode = 8 ; + diff = -diff ; + } ; + mask = 4 ; + while (mask) + { if (diff >= step) + { bytecode |= mask ; + diff -= step ; + vpdiff += step ; + } ; + step >>= 1 ; + mask >>= 1 ; + } ; + + if (bytecode & 8) + pima->previous [chan] -= vpdiff ; + else + pima->previous [chan] += vpdiff ; + + if (pima->previous [chan] > 32767) + pima->previous [chan] = 32767 ; + else if (pima->previous [chan] < -32768) + pima->previous [chan] = -32768 ; + + pima->stepindx [chan] += ima_indx_adjust [bytecode] ; + pima->stepindx [chan] = clamp_ima_step_index (pima->stepindx [chan]) ; + + pima->samples [k] = bytecode ; + } ; + + /* Pack the 4 bit encoded samples. */ + + blockindx = 4 * pima->channels ; + + indxstart = pima->channels ; + while (blockindx < pima->blocksize) + { for (chan = 0 ; chan < pima->channels ; chan++) + { indx = indxstart + chan ; + for (k = 0 ; k < 4 ; k++) + { pima->block [blockindx] = pima->samples [indx] & 0x0F ; + indx += pima->channels ; + pima->block [blockindx] |= (pima->samples [indx] << 4) & 0xF0 ; + indx += pima->channels ; + blockindx ++ ; + } ; + } ; + indxstart += 8 * pima->channels ; + } ; + + /* Write the block to disk. */ + + if ((k = psf_fwrite (pima->block, 1, pima->blocksize, psf)) != pima->blocksize) + psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pima->blocksize) ; + + memset (pima->samples, 0, pima->samplesperblock * sizeof (short)) ; + pima->samplecount = 0 ; + pima->blockcount ++ ; + + return 1 ; +} /* wavlike_ima_encode_block */ + +static int +ima_read_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len) +{ int count, total = 0, indx = 0 ; + + while (indx < len) + { if (pima->blockcount >= pima->blocks && pima->samplecount >= pima->samplesperblock) + { memset (&(ptr [indx]), 0, (size_t) ((len - indx) * sizeof (short))) ; + return total ; + } ; + + if (pima->samplecount >= pima->samplesperblock) + pima->decode_block (psf, pima) ; + + count = (pima->samplesperblock - pima->samplecount) * pima->channels ; + count = (len - indx > count) ? count : len - indx ; + + memcpy (&(ptr [indx]), &(pima->samples [pima->samplecount * pima->channels]), count * sizeof (short)) ; + indx += count ; + pima->samplecount += count / pima->channels ; + total = indx ; + } ; + + return total ; +} /* ima_read_block */ + +static sf_count_t +ima_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ IMA_ADPCM_PRIVATE *pima ; + int readcount, count ; + sf_count_t total = 0 ; + + if (! psf->codec_data) + return 0 ; + pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; + + while (len > 0) + { readcount = (len > 0x10000000) ? 0x10000000 : (int) len ; + + count = ima_read_block (psf, pima, ptr, readcount) ; + + total += count ; + len -= count ; + if (count != readcount) + break ; + } ; + + return total ; +} /* ima_read_s */ + +static sf_count_t +ima_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ IMA_ADPCM_PRIVATE *pima ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, readcount, count ; + sf_count_t total = 0 ; + + if (! psf->codec_data) + return 0 ; + pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : (int) len ; + count = ima_read_block (psf, pima, sptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = arith_shift_left (sptr [k], 16) ; + total += count ; + len -= readcount ; + if (count != readcount) + break ; + } ; + + return total ; +} /* ima_read_i */ + +static sf_count_t +ima_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ IMA_ADPCM_PRIVATE *pima ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, readcount, count ; + sf_count_t total = 0 ; + float normfact ; + + if (! psf->codec_data) + return 0 ; + pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : (int) len ; + count = ima_read_block (psf, pima, sptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * (float) (sptr [k]) ; + total += count ; + len -= readcount ; + if (count != readcount) + break ; + } ; + + return total ; +} /* ima_read_f */ + +static sf_count_t +ima_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ IMA_ADPCM_PRIVATE *pima ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, readcount, count ; + sf_count_t total = 0 ; + double normfact ; + + if (! psf->codec_data) + return 0 ; + pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : (int) len ; + count = ima_read_block (psf, pima, sptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * (double) (sptr [k]) ; + total += count ; + len -= readcount ; + if (count != readcount) + break ; + } ; + + return total ; +} /* ima_read_d */ + +static sf_count_t +aiff_ima_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) +{ IMA_ADPCM_PRIVATE *pima ; + int newblock, newsample, newblockaiff ; + + if (! psf->codec_data) + return 0 ; + pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; + + if (psf->datalength < 0 || psf->dataoffset < 0) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + if (offset == 0) + { psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + pima->blockcount = 0 ; + pima->decode_block (psf, pima) ; + pima->samplecount = 0 ; + return 0 ; + } ; + + if (offset < 0 || offset > pima->blocks * pima->samplesperblock) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + newblock = offset / pima->samplesperblock ; + newsample = offset % pima->samplesperblock ; + newblockaiff = newblock * psf->sf.channels ; + + if (mode == SFM_READ) + { psf_fseek (psf, psf->dataoffset + newblockaiff * pima->blocksize, SEEK_SET) ; + pima->blockcount = newblockaiff ; + pima->decode_block (psf, pima) ; + pima->samplecount = newsample ; + } + else + { /* What to do about write??? */ + psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + return newblock * pima->samplesperblock + newsample ; +} /* aiff_ima_seek */ + +static sf_count_t +wavlike_ima_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) +{ IMA_ADPCM_PRIVATE *pima ; + int newblock, newsample ; + + if (! psf->codec_data) + return 0 ; + pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; + + if (psf->datalength < 0 || psf->dataoffset < 0) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + if (offset == 0) + { psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + pima->blockcount = 0 ; + if (!pima->decode_block) + return PSF_SEEK_ERROR ; + + pima->decode_block (psf, pima) ; + pima->samplecount = 0 ; + return 0 ; + } ; + + if (offset < 0 || offset > pima->blocks * pima->samplesperblock) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + newblock = offset / pima->samplesperblock ; + newsample = offset % pima->samplesperblock ; + + if (mode == SFM_READ) + { psf_fseek (psf, psf->dataoffset + newblock * pima->blocksize, SEEK_SET) ; + pima->blockcount = newblock ; + pima->decode_block (psf, pima) ; + pima->samplecount = newsample ; + } + else + { /* What to do about write??? */ + psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + return newblock * pima->samplesperblock + newsample ; +} /* wavlike_ima_seek */ + +/*========================================================================================== +** IMA ADPCM Write Functions. +*/ + +static int +ima_writer_init (SF_PRIVATE *psf, int blockalign) +{ IMA_ADPCM_PRIVATE *pima ; + int samplesperblock ; + unsigned int pimasize ; + + if (psf->file.mode != SFM_WRITE) + return SFE_BAD_MODE_RW ; + + switch (SF_CONTAINER (psf->sf.format)) + { case SF_FORMAT_WAV : + case SF_FORMAT_W64 : + samplesperblock = 2 * (blockalign - 4 * psf->sf.channels) / psf->sf.channels + 1 ; + break ; + + case SF_FORMAT_AIFF : + samplesperblock = 2 * ((blockalign - 2) * psf->sf.channels) / psf->sf.channels ; + break ; + + default : + psf_log_printf (psf, "ima_reader_init: bad psf->sf.format\n") ; + return SFE_INTERNAL ; + } ; + + pimasize = sizeof (IMA_ADPCM_PRIVATE) + blockalign + 3 * psf->sf.channels * samplesperblock ; + + if ((pima = calloc (1, pimasize)) == NULL) + return SFE_MALLOC_FAILED ; + + psf->codec_data = (void*) pima ; + + pima->channels = psf->sf.channels ; + pima->blocksize = blockalign ; + pima->samplesperblock = samplesperblock ; + + pima->block = (unsigned char*) pima->data ; + pima->samples = (short*) (pima->data + blockalign) ; + + pima->samplecount = 0 ; + + switch (SF_CONTAINER (psf->sf.format)) + { case SF_FORMAT_WAV : + case SF_FORMAT_W64 : + pima->encode_block = wavlike_ima_encode_block ; + break ; + + case SF_FORMAT_AIFF : + pima->encode_block = aiff_ima_encode_block ; + break ; + + default : + psf_log_printf (psf, "ima_reader_init: bad psf->sf.format\n") ; + return SFE_INTERNAL ; + } ; + + psf->write_short = ima_write_s ; + psf->write_int = ima_write_i ; + psf->write_float = ima_write_f ; + psf->write_double = ima_write_d ; + + return 0 ; +} /* ima_writer_init */ + +/*========================================================================================== +*/ + +static int +ima_write_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, const short *ptr, int len) +{ int count, total = 0, indx = 0 ; + + while (indx < len) + { count = (pima->samplesperblock - pima->samplecount) * pima->channels ; + + if (count > len - indx) + count = len - indx ; + + memcpy (&(pima->samples [pima->samplecount * pima->channels]), &(ptr [total]), count * sizeof (short)) ; + indx += count ; + pima->samplecount += count / pima->channels ; + total = indx ; + + if (pima->samplecount >= pima->samplesperblock) + pima->encode_block (psf, pima) ; + } ; + + return total ; +} /* ima_write_block */ + +static sf_count_t +ima_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ IMA_ADPCM_PRIVATE *pima ; + int writecount, count ; + sf_count_t total = 0 ; + + if (! psf->codec_data) + return 0 ; + pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; + + while (len) + { writecount = (len > 0x10000000) ? 0x10000000 : (int) len ; + + count = ima_write_block (psf, pima, ptr, writecount) ; + + total += count ; + len -= count ; + if (count != writecount) + break ; + } ; + + return total ; +} /* ima_write_s */ + +static sf_count_t +ima_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ IMA_ADPCM_PRIVATE *pima ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, writecount, count ; + sf_count_t total = 0 ; + + if (! psf->codec_data) + return 0 ; + pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : (int) len ; + for (k = 0 ; k < writecount ; k++) + sptr [k] = ptr [total + k] >> 16 ; + count = ima_write_block (psf, pima, sptr, writecount) ; + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + + return total ; +} /* ima_write_i */ + +static sf_count_t +ima_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ IMA_ADPCM_PRIVATE *pima ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, writecount, count ; + sf_count_t total = 0 ; + float normfact ; + + if (! psf->codec_data) + return 0 ; + pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : (int) len ; + for (k = 0 ; k < writecount ; k++) + sptr [k] = psf_lrintf (normfact * ptr [total + k]) ; + count = ima_write_block (psf, pima, sptr, writecount) ; + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + + return total ; +} /* ima_write_f */ + +static sf_count_t +ima_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ IMA_ADPCM_PRIVATE *pima ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, writecount, count ; + sf_count_t total = 0 ; + double normfact ; + + if (! psf->codec_data) + return 0 ; + pima = (IMA_ADPCM_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : (int) len ; + for (k = 0 ; k < writecount ; k++) + sptr [k] = psf_lrint (normfact * ptr [total + k]) ; + count = ima_write_block (psf, pima, sptr, writecount) ; + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + + return total ; +} /* ima_write_d */ + diff --git a/libsndfile-1.0.31/src/ima_oki_adpcm.c b/libsndfile-1.0.31/src/ima_oki_adpcm.c new file mode 100644 index 0000000..2532160 --- /dev/null +++ b/libsndfile-1.0.31/src/ima_oki_adpcm.c @@ -0,0 +1,297 @@ +/* +** Copyright (C) 2007-2014 Erik de Castro Lopo +** Copyright (c) 2007 +** +** This library is free software; you can redistribute it and/or modify it +** under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2 of the License, or (at +** your option) any later version. +** +** This library is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser +** General Public License for more details. +** +** You should have received a copy of the GNU Lesser General Public License +** along with this library. If not, write to the Free Software Foundation, +** Fifth Floor, 51 Franklin Street, Boston, MA 02111-1301, USA. +*/ + +/* ADPCM: IMA, OKI <==> 16-bit PCM. */ + +#include "sfconfig.h" + +#include + +/* Set up for libsndfile environment: */ +#include "common.h" + +#include "ima_oki_adpcm.h" + +#define MIN_SAMPLE -0x8000 +#define MAX_SAMPLE 0x7fff + +static int const ima_steps [] = /* ~16-bit precision */ +{ 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, + 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, + 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, + 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, + 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, + 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, + 32767 +} ; + +static int const oki_steps [] = /* ~12-bit precision */ +{ 256, 272, 304, 336, 368, 400, 448, 496, 544, 592, 656, 720, 800, 880, 960, + 1056, 1168, 1280, 1408, 1552, 1712, 1888, 2080, 2288, 2512, 2768, 3040, 3344, + 3680, 4048, 4464, 4912, 5392, 5936, 6528, 7184, 7904, 8704, 9568, 10528, + 11584, 12736, 14016, 15408, 16960, 18656, 20512, 22576, 24832 +} ; + +static int const step_changes [] = { -1, -1, -1, -1, 2, 4, 6, 8 } ; + +void +ima_oki_adpcm_init (IMA_OKI_ADPCM * state, IMA_OKI_ADPCM_TYPE type) +{ + memset (state, 0, sizeof (*state)) ; + + if (type == IMA_OKI_ADPCM_TYPE_IMA) + { state->max_step_index = ARRAY_LEN (ima_steps) - 1 ; + state->steps = ima_steps ; + state->mask = (~0) ; + } + else + { state->max_step_index = ARRAY_LEN (oki_steps) - 1 ; + state->steps = oki_steps ; + state->mask = arith_shift_left (~0, 4) ; + } ; + +} /* ima_oki_adpcm_init */ + + +int +adpcm_decode (IMA_OKI_ADPCM * state, int code) +{ int s ; + + s = ((code & 7) << 1) | 1 ; + s = ((state->steps [state->step_index] * s) >> 3) & state->mask ; + + if (code & 8) + s = -s ; + s += state->last_output ; + + if (s < MIN_SAMPLE || s > MAX_SAMPLE) + { int grace ; + + grace = (state->steps [state->step_index] >> 3) & state->mask ; + + if (s < MIN_SAMPLE - grace || s > MAX_SAMPLE + grace) + state->errors ++ ; + + s = s < MIN_SAMPLE ? MIN_SAMPLE : MAX_SAMPLE ; + } ; + + state->step_index += step_changes [code & 7] ; + state->step_index = SF_MIN (SF_MAX (state->step_index, 0), state->max_step_index) ; + state->last_output = s ; + + return s ; +} /* adpcm_decode */ + +int +adpcm_encode (IMA_OKI_ADPCM * state, int sample) +{ int delta, sign = 0, code ; + + delta = sample - state->last_output ; + + if (delta < 0) + { sign = 8 ; + delta = -delta ; + } ; + + code = 4 * delta / state->steps [state->step_index] ; + code = sign | SF_MIN (code, 7) ; + adpcm_decode (state, code) ; /* Update encoder state */ + + return code ; +} /* adpcm_encode */ + + +void +ima_oki_adpcm_decode_block (IMA_OKI_ADPCM * state) +{ unsigned char code ; + int k ; + + for (k = 0 ; k < state->code_count ; k++) + { code = state->codes [k] ; + state->pcm [2 * k] = adpcm_decode (state, code >> 4) ; + state->pcm [2 * k + 1] = adpcm_decode (state, code) ; + } ; + + state->pcm_count = 2 * k ; +} /* ima_oki_adpcm_decode_block */ + + +void +ima_oki_adpcm_encode_block (IMA_OKI_ADPCM * state) +{ unsigned char code ; + int k ; + + /* + ** The codec expects an even number of input samples. + ** + ** Samples should always be passed in even length blocks. If the last block to + ** be encoded is odd length, extend that block by one zero valued sample. + */ + if (state->pcm_count % 2 == 1) + state->pcm [state->pcm_count ++] = 0 ; + + for (k = 0 ; k < state->pcm_count / 2 ; k++) + { code = adpcm_encode (state, state->pcm [2 * k]) << 4 ; + code |= adpcm_encode (state, state->pcm [2 * k + 1]) ; + state->codes [k] = code ; + } ; + + state->code_count = k ; +} /* ima_oki_adpcm_encode_block */ + + +#ifdef TEST + +static const unsigned char test_codes [] = +{ 0x08, 0x08, 0x04, 0x7f, 0x72, 0xf7, 0x9f, 0x7c, 0xd7, 0xbc, 0x7a, 0xa7, 0xb8, + 0x4b, 0x0b, 0x38, 0xf6, 0x9d, 0x7a, 0xd7, 0xbc, 0x7a, 0xd7, 0xa8, 0x6c, 0x81, + 0x98, 0xe4, 0x0e, 0x7a, 0xd7, 0x9e, 0x7b, 0xc7, 0xab, 0x7a, 0x85, 0xc0, 0xb3, + 0x8f, 0x58, 0xd7, 0xad, 0x7a, 0xd7, 0xad, 0x7a, 0x87, 0xd0, 0x2b, 0x0e, 0x48, + 0xd7, 0xad, 0x78, 0xf7, 0xbc, 0x7a, 0xb7, 0xa8, 0x4b, 0x88, 0x18, 0xd5, 0x8d, + 0x6a, 0xa4, 0x98, 0x08, 0x00, 0x80, 0x88, +} ; + +static const short test_pcm [] = +{ 32, 0, 32, 0, 32, 320, 880, -336, 2304, 4192, -992, 10128, 5360, -16352, + 30208, 2272, -31872, 14688, -7040, -32432, 14128, -1392, -15488, 22960, + 1232, -1584, 21488, -240, 2576, -15360, 960, -1152, -30032, 10320, 1008, + -30032, 16528, 1008, -30032, 16528, -5200, -30592, 15968, 448, -30592, + 15968, 448, -2368, 30960, 3024, -80, 8384, 704, -1616, -29168, -1232, 1872, + -32768, 13792, -1728, -32768, 13792, 4480, -32192, 14368, -7360, -32752, + 13808, -1712, -21456, 16992, 1472, -1344, 26848, -1088, 2016, -17728, 208, + -2112, -32768, 1376, -1728, -32768, 13792, -1728, -32768, 13792, -1728, + -32768, 13792, -1728, -32768, 13792, -1728, -4544, 32767, -1377, 1727, + 15823, -2113, 207, -27345, 591, -2513, -32768, 13792, -1728, -32768, 13792, + 10688, -31632, 14928, -6800, -32192, 14368, -1152, -20896, 17552, 2032, + -784, 22288, 560, -2256, -4816, 2176, 64, -21120, 9920, 6816, -24224, 16128, + 608, -13488, 9584, 272, -2544, 16, -2304, -192, 1728, -16, 1568, 128, -1184, +} ; + + +static void +test_oki_adpcm (void) +{ + IMA_OKI_ADPCM adpcm ; + unsigned char code ; + int i, j ; + + printf (" Testing encoder : ") ; + fflush (stdout) ; + + ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ; + for (i = 0 ; i < ARRAY_LEN (test_codes) ; i++) + for (j = 0, code = test_codes [i] ; j < 2 ; j++, code <<= 4) + if (adpcm_decode (&adpcm, code >> 4) != test_pcm [2 * i + j]) + { printf ("\n\nFail at i = %d, j = %d.\n\n", i, j) ; + exit (1) ; + } ; + + puts ("ok") ; + + printf (" Testing decoder : ") ; + fflush (stdout) ; + + ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ; + for (i = 0 ; i < ARRAY_LEN (test_pcm) ; i += j) + { code = adpcm_encode (&adpcm, test_pcm [i]) ; + code = (code << 4) | adpcm_encode (&adpcm, test_pcm [i + 1]) ; + if (code != test_codes [i / 2]) + { printf ("\n\nFail at i = %d, %d should be %d\n\n", i, code, test_codes [i / 2]) ; + exit (1) ; + } ; + } ; + + puts ("ok") ; +} /* test_oki_adpcm */ + +static void +test_oki_adpcm_block (void) +{ + IMA_OKI_ADPCM adpcm ; + int k ; + + if (ARRAY_LEN (adpcm.pcm) < ARRAY_LEN (test_pcm)) + { printf ("\n\nLine %d : ARRAY_LEN (adpcm->pcm) > ARRAY_LEN (test_pcm) (%d > %d).\n\n", __LINE__, ARRAY_LEN (adpcm.pcm), ARRAY_LEN (test_pcm)) ; + exit (1) ; + } ; + + if (ARRAY_LEN (adpcm.codes) < ARRAY_LEN (test_codes)) + { printf ("\n\nLine %d : ARRAY_LEN (adcodes->codes) > ARRAY_LEN (test_codes).n", __LINE__) ; + exit (1) ; + } ; + + printf (" Testing block encoder : ") ; + fflush (stdout) ; + + ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ; + + memcpy (adpcm.pcm, test_pcm, sizeof (adpcm.pcm [0]) * ARRAY_LEN (test_pcm)) ; + adpcm.pcm_count = ARRAY_LEN (test_pcm) ; + adpcm.code_count = 13 ; + + ima_oki_adpcm_encode_block (&adpcm) ; + + if (adpcm.code_count * 2 != ARRAY_LEN (test_pcm)) + { printf ("\n\nLine %d : %d * 2 != %d\n\n", __LINE__, adpcm.code_count * 2, ARRAY_LEN (test_pcm)) ; + exit (1) ; + } ; + + for (k = 0 ; k < ARRAY_LEN (test_codes) ; k++) + if (adpcm.codes [k] != test_codes [k]) + { printf ("\n\nLine %d : Fail at k = %d, %d should be %d\n\n", __LINE__, k, adpcm.codes [k], test_codes [k]) ; + exit (1) ; + } ; + + puts ("ok") ; + + printf (" Testing block decoder : ") ; + fflush (stdout) ; + + ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ; + + memcpy (adpcm.codes, test_codes, sizeof (adpcm.codes [0]) * ARRAY_LEN (test_codes)) ; + adpcm.code_count = ARRAY_LEN (test_codes) ; + adpcm.pcm_count = 13 ; + + ima_oki_adpcm_decode_block (&adpcm) ; + + if (adpcm.pcm_count != 2 * ARRAY_LEN (test_codes)) + { printf ("\n\nLine %d : %d * 2 != %d\n\n", __LINE__, adpcm.pcm_count, 2 * ARRAY_LEN (test_codes)) ; + exit (1) ; + } ; + + for (k = 0 ; k < ARRAY_LEN (test_pcm) ; k++) + if (adpcm.pcm [k] != test_pcm [k]) + { printf ("\n\nLine %d : Fail at i = %d, %d should be %d.\n\n", __LINE__, k, adpcm.pcm [k], test_pcm [k]) ; + exit (1) ; + } ; + + puts ("ok") ; +} /* test_oki_adpcm_block */ + +int +main (void) +{ + test_oki_adpcm () ; + test_oki_adpcm_block () ; + + return 0 ; +} /* main */ + +#endif diff --git a/libsndfile-1.0.31/src/ima_oki_adpcm.h b/libsndfile-1.0.31/src/ima_oki_adpcm.h new file mode 100644 index 0000000..86241e7 --- /dev/null +++ b/libsndfile-1.0.31/src/ima_oki_adpcm.h @@ -0,0 +1,54 @@ +/* +** Copyright (C) 2007-2011 Erik de Castro Lopo +** Copyright (c) 2007 +** +** This library is free software; you can redistribute it and/or modify it +** under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2 of the License, or (at +** your option) any later version. +** +** This library is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser +** General Public License for more details. +** +** You should have received a copy of the GNU Lesser General Public License +** along with this library. If not, write to the Free Software Foundation, +** Fifth Floor, 51 Franklin Street, Boston, MA 02111-1301, USA. +*/ + +/* ADPCM: IMA, OKI <==> 16-bit PCM. */ + + +#define IMA_OKI_ADPCM_CODE_LEN 256 +#define IMA_OKI_ADPCM_PCM_LEN (IMA_OKI_ADPCM_CODE_LEN *2) + +typedef struct +{ + /* private: */ + int mask ; + int last_output ; + int step_index ; + int max_step_index ; + int const * steps ; + + /* public: */ + int errors ; + int code_count, pcm_count ; + + unsigned char codes [IMA_OKI_ADPCM_CODE_LEN] ; + short pcm [IMA_OKI_ADPCM_PCM_LEN] ; +} IMA_OKI_ADPCM ; + +typedef enum +{ IMA_OKI_ADPCM_TYPE_IMA, + IMA_OKI_ADPCM_TYPE_OKI +} IMA_OKI_ADPCM_TYPE ; + +void ima_oki_adpcm_init (IMA_OKI_ADPCM * state, IMA_OKI_ADPCM_TYPE type) ; + +int adpcm_decode (IMA_OKI_ADPCM * state, int /* 0..15 */ code) ; +int adpcm_encode (IMA_OKI_ADPCM * state, int /* -32768..32767 */ sample) ; + +void ima_oki_adpcm_decode_block (IMA_OKI_ADPCM * state) ; +void ima_oki_adpcm_encode_block (IMA_OKI_ADPCM * state) ; diff --git a/libsndfile-1.0.31/src/interleave.c b/libsndfile-1.0.31/src/interleave.c new file mode 100644 index 0000000..5f79944 --- /dev/null +++ b/libsndfile-1.0.31/src/interleave.c @@ -0,0 +1,299 @@ +/* +** Copyright (C) 2002-2013 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfendian.h" + +#include + +#include "sndfile.h" +#include "common.h" + +#define INTERLEAVE_CHANNELS 6 + +typedef struct +{ double buffer [SF_BUFFER_LEN / sizeof (double)] ; + + sf_count_t channel_len ; + + sf_count_t (*read_short) (SF_PRIVATE*, short *ptr, sf_count_t len) ; + sf_count_t (*read_int) (SF_PRIVATE*, int *ptr, sf_count_t len) ; + sf_count_t (*read_float) (SF_PRIVATE*, float *ptr, sf_count_t len) ; + sf_count_t (*read_double) (SF_PRIVATE*, double *ptr, sf_count_t len) ; + +} INTERLEAVE_DATA ; + + + +static sf_count_t interleave_read_short (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t interleave_read_int (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t interleave_read_float (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t interleave_read_double (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t interleave_seek (SF_PRIVATE*, int mode, sf_count_t samples_from_start) ; + + + + +int +interleave_init (SF_PRIVATE *psf) +{ INTERLEAVE_DATA *pdata ; + + if (psf->file.mode != SFM_READ) + return SFE_INTERLEAVE_MODE ; + + if (psf->interleave) + { psf_log_printf (psf, "*** Weird, already have interleave.\n") ; + return 666 ; + } ; + + /* Free this in sf_close() function. */ + if (! (pdata = malloc (sizeof (INTERLEAVE_DATA)))) + return SFE_MALLOC_FAILED ; + +puts ("interleave_init") ; + + psf->interleave = pdata ; + + /* Save the existing methods. */ + pdata->read_short = psf->read_short ; + pdata->read_int = psf->read_int ; + pdata->read_float = psf->read_float ; + pdata->read_double = psf->read_double ; + + pdata->channel_len = psf->sf.frames * psf->bytewidth ; + + /* Insert our new methods. */ + psf->read_short = interleave_read_short ; + psf->read_int = interleave_read_int ; + psf->read_float = interleave_read_float ; + psf->read_double = interleave_read_double ; + + psf->seek = interleave_seek ; + + return 0 ; +} /* pcm_interleave_init */ + +/*------------------------------------------------------------------------------ +*/ + +static sf_count_t +interleave_read_short (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ INTERLEAVE_DATA *pdata ; + sf_count_t offset, templen ; + int chan, count, k ; + short *inptr, *outptr ; + + if (! (pdata = psf->interleave)) + return 0 ; + + inptr = (short*) pdata->buffer ; + + for (chan = 0 ; chan < psf->sf.channels ; chan++) + { outptr = ptr + chan ; + + offset = psf->dataoffset + chan * psf->bytewidth * psf->read_current ; + + if (psf_fseek (psf, offset, SEEK_SET) != offset) + { psf->error = SFE_INTERLEAVE_SEEK ; + return 0 ; + } ; + + templen = len / psf->sf.channels ; + + while (templen > 0) + { if (templen > SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (short)) + count = SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (short) ; + else + count = (int) templen ; + + if (pdata->read_short (psf, inptr, count) != count) + { psf->error = SFE_INTERLEAVE_READ ; + return 0 ; + } ; + + for (k = 0 ; k < count ; k++) + { *outptr = inptr [k] ; + outptr += psf->sf.channels ; + } ; + + templen -= count ; + } ; + } ; + + return len ; +} /* interleave_read_short */ + +static sf_count_t +interleave_read_int (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ INTERLEAVE_DATA *pdata ; + sf_count_t offset, templen ; + int chan, count, k ; + int *inptr, *outptr ; + + if (! (pdata = psf->interleave)) + return 0 ; + + inptr = (int*) pdata->buffer ; + + for (chan = 0 ; chan < psf->sf.channels ; chan++) + { outptr = ptr + chan ; + + offset = psf->dataoffset + chan * psf->bytewidth * psf->read_current ; + + if (psf_fseek (psf, offset, SEEK_SET) != offset) + { psf->error = SFE_INTERLEAVE_SEEK ; + return 0 ; + } ; + + templen = len / psf->sf.channels ; + + while (templen > 0) + { if (templen > SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (int)) + count = SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (int) ; + else + count = (int) templen ; + + if (pdata->read_int (psf, inptr, count) != count) + { psf->error = SFE_INTERLEAVE_READ ; + return 0 ; + } ; + + for (k = 0 ; k < count ; k++) + { *outptr = inptr [k] ; + outptr += psf->sf.channels ; + } ; + + templen -= count ; + } ; + } ; + + return len ; +} /* interleave_read_int */ + +static sf_count_t +interleave_read_float (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ INTERLEAVE_DATA *pdata ; + sf_count_t offset, templen ; + int chan, count, k ; + float *inptr, *outptr ; + + if (! (pdata = psf->interleave)) + return 0 ; + + inptr = (float*) pdata->buffer ; + + for (chan = 0 ; chan < psf->sf.channels ; chan++) + { outptr = ptr + chan ; + + offset = psf->dataoffset + pdata->channel_len * chan + psf->read_current * psf->bytewidth ; + +/*-printf ("chan : %d read_current : %6lld offset : %6lld\n", chan, psf->read_current, offset) ;-*/ + + if (psf_fseek (psf, offset, SEEK_SET) != offset) + { psf->error = SFE_INTERLEAVE_SEEK ; +/*-puts ("interleave_seek error") ; exit (1) ;-*/ + return 0 ; + } ; + + templen = len / psf->sf.channels ; + + while (templen > 0) + { if (templen > SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (float)) + count = SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (float) ; + else + count = (int) templen ; + + if (pdata->read_float (psf, inptr, count) != count) + { psf->error = SFE_INTERLEAVE_READ ; +/*-puts ("interleave_read error") ; exit (1) ;-*/ + return 0 ; + } ; + + for (k = 0 ; k < count ; k++) + { *outptr = inptr [k] ; + outptr += psf->sf.channels ; + } ; + + templen -= count ; + } ; + } ; + + return len ; +} /* interleave_read_float */ + +static sf_count_t +interleave_read_double (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ INTERLEAVE_DATA *pdata ; + sf_count_t offset, templen ; + int chan, count, k ; + double *inptr, *outptr ; + + if (! (pdata = psf->interleave)) + return 0 ; + + inptr = (double*) pdata->buffer ; + + for (chan = 0 ; chan < psf->sf.channels ; chan++) + { outptr = ptr + chan ; + + offset = psf->dataoffset + chan * psf->bytewidth * psf->read_current ; + + if (psf_fseek (psf, offset, SEEK_SET) != offset) + { psf->error = SFE_INTERLEAVE_SEEK ; + return 0 ; + } ; + + templen = len / psf->sf.channels ; + + while (templen > 0) + { if (templen > SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (double)) + count = SIGNED_SIZEOF (pdata->buffer) / SIGNED_SIZEOF (double) ; + else + count = (int) templen ; + + if (pdata->read_double (psf, inptr, count) != count) + { psf->error = SFE_INTERLEAVE_READ ; + return 0 ; + } ; + + for (k = 0 ; k < count ; k++) + { *outptr = inptr [k] ; + outptr += psf->sf.channels ; + } ; + + templen -= count ; + } ; + } ; + + return len ; +} /* interleave_read_double */ + +/*------------------------------------------------------------------------------ +*/ + +static sf_count_t +interleave_seek (SF_PRIVATE * UNUSED (psf), int UNUSED (mode), sf_count_t samples_from_start) +{ + /* + ** Do nothing here. This is a place holder to prevent the default + ** seek function from being called. + */ + + return samples_from_start ; +} /* interleave_seek */ + diff --git a/libsndfile-1.0.31/src/ircam.c b/libsndfile-1.0.31/src/ircam.c new file mode 100644 index 0000000..8e7cdba --- /dev/null +++ b/libsndfile-1.0.31/src/ircam.c @@ -0,0 +1,323 @@ +/* +** Copyright (C) 2001-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +/*------------------------------------------------------------------------------ +** Macros to handle big/little endian issues. +*/ + +/* The IRCAM magic number is weird in that one byte in the number can have +** values of 0x1, 0x2, 0x03 or 0x04. Hence the need for a marker and a mask. +*/ + +#define IRCAM_BE_MASK (MAKE_MARKER (0xFF, 0xFF, 0x00, 0xFF)) +#define IRCAM_BE_MARKER (MAKE_MARKER (0x64, 0xA3, 0x00, 0x00)) + +#define IRCAM_LE_MASK (MAKE_MARKER (0xFF, 0x00, 0xFF, 0xFF)) +#define IRCAM_LE_MARKER (MAKE_MARKER (0x00, 0x00, 0xA3, 0x64)) + +#define IRCAM_02B_MARKER (MAKE_MARKER (0x64, 0xA3, 0x02, 0x00)) +#define IRCAM_03L_MARKER (MAKE_MARKER (0x64, 0xA3, 0x03, 0x00)) + +#define IRCAM_DATA_OFFSET (1024) + +/*------------------------------------------------------------------------------ +** Typedefs. +*/ + +enum +{ IRCAM_PCM_16 = 0x00002, + IRCAM_FLOAT = 0x00004, + IRCAM_ALAW = 0x10001, + IRCAM_ULAW = 0x20001, + IRCAM_PCM_32 = 0x40004 +} ; + + +/*------------------------------------------------------------------------------ +** Private static functions. +*/ + +static int ircam_close (SF_PRIVATE *psf) ; +static int ircam_write_header (SF_PRIVATE *psf, int calc_length) ; +static int ircam_read_header (SF_PRIVATE *psf) ; + +static int get_encoding (int subformat) ; + +static const char* get_encoding_str (int encoding) ; + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +ircam_open (SF_PRIVATE *psf) +{ int subformat ; + int error = SFE_NO_ERROR ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = ircam_read_header (psf))) + return error ; + } ; + + subformat = SF_CODEC (psf->sf.format) ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_IRCAM) + return SFE_BAD_OPEN_FORMAT ; + + psf->endian = SF_ENDIAN (psf->sf.format) ; + if (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU) + psf->endian = (CPU_IS_BIG_ENDIAN) ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ; + + psf->dataoffset = IRCAM_DATA_OFFSET ; + + if ((error = ircam_write_header (psf, SF_FALSE))) + return error ; + + psf->write_header = ircam_write_header ; + } ; + + psf->container_close = ircam_close ; + + switch (subformat) + { case SF_FORMAT_ULAW : /* 8-bit Ulaw encoding. */ + error = ulaw_init (psf) ; + break ; + + case SF_FORMAT_ALAW : /* 8-bit Alaw encoding. */ + error = alaw_init (psf) ; + break ; + + case SF_FORMAT_PCM_16 : /* 16-bit linear PCM. */ + case SF_FORMAT_PCM_32 : /* 32-bit linear PCM. */ + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_FLOAT : /* 32-bit linear PCM. */ + error = float32_init (psf) ; + break ; + + default : break ; + } ; + + return error ; +} /* ircam_open */ + +/*------------------------------------------------------------------------------ +*/ + +static int +ircam_read_header (SF_PRIVATE *psf) +{ unsigned int marker, encoding ; + float samplerate ; + int error = SFE_NO_ERROR ; + + psf_binheader_readf (psf, "epmf44", 0, &marker, &samplerate, &(psf->sf.channels), &encoding) ; + + if (((marker & IRCAM_BE_MASK) != IRCAM_BE_MARKER) && ((marker & IRCAM_LE_MASK) != IRCAM_LE_MARKER)) + { psf_log_printf (psf, "marker: 0x%X\n", marker) ; + return SFE_IRCAM_NO_MARKER ; + } ; + + psf->endian = SF_ENDIAN_LITTLE ; + + if (psf->sf.channels > SF_MAX_CHANNELS) + { psf_binheader_readf (psf, "Epmf44", 0, &marker, &samplerate, &(psf->sf.channels), &encoding) ; + + /* Sanity checking for endian-ness detection. */ + if (psf->sf.channels > SF_MAX_CHANNELS) + { psf_log_printf (psf, "marker: 0x%X\n", marker) ; + return SFE_IRCAM_BAD_CHANNELS ; + } ; + + psf->endian = SF_ENDIAN_BIG ; + } ; + + psf_log_printf (psf, "marker: 0x%X\n", marker) ; + + psf->sf.samplerate = (int) samplerate ; + + psf_log_printf (psf, " Sample Rate : %d\n" + " Channels : %d\n" + " Encoding : %X => %s\n", + psf->sf.samplerate, psf->sf.channels, encoding, get_encoding_str (encoding)) ; + + switch (encoding) + { case IRCAM_PCM_16 : + psf->bytewidth = 2 ; + psf->blockwidth = psf->sf.channels * psf->bytewidth ; + + psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_16 ; + break ; + + case IRCAM_PCM_32 : + psf->bytewidth = 4 ; + psf->blockwidth = psf->sf.channels * psf->bytewidth ; + + psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_32 ; + break ; + + case IRCAM_FLOAT : + psf->bytewidth = 4 ; + psf->blockwidth = psf->sf.channels * psf->bytewidth ; + + psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_FLOAT ; + break ; + + case IRCAM_ALAW : + psf->bytewidth = 1 ; + psf->blockwidth = psf->sf.channels * psf->bytewidth ; + + psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_ALAW ; + break ; + + case IRCAM_ULAW : + psf->bytewidth = 1 ; + psf->blockwidth = psf->sf.channels * psf->bytewidth ; + + psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_ULAW ; + break ; + + default : + error = SFE_IRCAM_UNKNOWN_FORMAT ; + break ; + } ; + + if (psf->endian == SF_ENDIAN_BIG) + psf->sf.format |= SF_ENDIAN_BIG ; + else + psf->sf.format |= SF_ENDIAN_LITTLE ; + + if (error) + return error ; + + psf->dataoffset = IRCAM_DATA_OFFSET ; + psf->datalength = psf->filelength - psf->dataoffset ; + + if (psf->sf.frames == 0 && psf->blockwidth) + psf->sf.frames = psf->datalength / psf->blockwidth ; + + psf_log_printf (psf, " Samples : %d\n", psf->sf.frames) ; + + psf_binheader_readf (psf, "p", IRCAM_DATA_OFFSET) ; + + return 0 ; +} /* ircam_read_header */ + +static int +ircam_close (SF_PRIVATE *psf) +{ + psf_log_printf (psf, "close\n") ; + + return 0 ; +} /* ircam_close */ + +static int +ircam_write_header (SF_PRIVATE *psf, int UNUSED (calc_length)) +{ int encoding ; + float samplerate ; + sf_count_t current ; + + if (psf->pipeoffset > 0) + return 0 ; + + current = psf_ftell (psf) ; + + /* This also sets psf->endian. */ + encoding = get_encoding (SF_CODEC (psf->sf.format)) ; + + if (encoding == 0) + return SFE_BAD_OPEN_FORMAT ; + + /* Reset the current header length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + + if (psf->is_pipe == SF_FALSE) + psf_fseek (psf, 0, SEEK_SET) ; + + samplerate = psf->sf.samplerate ; + + switch (psf->endian) + { case SF_ENDIAN_BIG : + psf_binheader_writef (psf, "Emf", BHWm (IRCAM_02B_MARKER), BHWf (samplerate)) ; + psf_binheader_writef (psf, "E44", BHW4 (psf->sf.channels), BHW4 (encoding)) ; + break ; + + case SF_ENDIAN_LITTLE : + psf_binheader_writef (psf, "emf", BHWm (IRCAM_03L_MARKER), BHWf (samplerate)) ; + psf_binheader_writef (psf, "e44", BHW4 (psf->sf.channels), BHW4 (encoding)) ; + break ; + + default : return SFE_BAD_OPEN_FORMAT ; + } ; + + psf_binheader_writef (psf, "z", BHWz ((size_t) (IRCAM_DATA_OFFSET - psf->header.indx))) ; + + /* Header construction complete so write it out. */ + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + if (psf->error) + return psf->error ; + + if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + + return psf->error ; +} /* ircam_write_header */ + +static int +get_encoding (int subformat) +{ switch (subformat) + { case SF_FORMAT_PCM_16 : return IRCAM_PCM_16 ; + case SF_FORMAT_PCM_32 : return IRCAM_PCM_32 ; + + case SF_FORMAT_FLOAT : return IRCAM_FLOAT ; + + case SF_FORMAT_ULAW : return IRCAM_ULAW ; + case SF_FORMAT_ALAW : return IRCAM_ALAW ; + + default : break ; + } ; + + return 0 ; +} /* get_encoding */ + +static const char* +get_encoding_str (int encoding) +{ switch (encoding) + { case IRCAM_PCM_16 : return "16 bit PCM" ; + case IRCAM_FLOAT : return "32 bit float" ; + case IRCAM_ALAW : return "A law" ; + case IRCAM_ULAW : return "u law" ; + case IRCAM_PCM_32 : return "32 bit PCM" ; + } ; + return "Unknown encoding" ; +} /* get_encoding_str */ + diff --git a/libsndfile-1.0.31/src/libsndfile-1.def b/libsndfile-1.0.31/src/libsndfile-1.def new file mode 100644 index 0000000..591d931 --- /dev/null +++ b/libsndfile-1.0.31/src/libsndfile-1.def @@ -0,0 +1,46 @@ +; Auto-generated by create_symbols_file.py + +EXPORTS + +sf_command @1 +sf_open @2 +sf_close @3 +sf_seek @4 +sf_error @7 +sf_perror @8 +sf_error_str @9 +sf_error_number @10 +sf_format_check @11 +sf_read_raw @16 +sf_readf_short @17 +sf_readf_int @18 +sf_readf_float @19 +sf_readf_double @20 +sf_read_short @21 +sf_read_int @22 +sf_read_float @23 +sf_read_double @24 +sf_write_raw @32 +sf_writef_short @33 +sf_writef_int @34 +sf_writef_float @35 +sf_writef_double @36 +sf_write_short @37 +sf_write_int @38 +sf_write_float @39 +sf_write_double @40 +sf_strerror @50 +sf_get_string @60 +sf_set_string @61 +sf_version_string @68 +sf_open_fd @70 +sf_wchar_open @71 +sf_open_virtual @80 +sf_write_sync @90 +sf_set_chunk @100 +sf_get_chunk_size @101 +sf_get_chunk_data @102 +sf_get_chunk_iterator @103 +sf_next_chunk_iterator @104 +sf_current_byterate @110 + diff --git a/libsndfile-1.0.31/src/macos.c b/libsndfile-1.0.31/src/macos.c new file mode 100644 index 0000000..5f6c531 --- /dev/null +++ b/libsndfile-1.0.31/src/macos.c @@ -0,0 +1,51 @@ +/* +** Copyright (C) 2003-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +#define STR_MARKER MAKE_MARKER ('S', 'T', 'R', ' ') + +int +macos_guess_file_type (SF_PRIVATE * psf, const char *filename) +{ static char rsrc_name [1024] ; + struct stat statbuf ; + + snprintf (rsrc_name, sizeof (rsrc_name), "%s/rsrc", filename) ; + + /* If there is no resource fork, just return. */ + if (stat (rsrc_name, &statbuf) != 0) + { psf_log_printf (psf, "No resource fork.\n") ; + return 0 ; + } ; + + if (statbuf.st_size == 0) + { psf_log_printf (psf, "Have zero size resource fork.\n") ; + return 0 ; + } ; + + return 0 ; +} /* macos_guess_file_type */ + diff --git a/libsndfile-1.0.31/src/make-static-lib-hidden-privates.sh b/libsndfile-1.0.31/src/make-static-lib-hidden-privates.sh new file mode 100755 index 0000000..5bfd485 --- /dev/null +++ b/libsndfile-1.0.31/src/make-static-lib-hidden-privates.sh @@ -0,0 +1,14 @@ +#!/bin/bash -e + +# This script takes a static library and removes all non-public symbols. +# Ie, it makes a static lib whose symbols are far less likely to clash with +# the symbols of another shared or static library. + +grep sf_ Symbols.gnu-binutils | sed -e "s/[ ;]//g" > Symbols.static + +ld -r --whole-archive .libs/libsndfile.a -o libsndfile_a.o + +objcopy --keep-global-symbols=Symbols.static libsndfile_a.o libsndfile.o + +rm -f libsndfile.a +ar cru libsndfile.a libsndfile.o diff --git a/libsndfile-1.0.31/src/mat4.c b/libsndfile-1.0.31/src/mat4.c new file mode 100644 index 0000000..0b1b414 --- /dev/null +++ b/libsndfile-1.0.31/src/mat4.c @@ -0,0 +1,391 @@ +/* +** Copyright (C) 2002-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +/*------------------------------------------------------------------------------ +** Information on how to decode and encode this file was obtained in a PDF +** file which I found on http://www.wotsit.org/. +** Also did a lot of testing with GNU Octave but do not have access to +** Matlab (tm) and so could not test it there. +*/ + +/*------------------------------------------------------------------------------ +** Macros to handle big/little endian issues. +*/ + +#define MAT4_BE_DOUBLE (MAKE_MARKER (0, 0, 0x03, 0xE8)) +#define MAT4_LE_DOUBLE (MAKE_MARKER (0, 0, 0, 0)) + +#define MAT4_BE_FLOAT (MAKE_MARKER (0, 0, 0x03, 0xF2)) +#define MAT4_LE_FLOAT (MAKE_MARKER (0x0A, 0, 0, 0)) + +#define MAT4_BE_PCM_32 (MAKE_MARKER (0, 0, 0x03, 0xFC)) +#define MAT4_LE_PCM_32 (MAKE_MARKER (0x14, 0, 0, 0)) + +#define MAT4_BE_PCM_16 (MAKE_MARKER (0, 0, 0x04, 0x06)) +#define MAT4_LE_PCM_16 (MAKE_MARKER (0x1E, 0, 0, 0)) + +/* Can't see any reason to ever implement this. */ +#define MAT4_BE_PCM_U8 (MAKE_MARKER (0, 0, 0x04, 0x1A)) +#define MAT4_LE_PCM_U8 (MAKE_MARKER (0x32, 0, 0, 0)) + +/*------------------------------------------------------------------------------ +** Private static functions. +*/ + +static int mat4_close (SF_PRIVATE *psf) ; + +static int mat4_format_to_encoding (int format, int endian) ; + +static int mat4_write_header (SF_PRIVATE *psf, int calc_length) ; +static int mat4_read_header (SF_PRIVATE *psf) ; + +static const char * mat4_marker_to_str (int marker) ; + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +mat4_open (SF_PRIVATE *psf) +{ int subformat, error = 0 ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = mat4_read_header (psf))) + return error ; + } ; + + if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_MAT4) + return SFE_BAD_OPEN_FORMAT ; + + subformat = SF_CODEC (psf->sf.format) ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if (psf->is_pipe) + return SFE_NO_PIPE_WRITE ; + + psf->endian = SF_ENDIAN (psf->sf.format) ; + if (CPU_IS_LITTLE_ENDIAN && (psf->endian == SF_ENDIAN_CPU || psf->endian == 0)) + psf->endian = SF_ENDIAN_LITTLE ; + else if (CPU_IS_BIG_ENDIAN && (psf->endian == SF_ENDIAN_CPU || psf->endian == 0)) + psf->endian = SF_ENDIAN_BIG ; + + if ((error = mat4_write_header (psf, SF_FALSE))) + return error ; + + psf->write_header = mat4_write_header ; + } ; + + psf->container_close = mat4_close ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + + switch (subformat) + { case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_32 : + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_FLOAT : + error = float32_init (psf) ; + break ; + + case SF_FORMAT_DOUBLE : + error = double64_init (psf) ; + break ; + + default : break ; + } ; + + return error ; +} /* mat4_open */ + +/*------------------------------------------------------------------------------ +*/ + +static int +mat4_close (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + mat4_write_header (psf, SF_TRUE) ; + + return 0 ; +} /* mat4_close */ + +/*------------------------------------------------------------------------------ +*/ + +static int +mat4_write_header (SF_PRIVATE *psf, int calc_length) +{ sf_count_t current ; + int encoding ; + double samplerate ; + + current = psf_ftell (psf) ; + + if (calc_length) + { psf->filelength = psf_get_filelen (psf) ; + + psf->datalength = psf->filelength - psf->dataoffset ; + if (psf->dataend) + psf->datalength -= psf->filelength - psf->dataend ; + + psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; + } ; + + encoding = mat4_format_to_encoding (SF_CODEC (psf->sf.format), psf->endian) ; + + if (encoding == -1) + return SFE_BAD_OPEN_FORMAT ; + + /* Reset the current header length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + psf_fseek (psf, 0, SEEK_SET) ; + + /* Need sample rate as a double for writing to the header. */ + samplerate = psf->sf.samplerate ; + + if (psf->endian == SF_ENDIAN_BIG) + { psf_binheader_writef (psf, "Em444", BHWm (MAT4_BE_DOUBLE), BHW4 (1), BHW4 (1), BHW4 (0)) ; + psf_binheader_writef (psf, "E4bd", BHW4 (11), BHWv ("samplerate"), BHWz (11), BHWd (samplerate)) ; + psf_binheader_writef (psf, "tEm484", BHWm (encoding), BHW4 (psf->sf.channels), BHW8 (psf->sf.frames), BHW4 (0)) ; + psf_binheader_writef (psf, "E4b", BHW4 (9), BHWv ("wavedata"), BHWz (9)) ; + } + else if (psf->endian == SF_ENDIAN_LITTLE) + { psf_binheader_writef (psf, "em444", BHWm (MAT4_LE_DOUBLE), BHW4 (1), BHW4 (1), BHW4 (0)) ; + psf_binheader_writef (psf, "e4bd", BHW4 (11), BHWv ("samplerate"), BHWz (11), BHWd (samplerate)) ; + psf_binheader_writef (psf, "tem484", BHWm (encoding), BHW4 (psf->sf.channels), BHW8 (psf->sf.frames), BHW4 (0)) ; + psf_binheader_writef (psf, "e4b", BHW4 (9), BHWv ("wavedata"), BHWz (9)) ; + } + else + return SFE_BAD_OPEN_FORMAT ; + + /* Header construction complete so write it out. */ + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + if (psf->error) + return psf->error ; + + psf->dataoffset = psf->header.indx ; + + if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + + return psf->error ; +} /* mat4_write_header */ + +static int +mat4_read_header (SF_PRIVATE *psf) +{ char buffer [256] ; + uint32_t marker, namesize ; + int rows, cols, imag ; + double value ; + const char *marker_str ; + char name [64] ; + + psf_binheader_readf (psf, "pm", 0, &marker) ; + + /* MAT4 file must start with a double for the samplerate. */ + if (marker == MAT4_BE_DOUBLE) + { psf->endian = psf->rwf_endian = SF_ENDIAN_BIG ; + marker_str = "big endian double" ; + } + else if (marker == MAT4_LE_DOUBLE) + { psf->endian = psf->rwf_endian = SF_ENDIAN_LITTLE ; + marker_str = "little endian double" ; + } + else + return SFE_UNIMPLEMENTED ; + + psf_log_printf (psf, "GNU Octave 2.0 / MATLAB v4.2 format\nMarker : %s\n", marker_str) ; + + psf_binheader_readf (psf, "444", &rows, &cols, &imag) ; + + psf_log_printf (psf, " Rows : %d\n Cols : %d\n Imag : %s\n", rows, cols, imag ? "True" : "False") ; + + psf_binheader_readf (psf, "4", &namesize) ; + + if (namesize >= SIGNED_SIZEOF (name)) + return SFE_MAT4_BAD_NAME ; + + psf_binheader_readf (psf, "b", name, namesize) ; + name [namesize] = 0 ; + + psf_log_printf (psf, " Name : %s\n", name) ; + + psf_binheader_readf (psf, "d", &value) ; + + snprintf (buffer, sizeof (buffer), " Value : %f\n", value) ; + psf_log_printf (psf, buffer) ; + + if ((rows != 1) || (cols != 1)) + return SFE_MAT4_NO_SAMPLERATE ; + + psf->sf.samplerate = psf_lrint (value) ; + + /* Now write out the audio data. */ + + psf_binheader_readf (psf, "m", &marker) ; + + psf_log_printf (psf, "Marker : %s\n", mat4_marker_to_str (marker)) ; + + psf_binheader_readf (psf, "444", &rows, &cols, &imag) ; + + psf_log_printf (psf, " Rows : %d\n Cols : %d\n Imag : %s\n", rows, cols, imag ? "True" : "False") ; + + psf_binheader_readf (psf, "4", &namesize) ; + + if (namesize >= SIGNED_SIZEOF (name)) + return SFE_MAT4_BAD_NAME ; + + psf_binheader_readf (psf, "b", name, namesize) ; + name [namesize] = 0 ; + + psf_log_printf (psf, " Name : %s\n", name) ; + + psf->dataoffset = psf_ftell (psf) ; + + if (rows == 0) + { psf_log_printf (psf, "*** Error : zero channel count.\n") ; + return SFE_CHANNEL_COUNT_ZERO ; + } + else if (rows > SF_MAX_CHANNELS) + { psf_log_printf (psf, "*** Error : channel count %d > SF_MAX_CHANNELS.\n", rows) ; + return SFE_CHANNEL_COUNT ; + } ; + + psf->sf.channels = rows ; + psf->sf.frames = cols ; + + psf->sf.format = psf->endian | SF_FORMAT_MAT4 ; + switch (marker) + { case MAT4_BE_DOUBLE : + case MAT4_LE_DOUBLE : + psf->sf.format |= SF_FORMAT_DOUBLE ; + psf->bytewidth = 8 ; + break ; + + case MAT4_BE_FLOAT : + case MAT4_LE_FLOAT : + psf->sf.format |= SF_FORMAT_FLOAT ; + psf->bytewidth = 4 ; + break ; + + case MAT4_BE_PCM_32 : + case MAT4_LE_PCM_32 : + psf->sf.format |= SF_FORMAT_PCM_32 ; + psf->bytewidth = 4 ; + break ; + + case MAT4_BE_PCM_16 : + case MAT4_LE_PCM_16 : + psf->sf.format |= SF_FORMAT_PCM_16 ; + psf->bytewidth = 2 ; + break ; + + default : + psf_log_printf (psf, "*** Error : Bad marker %08X\n", marker) ; + return SFE_UNIMPLEMENTED ; + } ; + + if ((psf->filelength - psf->dataoffset) < psf->sf.channels * psf->sf.frames * psf->bytewidth) + { psf_log_printf (psf, "*** File seems to be truncated. %D <--> %D\n", + psf->filelength - psf->dataoffset, psf->sf.channels * psf->sf.frames * psf->bytewidth) ; + } + else if ((psf->filelength - psf->dataoffset) > psf->sf.channels * psf->sf.frames * psf->bytewidth) + psf->dataend = psf->dataoffset + rows * cols * psf->bytewidth ; + + psf->datalength = psf->filelength - psf->dataoffset - psf->dataend ; + + psf->sf.sections = 1 ; + + return 0 ; +} /* mat4_read_header */ + +static int +mat4_format_to_encoding (int format, int endian) +{ + switch (format | endian) + { case (SF_FORMAT_PCM_16 | SF_ENDIAN_BIG) : + return MAT4_BE_PCM_16 ; + + case (SF_FORMAT_PCM_16 | SF_ENDIAN_LITTLE) : + return MAT4_LE_PCM_16 ; + + case (SF_FORMAT_PCM_32 | SF_ENDIAN_BIG) : + return MAT4_BE_PCM_32 ; + + case (SF_FORMAT_PCM_32 | SF_ENDIAN_LITTLE) : + return MAT4_LE_PCM_32 ; + + case (SF_FORMAT_FLOAT | SF_ENDIAN_BIG) : + return MAT4_BE_FLOAT ; + + case (SF_FORMAT_FLOAT | SF_ENDIAN_LITTLE) : + return MAT4_LE_FLOAT ; + + case (SF_FORMAT_DOUBLE | SF_ENDIAN_BIG) : + return MAT4_BE_DOUBLE ; + + case (SF_FORMAT_DOUBLE | SF_ENDIAN_LITTLE) : + return MAT4_LE_DOUBLE ; + + default : break ; + } ; + + return -1 ; +} /* mat4_format_to_encoding */ + +static const char * +mat4_marker_to_str (int marker) +{ static char str [32] ; + + switch (marker) + { + case MAT4_BE_PCM_16 : return "big endian 16 bit PCM" ; + case MAT4_LE_PCM_16 : return "little endian 16 bit PCM" ; + + case MAT4_BE_PCM_32 : return "big endian 32 bit PCM" ; + case MAT4_LE_PCM_32 : return "little endian 32 bit PCM" ; + + + case MAT4_BE_FLOAT : return "big endian float" ; + case MAT4_LE_FLOAT : return "big endian float" ; + + case MAT4_BE_DOUBLE : return "big endian double" ; + case MAT4_LE_DOUBLE : return "little endian double" ; + } ; + + /* This is a little unsafe but is really only for debugging. */ + str [sizeof (str) - 1] = 0 ; + snprintf (str, sizeof (str) - 1, "%08X", marker) ; + return str ; +} /* mat4_marker_to_str */ + diff --git a/libsndfile-1.0.31/src/mat5.c b/libsndfile-1.0.31/src/mat5.c new file mode 100644 index 0000000..da5a6ec --- /dev/null +++ b/libsndfile-1.0.31/src/mat5.c @@ -0,0 +1,509 @@ +/* +** Copyright (C) 2002-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +/*------------------------------------------------------------------------------ +** Information on how to decode and encode this file was obtained in a PDF +** file which I found on http://www.wotsit.org/. +** Also did a lot of testing with GNU Octave but do not have access to +** Matlab (tm) and so could not test it there. +*/ + +/*------------------------------------------------------------------------------ +** Macros to handle big/little endian issues. +*/ + +#define MATL_MARKER (MAKE_MARKER ('M', 'A', 'T', 'L')) + +#define IM_MARKER (('I' << 8) + 'M') +#define MI_MARKER (('M' << 8) + 'I') + +/*------------------------------------------------------------------------------ +** Enums and typedefs. +*/ + +enum +{ MAT5_TYPE_SCHAR = 0x1, + MAT5_TYPE_UCHAR = 0x2, + MAT5_TYPE_INT16 = 0x3, + MAT5_TYPE_UINT16 = 0x4, + MAT5_TYPE_INT32 = 0x5, + MAT5_TYPE_UINT32 = 0x6, + MAT5_TYPE_FLOAT = 0x7, + MAT5_TYPE_DOUBLE = 0x9, + MAT5_TYPE_ARRAY = 0xE, + + MAT5_TYPE_COMP_USHORT = 0x00020004, + MAT5_TYPE_COMP_UINT = 0x00040006 +} ; + +typedef struct +{ sf_count_t size ; + int rows, cols ; + char name [32] ; +} MAT5_MATRIX ; + +/*------------------------------------------------------------------------------ +** Private static functions. +*/ + +static int mat5_close (SF_PRIVATE *psf) ; + +static int mat5_write_header (SF_PRIVATE *psf, int calc_length) ; +static int mat5_read_header (SF_PRIVATE *psf) ; + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +mat5_open (SF_PRIVATE *psf) +{ int subformat, error = 0 ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = mat5_read_header (psf))) + return error ; + } ; + + if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_MAT5) + return SFE_BAD_OPEN_FORMAT ; + + subformat = SF_CODEC (psf->sf.format) ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if (psf->is_pipe) + return SFE_NO_PIPE_WRITE ; + + psf->endian = SF_ENDIAN (psf->sf.format) ; + if (CPU_IS_LITTLE_ENDIAN && (psf->endian == SF_ENDIAN_CPU || psf->endian == 0)) + psf->endian = SF_ENDIAN_LITTLE ; + else if (CPU_IS_BIG_ENDIAN && (psf->endian == SF_ENDIAN_CPU || psf->endian == 0)) + psf->endian = SF_ENDIAN_BIG ; + + if ((error = mat5_write_header (psf, SF_FALSE))) + return error ; + + psf->write_header = mat5_write_header ; + } ; + + psf->container_close = mat5_close ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + + switch (subformat) + { case SF_FORMAT_PCM_U8 : + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_32 : + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_FLOAT : + error = float32_init (psf) ; + break ; + + case SF_FORMAT_DOUBLE : + error = double64_init (psf) ; + break ; + + default : break ; + } ; + + return error ; +} /* mat5_open */ + +/*------------------------------------------------------------------------------ +*/ + +static int +mat5_close (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + mat5_write_header (psf, SF_TRUE) ; + + return 0 ; +} /* mat5_close */ + +/*------------------------------------------------------------------------------ +*/ + +static int +mat5_write_header (SF_PRIVATE *psf, int calc_length) +{ static const char *filename = "MATLAB 5.0 MAT-file, written by " PACKAGE_NAME "-" PACKAGE_VERSION ", " ; + static const char *sr_name = "samplerate\0\0\0\0\0\0\0\0\0\0\0" ; + static const char *wd_name = "wavedata\0" ; + char buffer [256] ; + sf_count_t current, datasize ; + int encoding ; + + current = psf_ftell (psf) ; + + if (calc_length) + { psf_fseek (psf, 0, SEEK_END) ; + psf->filelength = psf_ftell (psf) ; + psf_fseek (psf, 0, SEEK_SET) ; + + psf->datalength = psf->filelength - psf->dataoffset ; + if (psf->dataend) + psf->datalength -= psf->filelength - psf->dataend ; + + psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; + } ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_PCM_U8 : + encoding = MAT5_TYPE_UCHAR ; + break ; + + case SF_FORMAT_PCM_16 : + encoding = MAT5_TYPE_INT16 ; + break ; + + case SF_FORMAT_PCM_32 : + encoding = MAT5_TYPE_INT32 ; + break ; + + case SF_FORMAT_FLOAT : + encoding = MAT5_TYPE_FLOAT ; + break ; + + case SF_FORMAT_DOUBLE : + encoding = MAT5_TYPE_DOUBLE ; + break ; + + default : + return SFE_BAD_OPEN_FORMAT ; + } ; + + /* Reset the current header length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + psf_fseek (psf, 0, SEEK_SET) ; + + psf_get_date_str (buffer, sizeof (buffer)) ; + psf_binheader_writef (psf, "bb", BHWv (filename), BHWz (strlen (filename)), BHWv (buffer), BHWz (strlen (buffer) + 1)) ; + + memset (buffer, ' ', 124 - psf->header.indx) ; + psf_binheader_writef (psf, "b", BHWv (buffer), BHWz (124 - psf->header.indx)) ; + + psf->rwf_endian = psf->endian ; + + if (psf->rwf_endian == SF_ENDIAN_BIG) + psf_binheader_writef (psf, "2b", BHW2 (0x0100), BHWv ("MI"), BHWz (2)) ; + else + psf_binheader_writef (psf, "2b", BHW2 (0x0100), BHWv ("IM"), BHWz (2)) ; + + psf_binheader_writef (psf, "444444", BHW4 (MAT5_TYPE_ARRAY), BHW4 (64), BHW4 (MAT5_TYPE_UINT32), BHW4 (8), BHW4 (6), BHW4 (0)) ; + psf_binheader_writef (psf, "4444", BHW4 (MAT5_TYPE_INT32), BHW4 (8), BHW4 (1), BHW4 (1)) ; + psf_binheader_writef (psf, "44b", BHW4 (MAT5_TYPE_SCHAR), BHW4 (strlen (sr_name)), BHWv (sr_name), BHWz (16)) ; + + if (psf->sf.samplerate > 0xFFFF) + psf_binheader_writef (psf, "44", BHW4 (MAT5_TYPE_COMP_UINT), BHW4 (psf->sf.samplerate)) ; + else + { unsigned short samplerate = psf->sf.samplerate ; + + psf_binheader_writef (psf, "422", BHW4 (MAT5_TYPE_COMP_USHORT), BHW2 (samplerate), BHW2 (0)) ; + } ; + + datasize = psf->sf.frames * psf->sf.channels * psf->bytewidth ; + + psf_binheader_writef (psf, "t484444", BHW4 (MAT5_TYPE_ARRAY), BHW8 (datasize + 64), BHW4 (MAT5_TYPE_UINT32), BHW4 (8), BHW4 (6), BHW4 (0)) ; + psf_binheader_writef (psf, "t4448", BHW4 (MAT5_TYPE_INT32), BHW4 (8), BHW4 (psf->sf.channels), BHW8 (psf->sf.frames)) ; + psf_binheader_writef (psf, "44b", BHW4 (MAT5_TYPE_SCHAR), BHW4 (strlen (wd_name)), BHWv (wd_name), BHWz (strlen (wd_name))) ; + + datasize = psf->sf.frames * psf->sf.channels * psf->bytewidth ; + if (datasize > 0x7FFFFFFF) + datasize = 0x7FFFFFFF ; + + psf_binheader_writef (psf, "t48", BHW4 (encoding), BHW8 (datasize)) ; + + /* Header construction complete so write it out. */ + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + if (psf->error) + return psf->error ; + + psf->dataoffset = psf->header.indx ; + + if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + + return psf->error ; +} /* mat5_write_header */ + +static int +mat5_read_header (SF_PRIVATE *psf) +{ char buffer [256], name [32] ; + short version, endian ; + int type, flags1, flags2, rows, cols ; + unsigned size ; + int have_samplerate = 1 ; + + psf_binheader_readf (psf, "pb", 0, buffer, 124) ; + + buffer [125] = 0 ; + + if (strlen (buffer) >= 124) + return SFE_UNIMPLEMENTED ; + + if (strstr (buffer, "MATLAB 5.0 MAT-file") == buffer) + psf_log_printf (psf, "%s\n", buffer) ; + + + psf_binheader_readf (psf, "E22", &version, &endian) ; + + if (endian == MI_MARKER) + { psf->endian = psf->rwf_endian = SF_ENDIAN_BIG ; + if (CPU_IS_LITTLE_ENDIAN) version = ENDSWAP_16 (version) ; + } + else if (endian == IM_MARKER) + { psf->endian = psf->rwf_endian = SF_ENDIAN_LITTLE ; + if (CPU_IS_BIG_ENDIAN) version = ENDSWAP_16 (version) ; + } + else + return SFE_MAT5_BAD_ENDIAN ; + + if ((CPU_IS_LITTLE_ENDIAN && endian == IM_MARKER) || + (CPU_IS_BIG_ENDIAN && endian == MI_MARKER)) + version = ENDSWAP_16 (version) ; + + psf_log_printf (psf, "Version : 0x%04X\n", version) ; + psf_log_printf (psf, "Endian : 0x%04X => %s\n", endian, + (psf->endian == SF_ENDIAN_LITTLE) ? "Little" : "Big") ; + + /*========================================================*/ + psf_binheader_readf (psf, "44", &type, &size) ; + psf_log_printf (psf, "Block\n Type : %X Size : %d\n", type, size) ; + + if (type != MAT5_TYPE_ARRAY) + return SFE_MAT5_NO_BLOCK ; + + psf_binheader_readf (psf, "44", &type, &size) ; + psf_log_printf (psf, " Type : %X Size : %d\n", type, size) ; + + if (type != MAT5_TYPE_UINT32) + return SFE_MAT5_NO_BLOCK ; + + psf_binheader_readf (psf, "44", &flags1, &flags2) ; + psf_log_printf (psf, " Flg1 : %X Flg2 : %d\n", flags1, flags2) ; + + psf_binheader_readf (psf, "44", &type, &size) ; + psf_log_printf (psf, " Type : %X Size : %d\n", type, size) ; + + if (type != MAT5_TYPE_INT32) + return SFE_MAT5_NO_BLOCK ; + + psf_binheader_readf (psf, "44", &rows, &cols) ; + psf_log_printf (psf, " Rows : %d Cols : %d\n", rows, cols) ; + + if (rows != 1 || cols != 1) + { if (psf->sf.samplerate == 0) + psf->sf.samplerate = 44100 ; + have_samplerate = 0 ; + } + psf_binheader_readf (psf, "4", &type) ; + + if (type == MAT5_TYPE_SCHAR) + { psf_binheader_readf (psf, "4", &size) ; + psf_log_printf (psf, " Type : %X Size : %d\n", type, size) ; + if (size > SIGNED_SIZEOF (name) - 1) + { psf_log_printf (psf, "Error : Bad name length.\n") ; + return SFE_MAT5_NO_BLOCK ; + } ; + + psf_binheader_readf (psf, "bj", name, size, (8 - (size % 8)) % 8) ; + name [size] = 0 ; + } + else if ((type & 0xFFFF) == MAT5_TYPE_SCHAR) + { size = type >> 16 ; + if (size > 4) + { psf_log_printf (psf, "Error : Bad name length.\n") ; + return SFE_MAT5_NO_BLOCK ; + } ; + + psf_log_printf (psf, " Type : %X\n", type) ; + psf_binheader_readf (psf, "4", &name) ; + name [size] = 0 ; + } + else + return SFE_MAT5_NO_BLOCK ; + + psf_log_printf (psf, " Name : %s\n", name) ; + + /*-----------------------------------------*/ + + psf_binheader_readf (psf, "44", &type, &size) ; + + if (!have_samplerate) + goto skip_samplerate ; + + switch (type) + { case MAT5_TYPE_DOUBLE : + { double samplerate ; + + psf_binheader_readf (psf, "d", &samplerate) ; + snprintf (name, sizeof (name), "%f\n", samplerate) ; + psf_log_printf (psf, " Val : %s\n", name) ; + + psf->sf.samplerate = psf_lrint (samplerate) ; + } ; + break ; + + case MAT5_TYPE_COMP_USHORT : + { unsigned short samplerate ; + + psf_binheader_readf (psf, "j2j", -4, &samplerate, 2) ; + psf_log_printf (psf, " Val : %u\n", samplerate) ; + psf->sf.samplerate = samplerate ; + } + break ; + + case MAT5_TYPE_COMP_UINT : + psf_log_printf (psf, " Val : %u\n", size) ; + psf->sf.samplerate = size ; + break ; + + default : + psf_log_printf (psf, " Type : %X Size : %d ***\n", type, size) ; + return SFE_MAT5_SAMPLE_RATE ; + } ; + + /*-----------------------------------------*/ + + + psf_binheader_readf (psf, "44", &type, &size) ; + psf_log_printf (psf, " Type : %X Size : %d\n", type, size) ; + + if (type != MAT5_TYPE_ARRAY) + return SFE_MAT5_NO_BLOCK ; + + psf_binheader_readf (psf, "44", &type, &size) ; + psf_log_printf (psf, " Type : %X Size : %d\n", type, size) ; + + if (type != MAT5_TYPE_UINT32) + return SFE_MAT5_NO_BLOCK ; + + psf_binheader_readf (psf, "44", &flags1, &flags2) ; + psf_log_printf (psf, " Flg1 : %X Flg2 : %d\n", flags1, flags2) ; + + psf_binheader_readf (psf, "44", &type, &size) ; + psf_log_printf (psf, " Type : %X Size : %d\n", type, size) ; + + if (type != MAT5_TYPE_INT32) + return SFE_MAT5_NO_BLOCK ; + + psf_binheader_readf (psf, "44", &rows, &cols) ; + psf_log_printf (psf, " Rows : %X Cols : %d\n", rows, cols) ; + + psf_binheader_readf (psf, "4", &type) ; + + if (type == MAT5_TYPE_SCHAR) + { psf_binheader_readf (psf, "4", &size) ; + psf_log_printf (psf, " Type : %X Size : %d\n", type, size) ; + if (size > SIGNED_SIZEOF (name) - 1) + { psf_log_printf (psf, "Error : Bad name length.\n") ; + return SFE_MAT5_NO_BLOCK ; + } ; + + psf_binheader_readf (psf, "bj", name, size, (8 - (size % 8)) % 8) ; + name [size] = 0 ; + } + else if ((type & 0xFFFF) == MAT5_TYPE_SCHAR) + { size = type >> 16 ; + if (size > 4) + { psf_log_printf (psf, "Error : Bad name length.\n") ; + return SFE_MAT5_NO_BLOCK ; + } ; + + psf_log_printf (psf, " Type : %X\n", type) ; + psf_binheader_readf (psf, "4", &name) ; + name [size] = 0 ; + } + else + return SFE_MAT5_NO_BLOCK ; + + psf_log_printf (psf, " Name : %s\n", name) ; + + psf_binheader_readf (psf, "44", &type, &size) ; + psf_log_printf (psf, " Type : %X Size : %d\n", type, size) ; + +skip_samplerate : + /*++++++++++++++++++++++++++++++++++++++++++++++++++*/ + + if (rows == 0 && cols == 0) + { psf_log_printf (psf, "*** Error : zero channel count.\n") ; + return SFE_CHANNEL_COUNT_ZERO ; + } ; + + psf->sf.channels = rows ; + psf->sf.frames = cols ; + + psf->sf.format = psf->endian | SF_FORMAT_MAT5 ; + + switch (type) + { case MAT5_TYPE_DOUBLE : + psf_log_printf (psf, "Data type : double\n") ; + psf->sf.format |= SF_FORMAT_DOUBLE ; + psf->bytewidth = 8 ; + break ; + + case MAT5_TYPE_FLOAT : + psf_log_printf (psf, "Data type : float\n") ; + psf->sf.format |= SF_FORMAT_FLOAT ; + psf->bytewidth = 4 ; + break ; + + case MAT5_TYPE_INT32 : + psf_log_printf (psf, "Data type : 32 bit PCM\n") ; + psf->sf.format |= SF_FORMAT_PCM_32 ; + psf->bytewidth = 4 ; + break ; + + case MAT5_TYPE_INT16 : + psf_log_printf (psf, "Data type : 16 bit PCM\n") ; + psf->sf.format |= SF_FORMAT_PCM_16 ; + psf->bytewidth = 2 ; + break ; + + case MAT5_TYPE_UCHAR : + psf_log_printf (psf, "Data type : unsigned 8 bit PCM\n") ; + psf->sf.format |= SF_FORMAT_PCM_U8 ; + psf->bytewidth = 1 ; + break ; + + default : + psf_log_printf (psf, "*** Error : Bad marker %08X\n", type) ; + return SFE_UNIMPLEMENTED ; + } ; + + psf->dataoffset = psf_ftell (psf) ; + psf->datalength = psf->filelength - psf->dataoffset ; + + return 0 ; +} /* mat5_read_header */ + diff --git a/libsndfile-1.0.31/src/mpc2k.c b/libsndfile-1.0.31/src/mpc2k.c new file mode 100644 index 0000000..aef21ad --- /dev/null +++ b/libsndfile-1.0.31/src/mpc2k.c @@ -0,0 +1,204 @@ +/* +** Copyright (C) 2008-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +/* +** Info from Olivier Tristan +** +** HEADER +** 2 magic bytes: 1 and 4. +** 17 char for the name of the sample. +** 3 bytes: level, tune and channels (0 for channels is mono while 1 is stereo) +** 4 uint32: sampleStart, loopEnd, sampleFrames and loopLength +** 1 byte: loopMode (0 no loop, 1 forward looping) +** 1 byte: number of beat in loop +** 1 uint16: sampleRate +** +** DATA +** Data are always non compressed 16 bits interleaved +*/ + +#define HEADER_LENGTH 42 /* Sum of above data fields. */ +#define HEADER_NAME_LEN 17 /* Length of name string. */ + +#define SFE_MPC_NO_MARKER 666 + +/*------------------------------------------------------------------------------ +** Private static functions. +*/ + +static int mpc2k_close (SF_PRIVATE *psf) ; + +static int mpc2k_write_header (SF_PRIVATE *psf, int calc_length) ; +static int mpc2k_read_header (SF_PRIVATE *psf) ; + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +mpc2k_open (SF_PRIVATE *psf) +{ int error = 0 ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = mpc2k_read_header (psf))) + return error ; + } ; + + if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_MPC2K) + return SFE_BAD_OPEN_FORMAT ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if (mpc2k_write_header (psf, SF_FALSE)) + return psf->error ; + + psf->write_header = mpc2k_write_header ; + } ; + + psf->container_close = mpc2k_close ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + + error = pcm_init (psf) ; + + return error ; +} /* mpc2k_open */ + +/*------------------------------------------------------------------------------ +*/ + +static int +mpc2k_close (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + mpc2k_write_header (psf, SF_TRUE) ; + + return 0 ; +} /* mpc2k_close */ + +static int +mpc2k_write_header (SF_PRIVATE *psf, int calc_length) +{ char sample_name [HEADER_NAME_LEN + 1] ; + sf_count_t current ; + + if (psf->pipeoffset > 0) + return 0 ; + + current = psf_ftell (psf) ; + + if (calc_length) + { psf->filelength = psf_get_filelen (psf) ; + + psf->dataoffset = HEADER_LENGTH ; + psf->datalength = psf->filelength - psf->dataoffset ; + + psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; + } ; + + /* Reset the current header length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + + /* + ** Only attempt to seek if we are not writng to a pipe. If we are + ** writing to a pipe we shouldn't be here anyway. + */ + if (psf->is_pipe == SF_FALSE) + psf_fseek (psf, 0, SEEK_SET) ; + + snprintf (sample_name, sizeof (sample_name), "%-*.*s", HEADER_NAME_LEN, HEADER_NAME_LEN, psf->file.name.c) ; + + psf_binheader_writef (psf, "e11b", BHW1 (1), BHW1 (4), BHWv (sample_name), BHWz (HEADER_NAME_LEN)) ; + psf_binheader_writef (psf, "e111", BHW1 (100), BHW1 (0), BHW1 ((psf->sf.channels - 1) & 1)) ; + psf_binheader_writef (psf, "et4888", BHW4 (0), BHW8 (psf->sf.frames), BHW8 (psf->sf.frames), BHW8 (psf->sf.frames)) ; + psf_binheader_writef (psf, "e112", BHW1 (0), BHW1 (1), BHW2 ((uint16_t) psf->sf.samplerate)) ; + + /* Always 16 bit little endian data. */ + psf->bytewidth = 2 ; + psf->endian = SF_ENDIAN_LITTLE ; + + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + if (psf->error) + return psf->error ; + + psf->dataoffset = psf->header.indx ; + + if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + + return psf->error ; +} /* mpc2k_write_header */ + +static int +mpc2k_read_header (SF_PRIVATE *psf) +{ char sample_name [HEADER_NAME_LEN + 1] ; + unsigned char bytes [4] ; + uint32_t sample_start, loop_end, sample_frames, loop_length ; + uint16_t sample_rate ; + + psf_binheader_readf (psf, "pebb", 0, bytes, 2, sample_name, make_size_t (HEADER_NAME_LEN)) ; + + if (bytes [0] != 1 || bytes [1] != 4) + return SFE_MPC_NO_MARKER ; + + sample_name [HEADER_NAME_LEN] = 0 ; + + psf_log_printf (psf, "MPC2000\n Name : %s\n", sample_name) ; + + psf_binheader_readf (psf, "eb4444", bytes, 3, &sample_start, &loop_end, &sample_frames, &loop_length) ; + + psf->sf.channels = bytes [2] ? 2 : 1 ; + + psf_log_printf (psf, " Level : %d\n Tune : %d\n Stereo : %s\n", bytes [0], bytes [1], bytes [2] ? "Yes" : "No") ; + + psf_log_printf (psf, " Sample start : %d\n Loop end : %d\n Frames : %d\n Length : %d\n", sample_start, loop_end, sample_frames, loop_length) ; + + psf_binheader_readf (psf, "eb2", bytes, 2, &sample_rate) ; + + psf_log_printf (psf, " Loop mode : %s\n Beats : %d\n Sample rate : %d\nEnd\n", bytes [0] ? "None" : "Fwd", bytes [1], sample_rate) ; + + psf->sf.samplerate = sample_rate ; + + psf->sf.format = SF_FORMAT_MPC2K | SF_FORMAT_PCM_16 ; + + psf->dataoffset = psf_ftell (psf) ; + + /* Always 16 bit little endian data. */ + psf->bytewidth = 2 ; + psf->endian = SF_ENDIAN_LITTLE ; + + psf->datalength = psf->filelength - psf->dataoffset ; + psf->blockwidth = psf->sf.channels * psf->bytewidth ; + psf->sf.frames = psf->datalength / psf->blockwidth ; + + psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ; + + return 0 ; +} /* mpc2k_read_header */ + diff --git a/libsndfile-1.0.31/src/ms_adpcm.c b/libsndfile-1.0.31/src/ms_adpcm.c new file mode 100644 index 0000000..a21cb99 --- /dev/null +++ b/libsndfile-1.0.31/src/ms_adpcm.c @@ -0,0 +1,857 @@ +/* +** Copyright (C) 1999-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" +#include "wavlike.h" + + +typedef struct +{ int channels, blocksize, samplesperblock, blocks, dataremaining ; + int blockcount ; + int sync_error ; + sf_count_t samplecount ; + short *samples ; + unsigned char *block ; + short dummydata [] ; /* ISO C99 struct flexible array. */ +} MSADPCM_PRIVATE ; + +/*============================================================================================ +** MS ADPCM static data and functions. +*/ + +static int AdaptationTable [] = +{ 230, 230, 230, 230, 307, 409, 512, 614, + 768, 614, 512, 409, 307, 230, 230, 230 +} ; + +/* TODO : The first 7 coef's are are always hardcode and must + appear in the actual WAVE file. They should be read in + in case a sound program added extras to the list. */ + +static int AdaptCoeff1 [WAVLIKE_MSADPCM_ADAPT_COEFF_COUNT] = +{ 256, 512, 0, 192, 240, 460, 392 +} ; + +static int AdaptCoeff2 [WAVLIKE_MSADPCM_ADAPT_COEFF_COUNT] = +{ 0, -256, 0, 64, 0, -208, -232 +} ; + +/*============================================================================================ +** MS ADPCM Block Layout. +** ====================== +** Block is usually 256, 512 or 1024 bytes depending on sample rate. +** For a mono file, the block is laid out as follows: +** byte purpose +** 0 block predictor [0..6] +** 1,2 initial idelta (positive) +** 3,4 sample 1 +** 5,6 sample 0 +** 7..n packed bytecodes +** +** For a stereo file, the block is laid out as follows: +** byte purpose +** 0 block predictor [0..6] for left channel +** 1 block predictor [0..6] for right channel +** 2,3 initial idelta (positive) for left channel +** 4,5 initial idelta (positive) for right channel +** 6,7 sample 1 for left channel +** 8,9 sample 1 for right channel +** 10,11 sample 0 for left channel +** 12,13 sample 0 for right channel +** 14..n packed bytecodes +*/ + +/*============================================================================================ +** Static functions. +*/ + +static int msadpcm_decode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ; +static sf_count_t msadpcm_read_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len) ; + +static int msadpcm_encode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ; +static sf_count_t msadpcm_write_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, const short *ptr, int len) ; + +static sf_count_t msadpcm_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t msadpcm_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t msadpcm_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t msadpcm_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t msadpcm_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t msadpcm_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t msadpcm_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t msadpcm_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +static sf_count_t msadpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; +static int msadpcm_close (SF_PRIVATE *psf) ; + +static void choose_predictor (unsigned int channels, short *data, int *bpred, int *idelta) ; + +/*============================================================================================ +** MS ADPCM Read Functions. +*/ + +int +wavlike_msadpcm_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) +{ MSADPCM_PRIVATE *pms ; + unsigned int pmssize ; + int count ; + + if (psf->codec_data != NULL) + { psf_log_printf (psf, "*** psf->codec_data is not NULL.\n") ; + return SFE_INTERNAL ; + } ; + + if (psf->file.mode == SFM_WRITE) + samplesperblock = 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ; + + /* There's 7 samples per channel in the preamble of each block */ + if (samplesperblock < 7 * psf->sf.channels) + { psf_log_printf (psf, "*** Error samplesperblock (%d) should be >= %d.\n", samplesperblock, 7 * psf->sf.channels) ; + return SFE_INTERNAL ; + } ; + + if (2 * blockalign < samplesperblock * psf->sf.channels) + { psf_log_printf (psf, "*** Error blockalign (%d) should be >= %d.\n", blockalign, samplesperblock * psf->sf.channels / 2) ; + return SFE_INTERNAL ; + } ; + + pmssize = sizeof (MSADPCM_PRIVATE) + blockalign + 3 * psf->sf.channels * samplesperblock ; + + if (! (psf->codec_data = calloc (1, pmssize))) + return SFE_MALLOC_FAILED ; + pms = (MSADPCM_PRIVATE*) psf->codec_data ; + + pms->sync_error = 0 ; + pms->samples = pms->dummydata ; + pms->block = (unsigned char*) (pms->dummydata + psf->sf.channels * samplesperblock) ; + + pms->channels = psf->sf.channels ; + pms->blocksize = blockalign ; + pms->samplesperblock = samplesperblock ; + + if (pms->blocksize <= 0) + { psf_log_printf (psf, "*** Error : pms->blocksize should be > 0.\n") ; + return SFE_INTERNAL ; + } ; + + if (psf->file.mode == SFM_READ) + { pms->dataremaining = psf->datalength ; + + if (psf->datalength % pms->blocksize) + pms->blocks = psf->datalength / pms->blocksize + 1 ; + else + pms->blocks = psf->datalength / pms->blocksize ; + + count = 2 * (pms->blocksize - 6 * pms->channels) / pms->channels ; + if (pms->samplesperblock != count) + { psf_log_printf (psf, "*** Error : samplesperblock should be %d.\n", count) ; + return SFE_INTERNAL ; + } ; + + psf->sf.frames = (psf->datalength / pms->blocksize) * pms->samplesperblock ; + + msadpcm_decode_block (psf, pms) ; + + psf->read_short = msadpcm_read_s ; + psf->read_int = msadpcm_read_i ; + psf->read_float = msadpcm_read_f ; + psf->read_double = msadpcm_read_d ; + } ; + + if (psf->file.mode == SFM_WRITE) + { pms->samples = pms->dummydata ; + + pms->samplecount = 0 ; + + psf->write_short = msadpcm_write_s ; + psf->write_int = msadpcm_write_i ; + psf->write_float = msadpcm_write_f ; + psf->write_double = msadpcm_write_d ; + } ; + + psf->codec_close = msadpcm_close ; + psf->seek = msadpcm_seek ; + + return 0 ; +} /* wavlike_msadpcm_init */ + + +static inline short +msadpcm_get_bpred (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, unsigned char value) +{ if (value >= WAVLIKE_MSADPCM_ADAPT_COEFF_COUNT) + { if (pms->sync_error == 0) + { pms->sync_error = 1 ; + psf_log_printf (psf, "MS ADPCM synchronisation error (%u should be < %u).\n", value, WAVLIKE_MSADPCM_ADAPT_COEFF_COUNT) ; + } ; + return 0 ; + } ; + return value ; +} /* msadpcm_get_bpred */ + + +static int +msadpcm_decode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) +{ int chan, k, blockindx, sampleindx ; + short bytecode, bpred [2], chan_idelta [2] ; + + int predict ; + int current ; + int idelta ; + + pms->blockcount ++ ; + pms->samplecount = 0 ; + + if (pms->blockcount > pms->blocks) + { memset (pms->samples, 0, pms->samplesperblock * pms->channels) ; + return 1 ; + } ; + + if ((k = psf_fread (pms->block, 1, pms->blocksize, psf)) != pms->blocksize) + { psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pms->blocksize) ; + if (k <= 0) + return 1 ; + } ; + + /* Read and check the block header. */ + + if (pms->channels == 1) + { bpred [0] = msadpcm_get_bpred (psf, pms, pms->block [0]) ; + + chan_idelta [0] = pms->block [1] | (pms->block [2] << 8) ; + chan_idelta [1] = 0 ; + + pms->samples [1] = pms->block [3] | (pms->block [4] << 8) ; + pms->samples [0] = pms->block [5] | (pms->block [6] << 8) ; + blockindx = 7 ; + } + else + { bpred [0] = msadpcm_get_bpred (psf, pms, pms->block [0]) ; + bpred [1] = msadpcm_get_bpred (psf, pms, pms->block [1]) ; + + chan_idelta [0] = pms->block [2] | (pms->block [3] << 8) ; + chan_idelta [1] = pms->block [4] | (pms->block [5] << 8) ; + + pms->samples [2] = pms->block [6] | (pms->block [7] << 8) ; + pms->samples [3] = pms->block [8] | (pms->block [9] << 8) ; + + pms->samples [0] = pms->block [10] | (pms->block [11] << 8) ; + pms->samples [1] = pms->block [12] | (pms->block [13] << 8) ; + + blockindx = 14 ; + } ; + + /*-------------------------------------------------------- + This was left over from a time when calculations were done + as ints rather than shorts. Keep this around as a reminder + in case I ever find a file which decodes incorrectly. + + if (chan_idelta [0] & 0x8000) + chan_idelta [0] -= 0x10000 ; + if (chan_idelta [1] & 0x8000) + chan_idelta [1] -= 0x10000 ; + --------------------------------------------------------*/ + + /* Pull apart the packed 4 bit samples and store them in their + ** correct sample positions. + */ + + sampleindx = 2 * pms->channels ; + while (blockindx < pms->blocksize) + { bytecode = pms->block [blockindx++] ; + pms->samples [sampleindx++] = (bytecode >> 4) & 0x0F ; + pms->samples [sampleindx++] = bytecode & 0x0F ; + } ; + + /* Decode the encoded 4 bit samples. */ + + for (k = 2 * pms->channels ; k < (pms->samplesperblock * pms->channels) ; k ++) + { chan = (pms->channels > 1) ? (k % 2) : 0 ; + + bytecode = pms->samples [k] & 0xF ; + + /* Compute next Adaptive Scale Factor (ASF) */ + idelta = chan_idelta [chan] ; + chan_idelta [chan] = (AdaptationTable [bytecode] * idelta) >> 8 ; /* => / 256 => FIXED_POINT_ADAPTATION_BASE == 256 */ + if (chan_idelta [chan] < 16) + chan_idelta [chan] = 16 ; + if (bytecode & 0x8) + bytecode -= 0x10 ; + + predict = ((pms->samples [k - pms->channels] * AdaptCoeff1 [bpred [chan]]) + + (pms->samples [k - 2 * pms->channels] * AdaptCoeff2 [bpred [chan]])) >> 8 ; /* => / 256 => FIXED_POINT_COEFF_BASE == 256 */ + current = (bytecode * idelta) + predict ; + + if (current > 32767) + current = 32767 ; + else if (current < -32768) + current = -32768 ; + + pms->samples [k] = current ; + } ; + + return 0 ; +} /* msadpcm_decode_block */ + +static sf_count_t +msadpcm_read_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len) +{ int count, total = 0, indx = 0 ; + + while (indx < len) + { if (pms->blockcount >= pms->blocks && pms->samplecount >= pms->samplesperblock) + { memset (&(ptr [indx]), 0, (size_t) ((len - indx) * sizeof (short))) ; + return total ; + } ; + + if (pms->samplecount >= pms->samplesperblock) + if (msadpcm_decode_block (psf, pms) != 0) + return total ; + + count = (pms->samplesperblock - pms->samplecount) * pms->channels ; + count = (len - indx > count) ? count : len - indx ; + + memcpy (&(ptr [indx]), &(pms->samples [pms->samplecount * pms->channels]), count * sizeof (short)) ; + indx += count ; + pms->samplecount += count / pms->channels ; + total = indx ; + } ; + + return total ; +} /* msadpcm_read_block */ + +static sf_count_t +msadpcm_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ MSADPCM_PRIVATE *pms ; + int readcount, count ; + sf_count_t total = 0 ; + + if (! psf->codec_data) + return 0 ; + pms = (MSADPCM_PRIVATE*) psf->codec_data ; + + while (len > 0) + { readcount = (len > 0x10000000) ? 0x10000000 : (int) len ; + + if ((count = msadpcm_read_block (psf, pms, ptr, readcount)) <= 0) + return -1 ; + + total += count ; + len -= count ; + if (count != readcount) + break ; + } ; + + return total ; +} /* msadpcm_read_s */ + +static sf_count_t +msadpcm_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ MSADPCM_PRIVATE *pms ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, readcount = 0, count ; + sf_count_t total = 0 ; + + if (! psf->codec_data) + return 0 ; + pms = (MSADPCM_PRIVATE*) psf->codec_data ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + + if ((count = msadpcm_read_block (psf, pms, sptr, readcount)) <= 0) + return -1 ; + + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = arith_shift_left (sptr [k], 16) ; + total += count ; + len -= readcount ; + if (count != readcount) + break ; + } ; + return total ; +} /* msadpcm_read_i */ + +static sf_count_t +msadpcm_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ MSADPCM_PRIVATE *pms ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, readcount = 0, count ; + sf_count_t total = 0 ; + float normfact ; + + if (! psf->codec_data) + return 0 ; + pms = (MSADPCM_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + + if ((count = msadpcm_read_block (psf, pms, sptr, readcount)) <= 0) + return -1 ; + + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * (float) (sptr [k]) ; + total += count ; + len -= readcount ; + if (count != readcount) + break ; + } ; + return total ; +} /* msadpcm_read_f */ + +static sf_count_t +msadpcm_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ MSADPCM_PRIVATE *pms ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, readcount = 0, count ; + sf_count_t total = 0 ; + double normfact ; + + if (! psf->codec_data) + return 0 ; + pms = (MSADPCM_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ; + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + + if ((count = msadpcm_read_block (psf, pms, sptr, readcount)) <= 0) + return -1 ; + + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * (double) (sptr [k]) ; + total += count ; + len -= readcount ; + if (count != readcount) + break ; + } ; + + return total ; +} /* msadpcm_read_d */ + +static sf_count_t +msadpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) +{ MSADPCM_PRIVATE *pms ; + int newblock, newsample ; + + if (! psf->codec_data) + return 0 ; + pms = (MSADPCM_PRIVATE*) psf->codec_data ; + + if (psf->datalength < 0 || psf->dataoffset < 0) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + if (offset == 0) + { psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + pms->blockcount = 0 ; + msadpcm_decode_block (psf, pms) ; + pms->samplecount = 0 ; + return 0 ; + } ; + + if (offset < 0 || offset > pms->blocks * pms->samplesperblock) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + newblock = offset / pms->samplesperblock ; + newsample = offset % pms->samplesperblock ; + + if (mode == SFM_READ) + { psf_fseek (psf, psf->dataoffset + newblock * pms->blocksize, SEEK_SET) ; + pms->blockcount = newblock ; + msadpcm_decode_block (psf, pms) ; + pms->samplecount = newsample ; + } + else + { /* What to do about write??? */ + psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + return newblock * pms->samplesperblock + newsample ; +} /* msadpcm_seek */ + +/*========================================================================================== +** MS ADPCM Write Functions. +*/ + +void +wavlike_msadpcm_write_adapt_coeffs (SF_PRIVATE *psf) +{ int k ; + + for (k = 0 ; k < WAVLIKE_MSADPCM_ADAPT_COEFF_COUNT ; k++) + psf_binheader_writef (psf, "22", BHW2 (AdaptCoeff1 [k]), BHW2 (AdaptCoeff2 [k])) ; +} /* wavlike_msadpcm_write_adapt_coeffs */ + +/*========================================================================================== +*/ + +static int +msadpcm_encode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) +{ unsigned int blockindx ; + unsigned char byte ; + int chan, k, predict, bpred [2] = { 0 }, idelta [2] = { 0 }, + errordelta, newsamp ; + + choose_predictor (pms->channels, pms->samples, bpred, idelta) ; + + /* Write the block header. */ + + if (pms->channels == 1) + { pms->block [0] = bpred [0] ; + pms->block [1] = idelta [0] & 0xFF ; + pms->block [2] = idelta [0] >> 8 ; + pms->block [3] = pms->samples [1] & 0xFF ; + pms->block [4] = pms->samples [1] >> 8 ; + pms->block [5] = pms->samples [0] & 0xFF ; + pms->block [6] = pms->samples [0] >> 8 ; + + blockindx = 7 ; + byte = 0 ; + + /* Encode the samples as 4 bit. */ + + for (k = 2 ; k < pms->samplesperblock ; k++) + { predict = (pms->samples [k-1] * AdaptCoeff1 [bpred [0]] + pms->samples [k-2] * AdaptCoeff2 [bpred [0]]) >> 8 ; + errordelta = (pms->samples [k] - predict) / idelta [0] ; + if (errordelta < -8) + errordelta = -8 ; + else if (errordelta > 7) + errordelta = 7 ; + newsamp = predict + (idelta [0] * errordelta) ; + if (newsamp > 32767) + newsamp = 32767 ; + else if (newsamp < -32768) + newsamp = -32768 ; + if (errordelta < 0) + errordelta += 0x10 ; + + byte = (byte << 4) | (errordelta & 0xF) ; + if (k % 2) + { pms->block [blockindx++] = byte ; + byte = 0 ; + } ; + + idelta [0] = (idelta [0] * AdaptationTable [errordelta]) >> 8 ; + if (idelta [0] < 16) + idelta [0] = 16 ; + pms->samples [k] = newsamp ; + } ; + } + else + { /* Stereo file. */ + pms->block [0] = bpred [0] ; + pms->block [1] = bpred [1] ; + + pms->block [2] = idelta [0] & 0xFF ; + pms->block [3] = idelta [0] >> 8 ; + pms->block [4] = idelta [1] & 0xFF ; + pms->block [5] = idelta [1] >> 8 ; + + pms->block [6] = pms->samples [2] & 0xFF ; + pms->block [7] = pms->samples [2] >> 8 ; + pms->block [8] = pms->samples [3] & 0xFF ; + pms->block [9] = pms->samples [3] >> 8 ; + + pms->block [10] = pms->samples [0] & 0xFF ; + pms->block [11] = pms->samples [0] >> 8 ; + pms->block [12] = pms->samples [1] & 0xFF ; + pms->block [13] = pms->samples [1] >> 8 ; + + blockindx = 14 ; + byte = 0 ; + chan = 1 ; + + for (k = 4 ; k < 2 * pms->samplesperblock ; k++) + { chan = k & 1 ; + + predict = (pms->samples [k-2] * AdaptCoeff1 [bpred [chan]] + pms->samples [k-4] * AdaptCoeff2 [bpred [chan]]) >> 8 ; + errordelta = (pms->samples [k] - predict) / idelta [chan] ; + + + if (errordelta < -8) + errordelta = -8 ; + else if (errordelta > 7) + errordelta = 7 ; + newsamp = predict + (idelta [chan] * errordelta) ; + if (newsamp > 32767) + newsamp = 32767 ; + else if (newsamp < -32768) + newsamp = -32768 ; + if (errordelta < 0) + errordelta += 0x10 ; + + byte = (byte << 4) | (errordelta & 0xF) ; + + if (chan) + { pms->block [blockindx++] = byte ; + byte = 0 ; + } ; + + idelta [chan] = (idelta [chan] * AdaptationTable [errordelta]) >> 8 ; + if (idelta [chan] < 16) + idelta [chan] = 16 ; + pms->samples [k] = newsamp ; + } ; + } ; + + /* Write the block to disk. */ + + if ((k = psf_fwrite (pms->block, 1, pms->blocksize, psf)) != pms->blocksize) + psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pms->blocksize) ; + + memset (pms->samples, 0, pms->samplesperblock * sizeof (short)) ; + + pms->blockcount ++ ; + pms->samplecount = 0 ; + + return 1 ; +} /* msadpcm_encode_block */ + +static sf_count_t +msadpcm_write_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, const short *ptr, int len) +{ int count, total = 0, indx = 0 ; + + while (indx < len) + { count = (pms->samplesperblock - pms->samplecount) * pms->channels ; + + if (count > len - indx) + count = len - indx ; + + memcpy (&(pms->samples [pms->samplecount * pms->channels]), &(ptr [total]), count * sizeof (short)) ; + indx += count ; + pms->samplecount += count / pms->channels ; + total = indx ; + + if (pms->samplecount >= pms->samplesperblock) + msadpcm_encode_block (psf, pms) ; + } ; + + return total ; +} /* msadpcm_write_block */ + +static sf_count_t +msadpcm_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ MSADPCM_PRIVATE *pms ; + int writecount, count ; + sf_count_t total = 0 ; + + if (! psf->codec_data) + return 0 ; + pms = (MSADPCM_PRIVATE*) psf->codec_data ; + + while (len > 0) + { writecount = (len > 0x10000000) ? 0x10000000 : (int) len ; + + count = msadpcm_write_block (psf, pms, ptr, writecount) ; + + total += count ; + len -= count ; + if (count != writecount) + break ; + } ; + + return total ; +} /* msadpcm_write_s */ + +static sf_count_t +msadpcm_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ MSADPCM_PRIVATE *pms ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, writecount, count ; + sf_count_t total = 0 ; + + if (! psf->codec_data) + return 0 ; + pms = (MSADPCM_PRIVATE*) psf->codec_data ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + sptr [k] = ptr [total + k] >> 16 ; + count = msadpcm_write_block (psf, pms, sptr, writecount) ; + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + return total ; +} /* msadpcm_write_i */ + +static sf_count_t +msadpcm_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ MSADPCM_PRIVATE *pms ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, writecount, count ; + sf_count_t total = 0 ; + float normfact ; + + if (! psf->codec_data) + return 0 ; + pms = (MSADPCM_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + sptr [k] = psf_lrintf (normfact * ptr [total + k]) ; + count = msadpcm_write_block (psf, pms, sptr, writecount) ; + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + return total ; +} /* msadpcm_write_f */ + +static sf_count_t +msadpcm_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ MSADPCM_PRIVATE *pms ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, writecount, count ; + sf_count_t total = 0 ; + double normfact ; + + normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; + + if (! psf->codec_data) + return 0 ; + pms = (MSADPCM_PRIVATE*) psf->codec_data ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + sptr [k] = psf_lrint (normfact * ptr [total + k]) ; + count = msadpcm_write_block (psf, pms, sptr, writecount) ; + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + return total ; +} /* msadpcm_write_d */ + +/*======================================================================================== +*/ + +static int +msadpcm_close (SF_PRIVATE *psf) +{ MSADPCM_PRIVATE *pms ; + + pms = (MSADPCM_PRIVATE*) psf->codec_data ; + + if (psf->file.mode == SFM_WRITE) + { /* Now we know static int for certain the length of the file we can + ** re-write the header. + */ + + if (pms->samplecount && pms->samplecount < pms->samplesperblock) + msadpcm_encode_block (psf, pms) ; + } ; + + return 0 ; +} /* msadpcm_close */ + +/*======================================================================================== +** Static functions. +*/ + +/*---------------------------------------------------------------------------------------- +** Choosing the block predictor. +** Each block requires a predictor and an idelta for each channel. +** The predictor is in the range [0..6] which is an indx into the two AdaptCoeff tables. +** The predictor is chosen by trying all of the possible predictors on a small set of +** samples at the beginning of the block. The predictor with the smallest average +** abs (idelta) is chosen as the best predictor for this block. +** The value of idelta is chosen to to give a 4 bit code value of +/- 4 (approx. half the +** max. code value). If the average abs (idelta) is zero, the sixth predictor is chosen. +** If the value of idelta is less then 16 it is set to 16. +** +** Microsoft uses an IDELTA_COUNT (number of sample pairs used to choose best predictor) +** value of 3. The best possible results would be obtained by using all the samples to +** choose the predictor. +*/ + +#define IDELTA_COUNT 3 + +static void +choose_predictor (unsigned int channels, short *data, int *block_pred, int *idelta) +{ unsigned int chan, k, bpred, idelta_sum, best_bpred, best_idelta ; + + for (chan = 0 ; chan < channels ; chan++) + { best_bpred = best_idelta = 0 ; + + for (bpred = 0 ; bpred < 7 ; bpred++) + { idelta_sum = 0 ; + for (k = 2 ; k < 2 + IDELTA_COUNT ; k++) + idelta_sum += abs (data [k * channels] - ((data [(k - 1) * channels] * AdaptCoeff1 [bpred] + data [(k - 2) * channels] * AdaptCoeff2 [bpred]) >> 8)) ; + idelta_sum /= (4 * IDELTA_COUNT) ; + + if (bpred == 0 || idelta_sum < best_idelta) + { best_bpred = bpred ; + best_idelta = idelta_sum ; + } ; + + if (! idelta_sum) + { best_bpred = bpred ; + best_idelta = 16 ; + break ; + } ; + + } ; /* for bpred ... */ + if (best_idelta < 16) + best_idelta = 16 ; + + block_pred [chan] = best_bpred ; + idelta [chan] = best_idelta ; + } ; + + return ; +} /* choose_predictor */ + diff --git a/libsndfile-1.0.31/src/nist.c b/libsndfile-1.0.31/src/nist.c new file mode 100644 index 0000000..657c4d4 --- /dev/null +++ b/libsndfile-1.0.31/src/nist.c @@ -0,0 +1,372 @@ +/* +** Copyright (C) 1999-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +/* +** Some of the information used to read NIST files was gleaned from +** reading the code of Bill Schottstaedt's sndlib library +** ftp://ccrma-ftp.stanford.edu/pub/Lisp/sndlib.tar.gz +** However, no code from that package was used. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +/*------------------------------------------------------------------------------ +*/ + +#define NIST_HEADER_LENGTH 1024 + +/*------------------------------------------------------------------------------ +** Private static functions. +*/ + +static int nist_close (SF_PRIVATE *psf) ; +static int nist_write_header (SF_PRIVATE *psf, int calc_length) ; +static int nist_read_header (SF_PRIVATE *psf) ; + +/*------------------------------------------------------------------------------ +*/ + +int +nist_open (SF_PRIVATE *psf) +{ int error ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = nist_read_header (psf))) + return error ; + } ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if (psf->is_pipe) + return SFE_NO_PIPE_WRITE ; + + if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_NIST) + return SFE_BAD_OPEN_FORMAT ; + + psf->endian = SF_ENDIAN (psf->sf.format) ; + if (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU) + psf->endian = (CPU_IS_BIG_ENDIAN) ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + psf->sf.frames = 0 ; + + if ((error = nist_write_header (psf, SF_FALSE))) + return error ; + + psf->write_header = nist_write_header ; + } ; + + psf->container_close = nist_close ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_PCM_S8 : + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_32 : + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_ULAW : + error = ulaw_init (psf) ; + break ; + + case SF_FORMAT_ALAW : + error = alaw_init (psf) ; + break ; + + default : error = SFE_UNIMPLEMENTED ; + break ; + } ; + + return error ; +} /* nist_open */ + +/*------------------------------------------------------------------------------ +*/ + +static char bad_header [] = +{ 'N', 'I', 'S', 'T', '_', '1', 'A', 0x0d, 0x0a, + ' ', ' ', ' ', '1', '0', '2', '4', 0x0d, 0x0a, + 0 +} ; + + static int +nist_read_header (SF_PRIVATE *psf) +{ char psf_header [NIST_HEADER_LENGTH + 2] ; + int bitwidth = 0, count, encoding ; + unsigned bytes = 0 ; + char str [64], *cptr ; + long samples ; + + /* Go to start of file and read in the whole header. */ + psf_binheader_readf (psf, "pb", 0, psf_header, NIST_HEADER_LENGTH) ; + + /* Header is a string, so make sure it is null terminated. */ + psf_header [NIST_HEADER_LENGTH] = 0 ; + + /* Now trim the header after the end marker. */ + if ((cptr = strstr (psf_header, "end_head"))) + { cptr += strlen ("end_head") + 1 ; + cptr [0] = 0 ; + } ; + + if (strstr (psf_header, bad_header) == psf_header) + return SFE_NIST_CRLF_CONVERISON ; + + /* Make sure its a NIST file. */ + if (strstr (psf_header, "NIST_1A\n") != psf_header) + { psf_log_printf (psf, "Not a NIST file.\n") ; + return SFE_NIST_BAD_HEADER ; + } ; + + if (sscanf (psf_header, "NIST_1A\n%d\n", &count) == 1) + psf->dataoffset = count ; + else + { psf_log_printf (psf, "*** Suspicious header length.\n") ; + psf->dataoffset = NIST_HEADER_LENGTH ; + } ; + + /* Determine sample encoding, start by assuming PCM. */ + encoding = SF_FORMAT_PCM_U8 ; + if ((cptr = strstr (psf_header, "sample_coding -s"))) + { sscanf (cptr, "sample_coding -s%d %63s", &count, str) ; + + if (strcmp (str, "pcm") == 0) + { /* Correct this later when we find out the bitwidth. */ + encoding = SF_FORMAT_PCM_U8 ; + } + else if (strcmp (str, "alaw") == 0) + encoding = SF_FORMAT_ALAW ; + else if ((strcmp (str, "ulaw") == 0) || (strcmp (str, "mu-law") == 0)) + encoding = SF_FORMAT_ULAW ; + else + { psf_log_printf (psf, "*** Unknown encoding : %s\n", str) ; + encoding = 0 ; + } ; + } ; + + if ((cptr = strstr (psf_header, "channel_count -i ")) != NULL) + sscanf (cptr, "channel_count -i %d", &(psf->sf.channels)) ; + + if ((cptr = strstr (psf_header, "sample_rate -i ")) != NULL) + sscanf (cptr, "sample_rate -i %d", &(psf->sf.samplerate)) ; + + if ((cptr = strstr (psf_header, "sample_count -i ")) != NULL) + { sscanf (cptr, "sample_count -i %ld", &samples) ; + psf->sf.frames = samples ; + } ; + + if ((cptr = strstr (psf_header, "sample_n_bytes -i ")) != NULL) + sscanf (cptr, "sample_n_bytes -i %d", &(psf->bytewidth)) ; + + /* Default endian-ness (for 8 bit, u-law, A-law. */ + psf->endian = (CPU_IS_BIG_ENDIAN) ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ; + + /* This is where we figure out endian-ness. */ + if ((cptr = strstr (psf_header, "sample_byte_format -s")) + && sscanf (cptr, "sample_byte_format -s%u %8s", &bytes, str) == 2) + { + if (bytes != strlen (str)) + psf_log_printf (psf, "Weird sample_byte_format : strlen '%s' != %d\n", str, bytes) ; + + if (bytes > 1) + { if (psf->bytewidth == 0) + psf->bytewidth = bytes ; + else if (psf->bytewidth - bytes != 0) + { psf_log_printf (psf, "psf->bytewidth (%d) != bytes (%d)\n", psf->bytewidth, bytes) ; + return SFE_NIST_BAD_ENCODING ; + } ; + + if (strcmp (str, "01") == 0) + psf->endian = SF_ENDIAN_LITTLE ; + else if (strcmp (str, "10") == 0) + psf->endian = SF_ENDIAN_BIG ; + else + { psf_log_printf (psf, "Weird endian-ness : %s\n", str) ; + return SFE_NIST_BAD_ENCODING ; + } ; + } ; + + psf->sf.format |= psf->endian ; + } ; + + if ((cptr = strstr (psf_header, "sample_sig_bits -i "))) + sscanf (cptr, "sample_sig_bits -i %d", &bitwidth) ; + + if (strstr (psf_header, "channels_interleaved -s5 FALSE")) + { psf_log_printf (psf, "Non-interleaved data unsupported.\n", str) ; + return SFE_NIST_BAD_ENCODING ; + } ; + + psf->blockwidth = psf->sf.channels * psf->bytewidth ; + psf->datalength = psf->filelength - psf->dataoffset ; + + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + + if (encoding == SF_FORMAT_PCM_U8) + { switch (psf->bytewidth) + { case 1 : + psf->sf.format |= SF_FORMAT_PCM_S8 ; + break ; + + case 2 : + psf->sf.format |= SF_FORMAT_PCM_16 ; + break ; + + case 3 : + psf->sf.format |= SF_FORMAT_PCM_24 ; + break ; + + case 4 : + psf->sf.format |= SF_FORMAT_PCM_32 ; + break ; + + default : break ; + } ; + } + else if (encoding != 0) + psf->sf.format |= encoding ; + else + return SFE_UNIMPLEMENTED ; + + /* Sanitize psf->sf.format. */ + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_ULAW : + case SF_FORMAT_ALAW : + case SF_FORMAT_PCM_U8 : + /* Blank out endian bits. */ + psf->sf.format = SF_FORMAT_NIST | SF_CODEC (psf->sf.format) ; + break ; + + default : + break ; + } ; + + return 0 ; +} /* nist_read_header */ + +static int +nist_close (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + nist_write_header (psf, SF_TRUE) ; + + return 0 ; +} /* nist_close */ + +/*========================================================================= +*/ + +static int +nist_write_header (SF_PRIVATE *psf, int calc_length) +{ const char *end_str ; + long samples ; + sf_count_t current ; + + current = psf_ftell (psf) ; + + if (calc_length) + { psf->filelength = psf_get_filelen (psf) ; + + psf->datalength = psf->filelength - psf->dataoffset ; + + if (psf->dataend) + psf->datalength -= psf->filelength - psf->dataend ; + + if (psf->bytewidth > 0) + psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; + } ; + + if (psf->endian == SF_ENDIAN_BIG) + end_str = "10" ; + else if (psf->endian == SF_ENDIAN_LITTLE) + end_str = "01" ; + else + end_str = "error" ; + + /* Clear the whole header. */ + memset (psf->header.ptr, 0, psf->header.len) ; + psf->header.indx = 0 ; + + psf_fseek (psf, 0, SEEK_SET) ; + + psf_asciiheader_printf (psf, "NIST_1A\n 1024\n") ; + psf_asciiheader_printf (psf, "channel_count -i %d\n", psf->sf.channels) ; + psf_asciiheader_printf (psf, "sample_rate -i %d\n", psf->sf.samplerate) ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_PCM_S8 : + psf_asciiheader_printf (psf, "sample_coding -s3 pcm\n") ; + psf_asciiheader_printf (psf, "sample_n_bytes -i 1\n" + "sample_sig_bits -i 8\n") ; + break ; + + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_32 : + psf_asciiheader_printf (psf, "sample_n_bytes -i %d\n", psf->bytewidth) ; + psf_asciiheader_printf (psf, "sample_sig_bits -i %d\n", psf->bytewidth * 8) ; + psf_asciiheader_printf (psf, "sample_coding -s3 pcm\n" + "sample_byte_format -s%d %s\n", psf->bytewidth, end_str) ; + break ; + + case SF_FORMAT_ALAW : + psf_asciiheader_printf (psf, "sample_coding -s4 alaw\n") ; + psf_asciiheader_printf (psf, "sample_n_bytes -s1 1\n") ; + break ; + + case SF_FORMAT_ULAW : + psf_asciiheader_printf (psf, "sample_coding -s4 ulaw\n") ; + psf_asciiheader_printf (psf, "sample_n_bytes -s1 1\n") ; + break ; + + default : return SFE_UNIMPLEMENTED ; + } ; + + psf->dataoffset = NIST_HEADER_LENGTH ; + + /* Fix this */ + samples = psf->sf.frames ; + psf_asciiheader_printf (psf, "sample_count -i %ld\n", samples) ; + psf_asciiheader_printf (psf, "end_head\n") ; + + /* Zero fill to dataoffset. */ + psf_binheader_writef (psf, "z", BHWz ((size_t) (NIST_HEADER_LENGTH - psf->header.indx))) ; + + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + if (psf->error) + return psf->error ; + + if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + + return psf->error ; +} /* nist_write_header */ + diff --git a/libsndfile-1.0.31/src/nms_adpcm.c b/libsndfile-1.0.31/src/nms_adpcm.c new file mode 100644 index 0000000..40f56f5 --- /dev/null +++ b/libsndfile-1.0.31/src/nms_adpcm.c @@ -0,0 +1,1156 @@ +/* +** Copyright (C) 1999-2014 Erik de Castro Lopo +** Copyright (C) 2017 Arthur Taylor +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +/* +** This is a Natural MicroSystems ADPCM encoder/decoder. It converts 14 bit linear +** PCM to and from either a 2, 3, or 4 bit ADPCM. NMS-ADPCM does not have appeared +** to have ever been publicly documented, and appears to have debuted in the early +** 90s in the Natural Access suite of PC-based telephony products. Raw NMS ADPCM +** files usually have a .vce extension, although this does not encode what bitrate +** is used. +** +** NMS-ADPCM is an 'optimised variation' of the ITU G.726 ADPCM scheme. The dominant +** variation is that it removes the tone (modem) operation mode, and it's associated +** voice/modem transition detection. This simplifies the computation of the step +** size multiplier, as all operations on it remain in a log domain. +*/ + +#include "sfconfig.h" + +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + + +#define NMS_SAMPLES_PER_BLOCK 160 +#define NMS_BLOCK_SHORTS_32 41 +#define NMS_BLOCK_SHORTS_24 31 +#define NMS_BLOCK_SHORTS_16 21 + +/* Variable names from ITU G.726 spec */ +struct nms_adpcm_state +{ /* Log of the step size multiplier. Operated on by codewords. */ + int yl ; + + /* Quantizer step size multiplier. Generated from yl. */ + int y ; + + /* Coefficents of the pole predictor */ + int a [2] ; + + /* Coefficents of the zero predictor */ + int b [6] ; + + /* Previous quantized deltas (multiplied by 2^14) */ + int d_q [7] ; + + /* d_q [x] + s_ez [x], used by the pole-predictor for signs only. */ + int p [3] ; + + /* Previous reconstructed signal values. */ + int s_r [2] ; + + /* Zero predictor components of the signal estimate. */ + int s_ez ; + + /* Signal estimate, (including s_ez). */ + int s_e ; + + /* The most recent codeword (enc:generated, dec:inputted) */ + int Ik ; + + int parity ; + + /* + ** Offset into code tables for the bitrate. + ** 2-bit words: +0 + ** 3-bit words: +8 + ** 4-bit words: +16 + */ + int t_off ; +} ; + +enum nms_enc_type +{ NMS16, + NMS24, + NMS32 +} ; + +typedef struct +{ struct nms_adpcm_state state ; + + /* The encoding type */ + enum nms_enc_type type ; + + int shortsperblock ; + int blocks_total ; + int block_curr, sample_curr ; + + unsigned short block [NMS_BLOCK_SHORTS_32] ; + short samples [NMS_SAMPLES_PER_BLOCK] ; +} NMS_ADPCM_PRIVATE ; + +/* Pre-computed exponential interval used in the antilog approximation. */ +static unsigned int table_expn [] = +{ 0x4000, 0x4167, 0x42d5, 0x444c, 0x45cb, 0x4752, 0x48e2, 0x4a7a, + 0x4c1b, 0x4dc7, 0x4f7a, 0x5138, 0x52ff, 0x54d1, 0x56ac, 0x5892, + 0x5a82, 0x5c7e, 0x5e84, 0x6096, 0x62b4, 0x64dd, 0x6712, 0x6954, + 0x6ba2, 0x6dfe, 0x7066, 0x72dc, 0x7560, 0x77f2, 0x7a93, 0x7d42, +} ; + +/* Table mapping codewords to scale factor deltas. */ +static int table_scale_factor_step [] = +{ 0x0, 0x0, 0x0, 0x0, 0x4b0, 0x0, 0x0, 0x0, /* 2-bit */ + -0x3c, 0x0, 0x90, 0x0, 0x2ee, 0x0, 0x898, 0x0, /* 3-bit */ + -0x30, 0x12, 0x6b, 0xc8, 0x188, 0x2e0, 0x551, 0x1150, /* 4-bit */ +} ; + +/* Table mapping codewords to quantized delta interval steps. */ +static unsigned int table_step [] = +{ 0x73F, 0, 0, 0, 0x1829, 0, 0, 0, /* 2-bit */ + 0x3EB, 0, 0xC18, 0, 0x1581, 0, 0x226E, 0, /* 3-bit */ + 0x20C, 0x635, 0xA83, 0xF12, 0x1418, 0x19E3, 0x211A, 0x2BBA, /* 4-bit */ +} ; + +/* Binary search lookup table for quantizing using table_step. */ +static int table_step_search [] = +{ 0, 0x1F6D, 0, -0x1F6D, 0, 0, 0, 0, /* 2-bit */ + 0x1008, 0x1192, 0, -0x219A, 0x1656, -0x1656, 0, 0, /* 3-bit */ + 0x872, 0x1277, -0x8E6, -0x232B, 0xD06, -0x17D7, -0x11D3, 0, /* 4-bit */ +} ; + + +/*============================================================================================ +** Static functions. +*/ + +static void nms_adpcm_update (struct nms_adpcm_state *s) ; +static void nms_adpcm_codec_init (struct nms_adpcm_state *s, enum nms_enc_type type) ; + +static int16_t nms_adpcm_reconstruct_sample (struct nms_adpcm_state *s, uint8_t I) ; +static uint8_t nms_adpcm_encode_sample (struct nms_adpcm_state *s, int16_t sl) ; +static int16_t nms_adpcm_decode_sample (struct nms_adpcm_state *s, uint8_t code) ; + +static void nms_adpcm_block_pack_16 (const int16_t codewords [], uint16_t block [], int16_t rms) ; +static void nms_adpcm_block_pack_24 (const int16_t codewords [], uint16_t block [], int16_t rms) ; +static void nms_adpcm_block_pack_32 (const int16_t codewords [], uint16_t block [], int16_t rms) ; + +static void nms_adpcm_block_unpack_16 (const uint16_t block [], int16_t codewords [], int16_t *rms) ; +static void nms_adpcm_block_unpack_24 (const uint16_t block [], int16_t codewords [], int16_t *rms) ; +static void nms_adpcm_block_unpack_32 (const uint16_t block [], int16_t codewords [], int16_t *rms) ; + +static int nms_adpcm_decode_block (SF_PRIVATE *psf, NMS_ADPCM_PRIVATE *pnms, uint16_t block [], int16_t samples []) ; +static int nms_adpcm_encode_block (SF_PRIVATE *psf, NMS_ADPCM_PRIVATE *pnms, int16_t samples [], uint16_t block []) ; + +static sf_count_t nms_adpcm_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t nms_adpcm_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t nms_adpcm_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t nms_adpcm_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t nms_adpcm_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t nms_adpcm_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t nms_adpcm_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t nms_adpcm_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +static int nms_adpcm_close (SF_PRIVATE *psf) ; +static sf_count_t nms_adpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; + +/* +** An exponential function (antilog) approximation. +** +** Maps [1,20480] to [1,1024] in an exponential relationship. This is +** approximately ret = b^exp where b = e^(ln(1024)/ln(20480)) ~= 1.0003385 +*/ +static inline int +nms_adpcm_antilog (int exp) +{ int ret ; + + ret = 0x1000 ; + ret += (((exp & 0x3f) * 0x166b) >> 12) ; + ret *= table_expn [(exp & 0x7c0) >> 6] ; + ret >>= (26 - (exp >> 11)) ; + + return ret ; +} /* nms_adpcm_antilog */ + +static void +nms_adpcm_update (struct nms_adpcm_state *s) +{ /* Variable names from ITU G.726 spec */ + int a1ul ; + int fa1 ; + int i ; + + /* Decay and Modify the scale factor in the log domain based on the codeword. */ + s->yl = ((s->yl *0xf8) >> 8) + table_scale_factor_step [s->t_off + (s->Ik & 7)] ; + if (s->yl < 2171) + s->yl = 2171 ; + else if (s->yl > 20480) + s->yl = 20480 ; + s->y = nms_adpcm_antilog (s->yl) ; + + /* Update the zero predictor coefficents. */ + for (i = 0 ; i < 6 ; i++) + { s->b [i] = (s->b [i] * 0xff) >> 8 ; + if ((s->d_q [0] ^ s->d_q [i + 1]) >= 0) + s->b [i] += 128 ; + else + s->b [i] -= 128 ; + } + + /* Update the pole predictor coefficents. */ + fa1 = s->a [0] >> 5 ; + if (fa1 < -256) + fa1 = -256 ; + else if (fa1 > 256) + fa1 = 256 ; + + s->a [0] = (0xff * s->a [0]) >> 8 ; + if (s->p [0] != 0 && s->p [1] != 0 && ((s->p [0] ^ s->p [1]) < 0)) + s->a [0] -= 192 ; + else + { s->a [0] += 192 ; + fa1 = -fa1 ; + } + + s->a [1] = fa1 + ((0xfe * s->a [1]) >> 8) ; + if (s->p [0] != 0 && s->p [2] != 0 && ((s->p [0] ^ s->p [2]) < 0)) + s->a [1] -= 128 ; + else + s->a [1] += 128 ; + + /* Stability constraints. */ + if (s->a [1] < -12288) + s->a [1] = -12288 ; + else if (s->a [1] > 12288) + s->a [1] = 12288 ; + a1ul = 15360 - s->a [1] ; + if (s->a [0] >= a1ul) + s->a [0] = a1ul ; + else + { a1ul = -a1ul ; + if (s->a [0] < a1ul) + s->a [0] = a1ul ; + } ; + + /* Compute the zero predictor estimate. Rotate past deltas too. */ + s->s_ez = 0 ; + for (i = 5 ; i >= 0 ; i--) + { s->s_ez += s->d_q [i] * s->b [i] ; + s->d_q [i + 1] = s->d_q [i] ; + } ; + + /* Compute the signal estimate. */ + s->s_e = s->a [0] * s->s_r [0] + s->a [1] * s->s_r [1] + s->s_ez ; + + /* Return to scale */ + s->s_ez >>= 14 ; + s->s_e >>= 14 ; + + /* Rotate members to prepare for next iteration. */ + s->s_r [1] = s->s_r [0] ; + s->p [2] = s->p [1] ; + s->p [1] = s->p [0] ; +} /* nms_adpcm_update */ + + +static int16_t +nms_adpcm_reconstruct_sample (struct nms_adpcm_state *s, uint8_t I) +{ /* Variable names from ITU G.726 spec */ + int dqx ; + + /* + ** The ordering of the 12-bit right-shift is a precision loss. It agrees + ** with the output of a 16-bit NMSVCE.DLL, but disagrees with the output + ** of a CG6565 board. + */ + + /* Look up the delta, scale and sign it. */ + dqx = table_step [s->t_off + (I & 7)] * s->y ; + if (I & 8) + dqx = -dqx ; + + /* Take from delta scale to actual scale. */ + dqx >>= 12 ; + + /* Set variables used as input for the next predictor update. */ + s->d_q [0] = dqx ; + s->s_r [0] = s->s_e + dqx ; + s->Ik = I & 0xf ; + s->p [0] = s->s_ez + dqx ; + + return s->s_r [0] ; +} /* nms_adpcm_reconstruct_sample */ + +static void +nms_adpcm_codec_init (struct nms_adpcm_state *s, enum nms_enc_type type) +{ memset (s, 0, sizeof (struct nms_adpcm_state)) ; + s->t_off = (type == NMS32) ? 16 : (type == NMS24) ? 8 : 0 ; +} /* nms_adpcm_codec_init */ + +/* +** nms_adpcm_encode_sample() +** +** Encode a linear 16-bit pcm sample into a 2,3, or 4 bit NMS-ADPCM codeword +** using and updating the predictor state. +*/ +static uint8_t +nms_adpcm_encode_sample (struct nms_adpcm_state *s, int16_t sl) +{ /* Variable names from ITU G.726 spec */ + int d ; + uint8_t I ; + + /* Down scale the sample from 16 => ~14 bits. */ + sl = (sl * 0x1fdf) / 0x7fff ; + + /* Compute estimate, and delta from actual value */ + nms_adpcm_update (s) ; + d = sl - s->s_e ; + + /* + ** Vary the input signal. Not sure why. It agrees with NMSVCE.DLL and + ** a CG6565 board. + */ + if (s->parity ^= 1) + d -= 2 ; + + /* Encode the delta signed-ness (Codeword bit 4) */ + if (d < 0) + { d = -d ; + I = 8 ; + } + else + I = 0 ; + + /* Increase magnitude to be in the range of the delta steps */ + d <<= 13 ; + + /* Quantize the delta using a binary search. */ + d += table_step_search [s->t_off + 3] * s->y ; + /* Codeword bit 3 */ + if (d >= 0) + { d += table_step_search [s->t_off + 5] * s->y ; + /* Codeword bit 2 */ + if (d >= 0) + { d += table_step_search [s->t_off + 6] * s->y ; + /* Codeword bit 1 */ + if (d >= 0) + I |= 7 ; + else + I |= 6 ; + } + else + { d += table_step_search [s->t_off + 4] * s->y ; + /* Codeword bit 1 */ + if (d >= 0) + I |= 5 ; + else + I |= 4 ; + } ; + } + else { + d += table_step_search [s->t_off + 1] * s->y ; + /* Codeword bit 2 */ + if (d >= 0) + { d += table_step_search [s->t_off + 2] * s->y ; + /* Codeword bit 1 */ + if (d >= 0) + I |= 3 ; + else + I |= 2 ; + } + else { + d += table_step_search [s->t_off + 0] * s->y ; + /* Codeword bit 1 */ + if (d >= 0) + I |= 1 ; + else + I |= 0 ; + } ; + } ; + /* What's left in d is actually our quantizer noise. */ + + /* Reduce the codeword size for the bitrate accordingly. */ + if (s->t_off == 8) + I &= 0xe ; + else if (s->t_off == 0) + I &= 0xc ; + + /* Call reconstruct for side effects preparing for the next update. */ + nms_adpcm_reconstruct_sample (s, I) ; + + return I ; +} /* nms_adpcm_encode_sample */ + +/* +** nms_adpcm_decode_sample() +** +** Given a 2,3 or 4-bit NMS-ADPCM codeword, decode the next 16-bit linear PCM +** sample using and updating the predictor state. +*/ +static int16_t +nms_adpcm_decode_sample (struct nms_adpcm_state *s, uint8_t I) +{ int sl ; + + nms_adpcm_update (s) ; + sl = nms_adpcm_reconstruct_sample (s, I) ; + + /* Clamp to [-0x1fdf, 0x1fdf] (just under 14 bits resolution) */ + if (sl < -0x1fdf) + sl = -0x1fdf ; + else if (sl > 0x1fdf) + sl = 0x1fdf ; + + /* Expand from 14 to 16 bits */ + sl = (sl * 0x7fff) / 0x1fdf ; + + return (int16_t) sl ; +} /* nms_adpcm_decode_sample */ + +/** +** NMS ADPCM Codeword packing scheme. +** +** The serialized form of NMS-ADPCM operates on blocks of 160 mono samples +** (20ms at 8000Hz.) Blocks are 42, 62 and 82 bytes in size for the 2, 3, and +** 4 bit codeword sizes respectively. The data is treated as an array of +** little-endian 2-byte shorts, and the data is packed into the first 20, 30 +** or 40 shorts. The last short represents the block's root-mean-square +** average. This is apparently an optimization so that energy/silence +** detection processes can avoid decoding a block. +** +** All codewords are nibbles, with the least significant bits dropped as +** required for the 3 and 2 bit codeword sizes. +** +** Nibbles are packed into shorts in order of most significant to least. The +** 4-bit scheme is trivial. The three bit scheme reconstructs a fourth sample +** from the leftover bits of the proceeding three samples. The 2-bit scheme +** uses a two-pass, left two bit shift. +*/ + +/* +** Reads 21 shorts from block, unpacks 160 codewords of 2-bits each, writing +** each to its sequential array index of codewords. If rms is non-null, the +** read block rms is copied to its location. +*/ +static void +nms_adpcm_block_unpack_16 (const uint16_t block [], int16_t codewords [], int16_t *rms) +{ int k ; + uint16_t w = 0 ; + + for (k = 0 ; k < NMS_SAMPLES_PER_BLOCK ; ) + { /* + ** k % 8 == [0-3]: Top 2-bits of a nibble + ** k % 8 == [4-7]: Bottom 2-bits of a nibble + */ + if ((k & 4) == 0) + w = *(block++) ; + else + w <<= 2 ; + codewords [k++] = (w >> 12) & 0xc ; + codewords [k++] = (w >> 8) & 0xc ; + codewords [k++] = (w >> 4) & 0xc ; + codewords [k++] = w & 0xc ; + } ; + + /* + ** Every block ends with a short representing a RMS-approximation for the + ** block. + **/ + if (rms) + *rms = *block ; +} /* nms_adpcm_unpack_16 */ + +/* +** Reads 31 shorts from block, unpacks 160 codewords of 3-bits each, writing +** each to its sequential array index of codewords. If rms is non-null, the +** read block rms is copied to its location. +*/ +static void +nms_adpcm_block_unpack_24 (const uint16_t block [], int16_t codewords [], int16_t *rms) +{ int k ; + uint16_t w = 0, residual = 0 ; + + for (k = 0 ; k < NMS_SAMPLES_PER_BLOCK ; ) + { /* + ** k % 16 == [0, 11]: Unpack new nibble, build residual + ** k % 16 == [12, 15]: Unpack residual + */ + if ((k & 12) != 12) + { w = *(block++) ; + residual = (residual << 1) | (w & 0x1111) ; + } + else + { w = residual << 1 ; + residual = 0 ; + } ; + codewords [k++] = (w >> 12) & 0xe ; + codewords [k++] = (w >> 8) & 0xe ; + codewords [k++] = (w >> 4) & 0xe ; + codewords [k++] = w & 0xe ; + } ; + + /* + ** Every block ends with a short representing a RMS-approximation for the + ** block. + **/ + if (rms) + *rms = *block ; +} /* nms_adpcm_unpack_24 */ + +/* +** Reads 41 shorts from block, unpacks 160 codewords of 4-bits each, writing +** each to its sequential array index of codewords. If rms is non-null, the +** read block rms is copied to its location. +*/ +static void +nms_adpcm_block_unpack_32 (const uint16_t block [], int16_t codewords [], int16_t *rms) +{ int k ; + uint16_t w = 0 ; + + for (k = 0 ; k < NMS_SAMPLES_PER_BLOCK ; ) + { w = *(block++) ; + codewords [k++] = (w >> 12) & 0xf ; + codewords [k++] = (w >> 8) & 0xf ; + codewords [k++] = (w >> 4) & 0xf ; + codewords [k++] = w & 0xf ; + } ; + /* + ** Every block ends with a short representing a RMS-approximation for the + ** block. + **/ + if (rms) + *rms = *block ; +} /* nms_adpcm_unpack_32 */ + +/* +** Reads 160 indicies of codewords for one 2-bit codeword each, packing them +** into 20 shorts of block, and writes the short rms for a total of 42 bytes. +*/ +static void +nms_adpcm_block_pack_16 (const int16_t codewords [], uint16_t block [], int16_t rms) +{ int k ; + uint16_t w ; + + for (k = 0 ; k < NMS_SAMPLES_PER_BLOCK ; ) + { w = codewords [k++] << 12 ; + w |= codewords [k++] << 8 ; + w |= codewords [k++] << 4 ; + w |= codewords [k++] ; + w |= codewords [k++] << 10 ; + w |= codewords [k++] << 6 ; + w |= codewords [k++] << 2 ; + w |= codewords [k++] >> 2 ; + + *(block++) = w ; + } ; + + /* Every block ends with a short representing the blocks RMS */ + *block = rms ; +} /* nms_adpcm_pack_16 */ + +/* +** Reads 160 indicies of codewords for one 3-bit codeword each, packing them +** into 30 shorts of block, and writes the short rms for a total of 62 bytes. +*/ +static void +nms_adpcm_block_pack_24 (const int16_t codewords [], uint16_t block [], int16_t rms) +{ int k ; + uint16_t w [3] ; + uint16_t residual ; + + for (k = 0 ; k < NMS_SAMPLES_PER_BLOCK ; ) + { w [0] = codewords [k++] << 12 ; + w [0] |= codewords [k++] << 8 ; + w [0] |= codewords [k++] << 4 ; + w [0] |= codewords [k++] ; + + w [1] = codewords [k++] << 12 ; + w [1] |= codewords [k++] << 8 ; + w [1] |= codewords [k++] << 4 ; + w [1] |= codewords [k++] ; + + w [2] = codewords [k++] << 12 ; + w [2] |= codewords [k++] << 8 ; + w [2] |= codewords [k++] << 4 ; + w [2] |= codewords [k++] ; + + residual = codewords [k++] << 12 ; + residual |= codewords [k++] << 8 ; + residual |= codewords [k++] << 4 ; + residual |= codewords [k++] ; + + residual >>= 1 ; + w [2] |= (residual & 0x1111) ; + residual >>= 1 ; + w [1] |= (residual & 0x1111) ; + residual >>= 1 ; + w [0] |= (residual & 0x1111) ; + + *(block++) = w [0] ; + *(block++) = w [1] ; + *(block++) = w [2] ; + } ; + + /* Every block ends with a short representing the blocks RMS */ + *block = rms ; +} /* nms_adpcm_pack_24 */ + +/* +** Reads 160 indicies of codewords for one 4-bit codeword each, packing them +** into 40 shorts of block, and writes the short rms for a total of 82 bytes. +*/ +static void +nms_adpcm_block_pack_32 (const int16_t codewords [], uint16_t block [], int16_t rms) +{ int k ; + uint16_t w ; + + for (k = 0 ; k < NMS_SAMPLES_PER_BLOCK ; ) + { w = codewords [k++] << 12 ; + w |= codewords [k++] << 8 ; + w |= codewords [k++] << 4 ; + w |= codewords [k++] ; + + *(block++) = w ; + } ; + + /* Every block ends with a short representing the blocks RMS */ + *block = rms ; +} /*nms_adpcm_block_pack_32 */ + +static int +nms_adpcm_decode_block (SF_PRIVATE *psf, NMS_ADPCM_PRIVATE *pnms, uint16_t block [], int16_t samples []) +{ int k ; + + switch (pnms->type) + { case NMS16 : + nms_adpcm_block_unpack_16 (block, samples, NULL) ; + break ; + case NMS24 : + nms_adpcm_block_unpack_24 (block, samples, NULL) ; + break ; + case NMS32 : + nms_adpcm_block_unpack_32 (block, samples, NULL) ; + break ; + + default : + psf_log_printf (psf, "*** Error : Unhandled NMS ADPCM type %d.\n", pnms->type) ; + return 0 ; + } ; + + for (k = 0 ; k < NMS_SAMPLES_PER_BLOCK ; k++) + samples [k] = nms_adpcm_decode_sample (&pnms->state, samples [k]) ; + + return NMS_SAMPLES_PER_BLOCK ; +} /* nms_adpcm_decode_block */ + +static int +nms_adpcm_encode_block (SF_PRIVATE *psf, NMS_ADPCM_PRIVATE *pnms, int16_t samples [], uint16_t block []) +{ int k ; + unsigned int rms = 0 ; + + /* + ** The rms we write is a complete lie. Considering that the various + ** other implementations I've tested don't completely agree, that this data + ** is usually ignored, and except for some weird offloading of "energy + ** detection", so long as we don't write zeros for non-zero data, I don't + ** think it really matters. + */ + + for (k = 0 ; k < NMS_SAMPLES_PER_BLOCK ; k++) + { rms += (samples [k] * samples [k]) >> 2 ; + samples [k] = nms_adpcm_encode_sample (&pnms->state, samples [k]) ; + } ; + + rms <<= 12 ; + switch (pnms->type) + { case NMS16 : + nms_adpcm_block_pack_16 (samples, block, rms) ; + break ; + case NMS24 : + nms_adpcm_block_pack_24 (samples, block, rms) ; + break ; + case NMS32 : + nms_adpcm_block_pack_32 (samples, block, rms) ; + break ; + + default : + psf_log_printf (psf, "*** Error : Unhandled NMS ADPCM type %d.\n", pnms->type) ; + return 0 ; + } ; + + return NMS_SAMPLES_PER_BLOCK ; +} /* nms_adpcm_encode_block */ + +static int +psf_nms_adpcm_decode_block (SF_PRIVATE *psf, NMS_ADPCM_PRIVATE *pnms) +{ int k ; + + if ((k = psf_fread (pnms->block, sizeof (short), pnms->shortsperblock, psf)) != pnms->shortsperblock) + { psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pnms->shortsperblock) ; + memset (pnms->block + (k * sizeof (short)), 0, (pnms->shortsperblock - k) * sizeof (short)) ; + } ; + + if (CPU_IS_BIG_ENDIAN) + endswap_short_array ((signed short *) pnms->block, pnms->shortsperblock) ; + + nms_adpcm_decode_block (psf, pnms, pnms->block, pnms->samples) ; + + return 1 ; +} /* nms_adpcm_decode_block */ + +static int +nms_adpcm_read_block (SF_PRIVATE *psf, NMS_ADPCM_PRIVATE *pnms, short *ptr, int len) +{ int count, indx = 0 ; + + while (indx < len) + { if (pnms->sample_curr >= NMS_SAMPLES_PER_BLOCK) + { pnms->block_curr ++ ; + pnms->sample_curr = 0 ; + } ; + + if (pnms->block_curr > pnms->blocks_total) + { memset (&(ptr [indx]), 0, (len - indx) * sizeof (short)) ; + return indx ; + } ; + + if (pnms->sample_curr == 0) + psf_nms_adpcm_decode_block (psf, pnms) ; + + count = NMS_SAMPLES_PER_BLOCK - pnms->sample_curr ; + if (len - indx < count) + count = len - indx ; + + memcpy (&(ptr [indx]), &(pnms->samples [pnms->sample_curr]), count * sizeof (short)) ; + indx += count ; + pnms->sample_curr += count ; + } ; + + return indx ; +} /* nms_adpcm_read_block */ + +static sf_count_t +nms_adpcm_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ NMS_ADPCM_PRIVATE *pnms ; + int readcount, count ; + sf_count_t total = 0 ; + + if (psf->codec_data == NULL) + return 0 ; + pnms = (NMS_ADPCM_PRIVATE*) psf->codec_data ; + + while (len > 0) + { readcount = (len > 0x10000000) ? 0x10000000 : (int) len ; + + count = nms_adpcm_read_block (psf, pnms, ptr, readcount) ; + + total += count ; + len -= count ; + + if (count != readcount) + break ; + } ; + + return total ; +} /* nms_adpcm_read_s */ + +static sf_count_t +nms_adpcm_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + NMS_ADPCM_PRIVATE *pnms ; + short *sptr ; + int k, bufferlen, readcount = 0, count ; + sf_count_t total = 0 ; + + if (psf->codec_data == NULL) + return 0 ; + pnms = (NMS_ADPCM_PRIVATE *) psf->codec_data ; + + sptr = ubuf.sbuf ; + bufferlen = SF_BUFFER_LEN / sizeof (short) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = nms_adpcm_read_block (psf, pnms, sptr, readcount) ; + + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = arith_shift_left (sptr [k], 16) ; + + total += count ; + len -= readcount ; + if (count != readcount) + break ; + } ; + + return total ; +} /* nms_adpcm_read_i */ + +static sf_count_t +nms_adpcm_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + NMS_ADPCM_PRIVATE *pnms ; + short *sptr ; + int k, bufferlen, readcount = 0, count ; + sf_count_t total = 0 ; + float normfact ; + + if (psf->codec_data == NULL) + return 0 ; + pnms = (NMS_ADPCM_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = SF_BUFFER_LEN / sizeof (short) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = nms_adpcm_read_block (psf, pnms, sptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * sptr [k] ; + + total += count ; + len -= readcount ; + if (count != readcount) + break ; + } ; + + return total ; +} /* nms_adpcm_read_f */ + +static sf_count_t +nms_adpcm_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + NMS_ADPCM_PRIVATE *pnms ; + short *sptr ; + int k, bufferlen, readcount = 0, count ; + sf_count_t total = 0 ; + double normfact ; + + if (psf->codec_data == NULL) + return 0 ; + pnms = (NMS_ADPCM_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = SF_BUFFER_LEN / sizeof (short) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = nms_adpcm_read_block (psf, pnms, sptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * (double) (sptr [k]) ; + + total += count ; + len -= readcount ; + if (count != readcount) + break ; + } ; + + return total ; +} /* nms_adpcm_read_d */ + +static int +psf_nms_adpcm_encode_block (SF_PRIVATE *psf, NMS_ADPCM_PRIVATE *pnms) +{ int k ; + + /* Encode the samples. */ + nms_adpcm_encode_block (psf, pnms, pnms->samples, pnms->block) ; + + if (CPU_IS_BIG_ENDIAN) + endswap_short_array ((signed short *) pnms->block, pnms->shortsperblock) ; + + /* Write the block to disk. */ + if ((k = psf_fwrite (pnms->block, sizeof (short), pnms->shortsperblock, psf)) != pnms->shortsperblock) + psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pnms->shortsperblock) ; + + pnms->sample_curr = 0 ; + pnms->block_curr ++ ; + + return 1 ; +} /* psf_nms_adpcm_encode_block */ + +static int +nms_adpcm_write_block (SF_PRIVATE *psf, NMS_ADPCM_PRIVATE *pnms, const short *ptr, int len) +{ int count, total = 0, indx = 0 ; + + while (indx < len) + { count = NMS_SAMPLES_PER_BLOCK - pnms->sample_curr ; + + if (count > len - indx) + count = len - indx ; + + memcpy (&(pnms->samples [pnms->sample_curr]), &(ptr [indx]), count * sizeof (short)) ; + indx += count ; + pnms->sample_curr += count ; + total = indx ; + + if (pnms->sample_curr >= NMS_SAMPLES_PER_BLOCK) + psf_nms_adpcm_encode_block (psf, pnms) ; + } ; + + return total ; +} /* nms_adpcm_write_block */ + +static sf_count_t +nms_adpcm_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ NMS_ADPCM_PRIVATE *pnms ; + int writecount, count ; + sf_count_t total = 0 ; + + if (psf->codec_data == NULL) + return 0 ; + pnms = (NMS_ADPCM_PRIVATE*) psf->codec_data ; + + while (len > 0) + { writecount = (len > 0x10000000) ? 0x10000000 : (int) len ; + + count = nms_adpcm_write_block (psf, pnms, ptr, writecount) ; + + total += count ; + len -= count ; + if (count != writecount) + break ; + } ; + + return total ; +} /* nms_adpcm_write_s */ + +static sf_count_t +nms_adpcm_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + NMS_ADPCM_PRIVATE *pnms ; + short *sptr ; + int k, bufferlen, writecount = 0, count ; + sf_count_t total = 0 ; + + if (psf->codec_data == NULL) + return 0 ; + pnms = (NMS_ADPCM_PRIVATE*) psf->codec_data ; + + sptr = ubuf.sbuf ; + bufferlen = SF_BUFFER_LEN / sizeof (short) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + sptr [k] = ptr [total + k] >> 16 ; + count = nms_adpcm_write_block (psf, pnms, sptr, writecount) ; + + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + return total ; +} /* nms_adpcm_write_i */ + +static sf_count_t +nms_adpcm_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + NMS_ADPCM_PRIVATE *pnms ; + short *sptr ; + int k, bufferlen, writecount = 0, count ; + sf_count_t total = 0 ; + float normfact ; + + if (psf->codec_data == NULL) + return 0 ; + pnms = (NMS_ADPCM_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x8000) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = SF_BUFFER_LEN / sizeof (short) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + sptr [k] = psf_lrintf (normfact * ptr [total + k]) ; + count = nms_adpcm_write_block (psf, pnms, sptr, writecount) ; + + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + + return total ; +} /* nms_adpcm_write_f */ + +static sf_count_t +nms_adpcm_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + NMS_ADPCM_PRIVATE *pnms ; + short *sptr ; + int k, bufferlen, writecount = 0, count ; + sf_count_t total = 0 ; + double normfact ; + + if (psf->codec_data == NULL) + return 0 ; + pnms = (NMS_ADPCM_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x8000) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = SF_BUFFER_LEN / sizeof (short) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + sptr [k] = psf_lrint (normfact * ptr [total + k]) ; + count = nms_adpcm_write_block (psf, pnms, sptr, writecount) ; + + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + + return total ; +} /* nms_adpcm_write_d */ + +int +nms_adpcm_init (SF_PRIVATE *psf) +{ NMS_ADPCM_PRIVATE *pnms ; + + if (psf->codec_data != NULL) + { psf_log_printf (psf, "*** psf->codec_data is not NULL.\n") ; + return SFE_INTERNAL ; + } ; + + psf->sf.seekable = SF_FALSE ; + + if (psf->sf.channels != 1) + return SFE_NMS_ADPCM_NOT_MONO ; + + if ((pnms = calloc (1, sizeof (NMS_ADPCM_PRIVATE))) == NULL) + return SFE_MALLOC_FAILED ; + + psf->codec_data = (void*) pnms ; + + pnms->block_curr = 0 ; + pnms->sample_curr = 0 ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_NMS_ADPCM_16 : + pnms->type = NMS16 ; + pnms->shortsperblock = NMS_BLOCK_SHORTS_16 ; + break ; + case SF_FORMAT_NMS_ADPCM_24 : + pnms->type = NMS24 ; + pnms->shortsperblock = NMS_BLOCK_SHORTS_24 ; + break ; + case SF_FORMAT_NMS_ADPCM_32 : + pnms->type = NMS32 ; + pnms->shortsperblock = NMS_BLOCK_SHORTS_32 ; + break ; + + default : return SFE_UNIMPLEMENTED ; + } ; + nms_adpcm_codec_init (&pnms->state, pnms->type) ; + + psf->filelength = psf_get_filelen (psf) ; + if (psf->filelength < psf->dataoffset) + psf->filelength = psf->dataoffset ; + + psf->datalength = psf->filelength - psf->dataoffset ; + if (psf->dataend > 0) + psf->datalength -= psf->filelength - psf->dataend ; + + if (psf->file.mode == SFM_READ) + { psf->read_short = nms_adpcm_read_s ; + psf->read_int = nms_adpcm_read_i ; + psf->read_float = nms_adpcm_read_f ; + psf->read_double = nms_adpcm_read_d ; + } + else if (psf->file.mode == SFM_WRITE) + { psf->write_short = nms_adpcm_write_s ; + psf->write_int = nms_adpcm_write_i ; + psf->write_float = nms_adpcm_write_f ; + psf->write_double = nms_adpcm_write_d ; + } ; + + if (psf->datalength % (pnms->shortsperblock * sizeof (short))) + { psf_log_printf (psf, "*** Odd psf->datalength (%D) should be a multiple of %d\n", + psf->datalength, pnms->shortsperblock * sizeof (short)) ; + pnms->blocks_total = (psf->datalength / (pnms->shortsperblock * sizeof (short))) + 1 ; + } + else + pnms->blocks_total = psf->datalength / (pnms->shortsperblock * sizeof (short)) ; + + psf->sf.frames = pnms->blocks_total * NMS_SAMPLES_PER_BLOCK ; + psf->codec_close = nms_adpcm_close ; + psf->seek = nms_adpcm_seek ; + + return 0 ; +} /* nms_adpcm_init */ + +static int +nms_adpcm_close (SF_PRIVATE *psf) +{ NMS_ADPCM_PRIVATE *pnms ; + + pnms = (NMS_ADPCM_PRIVATE*) psf->codec_data ; + + /* + ** If a block has been partially assembled, write it out as the final + ** block. + */ + if (psf->file.mode == SFM_WRITE) + { if (pnms->sample_curr && pnms->sample_curr < NMS_SAMPLES_PER_BLOCK) + { memset (pnms->samples + pnms->sample_curr, 0, (NMS_SAMPLES_PER_BLOCK - pnms->sample_curr) * sizeof (short)) ; + psf_nms_adpcm_encode_block (psf, pnms) ; + } + + if (psf->write_header) + psf->write_header (psf, SF_FALSE) ; + } + + return 0 ; +} /* nms_adpcm_close */ + +static sf_count_t +nms_adpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) +{ NMS_ADPCM_PRIVATE *pnms ; + + pnms = (NMS_ADPCM_PRIVATE *) psf->codec_data ; + + /* + ** NMS ADPCM is symmetric, so transitioning from reading and writing is + ** possible, but unimplemented, as it would require syncing partial blocks. + */ + if (mode != psf->file.mode) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + /* + ** NMS ADPCM cannot be seek'ed, as codec state depends on previous samples, + ** so only a seek to 0 is supported. + */ + if (offset != 0) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + if (psf_fseek (psf, psf->dataoffset, SEEK_SET) == PSF_SEEK_ERROR) + return PSF_SEEK_ERROR ; + + nms_adpcm_codec_init (&pnms->state, pnms->type) ; + pnms->block_curr = 0 ; + pnms->sample_curr = 0 ; + return 0 ; +} /* nms_adpcm_seek */ + diff --git a/libsndfile-1.0.31/src/ogg.c b/libsndfile-1.0.31/src/ogg.c new file mode 100644 index 0000000..7a4a167 --- /dev/null +++ b/libsndfile-1.0.31/src/ogg.c @@ -0,0 +1,909 @@ +/* +** Copyright (C) 2002-2019 Erik de Castro Lopo +** Copyright (C) 2007 John ffitch +** Copyright (C) 2018 Arthur Taylor +** +** This program is free software ; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation ; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY ; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +/* +** This file contains code based on OpusFile and Opus-Tools, both by +** Xiph.Org. COPYING from each is identical and is as follows: +** +** Copyright (c) 1994-2013 Xiph.Org Foundation and contributors +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** - Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** +** - Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** +** - Neither the name of the Xiph.Org Foundation nor the names of its +** contributors may be used to endorse or promote products derived from +** this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION +** OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +#if HAVE_EXTERNAL_XIPH_LIBS + +#include + +#include "ogg.h" + +#define OGG_SYNC_READ_SIZE (2048) +#define OGG_PAGE_SIZE_MAX (65307) +#define OGG_CHUNK_SIZE (65536) +#define OGG_CHUNK_SIZE_MAX (1024*1024) + +/* + * The Ogg container may seem overly complicated, particularly when used for a + * on-disk audio file format. This is probably because Ogg is designed with + * streaming rather than storage as a priority, and can handle multiple codec + * payloads multiplexed together, then possibly chained on top of that. + * Ogg achieves its goals well, but it does lend to a bit of a learning curve, + * with many internal structures to push data around in compared to most sound + * file formats which only have a header and raw data. + * + * See + * - [https://xiph.org/ogg/doc/oggstream.html] + * - [https://xiph.org/ogg/doc/framing.html] + * + * libogg Memory Management + * =========================================================================== + * + * libOgg's memory management is documented in code, not in headers or external + * documentation. What follows is not an attempt to completely document it, but + * an explanation of the basics. + * + * libOgg has two data structures which allocate and manage data buffers: The + * ogg_sync_state structure and the ogg_stream_state structure. The remaining + * structures of ogg_page and ogg_packet are views into the buffers managed by + * the previous structures. + * + * ogg_sync_state is used for reading purposes. It takes a physical bitstream + * and searches for, validates, and returns complete Ogg Pages. The + * ogg_sync_state buffers the returned page data, holding at most one + * complete page at a time. A returned Ogg page remains valid until any + * operation other than ogg_sync_check() is called. + * + * ogg_stream_state is used for both reading and writing. For reading, the + * contents of an ogg_page is copied into the stream state. This data is + * buffered to be split or joined as necessary into complete ogg_packets. If, + * after copying an ogg_page into an ogg_stream_state, packets are available to + * be read, then all of those packets remain in memory and valid until either + * the ogg_stream_state is reset, destroyed, or a new ogg_page is read into it. + * As the maximum number of packets an Ogg Page may contain is 255, at most 255 + * packets may be available from an ogg_stream_state at one time. + * + * For writing, the life cycle of a buffer pointed to by a ogg_packet is the + * responsibility of the caller. Packets written into an ogg_stream_state are + * buffered until a complete page is ready for writing. Pages for writing out + * remain in the ogg_stream_state's buffer and valid until either the + * ogg_stream_state is reset, cleared, destroyed. Writing another packet into + * the ogg_stream_state might also invalidate such pages, but writing in + * packets when a page is ready to be written out is a caller bug anyways. + */ + +/*----------------------------------------------------------------------------------------------- +** Private function prototypes. +*/ + +static int ogg_close (SF_PRIVATE *psf) ; +static int ogg_stream_classify (SF_PRIVATE *psf, OGG_PRIVATE * odata) ; +static int ogg_page_classify (SF_PRIVATE * psf, const ogg_page * og) ; +static uint64_t ogg_page_search_do_rescale (uint64_t x, uint64_t from, uint64_t to) ; +static void ogg_page_search_continued_data (OGG_PRIVATE *odata, ogg_page *page) ; + +/*----------------------------------------------------------------------------------------------- +** Exported functions. +*/ + +int +ogg_read_first_page (SF_PRIVATE *psf, OGG_PRIVATE *odata) +{ int ret ; + char *buffer ; + + /* + ** The ogg standard requires that the first pages of a physical ogg + ** bitstream be only the first pages of each logical bitstream. These + ** pages MUST have the Beginning-Of-Stream bit set, and must contain + ** only the stream's relevant header. Currently we only load the first + ** page and check that it contains a codec we support as supporting + ** multiplexed streams (video+audio(en)+audio(fs)+subtitles, etc) is + ** beyond the scope of this library. + */ + + ret = ogg_sync_fseek (psf, psf->header.indx, SEEK_SET) ; + if (ret < 0) + return SFE_NOT_SEEKABLE ; + + buffer = ogg_sync_buffer (&odata->osync, psf->header.indx) ; + memcpy (buffer, psf->header.ptr, psf->header.indx) ; + ogg_sync_wrote (&odata->osync, psf->header.indx) ; + + ret = ogg_sync_next_page (psf, &odata->opage, SF_MAX ((sf_count_t) 0, 4096 - psf->header.indx), NULL) ; + + /* Have we simply run out of data? If so, we're done. */ + if (ret == 0) + return 0 ; + if (ret < 0) + return psf->error ; + + if (!ogg_page_bos (&odata->opage)) + { /* + ** Error case. Either must not be an Ogg bitstream, or is in the + ** middle of a bitstream (live capture), or in the middle of a + ** bitstream and no complete page was in the buffer. + */ + psf_log_printf (psf, "Input does not appear to be the start of an Ogg bitstream.\n") ; + return SFE_MALFORMED_FILE ; + } ; + + /* + ** Get the serial number and set up the rest of decode. + ** Serialno first ; use it to set up a logical stream. + */ + ogg_stream_reset_serialno (&odata->ostream, ogg_page_serialno (&odata->opage)) ; + + if (ogg_stream_pagein (&odata->ostream, &odata->opage) < 0) + { /* Error ; stream version mismatch perhaps. */ + psf_log_printf (psf, "Error reading first page of Ogg bitstream data\n") ; + return SFE_MALFORMED_FILE ; + } ; + + if (ogg_stream_packetout (&odata->ostream, &odata->opacket) != 1) + { /* No page? */ + psf_log_printf (psf, "Error reading initial header page packet.\n") ; + return SFE_MALFORMED_FILE ; + } ; + + return 0 ; +} /* ogg_read_first_page */ + +int +ogg_write_page (SF_PRIVATE *psf, ogg_page *page) +{ int bytes ; + + bytes = psf_fwrite (page->header, 1, page->header_len, psf) ; + bytes += psf_fwrite (page->body, 1, page->body_len, psf) ; + + return bytes == page->header_len + page->body_len ; +} /* ogg_write_page */ + +sf_count_t +ogg_sync_ftell (SF_PRIVATE *psf) +{ OGG_PRIVATE* odata = (OGG_PRIVATE *) psf->container_data ; + sf_count_t position ; + + position = psf_ftell (psf) ; + if (position >= 0) + { /* success */ + if (position < odata->osync.fill) + { /* Really, this should be an assert. */ + psf->error = SFE_INTERNAL ; + return -1 ; + } + position += (sf_count_t) (odata->osync.returned - odata->osync.fill) ; + } + + return position ; +} /* ogg_sync_ftell */ + +sf_count_t +ogg_sync_fseek (SF_PRIVATE *psf, sf_count_t offset, int whence) +{ OGG_PRIVATE* odata = (OGG_PRIVATE *) psf->container_data ; + sf_count_t ret ; + + ret = psf_fseek (psf, offset, whence) ; + if (ret >= 0) + { /* success */ + odata->eos = 0 ; + ogg_sync_reset (&odata->osync) ; + } + + return ret ; +} /* ogg_sync_fseek */ + +int +ogg_sync_next_page (SF_PRIVATE * psf, ogg_page *og, sf_count_t readmax, sf_count_t *offset) +{ OGG_PRIVATE* odata = (OGG_PRIVATE *) psf->container_data ; + sf_count_t position, nb_read, read_ret ; + unsigned char *buffer ; + int synced ; + int report_hole = 0 ; + + for (position = 0 ; readmax <= 0 || readmax > position ; ) + { synced = ogg_sync_pageseek (&odata->osync, og) ; + if (synced < 0) + { /* + ** Skipped -synced bytes before finding the start of a page. + ** If seeking, we have just landed in the middle of a page. + ** Otherwise, warn about junk in the bitstream. + ** Page might not yet be ready, hence the continue. + */ + if (!offset) + report_hole = 1 ; + position -= synced ; + continue ; + } ; + + if (report_hole) + { psf_log_printf (psf, "Ogg : Skipped %d bytes looking for the next page. Corrupted bitstream?!\n", position) ; + report_hole = 0 ; + } ; + + if (synced > 0) + { /* Have a page */ + if (offset) + *offset += position ; + return og->header_len + og->body_len ; + } ; + + /* + ** Else readmax == 0, Out of data. Try to read more in without + ** invalidating our boundary (readmax) constraint. + */ + if (readmax == 0) + return 0 ; + if (readmax > 0) + nb_read = SF_MIN ((sf_count_t) OGG_SYNC_READ_SIZE, readmax - position) ; + else + nb_read = OGG_SYNC_READ_SIZE ; + buffer = (unsigned char *) ogg_sync_buffer (&odata->osync, nb_read) ; + read_ret = psf_fread (buffer, 1, nb_read, psf) ; + if (read_ret == 0) + return psf->error ? -1 : 0 ; + ogg_sync_wrote (&odata->osync, read_ret) ; + } ; + return 0 ; +} /* ogg_sync_next_page */ + +int +ogg_stream_next_page (SF_PRIVATE *psf, OGG_PRIVATE *odata) +{ int nn ; + + if (odata->eos) + return 0 ; + + for ( ; ; ) + { nn = ogg_sync_next_page (psf, &odata->opage, -1, NULL) ; + if (nn == 0) + { psf_log_printf (psf, "Ogg : File ended unexpectedly without an End-Of-Stream flag set.\n") ; + odata->eos = 1 ; + } + if (nn <= 0) + return nn ; + + if (ogg_page_serialno (&odata->opage) == odata->ostream.serialno) + break ; + } ; + + if (ogg_page_eos (&odata->opage)) + odata->eos = 1 ; + + if (ogg_stream_pagein (&odata->ostream, &odata->opage) < 0) + { psf->error = SFE_INTERNAL ; + return -1 ; + } + + return 1 ; +} /* ogg_stream_next_page */ + +int +ogg_stream_unpack_page (SF_PRIVATE *psf, OGG_PRIVATE *odata) +{ int nn ; + int i ; + int found_hole = 0 ; + ogg_packet *ppkt = odata->pkt ; + + odata->pkt_indx = 0 ; + nn = ogg_stream_packetout (&odata->ostream, ppkt) ; + if (nn == 0) + { /* + ** Steam is out of packets. Read in more pages until there is one, or + ** the stream ends, or an error occurs. + */ + for ( ; nn == 0 ; nn = ogg_stream_packetout (&odata->ostream, ppkt)) + { nn = ogg_stream_next_page (psf, odata) ; + if (nn <= 0) + { odata->pkt_len = 0 ; + return nn ; + } + } + /* + ** In the case of the for loop exiting because + ** ogg_stream_packetout() == -1, fall-through. + */ + } + + if (nn == -1) + { /* + ** libOgg found a hole. That is, the next packet found was out of + ** sequence. As such, "flush" the hole marker by removing the invalid + ** packet, as the valid packets are queued behind it. + */ + psf_log_printf (psf, "Ogg : Warning, libogg reports a hole at %d bytes.\n", ogg_sync_ftell (psf)) ; + nn = ogg_stream_packetout (&odata->ostream, ppkt) ; + found_hole = 1 ; + } + + /* + ** Unpack all the packets on the page. It is undocumented (like much of + ** libOgg behavior) but all packets from a page read into the stream are + ** guarenteed to remain valid in memory until a new page is read into the + ** stream. + */ + for (i = 1 ; ; i++) + { /* Not an off-by-one, there are 255 not 256 packets max. */ + if (i == 255) + { if (ogg_stream_packetpeek (&odata->ostream, NULL) == 1) + { psf->error = SFE_INTERNAL ; + return -1 ; + } + break ; + } + if (ogg_stream_packetout (&odata->ostream, ++ ppkt) != 1) + break ; + } + odata->pkt_len = i ; + + /* 1 = ok, 2 = ok, and found a hole. */ + return 1 + found_hole ; +} /* ogg_stream_unpack_page */ + +sf_count_t +ogg_sync_last_page_before (SF_PRIVATE *psf, OGG_PRIVATE *odata, uint64_t *gp_out, sf_count_t offset, int32_t serialno) +{ sf_count_t begin, end, original_end, chunk_size, ret ; + sf_count_t position = 0 ; + uint64_t gp = -1 ; + int left_link ; + + /* Based on code from Xiph.org's Opusfile */ + + original_end = end = begin = offset ; + offset = -1 ; + chunk_size = OGG_CHUNK_SIZE ; + do + { begin = SF_MAX (begin - chunk_size, (sf_count_t) 0) ; + position = ogg_sync_fseek (psf, begin, SEEK_SET) ; + if (position < 0) + return position ; + left_link = 0 ; + while (position < end) + { ret = ogg_sync_next_page (psf, &odata->opage, end - position, &position) ; + if (ret <= 0) + return -1 ; + if (ogg_page_serialno (&odata->opage) == serialno) + { uint64_t page_gp = ogg_page_granulepos (&odata->opage) ; + if (page_gp != (uint64_t) -1) + { offset = position ; + gp = page_gp ; + } + } + else + left_link = 1 ; + position += ret ; + } + + if ((left_link || !begin) && offset < 0) + { psf->error = SFE_MALFORMED_FILE ; + return -1 ; + } + + chunk_size = SF_MIN (2 * chunk_size, (sf_count_t) OGG_CHUNK_SIZE_MAX) ; + end = SF_MIN (begin + OGG_PAGE_SIZE_MAX - 1, original_end) ; + } + while (offset < 0) ; + + *gp_out = gp ; + return offset ; +} /* ogg_sync_last_page_before */ + +int +ogg_stream_seek_page_search (SF_PRIVATE *psf, OGG_PRIVATE *odata, uint64_t target_gp, uint64_t pcm_start, uint64_t pcm_end, uint64_t *best_gp, sf_count_t begin, sf_count_t end) +{ ogg_page page ; + uint64_t gp ; + sf_count_t d0, d1, d2 ; + sf_count_t best ; + sf_count_t best_start ; + sf_count_t boundary ; + sf_count_t next_boundary ; + sf_count_t page_offset = -1 ; + sf_count_t seek_pos = -1 ; + sf_count_t bisect ; + sf_count_t chunk_size ; + int buffering = SF_FALSE ; + int force_bisect = SF_FALSE ; + int ret ; + int has_packets ; + + *best_gp = pcm_start ; + best = best_start = begin ; + boundary = end ; + + ogg_stream_reset_serialno (&odata->ostream, odata->ostream.serialno) ; + + /* + ** This code is based on op_pcm_seek_page() from Opusfile, which is in turn + ** based on "new search algorithm by Nicholas Vinen" from libvorbisfile. + */ + + d2 = d1 = d0 = end - begin ; + while (begin < end) + { /* + ** Figure out if and where to try and seek in the file. + */ + if (end - begin < OGG_CHUNK_SIZE) + bisect = begin ; + else + { /* Update the interval size history */ + d0 = d1 >> 1 ; + d1 = d2 >> 1 ; + d2 = (end - begin) >> 1 ; + if (force_bisect == SF_TRUE) + bisect = begin + ((end - begin) >> 1) ; + else + { /* Take a decent guess. */ + bisect = begin + ogg_page_search_do_rescale (target_gp - pcm_start, pcm_end - pcm_start, end - begin) ; + } + if (bisect - OGG_CHUNK_SIZE < begin) + bisect = begin ; + else + bisect -= OGG_CHUNK_SIZE ; + force_bisect = SF_FALSE ; + } + + /* + ** Avoid an actual fseek if we can (common for final iterations.) + */ + if (seek_pos != bisect) + { if (buffering == SF_TRUE) + ogg_stream_reset (&odata->ostream) ; + buffering = SF_FALSE ; + page_offset = -1 ; + seek_pos = ogg_sync_fseek (psf, bisect, SEEK_SET) ; + if (seek_pos < 0) + return seek_pos ; + } + + chunk_size = OGG_CHUNK_SIZE ; + next_boundary = boundary ; + + /* + ** Scan forward, figure out where we landed. + ** The ideal case is we see a page that ends before our target followed + ** by a page that ends after our target. + ** If we are too far before or after, breaking out will bisect what we + ** have found so far. + */ + while (begin < end) + { ret = ogg_sync_next_page (psf, &page, boundary - seek_pos, &seek_pos) ; + if (ret <= 0) + return ret ; + page_offset = seek_pos ; + if (ret == 0) + { /* + ** There are no more pages in this interval from our stream + ** with a granulepos less than our target. + */ + if (bisect <= begin + 1) + { /* Scanned the whole interval, so we are done. */ + end = begin ; + } + else + { /* + ** Otherwise, back up one chunk. First discard any data + ** from a continued packet. + */ + if (buffering) + ogg_stream_reset (&odata->ostream) ; + buffering = SF_FALSE ; + bisect = SF_MAX (bisect - chunk_size, begin) ; + seek_pos = ogg_sync_fseek (psf, bisect, SEEK_SET) ; + if (seek_pos < 0) + return seek_pos ; + /* Bump up the chunk size. */ + chunk_size = SF_MIN (2 * chunk_size, (sf_count_t) OGG_CHUNK_SIZE_MAX) ; + /* + ** If we did find a page from another stream or without a + ** timestamp, don't read past it. + */ + boundary = next_boundary ; + } + continue ; + } + + /* Found a page. Advance seek_pos past it */ + seek_pos += page.header_len + page.body_len ; + /* + ** Save the offset of the first page we found after the seek, + ** regardless of the stream it came from or whether or not it has a + ** timestamp. + */ + next_boundary = SF_MIN (page_offset, next_boundary) ; + + /* If not from our stream, continue. */ + if (odata->ostream.serialno != ogg_page_serialno (&page)) + continue ; + + /* + ** The Ogg spec says that a page with a granule pos of -1 must not + ** contain and packets which complete, but the lack of biconditional + ** wording means that /technically/ a packet which does not complete + ** any packets can have a granule pos other than -1. To make matters + ** worse, older versions of libogg did just that. + */ + has_packets = ogg_page_packets (&page) > 0 ; + gp = has_packets ? ogg_page_granulepos (&page) : -1 ; + if (gp == (uint64_t) -1) + { if (buffering == SF_TRUE) + { if (!has_packets) + ogg_stream_pagein (&odata->ostream, &page) ; + else + { /* + ** If packets did end on this page, but we still didn't + ** have a valid granule position (in violation of the + ** spec!), stop buffering continued packet data. + ** Otherwise we might continue past the packet we + ** actually wanted. + */ + ogg_stream_reset (&odata->ostream) ; + buffering = SF_FALSE ; + } + } + continue ; + } + + if (gp < target_gp) + { /* + ** We found a page that ends before our target. Advance to + ** the raw offset of the next page. + */ + begin = seek_pos ; + if (pcm_start > gp || pcm_end < gp) + break ; + /* Save the byte offset of after this page. */ + best = best_start = begin ; + if (buffering) + ogg_stream_reset (&odata->ostream) ; + /* Check to see if the last packet continues. */ + if (page.header [27 + page.header [26] - 1] == 255) + { ogg_page_search_continued_data (odata, &page) ; + /* + ** If we have a continued packet, remember the offset of + ** this page's start, so that if we do wind up having to + ** seek back here later, we can prime the stream with the + ** continued packet data. With no continued packet, we + ** remember the end of the page. + */ + best_start = page_offset ; + } ; + /* + ** Then force buffering on, so that if a packet starts (but + ** does not end) on the next page, we still avoid the extra + ** seek back. + */ + buffering = SF_TRUE ; + *best_gp = pcm_start = gp ; + if (target_gp - gp > 48000) + { /* Out by over a second. Try another bisection. */ + break ; + } + /* Otherwise, keep scanning forward (do NOT use begin+1). */ + bisect = begin ; + } + else + { /* + ** Found a page that ends after our target. If we had just + ** scanned the whole interval before we found it, we're good. + */ + if (bisect <= begin + 1) + end = begin ; + else + { end = bisect ; + /* + ** In later iterations, don't read past the first page we + ** found. + */ + boundary = next_boundary ; + /* + ** If we're not making much progress shrinking the interval + ** size, start forcing straight bisection to limit the + ** worst case. + */ + force_bisect = end - begin > d0 * 2 ? SF_TRUE : SF_FALSE ; + /* + ** Don't let pcm_end get out of range! That could happen + ** with an invalid timestamp. + */ + if (pcm_end > gp && pcm_start <= gp) + pcm_end = gp ; + } + break ; + } + } + } + + /* + ** If we are buffering, the page we want is currently buffered in the + ** Ogg stream structure, or in the Ogg page which has not been submitted. + ** If not, we need to seek back and load it again. + */ + if (buffering == SF_FALSE) + { if (best_start != page_offset) + { page_offset = -1 ; + seek_pos = ogg_sync_fseek (psf, best_start, SEEK_SET) ; + if (seek_pos < 0) + return seek_pos ; + } + if (best_start < best) + { if (page_offset < 0) + { ret = ogg_sync_next_page (psf, &page, -1, &seek_pos) ; + if (seek_pos != best_start) + return -1 ; + } + ogg_page_search_continued_data (odata, &page) ; + page_offset = -1 ; + } + } ; + + if (page_offset >= 0) + ogg_stream_pagein (&odata->ostream, &page) ; + + return 0 ; +} /* ogg_stream_seek_page_search */ + +int +ogg_open (SF_PRIVATE *psf) +{ OGG_PRIVATE* odata = calloc (1, sizeof (OGG_PRIVATE)) ; + sf_count_t pos = psf_ftell (psf) ; + int error = 0 ; + + psf->container_data = odata ; + psf->container_close = ogg_close ; + + if (psf->file.mode == SFM_RDWR) + return SFE_BAD_MODE_RW ; + + if (psf->file.mode == SFM_READ) + if ((error = ogg_stream_classify (psf, odata)) != 0) + return error ; + + if (SF_ENDIAN (psf->sf.format) != 0) + return SFE_BAD_ENDIAN ; + + switch (psf->sf.format) + { case SF_FORMAT_OGG | SF_FORMAT_VORBIS : + return ogg_vorbis_open (psf) ; + + case SF_FORMAT_OGGFLAC : + /* Reset everything to an initial state. */ + ogg_sync_clear (&odata->osync) ; + ogg_stream_clear (&odata->ostream) ; + psf_fseek (psf, pos, SEEK_SET) ; + free (psf->container_data) ; + psf->container_data = NULL ; + psf->container_close = NULL ; + return flac_open (psf) ; + + case SF_FORMAT_OGG | SF_FORMAT_OPUS : + return ogg_opus_open (psf) ; + +#if ENABLE_EXPERIMENTAL_CODE + case SF_FORMAT_OGG | SF_FORMAT_SPEEX : + return ogg_speex_open (psf) ; + + case SF_FORMAT_OGG | SF_FORMAT_PCM_16 : + case SF_FORMAT_OGG | SF_FORMAT_PCM_24 : + return ogg_pcm_open (psf) ; +#endif + + default : + break ; + } ; + + psf_log_printf (psf, "%s : bad psf->sf.format 0x%x.\n", __func__, psf->sf.format) ; + return SFE_INTERNAL ; +} /* ogg_open */ + +/*============================================================================== +** Private functions. +*/ + +static int +ogg_close (SF_PRIVATE *psf) +{ OGG_PRIVATE* odata = psf->container_data ; + + ogg_sync_clear (&odata->osync) ; + ogg_stream_clear (&odata->ostream) ; + + return 0 ; +} /* ogg_close */ + +static int +ogg_stream_classify (SF_PRIVATE *psf, OGG_PRIVATE* odata) +{ int error ; + + /* Call this here so it only gets called once, so no memory is leaked. */ + ogg_sync_init (&odata->osync) ; + ogg_stream_init (&odata->ostream, 0) ; + + /* Load the first page in the physical bitstream. */ + if ((error = ogg_read_first_page (psf, odata)) != 0) + return error ; + + odata->codec = ogg_page_classify (psf, &odata->opage) ; + + switch (odata->codec) + { case OGG_VORBIS : + psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ; + return 0 ; + + case OGG_FLAC : + case OGG_FLAC0 : + psf->sf.format = SF_FORMAT_OGGFLAC ; + return 0 ; + + case OGG_SPEEX : + psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_SPEEX ; + return 0 ; + + case OGG_OPUS : + psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_OPUS ; + return 0 ; + + case OGG_PCM : + psf_log_printf (psf, "Detected Ogg/PCM data. This is not supported yet.\n") ; + return SFE_UNIMPLEMENTED ; + + default : + break ; + } ; + + psf_log_printf (psf, "This Ogg bitstream contains some uknown data type.\n") ; + return SFE_UNIMPLEMENTED ; +} /* ogg_stream_classify */ + +/*============================================================================== +*/ + +static struct +{ const char *str, *name ; + int len, codec ; +} codec_lookup [] = +{ { "Annodex", "Annodex", 8, OGG_ANNODEX }, + { "AnxData", "AnxData", 7, OGG_ANXDATA }, + { "\177FLAC", "Flac1", 5, OGG_FLAC }, + { "fLaC", "Flac0", 4, OGG_FLAC0 }, + { "PCM ", "PCM", 8, OGG_PCM }, + { "Speex", "Speex", 5, OGG_SPEEX }, + { "\001vorbis", "Vorbis", 7, OGG_VORBIS }, + { "OpusHead", "Opus", 8, OGG_OPUS }, +} ; + +static int +ogg_page_classify (SF_PRIVATE * psf, const ogg_page * og) +{ int k, len ; + + for (k = 0 ; k < ARRAY_LEN (codec_lookup) ; k++) + { if (codec_lookup [k].len > og->body_len) + continue ; + + if (memcmp (og->body, codec_lookup [k].str, codec_lookup [k].len) == 0) + { psf_log_printf (psf, "Ogg stream data : %s\n", codec_lookup [k].name) ; + psf_log_printf (psf, "Stream serialno : %u\n", (uint32_t) ogg_page_serialno (og)) ; + return codec_lookup [k].codec ; + } ; + } ; + + len = og->body_len < 8 ? og->body_len : 8 ; + + psf_log_printf (psf, "Ogg_stream data : '") ; + for (k = 0 ; k < len ; k++) + psf_log_printf (psf, "%c", isprint (og->body [k]) ? og->body [k] : '.') ; + psf_log_printf (psf, "' ") ; + for (k = 0 ; k < len ; k++) + psf_log_printf (psf, " %02x", og->body [k] & 0xff) ; + psf_log_printf (psf, "\n") ; + + return 0 ; +} /* ogg_page_classify */ + +/* +** Scale x from the range [0, from] to the range [0, to] +*/ +static uint64_t +ogg_page_search_do_rescale (uint64_t x, uint64_t from, uint64_t to) +{ uint64_t frac ; + uint64_t ret ; + int i ; + + /* I should have paid more attention in CSc 349A: Numerical Analysis */ + if (x >= from) + return to ; + if (x == 0) + return 0 ; + frac = 0 ; + for (i = 0 ; i < 63 ; i++) + { frac <<= 1 ; + if (x >= from >> 1) + { x -= from - x ; + frac |= 1 ; + } + else + x <<= 1 ; + } + ret = 0 ; + for (i = 0 ; i < 63 ; i++) + { if (frac & 1) + ret = (ret & to & 1) + (ret >> 1) + (to >> 1) ; + else + ret >>= 1 ; + frac >>= 1 ; + } + return ret ; +} /* ogg_page_search_do_rescale */ + +static void +ogg_page_search_continued_data (OGG_PRIVATE *odata, ogg_page *page) +{ ogg_stream_pagein (&odata->ostream, page) ; + while (ogg_stream_packetout (&odata->ostream, &odata->opacket)) ; +} /* ogg_page_search_continued_data */ + +#else /* HAVE_EXTERNAL_XIPH_LIBS */ + +int +ogg_open (SF_PRIVATE *psf) +{ + psf_log_printf (psf, "This version of libsndfile was compiled without Ogg/Vorbis support.\n") ; + return SFE_UNIMPLEMENTED ; +} /* ogg_open */ + +#endif diff --git a/libsndfile-1.0.31/src/ogg.h b/libsndfile-1.0.31/src/ogg.h new file mode 100644 index 0000000..5c837a8 --- /dev/null +++ b/libsndfile-1.0.31/src/ogg.h @@ -0,0 +1,134 @@ +/* +** Copyright (C) 2008-2011 Erik de Castro Lopo +** Copyright (C) 2018 Arthur Taylor +** +** This program is free software ; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation ; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY ; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#ifndef SF_SRC_OGG_H +#define SF_SRC_OGG_H + +enum +{ OGG_ANNODEX = 300, + OGG_ANXDATA, + OGG_FLAC, + OGG_FLAC0, + OGG_PCM, + OGG_SPEEX, + OGG_VORBIS, + OGG_OPUS, +} ; + +typedef struct +{ /* Sync and verify incoming physical bitstream */ + ogg_sync_state osync ; + /* Take physical pages, weld into a logical stream of packets */ + ogg_stream_state ostream ; + /* One Ogg bitstream page. Codec packets are inside */ + ogg_page opage ; + /* One raw packet of data for decode */ + ogg_packet opacket ; + + /* Unpacked packets. 255 is max there can ever be in one page. */ + ogg_packet pkt [255] ; + /* How many packets */ + int pkt_len ; + /* Current packet */ + int pkt_indx ; + + int eos ; + int codec ; +} OGG_PRIVATE ; + + +#define readint(buf, base) (((buf [base + 3] << 24) & 0xff000000) | \ + ((buf [base + 2] <<16) & 0xff0000) | \ + ((buf [base + 1] << 8) & 0xff00) | \ + (buf [base] & 0xff)) + +int ogg_read_first_page (SF_PRIVATE *, OGG_PRIVATE *) ; + +/* +** Write the whole Ogg page out. Convenience function as the ogg_page struct +** splits header and body data into separate buffers. +*/ +int ogg_write_page (SF_PRIVATE *, ogg_page *) ; + +/* +** Wrapper around psf_ftell() that returns the current offset in the file after +** the most recent page that has been returned by ogg_sync_pageout(). +*/ +sf_count_t ogg_sync_ftell (SF_PRIVATE *) ; + +/* +** Wrapper around psf_fseek() that on success resets the ogg_sync_state struct +** so that it doesn't get corrupted. +*/ +sf_count_t ogg_sync_fseek (SF_PRIVATE *, sf_count_t offset, int whence) ; + +/* +** Get the next page from the physical bitstream, reading in data as necessary. +** Pays no attention to Ogg BOS/EOS markers or stream serial numbers. +** The page is buffered in the ogg_sync_state struct, (replacing any other +** buffered there) and also returned in *og. readmax sets a boundary for how +** many bytes more may be read from the file, use already buffered only, or +** unlimited reading in the case of a positive, zero or negative argument +** respectively. If a pointer to a sf_count_t is passed in offset, then it will +** be incremented by how many bytes were skipped to find the next page header. +** (Useful for seeking, normally zero.) Returns the page size in bytes on +** success, 0 on out-of-data (be it end of file or readmax reached) and -1 on +** error with psf->error set appropriately. +*/ +int ogg_sync_next_page (SF_PRIVATE * psf, ogg_page *og, sf_count_t readmax, sf_count_t *offset) ; + +/* +** Load the last page of a stream before the provided file offset. Searches the +** physical bitstream, and selects a page of the passed serialno. The page +** found is loaded in the sync buffer and exposed in odata->opage, and not +** loaded into the ogg_stream_state. If found, the granulepos is returned in +** *gp_out. Returns the file offset *before* the last page on success, or -1 on +** error, setting psf->error as appropriate. +*/ +sf_count_t ogg_sync_last_page_before (SF_PRIVATE *psf, OGG_PRIVATE *odata, uint64_t *gp_out, sf_count_t offset, int32_t serialno) ; + +/* +** Load the next page from the virtual bitstream, reading data as necessary. +** Reads in pages from the physical bitstream, skipping pages until one of the +** virtual bitstream of interest is found, and then feeds it into the +** ogg_stream_state of odata->ostream, where it is buffered. Heeds EOS markers. +** Returns 1 on success, 0 on end of stream, and -1 on fatal error. +*/ +int ogg_stream_next_page (SF_PRIVATE * psf, OGG_PRIVATE *odata) ; + +/* +** Loads the next page using ogg_stream_next_page() and unpacks all packets +** into the array odata->pkt, updating odata->pkt_len and setting +** odata->pkt_indx to 0. Returns 1 if okay, 2 if okay but a hole was found +** in the bitstream, 0 if on end of stream, and -1 on fatal error. +*/ +int ogg_stream_unpack_page (SF_PRIVATE *psf, OGG_PRIVATE *odata) ; + +/* +** Seek within the Ogg virtual bitstream for a page containing target_gp. +** Preforms a bisection search. If not found exactly, the best result is +** returned in *best_gp. Found page is loaded into the virtual bitstream, +** ready for unpacking. Arguments pcm_start and pcm_end are the highest and +** lowest granule positions of the file. begin and end are the file offsets. +*/ +int ogg_stream_seek_page_search (SF_PRIVATE *psf, OGG_PRIVATE *odata, + uint64_t target_gp, uint64_t pcm_start, uint64_t pcm_end, + uint64_t *best_gp, sf_count_t begin, sf_count_t end) ; + +#endif /* SF_SRC_OGG_H */ diff --git a/libsndfile-1.0.31/src/ogg_opus.c b/libsndfile-1.0.31/src/ogg_opus.c new file mode 100644 index 0000000..9be6e91 --- /dev/null +++ b/libsndfile-1.0.31/src/ogg_opus.c @@ -0,0 +1,1778 @@ +/* +** Copyright (C) 2013-2020 Erik de Castro Lopo +** Copyright (C) 2018 Arthur Taylor +** +** This program is free software ; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation ; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY ; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +/* +** This file contains code based on OpusFile and Opus-Tools, both by +** Xiph.Org. COPYING from each is identical and is as follows: +** +** Copyright (c) 1994-2013 Xiph.Org Foundation and contributors +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** - Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** +** - Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** +** - Neither the name of the Xiph.Org Foundation nor the names of its +** contributors may be used to endorse or promote products derived from +** this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION +** OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +** TODO: +** - Channel mapping modification / reporting +** - connect psf->channel_map and Opus channel mapping somehow? +** - Gain parameters and their mappings +*/ + +/* +** Opus Sample, Frame, and Samples/Channel Terminology +** +** libsndfile refers to one PCM value as a 'sample,' and a group of samples of +** the same sample time, one for each channel, as a 'frame.' This differs from +** Opus, which has no corresponding name for sample, and refers to a group of +** PCM values, one per channel (aka libsndfile frames) as 'samples.' +** Further, Opus has an object called a 'frame' that is made up of multiple +** Opus-samples. +** All this means that one has to be careful with what is meant by each term. +** In an attempt to avoid ambiguity, this file adopts the following terms: +** - Samples shall refer to discrete PCM values, regardless of any channel +** considerations. This is the same as what libsndfile calls samples. +** - Samples/channel shall refer to groups of samples, one for each channel. +** This is what Opus calles samples, and what libsndfile calles frames. It +** has the advantage that its name is also the formula to calculate it. +** +** +** Opus vs OggOpus +** +** In this file a distinction is made between Opus and OggOpus. Opus refers to +** the codec alone, support for which is by libopus. OggOpus refers to an Opus +** payload encapsulated in an Ogg stream. This is also know as an "Opus file." +** The OggOpus spec includes information on header and granule position +** interpretation, which is outside of the scope of the Opus spec. As such, an +** attempt here is made to refer to either Opus or OggOpus depending on which +** spec is being referenced. See https://wiki.xiph.org/OggOpus +** +** +** Opus Sample Rates +** +** Opus only supports a fixed number of sample rates: 48kHz, 24kHz, 16kHz, +** 12kHz, 8kHz. Audio may be decoded or encoded at any of these rates, +** independent of the rate it was encoded at or to be decoded at respectively. +** Other sample rates must be converted to one of these rates. +** +** As 44.1kHz (CD sample rate) and 22.5kHz are popular sample rates, and to +** support any other sample rate there may be, the Opus header includes a field +** to save the input (original) sample rate before converting it to a supported +** one. Implementations are recommended by the Opus spec to do a sample rate +** conversion at encode, but decode at 48kHz if outputting to hardware, or do +** the reverse sample rate conversion if outputting to file. +** +** Heretofore libsndfile does not contain a sample rate converter, so doing the +** sample rate conversion is not supported. Instead audio must be provided by +** the user at a supported rate. However, the input sample rate field can be +** set and retrieved by the user using sf_command(). At decode we choose to +** decode at the lowest valid rate that is greater than or equal to the input +** sample rate. +** +** +** OggOpus Granule Positions +** +** Ogg streams include a strictly increasing granule position value. The +** interpretation of this value is dependent on the payload type. For Opus +** streams the granule position is the count of samples in the stream when +** encoding/decoding at 48kHz. Note that the actual position of the output +** sample relative to the granule position is offset by the preskip amount. +** That is, if a packet ends with a granule position of x, the last sample +** output when decoding is actually sample (x - preskip). +** +** Further, to allow for clipping off of the front of a stream without +** rewriting all following granule positions, an Opus stream granule position +** may be offset by a constant amount. This amount is evident by comparing the +** granule position of the first page of an Opus stream on which an audio +** packet completes is greater than the sum of the samples of all audio +** packets completed on the page. Only the first such page is allows to have an +** 'excessive' granule position, and only if it is not also the last page of +** the stream (e_o_s bit is not set.) +** +** The granule position is an unsigned 64-bit integer, with the special value +** of UINT64_MAX/-1 being treated as invalid. However, as not all platforms +** support unsigned 64-bit integers, libOgg uses signed 64-bit integers for the +** granule position. +** +** Remembering that signed integer overflow/underflow is explicitly undefined +** in C, and as we already assume support for unsigned 64-bit integers, the +** easiest way to deal with this problem is to modify granule positions as +** unsigned integers. +*/ + + +#include "sfconfig.h" + +#include +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +#if HAVE_EXTERNAL_XIPH_LIBS + +#include +#include +#include + +#include "ogg.h" +#include "ogg_vcomment.h" + +#define OGG_OPUS_COMMENT_PAD (512) /* Same as oggenc default */ + +/* +** Opus packets can be any multiple of 2.5ms (at 48kHz). We use the recommended +** default for non-realtime of 20ms. While longer packets reduce the overhead +** data somewhat, it also decreases the quality. +*/ +#define OGG_OPUS_ENCODE_PACKET_LEN(samplerate) ((20 * (samplerate)) / 1000) + +/* +** How long does it take for a decoder to converge (avoiding flush on seek. +*/ +#define OGG_OPUS_PREROLL (80 * 48) /* 80 milliseconds */ + +typedef struct +{ uint8_t version ; + + /* Number of channels, 1...255 */ + uint8_t channels ; + + /* Encoder latency, the amount to skip before valid data comes out. */ + uint16_t preskip ; + + /* The sample rate of a the encoded source, as it may have been converted. */ + int32_t input_samplerate ; + + /* 'baked-in' gain to apply, dB S7.8 format. Should be zero when possible. */ + int16_t gain ; + + /* Channel mapping type. See OggOpus spec */ + uint8_t channel_mapping ; + + /* The rest is only used if channel_mapping != 0 */ + /* How many streams are there? */ + uint8_t nb_streams ; + + /* How man of those streams are coupled? (aka stereo) */ + uint8_t nb_coupled ; + + /* Mapping of opus streams to output channels */ + uint8_t stream_map [255] ; +} OpusHeader ; + +typedef struct +{ uint32_t serialno ; + OpusHeader header ; + + /* Granule position before the current packet */ + uint64_t pkt_pos ; + + /* Granule position at the end of the current page (encode: last completed) */ + uint64_t pg_pos ; + + /* integer coefficient of (current sample rate) / 48000Hz */ + int sr_factor ; + + /* Current position in buffer expressed as samples/channel */ + int loc ; + + /* Current data fill (decode) or target (encode) of buffer expressed in samples/channel */ + int len ; + + /* Size of the buffer storage, in sizeof (float) * channels */ + int buffersize ; + + /* Samples, either decoded from a packet, or assembling for encode. */ + float *buffer ; + + union { + /* decode only members */ + struct { + OpusMSDecoder *state ; + uint64_t gp_start ; + uint64_t gp_end ; + sf_count_t last_offset ; + } decode ; + + /* encode only members */ + struct { + OpusMSEncoder *state ; + + /* How many Ogg page segments are in Ogg page currently being assembled. */ + int last_segments ; + + int bitrate ; + unsigned long latency ; + + /* Least significant bit of the source (aka bitwidth) */ + int lsb ; + int lsb_last ; + } encode ; + } u ; +} OPUS_PRIVATE ; + +/*----------------------------------------------------------------------------------------------- +** Private function prototypes. +*/ + +static int ogg_opus_close (SF_PRIVATE *psf) ; +static void opus_print_header (SF_PRIVATE *psf, OpusHeader *h) ; +static int opus_read_header_packet (SF_PRIVATE *psf, OpusHeader *h, ogg_packet *opacket) ; +static int ogg_opus_read_header (SF_PRIVATE * psf) ; +static int ogg_opus_setup_decoder (SF_PRIVATE *psf, int input_samplerate) ; + +static int ogg_opus_setup_encoder (SF_PRIVATE *psf, OGG_PRIVATE *odata, OPUS_PRIVATE *oopus) ; +static int ogg_opus_write_header (SF_PRIVATE * psf, int calc_length) ; +static void ogg_opus_flush (SF_PRIVATE *psf) ; +static int ogg_opus_unpack_next_page (SF_PRIVATE *psf, OGG_PRIVATE *odata, OPUS_PRIVATE *oopus) ; +static int ogg_opus_calculate_page_duration (OGG_PRIVATE *odata) ; +static int ogg_opus_read_refill (SF_PRIVATE *psf, OGG_PRIVATE *odata, OPUS_PRIVATE *oopus) ; +static int ogg_opus_write_out (SF_PRIVATE *psf, OGG_PRIVATE *odata, OPUS_PRIVATE *oopus) ; + +static sf_count_t ogg_opus_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t ogg_opus_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t ogg_opus_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t ogg_opus_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t ogg_opus_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t ogg_opus_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t ogg_opus_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t ogg_opus_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +static sf_count_t ogg_opus_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; +static sf_count_t ogg_opus_seek_null_read (SF_PRIVATE *psf, sf_count_t offset) ; +static sf_count_t ogg_opus_seek_manual (SF_PRIVATE *psf, uint64_t target_gp) ; +static int ogg_opus_seek_page_search (SF_PRIVATE *psf, uint64_t target_gp) ; + +static int ogg_opus_analyze_file (SF_PRIVATE *psf) ; +static int ogg_opus_command (SF_PRIVATE *psf, int command, void *data, int datasize) ; +static int ogg_opus_byterate (SF_PRIVATE *psf) ; + +/*----------------------------------------------------------------------------------------------- +*/ + +static vorbiscomment_ident opustags_ident = { "OpusTags", 8 } ; + +/*----------------------------------------------------------------------------------------------- +** Exported functions. +*/ + +int +ogg_opus_open (SF_PRIVATE *psf) +{ OGG_PRIVATE* odata = psf->container_data ; + OPUS_PRIVATE* oopus = calloc (1, sizeof (OPUS_PRIVATE)) ; + int error = 0 ; + + if (odata == NULL) + { psf_log_printf (psf, "%s : odata is NULL???\n", __func__) ; + free (oopus) ; + return SFE_INTERNAL ; + } ; + + psf->codec_data = oopus ; + if (oopus == NULL) + return SFE_MALLOC_FAILED ; + + if (psf->file.mode == SFM_RDWR) + return SFE_BAD_MODE_RW ; + + psf_log_printf (psf, "Opus library version: %s\n", opus_get_version_string ()) ; + + psf->codec_close = ogg_opus_close ; + if (psf->file.mode == SFM_READ) + { if ((error = ogg_opus_read_header (psf))) + return error ; + if ((error = ogg_opus_analyze_file (psf))) + return error ; + + psf->read_short = ogg_opus_read_s ; + psf->read_int = ogg_opus_read_i ; + psf->read_float = ogg_opus_read_f ; + psf->read_double = ogg_opus_read_d ; + } ; + + if (psf->file.mode == SFM_WRITE) + { if ((error = ogg_opus_setup_encoder (psf, odata, oopus))) + return error ; + + psf->write_header = ogg_opus_write_header ; + psf->write_short = ogg_opus_write_s ; + psf->write_int = ogg_opus_write_i ; + psf->write_float = ogg_opus_write_f ; + psf->write_double = ogg_opus_write_d ; + + psf->sf.frames = SF_COUNT_MAX ; /* Unknown really */ + psf->strings.flags = SF_STR_ALLOW_START ; + psf->datalength = 0 ; + psf->dataoffset = 0 ; /* will be updated */ + } ; + + psf->seek = ogg_opus_seek ; + psf->command = ogg_opus_command ; + psf->byterate = ogg_opus_byterate ; + psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_OPUS ; + + return error ; +} /* ogg_opus_open */ + +/*============================================================================== +** Private functions. +*/ + +static int +ogg_opus_close (SF_PRIVATE *psf) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + + if (!oopus) + return 0 ; + + if (psf->file.mode == SFM_WRITE) + { if (psf->have_written) + ogg_opus_flush (psf) ; + else { + /* Write a header... it is expected. */ + ogg_opus_write_header (psf, 0) ; + } ; + ogg_packet_clear (&odata->opacket) ; + if (oopus->u.encode.state) + { opus_multistream_encoder_destroy (oopus->u.encode.state) ; + oopus->u.encode.state = NULL ; + } ; + } + else if (psf->file.mode == SFM_READ) + { if (oopus->u.decode.state) + { opus_multistream_decoder_destroy (oopus->u.decode.state) ; + oopus->u.decode.state = NULL ; + } ; + } ; + + psf->codec_data = NULL ; + if (oopus->buffer) + free (oopus->buffer) ; + free (oopus) ; + + return 0 ; +} /* ogg_opus_close */ + +static void +opus_print_header (SF_PRIVATE *psf, OpusHeader *h) +{ psf_log_printf (psf, "Opus Header Metadata\n") ; + psf_log_printf (psf, " OggOpus version : %d\n", h->version) ; + psf_log_printf (psf, " Channels : %d\n", h->channels) ; + psf_log_printf (psf, " Preskip : %d samples @48kHz\n", h->preskip) ; + psf_log_printf (psf, " Input Samplerate : %d Hz\n", h->input_samplerate) ; + psf_log_printf (psf, " Gain : %d.%d\n", arith_shift_right (h->gain & 0xF0, 8), h->gain & 0x0F) ; + psf_log_printf (psf, " Channel Mapping : ") ; + switch (h->channel_mapping) + { case 0 : psf_log_printf (psf, "0 (mono or stereo)\n") ; break ; + case 1 : psf_log_printf (psf, "1 (surround, AC3 channel order)\n") ; break ; + case 255 : psf_log_printf (psf, "255 (no channel order)\n") ; break ; + default : psf_log_printf (psf, "%d (unknown or unsupported)\n", h->channel_mapping) ; break ; + } ; + + if (h->channel_mapping > 0) + { int i ; + psf_log_printf (psf, " streams total : %d\n", h->nb_streams) ; + psf_log_printf (psf, " streams coupled : %d\n", h->nb_coupled) ; + psf_log_printf (psf, " stream mapping : [") ; + for (i = 0 ; i < h->channels - 1 ; i++) + psf_log_printf (psf, "%d,", h->stream_map [i]) ; + psf_log_printf (psf, "%d]\n", h->stream_map [i]) ; + } ; +} /* opus_print_header */ + +static int +opus_read_header_packet (SF_PRIVATE *psf, OpusHeader *h, ogg_packet *opacket) +{ int count, i ; + + /* + ** Opus headers are 19 bytes, in the case of type 0 channel mapping, + ** or 19 + 2 + (1 * channel count) bytes for other channel mappings, to a + ** maximum of 276 (255 channels). + */ + + if (opacket->bytes < 19 || opacket->bytes > 276) + return SFE_MALFORMED_FILE ; + + if (memcmp (opacket->packet, "OpusHead", 8) != 0) + return SFE_MALFORMED_FILE ; + + /* + ** Copy the header page into the binheader so we can use binheader + ** functions to safely unpack it. + */ + count = psf_binheader_writef (psf, "ob", BHWo (0), BHWv (opacket->packet), BHWz (opacket->bytes)) ; + psf->header.end = count ; + + count = psf_binheader_readf (psf, "ep1", 8, &h->version) ; + if (! (h->version == 1 || h->version == 0)) + { psf_log_printf (psf, "Opus : Unknown / unsupported embedding scheme version: %d.\n", h->version) ; + return SFE_UNIMPLEMENTED ; + } ; + + count += psf_binheader_readf (psf, "e12421", &h->channels, &h->preskip, + &h->input_samplerate, &h->gain, &h->channel_mapping) ; + + if (h->channel_mapping == 0) + { if (h->channels > 2) + return SFE_MALFORMED_FILE ; + + /* + ** Setup the stream mapping, so we can use the multistream decoder, + ** rather than have to deal with two decoder pointer types + */ + h->nb_streams = 1 ; + h->nb_coupled = h->channels - 1 ; + h->stream_map [0] = 0 ; + h->stream_map [1] = 1 ; + } + else + { if (opacket->bytes < 19 + 2 + h->channels) + return SFE_MALFORMED_FILE ; + + if (h->channel_mapping == 1 && h->channels > 8) + return SFE_MALFORMED_FILE ; + + count += psf_binheader_readf (psf, "11", &h->nb_streams, &h->nb_coupled) ; + + if (h->nb_streams < 1 || + h->nb_coupled > h->nb_streams || + h->nb_coupled + h->nb_streams > 255) + return SFE_MALFORMED_FILE ; + + for (i = 0 ; i < h->channels ; i++) + { count += psf_binheader_readf (psf, "1", &(h->stream_map [i])) ; + if (h->stream_map [i] > h->nb_streams + h->nb_coupled && h->stream_map [i] != 255) + return SFE_MALFORMED_FILE ; + } ; + } ; + + if (count != opacket->bytes) + { /* OggOpus spec mandates that this is a hard error. */ + psf_log_printf (psf, "Opus : Error, extra data in Ogg Opus header.\n") ; + return SFE_MALFORMED_FILE ; + } ; + + opus_print_header (psf, h) ; + + return 0 ; +} /* ogg_opus_read_header_packet */ + +static int +ogg_opus_read_header (SF_PRIVATE *psf) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + int error ; + + /* + ** First page is already loaded by the ogg container code when it + ** classified the stream, no need to re-load it now. + */ + + if (ogg_page_packets (&odata->opage) != 1 || !ogg_page_bos (&odata->opage)) + return SFE_MALFORMED_FILE ; + + oopus->serialno = ogg_page_serialno (&odata->opage) ; + if ((error = opus_read_header_packet (psf, &oopus->header, &odata->opacket))) + return error ; + + /* + ** The comment header MUST be next. It is one packet, that packet MUST begin + ** on the second page of the stream, but it MAY span multiple pages. + */ + + while (ogg_stream_packetout (&odata->ostream, &odata->opacket) != 1) + { if (ogg_stream_next_page (psf, odata) != 1) + { /* out of data... technically that's malformed. */ + return psf->error ? psf->error : SFE_MALFORMED_FILE ; + } ; + } ; + + if ((error = vorbiscomment_read_tags (psf, &odata->opacket, &opustags_ident))) + return error ; + + return ogg_opus_setup_decoder (psf, oopus->header.input_samplerate) ; +} /* ogg_opus_read_header */ + +static int +ogg_opus_setup_decoder (SF_PRIVATE *psf, int input_samplerate) +{ OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + OpusMSDecoder *decoder ; + int sr_factor ; + int error ; + + /* + ** Decide what sample rate to decode at. We choose the lowest valid rate + ** that is greater or equal to the original rate. + ** + ** Opus documentation recommends always decoding at 48000Hz if the file is + ** being decoded for playback, since most hardware will resample it back to + ** 48000Hz anyways. We don't know if that's true, maybe the user is + ** decoding for editing or transcoding purposes. + */ + if (input_samplerate > 24000) + sr_factor = 1 ; + else if (input_samplerate > 16000) + sr_factor = 2 ; + else if (input_samplerate > 12000) + sr_factor = 3 ; + else if (input_samplerate > 8000) + sr_factor = 4 ; + else + sr_factor = 6 ; + + decoder = opus_multistream_decoder_create ( + 48000 / sr_factor, + oopus->header.channels, + oopus->header.nb_streams, + oopus->header.nb_coupled, + oopus->header.stream_map, + &error) ; + + if (error != OPUS_OK) + { psf_log_printf (psf, "Opus : Failed to create multistream decoder: %s\n", + opus_strerror (error)) ; + return SFE_INTERNAL ; + } + + /* + ** Replace the decoder, if one was already initialized (see + ** SFC_GET_ORIGINAL_SAMPLERATE) + */ + if (oopus->u.decode.state) + opus_multistream_decoder_destroy (oopus->u.decode.state) ; + oopus->u.decode.state = decoder ; + + oopus->sr_factor = sr_factor ; + psf->sf.samplerate = 48000 / sr_factor ; + psf->sf.channels = oopus->header.channels ; + oopus->loc = oopus->len = 0 ; + + /* + ** The Opus decoder can do our gain for us. The OggOpus header contains a + ** gain field. This field, unlike various gain-related tags, is intended to + ** be a perminent baked-in gain applied before any user-configurable gain + ** (eg replay-gain.) This is so the gain of track can be set without having + ** to re-encode. + ** + ** Both the header.gain field and the parameter are in the Q7.8 format. + ** + ** TODO: Make this configurable? Include other gain sources too? + */ + opus_multistream_decoder_ctl (oopus->u.decode.state, OPUS_SET_GAIN (oopus->header.gain)) ; + + /* + ** Opus packets can vary in length, with the legal values being 2.5, 5, 10, + ** 20, 40 or 60ms. The recommended default for non-realtime is 20ms. As + ** such, allocate a buffer of that size now, we'll realloc later if a + ** larger one is needed. + ** + ** buffersize is expressed in samples/channel, as that is what opus_decode + ** expects. + */ + if (oopus->buffer) + { free (oopus->buffer) ; + oopus->buffer = NULL ; + } ; + oopus->buffersize = 20 * psf->sf.samplerate / 1000 ; + oopus->buffer = malloc (sizeof (float) * psf->sf.channels * oopus->buffersize) ; + if (oopus->buffer == NULL) + return SFE_MALLOC_FAILED ; + + return 0 ; +} /* ogg_opus_setup_decoder */ + +static int +ogg_opus_setup_encoder (SF_PRIVATE *psf, OGG_PRIVATE *odata, OPUS_PRIVATE *oopus) +{ int error ; + int lookahead ; + int nb_streams ; + int nb_coupled ; + + /* default page latency value (1000ms) */ + oopus->u.encode.latency = 1000 * 48 ; + + switch (psf->sf.samplerate) + { case 8000 : + case 12000 : + case 16000 : + case 24000 : + case 48000 : + oopus->sr_factor = 48000 / psf->sf.samplerate ; + break ; + default : + return SFE_OPUS_BAD_SAMPLERATE ; + } ; + + if (psf->sf.channels <= 2) + { oopus->header.channel_mapping = 0 ; + nb_streams = 1 ; + nb_coupled = psf->sf.channels - 1 ; + oopus->header.stream_map [0] = 0 ; + oopus->header.stream_map [1] = 1 ; + + oopus->u.encode.state = opus_multistream_encoder_create ( + psf->sf.samplerate, + psf->sf.channels, + nb_streams, + nb_coupled, + oopus->header.stream_map, + OPUS_APPLICATION_AUDIO, + &error) ; + } + else + { if (psf->sf.channels <= 8) + { /* Use Vorbis/AC3 channel mappings for surround. */ + oopus->header.channel_mapping = 1 ; + } + else + { /* There is no channel mapping, just audio, in parallel, good luck */ + oopus->header.channel_mapping = 255 ; + } + + oopus->u.encode.state = opus_multistream_surround_encoder_create ( + psf->sf.samplerate, + psf->sf.channels, + oopus->header.channel_mapping, + &nb_streams, + &nb_coupled, + oopus->header.stream_map, + OPUS_APPLICATION_AUDIO, + &error) ; + + } + + if (error != OPUS_OK) + { psf_log_printf (psf, "Opus : Error, opus_multistream_encoder_create returned %s\n", opus_strerror (error)) ; + return SFE_BAD_OPEN_FORMAT ; + } ; + oopus->header.nb_streams = nb_streams ; + oopus->header.nb_coupled = nb_coupled ; + + opus_multistream_encoder_ctl (oopus->u.encode.state, OPUS_GET_BITRATE (&oopus->u.encode.bitrate)) ; + psf_log_printf (psf, "Encoding at target bitrate of %dbps\n", oopus->u.encode.bitrate) ; + + /* TODO: Make configurable? */ + error = opus_multistream_encoder_ctl (oopus->u.encode.state, OPUS_SET_COMPLEXITY (10)) ; + if (error != OPUS_OK) + { /* Non-fatal */ + psf_log_printf (psf, "Opus : OPUS_SET_COMPLEXITY returned: %s\n", opus_strerror (error)) ; + } + + /* + ** Get the encoder delay. This can vary depending on implementation and + ** encoder configuration. + ** GOTCHA: This returns the preskip at the encoder samplerate, not the + ** granulepos rate of 48000Hz needed for header.preskip. + */ + error = opus_multistream_encoder_ctl (oopus->u.encode.state, OPUS_GET_LOOKAHEAD (&lookahead)) ; + if (error != OPUS_OK) + { psf_log_printf (psf, "Opus : OPUS_GET_LOOKAHEAD returned: %s\n", opus_strerror (error)) ; + return SFE_BAD_OPEN_FORMAT ; + } ; + oopus->header.preskip = lookahead * oopus->sr_factor ; + + oopus->len = OGG_OPUS_ENCODE_PACKET_LEN (psf->sf.samplerate) ; + oopus->buffer = malloc (sizeof (float) * psf->sf.channels * oopus->len) ; + if (oopus->buffer == NULL) + return SFE_MALLOC_FAILED ; + + /* + ** Set up the resident ogg packet structure, ready for writing into. + ** 1275 * 3 + 7 bytes of packet per stream is from opusenc from opus-tools + */ + ogg_packet_clear (&odata->opacket) ; + oopus->buffersize = (1275 * 3 + 7) * oopus->header.nb_streams ; + odata->opacket.packet = malloc (oopus->buffersize) ; + odata->opacket.packetno = 2 ; + if (odata->opacket.packet == NULL) + return SFE_MALLOC_FAILED ; + + oopus->serialno = psf_rand_int32 () ; + ogg_stream_init (&odata->ostream, oopus->serialno) ; + + return 0 ; +} /* ogg_opus_setup_encoder */ + +static int +ogg_opus_write_header (SF_PRIVATE *psf, int UNUSED (calc_length)) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + int nn ; + ogg_packet op ; + + oopus->header.version = 1 ; + oopus->header.channels = psf->sf.channels ; + + /* FIXME: Allow the user to set this ?! */ + oopus->header.gain = 0 ; + + if (psf->dataoffset > 0) + { if (psf->have_written) + { /* + ** Might be possible to deal with this, but it's difficult as we + ** have to take Ogg Page header sizes in to account, not just + ** packet sizes. + */ + return SFE_UNIMPLEMENTED ; + } + if (psf_is_pipe (psf)) + return SFE_NOT_SEEKABLE ; + if (psf_fseek (psf, 0, SEEK_SET) < 0) + return SFE_SEEK_FAILED ; + ogg_stream_reset_serialno (&odata->ostream, oopus->serialno) ; + psf->dataoffset = 0 ; + } + else + opus_print_header (psf, &oopus->header) ; + + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + + /* Opus Header Marker */ + psf_binheader_writef (psf, "eb", BHWv ("OpusHead"), BHWz (8)) ; + + /* Ogg Embedding scheme version, Channel Count, Preskip Samples */ + psf_binheader_writef (psf, "e112", BHW1 (oopus->header.version), BHW1 (psf->sf.channels), BHW2 (oopus->header.preskip)) ; + + /* + ** If an original samplerate has not been set by the user command + ** SFC_SET_ORIGINAL_SAMPLERATE, write the current samplerate. + */ + if (oopus->header.input_samplerate) + psf_binheader_writef (psf, "e4", BHW4 (oopus->header.input_samplerate)) ; + else + psf_binheader_writef (psf, "e4", BHW4 (psf->sf.samplerate)) ; + + /* Input Sample Rate, Gain (S7.8 format), Channel Mapping Type */ + psf_binheader_writef (psf, "e21", BHW2 (oopus->header.gain), BHW1 (oopus->header.channel_mapping)) ; + + /* Channel mappings, required if not using type 0 (mono/stereo) */ + if (oopus->header.channel_mapping > 0) + { psf_binheader_writef (psf, "11", BHW1 (oopus->header.nb_streams), BHW1 (oopus->header.nb_coupled)) ; + for (nn = 0 ; nn < oopus->header.channels ; nn++) + psf_binheader_writef (psf, "1", BHW1 (oopus->header.stream_map [nn])) ; + } ; + + op.packet = psf->header.ptr ; + op.bytes = psf->header.indx ; + op.b_o_s = 1 ; + op.e_o_s = 0 ; + op.granulepos = 0 ; + op.packetno = 1 ; + + /* The first page MUST only contain the header, so flush it out now */ + ogg_stream_packetin (&odata->ostream, &op) ; + for ( ; (nn = ogg_stream_flush (&odata->ostream, &odata->opage)) ; ) + { if (! (nn = ogg_write_page (psf, &odata->opage))) + { psf_log_printf (psf, "Opus : Failed to write header!\n") ; + if (psf->error) + return psf->error ; + return SFE_INTERNAL ; + } ; + psf->dataoffset += nn ; + } + + /* + ** Metadata Tags (manditory) + ** + ** All tags must be in one packet, which may span pages, and these pages + ** must not contain any other packets, so flush. The vendor string should + ** be the libopus library version, as it is doing the actual encoding. We + ** put the libsndfile identifier in the ENCODER tag. + ** + ** See: https://wiki.xiph.org/VorbisComment#ENCODER + */ + vorbiscomment_write_tags (psf, &op, &opustags_ident, opus_get_version_string (), - (OGG_OPUS_COMMENT_PAD)) ; + op.packetno = 2 ; + ogg_stream_packetin (&odata->ostream, &op) ; + for ( ; (nn = ogg_stream_flush (&odata->ostream, &odata->opage)) ; ) + { if (! (nn = ogg_write_page (psf, &odata->opage))) + { psf_log_printf (psf, "Opus : Failed to write comments!\n") ; + if (psf->error) + return psf->error ; + return SFE_INTERNAL ; + } ; + psf->dataoffset += nn ; + } + + return 0 ; +} /* ogg_opus_write_header */ + +static void +ogg_opus_flush (SF_PRIVATE *psf) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + uint64_t last_granulepos ; + int nbytes ; + int len ; + int last_packet ; + + /* + ** Need to flush both samples waiting for a complete packet and samples + ** currently 'inside' the encoder because of its latency. In the case of + ** the latter, we need to encode an equivalent amount of silence to push + ** them out. + ** + ** Note that the last packet's granule position might be less than the + ** total number of samples completed in it. This is how Ogg embedded Opus + ** encodes the amount of appended padding to truncate for gapless playback. + */ + + last_granulepos = oopus->pkt_pos + (oopus->sr_factor * oopus->loc) + oopus->header.preskip ; + last_packet = SF_FALSE ; + memset (&(oopus->buffer [oopus->loc * psf->sf.channels]), 0, sizeof (float) * psf->sf.channels * (oopus->len - oopus->loc)) ; + + for (last_packet = SF_FALSE ; last_packet == SF_FALSE ; ) + { oopus->pkt_pos += oopus->len * oopus->sr_factor ; + if (oopus->pkt_pos >= last_granulepos) + { last_packet = SF_TRUE ; + /* + ** Try to shorten the last packet to the smallest valid packet size + ** to minimize padding samples. + */ + len = (oopus->len * oopus->sr_factor) - (oopus->pkt_pos - last_granulepos) ; + if (len <= 120) /* 2.5 ms */ + len = 120 / oopus->sr_factor ; + else if (len <= 240) /* 5 ms */ + len = 240 / oopus->sr_factor ; + else if (len <= 480) /* 10 ms */ + len = 480 / oopus->sr_factor ; + else + len = oopus->len ; + } + else + len = oopus->len ; + + nbytes = opus_multistream_encode_float (oopus->u.encode.state, oopus->buffer, + len, odata->opacket.packet, oopus->buffersize) ; + + if (nbytes < 0) + { psf_log_printf (psf, "Opus : opus_multistream_encode_float returned: %s\n", opus_strerror (nbytes)) ; + break ; + } + + odata->opacket.bytes = nbytes ; + odata->opacket.packetno++ ; + if (last_packet) + { odata->opacket.granulepos = (ogg_int64_t) last_granulepos ; + odata->opacket.e_o_s = 1 ; + } + else + odata->opacket.granulepos = (ogg_int64_t) oopus->pkt_pos ; + + ogg_stream_packetin (&odata->ostream, &odata->opacket) ; + while (ogg_stream_pageout (&odata->ostream, &odata->opage)) + ogg_write_page (psf, &odata->opage) ; + } ; + + while (ogg_stream_flush (&odata->ostream, &odata->opage)) + ogg_write_page (psf, &odata->opage) ; +} /* ogg_opus_flush */ + +static int +ogg_opus_calculate_page_duration (OGG_PRIVATE *odata) +{ int i, samples, duration ; + ogg_packet *ppkt ; + + duration = 0 ; + for (i = 0 , ppkt = odata->pkt ; i < odata->pkt_len ; i++, ppkt++) + { /* Use 48kHz to get the sample count for use with granule positions. */ + samples = opus_packet_get_nb_samples (ppkt->packet, ppkt->bytes, 48000) ; + if (samples > 0) + duration += samples ; + } ; + return duration ; +} /* ogg_opus_calculate_page_duration */ + +static int +ogg_opus_unpack_next_page (SF_PRIVATE *psf, OGG_PRIVATE *odata, OPUS_PRIVATE *oopus) +{ int nn ; + + nn = ogg_stream_unpack_page (psf, odata) ; + + if (nn == 1) + { oopus->pkt_pos = oopus->pg_pos ; + oopus->pg_pos = odata->pkt [odata->pkt_len - 1].granulepos ; + } + else if (nn == 2) + { uint64_t gp, last_page ; + + /* Found a hole. Need to recalculated pkt_pos from pg_pos */ + last_page = oopus->pg_pos ; + oopus->pg_pos = odata->pkt [odata->pkt_len - 1].granulepos ; + gp = ogg_opus_calculate_page_duration (odata) ; + oopus->pkt_pos = oopus->pg_pos - gp ; + psf_log_printf (psf, "Opus : Hole found appears to be of length %d samples.\n", + (oopus->pkt_pos - last_page) / oopus->sr_factor) ; + /* + ** Could save the hole size here, and have ogg_opus_read_refill() + ** do packet loss concealment until the hole is gone, but libopus does + ** PLC by generating white-noise for the duration of the hole. That is + ** the correct thing for use in telephony, but it isn't generally + ** appropriate here. It actually sounds better with no PLC, as the + ** lapped nature of full-width Opus means the two edges of the hole + ** will be blended together. + */ + return 1 ; + } + + return nn ; +} /* ogg_opus_unpack_next_page */ + +static int +ogg_opus_read_refill (SF_PRIVATE *psf, OGG_PRIVATE *odata, OPUS_PRIVATE *oopus) +{ uint64_t pkt_granulepos ; + int nn, nsamp ; + ogg_packet *ppkt ; + + if (odata->pkt_indx == odata->pkt_len) + { nn = ogg_opus_unpack_next_page (psf, odata, oopus) ; + if (nn <= 0) + return nn ; + } + + if (odata->pkt_indx == odata->pkt_len) + return 0 ; + + ppkt = odata->pkt + odata->pkt_indx ; + nsamp = opus_multistream_decode_float (oopus->u.decode.state, + ppkt->packet, ppkt->bytes, oopus->buffer, oopus->buffersize, 0) ; + + if (nsamp == OPUS_BUFFER_TOO_SMALL) + { nsamp = opus_packet_get_nb_samples (ppkt->packet, ppkt->bytes, psf->sf.samplerate) ; + psf_log_printf (psf, "Growing decode buffer to hold %d samples from %d\n", + nsamp, oopus->buffersize) ; + if (nsamp > 5760) + { psf_log_printf (psf, "Packet is larger than maximum allowable of 120ms!? Skipping.\n") ; + return 0 ; + } ; + oopus->buffersize = nsamp ; + + free (oopus->buffer) ; + oopus->buffer = NULL ; + oopus->buffer = malloc (sizeof (float) * oopus->buffersize * psf->sf.channels) ; + if (oopus->buffer == NULL) + { psf->error = SFE_MALLOC_FAILED ; + oopus->buffersize = 0 ; + return -1 ; + } ; + + nsamp = opus_multistream_decode_float (oopus->u.decode.state, + ppkt->packet, ppkt->bytes, oopus->buffer, oopus->buffersize, 0) ; + } ; + odata->pkt_indx ++ ; + + if (nsamp < 0) + { psf_log_printf (psf, "Opus : opus_multistream_decode returned: %s\n", + opus_strerror (nsamp)) ; + psf->error = SFE_INTERNAL ; + return nsamp ; + } ; + + /* + ** Check for if this decoded packet is the last of the stream, in + ** which case a page granule position which is shorter than the + ** sample count of all packets in the page indicates that the last + ** samples are padding and should be dropped. + */ + pkt_granulepos = oopus->pkt_pos + (nsamp * oopus->sr_factor) ; + if (pkt_granulepos <= oopus->pg_pos) + { oopus->len = nsamp ; + } + else + { if (ogg_page_eos (&odata->opage)) + { /* + ** Possible for pg_pos < pkt_pos if there is a trailing + ** packet. It's not supposed to happen, but could. + */ + oopus->len = SF_MAX ((int) (oopus->pg_pos - oopus->pkt_pos) / oopus->sr_factor, 0) ; + } + else + { /* + ** From https://wiki.xiph.org/OggOpus#Granule_Position + ** A decoder MUST reject as invalid any stream where the granule + ** position is smaller than the number of samples contained in + ** packets that complete on the first page with a completed + ** packet, unless that page has the 'end of stream' flag set. It + ** MAY defer this action until it decodes the last packet + ** completed on that page. + */ + psf_log_printf (psf, "Opus : Mid-strem page's granule position %d is less than total samples of %d\n", oopus->pg_pos, pkt_granulepos) ; + psf->error = SFE_MALFORMED_FILE ; + return -1 ; + } ; + } ; + + if (oopus->len > oopus->buffersize) + { free (oopus->buffer) ; + oopus->buffersize = oopus->len ; + oopus->buffer = malloc (sizeof (float) * oopus->buffersize * psf->sf.channels) ; + if (oopus->buffer == NULL) + { psf->error = SFE_MALLOC_FAILED ; + oopus->buffersize = 0 ; + return -1 ; + } ; + } ; + + /* + ** Check for if this decoded packet contains samples from before the pre- + ** skip point, indicating that these samples are padding to get the decoder + ** to converge and should be dropped. + */ + if (oopus->pkt_pos < (unsigned) oopus->header.preskip) + oopus->loc = SF_MIN ((oopus->header.preskip - (int) oopus->pkt_pos) / oopus->sr_factor, oopus->len) ; + else + oopus->loc = 0 ; + + oopus->pkt_pos = pkt_granulepos ; + + return nsamp ; +} /* ogg_opus_read_refill */ + +static int +ogg_opus_write_out (SF_PRIVATE *psf, OGG_PRIVATE *odata, OPUS_PRIVATE *oopus) +{ int nbytes ; + + if (oopus->u.encode.lsb != oopus->u.encode.lsb_last) + opus_multistream_encoder_ctl (oopus->u.encode.state, OPUS_SET_LSB_DEPTH (oopus->u.encode.lsb)) ; + + nbytes = opus_multistream_encode_float (oopus->u.encode.state, + oopus->buffer, oopus->len, + odata->opacket.packet, oopus->buffersize) ; + + if (nbytes < 0) + { psf_log_printf (psf, "Opus : Error, opus_multistream_encode_float returned: %s\n", opus_strerror (nbytes)) ; + psf->error = SFE_INTERNAL ; + return nbytes ; + } ; + + oopus->u.encode.last_segments += (nbytes + 255) / 255 ; + oopus->pkt_pos += oopus->len * oopus->sr_factor ; + odata->opacket.bytes = nbytes ; + odata->opacket.granulepos = oopus->pkt_pos ; + odata->opacket.packetno++ ; + + /* + ** Decide whether to flush the Ogg page *before* adding the new packet to + ** it. Check both for if there is more than 1 second of audio (our default + ** Ogg page latency, this latency can be modified using sf_command()) + ** or if adding the packet would cause a continued page, + ** in which case we might as well make a new page anyways. + */ + for ( ; ; ) + { if (oopus->pkt_pos - oopus->pg_pos >= oopus->u.encode.latency || oopus->u.encode.last_segments >= 255) + nbytes = ogg_stream_flush_fill (&odata->ostream, &odata->opage, 255 * 255) ; + else + nbytes = ogg_stream_pageout_fill (&odata->ostream, &odata->opage, 255 * 255) ; + if (nbytes > 0) + { /* + ** LibOgg documentation is noted as being bad by it's author. Ogg + ** page header byte 26 is the segment count. + */ + oopus->u.encode.last_segments -= odata->opage.header [26] ; + oopus->pg_pos = oopus->pkt_pos ; + ogg_write_page (psf, &odata->opage) ; + } + else + break ; + } ; + + ogg_stream_packetin (&odata->ostream, &odata->opacket) ; + oopus->loc = 0 ; + oopus->u.encode.lsb_last = oopus->u.encode.lsb ; + oopus->u.encode.lsb = 0 ; + + return 1 ; +} /* ogg_opus_write_out */ + +static sf_count_t +ogg_opus_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + sf_count_t total = 0 ; + sf_count_t readlen, i ; + float *iptr ; + + while (total < len) + { if (oopus->loc == oopus->len) + { if (ogg_opus_read_refill (psf, odata, oopus) <= 0) + return total ; + } ; + + readlen = SF_MIN (len - total, (sf_count_t) (oopus->len - oopus->loc) * psf->sf.channels) ; + if (readlen > 0) + { iptr = oopus->buffer + oopus->loc * psf->sf.channels ; + i = total ; + total += readlen ; + + if (psf->float_int_mult) + { float inverse = 1.0 / psf->float_max ; + for ( ; i < total ; i++) + { ptr [i] = psf_lrintf (((*(iptr++)) * inverse) * 32767.0f) ; + } ; + } + else + { for ( ; i < total ; i++) + { ptr [i] = psf_lrintf ((*(iptr++)) * 32767.0f) ; + } ; + } ; + oopus->loc += (readlen / psf->sf.channels) ; + } ; + } ; + return total ; +} /* ogg_opus_read_s */ + +static sf_count_t +ogg_opus_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + sf_count_t total = 0 ; + sf_count_t readlen, i ; + float *iptr ; + + while (total < len) + { if (oopus->loc == oopus->len) + { if (ogg_opus_read_refill (psf, odata, oopus) <= 0) + return total ; + } ; + + readlen = SF_MIN (len - total, (sf_count_t) (oopus->len - oopus->loc) * psf->sf.channels) ; + if (readlen > 0) + { iptr = oopus->buffer + oopus->loc * psf->sf.channels ; + i = total ; + total += readlen ; + + if (psf->float_int_mult) + { float inverse = 1.0 / psf->float_max ; + for ( ; i < total ; i++) + { ptr [i] = psf_lrintf (((*(iptr++)) * inverse) * 2147483647.0f) ; + } + } + else + { for ( ; i < total ; i++) + { ptr [i] = psf_lrintf ((*(iptr++)) * 2147483647.0f) ; + } + } ; + oopus->loc += (readlen / psf->sf.channels) ; + } ; + } ; + return total ; +} /* ogg_opus_read_i */ + +static sf_count_t +ogg_opus_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + sf_count_t total = 0 ; + sf_count_t readlen ; + + while (total < len) + { if (oopus->loc == oopus->len) + { if (ogg_opus_read_refill (psf, odata, oopus) <= 0) + return total ; + } ; + + readlen = SF_MIN (len - total, (sf_count_t) (oopus->len - oopus->loc) * psf->sf.channels) ; + if (readlen > 0) + { memcpy (&(ptr [total]), &(oopus->buffer [oopus->loc * psf->sf.channels]), sizeof (float) * readlen) ; + total += readlen ; + oopus->loc += (readlen / psf->sf.channels) ; + } ; + } ; + return total ; +} /* ogg_opus_read_f */ + +static sf_count_t +ogg_opus_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + sf_count_t total = 0 ; + sf_count_t readlen, i ; + float *fptr ; + + while (total < len) + { if (oopus->loc >= oopus->len) + { if (ogg_opus_read_refill (psf, odata, oopus) <= 0) + return total ; + } ; + + readlen = SF_MIN (len - total, (sf_count_t) (oopus->len - oopus->loc) * psf->sf.channels) ; + + if (readlen > 0) + { fptr = oopus->buffer + oopus->loc * psf->sf.channels ; + i = total ; + total += readlen ; + for ( ; i < total ; i++) + { ptr [i] = *fptr++ ; + } ; + oopus->loc += readlen / psf->sf.channels ; + } ; + } ; + return total ; +} /* ogg_opus_read_d */ + +static sf_count_t +ogg_opus_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + sf_count_t total, i ; + int writelen ; + float *optr ; + + if (oopus->u.encode.lsb < 16) + oopus->u.encode.lsb = 16 ; + + for (total = 0 ; total < len ; ) + { if (oopus->loc >= oopus->len) + { /* Need to encode the buffer */ + if (ogg_opus_write_out (psf, odata, oopus) <= 0) + return total ; + } ; + + writelen = SF_MIN (len - total, (sf_count_t) (oopus->len - oopus->loc) * psf->sf.channels) ; + if (writelen) + { optr = oopus->buffer + oopus->loc * psf->sf.channels ; + i = total ; + total += writelen ; + for ( ; i < total ; i++) + { *optr++ = (float) (ptr [i]) / 32767.0f ; + } + oopus->loc += (writelen / psf->sf.channels) ; + } ; + } ; + return total ; +} /* ogg_opus_write_s */ + +static sf_count_t +ogg_opus_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + sf_count_t total, i ; + int writelen ; + float *optr ; + + if (oopus->u.encode.lsb < 24) + oopus->u.encode.lsb = 24 ; + + for (total = 0 ; total < len ; ) + { if (oopus->loc >= oopus->len) + { /* Need to encode the buffer */ + if (ogg_opus_write_out (psf, odata, oopus) <= 0) + return total ; + } ; + + writelen = SF_MIN (len - total, (sf_count_t) (oopus->len - oopus->loc) * psf->sf.channels) ; + if (writelen) + { optr = oopus->buffer + oopus->loc * psf->sf.channels ; + i = total ; + total += writelen ; + for ( ; i < total ; i++) + { *optr++ = (float) (ptr [i]) / 2147483647.0f ; + } ; + oopus->loc += (writelen / psf->sf.channels) ; + } ; + } ; + return total ; +} /* ogg_opus_write_i */ + +static sf_count_t +ogg_opus_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + sf_count_t total ; + int writelen ; + + if (oopus->u.encode.lsb < 24) + oopus->u.encode.lsb = 24 ; + + for (total = 0 ; total < len ; ) + { if (oopus->loc >= oopus->len) + { /* Need to encode the buffer */ + if (ogg_opus_write_out (psf, odata, oopus) <= 0) + return total ; + } ; + + writelen = SF_MIN (len - total, (sf_count_t) (oopus->len - oopus->loc) * psf->sf.channels) ; + if (writelen) + { memcpy (&(oopus->buffer [oopus->loc * psf->sf.channels]), &(ptr [total]), sizeof (float) * writelen) ; + total += writelen ; + oopus->loc += (writelen / psf->sf.channels) ; + } ; + } ; + return total ; +} /* ogg_opus_write_f */ + +static sf_count_t +ogg_opus_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + sf_count_t total, i ; + int writelen ; + float *optr ; + + if (oopus->u.encode.lsb < 24) + oopus->u.encode.lsb = 24 ; + + for (total = 0 ; total < len ; ) + { if (oopus->loc >= oopus->len) + { /* Need to encode the buffer */ + if (ogg_opus_write_out (psf, odata, oopus) <= 0) + return total ; + } ; + + writelen = SF_MIN (len - total, (sf_count_t) (oopus->len - oopus->loc) * psf->sf.channels) ; + if (writelen) + { optr = oopus->buffer + oopus->loc * psf->sf.channels ; + i = total ; + total += writelen ; + for ( ; i < total ; i++) + { *optr++ = (float) (ptr [i]) ; + } ; + oopus->loc += (writelen / psf->sf.channels) ; + } ; + } ; + return total ; +} /* ogg_opus_write_d */ + +static int +ogg_opus_analyze_file (SF_PRIVATE *psf) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + uint64_t gp ; + sf_count_t saved_offset, last_page ; + int error ; + + psf->sf.sections = 1 ; + psf->sf.frames = SF_COUNT_MAX ; + oopus->u.decode.gp_end = (uint64_t) -1 ; + oopus->u.decode.last_offset = SF_COUNT_MAX ; + + psf->dataoffset = ogg_sync_ftell (psf) ; + if (psf->filelength != SF_COUNT_MAX) + psf->datalength = psf->filelength - psf->dataoffset ; + else + psf->datalength = SF_COUNT_MAX ; + + /* + ** Calculate the start granule position offset + ** + ** OggOpus streams are allowed to start with a granule position other than + ** zero. This allows for cutting the beginning off of streams without + ** having to modify all following granule positions, or for recording/ + ** joining a live stream in the middle. To figure out the offset, we need + ** to sum up how many samples are in all the packets that complete in the + ** page and subtract it from the page granule position. + ** + ** If this is the last page of the steam (EOS set), this is not possible, + ** as the granule position may be /less/ than the number of samples, to + ** indicate how many samples are end-padding. In this case the granule + ** position offset of the file must be 0, as otherwise it is considered + ** malformed. + */ + error = ogg_opus_unpack_next_page (psf, odata, oopus) ; + if (error < 0 && psf->error) + return psf->error ; + + gp = ogg_opus_calculate_page_duration (odata) ; + if (gp <= 0) + { psf_log_printf (psf, "Opus : Page duration of zero!\n") ; + return SFE_MALFORMED_FILE ; + } ; + + if (!ogg_page_eos (&odata->opage)) + { if (gp > oopus->pg_pos) + { psf_log_printf (psf, "Opus : First data page's granule position is less than total number of samples on the page!\n") ; + return SFE_MALFORMED_FILE ; + } + oopus->pkt_pos = oopus->pg_pos - gp ; + } + else if (gp < oopus->pg_pos) + { psf_log_printf (psf, "Opus : First data page is also the last, and granule position has an (ambigious) offset.\n") ; + return SFE_MALFORMED_FILE ; + } ; + oopus->u.decode.gp_start = oopus->pkt_pos ; + + if (!psf->sf.seekable) + return 0 ; + + /* + ** Find the last page and fetch the last granule position. + ** First, save were we are now. + */ + saved_offset = ogg_sync_ftell (psf) ; + + /* This uses the sync page buffer, the stream page buffer is untouched. */ + last_page = ogg_sync_last_page_before (psf, odata, &oopus->u.decode.gp_end, psf->filelength, oopus->serialno) ; + if (last_page > 0) + { if (!ogg_page_eos (&odata->opage)) + psf_log_printf (psf, "Ogg : Last page lacks an end-of-stream bit.\n") ; + if (last_page + odata->opage.header_len + odata->opage.body_len < psf->filelength) + psf_log_printf (psf, "Ogg : Junk after the last page.\n") ; + oopus->u.decode.last_offset = last_page ; + + if (oopus->u.decode.gp_end != (uint64_t) -1) + { psf->sf.frames = (oopus->u.decode.gp_end - oopus->u.decode.gp_start + - oopus->header.preskip) / oopus->sr_factor ; + } ; + } + + /* Go back to where we left off. */ + ogg_sync_fseek (psf, saved_offset, SEEK_SET) ; + return 0 ; +} /* ogg_opus_analyze_file */ + +/* +** ogg_opus_seek_null_read +** +** Decode samples, doing nothing with them, until the desired granule position +** is reached. +*/ +static sf_count_t +ogg_opus_seek_null_read (SF_PRIVATE *psf, sf_count_t offset) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + sf_count_t total ; + sf_count_t readlen ; + + total = oopus->pkt_pos / oopus->sr_factor ; + total += oopus->loc ; + + for ( ; total < offset ; ) + { if (oopus->loc == oopus->len) + { if (ogg_opus_read_refill (psf, odata, oopus) <= 0) + return total ; + /* + ** Ignore pre-skip skipping. The preskip was accounted for in the + ** arugment to offset, so we need to count it. + */ + oopus->loc = 0 ; + } ; + + readlen = SF_MIN ((int) (offset - total), (oopus->len - oopus->loc)) ; + if (readlen > 0) + { total += readlen ; + oopus->loc += readlen ; + } ; + } ; + return total ; +} /* ogg_opus_seek_null_read */ + +/* +** Search within the file for the page with the highest granule position at or +** before our target. +*/ +static int +ogg_opus_seek_page_search (SF_PRIVATE *psf, uint64_t target_gp) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + uint64_t pcm_start ; + uint64_t pcm_end ; + uint64_t best_gp ; + sf_count_t begin ; + sf_count_t end ; + int ret ; + + best_gp = pcm_start = oopus->u.decode.gp_start ; + pcm_end = oopus->u.decode.gp_end ; + begin = psf->dataoffset ; + + /* Adjust the target to give time to converge. */ + if (target_gp >= OGG_OPUS_PREROLL) + target_gp -= OGG_OPUS_PREROLL ; + if (target_gp < pcm_start) + target_gp = pcm_start ; + + /* Seek to beginning special case */ + if (target_gp < pcm_start + (uint64_t) oopus->header.preskip) + end = begin ; + else + end = oopus->u.decode.last_offset ; + + ogg_stream_seek_page_search (psf, odata, target_gp, pcm_start, pcm_end, &best_gp, begin, end) ; + + oopus->loc = 0 ; + oopus->len = 0 ; + if ((ret = ogg_opus_unpack_next_page (psf, odata, oopus)) != 1) + return ret ; + oopus->pkt_pos = best_gp ; + opus_multistream_decoder_ctl (oopus->u.decode.state, OPUS_RESET_STATE) ; + /* Gain decoder settings survive resets. */ + + return 0 ; +} /* ogg_opus_seek_page_search */ + +static sf_count_t +ogg_opus_seek_manual (SF_PRIVATE *psf, uint64_t target_gp) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + sf_count_t pos ; + int nn ; + + if (target_gp > OGG_OPUS_PREROLL) + target_gp -= OGG_OPUS_PREROLL ; + if (target_gp < oopus->pg_pos) + target_gp = oopus->pg_pos ; + + if (oopus->pg_pos > target_gp) + { ogg_stream_reset (&odata->ostream) ; + pos = ogg_sync_fseek (psf, psf->dataoffset, SEEK_SET) ; + if (pos < 0) + return pos ; + oopus->pg_pos = oopus->u.decode.gp_start ; + opus_multistream_decoder_ctl (oopus->u.decode.state, OPUS_RESET_STATE) ; + } ; + + while (oopus->pg_pos < target_gp) + { nn = ogg_opus_unpack_next_page (psf, odata, oopus) ; + if (nn <= 0) + return nn ; + } ; + + return 1 ; +} /* ogg_opus_seek_manual */ + +static sf_count_t +ogg_opus_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) +{ OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + uint64_t target_gp ; + uint64_t current ; + int ret ; + + /* Only support seeking in read mode. */ + if (mode != SFM_READ || psf->file.mode != SFM_READ) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + current = oopus->pkt_pos + oopus->loc * oopus->sr_factor ; + /* + ** Remember, there are preskip granulepos worth of samples at the front of + ** the stream which are bunk. Also, granule positions can be offset. + */ + target_gp = offset * oopus->sr_factor + oopus->u.decode.gp_start + oopus->header.preskip ; + + if (oopus->u.decode.gp_end == (uint64_t) -1) + { /* + ** Don't know the end of the file. Could be a chained file we don't yet + ** support. Oh well, just do it manually. + */ + ogg_opus_seek_manual (psf, target_gp) ; + } + else + { /* + ** Avoid seeking in the file if where we want is just ahead or exactly + ** were we are. To avoid needing to flush the decoder we choose pre- + ** roll plus 10ms. + */ + if (target_gp < current || target_gp - current > OGG_OPUS_PREROLL + 10 * 48) + { ret = ogg_opus_seek_page_search (psf, target_gp) ; + if (ret < 0) + { /* + ** Page seek failed, what to do? Could be bad data. We can + ** either fall-back to manual seeking or bail. Manaul seeking + ** from the beginning has the advantage of finding where the + ** file goes bad. + */ + ret = ogg_opus_seek_manual (psf, target_gp) ; + if (ret < 0) + { /* + ** If were here, and there is no error, we can be pretty + ** sure that it's the file that is to blame. + */ + if (!psf->error) + psf->error = SFE_MALFORMED_FILE ; + return ret ; + } ; + } ; + } ; + } ; + + /* + ** We've seeked or skipped through pages until just before our target, + ** now decode until we hit it. + */ + offset = ogg_opus_seek_null_read (psf, target_gp / oopus->sr_factor) ; + return offset - ((oopus->header.preskip + oopus->u.decode.gp_start) / oopus->sr_factor) ; + +} /* ogg_opus_seek */ + +static int +ogg_opus_command (SF_PRIVATE *psf, int command, void *data, int datasize) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + double quality ; + double latency ; + int error ; + + switch (command) + { case SFC_SET_CHANNEL_MAP_INFO : + /* TODO: figure this out */ + break ; + + case SFC_SET_OGG_PAGE_LATENCY : + /* + ** Argument: double, range 50 to 1600. + ** Average length of OGG page in ms. + ** This length drive the flush of pages. + */ + if (data == NULL || datasize != SIGNED_SIZEOF (double)) + return SFE_BAD_COMMAND_PARAM ; + + latency = *((double *) data) ; + if (latency < 50) + latency = 50 ; + + if (latency > 1600) + latency = 1600 ; + + oopus->u.encode.latency = ((unsigned long) latency) * 48 ; + break ; + + case SFC_SET_COMPRESSION_LEVEL : + /* + ** Argument: double, range 0.0 (lest compressed, best quality) to + ** 1.0 (most compressed, worst quality) + */ + if (data == NULL || datasize != SIGNED_SIZEOF (double)) + return SFE_BAD_COMMAND_PARAM ; + + /* Usable bitrate range is [6, 256] kbps per channel. */ + quality = *((double *) data) ; + oopus->u.encode.bitrate = (int) (((1.0 - quality) * (250000.0)) + 6000.0) * psf->sf.channels ; + if (opus_multistream_encoder_ctl (oopus->u.encode.state, OPUS_SET_BITRATE (oopus->u.encode.bitrate)) == OPUS_OK) + { psf_log_printf (psf, "User changed encoding target bitrate to %dbps\n", oopus->u.encode.bitrate) ; + return SF_TRUE ; + } + psf_log_printf (psf, "Failed to set user encoding target bitrate of %dbps\n", oopus->u.encode.bitrate) ; + return SF_FALSE ; + break ; + + case SFC_SET_ORIGINAL_SAMPLERATE : + if (data == NULL || datasize != SIGNED_SIZEOF (int)) + return SFE_BAD_COMMAND_PARAM ; + /* + ** Only allow changing the input samplerate if at the beginning + ** of the stream, because while it might be possible to change + ** samplerate mid-decode, or to re-write the header for encode, + ** ain't nobody got time to implement and test that. + */ + if (psf->file.mode == SFM_WRITE) + { if (psf->have_written) + return SF_FALSE ; + oopus->header.input_samplerate = *((int *) data) ; + } + else { + if (oopus->pkt_pos > oopus->u.decode.gp_start || oopus->loc > 0) + return SF_FALSE ; + if ((error = ogg_opus_setup_decoder (psf, *((int *) data)))) + return error ; + odata->pkt_indx = 0 ; + /* Adjust file frames count. */ + if (oopus->u.decode.gp_end != (uint64_t) -1) + psf->sf.frames = (oopus->u.decode.gp_end - oopus->u.decode.gp_start + - oopus->header.preskip) / oopus->sr_factor ; + } ; + return SF_TRUE ; + + case SFC_GET_ORIGINAL_SAMPLERATE : + if (data == NULL || datasize != SIGNED_SIZEOF (int)) + return SFE_BAD_COMMAND_PARAM ; + *((int *) data) = oopus->header.input_samplerate ; + return SF_TRUE ; + + default : + break ; + } + + return SF_FALSE ; +} /* ogg_opus_command */ + +static int +ogg_opus_byterate (SF_PRIVATE *psf) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + OPUS_PRIVATE *oopus = (OPUS_PRIVATE *) psf->codec_data ; + + if (psf->file.mode == SFM_READ) + { if (odata->pkt_indx == odata->pkt_len) + { if (ogg_opus_unpack_next_page (psf, odata, oopus) < 0) + return -1 ; + } ; + + if (odata->pkt_indx < odata->pkt_len) + { ogg_packet *ppkt = &odata->pkt [odata->pkt_indx] ; + return (ppkt->bytes * 8000) / opus_packet_get_nb_samples (ppkt->packet, ppkt->bytes, 8000) ; + } ; + + if (psf->datalength != SF_COUNT_MAX) + return (psf->datalength * psf->sf.samplerate) / psf->sf.frames ; + } ; + + if (psf->file.mode == SFM_WRITE && oopus->u.encode.state != NULL) + return (oopus->u.encode.bitrate + 7) / 8 ; + + return -1 ; +} /* ogg_opus_byterate */ + +#else /* HAVE_EXTERNAL_XIPH_LIBS */ + +int +ogg_opus_open (SF_PRIVATE *psf) +{ + psf_log_printf (psf, "This version of libsndfile was compiled without Ogg/Opus support.\n") ; + return SFE_UNIMPLEMENTED ; +} /* ogg_opus_open */ + +#endif diff --git a/libsndfile-1.0.31/src/ogg_pcm.c b/libsndfile-1.0.31/src/ogg_pcm.c new file mode 100644 index 0000000..f105214 --- /dev/null +++ b/libsndfile-1.0.31/src/ogg_pcm.c @@ -0,0 +1,167 @@ +/* +** Copyright (C) 2008-2016 Erik de Castro Lopo +** +** This program is free software ; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation ; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY ; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + + +#include "sfconfig.h" + +#include +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +#if (ENABLE_EXPERIMENTAL_CODE && HAVE_EXTERNAL_XIPH_LIBS) + +#include + +#include "ogg.h" + +typedef struct +{ int32_t serialno ; + + + void * state ; +} OPCM_PRIVATE ; + +static int opcm_read_header (SF_PRIVATE * psf) ; +static int opcm_close (SF_PRIVATE *psf) ; + +int +ogg_pcm_open (SF_PRIVATE *psf) +{ OGG_PRIVATE* odata = psf->container_data ; + OPCM_PRIVATE* opcm = calloc (1, sizeof (OPCM_PRIVATE)) ; + int error = 0 ; + + if (odata == NULL) + { psf_log_printf (psf, "%s : odata is NULL???\n", __func__) ; + free (opcm) ; + return SFE_INTERNAL ; + } ; + + psf->codec_data = opcm ; + if (opcm == NULL) + return SFE_MALLOC_FAILED ; + + if (psf->file.mode == SFM_RDWR) + return SFE_BAD_MODE_RW ; + + if (psf->file.mode == SFM_READ) + { /* Call this here so it only gets called once, so no memory is leaked. */ + ogg_sync_init (&odata->osync) ; + + if ((error = opcm_read_header (psf))) + return error ; + +#if 0 + psf->read_short = opcm_read_s ; + psf->read_int = opcm_read_i ; + psf->read_float = opcm_read_f ; + psf->read_double = opcm_read_d ; + psf->sf.frames = opcm_length (psf) ; +#endif + } ; + + psf->codec_close = opcm_close ; + + if (psf->file.mode == SFM_WRITE) + { +#if 0 + /* Set the default opcm quality here. */ + vdata->quality = 0.4 ; + + psf->write_header = opcm_write_header ; + psf->write_short = opcm_write_s ; + psf->write_int = opcm_write_i ; + psf->write_float = opcm_write_f ; + psf->write_double = opcm_write_d ; +#endif + + psf->sf.frames = SF_COUNT_MAX ; /* Unknown really */ + psf->strings.flags = SF_STR_ALLOW_START ; + } ; + + psf->bytewidth = 1 ; + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + +#if 0 + psf->seek = opcm_seek ; + psf->command = opcm_command ; +#endif + + /* FIXME, FIXME, FIXME : Hack these here for now and correct later. */ + psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_SPEEX ; + psf->sf.sections = 1 ; + + psf->datalength = 1 ; + psf->dataoffset = 0 ; + /* End FIXME. */ + + return error ; +} /* ogg_pcm_open */ + +static int +opcm_read_header (SF_PRIVATE * UNUSED (psf)) +{ + return 0 ; +} /* opcm_read_header */ + +static int +opcm_close (SF_PRIVATE * UNUSED (psf)) +{ + + + return 0 ; +} /* opcm_close */ + + + +/* +encoded_speex_frames = (frames_per_packet * Packets) + = 1 * 272 + = 272 + +audio_samples = encoded_speex_frames * frame_size + = 272 * 640 + = 174080 + +duration = audio_samples / rate + = 174080 / 44100 + = 3.947 +*/ + +#else /* ENABLE_EXPERIMENTAL_CODE && HAVE_EXTERNAL_XIPH_LIBS */ + +int +ogg_pcm_open (SF_PRIVATE *psf) +{ + psf_log_printf (psf, "This version of libsndfile was compiled without Ogg/Speex support.\n") ; + return SFE_UNIMPLEMENTED ; +} /* ogg_pcm_open */ + +#endif diff --git a/libsndfile-1.0.31/src/ogg_speex.c b/libsndfile-1.0.31/src/ogg_speex.c new file mode 100644 index 0000000..546cf35 --- /dev/null +++ b/libsndfile-1.0.31/src/ogg_speex.c @@ -0,0 +1,428 @@ +/* +** Copyright (C) 2008-2016 Erik de Castro Lopo +** +** This program is free software ; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation ; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY ; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + + +#include "sfconfig.h" + +#include +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +#if (ENABLE_EXPERIMENTAL_CODE && HAVE_EXTERNAL_XIPH_LIBS) + +#include + +#include +#include +#include +#include + +#include "ogg.h" + +#define OGG_SPX_READ_SIZE 200 + +typedef struct +{ SpeexBits bits ; + + int32_t serialno ; + + int frame_size, granule_frame_size, nframes ; + int force_mode ; + + SpeexStereoState stereo ; + SpeexHeader header ; + + void * state ; +} SPX_PRIVATE ; + +static int spx_read_header (SF_PRIVATE * psf) ; +static int spx_close (SF_PRIVATE *psf) ; +static void *spx_header_read (SF_PRIVATE * psf, ogg_packet *op, spx_int32_t enh_enabled, int force_mode) ; +static void spx_print_comments (const char *comments, int length) ; + +int +ogg_speex_open (SF_PRIVATE *psf) +{ OGG_PRIVATE* odata = psf->container_data ; + SPX_PRIVATE* spx = calloc (1, sizeof (SPX_PRIVATE)) ; + int error = 0 ; + + if (odata == NULL) + { psf_log_printf (psf, "%s : odata is NULL???\n", __func__) ; + free (spx) ; + return SFE_INTERNAL ; + } ; + + psf->codec_data = spx ; + if (spx == NULL) + return SFE_MALLOC_FAILED ; + + if (psf->file.mode == SFM_RDWR) + return SFE_BAD_MODE_RW ; + + if (psf->file.mode == SFM_READ) + { /* Call this here so it only gets called once, so no memory is leaked. */ + ogg_sync_init (&odata->osync) ; + + if ((error = spx_read_header (psf))) + return error ; + +#if 0 + psf->read_short = spx_read_s ; + psf->read_int = spx_read_i ; + psf->read_float = spx_read_f ; + psf->read_double = spx_read_d ; + psf->sf.frames = spx_length (psf) ; +#endif + } ; + + psf->codec_close = spx_close ; + + if (psf->file.mode == SFM_WRITE) + { +#if 0 + /* Set the default spx quality here. */ + vdata->quality = 0.4 ; + + psf->write_header = spx_write_header ; + psf->write_short = spx_write_s ; + psf->write_int = spx_write_i ; + psf->write_float = spx_write_f ; + psf->write_double = spx_write_d ; +#endif + + psf->sf.frames = SF_COUNT_MAX ; /* Unknown really */ + psf->strings.flags = SF_STR_ALLOW_START ; + } ; + + psf->bytewidth = 1 ; + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + +#if 0 + psf->seek = spx_seek ; + psf->command = spx_command ; +#endif + + /* FIXME, FIXME, FIXME : Hack these here for now and correct later. */ + psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_SPEEX ; + psf->sf.sections = 1 ; + + psf->datalength = 1 ; + psf->dataoffset = 0 ; + /* End FIXME. */ + + return error ; +} /* ogg_speex_open */ + +#define le_short (x) (x) + +static int +spx_read_header (SF_PRIVATE * psf) +{ static SpeexStereoState STEREO_INIT = SPEEX_STEREO_STATE_INIT ; + + OGG_PRIVATE* odata = psf->container_data ; + SPX_PRIVATE* spx = psf->codec_data ; + + ogg_int64_t page_granule = 0 ; + int stream_init = 0 ; + int page_nb_packets = 0 ; + int packet_count = 0 ; + int enh_enabled = 1 ; + int force_mode = -1 ; + char * data ; + int nb_read ; + int lookahead ; + +printf ("%s %d\n", __func__, __LINE__) ; + + psf_log_printf (psf, "Speex header\n") ; + odata->eos = 0 ; + + /* Reset ogg stuff which has already been used in src/ogg.c. */ + ogg_stream_reset (&odata->ostream) ; + ogg_sync_reset (&odata->osync) ; + + /* Seek to start of stream. */ + psf_fseek (psf, 0, SEEK_SET) ; + + /* Initialize. */ + ogg_sync_init (&odata->osync) ; + speex_bits_init (&spx->bits) ; + + /* Set defaults. */ + psf->sf.channels = -1 ; + psf->sf.samplerate = 0 ; + spx->stereo = STEREO_INIT ; + + /* Get a pointer to the ogg buffer and read data into it. */ + data = ogg_sync_buffer (&odata->osync, OGG_SPX_READ_SIZE) ; + nb_read = psf_fread (data, 1, OGG_SPX_READ_SIZE, psf) ; + ogg_sync_wrote (&odata->osync, nb_read) ; + + /* Now we chew on Ogg packets. */ + while (ogg_sync_pageout (&odata->osync, &odata->opage) == 1) + { if (stream_init == 0) + { ogg_stream_init (&odata->ostream, ogg_page_serialno (&odata->opage)) ; + stream_init = 1 ; + } ; + + if (ogg_page_serialno (&odata->opage) != odata->ostream.serialno) + { /* so all streams are read. */ + ogg_stream_reset_serialno (&odata->ostream, ogg_page_serialno (&odata->opage)) ; + } ; + + /*Add page to the bitstream*/ + ogg_stream_pagein (&odata->ostream, &odata->opage) ; + page_granule = ogg_page_granulepos (&odata->opage) ; + page_nb_packets = ogg_page_packets (&odata->opage) ; + + /*Extract all available packets*/ + while (odata->eos == 0 && ogg_stream_packetout (&odata->ostream, &odata->opacket) == 1) + { if (odata->opacket.bytes >= 8 && memcmp (odata->opacket.packet, "Speex ", 8) == 0) + { spx->serialno = odata->ostream.serialno ; + } ; + + if (spx->serialno == -1 || odata->ostream.serialno != spx->serialno) + break ; + + if (packet_count == 0) + { spx->state = spx_header_read (psf, &odata->opacket, enh_enabled, force_mode) ; + if (! spx->state) + break ; + + speex_decoder_ctl (spx->state, SPEEX_GET_LOOKAHEAD, &lookahead) ; + if (spx->nframes == 0) + spx->nframes = 1 ; + } + else if (packet_count == 1) + { spx_print_comments ((const char*) odata->opacket.packet, odata->opacket.bytes) ; + } + else if (packet_count < 2 + spx->header.extra_headers) + { /* Ignore extra headers */ + } + packet_count ++ ; + } ; + } ; + + psf_log_printf (psf, "End\n") ; + + psf_log_printf (psf, "packet_count %d\n", packet_count) ; + psf_log_printf (psf, "page_nb_packets %d\n", page_nb_packets) ; + psf_log_printf (psf, "page_granule %lld\n", page_granule) ; + + return 0 ; +} /* spx_read_header */ + +static int +spx_close (SF_PRIVATE *psf) +{ SPX_PRIVATE* spx = psf->codec_data ; + + if (spx->state) + speex_decoder_destroy (spx->state) ; + + if (spx) + speex_bits_destroy (&spx->bits) ; + + return 0 ; +} /* spx_close */ + + + +static void * +spx_header_read (SF_PRIVATE * psf, ogg_packet *op, spx_int32_t enh_enabled, int force_mode) +{ SPX_PRIVATE* spx = psf->codec_data ; + void *st ; + const SpeexMode *mode ; + SpeexHeader *tmp_header ; + int modeID ; + SpeexCallback callback ; + + tmp_header = speex_packet_to_header ((char*) op->packet, op->bytes) ; + if (tmp_header == NULL) + { psf_log_printf (psf, "Cannot read Speex header\n") ; + return NULL ; + } ; + + memcpy (&spx->header, tmp_header, sizeof (spx->header)) ; + free (tmp_header) ; + tmp_header = NULL ; + + if (spx->header.mode >= SPEEX_NB_MODES || spx->header.mode < 0) + { psf_log_printf (psf, "Mode number %d does not (yet/any longer) exist in this version\n", spx->header.mode) ; + return NULL ; + } ; + + modeID = spx->header.mode ; + if (force_mode != -1) + modeID = force_mode ; + + mode = speex_lib_get_mode (modeID) ; + + if (spx->header.speex_version_id > 1) + { psf_log_printf (psf, "This file was encoded with Speex bit-stream version %d, which I don't know how to decode\n", spx->header.speex_version_id) ; + return NULL ; + } ; + + if (mode->bitstream_version < spx->header.mode_bitstream_version) + { psf_log_printf (psf, "The file was encoded with a newer version of Speex. You need to upgrade in order to play it.\n") ; + return NULL ; + } ; + + if (mode->bitstream_version > spx->header.mode_bitstream_version) + { psf_log_printf (psf, "The file was encoded with an older version of Speex. You would need to downgrade the version in order to play it.\n") ; + return NULL ; + } ; + + st = speex_decoder_init (mode) ; + if (!st) + { psf_log_printf (psf, "Decoder initialization failed.\n") ; + return NULL ; + } ; + + speex_decoder_ctl (st, SPEEX_SET_ENH, &enh_enabled) ; + speex_decoder_ctl (st, SPEEX_GET_FRAME_SIZE, &spx->frame_size) ; + spx->granule_frame_size = spx->frame_size ; + + if (!psf->sf.samplerate) + psf->sf.samplerate = spx->header.rate ; + /* Adjust rate if --force-* options are used */ + if (force_mode != -1) + { if (spx->header.mode < force_mode) + { psf->sf.samplerate <<= (force_mode - spx->header.mode) ; + spx->granule_frame_size >>= (force_mode - spx->header.mode) ; + } ; + if (spx->header.mode > force_mode) + { psf->sf.samplerate >>= (spx->header.mode - force_mode) ; + spx->granule_frame_size <<= (spx->header.mode - force_mode) ; + } ; + } ; + + speex_decoder_ctl (st, SPEEX_SET_SAMPLING_RATE, &psf->sf.samplerate) ; + + spx->nframes = spx->header.frames_per_packet ; + + if (psf->sf.channels == -1) + psf->sf.channels = spx->header.nb_channels ; + + if (! (psf->sf.channels == 1)) + { psf->sf.channels = 2 ; + callback.callback_id = SPEEX_INBAND_STEREO ; + callback.func = speex_std_stereo_request_handler ; + callback.data = &spx->stereo ; + speex_decoder_ctl (st, SPEEX_SET_HANDLER, &callback) ; + } ; + + spx->header.speex_version [sizeof (spx->header.speex_version) - 1] = 0 ; + + psf_log_printf (psf, " Encoder ver : %s\n Frames/packet : %d\n", + spx->header.speex_version, spx->header.frames_per_packet) ; + + if (spx->header.bitrate > 0) + psf_log_printf (psf, " Bit rate : %d\n", spx->header.bitrate) ; + + psf_log_printf (psf, " Sample rate : %d\n Mode : %s\n VBR : %s\n Channels : %d\n", + psf->sf.samplerate, mode->modeName, (spx->header.vbr ? "yes" : "no"), psf->sf.channels) ; + + psf_log_printf (psf, " Extra headers : %d\n", spx->header.extra_headers) ; + + return st ; +} /* spx_header_read */ + + +static void +spx_print_comments (const char *c, int length) +{ + const char *end ; + int len, i, nb_fields ; + +printf ("%s %d\n", __func__, __LINE__) ; + if (length < 8) + { fprintf (stderr, "Invalid/corrupted comments\n") ; + return ; + } + end = c + length ; + len = readint (c, 0) ; + c += 4 ; + if (len < 0 || c + len > end) + { fprintf (stderr, "Invalid/corrupted comments\n") ; + return ; + } + (void) fwrite (c, 1, len, stderr) ; + c += len ; + fprintf (stderr, "\n") ; + if (c + 4 > end) + { fprintf (stderr, "Invalid/corrupted comments\n") ; + return ; + } + nb_fields = readint (c, 0) ; + c += 4 ; + for (i = 0 ; i < nb_fields ; i++) + { if (c + 4 > end) + { fprintf (stderr, "Invalid/corrupted comments\n") ; + return ; + } ; + len = readint (c, 0) ; + c += 4 ; + if (len < 0 || c + len > end) + { fprintf (stderr, "Invalid/corrupted comments\n") ; + return ; + } + (void) fwrite (c, 1, len, stderr) ; + c += len ; + fprintf (stderr, "\n") ; + } ; + return ; +} /* spx_print_comments */ + + +/* +encoded_speex_frames = (frames_per_packet * Packets) + = 1 * 272 + = 272 + +audio_samples = encoded_speex_frames * frame_size + = 272 * 640 + = 174080 + +duration = audio_samples / rate + = 174080 / 44100 + = 3.947 +*/ + +#else /* ENABLE_EXPERIMENTAL_CODE && HAVE_EXTERNAL_XIPH_LIBS */ + +int +ogg_speex_open (SF_PRIVATE *psf) +{ + psf_log_printf (psf, "This version of libsndfile was compiled without Ogg/Speex support.\n") ; + return SFE_UNIMPLEMENTED ; +} /* ogg_speex_open */ + +#endif diff --git a/libsndfile-1.0.31/src/ogg_vcomment.c b/libsndfile-1.0.31/src/ogg_vcomment.c new file mode 100644 index 0000000..252ed61 --- /dev/null +++ b/libsndfile-1.0.31/src/ogg_vcomment.c @@ -0,0 +1,277 @@ +/* +** Copyright (C) 2008-2019 Erik de Castro Lopo +** Copyright (C) 2018 Arthur Taylor +** +** This program is free software ; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation ; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY ; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +#if HAVE_EXTERNAL_XIPH_LIBS + +#include + +#include "ogg_vcomment.h" + +typedef struct +{ int id ; + const char *name ; +} STR_PAIR ; + +/* See https://xiph.org/vorbis/doc/v-comment.html */ +static STR_PAIR vorbiscomment_mapping [] = +{ { SF_STR_TITLE, "TITLE" }, + { SF_STR_COPYRIGHT, "COPYRIGHT", }, + { SF_STR_SOFTWARE, "ENCODER", }, + { SF_STR_ARTIST, "ARTIST" }, + { SF_STR_COMMENT, "COMMENT" }, + { SF_STR_DATE, "DATE", }, + { SF_STR_ALBUM, "ALBUM" }, + { SF_STR_LICENSE, "LICENSE", }, + { SF_STR_TRACKNUMBER, "TRACKNUMBER", }, + { SF_STR_GENRE, "GENRE", }, + { 0, NULL, }, +} ; + +/*----------------------------------------------------------------------------------------------- +** Private function prototypes. +*/ + +static int vorbiscomment_lookup_id (const char *name) ; +static const char * vorbiscomment_lookup_name (int id) ; + +static inline size_t read_32bit_size_t (const unsigned char * ptr) +{ /* Read a 32 bit positive value from the provided pointer. */ + return LE2H_32_PTR (ptr) & 0x7fffffff ; +} /* read_32bit_size_t */ + +/*----------------------------------------------------------------------------------------------- +** Exported functions. +*/ + +int +vorbiscomment_read_tags (SF_PRIVATE *psf, ogg_packet *packet, vorbiscomment_ident *ident) +{ unsigned char *p, *ep ; + char *tag, *c ; + size_t tag_size, tag_len = 0 ; + unsigned int ntags, i = 0 ; + int id, ret = 0 ; + + /* + ** The smallest possible header is the ident string length plus two 4-byte + ** integers, (vender string length, tags count.) + */ + if (packet->bytes < (ident ? ident->length : 0) + 4 + 4) + return SFE_MALFORMED_FILE ; + + /* Our working pointer. */ + p = packet->packet ; + /* Our end pointer for bound checking. */ + ep = p + packet->bytes ; + + if (ident) + { if (memcmp (p, ident->ident, ident->length) != 0) + { psf_log_printf (psf, "Expected comment packet identifier missing.\n") ; + return SFE_MALFORMED_FILE ; + } ; + p += ident->length ; + } ; + + tag_size = 1024 ; + tag = malloc (tag_size) ; + /* Unlikely */ + if (!tag) + return SFE_MALLOC_FAILED ; + + psf_log_printf (psf, "VorbisComment Metadata\n") ; + + /* + ** Vendor tag, manditory, no field name. + */ + tag_len = read_32bit_size_t (p) ; + p += 4 ; + if (tag_len > 0) + { /* Bound checking. 4 bytes for remaining manditory fields. */ + if (p + tag_len + 4 > ep) + { ret = SFE_MALFORMED_FILE ; + goto free_tag_out ; + } ; + if (tag_len > tag_size - 1) + { free (tag) ; + tag_size = tag_len + 1 ; + tag = malloc (tag_size) ; + /* Unlikely */ + if (!tag) + return SFE_MALLOC_FAILED ; + } ; + memcpy (tag, p, tag_len) ; p += tag_len ; + tag [tag_len] = '\0' ; + psf_log_printf (psf, " Vendor: %s\n", tag) ; + } ; + + /* + ** List of tags of the form NAME=value + ** Allowable characters for NAME are the same as shell variable names. + */ + ntags = read_32bit_size_t (p) ; + p += 4 ; + for (i = 0 ; i < ntags ; i++) + { if (p + 4 > ep) + { ret = SFE_MALFORMED_FILE ; + goto free_tag_out ; + } ; + tag_len = read_32bit_size_t (p) ; + p += 4 ; + if (p + tag_len > ep) + { ret = SFE_MALFORMED_FILE ; + goto free_tag_out ; + } ; + if (tag_len > tag_size - 1) + { free (tag) ; + tag_size = tag_len + 1 ; + tag = malloc (tag_size) ; + /* Unlikely */ + if (!tag) + return SFE_MALLOC_FAILED ; + } ; + memcpy (tag, p, tag_len) ; p += tag_len ; + tag [tag_len] = '\0' ; + psf_log_printf (psf, " %s\n", tag) ; + for (c = tag ; *c ; c++) + { if (*c == '=') + break ; + *c = toupper (*c) ; + } ; + if (!c) + { psf_log_printf (psf, "Malformed Vorbis comment, no '=' found.\n") ; + continue ; + } ; + *c = '\0' ; + if ((id = vorbiscomment_lookup_id (tag)) != 0) + psf_store_string (psf, id, c + 1) ; + } ; + +free_tag_out: + if (tag != NULL) + free (tag) ; + return ret ; +} /* vorbiscomment_read_tags */ + +int +vorbiscomment_write_tags (SF_PRIVATE *psf, ogg_packet *packet, vorbiscomment_ident *ident, const char *vendor, int targetsize) +{ int i, ntags ; + int tags_start ; + const char *tag_name ; + int tag_name_len, tag_body_len ; + + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + + /* Packet identifier */ + if (ident) + psf_binheader_writef (psf, "eb", BHWv (ident->ident), BHWz (ident->length)) ; + + /* Manditory Vendor Tag */ + tag_name_len = vendor ? strlen (vendor) : 0 ; + psf_binheader_writef (psf, "e4b", BHW4 (tag_name_len), BHWv (vendor), BHWz (tag_name_len)) ; + + /* Tags Count. Skip for now, write after. */ + tags_start = psf->header.indx ; + psf_binheader_writef (psf, "j", BHWj (4)) ; + + ntags = 0 ; + /* Write each tag */ + for (i = 0 ; i < SF_MAX_STRINGS ; i++) + { if (psf->strings.data [i].type == 0) + continue ; + + tag_name = vorbiscomment_lookup_name (psf->strings.data [i].type) ; + if (tag_name == NULL) + continue ; + + tag_name_len = strlen (tag_name) ; + tag_body_len = strlen (psf->strings.storage + psf->strings.data [i].offset) ; + if (targetsize > 0 && tag_name_len + tag_body_len + psf->header.indx > targetsize) + { /* If we are out of space, stop now. */ + return SFE_STR_MAX_DATA ; + } + psf_binheader_writef (psf, "e4b1b", + BHW4 (tag_name_len + 1 + tag_body_len), + BHWv (tag_name), BHWz (tag_name_len), + BHW1 ('='), + BHWv (psf->strings.storage + psf->strings.data [i].offset), BHWz (tag_body_len)) ; + ntags++ ; + } ; + + if (targetsize < 0) + { /* + ** Padding. + ** + ** Pad to a minimum of -targetsize, but make sure length % 255 + ** = 254 so that we get the most out of the ogg segment lacing. + */ + psf_binheader_writef (psf, "z", BHWz ((psf->header.indx + -targetsize + 255) / 255 * 255 - 1)) ; + } + else if (targetsize > 0) + psf_binheader_writef (psf, "z", BHWz (targetsize - psf->header.indx)) ; + + packet->packet = psf->header.ptr ; + packet->bytes = psf->header.indx ; + packet->b_o_s = 0 ; + packet->e_o_s = 0 ; + + /* Seek back and write the tag count. */ + psf_binheader_writef (psf, "eo4", BHWo (tags_start), BHW4 (ntags)) ; + + return 0 ; +} /* vorbiscomment_write_tags */ + +/*============================================================================== +** Private functions. +*/ + +static int +vorbiscomment_lookup_id (const char * name) +{ STR_PAIR *p ; + + for (p = vorbiscomment_mapping ; p->id ; p++) + { if (!strcmp (name, p->name)) + return p->id ; + } ; + + return 0 ; +} /* vorbiscomment_lookup_id */ + +static const char * +vorbiscomment_lookup_name (int id) +{ STR_PAIR *p ; + + for (p = vorbiscomment_mapping ; p->id ; p++) + { if (p->id == id) + return p->name ; + } ; + + return NULL ; +} /* vorbiscomment_lookup_name */ + +#endif /* HAVE_EXTERNAL_XIPH_LIBS */ diff --git a/libsndfile-1.0.31/src/ogg_vcomment.h b/libsndfile-1.0.31/src/ogg_vcomment.h new file mode 100644 index 0000000..c25d900 --- /dev/null +++ b/libsndfile-1.0.31/src/ogg_vcomment.h @@ -0,0 +1,45 @@ +/* +** Copyright (C) 2008-2018 Erik de Castro Lopo +** Copyright (C) 2018 Arthur Taylor +** +** This program is free software ; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation ; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY ; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#ifndef SF_SRC_OGG_VCOMMENT_H +#define SF_SRC_OGG_VCOMMENT_H + +/* +** Voriscomment identifier. Some Ogg stream embedding schemes require it. +*/ +typedef struct +{ const char *ident ; + int length ; +} vorbiscomment_ident ; + +/* +** Read all vorbiscomment tags from *packet. Tags which match ones used +** by libsndfile strings are loaded into *psf. Ogg streams which require an +** identifier for the tags packet should pass it in *ident. +*/ +int vorbiscomment_read_tags (SF_PRIVATE *psf, ogg_packet *packet, vorbiscomment_ident *ident) ; + +/* +** Write metadata strings stored in *psf to *packet. The packet is optionally +** prefixed with *ident. The always-present vendor field should be the library +** used for encoding the audio data. +*/ +int vorbiscomment_write_tags (SF_PRIVATE *psf, ogg_packet *packet, vorbiscomment_ident *ident, const char *vendor, int targetsize) ; + +#endif /* SF_SRC_OGG_VCOMMENT_H */ diff --git a/libsndfile-1.0.31/src/ogg_vorbis.c b/libsndfile-1.0.31/src/ogg_vorbis.c new file mode 100644 index 0000000..5f53651 --- /dev/null +++ b/libsndfile-1.0.31/src/ogg_vorbis.c @@ -0,0 +1,907 @@ +/* +** Copyright (C) 2002-2016 Erik de Castro Lopo +** Copyright (C) 2002-2005 Michael Smith +** Copyright (C) 2007 John ffitch +** +** This program is free software ; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation ; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY ; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +/* +** Much of this code is based on the examples in libvorbis from the +** XIPHOPHORUS Company http://www.xiph.org/ which has a BSD-style Licence +** Copyright (c) 2002, Xiph.org Foundation +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** - Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** +** - Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** +** - Neither the name of the Xiph.org Foundation nor the names of its +** contributors may be used to endorse or promote products derived from +** this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION +** OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE, +** DATA, OR PROFITS ; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +#if HAVE_EXTERNAL_XIPH_LIBS + +#include +#include +#include + +#include "ogg.h" + +typedef int convert_func (SF_PRIVATE *psf, int, void *, int, int, float **) ; + +static int vorbis_read_header (SF_PRIVATE *psf) ; +static int vorbis_write_header (SF_PRIVATE *psf, int calc_length) ; +static int vorbis_close (SF_PRIVATE *psf) ; +static int vorbis_command (SF_PRIVATE *psf, int command, void *data, int datasize) ; +static int vorbis_byterate (SF_PRIVATE *psf) ; +static sf_count_t vorbis_calculate_page_duration (SF_PRIVATE *psf) ; +static sf_count_t vorbis_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; +static sf_count_t vorbis_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t vorbis_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t vorbis_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t vorbis_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; +static sf_count_t vorbis_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t vorbis_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t vorbis_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t vorbis_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; +static sf_count_t vorbis_read_sample (SF_PRIVATE *psf, void *ptr, sf_count_t lens, convert_func *transfn) ; +static int vorbis_rnull (SF_PRIVATE *psf, int samples, void *vptr, int off , int channels, float **pcm) ; + +typedef struct +{ int id ; + const char *name ; +} STR_PAIRS ; + + +/* See https://xiph.org/vorbis/doc/v-comment.html */ +static STR_PAIRS vorbis_metatypes [] = +{ { SF_STR_TITLE, "Title" }, + { SF_STR_COPYRIGHT, "Copyright" }, + { SF_STR_SOFTWARE, "Software" }, + { SF_STR_ARTIST, "Artist" }, + { SF_STR_COMMENT, "Comment" }, + { SF_STR_DATE, "Date" }, + { SF_STR_ALBUM, "Album" }, + { SF_STR_LICENSE, "License" }, + { SF_STR_TRACKNUMBER, "Tracknumber" }, + { SF_STR_GENRE, "Genre" }, +} ; + +typedef struct +{ /* Count current location */ + sf_count_t loc ; + /* Struct that stores all the static vorbis bitstream settings */ + vorbis_info vinfo ; + /* Struct that stores all the bitstream user comments */ + vorbis_comment vcomment ; + /* Ventral working state for the packet->PCM decoder */ + vorbis_dsp_state vdsp ; + /* Local working space for packet->PCM decode */ + vorbis_block vblock ; + + /* Encoding quality in range [0.0, 1.0]. */ + double quality ; + + /* Current granule position. */ + uint64_t pcm_current ; + /* Offset of the first samples' granule position. */ + uint64_t pcm_start ; + /* Last valid samples' granule position. */ + uint64_t pcm_end ; + /* File offset of the start of the last page. */ + sf_count_t last_page ; +} VORBIS_PRIVATE ; + +static int +vorbis_read_header (SF_PRIVATE *psf) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ; + sf_count_t duration ; + int printed_metadata_msg = 0 ; + int i, k, nn ; + + /* + ** The first page of the Ogg stream we are told to try and open as Vorbis + ** has already been loaded into odata->ostream by ogg_open(). + ** + ** Extract the initial header from the first page and verify that the + ** Ogg bitstream is in fact Vorbis data. + */ + + vorbis_info_init (&vdata->vinfo) ; + vorbis_comment_init (&vdata->vcomment) ; + + if (!odata->opacket.b_o_s) + { psf_log_printf (psf, "Vorbis: First packet does not have a beginning-of-stream bit.\n") ; + return SFE_MALFORMED_FILE ; + } + + if (ogg_stream_packetpeek (&odata->ostream, NULL)) + { psf_log_printf (psf, "Vorbis: First page contains extraneous packets!\n") ; + return SFE_MALFORMED_FILE ; + } + + if (vorbis_synthesis_headerin (&vdata->vinfo, &vdata->vcomment, &odata->opacket) < 0) + { /* Error case ; not a vorbis header. */ + psf_log_printf (psf, "Found Vorbis in stream header, but vorbis_synthesis_headerin failed.\n") ; + return SFE_MALFORMED_FILE ; + } ; + + /* + ** At this point, we're sure we're Vorbis. We've set up the logical (Ogg) + ** bitstream decoder. Get the comment and codebook headers and set up the + ** Vorbis decoder. + ** + ** The next two packets in order are the comment and codebook headers. + ** They're likely large and may span multiple pages. Thus we reead + ** and submit data until we get our two pacakets, watching that no + ** pages are missing. If a page is missing, error out ; losing a + ** header page is the only place where missing data is fatal. + */ + + i = 0 ; /* Count of number of packets read */ + while (i < 2) + { nn = ogg_stream_packetout (&odata->ostream, &odata->opacket) ; + + if (nn == 0) + { nn = ogg_stream_next_page (psf, odata) ; + if (nn == 0) + { psf_log_printf (psf, "End of file before finding all Vorbis headers!\n") ; + return SFE_MALFORMED_FILE ; + } ; + if (nn == -1) + { psf_log_printf (psf, "Error reading file while finding Vorbis headers!\n") ; + return psf->error ; + } ; + continue ; + } + + if (nn < 0) + { /* A hole while reading headers. This could be bad. */ + psf_log_printf (psf, "Corrupt secondary header. Exiting.\n") ; + return SFE_MALFORMED_FILE ; + } ; + + vorbis_synthesis_headerin (&vdata->vinfo, &vdata->vcomment, &odata->opacket) ; + i++ ; + } ; + + /* Check for extraneous packets in the last headers page. */ + while (ogg_stream_packetout (&odata->ostream, &odata->opacket) == 1) + { i++ ; + } + if (i > 2) + psf_log_printf (psf, "Vorbis: stream has extraneous header packets.\n") ; + + psf_log_printf (psf, "Bitstream is %d channel, %D Hz\n", vdata->vinfo.channels, vdata->vinfo.rate) ; + psf_log_printf (psf, "Encoded by : %s\n", vdata->vcomment.vendor) ; + + /* Save the offset of the first payload page */ + psf->dataoffset = ogg_sync_ftell (psf) ; + + /* + ** Caculate the granule position offset. The first page with a payload + ** packet shouldn't end in a continued packet. The difference between the + ** page's granule position and the sum of frames on the page tells us the + ** granule position offset. + ** See https://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-132000A.2 + */ + ogg_stream_unpack_page (psf, odata) ; + vdata->pcm_start = odata->pkt [odata->pkt_len - 1].granulepos ; + duration = vorbis_calculate_page_duration (psf) ; + + if (duration < (sf_count_t) vdata->pcm_start) + vdata->pcm_start -= duration ; + else + vdata->pcm_start = 0 ; + + /* + ** Find the end of the stream, save it. Only works if the file is seekable. + */ + vdata->loc = vdata->pcm_start ; + vdata->pcm_end = (uint64_t) -1 ; + psf->datalength = psf->filelength ; + if (!psf->is_pipe) + { sf_count_t last_page ; + sf_count_t saved_offset ; + + saved_offset = ogg_sync_ftell (psf) ; + last_page = ogg_sync_last_page_before (psf, odata, &vdata->pcm_end, psf->filelength, odata->ostream.serialno) ; + if (last_page > 0) + { if (!ogg_page_eos (&odata->opage)) + psf_log_printf (psf, "Ogg: Last page lacks an end-of-stream bit.\n") ; + psf->datalength = last_page + odata->opage.header_len + odata->opage.body_len - psf->dataoffset ; + if (psf->datalength + psf->dataoffset < psf->filelength) + psf_log_printf (psf, "Ogg: Junk after the last page.\n") ; + vdata->last_page = last_page ; + } ; + + ogg_sync_fseek (psf, saved_offset, SEEK_SET) ; + } + + psf_log_printf (psf, "PCM offset : %d\n", vdata->pcm_start) ; + if (vdata->pcm_end != (uint64_t) -1) + psf_log_printf (psf, "PCM end : %d\n", vdata->pcm_end) ; + else + psf_log_printf (psf, "PCM end : unknown\n") ; + + /* Throw the comments plus a few lines about the bitstream we're decoding. */ + for (k = 0 ; k < ARRAY_LEN (vorbis_metatypes) ; k++) + { char *dd ; + + dd = vorbis_comment_query (&vdata->vcomment, vorbis_metatypes [k].name, 0) ; + if (dd == NULL) + continue ; + + if (printed_metadata_msg == 0) + { psf_log_printf (psf, "Metadata :\n") ; + printed_metadata_msg = 1 ; + } ; + + psf_store_string (psf, vorbis_metatypes [k].id, dd) ; + psf_log_printf (psf, " %-10s : %s\n", vorbis_metatypes [k].name, dd) ; + } ; + psf_log_printf (psf, "End\n") ; + + psf->sf.samplerate = vdata->vinfo.rate ; + psf->sf.channels = vdata->vinfo.channels ; + psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ; + psf->sf.frames = (vdata->pcm_end != (uint64_t) -1) ? vdata->pcm_end - vdata->pcm_start : SF_COUNT_MAX ; + + /* OK, got and parsed all three headers. Initialize the Vorbis + ** packet->PCM decoder. + ** Central decode state. */ + vorbis_synthesis_init (&vdata->vdsp, &vdata->vinfo) ; + + /* Local state for most of the decode so multiple block decodes can + ** proceed in parallel. We could init multiple vorbis_block structures + ** for vd here. */ + vorbis_block_init (&vdata->vdsp, &vdata->vblock) ; + + return 0 ; +} /* vorbis_read_header */ + +static int +vorbis_write_header (SF_PRIVATE *psf, int UNUSED (calc_length)) +{ + OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ; + int k, ret ; + + vorbis_info_init (&vdata->vinfo) ; + + /* The style of encoding should be selectable here, VBR quality mode. */ + ret = vorbis_encode_init_vbr (&vdata->vinfo, psf->sf.channels, psf->sf.samplerate, vdata->quality) ; + +#if 0 + ret = vorbis_encode_init (&vdata->vinfo, psf->sf.channels, psf->sf.samplerate, -1, 128000, -1) ; /* average bitrate mode */ + ret = ( vorbis_encode_setup_managed (&vdata->vinfo, psf->sf.channels, psf->sf.samplerate, -1, 128000, -1) + || vorbis_encode_ctl (&vdata->vinfo, OV_ECTL_RATEMANAGE_AVG, NULL) + || vorbis_encode_setup_init (&vdata->vinfo) + ) ; +#endif + if (ret) + return SFE_BAD_OPEN_FORMAT ; + + vdata->loc = 0 ; + + /* add a comment */ + vorbis_comment_init (&vdata->vcomment) ; + + vorbis_comment_add_tag (&vdata->vcomment, "ENCODER", "libsndfile") ; + for (k = 0 ; k < SF_MAX_STRINGS ; k++) + { const char * name ; + + if (psf->strings.data [k].type == 0) + break ; + + switch (psf->strings.data [k].type) + { case SF_STR_TITLE : name = "TITLE" ; break ; + case SF_STR_COPYRIGHT : name = "COPYRIGHT" ; break ; + case SF_STR_SOFTWARE : name = "SOFTWARE" ; break ; + case SF_STR_ARTIST : name = "ARTIST" ; break ; + case SF_STR_COMMENT : name = "COMMENT" ; break ; + case SF_STR_DATE : name = "DATE" ; break ; + case SF_STR_ALBUM : name = "ALBUM" ; break ; + case SF_STR_LICENSE : name = "LICENSE" ; break ; + case SF_STR_TRACKNUMBER : name = "Tracknumber" ; break ; + case SF_STR_GENRE : name = "Genre" ; break ; + + default : continue ; + } ; + + vorbis_comment_add_tag (&vdata->vcomment, name, psf->strings.storage + psf->strings.data [k].offset) ; + } ; + + /* set up the analysis state and auxiliary encoding storage */ + vorbis_analysis_init (&vdata->vdsp, &vdata->vinfo) ; + vorbis_block_init (&vdata->vdsp, &vdata->vblock) ; + + /* + ** Set up our packet->stream encoder. + ** Pick a random serial number ; that way we can more likely build + ** chained streams just by concatenation. + */ + + ogg_stream_init (&odata->ostream, psf_rand_int32 ()) ; + + /* Vorbis streams begin with three headers ; the initial header (with + most of the codec setup parameters) which is mandated by the Ogg + bitstream spec. The second header holds any comment fields. The + third header holds the bitstream codebook. We merely need to + make the headers, then pass them to libvorbis one at a time ; + libvorbis handles the additional Ogg bitstream constraints */ + + { ogg_packet header ; + ogg_packet header_comm ; + ogg_packet header_code ; + int result ; + + vorbis_analysis_headerout (&vdata->vdsp, &vdata->vcomment, &header, &header_comm, &header_code) ; + ogg_stream_packetin (&odata->ostream, &header) ; /* automatically placed in its own page */ + ogg_stream_packetin (&odata->ostream, &header_comm) ; + ogg_stream_packetin (&odata->ostream, &header_code) ; + + /* This ensures the actual + * audio data will start on a new page, as per spec + */ + while ((result = ogg_stream_flush (&odata->ostream, &odata->opage)) != 0) + { ogg_write_page (psf, &odata->opage) ; + } ; + } + + return 0 ; +} /* vorbis_write_header */ + +static int +vorbis_close (SF_PRIVATE *psf) +{ OGG_PRIVATE* odata = psf->container_data ; + VORBIS_PRIVATE *vdata = psf->codec_data ; + + if (odata == NULL || vdata == NULL) + return 0 ; + + /* Clean up this logical bitstream ; before exit we shuld see if we're + ** followed by another [chained]. */ + + if (psf->file.mode == SFM_WRITE) + { + if (psf->write_current <= 0) + vorbis_write_header (psf, 0) ; + + vorbis_analysis_wrote (&vdata->vdsp, 0) ; + while (vorbis_analysis_blockout (&vdata->vdsp, &vdata->vblock) == 1) + { + + /* analysis, assume we want to use bitrate management */ + vorbis_analysis (&vdata->vblock, NULL) ; + vorbis_bitrate_addblock (&vdata->vblock) ; + + while (vorbis_bitrate_flushpacket (&vdata->vdsp, &odata->opacket)) + { /* weld the packet into the bitstream */ + ogg_stream_packetin (&odata->ostream, &odata->opacket) ; + + /* write out pages (if any) */ + while (!odata->eos) + { int result = ogg_stream_pageout (&odata->ostream, &odata->opage) ; + if (result == 0) break ; + ogg_write_page (psf, &odata->opage) ; + + /* this could be set above, but for illustrative purposes, I do + it here (to show that vorbis does know where the stream ends) */ + + if (ogg_page_eos (&odata->opage)) odata->eos = 1 ; + } + } + } + } + + /* ogg_page and ogg_packet structs always point to storage in + libvorbis. They are never freed or manipulated directly */ + + vorbis_block_clear (&vdata->vblock) ; + vorbis_dsp_clear (&vdata->vdsp) ; + vorbis_comment_clear (&vdata->vcomment) ; + vorbis_info_clear (&vdata->vinfo) ; + + return 0 ; +} /* vorbis_close */ + +int +ogg_vorbis_open (SF_PRIVATE *psf) +{ OGG_PRIVATE* odata = psf->container_data ; + VORBIS_PRIVATE* vdata ; + int error = 0 ; + + if (odata == NULL) + { psf_log_printf (psf, "%s : odata is NULL???\n", __func__) ; + return SFE_INTERNAL ; + } ; + + vdata = calloc (1, sizeof (VORBIS_PRIVATE)) ; + psf->codec_data = vdata ; + + if (psf->file.mode == SFM_RDWR) + return SFE_BAD_MODE_RW ; + + psf_log_printf (psf, "Vorbis library version : %s\n", vorbis_version_string ()) ; + + if (psf->file.mode == SFM_READ) + { if ((error = vorbis_read_header (psf))) + return error ; + + psf->read_short = vorbis_read_s ; + psf->read_int = vorbis_read_i ; + psf->read_float = vorbis_read_f ; + psf->read_double = vorbis_read_d ; + } ; + + psf->codec_close = vorbis_close ; + if (psf->file.mode == SFM_WRITE) + { + /* Set the default vorbis quality here. */ + vdata->quality = 0.4 ; + + psf->write_header = vorbis_write_header ; + psf->write_short = vorbis_write_s ; + psf->write_int = vorbis_write_i ; + psf->write_float = vorbis_write_f ; + psf->write_double = vorbis_write_d ; + + psf->sf.frames = 0 ; + psf->datalength = 0 ; + psf->filelength = 0 ; + psf->dataoffset = 0 ; + psf->strings.flags = SF_STR_ALLOW_START ; + } ; + + psf->seek = vorbis_seek ; + psf->command = vorbis_command ; + psf->byterate = vorbis_byterate ; + psf->sf.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ; + psf->sf.sections = 1 ; + + return error ; +} /* ogg_vorbis_open */ + +static int +vorbis_command (SF_PRIVATE *psf, int command, void * data, int datasize) +{ VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ; + + switch (command) + { case SFC_SET_COMPRESSION_LEVEL : + if (data == NULL || datasize != sizeof (double)) + return SF_FALSE ; + + if (psf->have_written) + return SF_FALSE ; + + vdata->quality = 1.0 - *((double *) data) ; + + /* Clip range. */ + vdata->quality = SF_MAX (0.0, SF_MIN (1.0, vdata->quality)) ; + + psf_log_printf (psf, "%s : Setting SFC_SET_VBR_ENCODING_QUALITY to %f.\n", __func__, vdata->quality) ; + return SF_TRUE ; + + default : + return SF_FALSE ; + } ; + + return SF_FALSE ; +} /* vorbis_command */ + +static int +vorbis_rnull (SF_PRIVATE *UNUSED (psf), int samples, void *UNUSED (vptr), int UNUSED (off) , int channels, float **UNUSED (pcm)) +{ + return samples * channels ; +} /* vorbis_rnull */ + +static int +vorbis_rshort (SF_PRIVATE *psf, int samples, void *vptr, int off, int channels, float **pcm) +{ + short *ptr = (short*) vptr + off ; + int i = 0, j, n ; + if (psf->float_int_mult) + { + float inverse = 1.0 / psf->float_max ; + for (j = 0 ; j < samples ; j++) + for (n = 0 ; n < channels ; n++) + ptr [i++] = psf_lrintf ((pcm [n][j] * inverse) * 32767.0f) ; + } + else + { + for (j = 0 ; j < samples ; j++) + for (n = 0 ; n < channels ; n++) + ptr [i++] = psf_lrintf (pcm [n][j] * 32767.0f) ; + } + return i ; +} /* vorbis_rshort */ + +static int +vorbis_rint (SF_PRIVATE *psf, int samples, void *vptr, int off, int channels, float **pcm) +{ + int *ptr = (int*) vptr + off ; + int i = 0, j, n ; + + if (psf->float_int_mult) + { + float inverse = 1.0 / psf->float_max ; + for (j = 0 ; j < samples ; j++) + for (n = 0 ; n < channels ; n++) + ptr [i++] = psf_lrintf ((pcm [n][j] * inverse) * 2147483647.0f) ; + } + else + { + for (j = 0 ; j < samples ; j++) + for (n = 0 ; n < channels ; n++) + ptr [i++] = psf_lrintf (pcm [n][j] * 2147483647.0f) ; + } + return i ; +} /* vorbis_rint */ + +static int +vorbis_rfloat (SF_PRIVATE *UNUSED (psf), int samples, void *vptr, int off, int channels, float **pcm) +{ + float *ptr = (float*) vptr + off ; + int i = 0, j, n ; + for (j = 0 ; j < samples ; j++) + for (n = 0 ; n < channels ; n++) + ptr [i++] = pcm [n][j] ; + return i ; +} /* vorbis_rfloat */ + +static int +vorbis_rdouble (SF_PRIVATE *UNUSED (psf), int samples, void *vptr, int off, int channels, float **pcm) +{ + double *ptr = (double*) vptr + off ; + int i = 0, j, n ; + for (j = 0 ; j < samples ; j++) + for (n = 0 ; n < channels ; n++) + ptr [i++] = pcm [n][j] ; + return i ; +} /* vorbis_rdouble */ + + +static sf_count_t +vorbis_read_sample (SF_PRIVATE *psf, void *ptr, sf_count_t lens, convert_func *transfn) +{ VORBIS_PRIVATE *vdata = psf->codec_data ; + OGG_PRIVATE *odata = psf->container_data ; + int len, samples, i = 0 , nn ; + float **pcm ; + + len = lens / psf->sf.channels ; + + while (len > 0) + { /* + ** pcm is a multichannel float vector. In stereo, for + ** example, pcm [0] is left, and pcm [1] is right. samples is + ** the size of each channel. Convert the float values + ** (-1.<=range<=1.) to whatever PCM format and write it out. + */ + while ((samples = vorbis_synthesis_pcmout (&vdata->vdsp, &pcm)) > 0) + { if (samples > len) samples = len ; + i += transfn (psf, samples, ptr, i, psf->sf.channels, pcm) ; + len -= samples ; + /* tell libvorbis how many samples we actually consumed */ + vorbis_synthesis_read (&vdata->vdsp, samples) ; + vdata->loc += samples ; + if (len == 0) + return i ; /* Is this necessary */ + } ; + + /* Out of samples, load the next packet. */ + if (odata->pkt_indx == odata->pkt_len) + { /* Page out of packets, load and unpack the next page. */ + nn = ogg_stream_unpack_page (psf, odata) ; + if (nn <= 0) + return i ; + if (nn == 2) + { /* Ran over a hole. loc is now out of date, need to recalculate. */ + vdata->loc = odata->pkt [odata->pkt_len - 1].granulepos ; + vdata->loc -= vorbis_calculate_page_duration (psf) ; + } + } ; + + /* Decode the packet */ + if (vorbis_synthesis (&vdata->vblock, &(odata->pkt [odata->pkt_indx])) == 0) /* test for success! */ + vorbis_synthesis_blockin (&vdata->vdsp, &vdata->vblock) ; + odata->pkt_indx++ ; + } ; + + return i ; +} /* vorbis_read_sample */ + +static sf_count_t +vorbis_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t lens) +{ return vorbis_read_sample (psf, (void*) ptr, lens, vorbis_rshort) ; +} /* vorbis_read_s */ + +static sf_count_t +vorbis_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t lens) +{ return vorbis_read_sample (psf, (void*) ptr, lens, vorbis_rint) ; +} /* vorbis_read_i */ + +static sf_count_t +vorbis_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t lens) +{ return vorbis_read_sample (psf, (void*) ptr, lens, vorbis_rfloat) ; +} /* vorbis_read_f */ + +static sf_count_t +vorbis_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t lens) +{ return vorbis_read_sample (psf, (void*) ptr, lens, vorbis_rdouble) ; +} /* vorbis_read_d */ + +/*============================================================================== +*/ + +static void +vorbis_write_samples (SF_PRIVATE *psf, OGG_PRIVATE *odata, VORBIS_PRIVATE *vdata, int in_frames) +{ + vorbis_analysis_wrote (&vdata->vdsp, in_frames) ; + + /* + ** Vorbis does some data preanalysis, then divvies up blocks for + ** more involved (potentially parallel) processing. Get a single + ** block for encoding now. + */ + while (vorbis_analysis_blockout (&vdata->vdsp, &vdata->vblock) == 1) + { + /* analysis, assume we want to use bitrate management */ + vorbis_analysis (&vdata->vblock, NULL) ; + vorbis_bitrate_addblock (&vdata->vblock) ; + + while (vorbis_bitrate_flushpacket (&vdata->vdsp, &odata->opacket)) + { + /* weld the packet into the bitstream */ + ogg_stream_packetin (&odata->ostream, &odata->opacket) ; + + /* write out pages (if any) */ + while (!odata->eos) + { int result = ogg_stream_pageout (&odata->ostream, &odata->opage) ; + if (result == 0) + break ; + ogg_write_page (psf, &odata->opage) ; + + /* This could be set above, but for illustrative purposes, I do + ** it here (to show that vorbis does know where the stream ends) */ + if (ogg_page_eos (&odata->opage)) + odata->eos = 1 ; + } ; + } ; + } ; + + vdata->loc += in_frames ; +} /* vorbis_write_data */ + + +static sf_count_t +vorbis_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t lens) +{ + int i, m, j = 0 ; + OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ; + int in_frames = lens / psf->sf.channels ; + float **buffer = vorbis_analysis_buffer (&vdata->vdsp, in_frames) ; + for (i = 0 ; i < in_frames ; i++) + for (m = 0 ; m < psf->sf.channels ; m++) + buffer [m][i] = (float) (ptr [j++]) / 32767.0f ; + + vorbis_write_samples (psf, odata, vdata, in_frames) ; + + return lens ; +} /* vorbis_write_s */ + +static sf_count_t +vorbis_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t lens) +{ int i, m, j = 0 ; + OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ; + int in_frames = lens / psf->sf.channels ; + float **buffer = vorbis_analysis_buffer (&vdata->vdsp, in_frames) ; + for (i = 0 ; i < in_frames ; i++) + for (m = 0 ; m < psf->sf.channels ; m++) + buffer [m][i] = (float) (ptr [j++]) / 2147483647.0f ; + + vorbis_write_samples (psf, odata, vdata, in_frames) ; + + return lens ; +} /* vorbis_write_i */ + +static sf_count_t +vorbis_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t lens) +{ int i, m, j = 0 ; + OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ; + int in_frames = lens / psf->sf.channels ; + float **buffer = vorbis_analysis_buffer (&vdata->vdsp, in_frames) ; + for (i = 0 ; i < in_frames ; i++) + for (m = 0 ; m < psf->sf.channels ; m++) + buffer [m][i] = ptr [j++] ; + + vorbis_write_samples (psf, odata, vdata, in_frames) ; + + return lens ; +} /* vorbis_write_f */ + +static sf_count_t +vorbis_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t lens) +{ int i, m, j = 0 ; + OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ; + int in_frames = lens / psf->sf.channels ; + float **buffer = vorbis_analysis_buffer (&vdata->vdsp, in_frames) ; + for (i = 0 ; i < in_frames ; i++) + for (m = 0 ; m < psf->sf.channels ; m++) + buffer [m][i] = (float) ptr [j++] ; + + vorbis_write_samples (psf, odata, vdata, in_frames) ; + + return lens ; +} /* vorbis_write_d */ + +static sf_count_t +vorbis_seek (SF_PRIVATE *psf, int UNUSED (mode), sf_count_t offset) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ; + sf_count_t target ; + int ret ; + + if (odata == NULL || vdata == NULL) + return 0 ; + + if (offset < 0) + { psf->error = SFE_BAD_SEEK ; + return ((sf_count_t) -1) ; + } ; + + if (psf->file.mode == SFM_READ) + { target = offset + vdata->pcm_start ; + + /* + ** If the end of the file is know, and the seek isn't for the near + ** future, do a search of the file for a good place to start. + */ + ret = 0 ; + if ((vdata->pcm_end != (uint64_t) -1) && + (target < vdata->loc || target - vdata->loc > (2 * psf->sf.samplerate))) + { uint64_t best_gp ; + + best_gp = vdata->pcm_start ; + + ret = ogg_stream_seek_page_search (psf, odata, target, vdata->pcm_start, + vdata->pcm_end, &best_gp, psf->dataoffset, vdata->last_page) ; + if (ret >= 0) + { ret = ogg_stream_unpack_page (psf, odata) ; + if (ret == 1) + { vdata->loc = best_gp ; + vorbis_synthesis_restart (&vdata->vdsp) ; + } ; + } ; + } ; + + if (ret >= 0 && offset + (sf_count_t) vdata->pcm_start >= vdata->loc) + target = offset + vdata->pcm_start - vdata->loc ; + else + { /* Search failed (bad data?), reset to the beginning of the stream. */ + ogg_stream_reset_serialno (&odata->ostream, odata->ostream.serialno) ; + odata->pkt_len = 0 ; + odata->pkt_indx = 0 ; + ogg_sync_fseek (psf, psf->dataoffset, SEEK_SET) ; + vdata->loc = 0 ; + vorbis_synthesis_restart (&vdata->vdsp) ; + target = offset ; + } ; + + while (target > 0) + { sf_count_t m = target > 4096 ? 4096 : target ; + + /* + ** Need to multiply by channels here because the seek is done in + ** terms of frames and the read function is done in terms of + ** samples. + */ + vorbis_read_sample (psf, (void *) NULL, m * psf->sf.channels, vorbis_rnull) ; + + target -= m ; + } ; + + return vdata->loc - vdata->pcm_start ; + } ; + + return 0 ; +} /* vorbis_seek */ + + +static int +vorbis_byterate (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_READ) + return (psf->datalength * psf->sf.samplerate) / psf->sf.frames ; + + return -1 ; +} /* vorbis_byterate */ + +static sf_count_t +vorbis_calculate_page_duration (SF_PRIVATE *psf) +{ OGG_PRIVATE *odata = (OGG_PRIVATE *) psf->container_data ; + VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ; + long thisblock, lastblock ; + sf_count_t duration ; + int i ; + + lastblock = -1 ; + duration = 0 ; + for (i = 0 ; i < odata->pkt_len ; i++) + { thisblock = vorbis_packet_blocksize (&vdata->vinfo, &(odata->pkt [i])) ; + if (thisblock >= 0) + { if (lastblock != -1) + duration += (lastblock + thisblock) >> 2 ; + lastblock = thisblock ; + } ; + } ; + + return duration ; +} + +#else /* HAVE_EXTERNAL_XIPH_LIBS */ + +int +ogg_vorbis_open (SF_PRIVATE *psf) +{ + psf_log_printf (psf, "This version of libsndfile was compiled without Ogg/Vorbis support.\n") ; + return SFE_UNIMPLEMENTED ; +} /* ogg_vorbis_open */ + +#endif diff --git a/libsndfile-1.0.31/src/paf.c b/libsndfile-1.0.31/src/paf.c new file mode 100644 index 0000000..459bc46 --- /dev/null +++ b/libsndfile-1.0.31/src/paf.c @@ -0,0 +1,818 @@ +/* +** Copyright (C) 1999-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +/*------------------------------------------------------------------------------ +** Macros to handle big/little endian issues. +*/ + +#define FAP_MARKER (MAKE_MARKER ('f', 'a', 'p', ' ')) +#define PAF_MARKER (MAKE_MARKER (' ', 'p', 'a', 'f')) + +/*------------------------------------------------------------------------------ +** Other defines. +*/ + +#define PAF_HEADER_LENGTH 2048 + +#define PAF24_SAMPLES_PER_BLOCK 10 +#define PAF24_BLOCK_SIZE 32 + +/*------------------------------------------------------------------------------ +** Typedefs. +*/ + +typedef struct +{ int version ; + int endianness ; + int samplerate ; + int format ; + int channels ; + int source ; +} PAF_FMT ; + +typedef struct +{ int max_blocks, channels, blocksize ; + int read_block, write_block, read_count, write_count ; + sf_count_t sample_count ; + int *samples ; + int *block ; + int data [] ; /* ISO C99 struct flexible array. */ +} PAF24_PRIVATE ; + +/*------------------------------------------------------------------------------ +** Private static functions. +*/ + +static int paf24_init (SF_PRIVATE *psf) ; + +static int paf_read_header (SF_PRIVATE *psf) ; +static int paf_write_header (SF_PRIVATE *psf, int calc_length) ; + +static sf_count_t paf24_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t paf24_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t paf24_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t paf24_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t paf24_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t paf24_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t paf24_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t paf24_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +static sf_count_t paf24_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; + +enum +{ PAF_PCM_16 = 0, + PAF_PCM_24 = 1, + PAF_PCM_S8 = 2 +} ; + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +paf_open (SF_PRIVATE *psf) +{ int subformat, error, endian ; + + psf->dataoffset = PAF_HEADER_LENGTH ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = paf_read_header (psf))) + return error ; + } ; + + subformat = SF_CODEC (psf->sf.format) ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_PAF) + return SFE_BAD_OPEN_FORMAT ; + + endian = SF_ENDIAN (psf->sf.format) ; + + /* PAF is by default big endian. */ + psf->endian = SF_ENDIAN_BIG ; + + if (endian == SF_ENDIAN_LITTLE || (CPU_IS_LITTLE_ENDIAN && (endian == SF_ENDIAN_CPU))) + psf->endian = SF_ENDIAN_LITTLE ; + + if ((error = paf_write_header (psf, SF_FALSE))) + return error ; + + psf->write_header = paf_write_header ; + } ; + + switch (subformat) + { case SF_FORMAT_PCM_S8 : + psf->bytewidth = 1 ; + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_PCM_16 : + psf->bytewidth = 2 ; + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_PCM_24 : + /* No bytewidth because of whacky 24 bit encoding. */ + error = paf24_init (psf) ; + break ; + + default : return SFE_PAF_UNKNOWN_FORMAT ; + } ; + + return error ; +} /* paf_open */ + +/*------------------------------------------------------------------------------ +*/ + +static int +paf_read_header (SF_PRIVATE *psf) +{ PAF_FMT paf_fmt ; + int marker ; + + if (psf->filelength < PAF_HEADER_LENGTH) + return SFE_PAF_SHORT_HEADER ; + + memset (&paf_fmt, 0, sizeof (paf_fmt)) ; + psf_binheader_readf (psf, "pm", 0, &marker) ; + + psf_log_printf (psf, "Signature : '%M'\n", marker) ; + + if (marker == PAF_MARKER) + { psf_binheader_readf (psf, "E444444", &(paf_fmt.version), &(paf_fmt.endianness), + &(paf_fmt.samplerate), &(paf_fmt.format), &(paf_fmt.channels), &(paf_fmt.source)) ; + } + else if (marker == FAP_MARKER) + { psf_binheader_readf (psf, "e444444", &(paf_fmt.version), &(paf_fmt.endianness), + &(paf_fmt.samplerate), &(paf_fmt.format), &(paf_fmt.channels), &(paf_fmt.source)) ; + } + else + return SFE_PAF_NO_MARKER ; + + psf_log_printf (psf, "Version : %d\n", paf_fmt.version) ; + + if (paf_fmt.version != 0) + { psf_log_printf (psf, "*** Bad version number. should be zero.\n") ; + return SFE_PAF_VERSION ; + } ; + + psf_log_printf (psf, "Sample Rate : %d\n", paf_fmt.samplerate) ; + psf_log_printf (psf, "Channels : %d\n", paf_fmt.channels) ; + + psf_log_printf (psf, "Endianness : %d => ", paf_fmt.endianness) ; + if (paf_fmt.endianness) + { psf_log_printf (psf, "Little\n", paf_fmt.endianness) ; + psf->endian = SF_ENDIAN_LITTLE ; + } + else + { psf_log_printf (psf, "Big\n", paf_fmt.endianness) ; + psf->endian = SF_ENDIAN_BIG ; + } ; + + if (paf_fmt.channels < 1 || paf_fmt.channels > SF_MAX_CHANNELS) + return SFE_PAF_BAD_CHANNELS ; + + psf->datalength = psf->filelength - psf->dataoffset ; + + psf_binheader_readf (psf, "p", (int) psf->dataoffset) ; + + psf->sf.samplerate = paf_fmt.samplerate ; + psf->sf.channels = paf_fmt.channels ; + + /* Only fill in type major. */ + psf->sf.format = SF_FORMAT_PAF ; + + psf_log_printf (psf, "Format : %d => ", paf_fmt.format) ; + + /* PAF is by default big endian. */ + psf->sf.format |= paf_fmt.endianness ? SF_ENDIAN_LITTLE : SF_ENDIAN_BIG ; + + switch (paf_fmt.format) + { case PAF_PCM_S8 : + psf_log_printf (psf, "8 bit linear PCM\n") ; + psf->bytewidth = 1 ; + + psf->sf.format |= SF_FORMAT_PCM_S8 ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + psf->sf.frames = psf->datalength / psf->blockwidth ; + break ; + + case PAF_PCM_16 : + psf_log_printf (psf, "16 bit linear PCM\n") ; + psf->bytewidth = 2 ; + + psf->sf.format |= SF_FORMAT_PCM_16 ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + psf->sf.frames = psf->datalength / psf->blockwidth ; + break ; + + case PAF_PCM_24 : + psf_log_printf (psf, "24 bit linear PCM\n") ; + psf->bytewidth = 3 ; + + psf->sf.format |= SF_FORMAT_PCM_24 ; + + psf->blockwidth = 0 ; + psf->sf.frames = PAF24_SAMPLES_PER_BLOCK * psf->datalength / + (PAF24_BLOCK_SIZE * psf->sf.channels) ; + break ; + + default : psf_log_printf (psf, "Unknown\n") ; + return SFE_PAF_UNKNOWN_FORMAT ; + break ; + } ; + + psf_log_printf (psf, "Source : %d => ", paf_fmt.source) ; + + switch (paf_fmt.source) + { case 1 : psf_log_printf (psf, "Analog Recording\n") ; + break ; + case 2 : psf_log_printf (psf, "Digital Transfer\n") ; + break ; + case 3 : psf_log_printf (psf, "Multi-track Mixdown\n") ; + break ; + case 5 : psf_log_printf (psf, "Audio Resulting From DSP Processing\n") ; + break ; + default : psf_log_printf (psf, "Unknown\n") ; + break ; + } ; + + return 0 ; +} /* paf_read_header */ + +static int +paf_write_header (SF_PRIVATE *psf, int UNUSED (calc_length)) +{ int paf_format ; + + /* PAF header already written so no need to re-write. */ + if (psf_ftell (psf) >= PAF_HEADER_LENGTH) + return 0 ; + + psf->dataoffset = PAF_HEADER_LENGTH ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_PCM_S8 : + paf_format = PAF_PCM_S8 ; + break ; + + case SF_FORMAT_PCM_16 : + paf_format = PAF_PCM_16 ; + break ; + + case SF_FORMAT_PCM_24 : + paf_format = PAF_PCM_24 ; + break ; + + default : return SFE_PAF_UNKNOWN_FORMAT ; + } ; + + /* Reset the current header length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + + if (psf->endian == SF_ENDIAN_BIG) + { /* Marker, version, endianness, samplerate */ + psf_binheader_writef (psf, "Em444", BHWm (PAF_MARKER), BHW4 (0), BHW4 (0), BHW4 (psf->sf.samplerate)) ; + /* format, channels, source */ + psf_binheader_writef (psf, "E444", BHW4 (paf_format), BHW4 (psf->sf.channels), BHW4 (0)) ; + } + else if (psf->endian == SF_ENDIAN_LITTLE) + { /* Marker, version, endianness, samplerate */ + psf_binheader_writef (psf, "em444", BHWm (FAP_MARKER), BHW4 (0), BHW4 (1), BHW4 (psf->sf.samplerate)) ; + /* format, channels, source */ + psf_binheader_writef (psf, "e444", BHW4 (paf_format), BHW4 (psf->sf.channels), BHW4 (0)) ; + } ; + + /* Zero fill to dataoffset. */ + psf_binheader_writef (psf, "z", BHWz ((size_t) (psf->dataoffset - psf->header.indx))) ; + + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + return psf->error ; +} /* paf_write_header */ + +/*=============================================================================== +** 24 bit PAF files have a really weird encoding. +** For a mono file, 10 samples (each being 3 bytes) are packed into a 32 byte +** block. The 8 ints in this 32 byte block are then endian swapped (as ints) +** if necessary before being written to disk. +** For a stereo file, blocks of 10 samples from the same channel are encoded +** into 32 bytes as for the mono case. The 32 byte blocks are then interleaved +** on disk. +** Reading has to reverse the above process :-). +** Weird!!! +** +** The code below attempts to gain efficiency while maintaining readability. +*/ + +static int paf24_read_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24) ; +static int paf24_write_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24) ; +static int paf24_close (SF_PRIVATE *psf) ; + + +static int +paf24_init (SF_PRIVATE *psf) +{ PAF24_PRIVATE *ppaf24 ; + int paf24size ; + + paf24size = sizeof (PAF24_PRIVATE) + psf->sf.channels * + (PAF24_BLOCK_SIZE + PAF24_SAMPLES_PER_BLOCK * sizeof (int)) ; + + /* + ** Not exatly sure why this needs to be here but the tests + ** fail without it. + */ + psf->last_op = 0 ; + + if (! (psf->codec_data = calloc (1, paf24size))) + return SFE_MALLOC_FAILED ; + + ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; + + ppaf24->channels = psf->sf.channels ; + ppaf24->samples = ppaf24->data ; + ppaf24->block = ppaf24->data + PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; + + ppaf24->blocksize = PAF24_BLOCK_SIZE * ppaf24->channels ; + + if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR) + { paf24_read_block (psf, ppaf24) ; /* Read first block. */ + + psf->read_short = paf24_read_s ; + psf->read_int = paf24_read_i ; + psf->read_float = paf24_read_f ; + psf->read_double = paf24_read_d ; + } ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { psf->write_short = paf24_write_s ; + psf->write_int = paf24_write_i ; + psf->write_float = paf24_write_f ; + psf->write_double = paf24_write_d ; + } ; + + psf->seek = paf24_seek ; + psf->container_close = paf24_close ; + + psf->filelength = psf_get_filelen (psf) ; + psf->datalength = psf->filelength - psf->dataoffset ; + + if (psf->datalength % PAF24_BLOCK_SIZE) + { if (psf->file.mode == SFM_READ) + psf_log_printf (psf, "*** Warning : file seems to be truncated.\n") ; + ppaf24->max_blocks = psf->datalength / ppaf24->blocksize + 1 ; + } + else + ppaf24->max_blocks = psf->datalength / ppaf24->blocksize ; + + ppaf24->read_block = 0 ; + if (psf->file.mode == SFM_RDWR) + ppaf24->write_block = ppaf24->max_blocks ; + else + ppaf24->write_block = 0 ; + + psf->sf.frames = PAF24_SAMPLES_PER_BLOCK * ppaf24->max_blocks ; + ppaf24->sample_count = psf->sf.frames ; + + return 0 ; +} /* paf24_init */ + +static sf_count_t +paf24_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) +{ PAF24_PRIVATE *ppaf24 ; + int newblock, newsample ; + + if (psf->codec_data == NULL) + { psf->error = SFE_INTERNAL ; + return PSF_SEEK_ERROR ; + } ; + + ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; + + if (mode == SFM_READ && ppaf24->write_count > 0) + paf24_write_block (psf, ppaf24) ; + + newblock = offset / PAF24_SAMPLES_PER_BLOCK ; + newsample = offset % PAF24_SAMPLES_PER_BLOCK ; + + switch (mode) + { case SFM_READ : + if (psf->last_op == SFM_WRITE && ppaf24->write_count) + paf24_write_block (psf, ppaf24) ; + + psf_fseek (psf, psf->dataoffset + newblock * ppaf24->blocksize, SEEK_SET) ; + ppaf24->read_block = newblock ; + paf24_read_block (psf, ppaf24) ; + ppaf24->read_count = newsample ; + break ; + + case SFM_WRITE : + if (offset > ppaf24->sample_count) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + if (psf->last_op == SFM_WRITE && ppaf24->write_count) + paf24_write_block (psf, ppaf24) ; + + psf_fseek (psf, psf->dataoffset + newblock * ppaf24->blocksize, SEEK_SET) ; + ppaf24->write_block = newblock ; + paf24_read_block (psf, ppaf24) ; + ppaf24->write_count = newsample ; + break ; + + default : + psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + return newblock * PAF24_SAMPLES_PER_BLOCK + newsample ; +} /* paf24_seek */ + +static int +paf24_close (SF_PRIVATE *psf) +{ PAF24_PRIVATE *ppaf24 ; + + if (psf->codec_data == NULL) + return 0 ; + + ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if (ppaf24->write_count > 0) + paf24_write_block (psf, ppaf24) ; + } ; + + return 0 ; +} /* paf24_close */ + +/*--------------------------------------------------------------------------- +*/ +static int +paf24_read_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24) +{ int k, channel ; + unsigned char *cptr ; + + ppaf24->read_block ++ ; + ppaf24->read_count = 0 ; + + if (ppaf24->read_block * PAF24_SAMPLES_PER_BLOCK > ppaf24->sample_count) + { memset (ppaf24->samples, 0, PAF24_SAMPLES_PER_BLOCK * ppaf24->channels) ; + return 1 ; + } ; + + /* Read the block. */ + if ((k = psf_fread (ppaf24->block, 1, ppaf24->blocksize, psf)) != ppaf24->blocksize) + psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, ppaf24->blocksize) ; + + /* Do endian swapping if necessary. */ + if ((CPU_IS_BIG_ENDIAN && psf->endian == SF_ENDIAN_LITTLE) || (CPU_IS_LITTLE_ENDIAN && psf->endian == SF_ENDIAN_BIG)) + endswap_int_array (ppaf24->block, 8 * ppaf24->channels) ; + + /* Unpack block. */ + for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++) + { channel = k % ppaf24->channels ; + cptr = ((unsigned char *) ppaf24->block) + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ; + ppaf24->samples [k] = (cptr [0] << 8) | (cptr [1] << 16) | (((unsigned) cptr [2]) << 24) ; + } ; + + return 1 ; +} /* paf24_read_block */ + +static int +paf24_read (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, int *ptr, int len) +{ int count, total = 0 ; + + while (total < len) + { if (ppaf24->read_block * PAF24_SAMPLES_PER_BLOCK >= ppaf24->sample_count) + { memset (&(ptr [total]), 0, (len - total) * sizeof (int)) ; + return total ; + } ; + + if (ppaf24->read_count >= PAF24_SAMPLES_PER_BLOCK) + paf24_read_block (psf, ppaf24) ; + + count = (PAF24_SAMPLES_PER_BLOCK - ppaf24->read_count) * ppaf24->channels ; + count = (len - total > count) ? count : len - total ; + + memcpy (&(ptr [total]), &(ppaf24->samples [ppaf24->read_count * ppaf24->channels]), count * sizeof (int)) ; + total += count ; + ppaf24->read_count += count / ppaf24->channels ; + } ; + + return total ; +} /* paf24_read */ + +static sf_count_t +paf24_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + PAF24_PRIVATE *ppaf24 ; + int *iptr ; + int k, bufferlen, readcount, count ; + sf_count_t total = 0 ; + + if (psf->codec_data == NULL) + return 0 ; + ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; + + iptr = ubuf.ibuf ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = paf24_read (psf, ppaf24, iptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = iptr [k] >> 16 ; + total += count ; + len -= readcount ; + } ; + return total ; +} /* paf24_read_s */ + +static sf_count_t +paf24_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ PAF24_PRIVATE *ppaf24 ; + int total ; + + if (psf->codec_data == NULL) + return 0 ; + ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; + + total = paf24_read (psf, ppaf24, ptr, len) ; + + return total ; +} /* paf24_read_i */ + +static sf_count_t +paf24_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + PAF24_PRIVATE *ppaf24 ; + int *iptr ; + int k, bufferlen, readcount, count ; + sf_count_t total = 0 ; + float normfact ; + + if (psf->codec_data == NULL) + return 0 ; + ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_float == SF_TRUE) ? (1.0 / 0x80000000) : (1.0 / 0x100) ; + + iptr = ubuf.ibuf ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = paf24_read (psf, ppaf24, iptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * iptr [k] ; + total += count ; + len -= readcount ; + } ; + return total ; +} /* paf24_read_f */ + +static sf_count_t +paf24_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + PAF24_PRIVATE *ppaf24 ; + int *iptr ; + int k, bufferlen, readcount, count ; + sf_count_t total = 0 ; + double normfact ; + + if (psf->codec_data == NULL) + return 0 ; + ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_double == SF_TRUE) ? (1.0 / 0x80000000) : (1.0 / 0x100) ; + + iptr = ubuf.ibuf ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = paf24_read (psf, ppaf24, iptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * iptr [k] ; + total += count ; + len -= readcount ; + } ; + return total ; +} /* paf24_read_d */ + +/*--------------------------------------------------------------------------- +*/ + +static int +paf24_write_block (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24) +{ int k, nextsample, channel ; + unsigned char *cptr ; + + /* First pack block. */ + + if (CPU_IS_LITTLE_ENDIAN) + { for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++) + { channel = k % ppaf24->channels ; + cptr = ((unsigned char *) ppaf24->block) + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ; + nextsample = ppaf24->samples [k] >> 8 ; + cptr [0] = nextsample ; + cptr [1] = nextsample >> 8 ; + cptr [2] = nextsample >> 16 ; + } ; + + /* Do endian swapping if necessary. */ + if (psf->endian == SF_ENDIAN_BIG) + endswap_int_array (ppaf24->block, 8 * ppaf24->channels) ; + } + else if (CPU_IS_BIG_ENDIAN) + { /* This is correct. */ + for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++) + { channel = k % ppaf24->channels ; + cptr = ((unsigned char *) ppaf24->block) + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ; + nextsample = ppaf24->samples [k] >> 8 ; + cptr [0] = nextsample ; + cptr [1] = nextsample >> 8 ; + cptr [2] = nextsample >> 16 ; + } ; + if (psf->endian == SF_ENDIAN_LITTLE) + endswap_int_array (ppaf24->block, 8 * ppaf24->channels) ; + } ; + + /* Write block to disk. */ + if ((k = psf_fwrite (ppaf24->block, 1, ppaf24->blocksize, psf)) != ppaf24->blocksize) + psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, ppaf24->blocksize) ; + + if (ppaf24->sample_count < ppaf24->write_block * PAF24_SAMPLES_PER_BLOCK + ppaf24->write_count) + ppaf24->sample_count = ppaf24->write_block * PAF24_SAMPLES_PER_BLOCK + ppaf24->write_count ; + + if (ppaf24->write_count == PAF24_SAMPLES_PER_BLOCK) + { ppaf24->write_block ++ ; + ppaf24->write_count = 0 ; + } ; + + return 1 ; +} /* paf24_write_block */ + +static int +paf24_write (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, const int *ptr, int len) +{ int count, total = 0 ; + + while (total < len) + { count = (PAF24_SAMPLES_PER_BLOCK - ppaf24->write_count) * ppaf24->channels ; + + if (count > len - total) + count = len - total ; + + memcpy (&(ppaf24->samples [ppaf24->write_count * ppaf24->channels]), &(ptr [total]), count * sizeof (int)) ; + total += count ; + ppaf24->write_count += count / ppaf24->channels ; + + if (ppaf24->write_count >= PAF24_SAMPLES_PER_BLOCK) + paf24_write_block (psf, ppaf24) ; + } ; + + return total ; +} /* paf24_write */ + +static sf_count_t +paf24_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + PAF24_PRIVATE *ppaf24 ; + int *iptr ; + int k, bufferlen, writecount = 0, count ; + sf_count_t total = 0 ; + + if (psf->codec_data == NULL) + return 0 ; + ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; + + iptr = ubuf.ibuf ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + iptr [k] = ptr [total + k] << 16 ; + count = paf24_write (psf, ppaf24, iptr, writecount) ; + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + return total ; +} /* paf24_write_s */ + +static sf_count_t +paf24_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ PAF24_PRIVATE *ppaf24 ; + int writecount, count ; + sf_count_t total = 0 ; + + if (psf->codec_data == NULL) + return 0 ; + ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; + + while (len > 0) + { writecount = (len > 0x10000000) ? 0x10000000 : (int) len ; + + count = paf24_write (psf, ppaf24, ptr, writecount) ; + + total += count ; + len -= count ; + if (count != writecount) + break ; + } ; + + return total ; +} /* paf24_write_i */ + +static sf_count_t +paf24_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + PAF24_PRIVATE *ppaf24 ; + int *iptr ; + int k, bufferlen, writecount = 0, count ; + sf_count_t total = 0 ; + float normfact ; + + if (psf->codec_data == NULL) + return 0 ; + ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : (1.0 / 0x100) ; + + iptr = ubuf.ibuf ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + iptr [k] = psf_lrintf (normfact * ptr [total + k]) ; + count = paf24_write (psf, ppaf24, iptr, writecount) ; + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + + return total ; +} /* paf24_write_f */ + +static sf_count_t +paf24_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + PAF24_PRIVATE *ppaf24 ; + int *iptr ; + int k, bufferlen, writecount = 0, count ; + sf_count_t total = 0 ; + double normfact ; + + if (psf->codec_data == NULL) + return 0 ; + ppaf24 = (PAF24_PRIVATE*) psf->codec_data ; + + normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFFFFFF) : (1.0 / 0x100) ; + + iptr = ubuf.ibuf ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + iptr [k] = psf_lrint (normfact * ptr [total+k]) ; + count = paf24_write (psf, ppaf24, iptr, writecount) ; + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + + return total ; +} /* paf24_write_d */ + diff --git a/libsndfile-1.0.31/src/pcm.c b/libsndfile-1.0.31/src/pcm.c new file mode 100644 index 0000000..3ea0d09 --- /dev/null +++ b/libsndfile-1.0.31/src/pcm.c @@ -0,0 +1,2893 @@ +/* +** Copyright (C) 1999-2016 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +/* Need to be able to handle 3 byte (24 bit) integers. So defined a +** type and use SIZEOF_TRIBYTE instead of (tribyte). +*/ + +typedef struct tribyte +{ uint8_t bytes [3] ; + } tribyte ; + +#define SIZEOF_TRIBYTE 3 + +static sf_count_t pcm_read_sc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t pcm_read_uc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t pcm_read_les2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t pcm_read_let2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; + +static sf_count_t pcm_read_sc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t pcm_read_uc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t pcm_read_les2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t pcm_read_let2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; + +static sf_count_t pcm_read_sc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t pcm_read_uc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t pcm_read_bes2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t pcm_read_les2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t pcm_read_bet2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t pcm_read_let2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t pcm_read_bei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t pcm_read_lei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; + +static sf_count_t pcm_read_sc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; +static sf_count_t pcm_read_uc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; +static sf_count_t pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; +static sf_count_t pcm_read_les2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; +static sf_count_t pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; +static sf_count_t pcm_read_let2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; +static sf_count_t pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; +static sf_count_t pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t pcm_write_s2sc (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t pcm_write_s2uc (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t pcm_write_s2bes (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t pcm_write_s2les (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t pcm_write_s2bet (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t pcm_write_s2let (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t pcm_write_s2bei (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t pcm_write_s2lei (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; + +static sf_count_t pcm_write_i2sc (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t pcm_write_i2uc (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t pcm_write_i2bes (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t pcm_write_i2les (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t pcm_write_i2bet (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t pcm_write_i2let (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t pcm_write_i2bei (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t pcm_write_i2lei (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; + +static sf_count_t pcm_write_f2sc (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t pcm_write_f2uc (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t pcm_write_f2bes (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t pcm_write_f2les (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t pcm_write_f2bet (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t pcm_write_f2let (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t pcm_write_f2bei (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t pcm_write_f2lei (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; + +static sf_count_t pcm_write_d2sc (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; +static sf_count_t pcm_write_d2uc (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; +static sf_count_t pcm_write_d2bes (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; +static sf_count_t pcm_write_d2les (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; +static sf_count_t pcm_write_d2bet (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; +static sf_count_t pcm_write_d2let (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; +static sf_count_t pcm_write_d2bei (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; +static sf_count_t pcm_write_d2lei (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +/*----------------------------------------------------------------------------------------------- +*/ + +enum +{ /* Char type for 8 bit files. */ + SF_CHARS_SIGNED = 200, + SF_CHARS_UNSIGNED = 201 +} ; + +/*----------------------------------------------------------------------------------------------- +*/ + +int +pcm_init (SF_PRIVATE *psf) +{ int chars = 0 ; + + if (psf->bytewidth == 0 || psf->sf.channels == 0) + { psf_log_printf (psf, "pcm_init : internal error : bytewitdh = %d, channels = %d\n", psf->bytewidth, psf->sf.channels) ; + return SFE_INTERNAL ; + } ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + + if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_PCM_S8) + chars = SF_CHARS_SIGNED ; + else if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_PCM_U8) + chars = SF_CHARS_UNSIGNED ; + + if (CPU_IS_BIG_ENDIAN) + psf->data_endswap = (psf->endian == SF_ENDIAN_BIG) ? SF_FALSE : SF_TRUE ; + else + psf->data_endswap = (psf->endian == SF_ENDIAN_LITTLE) ? SF_FALSE : SF_TRUE ; + + if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR) + { switch (psf->bytewidth * 0x10000 + psf->endian + chars) + { case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_SIGNED) : + case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_SIGNED) : + psf->read_short = pcm_read_sc2s ; + psf->read_int = pcm_read_sc2i ; + psf->read_float = pcm_read_sc2f ; + psf->read_double = pcm_read_sc2d ; + break ; + case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_UNSIGNED) : + case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_UNSIGNED) : + psf->read_short = pcm_read_uc2s ; + psf->read_int = pcm_read_uc2i ; + psf->read_float = pcm_read_uc2f ; + psf->read_double = pcm_read_uc2d ; + break ; + + case (2 * 0x10000 + SF_ENDIAN_BIG) : + psf->read_short = pcm_read_bes2s ; + psf->read_int = pcm_read_bes2i ; + psf->read_float = pcm_read_bes2f ; + psf->read_double = pcm_read_bes2d ; + break ; + case (3 * 0x10000 + SF_ENDIAN_BIG) : + psf->read_short = pcm_read_bet2s ; + psf->read_int = pcm_read_bet2i ; + psf->read_float = pcm_read_bet2f ; + psf->read_double = pcm_read_bet2d ; + break ; + case (4 * 0x10000 + SF_ENDIAN_BIG) : + + psf->read_short = pcm_read_bei2s ; + psf->read_int = pcm_read_bei2i ; + psf->read_float = pcm_read_bei2f ; + psf->read_double = pcm_read_bei2d ; + break ; + + case (2 * 0x10000 + SF_ENDIAN_LITTLE) : + psf->read_short = pcm_read_les2s ; + psf->read_int = pcm_read_les2i ; + psf->read_float = pcm_read_les2f ; + psf->read_double = pcm_read_les2d ; + break ; + case (3 * 0x10000 + SF_ENDIAN_LITTLE) : + psf->read_short = pcm_read_let2s ; + psf->read_int = pcm_read_let2i ; + psf->read_float = pcm_read_let2f ; + psf->read_double = pcm_read_let2d ; + break ; + case (4 * 0x10000 + SF_ENDIAN_LITTLE) : + psf->read_short = pcm_read_lei2s ; + psf->read_int = pcm_read_lei2i ; + psf->read_float = pcm_read_lei2f ; + psf->read_double = pcm_read_lei2d ; + break ; + default : + psf_log_printf (psf, "pcm.c returning SFE_UNIMPLEMENTED\nbytewidth %d endian %d\n", psf->bytewidth, psf->endian) ; + return SFE_UNIMPLEMENTED ; + } ; + } ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { switch (psf->bytewidth * 0x10000 + psf->endian + chars) + { case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_SIGNED) : + case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_SIGNED) : + psf->write_short = pcm_write_s2sc ; + psf->write_int = pcm_write_i2sc ; + psf->write_float = pcm_write_f2sc ; + psf->write_double = pcm_write_d2sc ; + break ; + case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_UNSIGNED) : + case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_UNSIGNED) : + psf->write_short = pcm_write_s2uc ; + psf->write_int = pcm_write_i2uc ; + psf->write_float = pcm_write_f2uc ; + psf->write_double = pcm_write_d2uc ; + break ; + + case (2 * 0x10000 + SF_ENDIAN_BIG) : + psf->write_short = pcm_write_s2bes ; + psf->write_int = pcm_write_i2bes ; + psf->write_float = pcm_write_f2bes ; + psf->write_double = pcm_write_d2bes ; + break ; + + case (3 * 0x10000 + SF_ENDIAN_BIG) : + psf->write_short = pcm_write_s2bet ; + psf->write_int = pcm_write_i2bet ; + psf->write_float = pcm_write_f2bet ; + psf->write_double = pcm_write_d2bet ; + break ; + + case (4 * 0x10000 + SF_ENDIAN_BIG) : + psf->write_short = pcm_write_s2bei ; + psf->write_int = pcm_write_i2bei ; + psf->write_float = pcm_write_f2bei ; + psf->write_double = pcm_write_d2bei ; + break ; + + case (2 * 0x10000 + SF_ENDIAN_LITTLE) : + psf->write_short = pcm_write_s2les ; + psf->write_int = pcm_write_i2les ; + psf->write_float = pcm_write_f2les ; + psf->write_double = pcm_write_d2les ; + break ; + + case (3 * 0x10000 + SF_ENDIAN_LITTLE) : + psf->write_short = pcm_write_s2let ; + psf->write_int = pcm_write_i2let ; + psf->write_float = pcm_write_f2let ; + psf->write_double = pcm_write_d2let ; + break ; + + case (4 * 0x10000 + SF_ENDIAN_LITTLE) : + psf->write_short = pcm_write_s2lei ; + psf->write_int = pcm_write_i2lei ; + psf->write_float = pcm_write_f2lei ; + psf->write_double = pcm_write_d2lei ; + break ; + + default : + psf_log_printf (psf, "pcm.c returning SFE_UNIMPLEMENTED\nbytewidth %d endian %d\n", psf->bytewidth, psf->endian) ; + return SFE_UNIMPLEMENTED ; + } ; + + } ; + + if (psf->filelength > psf->dataoffset) + { psf->datalength = (psf->dataend > 0) ? psf->dataend - psf->dataoffset : + psf->filelength - psf->dataoffset ; + } + else + psf->datalength = 0 ; + + psf->sf.frames = psf->blockwidth > 0 ? psf->datalength / psf->blockwidth : 0 ; + + return 0 ; +} /* pcm_init */ + +/*============================================================================== +*/ + +static inline void +sc2s_array (const signed char *src, int count, short *dest) +{ while (--count >= 0) + { dest [count] = ((uint16_t) src [count]) << 8 ; + } ; +} /* sc2s_array */ + +static inline void +uc2s_array (const unsigned char *src, int count, short *dest) +{ while (--count >= 0) + { dest [count] = (((uint32_t) src [count]) - 0x80) << 8 ; + } ; +} /* uc2s_array */ + +static inline void +let2s_array (const tribyte *src, int count, short *dest) +{ while (--count >= 0) + dest [count] = LET2H_16_PTR (src [count].bytes) ; +} /* let2s_array */ + +static inline void +bet2s_array (const tribyte *src, int count, short *dest) +{ while (--count >= 0) + dest [count] = BET2H_16_PTR (src [count].bytes) ; +} /* bet2s_array */ + +static inline void +lei2s_array (const int *src, int count, short *dest) +{ int value ; + + while (--count >= 0) + { value = LE2H_32 (src [count]) ; + dest [count] = value >> 16 ; + } ; +} /* lei2s_array */ + +static inline void +bei2s_array (const int *src, int count, short *dest) +{ int value ; + + while (--count >= 0) + { value = BE2H_32 (src [count]) ; + dest [count] = value >> 16 ; + } ; +} /* bei2s_array */ + +/*-------------------------------------------------------------------------- +*/ + +static inline void +sc2i_array (const signed char *src, int count, int *dest) +{ while (--count >= 0) + { dest [count] = arith_shift_left ((int) src [count], 24) ; + } ; +} /* sc2i_array */ + +static inline void +uc2i_array (const unsigned char *src, int count, int *dest) +{ while (--count >= 0) + { dest [count] = arith_shift_left (((int) src [count]) - 128, 24) ; + } ; +} /* uc2i_array */ + +static inline void +bes2i_array (const short *src, int count, int *dest) +{ short value ; + + while (--count >= 0) + { value = BE2H_16 (src [count]) ; + dest [count] = arith_shift_left (value, 16) ; + } ; +} /* bes2i_array */ + +static inline void +les2i_array (const short *src, int count, int *dest) +{ short value ; + + while (--count >= 0) + { value = LE2H_16 (src [count]) ; + dest [count] = arith_shift_left (value, 16) ; + } ; +} /* les2i_array */ + +static inline void +bet2i_array (const tribyte *src, int count, int *dest) +{ while (--count >= 0) + dest [count] = psf_get_be24 (src [count].bytes, 0) ; +} /* bet2i_array */ + +static inline void +let2i_array (const tribyte *src, int count, int *dest) +{ while (--count >= 0) + dest [count] = psf_get_le24 (src [count].bytes, 0) ; +} /* let2i_array */ + +/*-------------------------------------------------------------------------- +*/ + +static inline void +sc2f_array (const signed char *src, int count, float *dest, float normfact) +{ while (--count >= 0) + dest [count] = ((float) src [count]) * normfact ; +} /* sc2f_array */ + +static inline void +uc2f_array (const unsigned char *src, int count, float *dest, float normfact) +{ while (--count >= 0) + dest [count] = (((int) src [count]) - 128) * normfact ; +} /* uc2f_array */ + +static inline void +les2f_array (const short *src, int count, float *dest, float normfact) +{ short value ; + + while (--count >= 0) + { value = src [count] ; + value = LE2H_16 (value) ; + dest [count] = ((float) value) * normfact ; + } ; +} /* les2f_array */ + +static inline void +bes2f_array (const short *src, int count, float *dest, float normfact) +{ short value ; + + while (--count >= 0) + { value = src [count] ; + value = BE2H_16 (value) ; + dest [count] = ((float) value) * normfact ; + } ; +} /* bes2f_array */ + +static inline void +let2f_array (const tribyte *src, int count, float *dest, float normfact) +{ int value ; + + while (--count >= 0) + { value = psf_get_le24 (src [count].bytes, 0) ; + dest [count] = ((float) value) * normfact ; + } ; +} /* let2f_array */ + +static inline void +bet2f_array (const tribyte *src, int count, float *dest, float normfact) +{ int value ; + + while (--count >= 0) + { value = psf_get_be24 (src [count].bytes, 0) ; + dest [count] = ((float) value) * normfact ; + } ; +} /* bet2f_array */ + +static inline void +lei2f_array (const int *src, int count, float *dest, float normfact) +{ int value ; + + while (--count >= 0) + { value = src [count] ; + value = LE2H_32 (value) ; + dest [count] = ((float) value) * normfact ; + } ; +} /* lei2f_array */ + +static inline void +bei2f_array (const int *src, int count, float *dest, float normfact) +{ int value ; + + while (--count >= 0) + { value = src [count] ; + value = BE2H_32 (value) ; + dest [count] = ((float) value) * normfact ; + } ; +} /* bei2f_array */ + +/*-------------------------------------------------------------------------- +*/ + +static inline void +sc2d_array (const signed char *src, int count, double *dest, double normfact) +{ while (--count >= 0) + dest [count] = ((double) src [count]) * normfact ; +} /* sc2d_array */ + +static inline void +uc2d_array (const unsigned char *src, int count, double *dest, double normfact) +{ while (--count >= 0) + dest [count] = (((int) src [count]) - 128) * normfact ; +} /* uc2d_array */ + +static inline void +les2d_array (const short *src, int count, double *dest, double normfact) +{ short value ; + + while (--count >= 0) + { value = src [count] ; + value = LE2H_16 (value) ; + dest [count] = ((double) value) * normfact ; + } ; +} /* les2d_array */ + +static inline void +bes2d_array (const short *src, int count, double *dest, double normfact) +{ short value ; + + while (--count >= 0) + { value = src [count] ; + value = BE2H_16 (value) ; + dest [count] = ((double) value) * normfact ; + } ; +} /* bes2d_array */ + +static inline void +let2d_array (const tribyte *src, int count, double *dest, double normfact) +{ int value ; + + while (--count >= 0) + { value = psf_get_le24 (src [count].bytes, 0) ; + dest [count] = ((double) value) * normfact ; + } ; +} /* let2d_array */ + +static inline void +bet2d_array (const tribyte *src, int count, double *dest, double normfact) +{ int value ; + + while (--count >= 0) + { value = psf_get_be24 (src [count].bytes, 0) ; + dest [count] = ((double) value) * normfact ; + } ; +} /* bet2d_array */ + +static inline void +lei2d_array (const int *src, int count, double *dest, double normfact) +{ int value ; + + while (--count >= 0) + { value = src [count] ; + value = LE2H_32 (value) ; + dest [count] = ((double) value) * normfact ; + } ; +} /* lei2d_array */ + +static inline void +bei2d_array (const int *src, int count, double *dest, double normfact) +{ int value ; + + while (--count >= 0) + { value = src [count] ; + value = BE2H_32 (value) ; + dest [count] = ((double) value) * normfact ; + } ; +} /* bei2d_array */ + +/*-------------------------------------------------------------------------- +*/ + +static inline void +s2sc_array (const short *src, signed char *dest, int count) +{ while (--count >= 0) + dest [count] = src [count] >> 8 ; +} /* s2sc_array */ + +static inline void +s2uc_array (const short *src, unsigned char *dest, int count) +{ while (--count >= 0) + dest [count] = (src [count] >> 8) + 0x80 ; +} /* s2uc_array */ + +static inline void +s2let_array (const short *src, tribyte *dest, int count) +{ while (--count >= 0) + { dest [count].bytes [0] = 0 ; + dest [count].bytes [1] = src [count] ; + dest [count].bytes [2] = src [count] >> 8 ; + } ; +} /* s2let_array */ + +static inline void +s2bet_array (const short *src, tribyte *dest, int count) +{ while (--count >= 0) + { dest [count].bytes [2] = 0 ; + dest [count].bytes [1] = src [count] ; + dest [count].bytes [0] = src [count] >> 8 ; + } ; +} /* s2bet_array */ + +static inline void +s2lei_array (const short *src, int *dest, int count) +{ unsigned char *ucptr ; + + ucptr = ((unsigned char*) dest) + 4 * count ; + while (--count >= 0) + { ucptr -= 4 ; + ucptr [0] = 0 ; + ucptr [1] = 0 ; + ucptr [2] = src [count] ; + ucptr [3] = src [count] >> 8 ; + } ; +} /* s2lei_array */ + +static inline void +s2bei_array (const short *src, int *dest, int count) +{ unsigned char *ucptr ; + + ucptr = ((unsigned char*) dest) + 4 * count ; + while (--count >= 0) + { ucptr -= 4 ; + ucptr [0] = src [count] >> 8 ; + ucptr [1] = src [count] ; + ucptr [2] = 0 ; + ucptr [3] = 0 ; + } ; +} /* s2bei_array */ + +/*-------------------------------------------------------------------------- +*/ + +static inline void +i2sc_array (const int *src, signed char *dest, int count) +{ while (--count >= 0) + dest [count] = (src [count] >> 24) ; +} /* i2sc_array */ + +static inline void +i2uc_array (const int *src, unsigned char *dest, int count) +{ while (--count >= 0) + dest [count] = ((src [count] >> 24) + 128) ; +} /* i2uc_array */ + +static inline void +i2bes_array (const int *src, short *dest, int count) +{ unsigned char *ucptr ; + + ucptr = ((unsigned char*) dest) + 2 * count ; + while (--count >= 0) + { ucptr -= 2 ; + ucptr [0] = src [count] >> 24 ; + ucptr [1] = src [count] >> 16 ; + } ; +} /* i2bes_array */ + +static inline void +i2les_array (const int *src, short *dest, int count) +{ unsigned char *ucptr ; + + ucptr = ((unsigned char*) dest) + 2 * count ; + while (--count >= 0) + { ucptr -= 2 ; + ucptr [0] = src [count] >> 16 ; + ucptr [1] = src [count] >> 24 ; + } ; +} /* i2les_array */ + +static inline void +i2let_array (const int *src, tribyte *dest, int count) +{ int value ; + + while (--count >= 0) + { value = src [count] >> 8 ; + dest [count].bytes [0] = value ; + dest [count].bytes [1] = value >> 8 ; + dest [count].bytes [2] = value >> 16 ; + } ; +} /* i2let_array */ + +static inline void +i2bet_array (const int *src, tribyte *dest, int count) +{ int value ; + + while (--count >= 0) + { value = src [count] >> 8 ; + dest [count].bytes [2] = value ; + dest [count].bytes [1] = value >> 8 ; + dest [count].bytes [0] = value >> 16 ; + } ; +} /* i2bet_array */ + +/*=============================================================================================== +*/ + +static sf_count_t +pcm_read_sc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.scbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; + sc2s_array (ubuf.scbuf, readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_sc2s */ + +static sf_count_t +pcm_read_uc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ; + uc2s_array (ubuf.ucbuf, readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_uc2s */ + +static sf_count_t +pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ int total ; + + total = psf_fread (ptr, sizeof (short), len, psf) ; + if (CPU_IS_LITTLE_ENDIAN) + endswap_short_array (ptr, len) ; + + return total ; +} /* pcm_read_bes2s */ + +static sf_count_t +pcm_read_les2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ int total ; + + total = psf_fread (ptr, sizeof (short), len, psf) ; + if (CPU_IS_BIG_ENDIAN) + endswap_short_array (ptr, len) ; + + return total ; +} /* pcm_read_les2s */ + +static sf_count_t +pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; + bet2s_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_bet2s */ + +static sf_count_t +pcm_read_let2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; + let2s_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_let2s */ + +static sf_count_t +pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ibuf, sizeof (int), bufferlen, psf) ; + bei2s_array (ubuf.ibuf, readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_bei2s */ + +static sf_count_t +pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ibuf, sizeof (int), bufferlen, psf) ; + lei2s_array (ubuf.ibuf, readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_lei2s */ + +/*----------------------------------------------------------------------------------------------- +*/ + +static sf_count_t +pcm_read_sc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.scbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; + sc2i_array (ubuf.scbuf, readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_sc2i */ + +static sf_count_t +pcm_read_uc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ; + uc2i_array (ubuf.ucbuf, readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_uc2i */ + +static sf_count_t +pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + bes2i_array (ubuf.sbuf, readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_bes2i */ + +static sf_count_t +pcm_read_les2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + les2i_array (ubuf.sbuf, readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_les2i */ + +static sf_count_t +pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; + bet2i_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_bet2i */ + +static sf_count_t +pcm_read_let2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; + let2i_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_let2i */ + +static sf_count_t +pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ int total ; + + total = psf_fread (ptr, sizeof (int), len, psf) ; + if (CPU_IS_LITTLE_ENDIAN) + endswap_int_array (ptr, len) ; + + return total ; +} /* pcm_read_bei2i */ + +static sf_count_t +pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ int total ; + + total = psf_fread (ptr, sizeof (int), len, psf) ; + if (CPU_IS_BIG_ENDIAN) + endswap_int_array (ptr, len) ; + + return total ; +} /* pcm_read_lei2i */ + +/*----------------------------------------------------------------------------------------------- +*/ + +static sf_count_t +pcm_read_sc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + float normfact ; + + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.scbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; + sc2f_array (ubuf.scbuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_sc2f */ + +static sf_count_t +pcm_read_uc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + float normfact ; + + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ; + uc2f_array (ubuf.ucbuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_uc2f */ + +static sf_count_t +pcm_read_bes2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + float normfact ; + + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + bes2f_array (ubuf.sbuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_bes2f */ + +static sf_count_t +pcm_read_les2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + float normfact ; + + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + les2f_array (ubuf.sbuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_les2f */ + +static sf_count_t +pcm_read_bet2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + float normfact ; + + /* Special normfactor because tribyte value is read into an int. */ + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 / 256.0 ; + + bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; + bet2f_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_bet2f */ + +static sf_count_t +pcm_read_let2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + float normfact ; + + /* Special normfactor because tribyte value is read into an int. */ + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 / 256.0 ; + + bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; + let2f_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_let2f */ + +static sf_count_t +pcm_read_bei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + float normfact ; + + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ibuf, sizeof (int), bufferlen, psf) ; + bei2f_array (ubuf.ibuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_bei2f */ + +static sf_count_t +pcm_read_lei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + float normfact ; + + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ibuf, sizeof (int), bufferlen, psf) ; + lei2f_array (ubuf.ibuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_lei2f */ + +/*----------------------------------------------------------------------------------------------- +*/ + +static sf_count_t +pcm_read_sc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + double normfact ; + + normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.scbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; + sc2d_array (ubuf.scbuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_sc2d */ + +static sf_count_t +pcm_read_uc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + double normfact ; + + normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ; + uc2d_array (ubuf.ucbuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_uc2d */ + +static sf_count_t +pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + double normfact ; + + normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + bes2d_array (ubuf.sbuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_bes2d */ + +static sf_count_t +pcm_read_les2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + double normfact ; + + normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + les2d_array (ubuf.sbuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_les2d */ + +static sf_count_t +pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + double normfact ; + + normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 / 256.0 ; + + bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; + bet2d_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_bet2d */ + +static sf_count_t +pcm_read_let2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + double normfact ; + + /* Special normfactor because tribyte value is read into an int. */ + normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 / 256.0 ; + + bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; + let2d_array ((tribyte*) (ubuf.ucbuf), readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_let2d */ + +static sf_count_t +pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + double normfact ; + + normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ibuf, sizeof (int), bufferlen, psf) ; + bei2d_array (ubuf.ibuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_bei2d */ + +static sf_count_t +pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + double normfact ; + + normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ibuf, sizeof (int), bufferlen, psf) ; + lei2d_array (ubuf.ibuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* pcm_read_lei2d */ + +/*=============================================================================================== +**----------------------------------------------------------------------------------------------- +**=============================================================================================== +*/ + +static sf_count_t +pcm_write_s2sc (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.scbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + s2sc_array (ptr + total, ubuf.scbuf, bufferlen) ; + writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_s2sc */ + +static sf_count_t +pcm_write_s2uc (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + s2uc_array (ptr + total, ubuf.ucbuf, bufferlen) ; + writecount = psf_fwrite (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_s2uc */ + +static sf_count_t +pcm_write_s2bes (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + if (CPU_IS_BIG_ENDIAN) + return psf_fwrite (ptr, sizeof (short), len, psf) ; + else + + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + endswap_short_copy (ubuf.sbuf, ptr + total, bufferlen) ; + writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_s2bes */ + +static sf_count_t +pcm_write_s2les (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + if (CPU_IS_LITTLE_ENDIAN) + return psf_fwrite (ptr, sizeof (short), len, psf) ; + + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + endswap_short_copy (ubuf.sbuf, ptr + total, bufferlen) ; + writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_s2les */ + +static sf_count_t +pcm_write_s2bet (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + s2bet_array (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen) ; + writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_s2bet */ + +static sf_count_t +pcm_write_s2let (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + s2let_array (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen) ; + writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_s2let */ + +static sf_count_t +pcm_write_s2bei (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + s2bei_array (ptr + total, ubuf.ibuf, bufferlen) ; + writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_s2bei */ + +static sf_count_t +pcm_write_s2lei (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + s2lei_array (ptr + total, ubuf.ibuf, bufferlen) ; + writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_s2lei */ + +/*----------------------------------------------------------------------------------------------- +*/ + +static sf_count_t +pcm_write_i2sc (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.scbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + i2sc_array (ptr + total, ubuf.scbuf, bufferlen) ; + writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_i2sc */ + +static sf_count_t +pcm_write_i2uc (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + i2uc_array (ptr + total, ubuf.ucbuf, bufferlen) ; + writecount = psf_fwrite (ubuf.ucbuf, sizeof (signed char), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_i2uc */ + +static sf_count_t +pcm_write_i2bes (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + i2bes_array (ptr + total, ubuf.sbuf, bufferlen) ; + writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_i2bes */ + +static sf_count_t +pcm_write_i2les (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + i2les_array (ptr + total, ubuf.sbuf, bufferlen) ; + writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_i2les */ + +static sf_count_t +pcm_write_i2bet (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + i2bet_array (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen) ; + writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_i2bet */ + +static sf_count_t +pcm_write_i2let (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + i2let_array (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen) ; + writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_i2les */ + +static sf_count_t +pcm_write_i2bei (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + if (CPU_IS_BIG_ENDIAN) + return psf_fwrite (ptr, sizeof (int), len, psf) ; + + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + endswap_int_copy (ubuf.ibuf, ptr + total, bufferlen) ; + writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_i2bei */ + +static sf_count_t +pcm_write_i2lei (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + if (CPU_IS_LITTLE_ENDIAN) + return psf_fwrite (ptr, sizeof (int), len, psf) ; + + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + endswap_int_copy (ubuf.ibuf, ptr + total, bufferlen) ; + writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_i2lei */ + +/*------------------------------------------------------------------------------ +**============================================================================== +**------------------------------------------------------------------------------ +*/ + +static void +f2sc_array (const float *src, signed char *dest, int count, int normalize) +{ float normfact ; + + normfact = normalize ? (1.0 * 0x7F) : 1.0 ; + + while (--count >= 0) + { dest [count] = psf_lrintf (src [count] * normfact) ; + } ; +} /* f2sc_array */ + +static void +f2sc_clip_array (const float *src, signed char *dest, int count, int normalize) +{ float normfact, scaled_value ; + + normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x1000000) ; + + while (--count >= 0) + { scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) + { dest [count] = 127 ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) + { dest [count] = -128 ; + continue ; + } ; + + dest [count] = psf_lrintf (scaled_value) >> 24 ; + } ; +} /* f2sc_clip_array */ + +static sf_count_t +pcm_write_f2sc (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const float *, signed char *, int, int) ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + convert = (psf->add_clipping) ? f2sc_clip_array : f2sc_array ; + bufferlen = ARRAY_LEN (ubuf.scbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + convert (ptr + total, ubuf.scbuf, bufferlen, psf->norm_float) ; + writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_f2sc */ + +/*============================================================================== +*/ + +static void +f2uc_array (const float *src, unsigned char *dest, int count, int normalize) +{ float normfact ; + + normfact = normalize ? (1.0 * 0x7F) : 1.0 ; + + while (--count >= 0) + { dest [count] = psf_lrintf (src [count] * normfact) + 128 ; + } ; +} /* f2uc_array */ + +static void +f2uc_clip_array (const float *src, unsigned char *dest, int count, int normalize) +{ float normfact, scaled_value ; + + normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x1000000) ; + + while (--count >= 0) + { scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) + { dest [count] = 0xFF ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) + { dest [count] = 0 ; + continue ; + } ; + + dest [count] = (psf_lrintf (scaled_value) >> 24) + 128 ; + } ; +} /* f2uc_clip_array */ + +static sf_count_t +pcm_write_f2uc (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const float *, unsigned char *, int, int) ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + convert = (psf->add_clipping) ? f2uc_clip_array : f2uc_array ; + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + convert (ptr + total, ubuf.ucbuf, bufferlen, psf->norm_float) ; + writecount = psf_fwrite (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_f2uc */ + +/*============================================================================== +*/ + +static void +f2bes_array (const float *src, short *dest, int count, int normalize) +{ unsigned char *ucptr ; + float normfact ; + short value ; + + normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ; + ucptr = ((unsigned char*) dest) + 2 * count ; + + while (--count >= 0) + { ucptr -= 2 ; + value = psf_lrintf (src [count] * normfact) ; + ucptr [1] = value ; + ucptr [0] = value >> 8 ; + } ; +} /* f2bes_array */ + +static void +f2bes_clip_array (const float *src, short *dest, int count, int normalize) +{ unsigned char *ucptr ; + float normfact, scaled_value ; + int value ; + + normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x10000) ; + ucptr = ((unsigned char*) dest) + 2 * count ; + + while (--count >= 0) + { ucptr -= 2 ; + scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) + { ucptr [1] = 0xFF ; + ucptr [0] = 0x7F ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) + { ucptr [1] = 0x00 ; + ucptr [0] = 0x80 ; + continue ; + } ; + + value = psf_lrintf (scaled_value) ; + ucptr [1] = value >> 16 ; + ucptr [0] = value >> 24 ; + } ; +} /* f2bes_clip_array */ + +static sf_count_t +pcm_write_f2bes (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const float *, short *t, int, int) ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + convert = (psf->add_clipping) ? f2bes_clip_array : f2bes_array ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + convert (ptr + total, ubuf.sbuf, bufferlen, psf->norm_float) ; + writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_f2bes */ + +/*============================================================================== +*/ + +static void +f2les_array (const float *src, short *dest, int count, int normalize) +{ unsigned char *ucptr ; + float normfact ; + int value ; + + normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ; + ucptr = ((unsigned char*) dest) + 2 * count ; + + while (--count >= 0) + { ucptr -= 2 ; + value = psf_lrintf (src [count] * normfact) ; + ucptr [0] = value ; + ucptr [1] = value >> 8 ; + } ; +} /* f2les_array */ + +static void +f2les_clip_array (const float *src, short *dest, int count, int normalize) +{ unsigned char *ucptr ; + float normfact, scaled_value ; + int value ; + + normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x10000) ; + ucptr = ((unsigned char*) dest) + 2 * count ; + + while (--count >= 0) + { ucptr -= 2 ; + scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) + { ucptr [0] = 0xFF ; + ucptr [1] = 0x7F ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) + { ucptr [0] = 0x00 ; + ucptr [1] = 0x80 ; + continue ; + } ; + + value = psf_lrintf (scaled_value) ; + ucptr [0] = value >> 16 ; + ucptr [1] = value >> 24 ; + } ; +} /* f2les_clip_array */ + +static sf_count_t +pcm_write_f2les (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const float *, short *t, int, int) ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + convert = (psf->add_clipping) ? f2les_clip_array : f2les_array ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + convert (ptr + total, ubuf.sbuf, bufferlen, psf->norm_float) ; + writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_f2les */ + +/*============================================================================== +*/ + +static void +f2let_array (const float *src, tribyte *dest, int count, int normalize) +{ float normfact ; + int value ; + + normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ; + + while (--count >= 0) + { value = psf_lrintf (src [count] * normfact) ; + dest [count].bytes [0] = value ; + dest [count].bytes [1] = value >> 8 ; + dest [count].bytes [2] = value >> 16 ; + } ; +} /* f2let_array */ + +static void +f2let_clip_array (const float *src, tribyte *dest, int count, int normalize) +{ float normfact, scaled_value ; + int value ; + + normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x100) ; + + while (--count >= 0) + { scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) + { dest [count].bytes [0] = 0xFF ; + dest [count].bytes [1] = 0xFF ; + dest [count].bytes [2] = 0x7F ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) + { dest [count].bytes [0] = 0x00 ; + dest [count].bytes [1] = 0x00 ; + dest [count].bytes [2] = 0x80 ; + continue ; + } ; + + value = psf_lrintf (scaled_value) ; + dest [count].bytes [0] = value >> 8 ; + dest [count].bytes [1] = value >> 16 ; + dest [count].bytes [2] = value >> 24 ; + } ; +} /* f2let_clip_array */ + +static sf_count_t +pcm_write_f2let (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const float *, tribyte *, int, int) ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + convert = (psf->add_clipping) ? f2let_clip_array : f2let_array ; + bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + convert (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen, psf->norm_float) ; + writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_f2let */ + +/*============================================================================== +*/ + +static void +f2bet_array (const float *src, tribyte *dest, int count, int normalize) +{ float normfact ; + int value ; + + normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ; + + while (--count >= 0) + { value = psf_lrintf (src [count] * normfact) ; + dest [count].bytes [0] = value >> 16 ; + dest [count].bytes [1] = value >> 8 ; + dest [count].bytes [2] = value ; + } ; +} /* f2bet_array */ + +static void +f2bet_clip_array (const float *src, tribyte *dest, int count, int normalize) +{ float normfact, scaled_value ; + int value ; + + normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x100) ; + + while (--count >= 0) + { scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) + { dest [count].bytes [0] = 0x7F ; + dest [count].bytes [1] = 0xFF ; + dest [count].bytes [2] = 0xFF ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) + { dest [count].bytes [0] = 0x80 ; + dest [count].bytes [1] = 0x00 ; + dest [count].bytes [2] = 0x00 ; + continue ; + } ; + + value = psf_lrint (scaled_value) ; + dest [count].bytes [0] = value >> 24 ; + dest [count].bytes [1] = value >> 16 ; + dest [count].bytes [2] = value >> 8 ; + } ; +} /* f2bet_clip_array */ + +static sf_count_t +pcm_write_f2bet (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const float *, tribyte *, int, int) ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + convert = (psf->add_clipping) ? f2bet_clip_array : f2bet_array ; + bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + convert (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen, psf->norm_float) ; + writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_f2bet */ + +/*============================================================================== +*/ + +static void +f2bei_array (const float *src, int *dest, int count, int normalize) +{ unsigned char *ucptr ; + float normfact ; + int value ; + + normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ; + ucptr = ((unsigned char*) dest) + 4 * count ; + while (--count >= 0) + { ucptr -= 4 ; + value = psf_lrintf (src [count] * normfact) ; + ucptr [0] = value >> 24 ; + ucptr [1] = value >> 16 ; + ucptr [2] = value >> 8 ; + ucptr [3] = value ; + } ; +} /* f2bei_array */ + +static void +f2bei_clip_array (const float *src, int *dest, int count, int normalize) +{ unsigned char *ucptr ; + float normfact, scaled_value ; + int value ; + + normfact = normalize ? (8.0 * 0x10000000) : 1.0 ; + ucptr = ((unsigned char*) dest) + 4 * count ; + + while (--count >= 0) + { ucptr -= 4 ; + scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= 1.0 * 0x7FFFFFFF) + { ucptr [0] = 0x7F ; + ucptr [1] = 0xFF ; + ucptr [2] = 0xFF ; + ucptr [3] = 0xFF ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) + { ucptr [0] = 0x80 ; + ucptr [1] = 0x00 ; + ucptr [2] = 0x00 ; + ucptr [3] = 0x00 ; + continue ; + } ; + + value = psf_lrintf (scaled_value) ; + ucptr [0] = value >> 24 ; + ucptr [1] = value >> 16 ; + ucptr [2] = value >> 8 ; + ucptr [3] = value ; + } ; +} /* f2bei_clip_array */ + +static sf_count_t +pcm_write_f2bei (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const float *, int *, int, int) ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + convert = (psf->add_clipping) ? f2bei_clip_array : f2bei_array ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + convert (ptr + total, ubuf.ibuf, bufferlen, psf->norm_float) ; + writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_f2bei */ + +/*============================================================================== +*/ + +static void +f2lei_array (const float *src, int *dest, int count, int normalize) +{ unsigned char *ucptr ; + float normfact ; + int value ; + + normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ; + ucptr = ((unsigned char*) dest) + 4 * count ; + + while (--count >= 0) + { ucptr -= 4 ; + value = psf_lrintf (src [count] * normfact) ; + ucptr [0] = value ; + ucptr [1] = value >> 8 ; + ucptr [2] = value >> 16 ; + ucptr [3] = value >> 24 ; + } ; +} /* f2lei_array */ + +static void +f2lei_clip_array (const float *src, int *dest, int count, int normalize) +{ unsigned char *ucptr ; + float normfact, scaled_value ; + int value ; + + normfact = normalize ? (8.0 * 0x10000000) : 1.0 ; + ucptr = ((unsigned char*) dest) + 4 * count ; + + while (--count >= 0) + { ucptr -= 4 ; + scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) + { ucptr [0] = 0xFF ; + ucptr [1] = 0xFF ; + ucptr [2] = 0xFF ; + ucptr [3] = 0x7F ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) + { ucptr [0] = 0x00 ; + ucptr [1] = 0x00 ; + ucptr [2] = 0x00 ; + ucptr [3] = 0x80 ; + continue ; + } ; + + value = psf_lrintf (scaled_value) ; + ucptr [0] = value ; + ucptr [1] = value >> 8 ; + ucptr [2] = value >> 16 ; + ucptr [3] = value >> 24 ; + } ; +} /* f2lei_clip_array */ + +static sf_count_t +pcm_write_f2lei (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const float *, int *, int, int) ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + convert = (psf->add_clipping) ? f2lei_clip_array : f2lei_array ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + convert (ptr + total, ubuf.ibuf, bufferlen, psf->norm_float) ; + writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_f2lei */ + +/*============================================================================== +*/ + +static void +d2sc_array (const double *src, signed char *dest, int count, int normalize) +{ double normfact ; + + normfact = normalize ? (1.0 * 0x7F) : 1.0 ; + + while (--count >= 0) + { dest [count] = psf_lrint (src [count] * normfact) ; + } ; +} /* d2sc_array */ + +static void +d2sc_clip_array (const double *src, signed char *dest, int count, int normalize) +{ double normfact, scaled_value ; + + normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x1000000) ; + + while (--count >= 0) + { scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) + { dest [count] = 127 ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) + { dest [count] = -128 ; + continue ; + } ; + + dest [count] = psf_lrintf (scaled_value) >> 24 ; + } ; +} /* d2sc_clip_array */ + +static sf_count_t +pcm_write_d2sc (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const double *, signed char *, int, int) ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + convert = (psf->add_clipping) ? d2sc_clip_array : d2sc_array ; + bufferlen = ARRAY_LEN (ubuf.scbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + convert (ptr + total, ubuf.scbuf, bufferlen, psf->norm_double) ; + writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_d2sc */ + +/*============================================================================== +*/ + +static void +d2uc_array (const double *src, unsigned char *dest, int count, int normalize) +{ double normfact ; + + normfact = normalize ? (1.0 * 0x7F) : 1.0 ; + + while (--count >= 0) + { dest [count] = psf_lrint (src [count] * normfact) + 128 ; + } ; +} /* d2uc_array */ + +static void +d2uc_clip_array (const double *src, unsigned char *dest, int count, int normalize) +{ double normfact, scaled_value ; + + normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x1000000) ; + + while (--count >= 0) + { scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) + { dest [count] = 255 ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) + { dest [count] = 0 ; + continue ; + } ; + + dest [count] = (psf_lrint (src [count] * normfact) >> 24) + 128 ; + } ; +} /* d2uc_clip_array */ + +static sf_count_t +pcm_write_d2uc (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const double *, unsigned char *, int, int) ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + convert = (psf->add_clipping) ? d2uc_clip_array : d2uc_array ; + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + convert (ptr + total, ubuf.ucbuf, bufferlen, psf->norm_double) ; + writecount = psf_fwrite (ubuf.ucbuf, sizeof (unsigned char), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_d2uc */ + +/*============================================================================== +*/ + +static void +d2bes_array (const double *src, short *dest, int count, int normalize) +{ unsigned char *ucptr ; + short value ; + double normfact ; + + normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ; + ucptr = ((unsigned char*) dest) + 2 * count ; + + while (--count >= 0) + { ucptr -= 2 ; + value = psf_lrint (src [count] * normfact) ; + ucptr [1] = value ; + ucptr [0] = value >> 8 ; + } ; +} /* d2bes_array */ + +static void +d2bes_clip_array (const double *src, short *dest, int count, int normalize) +{ unsigned char *ucptr ; + double normfact, scaled_value ; + int value ; + + normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x10000) ; + ucptr = ((unsigned char*) dest) + 2 * count ; + + while (--count >= 0) + { ucptr -= 2 ; + scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) + { ucptr [1] = 0xFF ; + ucptr [0] = 0x7F ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) + { ucptr [1] = 0x00 ; + ucptr [0] = 0x80 ; + continue ; + } ; + + value = psf_lrint (scaled_value) ; + ucptr [1] = value >> 16 ; + ucptr [0] = value >> 24 ; + } ; +} /* d2bes_clip_array */ + +static sf_count_t +pcm_write_d2bes (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const double *, short *, int, int) ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + convert = (psf->add_clipping) ? d2bes_clip_array : d2bes_array ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + convert (ptr + total, ubuf.sbuf, bufferlen, psf->norm_double) ; + writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_d2bes */ + +/*============================================================================== +*/ + +static void +d2les_array (const double *src, short *dest, int count, int normalize) +{ unsigned char *ucptr ; + short value ; + double normfact ; + + normfact = normalize ? (1.0 * 0x7FFF) : 1.0 ; + ucptr = ((unsigned char*) dest) + 2 * count ; + + while (--count >= 0) + { ucptr -= 2 ; + value = psf_lrint (src [count] * normfact) ; + ucptr [0] = value ; + ucptr [1] = value >> 8 ; + } ; +} /* d2les_array */ + +static void +d2les_clip_array (const double *src, short *dest, int count, int normalize) +{ unsigned char *ucptr ; + int value ; + double normfact, scaled_value ; + + normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x10000) ; + ucptr = ((unsigned char*) dest) + 2 * count ; + + while (--count >= 0) + { ucptr -= 2 ; + scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) + { ucptr [0] = 0xFF ; + ucptr [1] = 0x7F ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) + { ucptr [0] = 0x00 ; + ucptr [1] = 0x80 ; + continue ; + } ; + + value = psf_lrint (scaled_value) ; + ucptr [0] = value >> 16 ; + ucptr [1] = value >> 24 ; + } ; +} /* d2les_clip_array */ + +static sf_count_t +pcm_write_d2les (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const double *, short *, int, int) ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + convert = (psf->add_clipping) ? d2les_clip_array : d2les_array ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + convert (ptr + total, ubuf.sbuf, bufferlen, psf->norm_double) ; + writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_d2les */ + +/*============================================================================== +*/ + +static void +d2let_array (const double *src, tribyte *dest, int count, int normalize) +{ int value ; + double normfact ; + + normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ; + + while (--count >= 0) + { value = psf_lrint (src [count] * normfact) ; + dest [count].bytes [0] = value ; + dest [count].bytes [1] = value >> 8 ; + dest [count].bytes [2] = value >> 16 ; + } ; +} /* d2let_array */ + +static void +d2let_clip_array (const double *src, tribyte *dest, int count, int normalize) +{ int value ; + double normfact, scaled_value ; + + normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x100) ; + + while (--count >= 0) + { scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) + { dest [count].bytes [0] = 0xFF ; + dest [count].bytes [1] = 0xFF ; + dest [count].bytes [2] = 0x7F ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) + { dest [count].bytes [0] = 0x00 ; + dest [count].bytes [1] = 0x00 ; + dest [count].bytes [2] = 0x80 ; + continue ; + } ; + + value = psf_lrint (scaled_value) ; + dest [count].bytes [0] = value >> 8 ; + dest [count].bytes [1] = value >> 16 ; + dest [count].bytes [2] = value >> 24 ; + } ; +} /* d2let_clip_array */ + +static sf_count_t +pcm_write_d2let (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const double *, tribyte *, int, int) ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + convert = (psf->add_clipping) ? d2let_clip_array : d2let_array ; + bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + convert (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen, psf->norm_double) ; + writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_d2let */ + +/*============================================================================== +*/ + +static void +d2bet_array (const double *src, tribyte *dest, int count, int normalize) +{ int value ; + double normfact ; + + normfact = normalize ? (1.0 * 0x7FFFFF) : 1.0 ; + + while (--count >= 0) + { value = psf_lrint (src [count] * normfact) ; + dest [count].bytes [2] = value ; + dest [count].bytes [1] = value >> 8 ; + dest [count].bytes [0] = value >> 16 ; + } ; +} /* d2bet_array */ + +static void +d2bet_clip_array (const double *src, tribyte *dest, int count, int normalize) +{ int value ; + double normfact, scaled_value ; + + normfact = normalize ? (8.0 * 0x10000000) : (1.0 * 0x100) ; + + while (--count >= 0) + { scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) + { dest [count].bytes [2] = 0xFF ; + dest [count].bytes [1] = 0xFF ; + dest [count].bytes [0] = 0x7F ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) + { dest [count].bytes [2] = 0x00 ; + dest [count].bytes [1] = 0x00 ; + dest [count].bytes [0] = 0x80 ; + continue ; + } ; + + value = psf_lrint (scaled_value) ; + dest [count].bytes [2] = value >> 8 ; + dest [count].bytes [1] = value >> 16 ; + dest [count].bytes [0] = value >> 24 ; + } ; +} /* d2bet_clip_array */ + +static sf_count_t +pcm_write_d2bet (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const double *, tribyte *, int, int) ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + convert = (psf->add_clipping) ? d2bet_clip_array : d2bet_array ; + bufferlen = sizeof (ubuf.ucbuf) / SIZEOF_TRIBYTE ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + convert (ptr + total, (tribyte*) (ubuf.ucbuf), bufferlen, psf->norm_double) ; + writecount = psf_fwrite (ubuf.ucbuf, SIZEOF_TRIBYTE, bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_d2bet */ + +/*============================================================================== +*/ + +static void +d2bei_array (const double *src, int *dest, int count, int normalize) +{ unsigned char *ucptr ; + int value ; + double normfact ; + + normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ; + ucptr = ((unsigned char*) dest) + 4 * count ; + + while (--count >= 0) + { ucptr -= 4 ; + value = psf_lrint (src [count] * normfact) ; + ucptr [0] = value >> 24 ; + ucptr [1] = value >> 16 ; + ucptr [2] = value >> 8 ; + ucptr [3] = value ; + } ; +} /* d2bei_array */ + +static void +d2bei_clip_array (const double *src, int *dest, int count, int normalize) +{ unsigned char *ucptr ; + int value ; + double normfact, scaled_value ; + + normfact = normalize ? (8.0 * 0x10000000) : 1.0 ; + ucptr = ((unsigned char*) dest) + 4 * count ; + + while (--count >= 0) + { ucptr -= 4 ; + scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) + { ucptr [3] = 0xFF ; + ucptr [2] = 0xFF ; + ucptr [1] = 0xFF ; + ucptr [0] = 0x7F ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) + { ucptr [3] = 0x00 ; + ucptr [2] = 0x00 ; + ucptr [1] = 0x00 ; + ucptr [0] = 0x80 ; + continue ; + } ; + + value = psf_lrint (scaled_value) ; + ucptr [0] = value >> 24 ; + ucptr [1] = value >> 16 ; + ucptr [2] = value >> 8 ; + ucptr [3] = value ; + } ; +} /* d2bei_clip_array */ + +static sf_count_t +pcm_write_d2bei (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const double *, int *, int, int) ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + convert = (psf->add_clipping) ? d2bei_clip_array : d2bei_array ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + convert (ptr + total, ubuf.ibuf, bufferlen, psf->norm_double) ; + writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_d2bei */ + +/*============================================================================== +*/ + +static void +d2lei_array (const double *src, int *dest, int count, int normalize) +{ unsigned char *ucptr ; + int value ; + double normfact ; + + normfact = normalize ? (1.0 * 0x7FFFFFFF) : 1.0 ; + ucptr = ((unsigned char*) dest) + 4 * count ; + + while (--count >= 0) + { ucptr -= 4 ; + value = psf_lrint (src [count] * normfact) ; + ucptr [0] = value ; + ucptr [1] = value >> 8 ; + ucptr [2] = value >> 16 ; + ucptr [3] = value >> 24 ; + } ; +} /* d2lei_array */ + +static void +d2lei_clip_array (const double *src, int *dest, int count, int normalize) +{ unsigned char *ucptr ; + int value ; + double normfact, scaled_value ; + + normfact = normalize ? (8.0 * 0x10000000) : 1.0 ; + ucptr = ((unsigned char*) dest) + 4 * count ; + + while (--count >= 0) + { ucptr -= 4 ; + scaled_value = src [count] * normfact ; + if (CPU_CLIPS_POSITIVE == 0 && scaled_value >= (1.0 * 0x7FFFFFFF)) + { ucptr [0] = 0xFF ; + ucptr [1] = 0xFF ; + ucptr [2] = 0xFF ; + ucptr [3] = 0x7F ; + continue ; + } ; + if (CPU_CLIPS_NEGATIVE == 0 && scaled_value <= (-8.0 * 0x10000000)) + { ucptr [0] = 0x00 ; + ucptr [1] = 0x00 ; + ucptr [2] = 0x00 ; + ucptr [3] = 0x80 ; + continue ; + } ; + + value = psf_lrint (scaled_value) ; + ucptr [0] = value ; + ucptr [1] = value >> 8 ; + ucptr [2] = value >> 16 ; + ucptr [3] = value >> 24 ; + } ; +} /* d2lei_clip_array */ + +static sf_count_t +pcm_write_d2lei (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + void (*convert) (const double *, int *, int, int) ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + convert = (psf->add_clipping) ? d2lei_clip_array : d2lei_array ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + convert (ptr + total, ubuf.ibuf, bufferlen, psf->norm_double) ; + writecount = psf_fwrite (ubuf.ibuf, sizeof (int), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* pcm_write_d2lei */ + diff --git a/libsndfile-1.0.31/src/pvf.c b/libsndfile-1.0.31/src/pvf.c new file mode 100644 index 0000000..714f5b3 --- /dev/null +++ b/libsndfile-1.0.31/src/pvf.c @@ -0,0 +1,188 @@ +/* +** Copyright (C) 2002-2016 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +/*------------------------------------------------------------------------------ +** Macros to handle big/little endian issues. +*/ + +#define PVF1_MARKER (MAKE_MARKER ('P', 'V', 'F', '1')) + +/*------------------------------------------------------------------------------ +** Private static functions. +*/ + +static int pvf_close (SF_PRIVATE *psf) ; + +static int pvf_write_header (SF_PRIVATE *psf, int calc_length) ; +static int pvf_read_header (SF_PRIVATE *psf) ; + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +pvf_open (SF_PRIVATE *psf) +{ int subformat ; + int error = 0 ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = pvf_read_header (psf))) + return error ; + } ; + + subformat = SF_CODEC (psf->sf.format) ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_PVF) + return SFE_BAD_OPEN_FORMAT ; + + psf->endian = SF_ENDIAN_BIG ; + + if (pvf_write_header (psf, SF_FALSE)) + return psf->error ; + + psf->write_header = pvf_write_header ; + } ; + + psf->container_close = pvf_close ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + + switch (subformat) + { case SF_FORMAT_PCM_S8 : /* 8-bit linear PCM. */ + case SF_FORMAT_PCM_16 : /* 16-bit linear PCM. */ + case SF_FORMAT_PCM_32 : /* 32-bit linear PCM. */ + error = pcm_init (psf) ; + break ; + + default : break ; + } ; + + return error ; +} /* pvf_open */ + +/*------------------------------------------------------------------------------ +*/ + +static int +pvf_close (SF_PRIVATE * UNUSED (psf)) +{ + return 0 ; +} /* pvf_close */ + +static int +pvf_write_header (SF_PRIVATE *psf, int UNUSED (calc_length)) +{ sf_count_t current ; + + if (psf->pipeoffset > 0) + return 0 ; + + current = psf_ftell (psf) ; + + /* Reset the current header length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + + if (psf->is_pipe == SF_FALSE) + psf_fseek (psf, 0, SEEK_SET) ; + + snprintf ((char*) psf->header.ptr, psf->header.len, "PVF1\n%d %d %d\n", + psf->sf.channels, psf->sf.samplerate, psf->bytewidth * 8) ; + + psf->header.indx = strlen ((char*) psf->header.ptr) ; + + /* Header construction complete so write it out. */ + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + if (psf->error) + return psf->error ; + + psf->dataoffset = psf->header.indx ; + + if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + + return psf->error ; +} /* pvf_write_header */ + +static int +pvf_read_header (SF_PRIVATE *psf) +{ char buffer [32] ; + int marker, channels, samplerate, bitwidth ; + + psf_binheader_readf (psf, "pmj", 0, &marker, 1) ; + psf_log_printf (psf, "%M\n", marker) ; + + if (marker != PVF1_MARKER) + return SFE_PVF_NO_PVF1 ; + + /* Grab characters up until a newline which is replaced by an EOS. */ + psf_binheader_readf (psf, "G", buffer, sizeof (buffer)) ; + + if (sscanf (buffer, "%d %d %d", &channels, &samplerate, &bitwidth) != 3) + return SFE_PVF_BAD_HEADER ; + + psf_log_printf (psf, " Channels : %d\n Sample rate : %d\n Bit width : %d\n", + channels, samplerate, bitwidth) ; + + psf->sf.channels = channels ; + psf->sf.samplerate = samplerate ; + + switch (bitwidth) + { case 8 : + psf->sf.format = SF_FORMAT_PVF | SF_FORMAT_PCM_S8 ; + psf->bytewidth = 1 ; + break ; + + case 16 : + psf->sf.format = SF_FORMAT_PVF | SF_FORMAT_PCM_16 ; + psf->bytewidth = 2 ; + break ; + case 32 : + psf->sf.format = SF_FORMAT_PVF | SF_FORMAT_PCM_32 ; + psf->bytewidth = 4 ; + break ; + + default : + return SFE_PVF_BAD_BITWIDTH ; + } ; + + psf->dataoffset = psf_ftell (psf) ; + psf_log_printf (psf, " Data Offset : %D\n", psf->dataoffset) ; + + psf->endian = SF_ENDIAN_BIG ; + + psf->datalength = psf->filelength - psf->dataoffset ; + psf->blockwidth = psf->sf.channels * psf->bytewidth ; + + if (! psf->sf.frames && psf->blockwidth) + psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ; + + return 0 ; +} /* pvf_read_header */ diff --git a/libsndfile-1.0.31/src/raw.c b/libsndfile-1.0.31/src/raw.c new file mode 100644 index 0000000..c8fcbfd --- /dev/null +++ b/libsndfile-1.0.31/src/raw.c @@ -0,0 +1,111 @@ +/* +** Copyright (C) 1999-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include + +#include "sndfile.h" +#include "common.h" + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +raw_open (SF_PRIVATE *psf) +{ int subformat, error = SFE_NO_ERROR ; + + subformat = SF_CODEC (psf->sf.format) ; + + psf->endian = SF_ENDIAN (psf->sf.format) ; + + if (CPU_IS_BIG_ENDIAN && (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU)) + psf->endian = SF_ENDIAN_BIG ; + else if (CPU_IS_LITTLE_ENDIAN && (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU)) + psf->endian = SF_ENDIAN_LITTLE ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + psf->dataoffset = 0 ; + psf->datalength = psf->filelength ; + + switch (subformat) + { case SF_FORMAT_PCM_S8 : + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_PCM_U8 : + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_32 : + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_ULAW : + error = ulaw_init (psf) ; + break ; + + case SF_FORMAT_ALAW : + error = alaw_init (psf) ; + break ; + + case SF_FORMAT_GSM610 : + error = gsm610_init (psf) ; + break ; + + /* Lite remove start */ + + case SF_FORMAT_NMS_ADPCM_16 : + case SF_FORMAT_NMS_ADPCM_24 : + case SF_FORMAT_NMS_ADPCM_32 : + error = nms_adpcm_init (psf) ; + break ; + + case SF_FORMAT_FLOAT : + error = float32_init (psf) ; + break ; + + case SF_FORMAT_DOUBLE : + error = double64_init (psf) ; + break ; + + case SF_FORMAT_DWVW_12 : + error = dwvw_init (psf, 12) ; + break ; + + case SF_FORMAT_DWVW_16 : + error = dwvw_init (psf, 16) ; + break ; + + case SF_FORMAT_DWVW_24 : + error = dwvw_init (psf, 24) ; + break ; + + case SF_FORMAT_VOX_ADPCM : + error = vox_adpcm_init (psf) ; + break ; + /* Lite remove end */ + + default : return SFE_BAD_OPEN_FORMAT ; + } ; + + return error ; +} /* raw_open */ diff --git a/libsndfile-1.0.31/src/rf64.c b/libsndfile-1.0.31/src/rf64.c new file mode 100644 index 0000000..876cd45 --- /dev/null +++ b/libsndfile-1.0.31/src/rf64.c @@ -0,0 +1,894 @@ +/* +** Copyright (C) 2008-2018 Erik de Castro Lopo +** Copyright (C) 2009 Uli Franke +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +/* +** This format documented at: +** http://www.sr.se/utveckling/tu/bwf/prog/RF_64v1_4.pdf +** +** But this may be a better reference: +** http://www.ebu.ch/CMSimages/en/tec_doc_t3306-2007_tcm6-42570.pdf +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" +#include "wavlike.h" + +/*------------------------------------------------------------------------------ +** Macros to handle big/little endian issues. +*/ +#define RF64_MARKER MAKE_MARKER ('R', 'F', '6', '4') +#define RIFF_MARKER MAKE_MARKER ('R', 'I', 'F', 'F') +#define JUNK_MARKER MAKE_MARKER ('J', 'U', 'N', 'K') +#define FFFF_MARKER MAKE_MARKER (0xff, 0xff, 0xff, 0xff) +#define WAVE_MARKER MAKE_MARKER ('W', 'A', 'V', 'E') +#define ds64_MARKER MAKE_MARKER ('d', 's', '6', '4') +#define fmt_MARKER MAKE_MARKER ('f', 'm', 't', ' ') +#define fact_MARKER MAKE_MARKER ('f', 'a', 'c', 't') +#define data_MARKER MAKE_MARKER ('d', 'a', 't', 'a') + +#define bext_MARKER MAKE_MARKER ('b', 'e', 'x', 't') +#define cart_MARKER MAKE_MARKER ('c', 'a', 'r', 't') +#define OggS_MARKER MAKE_MARKER ('O', 'g', 'g', 'S') +#define wvpk_MARKER MAKE_MARKER ('w', 'v', 'p', 'k') +#define LIST_MARKER MAKE_MARKER ('L', 'I', 'S', 'T') + +/* +** The file size limit in bytes below which we can, if requested, write this +** file as a RIFF/WAVE file. +*/ + +#define RIFF_DOWNGRADE_BYTES ((sf_count_t) 0xffffffff) + +/*------------------------------------------------------------------------------ +** Private static functions. +*/ + +static int rf64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock) ; +static int rf64_write_header (SF_PRIVATE *psf, int calc_length) ; +static int rf64_write_tailer (SF_PRIVATE *psf) ; +static int rf64_close (SF_PRIVATE *psf) ; +static int rf64_command (SF_PRIVATE *psf, int command, void * UNUSED (data), int datasize) ; + +static int rf64_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info) ; +static SF_CHUNK_ITERATOR * rf64_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator) ; +static int rf64_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ; +static int rf64_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ; + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +rf64_open (SF_PRIVATE *psf) +{ WAVLIKE_PRIVATE *wpriv ; + int subformat, error = 0 ; + int blockalign, framesperblock ; + + if ((wpriv = calloc (1, sizeof (WAVLIKE_PRIVATE))) == NULL) + return SFE_MALLOC_FAILED ; + psf->container_data = wpriv ; + wpriv->wavex_ambisonic = SF_AMBISONIC_NONE ; + + /* All RF64 files are little endian. */ + psf->endian = SF_ENDIAN_LITTLE ; + + psf->strings.flags = SF_STR_ALLOW_START | SF_STR_ALLOW_END ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = rf64_read_header (psf, &blockalign, &framesperblock)) != 0) + return error ; + + psf->next_chunk_iterator = rf64_next_chunk_iterator ; + psf->get_chunk_size = rf64_get_chunk_size ; + psf->get_chunk_data = rf64_get_chunk_data ; + } ; + + if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RF64) + return SFE_BAD_OPEN_FORMAT ; + + subformat = psf->sf.format & SF_FORMAT_SUBMASK ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if (psf->is_pipe) + return SFE_NO_PIPE_WRITE ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + + if ((error = rf64_write_header (psf, SF_FALSE))) + return error ; + + psf->write_header = rf64_write_header ; + psf->set_chunk = rf64_set_chunk ; + } ; + + psf->container_close = rf64_close ; + psf->command = rf64_command ; + + switch (subformat) + { case SF_FORMAT_PCM_U8 : + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_32 : + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_ULAW : + error = ulaw_init (psf) ; + break ; + + case SF_FORMAT_ALAW : + error = alaw_init (psf) ; + break ; + + /* Lite remove start */ + case SF_FORMAT_FLOAT : + error = float32_init (psf) ; + break ; + + case SF_FORMAT_DOUBLE : + error = double64_init (psf) ; + break ; + + /* Lite remove end */ + + default : return SFE_UNIMPLEMENTED ; + } ; + + return error ; +} /* rf64_open */ + +/*------------------------------------------------------------------------------ +*/ +enum +{ HAVE_ds64 = 0x01, + HAVE_fmt = 0x02, + HAVE_bext = 0x04, + HAVE_data = 0x08, + HAVE_cart = 0x10, + HAVE_PEAK = 0x20, + HAVE_other = 0x40 +} ; + +#define HAVE_CHUNK(CHUNK) ((parsestage & CHUNK) != 0) + +static int +rf64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock) +{ WAVLIKE_PRIVATE *wpriv ; + WAV_FMT *wav_fmt ; + sf_count_t riff_size = 0, frame_count = 0, ds64_datalength = 0 ; + uint32_t marks [2], marker, chunk_size, parsestage = 0 ; + int error, done = 0, format = 0 ; + + if ((wpriv = psf->container_data) == NULL) + return SFE_INTERNAL ; + wav_fmt = &wpriv->wav_fmt ; + + /* Set position to start of file to begin reading header. */ + psf_binheader_readf (psf, "pmmm", 0, &marker, marks, marks + 1) ; + if (marker != RF64_MARKER || marks [1] != WAVE_MARKER) + return SFE_RF64_NOT_RF64 ; + + if (marks [0] == FFFF_MARKER) + psf_log_printf (psf, "%M\n %M\n", RF64_MARKER, WAVE_MARKER) ; + else + psf_log_printf (psf, "%M : 0x%x (should be 0xFFFFFFFF)\n %M\n", RF64_MARKER, WAVE_MARKER) ; + + while (NOT (done)) + { + marker = chunk_size = 0 ; + psf_binheader_readf (psf, "em4", &marker, &chunk_size) ; + + if (marker == 0) + { sf_count_t pos = psf_ftell (psf) ; + psf_log_printf (psf, "Have 0 marker at position %D (0x%x).\n", pos, pos) ; + break ; + } ; + + psf_store_read_chunk_u32 (&psf->rchunks, marker, psf_ftell (psf), chunk_size) ; + + switch (marker) + { case ds64_MARKER : + if (parsestage & HAVE_ds64) + { psf_log_printf (psf, "*** Second 'ds64' chunk?\n") ; + break ; + } ; + + { unsigned int table_len, bytesread ; + + /* Read ds64 sizes (3 8-byte words). */ + bytesread = psf_binheader_readf (psf, "888", &riff_size, &ds64_datalength, &frame_count) ; + + /* Read table length. */ + bytesread += psf_binheader_readf (psf, "4", &table_len) ; + /* Skip table for now. (this was "table_len + 4", why?) */ + bytesread += psf_binheader_readf (psf, "j", table_len) ; + + if (chunk_size == bytesread) + psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ; + else if (chunk_size >= bytesread + 4) + { unsigned int next ; + psf_binheader_readf (psf, "m", &next) ; + if (next == fmt_MARKER) + { psf_log_printf (psf, "%M : %u (should be %u)\n", marker, chunk_size, bytesread) ; + psf_binheader_readf (psf, "j", -4) ; + } + else + { psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ; + psf_binheader_readf (psf, "j", chunk_size - bytesread - 4) ; + } ; + } ; + + if (psf->filelength != riff_size + 8) + psf_log_printf (psf, " Riff size : %D (should be %D)\n", riff_size, psf->filelength - 8) ; + else + psf_log_printf (psf, " Riff size : %D\n", riff_size) ; + + psf_log_printf (psf, " Data size : %D\n", ds64_datalength) ; + + psf_log_printf (psf, " Frames : %D\n", frame_count) ; + psf_log_printf (psf, " Table length : %u\n", table_len) ; + + } ; + parsestage |= HAVE_ds64 ; + break ; + + case fmt_MARKER: + psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ; + if ((error = wavlike_read_fmt_chunk (psf, chunk_size)) != 0) + return error ; + format = wav_fmt->format ; + parsestage |= HAVE_fmt ; + break ; + + case bext_MARKER : + if ((error = wavlike_read_bext_chunk (psf, chunk_size)) != 0) + return error ; + parsestage |= HAVE_bext ; + break ; + + case cart_MARKER : + if ((error = wavlike_read_cart_chunk (psf, chunk_size)) != 0) + return error ; + parsestage |= HAVE_cart ; + break ; + + case INFO_MARKER : + case LIST_MARKER : + if ((error = wavlike_subchunk_parse (psf, marker, chunk_size)) != 0) + return error ; + parsestage |= HAVE_other ; + break ; + + case PEAK_MARKER : + if ((parsestage & (HAVE_ds64 | HAVE_fmt)) != (HAVE_ds64 | HAVE_fmt)) + return SFE_RF64_PEAK_B4_FMT ; + + parsestage |= HAVE_PEAK ; + + psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ; + if ((error = wavlike_read_peak_chunk (psf, chunk_size)) != 0) + return error ; + psf->peak_info->peak_loc = ((parsestage & HAVE_data) == 0) ? SF_PEAK_START : SF_PEAK_END ; + break ; + + case data_MARKER : + /* see wav for more sophisticated parsing -> implement state machine with parsestage */ + + if (HAVE_CHUNK (HAVE_ds64)) + { if (chunk_size == 0xffffffff) + psf_log_printf (psf, "%M : 0x%x\n", marker, chunk_size) ; + else + psf_log_printf (psf, "%M : 0x%x (should be 0xffffffff\n", marker, chunk_size) ; + psf->datalength = ds64_datalength ; + } + else + { if (chunk_size == 0xffffffff) + { psf_log_printf (psf, "%M : 0x%x\n", marker, chunk_size) ; + psf_log_printf (psf, " *** Data length not specified no 'ds64' chunk.\n") ; + } + else + { psf_log_printf (psf, "%M : 0x%x\n**** Weird, RF64 file without a 'ds64' chunk and no valid 'data' size.\n", marker, chunk_size) ; + psf->datalength = chunk_size ; + } ; + } ; + + psf->dataoffset = psf_ftell (psf) ; + + if (psf->dataoffset > 0) + { if (chunk_size == 0 && riff_size == 8 && psf->filelength > 44) + { psf_log_printf (psf, " *** Looks like a WAV file which wasn't closed properly. Fixing it.\n") ; + psf->datalength = psf->filelength - psf->dataoffset ; + } ; + + /* Only set dataend if there really is data at the end. */ + if (psf->datalength + psf->dataoffset < psf->filelength) + psf->dataend = psf->datalength + psf->dataoffset ; + + if (NOT (psf->sf.seekable) || psf->dataoffset < 0) + break ; + + /* Seek past data and continue reading header. */ + psf_fseek (psf, psf->datalength, SEEK_CUR) ; + + if (psf_ftell (psf) != psf->datalength + psf->dataoffset) + psf_log_printf (psf, " *** psf_fseek past end error ***\n") ; + } ; + break ; + + case JUNK_MARKER : + case PAD_MARKER : + psf_log_printf (psf, "%M : %d\n", marker, chunk_size) ; + psf_binheader_readf (psf, "j", chunk_size) ; + break ; + + default : + if (chunk_size >= 0xffff0000) + { psf_log_printf (psf, "*** Unknown chunk marker (%X) at position %D with length %u. Exiting parser.\n", marker, psf_ftell (psf) - 8, chunk_size) ; + done = SF_TRUE ; + break ; + } ; + + if (isprint ((marker >> 24) & 0xFF) && isprint ((marker >> 16) & 0xFF) + && isprint ((marker >> 8) & 0xFF) && isprint (marker & 0xFF)) + { psf_log_printf (psf, "*** %M : %d (unknown marker)\n", marker, chunk_size) ; + psf_binheader_readf (psf, "j", chunk_size) ; + break ; + } ; + if (psf_ftell (psf) & 0x03) + { psf_log_printf (psf, " Unknown chunk marker at position 0x%x. Resynching.\n", chunk_size - 4) ; + psf_binheader_readf (psf, "j", -3) ; + break ; + } ; + psf_log_printf (psf, "*** Unknown chunk marker (0x%X) at position 0x%X. Exiting parser.\n", marker, psf_ftell (psf) - 4) ; + done = SF_TRUE ; + break ; + } ; /* switch (marker) */ + + /* The 'data' chunk, a chunk size of 0xffffffff means that the 'data' chunk size + ** is actually given by the ds64_datalength field. + */ + if (marker != data_MARKER && chunk_size >= psf->filelength) + { psf_log_printf (psf, "*** Chunk size %u > file length %D. Exiting parser.\n", chunk_size, psf->filelength) ; + break ; + } ; + + if (psf_ftell (psf) >= psf->filelength - SIGNED_SIZEOF (marker)) + { psf_log_printf (psf, "End\n") ; + break ; + } ; + } ; + + if (psf->dataoffset <= 0) + return SFE_RF64_NO_DATA ; + + if (psf->sf.channels < 1) + return SFE_CHANNEL_COUNT_ZERO ; + + if (psf->sf.channels > SF_MAX_CHANNELS) + return SFE_CHANNEL_COUNT ; + + /* WAVs can be little or big endian */ + psf->endian = psf->rwf_endian ; + + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + + if (psf->is_pipe == 0) + { /* + ** Check for 'wvpk' at the start of the DATA section. Not able to + ** handle this. + */ + psf_binheader_readf (psf, "4", &marker) ; + if (marker == wvpk_MARKER || marker == OggS_MARKER) + return SFE_WAV_WVPK_DATA ; + } ; + + /* Seek to start of DATA section. */ + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + + if (psf->blockwidth) + { if (psf->filelength - psf->dataoffset < psf->datalength) + psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ; + else + psf->sf.frames = psf->datalength / psf->blockwidth ; + } ; + + if (frame_count != psf->sf.frames) + psf_log_printf (psf, "*** Calculated frame count %d does not match value from 'ds64' chunk of %d.\n", psf->sf.frames, frame_count) ; + + switch (format) + { + case WAVE_FORMAT_EXTENSIBLE : + + /* with WAVE_FORMAT_EXTENSIBLE the psf->sf.format field is already set. We just have to set the major to rf64 */ + psf->sf.format = (psf->sf.format & ~SF_FORMAT_TYPEMASK) | SF_FORMAT_RF64 ; + + if (psf->sf.format == (SF_FORMAT_WAVEX | SF_FORMAT_MS_ADPCM)) + { *blockalign = wav_fmt->msadpcm.blockalign ; + *framesperblock = wav_fmt->msadpcm.samplesperblock ; + } ; + break ; + + case WAVE_FORMAT_PCM : + psf->sf.format = SF_FORMAT_RF64 | u_bitwidth_to_subformat (psf->bytewidth * 8) ; + break ; + + case WAVE_FORMAT_MULAW : + case IBM_FORMAT_MULAW : + psf->sf.format = (SF_FORMAT_RF64 | SF_FORMAT_ULAW) ; + break ; + + case WAVE_FORMAT_ALAW : + case IBM_FORMAT_ALAW : + psf->sf.format = (SF_FORMAT_RF64 | SF_FORMAT_ALAW) ; + break ; + + case WAVE_FORMAT_MS_ADPCM : + psf->sf.format = (SF_FORMAT_RF64 | SF_FORMAT_MS_ADPCM) ; + *blockalign = wav_fmt->msadpcm.blockalign ; + *framesperblock = wav_fmt->msadpcm.samplesperblock ; + break ; + + case WAVE_FORMAT_IMA_ADPCM : + psf->sf.format = (SF_FORMAT_RF64 | SF_FORMAT_IMA_ADPCM) ; + *blockalign = wav_fmt->ima.blockalign ; + *framesperblock = wav_fmt->ima.samplesperblock ; + break ; + + case WAVE_FORMAT_GSM610 : + psf->sf.format = (SF_FORMAT_RF64 | SF_FORMAT_GSM610) ; + break ; + + case WAVE_FORMAT_IEEE_FLOAT : + psf->sf.format = SF_FORMAT_RF64 ; + psf->sf.format |= (psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT ; + break ; + + case WAVE_FORMAT_G721_ADPCM : + psf->sf.format = SF_FORMAT_RF64 | SF_FORMAT_G721_32 ; + break ; + + default : return SFE_UNIMPLEMENTED ; + } ; + + if (wpriv->fmt_is_broken) + wavlike_analyze (psf) ; + + /* Only set the format endian-ness if its non-standard big-endian. */ + if (psf->endian == SF_ENDIAN_BIG) + psf->sf.format |= SF_ENDIAN_BIG ; + + return 0 ; +} /* rf64_read_header */ + +/* known WAVEFORMATEXTENSIBLE GUIDS */ +static const EXT_SUBFORMAT MSGUID_SUBTYPE_PCM = +{ 0x00000001, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } +} ; + +#if 0 +static const EXT_SUBFORMAT MSGUID_SUBTYPE_MS_ADPCM = +{ 0x00000002, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } +} ; +#endif + +static const EXT_SUBFORMAT MSGUID_SUBTYPE_IEEE_FLOAT = +{ 0x00000003, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } +} ; + +static const EXT_SUBFORMAT MSGUID_SUBTYPE_ALAW = +{ 0x00000006, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } +} ; + +static const EXT_SUBFORMAT MSGUID_SUBTYPE_MULAW = +{ 0x00000007, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } +} ; + +/* +** the next two are from +** http://dream.cs.bath.ac.uk/researchdev/wave-ex/bformat.html +*/ +static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM = +{ 0x00000001, 0x0721, 0x11d3, { 0x86, 0x44, 0xC8, 0xC1, 0xCA, 0x00, 0x00, 0x00 } +} ; + +static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT = +{ 0x00000003, 0x0721, 0x11d3, { 0x86, 0x44, 0xC8, 0xC1, 0xCA, 0x00, 0x00, 0x00 } +} ; + + +static int +rf64_write_fmt_chunk (SF_PRIVATE *psf) +{ WAVLIKE_PRIVATE *wpriv ; + int subformat, fmt_size ; + + if ((wpriv = psf->container_data) == NULL) + return SFE_INTERNAL ; + + subformat = psf->sf.format & SF_FORMAT_SUBMASK ; + + /* initial section (same for all, it appears) */ + switch (subformat) + { case SF_FORMAT_PCM_U8 : + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_32 : + case SF_FORMAT_FLOAT : + case SF_FORMAT_DOUBLE : + case SF_FORMAT_ULAW : + case SF_FORMAT_ALAW : + fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 + 4 + 4 + 2 + 2 + 8 ; + + /* fmt : format, channels, samplerate */ + psf_binheader_writef (psf, "4224", BHW4 (fmt_size), BHW2 (WAVE_FORMAT_EXTENSIBLE), BHW2 (psf->sf.channels), BHW4 (psf->sf.samplerate)) ; + /* fmt : bytespersec */ + psf_binheader_writef (psf, "4", BHW4 (psf->sf.samplerate * psf->bytewidth * psf->sf.channels)) ; + /* fmt : blockalign, bitwidth */ + psf_binheader_writef (psf, "22", BHW2 (psf->bytewidth * psf->sf.channels), BHW2 (psf->bytewidth * 8)) ; + + /* cbSize 22 is sizeof (WAVEFORMATEXTENSIBLE) - sizeof (WAVEFORMATEX) */ + psf_binheader_writef (psf, "2", BHW2 (22)) ; + + /* wValidBitsPerSample, for our use same as bitwidth as we use it fully */ + psf_binheader_writef (psf, "2", BHW2 (psf->bytewidth * 8)) ; + + /* For an Ambisonic file set the channel mask to zero. + ** Otherwise use a default based on the channel count. + */ + if (wpriv->wavex_ambisonic != SF_AMBISONIC_NONE) + psf_binheader_writef (psf, "4", BHW4 (0)) ; + else if (wpriv->wavex_channelmask != 0) + psf_binheader_writef (psf, "4", BHW4 (wpriv->wavex_channelmask)) ; + else + { /* + ** Ok some liberty is taken here to use the most commonly used channel masks + ** instead of "no mapping". If you really want to use "no mapping" for 8 channels and less + ** please don't use wavex. (otherwise we'll have to create a new SF_COMMAND) + */ + switch (psf->sf.channels) + { case 1 : /* center channel mono */ + psf_binheader_writef (psf, "4", BHW4 (0x4)) ; + break ; + + case 2 : /* front left and right */ + psf_binheader_writef (psf, "4", BHW4 (0x1 | 0x2)) ; + break ; + + case 4 : /* Quad */ + psf_binheader_writef (psf, "4", BHW4 (0x1 | 0x2 | 0x10 | 0x20)) ; + break ; + + case 6 : /* 5.1 */ + psf_binheader_writef (psf, "4", BHW4 (0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20)) ; + break ; + + case 8 : /* 7.1 */ + psf_binheader_writef (psf, "4", BHW4 (0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20 | 0x40 | 0x80)) ; + break ; + + default : /* 0 when in doubt , use direct out, ie NO mapping*/ + psf_binheader_writef (psf, "4", BHW4 (0x0)) ; + break ; + } ; + } ; + break ; + + case SF_FORMAT_MS_ADPCM : /* Todo, GUID exists might have different header as per wav_write_header */ + default : + return SFE_UNIMPLEMENTED ; + } ; + + /* GUID section, different for each */ + + switch (subformat) + { case SF_FORMAT_PCM_U8 : + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_32 : + wavlike_write_guid (psf, wpriv->wavex_ambisonic == SF_AMBISONIC_NONE ? + &MSGUID_SUBTYPE_PCM : &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM) ; + break ; + + case SF_FORMAT_FLOAT : + case SF_FORMAT_DOUBLE : + wavlike_write_guid (psf, wpriv->wavex_ambisonic == SF_AMBISONIC_NONE ? + &MSGUID_SUBTYPE_IEEE_FLOAT : &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT) ; + break ; + + case SF_FORMAT_ULAW : + wavlike_write_guid (psf, &MSGUID_SUBTYPE_MULAW) ; + break ; + + case SF_FORMAT_ALAW : + wavlike_write_guid (psf, &MSGUID_SUBTYPE_ALAW) ; + break ; + + default : return SFE_UNIMPLEMENTED ; + } ; + + return 0 ; +} /* rf64_write_fmt_chunk */ + + +static int +rf64_write_header (SF_PRIVATE *psf, int calc_length) +{ sf_count_t current, pad_size ; + int error = 0, has_data = SF_FALSE, add_fact_chunk = 0 ; + WAVLIKE_PRIVATE *wpriv ; + + if ((wpriv = psf->container_data) == NULL) + return SFE_INTERNAL ; + + current = psf_ftell (psf) ; + + if (psf->dataoffset > 0 && current > psf->dataoffset) + has_data = SF_TRUE ; + + if (calc_length) + { psf->filelength = psf_get_filelen (psf) ; + psf->datalength = psf->filelength - psf->dataoffset ; + + if (psf->dataend) + psf->datalength -= psf->filelength - psf->dataend ; + + if (psf->bytewidth > 0) + psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; + } ; + + /* Reset the current header length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + psf_fseek (psf, 0, SEEK_SET) ; + + if (wpriv->rf64_downgrade && psf->filelength < RIFF_DOWNGRADE_BYTES) + { psf_binheader_writef (psf, "etm8m", BHWm (RIFF_MARKER), BHW8 ((psf->filelength < 8) ? 8 : psf->filelength - 8), BHWm (WAVE_MARKER)) ; + psf_binheader_writef (psf, "m4z", BHWm (JUNK_MARKER), BHW4 (24), BHWz (24)) ; + add_fact_chunk = 1 ; + } + else + { psf_binheader_writef (psf, "em4m", BHWm (RF64_MARKER), BHW4 (0xffffffff), BHWm (WAVE_MARKER)) ; + /* Currently no table. */ + psf_binheader_writef (psf, "m48884", BHWm (ds64_MARKER), BHW4 (28), BHW8 (psf->filelength - 8), BHW8 (psf->datalength), BHW8 (psf->sf.frames), BHW4 (0)) ; + } ; + + /* WAVE and 'fmt ' markers. */ + psf_binheader_writef (psf, "m", BHWm (fmt_MARKER)) ; + + /* Write the 'fmt ' chunk. */ + switch (psf->sf.format & SF_FORMAT_TYPEMASK) + { case SF_FORMAT_WAV : + psf_log_printf (psf, "ooops SF_FORMAT_WAV\n") ; + return SFE_UNIMPLEMENTED ; + break ; + + case SF_FORMAT_WAVEX : + case SF_FORMAT_RF64 : + if ((error = rf64_write_fmt_chunk (psf)) != 0) + return error ; + if (add_fact_chunk) + psf_binheader_writef (psf, "tm48", BHWm (fact_MARKER), BHW4 (4), BHW8 (psf->sf.frames)) ; + break ; + + default : + return SFE_UNIMPLEMENTED ; + } ; + + if (psf->broadcast_16k != NULL) + wavlike_write_bext_chunk (psf) ; + + if (psf->cart_16k != NULL) + wavlike_write_cart_chunk (psf) ; + + /* The LIST/INFO chunk. */ + if (psf->strings.flags & SF_STR_LOCATE_START) + wavlike_write_strings (psf, SF_STR_LOCATE_START) ; + + if (psf->peak_info != NULL && psf->peak_info->peak_loc == SF_PEAK_START) + wavlike_write_peak_chunk (psf) ; + + /* Write custom headers. */ + if (psf->wchunks.used > 0) + wavlike_write_custom_chunks (psf) ; + +#if 0 + if (psf->instrument != NULL) + { int tmp ; + double dtune = (double) (0x40000000) / 25.0 ; + + psf_binheader_writef (psf, "m4", BHWm (smpl_MARKER), BHW4 (9 * 4 + psf->instrument->loop_count * 6 * 4)) ; + psf_binheader_writef (psf, "44", BHW4 (0), BHW4 (0)) ; /* Manufacturer zero is everyone */ + tmp = (int) (1.0e9 / psf->sf.samplerate) ; /* Sample period in nano seconds */ + psf_binheader_writef (psf, "44", BHW4 (tmp), BHW4 (psf->instrument->basenote)) ; + tmp = (unsigned int) (psf->instrument->detune * dtune + 0.5) ; + psf_binheader_writef (psf, "4", BHW4 (tmp)) ; + psf_binheader_writef (psf, "44", BHW4 (0), BHW4 (0)) ; /* SMTPE format */ + psf_binheader_writef (psf, "44", BHW4 (psf->instrument->loop_count), BHW4 (0)) ; + + for (tmp = 0 ; tmp < psf->instrument->loop_count ; tmp++) + { int type ; + + type = psf->instrument->loops [tmp].mode ; + type = (type == SF_LOOP_FORWARD ? 0 : type == SF_LOOP_BACKWARD ? 2 : type == SF_LOOP_ALTERNATING ? 1 : 32) ; + + psf_binheader_writef (psf, "44", BHW4 (tmp), BHW4 (type)) ; + psf_binheader_writef (psf, "44", BHW4 (psf->instrument->loops [tmp].start), BHW4 (psf->instrument->loops [tmp].end)) ; + psf_binheader_writef (psf, "44", BHW4 (0), BHW4 (psf->instrument->loops [tmp].count)) ; + } ; + } ; + +#endif + + /* Padding may be needed if string data sizes change. */ + pad_size = psf->dataoffset - 16 - psf->header.indx ; + if (pad_size >= 0) + psf_binheader_writef (psf, "m4z", BHWm (PAD_MARKER), BHW4 ((unsigned int) pad_size), BHWz (pad_size)) ; + + if (wpriv->rf64_downgrade && (psf->filelength < RIFF_DOWNGRADE_BYTES)) + psf_binheader_writef (psf, "tm8", BHWm (data_MARKER), BHW8 (psf->datalength)) ; + else + psf_binheader_writef (psf, "m4", BHWm (data_MARKER), BHW4 (0xffffffff)) ; + + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + if (psf->error) + return psf->error ; + + if (has_data && psf->dataoffset != psf->header.indx) + { psf_log_printf (psf, "Oooops : has_data && psf->dataoffset != psf->header.indx\n") ; + return psf->error = SFE_INTERNAL ; + } ; + + psf->dataoffset = psf->header.indx ; + + if (NOT (has_data)) + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + else if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + + return psf->error ; +} /* rf64_write_header */ + +static int +rf64_write_tailer (SF_PRIVATE *psf) +{ + /* Reset the current header buffer length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + + if (psf->bytewidth > 0 && psf->sf.seekable == SF_TRUE) + { psf->datalength = psf->sf.frames * psf->bytewidth * psf->sf.channels ; + psf->dataend = psf->dataoffset + psf->datalength ; + } ; + + if (psf->dataend > 0) + psf_fseek (psf, psf->dataend, SEEK_SET) ; + else + psf->dataend = psf_fseek (psf, 0, SEEK_END) ; + + if (psf->dataend & 1) + psf_binheader_writef (psf, "z", BHWz (1)) ; + + if (psf->strings.flags & SF_STR_LOCATE_END) + wavlike_write_strings (psf, SF_STR_LOCATE_END) ; + + /* Write the tailer. */ + if (psf->header.indx > 0) + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + return 0 ; +} /* rf64_write_tailer */ + +static int +rf64_close (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { rf64_write_tailer (psf) ; + rf64_write_header (psf, SF_TRUE) ; + } ; + + return 0 ; +} /* rf64_close */ + +static int +rf64_command (SF_PRIVATE *psf, int command, void * UNUSED (data), int datasize) +{ WAVLIKE_PRIVATE *wpriv ; + + if ((wpriv = psf->container_data) == NULL) + return SFE_INTERNAL ; + + switch (command) + { case SFC_WAVEX_SET_AMBISONIC : + if ((SF_CONTAINER (psf->sf.format)) == SF_FORMAT_WAVEX) + { if (datasize == SF_AMBISONIC_NONE) + wpriv->wavex_ambisonic = SF_AMBISONIC_NONE ; + else if (datasize == SF_AMBISONIC_B_FORMAT) + wpriv->wavex_ambisonic = SF_AMBISONIC_B_FORMAT ; + else + return 0 ; + } ; + return wpriv->wavex_ambisonic ; + + case SFC_WAVEX_GET_AMBISONIC : + return wpriv->wavex_ambisonic ; + + case SFC_SET_CHANNEL_MAP_INFO : + wpriv->wavex_channelmask = wavlike_gen_channel_mask (psf->channel_map, psf->sf.channels) ; + return (wpriv->wavex_channelmask != 0) ; + + case SFC_RF64_AUTO_DOWNGRADE : + if (psf->have_written == 0) + wpriv->rf64_downgrade = datasize ? SF_TRUE : SF_FALSE ; + return wpriv->rf64_downgrade ; + + default : + break ; + } ; + + return 0 ; +} /* rf64_command */ + +static int +rf64_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info) +{ return psf_save_write_chunk (&psf->wchunks, chunk_info) ; +} /* rf64_set_chunk */ + +static SF_CHUNK_ITERATOR * +rf64_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator) +{ return psf_next_chunk_iterator (&psf->rchunks, iterator) ; +} /* rf64_next_chunk_iterator */ + +static int +rf64_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) +{ int indx ; + + if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0) + return SFE_UNKNOWN_CHUNK ; + + chunk_info->datalen = psf->rchunks.chunks [indx].len ; + + return SFE_NO_ERROR ; +} /* rf64_get_chunk_size */ + +static int +rf64_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) +{ int indx ; + sf_count_t pos ; + + if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0) + return SFE_UNKNOWN_CHUNK ; + + if (chunk_info->data == NULL) + return SFE_BAD_CHUNK_DATA_PTR ; + + chunk_info->id_size = psf->rchunks.chunks [indx].id_size ; + memcpy (chunk_info->id, psf->rchunks.chunks [indx].id, sizeof (chunk_info->id) / sizeof (*chunk_info->id)) ; + + pos = psf_ftell (psf) ; + psf_fseek (psf, psf->rchunks.chunks [indx].offset, SEEK_SET) ; + psf_fread (chunk_info->data, SF_MIN (chunk_info->datalen, psf->rchunks.chunks [indx].len), 1, psf) ; + psf_fseek (psf, pos, SEEK_SET) ; + + return SFE_NO_ERROR ; +} /* rf64_get_chunk_data */ diff --git a/libsndfile-1.0.31/src/rx2.c b/libsndfile-1.0.31/src/rx2.c new file mode 100644 index 0000000..0a73048 --- /dev/null +++ b/libsndfile-1.0.31/src/rx2.c @@ -0,0 +1,318 @@ +/* +** Copyright (C) 2001-2012 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +#if (ENABLE_EXPERIMENTAL_CODE == 0) + +int +rx2_open (SF_PRIVATE *psf) +{ if (psf) + return SFE_UNIMPLEMENTED ; + return 0 ; +} /* rx2_open */ + +#else + +/*------------------------------------------------------------------------------ + * Macros to handle big/little endian issues. +*/ + +#define CAT_MARKER (MAKE_MARKER ('C', 'A', 'T', ' ')) +#define GLOB_MARKER (MAKE_MARKER ('G', 'L', 'O', 'B')) + +#define RECY_MARKER (MAKE_MARKER ('R', 'E', 'C', 'Y')) + +#define SLCL_MARKER (MAKE_MARKER ('S', 'L', 'C', 'L')) +#define SLCE_MARKER (MAKE_MARKER ('S', 'L', 'C', 'E')) + +#define DEVL_MARKER (MAKE_MARKER ('D', 'E', 'V', 'L')) +#define TRSH_MARKER (MAKE_MARKER ('T', 'R', 'S', 'H')) + +#define EQ_MARKER (MAKE_MARKER ('E', 'Q', ' ', ' ')) +#define COMP_MARKER (MAKE_MARKER ('C', 'O', 'M', 'P')) + +#define SINF_MARKER (MAKE_MARKER ('S', 'I', 'N', 'F')) +#define SDAT_MARKER (MAKE_MARKER ('S', 'D', 'A', 'T')) + +/*------------------------------------------------------------------------------ + * Typedefs for file chunks. +*/ + + +/*------------------------------------------------------------------------------ + * Private static functions. +*/ +static int rx2_close (SF_PRIVATE *psf) ; + +/*------------------------------------------------------------------------------ +** Public functions. +*/ + +int +rx2_open (SF_PRIVATE *psf) +{ static const char *marker_type [4] = + { "Original Enabled", "Enabled Hidden", + "Additional/PencilTool", "Disabled" + } ; + + BUF_UNION ubuf ; + int error, marker, length, glob_offset, slce_count, frames ; + int sdat_length = 0, slce_total = 0 ; + int n_channels ; + + + /* So far only doing read. */ + + psf_binheader_readf (psf, "Epm4", 0, &marker, &length) ; + + if (marker != CAT_MARKER) + { psf_log_printf (psf, "length : %d\n", length) ; + return -1000 ; + } ; + + if (length != psf->filelength - 8) + psf_log_printf (psf, "%M : %d (should be %d)\n", marker, length, psf->filelength - 8) ; + else + psf_log_printf (psf, "%M : %d\n", marker, length) ; + + /* 'REX2' marker */ + psf_binheader_readf (psf, "m", &marker) ; + psf_log_printf (psf, "%M", marker) ; + + /* 'HEAD' marker */ + psf_binheader_readf (psf, "m", &marker) ; + psf_log_printf (psf, "%M\n", marker) ; + + /* Grab 'GLOB' offset. */ + psf_binheader_readf (psf, "E4", &glob_offset) ; + glob_offset += 0x14 ; /* Add the current file offset. */ + + /* Jump to offset 0x30 */ + psf_binheader_readf (psf, "p", 0x30) ; + + /* Get name length */ + length = 0 ; + psf_binheader_readf (psf, "1", &length) ; + if (length >= SIGNED_SIZEOF (ubuf.cbuf)) + { psf_log_printf (psf, " Text : %d *** Error : Too sf_count_t!\n") ; + return -1001 ; + } + + memset (ubuf.cbuf, 0, sizeof (ubuf.cbuf)) ; + psf_binheader_readf (psf, "b", ubuf.cbuf, length) ; + psf_log_printf (psf, " Text : \"%s\"\n", ubuf.cbuf) ; + + /* Jump to GLOB offset position. */ + if (glob_offset & 1) + glob_offset ++ ; + + psf_binheader_readf (psf, "p", glob_offset) ; + + slce_count = 0 ; + /* GLOB */ + while (1) + { psf_binheader_readf (psf, "m", &marker) ; + + if (marker != SLCE_MARKER && slce_count > 0) + { psf_log_printf (psf, " SLCE count : %d\n", slce_count) ; + slce_count = 0 ; + } + switch (marker) + { case GLOB_MARKER: + psf_binheader_readf (psf, "E4", &length) ; + psf_log_printf (psf, " %M : %d\n", marker, length) ; + psf_binheader_readf (psf, "j", length) ; + break ; + + case RECY_MARKER: + psf_binheader_readf (psf, "E4", &length) ; + psf_log_printf (psf, " %M : %d\n", marker, length) ; + psf_binheader_readf (psf, "j", (length+1) & 0xFFFFFFFE) ; /* ?????? */ + break ; + + case CAT_MARKER: + psf_binheader_readf (psf, "E4", &length) ; + psf_log_printf (psf, " %M : %d\n", marker, length) ; + /*-psf_binheader_readf (psf, "j", length) ;-*/ + break ; + + case DEVL_MARKER: + psf_binheader_readf (psf, "mE4", &marker, &length) ; + psf_log_printf (psf, " DEVL%M : %d\n", marker, length) ; + if (length & 1) + length ++ ; + psf_binheader_readf (psf, "j", length) ; + break ; + + case EQ_MARKER: + case COMP_MARKER: + psf_binheader_readf (psf, "E4", &length) ; + psf_log_printf (psf, " %M : %d\n", marker, length) ; + /* This is weird!!!! why make this (length - 1) */ + if (length & 1) + length ++ ; + psf_binheader_readf (psf, "j", length) ; + break ; + + case SLCL_MARKER: + psf_log_printf (psf, " %M\n (Offset, Next Offset, Type)\n", marker) ; + slce_count = 0 ; + break ; + + case SLCE_MARKER: + { int len [4], indx ; + + psf_binheader_readf (psf, "E4444", &len [0], &len [1], &len [2], &len [3]) ; + + indx = ((len [3] & 0x0000FFFF) >> 8) & 3 ; + + if (len [2] == 1) + { if (indx != 1) + indx = 3 ; /* 2 cases, where next slice offset = 1 -> disabled & enabled/hidden */ + + psf_log_printf (psf, " %M : (%6d, ?: 0x%X, %s)\n", marker, len [1], (len [3] & 0xFFFF0000) >> 16, marker_type [indx]) ; + } + else + { slce_total += len [2] ; + + psf_log_printf (psf, " %M : (%6d, SLCE_next_ofs:%d, ?: 0x%X, %s)\n", marker, len [1], len [2], (len [3] & 0xFFFF0000) >> 16, marker_type [indx]) ; + } ; + + slce_count ++ ; + } ; + break ; + + case SINF_MARKER: + psf_binheader_readf (psf, "E4", &length) ; + psf_log_printf (psf, " %M : %d\n", marker, length) ; + + psf_binheader_readf (psf, "E2", &n_channels) ; + n_channels = (n_channels & 0x0000FF00) >> 8 ; + psf_log_printf (psf, " Channels : %d\n", n_channels) ; + + psf_binheader_readf (psf, "E44", &psf->sf.samplerate, &frames) ; + psf->sf.frames = frames ; + psf_log_printf (psf, " Sample Rate : %d\n", psf->sf.samplerate) ; + psf_log_printf (psf, " Frames : %D\n", psf->sf.frames) ; + + psf_binheader_readf (psf, "E4", &length) ; + psf_log_printf (psf, " ??????????? : %d\n", length) ; + + psf_binheader_readf (psf, "E4", &length) ; + psf_log_printf (psf, " ??????????? : %d\n", length) ; + break ; + + case SDAT_MARKER: + psf_binheader_readf (psf, "E4", &length) ; + + sdat_length = length ; + + /* Get the current offset. */ + psf->dataoffset = psf_binheader_readf (psf, NULL) ; + + if (psf->dataoffset + length != psf->filelength) + psf_log_printf (psf, " %M : %d (should be %d)\n", marker, length, psf->dataoffset + psf->filelength) ; + else + psf_log_printf (psf, " %M : %d\n", marker, length) ; + break ; + + default : + psf_log_printf (psf, "Unknown marker : 0x%X %M", marker, marker) ; + return -1003 ; + break ; + } ; + + /* SDAT always last marker in file. */ + if (marker == SDAT_MARKER) + break ; + } ; + + puts (psf->parselog.buf) ; + puts ("-----------------------------------") ; + + printf ("SDAT length : %d\n", sdat_length) ; + printf ("SLCE count : %d\n", slce_count) ; + + /* Hack for zero slice count. */ + if (slce_count == 0 && slce_total == 1) + slce_total = frames ; + + printf ("SLCE samples : %d\n", slce_total) ; + + /* Two bytes per sample. */ + printf ("Comp Ratio : %f:1\n", (2.0 * slce_total * n_channels) / sdat_length) ; + + puts (" ") ; + + psf->parselog.buf [0] = 0 ; + + /* OK, have the header although not too sure what it all means. */ + + psf->endian = SF_ENDIAN_BIG ; + + psf->datalength = psf->filelength - psf->dataoffset ; + + if (psf_fseek (psf, psf->dataoffset, SEEK_SET)) + return SFE_BAD_SEEK ; + + psf->sf.format = (SF_FORMAT_REX2 | SF_FORMAT_DWVW_12) ; + + psf->sf.channels = 1 ; + psf->bytewidth = 2 ; + psf->blockwidth = psf->sf.channels * psf->bytewidth ; + + if ((error = dwvw_init (psf, 16))) + return error ; + + psf->container_close = rx2_close ; + + if (! psf->sf.frames && psf->blockwidth) + psf->sf.frames = psf->datalength / psf->blockwidth ; + + /* All done. */ + + return 0 ; +} /* rx2_open */ + +/*------------------------------------------------------------------------------ +*/ + +static int +rx2_close (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_WRITE) + { /* Now we know for certain the length of the file we can re-write + ** correct values for the FORM, 8SVX and BODY chunks. + */ + + } ; + + return 0 ; +} /* rx2_close */ + +#endif diff --git a/libsndfile-1.0.31/src/sd2.c b/libsndfile-1.0.31/src/sd2.c new file mode 100644 index 0000000..dd3dbef --- /dev/null +++ b/libsndfile-1.0.31/src/sd2.c @@ -0,0 +1,619 @@ +/* +** Copyright (C) 2001-2020 Erik de Castro Lopo +** Copyright (C) 2004 Paavo Jumppanen +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +/* +** The sd2 support implemented in this file was partially sponsored +** (financially) by Paavo Jumppanen. +*/ + +/* +** Documentation on the Mac resource fork was obtained here : +** http://developer.apple.com/documentation/mac/MoreToolbox/MoreToolbox-99.html +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +/*------------------------------------------------------------------------------ + * Markers. +*/ + +#define Sd2f_MARKER MAKE_MARKER ('S', 'd', '2', 'f') +#define Sd2a_MARKER MAKE_MARKER ('S', 'd', '2', 'a') +#define ALCH_MARKER MAKE_MARKER ('A', 'L', 'C', 'H') +#define lsf1_MARKER MAKE_MARKER ('l', 's', 'f', '1') + +#define STR_MARKER MAKE_MARKER ('S', 'T', 'R', ' ') +#define sdML_MARKER MAKE_MARKER ('s', 'd', 'M', 'L') + +enum +{ RSRC_STR = 111, + RSRC_BIN +} ; + +typedef struct +{ unsigned char * rsrc_data ; + int rsrc_len ; + int need_to_free_rsrc_data ; + + int data_offset, data_length ; + int map_offset, map_length ; + + int type_count, type_offset ; + int item_offset ; + + int str_index, str_count ; + + int string_offset ; + + /* All the above just to get these three. */ + int sample_size, sample_rate, channels ; +} SD2_RSRC ; + +typedef struct +{ int type ; + int id ; + char name [32] ; + char value [32] ; + int value_len ; +} STR_RSRC ; + +/*------------------------------------------------------------------------------ + * Private static functions. +*/ + +static int sd2_close (SF_PRIVATE *psf) ; + +static int sd2_parse_rsrc_fork (SF_PRIVATE *psf) ; +static int parse_str_rsrc (SF_PRIVATE *psf, SD2_RSRC * rsrc) ; + +static int sd2_write_rsrc_fork (SF_PRIVATE *psf, int calc_length) ; + +/*------------------------------------------------------------------------------ +** Public functions. +*/ + +int +sd2_open (SF_PRIVATE *psf) +{ int subformat, error = 0, valid ; + + /* SD2 is always big endian. */ + psf->endian = SF_ENDIAN_BIG ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->rsrclength > 0)) + { psf_use_rsrc (psf, SF_TRUE) ; + valid = psf_file_valid (psf) ; + psf_use_rsrc (psf, SF_FALSE) ; + if (! valid) + { psf_log_printf (psf, "sd2_open : psf->rsrc.filedes < 0\n") ; + return SFE_SD2_BAD_RSRC ; + } ; + + error = sd2_parse_rsrc_fork (psf) ; + + if (error) + goto error_cleanup ; + } ; + + if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_SD2) + { error = SFE_BAD_OPEN_FORMAT ; + goto error_cleanup ; + } ; + + subformat = SF_CODEC (psf->sf.format) ; + psf->dataoffset = 0 ; + + /* Only open and write the resource in RDWR mode is its current length is zero. */ + if (psf->file.mode == SFM_WRITE || (psf->file.mode == SFM_RDWR && psf->rsrclength == 0)) + { psf->rsrc.mode = psf->file.mode ; + psf_open_rsrc (psf) ; + + error = sd2_write_rsrc_fork (psf, SF_FALSE) ; + + if (error) + goto error_cleanup ; + + /* Not needed. */ + psf->write_header = NULL ; + } ; + + psf->container_close = sd2_close ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + + switch (subformat) + { case SF_FORMAT_PCM_S8 : /* 8-bit linear PCM. */ + case SF_FORMAT_PCM_16 : /* 16-bit linear PCM. */ + case SF_FORMAT_PCM_24 : /* 24-bit linear PCM */ + case SF_FORMAT_PCM_32 : /* 32-bit linear PCM */ + error = pcm_init (psf) ; + break ; + + default : + error = SFE_UNIMPLEMENTED ; + break ; + } ; + + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + +error_cleanup: + + /* Close the resource fork regardless. We won't need it again. */ + psf_close_rsrc (psf) ; + + return error ; +} /* sd2_open */ + +/*------------------------------------------------------------------------------ +*/ + +static int +sd2_close (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_WRITE) + { /* Now we know for certain the audio_length of the file we can re-write + ** correct values for the FORM, 8SVX and BODY chunks. + */ + + } ; + + return 0 ; +} /* sd2_close */ + +/*------------------------------------------------------------------------------ +*/ + +static int +sd2_write_rsrc_fork (SF_PRIVATE *psf, int UNUSED (calc_length)) +{ SD2_RSRC rsrc ; + STR_RSRC str_rsrc [] = + { { RSRC_STR, 1000, "_sample-size", "", 0 }, + { RSRC_STR, 1001, "_sample-rate", "", 0 }, + { RSRC_STR, 1002, "_channels", "", 0 }, + { RSRC_BIN, 1000, "_Markers", "", 8 } + } ; + + int k, str_offset, data_offset, next_str ; + + psf_use_rsrc (psf, SF_TRUE) ; + + memset (&rsrc, 0, sizeof (rsrc)) ; + + rsrc.sample_rate = psf->sf.samplerate ; + rsrc.sample_size = psf->bytewidth ; + rsrc.channels = psf->sf.channels ; + + rsrc.rsrc_data = psf->header.ptr ; + rsrc.rsrc_len = psf->header.len ; + memset (rsrc.rsrc_data, 0xea, rsrc.rsrc_len) ; + + snprintf (str_rsrc [0].value, sizeof (str_rsrc [0].value), "_%d", rsrc.sample_size) ; + snprintf (str_rsrc [1].value, sizeof (str_rsrc [1].value), "_%d.000000", rsrc.sample_rate) ; + snprintf (str_rsrc [2].value, sizeof (str_rsrc [2].value), "_%d", rsrc.channels) ; + + for (k = 0 ; k < ARRAY_LEN (str_rsrc) ; k++) + { if (str_rsrc [k].value_len == 0) + { str_rsrc [k].value_len = strlen (str_rsrc [k].value) ; + str_rsrc [k].value [0] = str_rsrc [k].value_len - 1 ; + } ; + + /* Turn name string into a pascal string. */ + str_rsrc [k].name [0] = strlen (str_rsrc [k].name) - 1 ; + } ; + + rsrc.data_offset = 0x100 ; + + /* + ** Calculate data length : + ** length of strings, plus the length of the sdML chunk. + */ + rsrc.data_length = 0 ; + for (k = 0 ; k < ARRAY_LEN (str_rsrc) ; k++) + rsrc.data_length += str_rsrc [k].value_len + 4 ; + + rsrc.map_offset = rsrc.data_offset + rsrc.data_length ; + + /* Very start of resource fork. */ + psf_binheader_writef (psf, "E444", BHW4 (rsrc.data_offset), BHW4 (rsrc.map_offset), BHW4 (rsrc.data_length)) ; + + psf_binheader_writef (psf, "Eop", BHWo (0x30), BHWp (psf->file.name.c)) ; + psf_binheader_writef (psf, "Eo2mm", BHWo (0x50), BHW2 (0), BHWm (Sd2f_MARKER), BHWm (lsf1_MARKER)) ; + + /* Very start of resource map. */ + psf_binheader_writef (psf, "E4444", BHW4 (rsrc.map_offset), BHW4 (rsrc.data_offset), BHW4 (rsrc.map_offset), BHW4 (rsrc.data_length)) ; + + /* These I don't currently understand. */ + if (1) + { psf_binheader_writef (psf, "Eo1422", BHWo (rsrc.map_offset + 16), BHW1 (1), BHW4 (0x12345678), BHW2 (0xabcd), BHW2 (0)) ; + } ; + + /* Resource type offset. */ + rsrc.type_offset = rsrc.map_offset + 30 ; + psf_binheader_writef (psf, "Eo2", BHWo (rsrc.map_offset + 24), BHW2 (rsrc.type_offset - rsrc.map_offset - 2)) ; + + /* Type index max. */ + rsrc.type_count = 2 ; + psf_binheader_writef (psf, "Eo2", BHWo (rsrc.map_offset + 28), BHW2 (rsrc.type_count - 1)) ; + + rsrc.item_offset = rsrc.type_offset + rsrc.type_count * 8 ; + + rsrc.str_count = ARRAY_LEN (str_rsrc) ; + rsrc.string_offset = rsrc.item_offset + (rsrc.str_count + 1) * 12 - rsrc.map_offset ; + psf_binheader_writef (psf, "Eo2", BHWo (rsrc.map_offset + 26), BHW2 (rsrc.string_offset)) ; + + /* Write 'STR ' resource type. */ + rsrc.str_count = 3 ; + psf_binheader_writef (psf, "Eom22", BHWo (rsrc.type_offset), BHWm (STR_MARKER), BHW2 (rsrc.str_count - 1), BHW2 (0x12)) ; + + /* Write 'sdML' resource type. */ + psf_binheader_writef (psf, "Em22", BHWm (sdML_MARKER), BHW2 (0), BHW2 (0x36)) ; + + str_offset = rsrc.map_offset + rsrc.string_offset ; + next_str = 0 ; + data_offset = rsrc.data_offset ; + for (k = 0 ; k < ARRAY_LEN (str_rsrc) ; k++) + { psf_binheader_writef (psf, "Eop", BHWo (str_offset), BHWp (str_rsrc [k].name)) ; + psf_binheader_writef (psf, "Eo22", BHWo (rsrc.item_offset + k * 12), BHW2 (str_rsrc [k].id), BHW2 (next_str)) ; + + str_offset += strlen (str_rsrc [k].name) ; + next_str += strlen (str_rsrc [k].name) ; + + psf_binheader_writef (psf, "Eo4", BHWo (rsrc.item_offset + k * 12 + 4), BHW4 (data_offset - rsrc.data_offset)) ; + psf_binheader_writef (psf, "Eo4", BHWo (data_offset), BHW4 (str_rsrc [k].value_len)) ; + + psf_binheader_writef (psf, "Eob", BHWo (data_offset + 4), BHWv (str_rsrc [k].value), BHWz (str_rsrc [k].value_len)) ; + data_offset += 4 + str_rsrc [k].value_len ; + } ; + + /* Finally, calculate and set map length. */ + rsrc.map_length = str_offset - rsrc.map_offset ; + psf_binheader_writef (psf, "Eo4o4", BHWo (12), BHW4 (rsrc.map_length), + BHWo (rsrc.map_offset + 12), BHW4 (rsrc.map_length)) ; + + psf->header.indx = rsrc.map_offset + rsrc.map_length ; + + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + psf_use_rsrc (psf, SF_FALSE) ; + + if (psf->error) + return psf->error ; + + return 0 ; +} /* sd2_write_rsrc_fork */ + +/*------------------------------------------------------------------------------ +*/ + +static inline int +read_rsrc_char (const SD2_RSRC *prsrc, int offset) +{ const unsigned char * data = prsrc->rsrc_data ; + if (offset < 0 || offset >= prsrc->rsrc_len) + return 0 ; + return data [offset] ; +} /* read_rsrc_char */ + +static inline int +read_rsrc_short (const SD2_RSRC *prsrc, int offset) +{ const unsigned char * data = prsrc->rsrc_data ; + if (offset < 0 || offset + 1 >= prsrc->rsrc_len) + return 0 ; + return (data [offset] << 8) + data [offset + 1] ; +} /* read_rsrc_short */ + +static inline int +read_rsrc_int (const SD2_RSRC *prsrc, int offset) +{ const unsigned char * data = prsrc->rsrc_data ; + if (offset < 0 || offset + 3 >= prsrc->rsrc_len) + return 0 ; + return (((uint32_t) data [offset]) << 24) + (data [offset + 1] << 16) + (data [offset + 2] << 8) + data [offset + 3] ; +} /* read_rsrc_int */ + +static inline int +read_rsrc_marker (const SD2_RSRC *prsrc, int offset) +{ const unsigned char * data = prsrc->rsrc_data ; + + if (offset < 0 || offset + 3 >= prsrc->rsrc_len) + return 0 ; + + if (CPU_IS_BIG_ENDIAN) + return (((uint32_t) data [offset]) << 24) + (data [offset + 1] << 16) + (data [offset + 2] << 8) + data [offset + 3] ; + if (CPU_IS_LITTLE_ENDIAN) + return data [offset] + (data [offset + 1] << 8) + (data [offset + 2] << 16) + (((uint32_t) data [offset + 3]) << 24) ; + + return 0 ; +} /* read_rsrc_marker */ + +static void +read_rsrc_str (const SD2_RSRC *prsrc, int offset, char * buffer, int buffer_len) +{ const unsigned char * data = prsrc->rsrc_data ; + int k ; + + memset (buffer, 0, buffer_len) ; + + if (offset < 0 || offset + buffer_len >= prsrc->rsrc_len) + return ; + + for (k = 0 ; k < buffer_len - 1 ; k++) + { if (psf_isprint (data [offset + k]) == 0) + return ; + buffer [k] = data [offset + k] ; + } ; + return ; +} /* read_rsrc_str */ + +static int +sd2_parse_rsrc_fork (SF_PRIVATE *psf) +{ SD2_RSRC rsrc ; + int k, marker, error = 0 ; + + psf_use_rsrc (psf, SF_TRUE) ; + + memset (&rsrc, 0, sizeof (rsrc)) ; + + rsrc.rsrc_len = psf_get_filelen (psf) ; + psf_log_printf (psf, "Resource length : %d (0x%04X)\n", rsrc.rsrc_len, rsrc.rsrc_len) ; + + if (rsrc.rsrc_len > psf->header.len) + { rsrc.rsrc_data = calloc (1, rsrc.rsrc_len) ; + rsrc.need_to_free_rsrc_data = SF_TRUE ; + } + else + { + rsrc.rsrc_data = psf->header.ptr ; + // rsrc.rsrc_len > psf->header.len ; + rsrc.need_to_free_rsrc_data = SF_FALSE ; + } ; + + /* Read in the whole lot. */ + psf_fread (rsrc.rsrc_data, rsrc.rsrc_len, 1, psf) ; + + /* Reset the header storage because we have changed to the rsrcdes. */ + psf->header.indx = psf->header.end = rsrc.rsrc_len ; + + rsrc.data_offset = read_rsrc_int (&rsrc, 0) ; + rsrc.map_offset = read_rsrc_int (&rsrc, 4) ; + rsrc.data_length = read_rsrc_int (&rsrc, 8) ; + rsrc.map_length = read_rsrc_int (&rsrc, 12) ; + + if (rsrc.data_offset == 0x51607 && rsrc.map_offset == 0x20000) + { psf_log_printf (psf, "Trying offset of 0x52 bytes.\n") ; + rsrc.data_offset = read_rsrc_int (&rsrc, 0x52 + 0) + 0x52 ; + rsrc.map_offset = read_rsrc_int (&rsrc, 0x52 + 4) + 0x52 ; + rsrc.data_length = read_rsrc_int (&rsrc, 0x52 + 8) ; + rsrc.map_length = read_rsrc_int (&rsrc, 0x52 + 12) ; + } ; + + psf_log_printf (psf, " data offset : 0x%04X\n map offset : 0x%04X\n" + " data length : 0x%04X\n map length : 0x%04X\n", + rsrc.data_offset, rsrc.map_offset, rsrc.data_length, rsrc.map_length) ; + + if (rsrc.data_offset > rsrc.rsrc_len) + { psf_log_printf (psf, "Error : rsrc.data_offset (%d, 0x%x) > len\n", rsrc.data_offset, rsrc.data_offset) ; + error = SFE_SD2_BAD_DATA_OFFSET ; + goto parse_rsrc_fork_cleanup ; + } ; + + if (rsrc.map_offset > rsrc.rsrc_len) + { psf_log_printf (psf, "Error : rsrc.map_offset > len\n") ; + error = SFE_SD2_BAD_MAP_OFFSET ; + goto parse_rsrc_fork_cleanup ; + } ; + + if (rsrc.data_length > rsrc.rsrc_len) + { psf_log_printf (psf, "Error : rsrc.data_length > len\n") ; + error = SFE_SD2_BAD_DATA_LENGTH ; + goto parse_rsrc_fork_cleanup ; + } ; + + if (rsrc.map_length > rsrc.rsrc_len) + { psf_log_printf (psf, "Error : rsrc.map_length > len\n") ; + error = SFE_SD2_BAD_MAP_LENGTH ; + goto parse_rsrc_fork_cleanup ; + } ; + + if (rsrc.data_offset + rsrc.data_length != rsrc.map_offset || rsrc.map_offset + rsrc.map_length != rsrc.rsrc_len) + { psf_log_printf (psf, "Error : This does not look like a MacOSX resource fork.\n") ; + error = SFE_SD2_BAD_RSRC ; + goto parse_rsrc_fork_cleanup ; + } ; + + if (rsrc.map_offset + 28 >= rsrc.rsrc_len) + { psf_log_printf (psf, "Bad map offset (%d + 28 > %d).\n", rsrc.map_offset, rsrc.rsrc_len) ; + error = SFE_SD2_BAD_RSRC ; + goto parse_rsrc_fork_cleanup ; + } ; + + rsrc.string_offset = rsrc.map_offset + read_rsrc_short (&rsrc, rsrc.map_offset + 26) ; + if (rsrc.string_offset > rsrc.rsrc_len) + { psf_log_printf (psf, "Bad string offset (%d).\n", rsrc.string_offset) ; + error = SFE_SD2_BAD_RSRC ; + goto parse_rsrc_fork_cleanup ; + } ; + + rsrc.type_offset = rsrc.map_offset + 30 ; + + if (rsrc.map_offset + 28 > rsrc.rsrc_len) + { psf_log_printf (psf, "Bad map offset.\n") ; + goto parse_rsrc_fork_cleanup ; + } ; + + rsrc.type_count = read_rsrc_short (&rsrc, rsrc.map_offset + 28) + 1 ; + if (rsrc.type_count < 1) + { psf_log_printf (psf, "Bad type count.\n") ; + error = SFE_SD2_BAD_RSRC ; + goto parse_rsrc_fork_cleanup ; + } ; + + rsrc.item_offset = rsrc.type_offset + rsrc.type_count * 8 ; + if (rsrc.item_offset < 0 || rsrc.item_offset > rsrc.rsrc_len) + { psf_log_printf (psf, "Bad item offset (%d).\n", rsrc.item_offset) ; + error = SFE_SD2_BAD_RSRC ; + goto parse_rsrc_fork_cleanup ; + } ; + + rsrc.str_index = -1 ; + for (k = 0 ; k < rsrc.type_count ; k ++) + { if (rsrc.type_offset + k * 8 > rsrc.rsrc_len) + { psf_log_printf (psf, "Bad rsrc marker.\n") ; + goto parse_rsrc_fork_cleanup ; + } ; + + marker = read_rsrc_marker (&rsrc, rsrc.type_offset + k * 8) ; + + if (marker == STR_MARKER) + { rsrc.str_index = k ; + rsrc.str_count = read_rsrc_short (&rsrc, rsrc.type_offset + k * 8 + 4) + 1 ; + error = parse_str_rsrc (psf, &rsrc) ; + goto parse_rsrc_fork_cleanup ; + } ; + } ; + + psf_log_printf (psf, "No 'STR ' resource.\n") ; + error = SFE_SD2_BAD_RSRC ; + +parse_rsrc_fork_cleanup : + + psf_use_rsrc (psf, SF_FALSE) ; + + if (rsrc.need_to_free_rsrc_data) + free (rsrc.rsrc_data) ; + + return error ; +} /* sd2_parse_rsrc_fork */ + +static int +parse_str_rsrc (SF_PRIVATE *psf, SD2_RSRC * rsrc) +{ char name [32], value [32] ; + int k, str_offset, rsrc_id, data_offset = 0, data_len = 0 ; + + psf_log_printf (psf, "Finding parameters :\n") ; + + str_offset = rsrc->string_offset ; + psf_log_printf (psf, " Offset RsrcId dlen slen Value\n") ; + + + for (k = 0 ; data_offset + data_len < rsrc->rsrc_len ; k++) + { int slen ; + + slen = read_rsrc_char (rsrc, str_offset) ; + read_rsrc_str (rsrc, str_offset + 1, name, SF_MIN (SIGNED_SIZEOF (name), slen + 1)) ; + str_offset += slen + 1 ; + + // work-around for GitHub issue #340 + int id_offset = rsrc->item_offset + k * 12 ; + if (id_offset < 0 || id_offset + 1 >= rsrc->rsrc_len) + { psf_log_printf (psf, "Exiting parser on id_offset of %d.\n", id_offset) ; + break ; + } + rsrc_id = read_rsrc_short (rsrc, id_offset) ; + + data_offset = rsrc->data_offset + read_rsrc_int (rsrc, rsrc->item_offset + k * 12 + 4) ; + if (data_offset < 0 || data_offset > rsrc->rsrc_len) + { psf_log_printf (psf, "Exiting parser on data offset of %d.\n", data_offset) ; + break ; + } ; + + data_len = read_rsrc_int (rsrc, data_offset) ; + if (data_len < 0 || data_len > rsrc->rsrc_len) + { psf_log_printf (psf, "Exiting parser on data length of %d.\n", data_len) ; + break ; + } ; + + slen = read_rsrc_char (rsrc, data_offset + 4) ; + read_rsrc_str (rsrc, data_offset + 5, value, SF_MIN (SIGNED_SIZEOF (value), slen + 1)) ; + + psf_log_printf (psf, " 0x%04x %4d %4d %3d '%s'\n", data_offset, rsrc_id, data_len, slen, value) ; + + if (strstr (value, "Photoshop")) + { psf_log_printf (psf, "Exiting parser on Photoshop data.\n", data_offset) ; + break ; + } ; + + if (rsrc_id == 1000 && rsrc->sample_size == 0) + rsrc->sample_size = strtol (value, NULL, 10) ; + else if (rsrc_id == 1001 && rsrc->sample_rate == 0) + rsrc->sample_rate = strtol (value, NULL, 10) ; + else if (rsrc_id == 1002 && rsrc->channels == 0) + rsrc->channels = strtol (value, NULL, 10) ; + } ; + + psf_log_printf (psf, "Found Parameters :\n") ; + psf_log_printf (psf, " sample-size : %d\n", rsrc->sample_size) ; + psf_log_printf (psf, " sample-rate : %d\n", rsrc->sample_rate) ; + psf_log_printf (psf, " channels : %d\n", rsrc->channels) ; + + if (rsrc->sample_rate <= 4 && rsrc->sample_size > 4) + { int temp ; + + psf_log_printf (psf, "Geez!! Looks like sample rate and sample size got switched.\nCorrecting this screw up.\n") ; + temp = rsrc->sample_rate ; + rsrc->sample_rate = rsrc->sample_size ; + rsrc->sample_size = temp ; + } ; + + if (rsrc->sample_rate < 0) + { psf_log_printf (psf, "Bad sample rate (%d)\n", rsrc->sample_rate) ; + return SFE_SD2_BAD_RSRC ; + } ; + + if (rsrc->channels < 0) + { psf_log_printf (psf, "Bad channel count (%d)\n", rsrc->channels) ; + return SFE_SD2_BAD_RSRC ; + } ; + + psf->sf.samplerate = rsrc->sample_rate ; + psf->sf.channels = rsrc->channels ; + psf->bytewidth = rsrc->sample_size ; + + switch (rsrc->sample_size) + { case 1 : + psf->sf.format = SF_FORMAT_SD2 | SF_FORMAT_PCM_S8 ; + break ; + + case 2 : + psf->sf.format = SF_FORMAT_SD2 | SF_FORMAT_PCM_16 ; + break ; + + case 3 : + psf->sf.format = SF_FORMAT_SD2 | SF_FORMAT_PCM_24 ; + break ; + + case 4 : + psf->sf.format = SF_FORMAT_SD2 | SF_FORMAT_PCM_32 ; + break ; + + default : + psf_log_printf (psf, "Bad sample size (%d)\n", rsrc->sample_size) ; + return SFE_SD2_BAD_SAMPLE_SIZE ; + } ; + + psf_log_printf (psf, "ok\n") ; + + return 0 ; +} /* parse_str_rsrc */ + diff --git a/libsndfile-1.0.31/src/sds.c b/libsndfile-1.0.31/src/sds.c new file mode 100644 index 0000000..85c8c11 --- /dev/null +++ b/libsndfile-1.0.31/src/sds.c @@ -0,0 +1,1022 @@ +/* +** Copyright (C) 2002-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +/*------------------------------------------------------------------------------ +*/ + +#define SDS_DATA_OFFSET 0x15 +#define SDS_BLOCK_SIZE 127 + +#define SDS_AUDIO_BYTES_PER_BLOCK 120 + +#define SDS_3BYTE_TO_INT_DECODE(x) (((x) & 0x7F) | (((x) & 0x7F00) >> 1) | (((x) & 0x7F0000) >> 2)) +#define SDS_INT_TO_3BYTE_ENCODE(x) (((x) & 0x7F) | (((x) << 1) & 0x7F00) | (((x) << 2) & 0x7F0000)) + +/*------------------------------------------------------------------------------ +** Typedefs. +*/ + +typedef struct tag_SDS_PRIVATE +{ int bitwidth, frames ; + int samplesperblock, total_blocks ; + + int (*reader) (SF_PRIVATE *psf, struct tag_SDS_PRIVATE *psds) ; + int (*writer) (SF_PRIVATE *psf, struct tag_SDS_PRIVATE *psds) ; + + int read_block, read_count ; + unsigned char read_data [SDS_BLOCK_SIZE] ; + int read_samples [SDS_BLOCK_SIZE / 2] ; /* Maximum samples per block */ + + int write_block, write_count ; + int total_written ; + unsigned char write_data [SDS_BLOCK_SIZE] ; + int write_samples [SDS_BLOCK_SIZE / 2] ; /* Maximum samples per block */ +} SDS_PRIVATE ; + +/*------------------------------------------------------------------------------ +** Private static functions. +*/ + +static int sds_close (SF_PRIVATE *psf) ; + +static int sds_write_header (SF_PRIVATE *psf, int calc_length) ; +static int sds_read_header (SF_PRIVATE *psf, SDS_PRIVATE *psds) ; + +static int sds_init (SF_PRIVATE *psf, SDS_PRIVATE *psds) ; + +static sf_count_t sds_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t sds_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t sds_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t sds_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t sds_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t sds_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t sds_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t sds_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +static sf_count_t sds_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; +static int sds_byterate (SF_PRIVATE * psf) ; + +static int sds_2byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds) ; +static int sds_3byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds) ; +static int sds_4byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds) ; + +static int sds_read (SF_PRIVATE *psf, SDS_PRIVATE *psds, int *iptr, int readcount) ; + +static int sds_2byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds) ; +static int sds_3byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds) ; +static int sds_4byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds) ; + +static int sds_write (SF_PRIVATE *psf, SDS_PRIVATE *psds, const int *iptr, int writecount) ; + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +sds_open (SF_PRIVATE *psf) +{ SDS_PRIVATE *psds ; + int error = 0 ; + + /* Hmmmm, need this here to pass update_header_test. */ + psf->sf.frames = 0 ; + + if (! (psds = calloc (1, sizeof (SDS_PRIVATE)))) + return SFE_MALLOC_FAILED ; + psf->codec_data = psds ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = sds_read_header (psf, psds))) + return error ; + } ; + + if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_SDS) + return SFE_BAD_OPEN_FORMAT ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if (sds_write_header (psf, SF_FALSE)) + return psf->error ; + + psf->write_header = sds_write_header ; + + psf_fseek (psf, SDS_DATA_OFFSET, SEEK_SET) ; + } ; + + if ((error = sds_init (psf, psds)) != 0) + return error ; + + psf->container_close = sds_close ; + psf->seek = sds_seek ; + psf->byterate = sds_byterate ; + + psf->blockwidth = 0 ; + + return error ; +} /* sds_open */ + +/*------------------------------------------------------------------------------ +*/ + +static int +sds_close (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { SDS_PRIVATE *psds ; + + if ((psds = (SDS_PRIVATE *) psf->codec_data) == NULL) + { psf_log_printf (psf, "*** Bad psf->codec_data ptr.\n") ; + return SFE_INTERNAL ; + } ; + + if (psds->write_count > 0) + { memset (&(psds->write_data [psds->write_count]), 0, (psds->samplesperblock - psds->write_count) * sizeof (int)) ; + psds->writer (psf, psds) ; + } ; + + sds_write_header (psf, SF_TRUE) ; + } ; + + return 0 ; +} /* sds_close */ + +static int +sds_init (SF_PRIVATE *psf, SDS_PRIVATE *psds) +{ + if (psds->bitwidth < 8 || psds->bitwidth > 28) + return (psf->error = SFE_SDS_BAD_BIT_WIDTH) ; + + if (psds->bitwidth < 14) + { psds->reader = sds_2byte_read ; + psds->writer = sds_2byte_write ; + psds->samplesperblock = SDS_AUDIO_BYTES_PER_BLOCK / 2 ; + } + else if (psds->bitwidth < 21) + { psds->reader = sds_3byte_read ; + psds->writer = sds_3byte_write ; + psds->samplesperblock = SDS_AUDIO_BYTES_PER_BLOCK / 3 ; + } + else + { psds->reader = sds_4byte_read ; + psds->writer = sds_4byte_write ; + psds->samplesperblock = SDS_AUDIO_BYTES_PER_BLOCK / 4 ; + } ; + + if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR) + { psf->read_short = sds_read_s ; + psf->read_int = sds_read_i ; + psf->read_float = sds_read_f ; + psf->read_double = sds_read_d ; + + /* Read first block. */ + psds->reader (psf, psds) ; + } ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { psf->write_short = sds_write_s ; + psf->write_int = sds_write_i ; + psf->write_float = sds_write_f ; + psf->write_double = sds_write_d ; + } ; + + return 0 ; +} /* sds_init */ + +static int +sds_read_header (SF_PRIVATE *psf, SDS_PRIVATE *psds) +{ unsigned char channel, bitwidth, loop_type, byte ; + unsigned short sample_no, marker ; + unsigned int samp_period, data_length, sustain_loop_start, sustain_loop_end ; + int bytesread, blockcount ; + + /* Set position to start of file to begin reading header. */ + bytesread = psf_binheader_readf (psf, "pE211", 0, &marker, &channel, &byte) ; + + if (marker != 0xF07E || byte != 0x01) + return SFE_SDS_NOT_SDS ; + + bytesread += psf_binheader_readf (psf, "e2", &sample_no) ; + sample_no = SDS_3BYTE_TO_INT_DECODE (sample_no) ; + + psf_log_printf (psf, "Midi Sample Dump Standard (.sds)\nF07E\n" + " Midi Channel : %d\n Sample Number : %d\n", + channel, sample_no) ; + + bytesread += psf_binheader_readf (psf, "e13", &bitwidth, &samp_period) ; + + samp_period = SDS_3BYTE_TO_INT_DECODE (samp_period) ; + + psds->bitwidth = bitwidth ; + + if (psds->bitwidth > 1) + psf_log_printf (psf, " Bit Width : %d\n", psds->bitwidth) ; + else + { psf_log_printf (psf, " Bit Width : %d (should be > 1)\n", psds->bitwidth) ; + return SFE_SDS_BAD_BIT_WIDTH ; + } ; + + if (samp_period > 0) + { psf->sf.samplerate = 1000000000 / samp_period ; + + psf_log_printf (psf, " Sample Period : %d\n" + " Sample Rate : %d\n", + samp_period, psf->sf.samplerate) ; + } + else + { psf->sf.samplerate = 16000 ; + + psf_log_printf (psf, " Sample Period : %d (should be > 0)\n" + " Sample Rate : %d (guessed)\n", + samp_period, psf->sf.samplerate) ; + } ; + + bytesread += psf_binheader_readf (psf, "e3331", &data_length, &sustain_loop_start, &sustain_loop_end, &loop_type) ; + + data_length = SDS_3BYTE_TO_INT_DECODE (data_length) ; + + psf->sf.frames = psds->frames = data_length ; + + sustain_loop_start = SDS_3BYTE_TO_INT_DECODE (sustain_loop_start) ; + sustain_loop_end = SDS_3BYTE_TO_INT_DECODE (sustain_loop_end) ; + + psf_log_printf (psf, " Sustain Loop\n" + " Start : %d\n" + " End : %d\n" + " Loop Type : %d\n", + sustain_loop_start, sustain_loop_end, loop_type) ; + + psf->dataoffset = SDS_DATA_OFFSET ; + psf->datalength = psf->filelength - psf->dataoffset ; + + bytesread += psf_binheader_readf (psf, "1", &byte) ; + if (byte != 0xF7) + psf_log_printf (psf, "bad end : %X\n", byte & 0xFF) ; + + for (blockcount = 0 ; bytesread < psf->filelength ; blockcount++) + { + bytesread += psf_fread (&marker, 1, 2, psf) ; + + if (marker == 0) + break ; + + psf_fseek (psf, SDS_BLOCK_SIZE - 2, SEEK_CUR) ; + bytesread += SDS_BLOCK_SIZE - 2 ; + } ; + + psf_log_printf (psf, "\nBlocks : %d\n", blockcount) ; + psds->total_blocks = blockcount ; + + psds->samplesperblock = SDS_AUDIO_BYTES_PER_BLOCK / ((psds->bitwidth + 6) / 7) ; + psf_log_printf (psf, "Samples/Block : %d\n", psds->samplesperblock) ; + + psf_log_printf (psf, "Frames : %d\n", blockcount * psds->samplesperblock) ; + + /* Always Mono */ + psf->sf.channels = 1 ; + psf->sf.sections = 1 ; + + /* + ** Lie to the user about PCM bit width. Always round up to + ** the next multiple of 8. + */ + switch ((psds->bitwidth + 7) / 8) + { case 1 : + psf->sf.format = SF_FORMAT_SDS | SF_FORMAT_PCM_S8 ; + break ; + + case 2 : + psf->sf.format = SF_FORMAT_SDS | SF_FORMAT_PCM_16 ; + break ; + + case 3 : + psf->sf.format = SF_FORMAT_SDS | SF_FORMAT_PCM_24 ; + break ; + + case 4 : + psf->sf.format = SF_FORMAT_SDS | SF_FORMAT_PCM_32 ; + break ; + + default : + psf_log_printf (psf, "*** Weird byte width (%d)\n", (psds->bitwidth + 7) / 8) ; + return SFE_SDS_BAD_BIT_WIDTH ; + } ; + + psf_fseek (psf, SDS_DATA_OFFSET, SEEK_SET) ; + + return 0 ; +} /* sds_read_header */ + +static int +sds_write_header (SF_PRIVATE *psf, int calc_length) +{ SDS_PRIVATE *psds ; + sf_count_t current ; + int samp_period, data_length, sustain_loop_start, sustain_loop_end ; + unsigned char loop_type = 0 ; + + if ((psds = (SDS_PRIVATE *) psf->codec_data) == NULL) + { psf_log_printf (psf, "*** Bad psf->codec_data ptr.\n") ; + return SFE_INTERNAL ; + } ; + + if (psf->pipeoffset > 0) + return 0 ; + + current = psf_ftell (psf) ; + + if (calc_length) + psf->sf.frames = psds->total_written ; + + if (psds->write_count > 0) + { int current_count = psds->write_count ; + int current_block = psds->write_block ; + + psds->writer (psf, psds) ; + + psf_fseek (psf, -1 * SDS_BLOCK_SIZE, SEEK_CUR) ; + + psds->write_count = current_count ; + psds->write_block = current_block ; + } ; + + /* Reset the current header length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + + if (psf->is_pipe == SF_FALSE) + psf_fseek (psf, 0, SEEK_SET) ; + + psf_binheader_writef (psf, "E211", BHW2 (0xF07E), BHW1 (0), BHW1 (1)) ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_PCM_S8 : + psds->bitwidth = 8 ; + break ; + case SF_FORMAT_PCM_16 : + psds->bitwidth = 16 ; + break ; + case SF_FORMAT_PCM_24 : + psds->bitwidth = 24 ; + break ; + default: + return SFE_SDS_BAD_BIT_WIDTH ; + } ; + + samp_period = SDS_INT_TO_3BYTE_ENCODE (1000000000 / psf->sf.samplerate) ; + + psf_binheader_writef (psf, "e213", BHW2 (0), BHW1 (psds->bitwidth), BHW3 (samp_period)) ; + + data_length = SDS_INT_TO_3BYTE_ENCODE (psds->total_written) ; + sustain_loop_start = SDS_INT_TO_3BYTE_ENCODE (0) ; + sustain_loop_end = SDS_INT_TO_3BYTE_ENCODE (0) ; + + psf_binheader_writef (psf, "e33311", BHW3 (data_length), BHW3 (sustain_loop_start), BHW3 (sustain_loop_end), BHW1 (loop_type), BHW1 (0xF7)) ; + + /* Header construction complete so write it out. */ + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + if (psf->error) + return psf->error ; + + psf->dataoffset = psf->header.indx ; + psf->datalength = psds->write_block * SDS_BLOCK_SIZE ; + + if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + + return psf->error ; +} /* sds_write_header */ + + +/*------------------------------------------------------------------------------ +*/ + +static int +sds_2byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds) +{ unsigned char *ucptr, checksum ; + unsigned int sample ; + int k ; + + psds->read_block ++ ; + psds->read_count = 0 ; + + if (psds->read_block * psds->samplesperblock > psds->frames) + { memset (psds->read_samples, 0, psds->samplesperblock * sizeof (int)) ; + return 1 ; + } ; + + if ((k = psf_fread (psds->read_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE) + psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, SDS_BLOCK_SIZE) ; + + if (psds->read_data [0] != 0xF0) + { printf ("Error A : %02X\n", psds->read_data [0] & 0xFF) ; + } ; + + checksum = psds->read_data [1] ; + if (checksum != 0x7E) + { printf ("Error 1 : %02X\n", checksum & 0xFF) ; + } + + for (k = 2 ; k <= SDS_BLOCK_SIZE - 3 ; k ++) + checksum ^= psds->read_data [k] ; + + checksum &= 0x7F ; + + if (checksum != psds->read_data [SDS_BLOCK_SIZE - 2]) + { psf_log_printf (psf, "Block %d : checksum is %02X should be %02X\n", psds->read_data [4], checksum, psds->read_data [SDS_BLOCK_SIZE - 2]) ; + } ; + + ucptr = psds->read_data + 5 ; + for (k = 0 ; k < 120 ; k += 2) + { sample = arith_shift_left (ucptr [k], 25) + arith_shift_left (ucptr [k + 1], 18) ; + psds->read_samples [k / 2] = (int) (sample - 0x80000000) ; + } ; + + return 1 ; +} /* sds_2byte_read */ + +static int +sds_3byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds) +{ unsigned char *ucptr, checksum ; + unsigned int sample ; + int k ; + + psds->read_block ++ ; + psds->read_count = 0 ; + + if (psds->read_block * psds->samplesperblock > psds->frames) + { memset (psds->read_samples, 0, psds->samplesperblock * sizeof (int)) ; + return 1 ; + } ; + + if ((k = psf_fread (psds->read_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE) + psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, SDS_BLOCK_SIZE) ; + + if (psds->read_data [0] != 0xF0) + { printf ("Error A : %02X\n", psds->read_data [0] & 0xFF) ; + } ; + + checksum = psds->read_data [1] ; + if (checksum != 0x7E) + { printf ("Error 1 : %02X\n", checksum & 0xFF) ; + } + + for (k = 2 ; k <= SDS_BLOCK_SIZE - 3 ; k ++) + checksum ^= psds->read_data [k] ; + + checksum &= 0x7F ; + + if (checksum != psds->read_data [SDS_BLOCK_SIZE - 2]) + { psf_log_printf (psf, "Block %d : checksum is %02X should be %02X\n", psds->read_data [4], checksum, psds->read_data [SDS_BLOCK_SIZE - 2]) ; + } ; + + ucptr = psds->read_data + 5 ; + for (k = 0 ; k < 120 ; k += 3) + { sample = (((uint32_t) ucptr [k]) << 25) + (ucptr [k + 1] << 18) + (ucptr [k + 2] << 11) ; + psds->read_samples [k / 3] = (int) (sample - 0x80000000) ; + } ; + + return 1 ; +} /* sds_3byte_read */ + +static int +sds_4byte_read (SF_PRIVATE *psf, SDS_PRIVATE *psds) +{ unsigned char *ucptr, checksum ; + uint32_t sample ; + int k ; + + psds->read_block ++ ; + psds->read_count = 0 ; + + if (psds->read_block * psds->samplesperblock > psds->frames) + { memset (psds->read_samples, 0, psds->samplesperblock * sizeof (int)) ; + return 1 ; + } ; + + if ((k = psf_fread (psds->read_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE) + psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, SDS_BLOCK_SIZE) ; + + if (psds->read_data [0] != 0xF0) + { printf ("Error A : %02X\n", psds->read_data [0] & 0xFF) ; + } ; + + checksum = psds->read_data [1] ; + if (checksum != 0x7E) + { printf ("Error 1 : %02X\n", checksum & 0xFF) ; + } + + for (k = 2 ; k <= SDS_BLOCK_SIZE - 3 ; k ++) + checksum ^= psds->read_data [k] ; + + checksum &= 0x7F ; + + if (checksum != psds->read_data [SDS_BLOCK_SIZE - 2]) + { psf_log_printf (psf, "Block %d : checksum is %02X should be %02X\n", psds->read_data [4], checksum, psds->read_data [SDS_BLOCK_SIZE - 2]) ; + } ; + + ucptr = psds->read_data + 5 ; + for (k = 0 ; k < 120 ; k += 4) + { sample = (((uint32_t) ucptr [k]) << 25) + (ucptr [k + 1] << 18) + (ucptr [k + 2] << 11) + (ucptr [k + 3] << 4) ; + psds->read_samples [k / 4] = (int) (sample - 0x80000000) ; + } ; + + return 1 ; +} /* sds_4byte_read */ + + +static sf_count_t +sds_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + SDS_PRIVATE *psds ; + int *iptr ; + int k, bufferlen, readcount, count ; + sf_count_t total = 0 ; + + if (psf->codec_data == NULL) + return 0 ; + psds = (SDS_PRIVATE*) psf->codec_data ; + + iptr = ubuf.ibuf ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = sds_read (psf, psds, iptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = iptr [k] >> 16 ; + total += count ; + len -= readcount ; + } ; + + return total ; +} /* sds_read_s */ + +static sf_count_t +sds_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ SDS_PRIVATE *psds ; + int total ; + + if (psf->codec_data == NULL) + return 0 ; + psds = (SDS_PRIVATE*) psf->codec_data ; + + total = sds_read (psf, psds, ptr, len) ; + + return total ; +} /* sds_read_i */ + +static sf_count_t +sds_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + SDS_PRIVATE *psds ; + int *iptr ; + int k, bufferlen, readcount, count ; + sf_count_t total = 0 ; + float normfact ; + + if (psf->codec_data == NULL) + return 0 ; + psds = (SDS_PRIVATE*) psf->codec_data ; + + if (psf->norm_float == SF_TRUE) + normfact = 1.0 / 0x80000000 ; + else + normfact = 1.0 / (1 << psds->bitwidth) ; + + iptr = ubuf.ibuf ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = sds_read (psf, psds, iptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * iptr [k] ; + total += count ; + len -= readcount ; + } ; + + return total ; +} /* sds_read_f */ + +static sf_count_t +sds_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + SDS_PRIVATE *psds ; + int *iptr ; + int k, bufferlen, readcount, count ; + sf_count_t total = 0 ; + double normfact ; + + if (psf->codec_data == NULL) + return 0 ; + psds = (SDS_PRIVATE*) psf->codec_data ; + + if (psf->norm_double == SF_TRUE) + normfact = 1.0 / 0x80000000 ; + else + normfact = 1.0 / (1 << psds->bitwidth) ; + + iptr = ubuf.ibuf ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = sds_read (psf, psds, iptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * iptr [k] ; + total += count ; + len -= readcount ; + } ; + + return total ; +} /* sds_read_d */ + +static int +sds_read (SF_PRIVATE *psf, SDS_PRIVATE *psds, int *ptr, int len) +{ int count, total = 0 ; + + while (total < len) + { if (psds->read_block * psds->samplesperblock >= psds->frames) + { memset (&(ptr [total]), 0, (len - total) * sizeof (int)) ; + return total ; + } ; + + if (psds->read_count >= psds->samplesperblock) + psds->reader (psf, psds) ; + + count = (psds->samplesperblock - psds->read_count) ; + count = (len - total > count) ? count : len - total ; + + memcpy (&(ptr [total]), &(psds->read_samples [psds->read_count]), count * sizeof (int)) ; + total += count ; + psds->read_count += count ; + } ; + + return total ; +} /* sds_read */ + +/*============================================================================== +*/ + +static sf_count_t +sds_seek (SF_PRIVATE *psf, int mode, sf_count_t seek_from_start) +{ SDS_PRIVATE *psds ; + sf_count_t file_offset ; + int newblock, newsample ; + + if ((psds = psf->codec_data) == NULL) + { psf->error = SFE_INTERNAL ; + return PSF_SEEK_ERROR ; + } ; + + if (psf->datalength < 0 || psf->dataoffset < 0) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + if (seek_from_start < 0 || seek_from_start > psf->sf.frames) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + if (mode == SFM_READ && psds->write_count > 0) + psds->writer (psf, psds) ; + + newblock = seek_from_start / psds->samplesperblock ; + newsample = seek_from_start % psds->samplesperblock ; + + switch (mode) + { case SFM_READ : + if (newblock > psds->total_blocks) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + file_offset = psf->dataoffset + newblock * SDS_BLOCK_SIZE ; + + if (psf_fseek (psf, file_offset, SEEK_SET) != file_offset) + { psf->error = SFE_SEEK_FAILED ; + return PSF_SEEK_ERROR ; + } ; + + psds->read_block = newblock ; + psds->reader (psf, psds) ; + psds->read_count = newsample ; + break ; + + case SFM_WRITE : + if (newblock > psds->total_blocks) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + file_offset = psf->dataoffset + newblock * SDS_BLOCK_SIZE ; + + if (psf_fseek (psf, file_offset, SEEK_SET) != file_offset) + { psf->error = SFE_SEEK_FAILED ; + return PSF_SEEK_ERROR ; + } ; + + psds->write_block = newblock ; + psds->reader (psf, psds) ; + psds->write_count = newsample ; + break ; + + default : + psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + break ; + } ; + + return seek_from_start ; +} /* sds_seek */ + +static int +sds_byterate (SF_PRIVATE * psf) +{ + if (psf->file.mode == SFM_READ) + return (psf->datalength * psf->sf.samplerate) / psf->sf.frames ; + + return -1 ; +} /* sds_byterate */ + +/*============================================================================== +*/ + +static int +sds_2byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds) +{ unsigned char *ucptr, checksum ; + unsigned int sample ; + int k ; + + psds->write_data [0] = 0xF0 ; + psds->write_data [1] = 0x7E ; + psds->write_data [2] = 0 ; /* Channel number */ + psds->write_data [3] = 2 ; + psds->write_data [4] = psds->write_block & 0x7F ; /* Packet number */ + + ucptr = psds->write_data + 5 ; + for (k = 0 ; k < 120 ; k += 2) + { sample = psds->write_samples [k / 2] ; + sample += 0x80000000 ; + ucptr [k] = (sample >> 25) & 0x7F ; + ucptr [k + 1] = (sample >> 18) & 0x7F ; + } ; + + checksum = psds->write_data [1] ; + for (k = 2 ; k <= SDS_BLOCK_SIZE - 3 ; k ++) + checksum ^= psds->write_data [k] ; + checksum &= 0x7F ; + + psds->write_data [SDS_BLOCK_SIZE - 2] = checksum ; + psds->write_data [SDS_BLOCK_SIZE - 1] = 0xF7 ; + + if ((k = psf_fwrite (psds->write_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE) + psf_log_printf (psf, "*** Warning : psf_fwrite (%d != %d).\n", k, SDS_BLOCK_SIZE) ; + + psds->write_block ++ ; + psds->write_count = 0 ; + + if (psds->write_block > psds->total_blocks) + psds->total_blocks = psds->write_block ; + psds->frames = psds->total_blocks * psds->samplesperblock ; + + return 1 ; +} /* sds_2byte_write */ + +static int +sds_3byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds) +{ unsigned char *ucptr, checksum ; + unsigned int sample ; + int k ; + + psds->write_data [0] = 0xF0 ; + psds->write_data [1] = 0x7E ; + psds->write_data [2] = 0 ; /* Channel number */ + psds->write_data [3] = 2 ; + psds->write_data [4] = psds->write_block & 0x7F ; /* Packet number */ + + ucptr = psds->write_data + 5 ; + for (k = 0 ; k < 120 ; k += 3) + { sample = psds->write_samples [k / 3] ; + sample += 0x80000000 ; + ucptr [k] = (sample >> 25) & 0x7F ; + ucptr [k + 1] = (sample >> 18) & 0x7F ; + ucptr [k + 2] = (sample >> 11) & 0x7F ; + } ; + + checksum = psds->write_data [1] ; + for (k = 2 ; k <= SDS_BLOCK_SIZE - 3 ; k ++) + checksum ^= psds->write_data [k] ; + checksum &= 0x7F ; + + psds->write_data [SDS_BLOCK_SIZE - 2] = checksum ; + psds->write_data [SDS_BLOCK_SIZE - 1] = 0xF7 ; + + if ((k = psf_fwrite (psds->write_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE) + psf_log_printf (psf, "*** Warning : psf_fwrite (%d != %d).\n", k, SDS_BLOCK_SIZE) ; + + psds->write_block ++ ; + psds->write_count = 0 ; + + if (psds->write_block > psds->total_blocks) + psds->total_blocks = psds->write_block ; + psds->frames = psds->total_blocks * psds->samplesperblock ; + + return 1 ; +} /* sds_3byte_write */ + +static int +sds_4byte_write (SF_PRIVATE *psf, SDS_PRIVATE *psds) +{ unsigned char *ucptr, checksum ; + unsigned int sample ; + int k ; + + psds->write_data [0] = 0xF0 ; + psds->write_data [1] = 0x7E ; + psds->write_data [2] = 0 ; /* Channel number */ + psds->write_data [3] = 2 ; + psds->write_data [4] = psds->write_block & 0x7F ; /* Packet number */ + + ucptr = psds->write_data + 5 ; + for (k = 0 ; k < 120 ; k += 4) + { sample = psds->write_samples [k / 4] ; + sample += 0x80000000 ; + ucptr [k] = (sample >> 25) & 0x7F ; + ucptr [k + 1] = (sample >> 18) & 0x7F ; + ucptr [k + 2] = (sample >> 11) & 0x7F ; + ucptr [k + 3] = (sample >> 4) & 0x7F ; + } ; + + checksum = psds->write_data [1] ; + for (k = 2 ; k <= SDS_BLOCK_SIZE - 3 ; k ++) + checksum ^= psds->write_data [k] ; + checksum &= 0x7F ; + + psds->write_data [SDS_BLOCK_SIZE - 2] = checksum ; + psds->write_data [SDS_BLOCK_SIZE - 1] = 0xF7 ; + + if ((k = psf_fwrite (psds->write_data, 1, SDS_BLOCK_SIZE, psf)) != SDS_BLOCK_SIZE) + psf_log_printf (psf, "*** Warning : psf_fwrite (%d != %d).\n", k, SDS_BLOCK_SIZE) ; + + psds->write_block ++ ; + psds->write_count = 0 ; + + if (psds->write_block > psds->total_blocks) + psds->total_blocks = psds->write_block ; + psds->frames = psds->total_blocks * psds->samplesperblock ; + + return 1 ; +} /* sds_4byte_write */ + +static sf_count_t +sds_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + SDS_PRIVATE *psds ; + int *iptr ; + int k, bufferlen, writecount, count ; + sf_count_t total = 0 ; + + if (psf->codec_data == NULL) + return 0 ; + psds = (SDS_PRIVATE*) psf->codec_data ; + psds->total_written += len ; + + iptr = ubuf.ibuf ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + iptr [k] = arith_shift_left (ptr [total + k], 16) ; + count = sds_write (psf, psds, iptr, writecount) ; + total += count ; + len -= writecount ; + } ; + + return total ; +} /* sds_write_s */ + +static sf_count_t +sds_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ SDS_PRIVATE *psds ; + int total ; + + if (psf->codec_data == NULL) + return 0 ; + psds = (SDS_PRIVATE*) psf->codec_data ; + psds->total_written += len ; + + total = sds_write (psf, psds, ptr, len) ; + + return total ; +} /* sds_write_i */ + +static sf_count_t +sds_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + SDS_PRIVATE *psds ; + int *iptr ; + int k, bufferlen, writecount, count ; + sf_count_t total = 0 ; + float normfact ; + + if (psf->codec_data == NULL) + return 0 ; + psds = (SDS_PRIVATE*) psf->codec_data ; + psds->total_written += len ; + + if (psf->norm_float == SF_TRUE) + normfact = 1.0 * 0x80000000 ; + else + normfact = 1.0 * (1 << psds->bitwidth) ; + + iptr = ubuf.ibuf ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + iptr [k] = normfact * ptr [total + k] ; + count = sds_write (psf, psds, iptr, writecount) ; + total += count ; + len -= writecount ; + } ; + + return total ; +} /* sds_write_f */ + +static sf_count_t +sds_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + SDS_PRIVATE *psds ; + int *iptr ; + int k, bufferlen, writecount, count ; + sf_count_t total = 0 ; + double normfact ; + + if (psf->codec_data == NULL) + return 0 ; + psds = (SDS_PRIVATE*) psf->codec_data ; + psds->total_written += len ; + + if (psf->norm_double == SF_TRUE) + normfact = 1.0 * 0x80000000 ; + else + normfact = 1.0 * (1 << psds->bitwidth) ; + + iptr = ubuf.ibuf ; + bufferlen = ARRAY_LEN (ubuf.ibuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : len ; + for (k = 0 ; k < writecount ; k++) + iptr [k] = normfact * ptr [total + k] ; + count = sds_write (psf, psds, iptr, writecount) ; + total += count ; + len -= writecount ; + } ; + + return total ; +} /* sds_write_d */ + +static int +sds_write (SF_PRIVATE *psf, SDS_PRIVATE *psds, const int *ptr, int len) +{ int count, total = 0 ; + + while (total < len) + { count = psds->samplesperblock - psds->write_count ; + if (count > len - total) + count = len - total ; + + memcpy (&(psds->write_samples [psds->write_count]), &(ptr [total]), count * sizeof (int)) ; + total += count ; + psds->write_count += count ; + + if (psds->write_count >= psds->samplesperblock) + psds->writer (psf, psds) ; + } ; + + return total ; +} /* sds_write */ + diff --git a/libsndfile-1.0.31/src/sf_unistd.h b/libsndfile-1.0.31/src/sf_unistd.h new file mode 100644 index 0000000..698eff2 --- /dev/null +++ b/libsndfile-1.0.31/src/sf_unistd.h @@ -0,0 +1,112 @@ +/* +** Copyright (C) 2002-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +/* Microsoft declares some 'unistd.h' functions in 'io.h'. */ + +#include +#ifdef HAVE_IO_H +#include +#endif + +/* Some defines that microsoft 'forgot' to implement. */ + +#ifndef R_OK +#define R_OK 4 /* Test for read permission. */ +#endif + +#ifndef W_OK +#define W_OK 2 /* Test for write permission. */ +#endif + +#ifndef X_OK +#ifdef _WIN32 +#define X_OK 0 +#else +#define X_OK 1 /* execute permission - unsupported in windows*/ +#endif +#endif + +#ifndef F_OK +#define F_OK 0 /* Test for existence. */ +#endif + +#ifndef S_IRWXU +#define S_IRWXU 0000700 /* rwx, owner */ +#endif + +#ifndef S_IRUSR +#define S_IRUSR 0000400 /* read permission, owner */ +#endif + +#ifndef S_IWUSR +#define S_IWUSR 0000200 /* write permission, owner */ +#endif + +#ifndef S_IXUSR +#define S_IXUSR 0000100 /* execute/search permission, owner */ +#endif + +/* Windows (except MinGW) doesn't have group permissions so set all these to zero. */ +#ifndef S_IRWXG +#define S_IRWXG 0 /* rwx, group */ +#endif + +#ifndef S_IRGRP +#define S_IRGRP 0 /* read permission, group */ +#endif + +#ifndef S_IWGRP +#define S_IWGRP 0 /* write permission, grougroup */ +#endif + +#ifndef S_IXGRP +#define S_IXGRP 0 /* execute/search permission, group */ +#endif + +/* Windows (except MinGW) doesn't have others permissions so set all these to zero. */ +#ifndef S_IRWXO +#define S_IRWXO 0 /* rwx, other */ +#endif + +#ifndef S_IROTH +#define S_IROTH 0 /* read permission, other */ +#endif + +#ifndef S_IWOTH +#define S_IWOTH 0 /* write permission, other */ +#endif + +#ifndef S_IXOTH +#define S_IXOTH 0 /* execute/search permission, other */ +#endif + +#ifndef S_ISFIFO +#define S_ISFIFO(mode) (((mode) & _S_IFMT) == _S_IFIFO) +#endif + +#ifndef S_ISREG +#define S_ISREG(mode) (((mode) & _S_IFREG) == _S_IFREG) +#endif + +/* +** Don't know if these are still needed. +** +** #define _IFMT _S_IFMT +** #define _IFREG _S_IFREG +*/ + diff --git a/libsndfile-1.0.31/src/sfconfig.h b/libsndfile-1.0.31/src/sfconfig.h new file mode 100644 index 0000000..d70f405 --- /dev/null +++ b/libsndfile-1.0.31/src/sfconfig.h @@ -0,0 +1,139 @@ +/* +** Copyright (C) 2005-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +/* +** Autoconf leaves many config parameters undefined. +** Here we change then from being undefined to defining them to 0. +** This allows things like: +** +** #if HAVE_CONFIG_PARAM +** +** and +** +** if (HAVE_CONFIG_PARAM) +** do_something () ; +*/ + +#ifndef SFCONFIG_H +#define SFCONFIG_H + +/* Include the Autoconf generated file. */ +#include "config.h" + +/* Now fiddle the values. */ + +#ifndef HAVE_ALSA_ASOUNDLIB_H +#define HAVE_ALSA_ASOUNDLIB_H 0 +#endif + +#ifndef HAVE_BYTESWAP_H +#define HAVE_BYTESWAP_H 0 +#endif + +#ifndef HAVE_DECL_S_IRGRP +#define HAVE_DECL_S_IRGRP 0 +#endif + +#ifndef HAVE_ENDIAN_H +#define HAVE_ENDIAN_H 0 +#endif + +#ifndef HAVE_FSTAT64 +#define HAVE_FSTAT64 0 +#endif + +#ifndef HAVE_FSYNC +#define HAVE_FSYNC 0 +#endif + +#ifndef HAVE_LOCALE_H +#define HAVE_LOCALE_H 0 +#endif + +#ifndef HAVE_LRINT +#define HAVE_LRINT 0 +#endif + +#ifndef HAVE_LRINTF +#define HAVE_LRINTF 0 +#endif + +#ifndef HAVE_MMAP +#define HAVE_MMAP 0 +#endif + +#ifndef HAVE_SETLOCALE +#define HAVE_SETLOCALE 0 +#endif + +#ifndef HAVE_SQLITE3 +#define HAVE_SQLITE3 0 +#endif + +#ifndef HAVE_STDINT_H +#define HAVE_STDINT_H 0 +#endif + +#ifndef HAVE_SYS_WAIT_H +#define HAVE_SYS_WAIT_H 0 +#endif + +#ifndef HAVE_SYS_TIME_H +#define HAVE_SYS_TIME_H 0 +#endif + +#ifndef HAVE_UNISTD_H +#define HAVE_UNISTD_H 0 +#endif + +#ifndef HAVE_PIPE +#define HAVE_PIPE 0 +#endif + +#ifndef HAVE_WAITPID +#define HAVE_WAITPID 0 +#endif + +#ifndef HAVE_X86INTRIN_H +#define HAVE_X86INTRIN_H 0 +#endif + +#if (defined __x86_64__) || (defined _M_X64) +#define CPU_IS_X86_64 1 /* Define both for x86_64 */ +#define CPU_IS_X86 1 +#elif defined (__i486__) || defined (__i586__) || defined (__i686__) || defined (_M_IX86) +#define CPU_IS_X86 1 +#define CPU_IS_X86_64 0 +#else +#define CPU_IS_X86 0 +#define CPU_IS_X86_64 0 +#endif + +#if (defined (__SSE2__) || defined (_M_AMD64) || (defined (_M_IX86_FP) && (_M_IX86_FP >= 2)) && HAVE_IMMINTRIN_H) +#define USE_SSE2 +#endif + +#ifndef HAVE_SSIZE_T +#define HAVE_SSIZE_T 0 +#endif + +#if (HAVE_SSIZE_T == 0) +#define ssize_t intptr_t +#endif + +#endif diff --git a/libsndfile-1.0.31/src/sfendian.h b/libsndfile-1.0.31/src/sfendian.h new file mode 100644 index 0000000..9367a96 --- /dev/null +++ b/libsndfile-1.0.31/src/sfendian.h @@ -0,0 +1,378 @@ +/* +** Copyright (C) 1999-2018 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#ifndef SFENDIAN_INCLUDED +#define SFENDIAN_INCLUDED + +#include "sfconfig.h" + +#include +#include + +#if HAVE_BYTESWAP_H /* Linux, any CPU */ +#include + +#define ENDSWAP_16(x) (bswap_16 (x)) +#define ENDSWAP_32(x) (bswap_32 (x)) +#define ENDSWAP_64(x) (bswap_64 (x)) + +#elif defined __has_builtin + +#if __has_builtin (__builtin_bswap16) +#define ENDSWAP_16(x) ((int16_t) __builtin_bswap16 ((uint16_t) x)) +#endif + +#if __has_builtin (__builtin_bswap32) +#define ENDSWAP_32(x) ((int32_t) __builtin_bswap32 ((uint32_t) x)) +#endif + +#if __has_builtin (__builtin_bswap64) +#define ENDSWAP_64(x) ((int64_t) __builtin_bswap64 ((uint64_t) x)) +#endif + +#elif COMPILER_IS_GCC + +#if CPU_IS_X86 + +static inline int16_t +ENDSWAP_16X (int16_t x) +{ int16_t y ; + __asm__ ("rorw $8, %w0" : "=r" (y) : "0" (x) : "cc") ; + return y ; +} /* ENDSWAP_16 */ + +static inline int32_t +ENDSWAP_32X (int32_t x) +{ int32_t y ; + __asm__ ("bswap %0" : "=r" (y) : "0" (x)) ; + return y ; +} /* ENDSWAP_32 */ + +#define ENDSWAP_16 ENDSWAP_16X +#define ENDSWAP_32 ENDSWAP_32X + +#endif + +#if CPU_IS_X86_64 + +static inline int64_t +ENDSWAP_64X (int64_t x) +{ int64_t y ; + __asm__ ("bswap %q0" : "=r" (y) : "0" (x)) ; + return y ; +} /* ENDSWAP_64X */ + +#define ENDSWAP_64 ENDSWAP_64X + +#endif + +#elif defined _MSC_VER +#include + +#define ENDSWAP_16(x) (_byteswap_ushort (x)) +#define ENDSWAP_32(x) (_byteswap_ulong (x)) +#define ENDSWAP_64(x) (_byteswap_uint64 (x)) + +#endif + +#ifndef ENDSWAP_16 +#define ENDSWAP_16(x) ((((x) >> 8) & 0xFF) + (((x) & 0xFF) << 8)) +#endif + +#ifndef ENDSWAP_32 +#define ENDSWAP_32(x) ((((x) >> 24) & 0xFF) + (((x) >> 8) & 0xFF00) + (((x) & 0xFF00) << 8) + (((x) & 0xFF) << 24)) +#endif + +#ifndef ENDSWAP_64 +static inline uint64_t +ENDSWAP_64 (uint64_t x) +{ union + { uint32_t parts [2] ; + uint64_t whole ; + } u ; + uint32_t temp ; + + u.whole = x ; + temp = u.parts [0] ; + u.parts [0] = ENDSWAP_32 (u.parts [1]) ; + u.parts [1] = ENDSWAP_32 (temp) ; + return u.whole ; +} +#endif + +/* +** Many file types (ie WAV, AIFF) use sets of four consecutive bytes as a +** marker indicating different sections of the file. +** The following MAKE_MARKER macro allows th creation of integer constants +** for these markers. +*/ + +#if (CPU_IS_LITTLE_ENDIAN == 1) + #define MAKE_MARKER(a, b, c, d) ((uint32_t) ((a) | ((b) << 8) | ((c) << 16) | (((uint32_t) (d)) << 24))) +#elif (CPU_IS_BIG_ENDIAN == 1) + #define MAKE_MARKER(a, b, c, d) ((uint32_t) ((((uint32_t) (a)) << 24) | ((b) << 16) | ((c) << 8) | (d))) +#else + #error "Target CPU endian-ness unknown. May need to hand edit src/sfconfig.h" +#endif + +/* +** Macros to handle reading of data of a specific endian-ness into host endian +** shorts and ints. The single input is an unsigned char* pointer to the start +** of the object. There are two versions of each macro as we need to deal with +** both big and little endian CPUs. +*/ + +#if (CPU_IS_LITTLE_ENDIAN == 1) + #define LE2H_16(x) (x) + #define LE2H_32(x) (x) + + #define BE2H_16(x) ENDSWAP_16 (x) + #define BE2H_32(x) ENDSWAP_32 (x) + #define BE2H_64(x) ENDSWAP_64 (x) + + #define H2BE_16(x) ENDSWAP_16 (x) + #define H2BE_32(x) ENDSWAP_32 (x) + + #define H2LE_16(x) (x) + #define H2LE_32(x) (x) + +#elif (CPU_IS_BIG_ENDIAN == 1) + #define LE2H_16(x) ENDSWAP_16 (x) + #define LE2H_32(x) ENDSWAP_32 (x) + + #define BE2H_16(x) (x) + #define BE2H_32(x) (x) + #define BE2H_64(x) (x) + + #define H2BE_16(x) (x) + #define H2BE_32(x) (x) + + #define H2LE_16(x) ENDSWAP_16 (x) + #define H2LE_32(x) ENDSWAP_32 (x) + +#else + #error "Target CPU endian-ness unknown. May need to hand edit src/sfconfig.h" +#endif + +#define LE2H_32_PTR(x) (((x) [0]) + ((x) [1] << 8) + ((x) [2] << 16) + ((x) [3] << 24)) + +#define LET2H_16_PTR(x) ((x) [1] + ((x) [2] << 8)) +#define LET2H_32_PTR(x) (((x) [0] << 8) + ((x) [1] << 16) + ((x) [2] << 24)) + +#define BET2H_16_PTR(x) (((x) [0] << 8) + (x) [1]) +#define BET2H_32_PTR(x) (((x) [0] << 24) + ((x) [1] << 16) + ((x) [2] << 8)) + +static inline void +psf_put_be64 (uint8_t *ptr, int offset, int64_t value) +{ + ptr [offset] = (uint8_t) (value >> 56) ; + ptr [offset + 1] = (uint8_t) (value >> 48) ; + ptr [offset + 2] = (uint8_t) (value >> 40) ; + ptr [offset + 3] = (uint8_t) (value >> 32) ; + ptr [offset + 4] = (uint8_t) (value >> 24) ; + ptr [offset + 5] = (uint8_t) (value >> 16) ; + ptr [offset + 6] = (uint8_t) (value >> 8) ; + ptr [offset + 7] = (uint8_t) value ; +} /* psf_put_be64 */ + +static inline void +psf_put_be32 (uint8_t *ptr, int offset, int32_t value) +{ + ptr [offset] = (uint8_t) (value >> 24) ; + ptr [offset + 1] = (uint8_t) (value >> 16) ; + ptr [offset + 2] = (uint8_t) (value >> 8) ; + ptr [offset + 3] = (uint8_t) value ; +} /* psf_put_be32 */ + +static inline void +psf_put_be16 (uint8_t *ptr, int offset, int16_t value) +{ + ptr [offset] = (uint8_t) (value >> 8) ; + ptr [offset + 1] = (uint8_t) value ; +} /* psf_put_be16 */ + +static inline int64_t +psf_get_be64 (const uint8_t *ptr, int offset) +{ int64_t value ; + + value = ((uint32_t) ptr [offset]) << 24 ; + value += ptr [offset + 1] << 16 ; + value += ptr [offset + 2] << 8 ; + value += ptr [offset + 3] ; + + value = (int64_t) (((uint64_t) value) << 32) ; + + value += ((uint32_t) ptr [offset + 4]) << 24 ; + value += ptr [offset + 5] << 16 ; + value += ptr [offset + 6] << 8 ; + value += ptr [offset + 7] ; + return value ; +} /* psf_get_be64 */ + +static inline int64_t +psf_get_le64 (const uint8_t *ptr, int offset) +{ int64_t value ; + + value = ((uint32_t) ptr [offset + 7]) << 24 ; + value += ptr [offset + 6] << 16 ; + value += ptr [offset + 5] << 8 ; + value += ptr [offset + 4] ; + + value = (int64_t) (((uint64_t) value) << 32) ; + + value += ((uint32_t) ptr [offset + 3]) << 24 ; + value += ptr [offset + 2] << 16 ; + value += ptr [offset + 1] << 8 ; + value += ptr [offset] ; + return value ; +} /* psf_get_le64 */ + +static inline int32_t +psf_get_be32 (const uint8_t *ptr, int offset) +{ int32_t value ; + + value = ((uint32_t) ptr [offset]) << 24 ; + value += ptr [offset + 1] << 16 ; + value += ptr [offset + 2] << 8 ; + value += ptr [offset + 3] ; + return value ; +} /* psf_get_be32 */ + +static inline int32_t +psf_get_le32 (const uint8_t *ptr, int offset) +{ int32_t value ; + + value = ((uint32_t) ptr [offset + 3]) << 24 ; + value += ptr [offset + 2] << 16 ; + value += ptr [offset + 1] << 8 ; + value += ptr [offset] ; + return value ; +} /* psf_get_le32 */ + +static inline int32_t +psf_get_be24 (const uint8_t *ptr, int offset) +{ int32_t value ; + + value = ((uint32_t) ptr [offset]) << 24 ; + value += ptr [offset + 1] << 16 ; + value += ptr [offset + 2] << 8 ; + return value ; +} /* psf_get_be24 */ + +static inline int32_t +psf_get_le24 (const uint8_t *ptr, int offset) +{ int32_t value ; + + value = ((uint32_t) ptr [offset + 2]) << 24 ; + value += ptr [offset + 1] << 16 ; + value += ptr [offset] << 8 ; + return value ; +} /* psf_get_le24 */ + +static inline int16_t +psf_get_be16 (const uint8_t *ptr, int offset) +{ return (int16_t) (ptr [offset] << 8) + ptr [offset + 1] ; +} /* psf_get_be16 */ + +/*----------------------------------------------------------------------------------------------- +** Generic functions for performing endian swapping on integer arrays. +*/ + +static inline void +endswap_short_array (short *ptr, int len) +{ short temp ; + + while (--len >= 0) + { temp = ptr [len] ; + ptr [len] = ENDSWAP_16 (temp) ; + } ; +} /* endswap_short_array */ + +static inline void +endswap_short_copy (short *dest, const short *src, int len) +{ + while (--len >= 0) + { dest [len] = ENDSWAP_16 (src [len]) ; + } ; +} /* endswap_short_copy */ + +static inline void +endswap_int_array (int *ptr, int len) +{ int temp ; + + while (--len >= 0) + { temp = ptr [len] ; + ptr [len] = ENDSWAP_32 (temp) ; + } ; +} /* endswap_int_array */ + +static inline void +endswap_int_copy (int *dest, const int *src, int len) +{ + while (--len >= 0) + { dest [len] = ENDSWAP_32 (src [len]) ; + } ; +} /* endswap_int_copy */ + +/*======================================================================================== +*/ + +static inline void +endswap_int64_t_array (int64_t *ptr, int len) +{ int64_t value ; + + while (--len >= 0) + { value = ptr [len] ; + ptr [len] = ENDSWAP_64 (value) ; + } ; +} /* endswap_int64_t_array */ + +static inline void +endswap_int64_t_copy (int64_t *dest, const int64_t *src, int len) +{ int64_t value ; + + while (--len >= 0) + { value = src [len] ; + dest [len] = ENDSWAP_64 (value) ; + } ; +} /* endswap_int64_t_copy */ + +/* A couple of wrapper functions. */ + +static inline void +endswap_float_array (float *ptr, int len) +{ endswap_int_array ((int *) ptr, len) ; +} /* endswap_float_array */ + +static inline void +endswap_double_array (double *ptr, int len) +{ endswap_int64_t_array ((int64_t *) ptr, len) ; +} /* endswap_double_array */ + +static inline void +endswap_float_copy (float *dest, const float *src, int len) +{ endswap_int_copy ((int *) dest, (const int *) src, len) ; +} /* endswap_float_copy */ + +static inline void +endswap_double_copy (double *dest, const double *src, int len) +{ endswap_int64_t_copy ((int64_t *) dest, (const int64_t *) src, len) ; +} /* endswap_double_copy */ + +#endif /* SFENDIAN_INCLUDED */ + diff --git a/libsndfile-1.0.31/src/sndfile.c b/libsndfile-1.0.31/src/sndfile.c new file mode 100644 index 0000000..63beda8 --- /dev/null +++ b/libsndfile-1.0.31/src/sndfile.c @@ -0,0 +1,3360 @@ +/* +** Copyright (C) 1999-2018 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +#if HAVE_UNISTD_H +#include +#elif defined _WIN32 +#include +#endif + +#define SNDFILE_MAGICK 0x1234C0DE + +#ifdef __APPLE__ + /* + ** Detect if a compile for a universal binary is being attempted and barf if it is. + ** See the URL below for the rationale. + */ + #ifdef __BIG_ENDIAN__ + #if (CPU_IS_LITTLE_ENDIAN == 1) + #error "Universal binary compile detected. See http://libsndfile.github.io/libsndfile/FAQ.html#Q018" + #endif + #endif + + #ifdef __LITTLE_ENDIAN__ + #if (CPU_IS_BIG_ENDIAN == 1) + #error "Universal binary compile detected. See http://libsndfile.github.io/libsndfile/FAQ.html#Q018" + #endif + #endif +#endif + + +typedef struct +{ int error ; + const char *str ; +} ErrorStruct ; + +static +ErrorStruct SndfileErrors [] = +{ + /* Public error values and their associated strings. */ + { SF_ERR_NO_ERROR , "No Error." }, + { SF_ERR_UNRECOGNISED_FORMAT , "Format not recognised." }, + { SF_ERR_SYSTEM , "System error." /* Often replaced. */ }, + { SF_ERR_MALFORMED_FILE , "Supported file format but file is malformed." }, + { SF_ERR_UNSUPPORTED_ENCODING , "Supported file format but unsupported encoding." }, + + /* Private error values and their associated strings. */ + { SFE_ZERO_MAJOR_FORMAT , "Error : major format is 0." }, + { SFE_ZERO_MINOR_FORMAT , "Error : minor format is 0." }, + { SFE_BAD_FILE , "File does not exist or is not a regular file (possibly a pipe?)." }, + { SFE_BAD_FILE_READ , "File exists but no data could be read." }, + { SFE_OPEN_FAILED , "Could not open file." }, + { SFE_BAD_SNDFILE_PTR , "Not a valid SNDFILE* pointer." }, + { SFE_BAD_SF_INFO_PTR , "NULL SF_INFO pointer passed to libsndfile." }, + { SFE_BAD_SF_INCOMPLETE , "SF_PRIVATE struct incomplete and end of header parsing." }, + { SFE_BAD_FILE_PTR , "Bad FILE pointer." }, + { SFE_BAD_INT_PTR , "Internal error, Bad pointer." }, + { SFE_BAD_STAT_SIZE , "Error : software was misconfigured at compile time (sizeof statbuf.st_size)." }, + { SFE_NO_TEMP_DIR , "Error : Could not file temp dir." }, + + { SFE_MALLOC_FAILED , "Internal malloc () failed." }, + { SFE_UNIMPLEMENTED , "File contains data in an unimplemented format." }, + { SFE_BAD_READ_ALIGN , "Attempt to read a non-integer number of channels." }, + { SFE_BAD_WRITE_ALIGN , "Attempt to write a non-integer number of channels." }, + { SFE_NOT_READMODE , "Read attempted on file currently open for write." }, + { SFE_NOT_WRITEMODE , "Write attempted on file currently open for read." }, + { SFE_BAD_MODE_RW , "Error : This file format does not support read/write mode." }, + { SFE_BAD_SF_INFO , "Internal error : SF_INFO struct incomplete." }, + { SFE_BAD_OFFSET , "Error : supplied offset beyond end of file." }, + { SFE_NO_EMBED_SUPPORT , "Error : embedding not supported for this file format." }, + { SFE_NO_EMBEDDED_RDWR , "Error : cannot open embedded file read/write." }, + { SFE_NO_PIPE_WRITE , "Error : this file format does not support pipe write." }, + { SFE_BAD_VIRTUAL_IO , "Error : bad pointer on SF_VIRTUAL_IO struct." }, + { SFE_BAD_BROADCAST_INFO_SIZE + , "Error : bad coding_history_size in SF_BROADCAST_INFO struct." }, + { SFE_BAD_BROADCAST_INFO_TOO_BIG + , "Error : SF_BROADCAST_INFO struct too large." }, + { SFE_BAD_CART_INFO_SIZE , "Error: SF_CART_INFO struct too large." }, + { SFE_BAD_CART_INFO_TOO_BIG , "Error: bad tag_text_size in SF_CART_INFO struct." }, + { SFE_INTERLEAVE_MODE , "Attempt to write to file with non-interleaved data." }, + { SFE_INTERLEAVE_SEEK , "Bad karma in seek during interleave read operation." }, + { SFE_INTERLEAVE_READ , "Bad karma in read during interleave read operation." }, + + { SFE_INTERNAL , "Unspecified internal error." }, + { SFE_BAD_COMMAND_PARAM , "Bad parameter passed to function sf_command." }, + { SFE_BAD_ENDIAN , "Bad endian-ness. Try default endian-ness" }, + { SFE_CHANNEL_COUNT_ZERO , "Channel count is zero." }, + { SFE_CHANNEL_COUNT , "Too many channels specified." }, + { SFE_CHANNEL_COUNT_BAD , "Bad channel count." }, + + { SFE_BAD_SEEK , "Internal psf_fseek() failed." }, + { SFE_NOT_SEEKABLE , "Seek attempted on unseekable file type." }, + { SFE_AMBIGUOUS_SEEK , "Error : combination of file open mode and seek command is ambiguous." }, + { SFE_WRONG_SEEK , "Error : invalid seek parameters." }, + { SFE_SEEK_FAILED , "Error : parameters OK, but psf_seek() failed." }, + + { SFE_BAD_OPEN_MODE , "Error : bad mode parameter for file open." }, + { SFE_OPEN_PIPE_RDWR , "Error : attempt to open a pipe in read/write mode." }, + { SFE_RDWR_POSITION , "Error on RDWR position (cryptic)." }, + { SFE_RDWR_BAD_HEADER , "Error : Cannot open file in read/write mode due to string data in header." }, + { SFE_CMD_HAS_DATA , "Error : Command fails because file already has audio data." }, + + { SFE_STR_NO_SUPPORT , "Error : File type does not support string data." }, + { SFE_STR_NOT_WRITE , "Error : Trying to set a string when file is not in write mode." }, + { SFE_STR_MAX_DATA , "Error : Maximum string data storage reached." }, + { SFE_STR_MAX_COUNT , "Error : Maximum string data count reached." }, + { SFE_STR_BAD_TYPE , "Error : Bad string data type." }, + { SFE_STR_NO_ADD_END , "Error : file type does not support strings added at end of file." }, + { SFE_STR_BAD_STRING , "Error : bad string." }, + { SFE_STR_WEIRD , "Error : Weird string error." }, + + { SFE_WAV_NO_RIFF , "Error in WAV file. No 'RIFF' chunk marker." }, + { SFE_WAV_NO_WAVE , "Error in WAV file. No 'WAVE' chunk marker." }, + { SFE_WAV_NO_FMT , "Error in WAV/W64/RF64 file. No 'fmt ' chunk marker." }, + { SFE_WAV_BAD_FMT , "Error in WAV/W64/RF64 file. Malformed 'fmt ' chunk." }, + { SFE_WAV_FMT_SHORT , "Error in WAV/W64/RF64 file. Short 'fmt ' chunk." }, + + { SFE_WAV_BAD_FACT , "Error in WAV file. 'fact' chunk out of place." }, + { SFE_WAV_BAD_PEAK , "Error in WAV file. Bad 'PEAK' chunk." }, + { SFE_WAV_PEAK_B4_FMT , "Error in WAV file. 'PEAK' chunk found before 'fmt ' chunk." }, + + { SFE_WAV_BAD_FORMAT , "Error in WAV file. Errors in 'fmt ' chunk." }, + { SFE_WAV_BAD_BLOCKALIGN , "Error in WAV file. Block alignment in 'fmt ' chunk is incorrect." }, + { SFE_WAV_NO_DATA , "Error in WAV file. No 'data' chunk marker." }, + { SFE_WAV_BAD_LIST , "Error in WAV file. Malformed LIST chunk." }, + { SFE_WAV_UNKNOWN_CHUNK , "Error in WAV file. File contains an unknown chunk marker." }, + { SFE_WAV_WVPK_DATA , "Error in WAV file. Data is in WAVPACK format." }, + + { SFE_WAV_ADPCM_NOT4BIT , "Error in ADPCM WAV file. Invalid bit width." }, + { SFE_WAV_ADPCM_CHANNELS , "Error in ADPCM WAV file. Invalid number of channels." }, + { SFE_WAV_ADPCM_SAMPLES , "Error in ADPCM WAV file. Invalid number of samples per block." }, + { SFE_WAV_GSM610_FORMAT , "Error in GSM610 WAV file. Invalid format chunk." }, + { SFE_WAV_NMS_FORMAT , "Error in NMS ADPCM WAV file. Invalid format chunk." }, + + { SFE_AIFF_NO_FORM , "Error in AIFF file, bad 'FORM' marker." }, + { SFE_AIFF_AIFF_NO_FORM , "Error in AIFF file, 'AIFF' marker without 'FORM'." }, + { SFE_AIFF_COMM_NO_FORM , "Error in AIFF file, 'COMM' marker without 'FORM'." }, + { SFE_AIFF_SSND_NO_COMM , "Error in AIFF file, 'SSND' marker without 'COMM'." }, + { SFE_AIFF_UNKNOWN_CHUNK , "Error in AIFF file, unknown chunk." }, + { SFE_AIFF_COMM_CHUNK_SIZE, "Error in AIFF file, bad 'COMM' chunk size." }, + { SFE_AIFF_BAD_COMM_CHUNK , "Error in AIFF file, bad 'COMM' chunk." }, + { SFE_AIFF_PEAK_B4_COMM , "Error in AIFF file. 'PEAK' chunk found before 'COMM' chunk." }, + { SFE_AIFF_BAD_PEAK , "Error in AIFF file. Bad 'PEAK' chunk." }, + { SFE_AIFF_NO_SSND , "Error in AIFF file, bad 'SSND' chunk." }, + { SFE_AIFF_NO_DATA , "Error in AIFF file, no sound data." }, + { SFE_AIFF_RW_SSND_NOT_LAST, "Error in AIFF file, RDWR only possible if SSND chunk at end of file." }, + + { SFE_AU_UNKNOWN_FORMAT , "Error in AU file, unknown format." }, + { SFE_AU_NO_DOTSND , "Error in AU file, missing '.snd' or 'dns.' marker." }, + { SFE_AU_EMBED_BAD_LEN , "Embedded AU file with unknown length." }, + + { SFE_RAW_READ_BAD_SPEC , "Error while opening RAW file for read. Must specify format and channels.\n" + "Possibly trying to open unsupported format." }, + { SFE_RAW_BAD_BITWIDTH , "Error. RAW file bitwidth must be a multiple of 8." }, + { SFE_RAW_BAD_FORMAT , "Error. Bad format field in SF_INFO struct when opening a RAW file for read." }, + + { SFE_PAF_NO_MARKER , "Error in PAF file, no marker." }, + { SFE_PAF_VERSION , "Error in PAF file, bad version." }, + { SFE_PAF_UNKNOWN_FORMAT , "Error in PAF file, unknown format." }, + { SFE_PAF_SHORT_HEADER , "Error in PAF file. File shorter than minimal header." }, + { SFE_PAF_BAD_CHANNELS , "Error in PAF file. Bad channel count." }, + + { SFE_SVX_NO_FORM , "Error in 8SVX / 16SV file, no 'FORM' marker." }, + { SFE_SVX_NO_BODY , "Error in 8SVX / 16SV file, no 'BODY' marker." }, + { SFE_SVX_NO_DATA , "Error in 8SVX / 16SV file, no sound data." }, + { SFE_SVX_BAD_COMP , "Error in 8SVX / 16SV file, unsupported compression format." }, + { SFE_SVX_BAD_NAME_LENGTH , "Error in 8SVX / 16SV file, NAME chunk too long." }, + + { SFE_NIST_BAD_HEADER , "Error in NIST file, bad header." }, + { SFE_NIST_CRLF_CONVERISON, "Error : NIST file damaged by Windows CR -> CRLF conversion process." }, + { SFE_NIST_BAD_ENCODING , "Error in NIST file, unsupported compression format." }, + + { SFE_VOC_NO_CREATIVE , "Error in VOC file, no 'Creative Voice File' marker." }, + { SFE_VOC_BAD_FORMAT , "Error in VOC file, bad format." }, + { SFE_VOC_BAD_VERSION , "Error in VOC file, bad version number." }, + { SFE_VOC_BAD_MARKER , "Error in VOC file, bad marker in file." }, + { SFE_VOC_BAD_SECTIONS , "Error in VOC file, incompatible VOC sections." }, + { SFE_VOC_MULTI_SAMPLERATE, "Error in VOC file, more than one sample rate defined." }, + { SFE_VOC_MULTI_SECTION , "Unimplemented VOC file feature, file contains multiple sound sections." }, + { SFE_VOC_MULTI_PARAM , "Error in VOC file, file contains multiple bit or channel widths." }, + { SFE_VOC_SECTION_COUNT , "Error in VOC file, too many sections." }, + { SFE_VOC_NO_PIPE , "Error : not able to operate on VOC files over a pipe." }, + + { SFE_IRCAM_NO_MARKER , "Error in IRCAM file, bad IRCAM marker." }, + { SFE_IRCAM_BAD_CHANNELS , "Error in IRCAM file, bad channel count." }, + { SFE_IRCAM_UNKNOWN_FORMAT, "Error in IRCAM file, unknown encoding format." }, + + { SFE_W64_64_BIT , "Error in W64 file, file contains 64 bit offset." }, + { SFE_W64_NO_RIFF , "Error in W64 file. No 'riff' chunk marker." }, + { SFE_W64_NO_WAVE , "Error in W64 file. No 'wave' chunk marker." }, + { SFE_W64_NO_DATA , "Error in W64 file. No 'data' chunk marker." }, + { SFE_W64_ADPCM_NOT4BIT , "Error in ADPCM W64 file. Invalid bit width." }, + { SFE_W64_ADPCM_CHANNELS , "Error in ADPCM W64 file. Invalid number of channels." }, + { SFE_W64_GSM610_FORMAT , "Error in GSM610 W64 file. Invalid format chunk." }, + + { SFE_MAT4_BAD_NAME , "Error in MAT4 file. No variable name." }, + { SFE_MAT4_NO_SAMPLERATE , "Error in MAT4 file. No sample rate." }, + + { SFE_MAT5_BAD_ENDIAN , "Error in MAT5 file. Not able to determine endian-ness." }, + { SFE_MAT5_NO_BLOCK , "Error in MAT5 file. Bad block structure." }, + { SFE_MAT5_SAMPLE_RATE , "Error in MAT5 file. Not able to determine sample rate." }, + + { SFE_PVF_NO_PVF1 , "Error in PVF file. No PVF1 marker." }, + { SFE_PVF_BAD_HEADER , "Error in PVF file. Bad header." }, + { SFE_PVF_BAD_BITWIDTH , "Error in PVF file. Bad bit width." }, + + { SFE_XI_BAD_HEADER , "Error in XI file. Bad header." }, + { SFE_XI_EXCESS_SAMPLES , "Error in XI file. Excess samples in file." }, + { SFE_XI_NO_PIPE , "Error : not able to operate on XI files over a pipe." }, + + { SFE_HTK_NO_PIPE , "Error : not able to operate on HTK files over a pipe." }, + + { SFE_SDS_NOT_SDS , "Error : not an SDS file." }, + { SFE_SDS_BAD_BIT_WIDTH , "Error : bad bit width for SDS file." }, + + { SFE_SD2_FD_DISALLOWED , "Error : cannot open SD2 file without a file name." }, + { SFE_SD2_BAD_DATA_OFFSET , "Error : bad data offset." }, + { SFE_SD2_BAD_MAP_OFFSET , "Error : bad map offset." }, + { SFE_SD2_BAD_DATA_LENGTH , "Error : bad data length." }, + { SFE_SD2_BAD_MAP_LENGTH , "Error : bad map length." }, + { SFE_SD2_BAD_RSRC , "Error : bad resource fork." }, + { SFE_SD2_BAD_SAMPLE_SIZE , "Error : bad sample size." }, + + { SFE_FLAC_BAD_HEADER , "Error : bad flac header." }, + { SFE_FLAC_NEW_DECODER , "Error : problem while creating flac decoder." }, + { SFE_FLAC_INIT_DECODER , "Error : problem with initialization of the flac decoder." }, + { SFE_FLAC_LOST_SYNC , "Error : flac decoder lost sync." }, + { SFE_FLAC_BAD_SAMPLE_RATE, "Error : flac does not support this sample rate." }, + { SFE_FLAC_CHANNEL_COUNT_CHANGED, "Error : flac channel changed mid stream." }, + { SFE_FLAC_UNKOWN_ERROR , "Error : unknown error in flac decoder." }, + + { SFE_WVE_NOT_WVE , "Error : not a WVE file." }, + { SFE_WVE_NO_PIPE , "Error : not able to operate on WVE files over a pipe." }, + + { SFE_DWVW_BAD_BITWIDTH , "Error : Bad bit width for DWVW encoding. Must be 12, 16 or 24." }, + { SFE_G72X_NOT_MONO , "Error : G72x encoding does not support more than 1 channel." }, + { SFE_NMS_ADPCM_NOT_MONO , "Error : NMS ADPCM encoding does not support more than 1 channel." }, + + { SFE_VORBIS_ENCODER_BUG , "Error : Sample rate chosen is known to trigger a Vorbis encoder bug on this CPU." }, + + { SFE_RF64_NOT_RF64 , "Error : Not an RF64 file." }, + { SFE_RF64_PEAK_B4_FMT , "Error in RF64 file. 'PEAK' chunk found before 'fmt ' chunk." }, + { SFE_RF64_NO_DATA , "Error in RF64 file. No 'data' chunk marker." }, + + { SFE_ALAC_FAIL_TMPFILE , "Error : Failed to open tmp file for ALAC encoding." }, + + { SFE_BAD_CHUNK_PTR , "Error : Bad SF_CHUNK_INFO pointer." }, + { SFE_UNKNOWN_CHUNK , "Error : Unknown chunk marker." }, + { SFE_BAD_CHUNK_FORMAT , "Error : Reading/writing chunks from this file format is not supported." }, + { SFE_BAD_CHUNK_MARKER , "Error : Bad chunk marker." }, + { SFE_BAD_CHUNK_DATA_PTR , "Error : Bad data pointer in SF_CHUNK_INFO struct." }, + { SFE_FILENAME_TOO_LONG , "Error : Supplied filename too long." }, + { SFE_NEGATIVE_RW_LEN , "Error : Length parameter passed to read/write is negative." }, + + { SFE_OPUS_BAD_SAMPLERATE , "Error : Opus only supports sample rates of 8000, 12000, 16000, 24000 and 48000." }, + + { SFE_MAX_ERROR , "Maximum error number." }, + { SFE_MAX_ERROR + 1 , NULL } +} ; + +/*------------------------------------------------------------------------------ +*/ + +static int format_from_extension (SF_PRIVATE *psf) ; +static int guess_file_type (SF_PRIVATE *psf) ; +static int validate_sfinfo (SF_INFO *sfinfo) ; +static int validate_psf (SF_PRIVATE *psf) ; +static void save_header_info (SF_PRIVATE *psf) ; +static int copy_filename (SF_PRIVATE *psf, const char *path) ; +static int psf_close (SF_PRIVATE *psf) ; + +static int try_resource_fork (SF_PRIVATE * psf) ; + +/*------------------------------------------------------------------------------ +** Private (static) variables. +*/ + +int sf_errno = 0 ; +static char sf_parselog [SF_BUFFER_LEN] = { 0 } ; +static char sf_syserr [SF_SYSERR_LEN] = { 0 } ; + +/*------------------------------------------------------------------------------ +*/ + +#define VALIDATE_SNDFILE_AND_ASSIGN_PSF(a, b, c) \ + { if ((a) == NULL) \ + { sf_errno = SFE_BAD_SNDFILE_PTR ; \ + return 0 ; \ + } ; \ + (b) = (SF_PRIVATE*) (a) ; \ + if ((b)->virtual_io == SF_FALSE && \ + psf_file_valid (b) == 0) \ + { (b)->error = SFE_BAD_FILE_PTR ; \ + return 0 ; \ + } ; \ + if ((b)->Magick != SNDFILE_MAGICK) \ + { (b)->error = SFE_BAD_SNDFILE_PTR ; \ + return 0 ; \ + } ; \ + if (c) (b)->error = 0 ; \ + } + +/*------------------------------------------------------------------------------ +** Public functions. +*/ + +SNDFILE* +sf_open (const char *path, int mode, SF_INFO *sfinfo) +{ SF_PRIVATE *psf ; + + /* Ultimate sanity check. */ + assert (sizeof (sf_count_t) == 8) ; + + if ((psf = psf_allocate ()) == NULL) + { sf_errno = SFE_MALLOC_FAILED ; + return NULL ; + } ; + + psf_init_files (psf) ; + + psf_log_printf (psf, "File : %s\n", path) ; + + if (copy_filename (psf, path) != 0) + { sf_errno = psf->error ; + return NULL ; + } ; + + psf->file.mode = mode ; + if (strcmp (path, "-") == 0) + psf->error = psf_set_stdio (psf) ; + else + psf->error = psf_fopen (psf) ; + + return psf_open_file (psf, sfinfo) ; +} /* sf_open */ + +SNDFILE* +sf_open_fd (int fd, int mode, SF_INFO *sfinfo, int close_desc) +{ SF_PRIVATE *psf ; + SNDFILE *result ; + + if ((SF_CONTAINER (sfinfo->format)) == SF_FORMAT_SD2) + { sf_errno = SFE_SD2_FD_DISALLOWED ; + if (close_desc) + close (fd) ; + + return NULL ; + } ; + + if ((psf = psf_allocate ()) == NULL) + { sf_errno = SFE_MALLOC_FAILED ; + if (close_desc) + close (fd) ; + + return NULL ; + } ; + + psf_init_files (psf) ; + copy_filename (psf, "") ; + + psf->file.mode = mode ; + psf_set_file (psf, fd) ; + psf->is_pipe = psf_is_pipe (psf) ; + psf->fileoffset = psf_ftell (psf) ; + + result = psf_open_file (psf, sfinfo) ; + if (result != NULL && ! close_desc) + psf->file.do_not_close_descriptor = SF_TRUE ; + + return result ; +} /* sf_open_fd */ + +SNDFILE* +sf_open_virtual (SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user_data) +{ SF_PRIVATE *psf ; + + /* Make sure we have a valid set ot virtual pointers. */ + if (sfvirtual->get_filelen == NULL) + { sf_errno = SFE_BAD_VIRTUAL_IO ; + snprintf (sf_parselog, sizeof (sf_parselog), "Bad vio_get_filelen in SF_VIRTUAL_IO struct.\n") ; + return NULL ; + } ; + + if ((sfvirtual->seek == NULL || sfvirtual->tell == NULL) && sfinfo->seekable) + { sf_errno = SFE_BAD_VIRTUAL_IO ; + snprintf (sf_parselog, sizeof (sf_parselog), "Bad vio_seek / vio_tell in SF_VIRTUAL_IO struct.\n") ; + return NULL ; + } ; + + if ((mode == SFM_READ || mode == SFM_RDWR) && sfvirtual->read == NULL) + { sf_errno = SFE_BAD_VIRTUAL_IO ; + snprintf (sf_parselog, sizeof (sf_parselog), "Bad vio_read in SF_VIRTUAL_IO struct.\n") ; + return NULL ; + } ; + + if ((mode == SFM_WRITE || mode == SFM_RDWR) && sfvirtual->write == NULL) + { sf_errno = SFE_BAD_VIRTUAL_IO ; + snprintf (sf_parselog, sizeof (sf_parselog), "Bad vio_write in SF_VIRTUAL_IO struct.\n") ; + return NULL ; + } ; + + if ((psf = psf_allocate ()) == NULL) + { sf_errno = SFE_MALLOC_FAILED ; + return NULL ; + } ; + + psf_init_files (psf) ; + + psf->virtual_io = SF_TRUE ; + psf->vio = *sfvirtual ; + psf->vio_user_data = user_data ; + + psf->file.mode = mode ; + + return psf_open_file (psf, sfinfo) ; +} /* sf_open_virtual */ + +int +sf_close (SNDFILE *sndfile) +{ SF_PRIVATE *psf ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + return psf_close (psf) ; +} /* sf_close */ + +void +sf_write_sync (SNDFILE *sndfile) +{ SF_PRIVATE *psf ; + + if ((psf = (SF_PRIVATE *) sndfile) == NULL) + return ; + + psf_fsync (psf) ; + + return ; +} /* sf_write_sync */ + +/*============================================================================== +*/ + +const char* +sf_error_number (int errnum) +{ static const char *bad_errnum = + "No error defined for this error number. This is a bug in libsndfile." ; + int k ; + + if (errnum == SFE_MAX_ERROR) + return SndfileErrors [0].str ; + + if (errnum < 0 || errnum > SFE_MAX_ERROR) + { /* This really shouldn't happen in release versions. */ + printf ("Not a valid error number (%d).\n", errnum) ; + return bad_errnum ; + } ; + + for (k = 0 ; SndfileErrors [k].str ; k++) + if (errnum == SndfileErrors [k].error) + return SndfileErrors [k].str ; + + return bad_errnum ; +} /* sf_error_number */ + +const char* +sf_strerror (SNDFILE *sndfile) +{ SF_PRIVATE *psf = NULL ; + int errnum ; + + if (sndfile == NULL) + { errnum = sf_errno ; + if (errnum == SFE_SYSTEM && sf_syserr [0]) + return sf_syserr ; + } + else + { psf = (SF_PRIVATE *) sndfile ; + + if (psf->Magick != SNDFILE_MAGICK) + return "sf_strerror : Bad magic number." ; + + errnum = psf->error ; + + if (errnum == SFE_SYSTEM && psf->syserr [0]) + return psf->syserr ; + } ; + + return sf_error_number (errnum) ; +} /* sf_strerror */ + +/*------------------------------------------------------------------------------ +*/ + +int +sf_error (SNDFILE *sndfile) +{ SF_PRIVATE *psf ; + + if (sndfile == NULL) + return sf_errno ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 0) ; + + if (psf->error) + return psf->error ; + + return 0 ; +} /* sf_error */ + +/*------------------------------------------------------------------------------ +*/ + +int +sf_perror (SNDFILE *sndfile) +{ SF_PRIVATE *psf ; + int errnum ; + + if (sndfile == NULL) + { errnum = sf_errno ; + } + else + { VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 0) ; + errnum = psf->error ; + } ; + + fprintf (stderr, "%s\n", sf_error_number (errnum)) ; + return SFE_NO_ERROR ; +} /* sf_perror */ + + +/*------------------------------------------------------------------------------ +*/ + +int +sf_error_str (SNDFILE *sndfile, char *str, size_t maxlen) +{ SF_PRIVATE *psf ; + int errnum ; + + if (str == NULL) + return SFE_INTERNAL ; + + if (sndfile == NULL) + errnum = sf_errno ; + else + { VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 0) ; + errnum = psf->error ; + } ; + + snprintf (str, maxlen, "%s", sf_error_number (errnum)) ; + + return SFE_NO_ERROR ; +} /* sf_error_str */ + +/*============================================================================== +*/ + +int +sf_format_check (const SF_INFO *info) +{ int subformat, endian ; + + subformat = SF_CODEC (info->format) ; + endian = SF_ENDIAN (info->format) ; + + /* This is the place where each file format can check if the supplied + ** SF_INFO struct is valid. + ** Return 0 on failure, 1 ons success. + */ + + if (info->channels < 1 || info->channels > SF_MAX_CHANNELS) + return 0 ; + + if (info->samplerate < 0) + return 0 ; + + switch (SF_CONTAINER (info->format)) + { case SF_FORMAT_WAV : + /* WAV now allows both endian, RIFF or RIFX (little or big respectively) */ + if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16) + return 1 ; + if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) + return 1 ; + if ((subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM) && info->channels <= 2) + return 1 ; + if (subformat == SF_FORMAT_GSM610 && info->channels == 1) + return 1 ; + if (subformat == SF_FORMAT_G721_32 && info->channels == 1) + return 1 ; + if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW) + return 1 ; + if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) + return 1 ; + if ((subformat == SF_FORMAT_NMS_ADPCM_16 || subformat == SF_FORMAT_NMS_ADPCM_24 || + subformat == SF_FORMAT_NMS_ADPCM_32) && info->channels == 1) + return 1 ; + break ; + + case SF_FORMAT_WAVEX : + if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU) + return 0 ; + if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16) + return 1 ; + if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) + return 1 ; + if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW) + return 1 ; + if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) + return 1 ; + break ; + + case SF_FORMAT_AIFF : + /* AIFF does allow both endian-nesses for PCM data.*/ + if (subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) + return 1 ; + /* For other encodings reject any endian-ness setting. */ + if (endian != 0) + return 0 ; + if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_S8) + return 1 ; + if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) + return 1 ; + if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW) + return 1 ; + if ((subformat == SF_FORMAT_DWVW_12 || subformat == SF_FORMAT_DWVW_16 || + subformat == SF_FORMAT_DWVW_24) && info-> channels == 1) + return 1 ; + if (subformat == SF_FORMAT_GSM610 && info->channels == 1) + return 1 ; + if (subformat == SF_FORMAT_IMA_ADPCM && (info->channels == 1 || info->channels == 2)) + return 1 ; + break ; + + case SF_FORMAT_AU : + if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16) + return 1 ; + if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) + return 1 ; + if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW) + return 1 ; + if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) + return 1 ; + if (subformat == SF_FORMAT_G721_32 && info->channels == 1) + return 1 ; + if (subformat == SF_FORMAT_G723_24 && info->channels == 1) + return 1 ; + if (subformat == SF_FORMAT_G723_40 && info->channels == 1) + return 1 ; + break ; + + case SF_FORMAT_CAF : + if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16) + return 1 ; + if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) + return 1 ; + if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW) + return 1 ; + if (subformat == SF_FORMAT_ALAC_16 || subformat == SF_FORMAT_ALAC_20) + return 1 ; + if (subformat == SF_FORMAT_ALAC_24 || subformat == SF_FORMAT_ALAC_32) + return 1 ; + if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) + return 1 ; + break ; + + case SF_FORMAT_RAW : + if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16) + return 1 ; + if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) + return 1 ; + if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) + return 1 ; + if (subformat == SF_FORMAT_ALAW || subformat == SF_FORMAT_ULAW) + return 1 ; + if ((subformat == SF_FORMAT_DWVW_12 || subformat == SF_FORMAT_DWVW_16 || + subformat == SF_FORMAT_DWVW_24) && info-> channels == 1) + return 1 ; + if (subformat == SF_FORMAT_GSM610 && info->channels == 1) + return 1 ; + if (subformat == SF_FORMAT_VOX_ADPCM && info->channels == 1) + return 1 ; + if ((subformat == SF_FORMAT_NMS_ADPCM_16 || subformat == SF_FORMAT_NMS_ADPCM_24 || + subformat == SF_FORMAT_NMS_ADPCM_32) && info->channels == 1) + return 1 ; + break ; + + case SF_FORMAT_PAF : + if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24) + return 1 ; + break ; + + case SF_FORMAT_SVX : + /* SVX only supports writing mono SVX files. */ + if (info->channels > 1) + return 0 ; + /* Always big endian. */ + if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU) + return 0 ; + + if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16) + return 1 ; + break ; + + case SF_FORMAT_NIST : + if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16) + return 1 ; + if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) + return 1 ; + if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW) + return 1 ; + break ; + + case SF_FORMAT_IRCAM : + if (info->channels > 256) + return 0 ; + if (subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32) + return 1 ; + if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW || subformat == SF_FORMAT_FLOAT) + return 1 ; + break ; + + case SF_FORMAT_VOC : + if (info->channels > 2) + return 0 ; + /* VOC is strictly little endian. */ + if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU) + return 0 ; + if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16) + return 1 ; + if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW) + return 1 ; + break ; + + case SF_FORMAT_W64 : + /* W64 is strictly little endian. */ + if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU) + return 0 ; + if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16) + return 1 ; + if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) + return 1 ; + if ((subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM) && info->channels <= 2) + return 1 ; + if (subformat == SF_FORMAT_GSM610 && info->channels == 1) + return 1 ; + if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW) + return 1 ; + if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) + return 1 ; + break ; + + case SF_FORMAT_MAT4 : + if (subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32) + return 1 ; + if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) + return 1 ; + break ; + + case SF_FORMAT_MAT5 : + if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32) + return 1 ; + if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) + return 1 ; + break ; + + case SF_FORMAT_PVF : + if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_32) + return 1 ; + break ; + + case SF_FORMAT_XI : + if (info->channels != 1) + return 0 ; + if (subformat == SF_FORMAT_DPCM_8 || subformat == SF_FORMAT_DPCM_16) + return 1 ; + break ; + + case SF_FORMAT_HTK : + if (info->channels != 1) + return 0 ; + /* HTK is strictly big endian. */ + if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU) + return 0 ; + if (subformat == SF_FORMAT_PCM_16) + return 1 ; + break ; + + case SF_FORMAT_SDS : + if (info->channels != 1) + return 0 ; + /* SDS is strictly big endian. */ + if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU) + return 0 ; + if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24) + return 1 ; + break ; + + case SF_FORMAT_AVR : + if (info->channels > 2) + return 0 ; + /* SDS is strictly big endian. */ + if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU) + return 0 ; + if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16) + return 1 ; + break ; + + case SF_FORMAT_FLAC : + /* FLAC can't do more than 8 channels. */ + if (info->channels > 8) + return 0 ; + if (endian != SF_ENDIAN_FILE) + return 0 ; + if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24) + return 1 ; + break ; + + case SF_FORMAT_SD2 : + /* SD2 is strictly big endian. */ + if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU) + return 0 ; + if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) + return 1 ; + break ; + + case SF_FORMAT_WVE : + if (info->channels > 1) + return 0 ; + /* WVE is strictly big endian. */ + if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU) + return 0 ; + if (subformat == SF_FORMAT_ALAW) + return 1 ; + break ; + + case SF_FORMAT_OGG : + if (endian != SF_ENDIAN_FILE) + return 0 ; + if (subformat == SF_FORMAT_VORBIS) + return 1 ; + if (subformat == SF_FORMAT_OPUS) + return 1 ; + break ; + + case SF_FORMAT_MPC2K : + if (info->channels > 2) + return 0 ; + /* MPC2000 is strictly little endian. */ + if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU) + return 0 ; + if (subformat == SF_FORMAT_PCM_16) + return 1 ; + break ; + + case SF_FORMAT_RF64 : + if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU) + return 0 ; + if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16) + return 1 ; + if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32) + return 1 ; + if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW) + return 1 ; + if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) + return 1 ; + break ; + default : break ; + } ; + + return 0 ; +} /* sf_format_check */ + +/*------------------------------------------------------------------------------ +*/ + +const char * +sf_version_string (void) +{ +#if ENABLE_EXPERIMENTAL_CODE + return PACKAGE_NAME "-" PACKAGE_VERSION "-exp" ; +#else + return PACKAGE_NAME "-" PACKAGE_VERSION ; +#endif +} + + +/*------------------------------------------------------------------------------ +*/ + +int +sf_command (SNDFILE *sndfile, int command, void *data, int datasize) +{ SF_PRIVATE *psf = (SF_PRIVATE *) sndfile ; + double quality ; + double latency ; + int old_value ; + + /* This set of commands do not need the sndfile parameter. */ + switch (command) + { case SFC_GET_LIB_VERSION : + if (data == NULL) + { if (psf) + psf->error = SFE_BAD_COMMAND_PARAM ; + return 0 ; + } ; + snprintf (data, datasize, "%s", sf_version_string ()) ; + return strlen (data) ; + + case SFC_GET_SIMPLE_FORMAT_COUNT : + if (data == NULL || datasize != SIGNED_SIZEOF (int)) + return (sf_errno = SFE_BAD_COMMAND_PARAM) ; + *((int*) data) = psf_get_format_simple_count () ; + return 0 ; + + case SFC_GET_SIMPLE_FORMAT : + if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO)) + return (sf_errno = SFE_BAD_COMMAND_PARAM) ; + return psf_get_format_simple (data) ; + + case SFC_GET_FORMAT_MAJOR_COUNT : + if (data == NULL || datasize != SIGNED_SIZEOF (int)) + return (sf_errno = SFE_BAD_COMMAND_PARAM) ; + *((int*) data) = psf_get_format_major_count () ; + return 0 ; + + case SFC_GET_FORMAT_MAJOR : + if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO)) + return (sf_errno = SFE_BAD_COMMAND_PARAM) ; + return psf_get_format_major (data) ; + + case SFC_GET_FORMAT_SUBTYPE_COUNT : + if (data == NULL || datasize != SIGNED_SIZEOF (int)) + return (sf_errno = SFE_BAD_COMMAND_PARAM) ; + *((int*) data) = psf_get_format_subtype_count () ; + return 0 ; + + case SFC_GET_FORMAT_SUBTYPE : + if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO)) + return (sf_errno = SFE_BAD_COMMAND_PARAM) ; + return psf_get_format_subtype (data) ; + + case SFC_GET_FORMAT_INFO : + if (data == NULL || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO)) + return (sf_errno = SFE_BAD_COMMAND_PARAM) ; + return psf_get_format_info (data) ; + } ; + + if (sndfile == NULL && command == SFC_GET_LOG_INFO) + { if (data == NULL) + return (sf_errno = SFE_BAD_COMMAND_PARAM) ; + snprintf (data, datasize, "%s", sf_parselog) ; + return strlen (data) ; + } ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + switch (command) + { case SFC_SET_NORM_FLOAT : + old_value = psf->norm_float ; + psf->norm_float = (datasize) ? SF_TRUE : SF_FALSE ; + return old_value ; + + case SFC_GET_CURRENT_SF_INFO : + if (data == NULL || datasize != SIGNED_SIZEOF (SF_INFO)) + return (sf_errno = SFE_BAD_COMMAND_PARAM) ; + memcpy (data, &psf->sf, sizeof (SF_INFO)) ; + break ; + + case SFC_SET_NORM_DOUBLE : + old_value = psf->norm_double ; + psf->norm_double = (datasize) ? SF_TRUE : SF_FALSE ; + return old_value ; + + case SFC_GET_NORM_FLOAT : + return psf->norm_float ; + + case SFC_GET_NORM_DOUBLE : + return psf->norm_double ; + + case SFC_SET_SCALE_FLOAT_INT_READ : + old_value = psf->float_int_mult ; + + psf->float_int_mult = (datasize != 0) ? SF_TRUE : SF_FALSE ; + if (psf->float_int_mult && psf->float_max < 0.0) + /* Scale to prevent wrap-around distortion. */ + psf->float_max = (32768.0 / 32767.0) * psf_calc_signal_max (psf, SF_FALSE) ; + return old_value ; + + case SFC_SET_SCALE_INT_FLOAT_WRITE : + old_value = psf->scale_int_float ; + psf->scale_int_float = (datasize != 0) ? SF_TRUE : SF_FALSE ; + return old_value ; + + case SFC_SET_ADD_PEAK_CHUNK : + { int format = SF_CONTAINER (psf->sf.format) ; + + /* Only WAV and AIFF support the PEAK chunk. */ + switch (format) + { case SF_FORMAT_AIFF : + case SF_FORMAT_CAF : + case SF_FORMAT_WAV : + case SF_FORMAT_WAVEX : + case SF_FORMAT_RF64 : + break ; + + default : + return SF_FALSE ; + } ; + + format = SF_CODEC (psf->sf.format) ; + + /* Only files containg the following data types support the PEAK chunk. */ + if (format != SF_FORMAT_FLOAT && format != SF_FORMAT_DOUBLE) + return SF_FALSE ; + + } ; + /* Can only do this is in SFM_WRITE mode. */ + if (psf->file.mode != SFM_WRITE && psf->file.mode != SFM_RDWR) + return SF_FALSE ; + /* If data has already been written this must fail. */ + if (psf->have_written) + { psf->error = SFE_CMD_HAS_DATA ; + return SF_FALSE ; + } ; + /* Everything seems OK, so set psf->has_peak and re-write header. */ + if (datasize == SF_FALSE && psf->peak_info != NULL) + { free (psf->peak_info) ; + psf->peak_info = NULL ; + } + else if (psf->peak_info == NULL) + { psf->peak_info = peak_info_calloc (psf->sf.channels) ; + if (psf->peak_info != NULL) + psf->peak_info->peak_loc = SF_PEAK_START ; + } ; + + if (psf->write_header) + psf->write_header (psf, SF_TRUE) ; + return datasize ; + + case SFC_SET_ADD_HEADER_PAD_CHUNK : + return SF_FALSE ; + + case SFC_GET_LOG_INFO : + if (data == NULL) + return SFE_BAD_COMMAND_PARAM ; + snprintf (data, datasize, "%s", psf->parselog.buf) ; + return strlen (data) ; + + case SFC_CALC_SIGNAL_MAX : + if (data == NULL || datasize != sizeof (double)) + return (psf->error = SFE_BAD_COMMAND_PARAM) ; + *((double*) data) = psf_calc_signal_max (psf, SF_FALSE) ; + break ; + + case SFC_CALC_NORM_SIGNAL_MAX : + if (data == NULL || datasize != sizeof (double)) + return (psf->error = SFE_BAD_COMMAND_PARAM) ; + *((double*) data) = psf_calc_signal_max (psf, SF_TRUE) ; + break ; + + case SFC_CALC_MAX_ALL_CHANNELS : + if (data == NULL || datasize != SIGNED_SIZEOF (double) * psf->sf.channels) + return (psf->error = SFE_BAD_COMMAND_PARAM) ; + return psf_calc_max_all_channels (psf, (double*) data, SF_FALSE) ; + + case SFC_CALC_NORM_MAX_ALL_CHANNELS : + if (data == NULL || datasize != SIGNED_SIZEOF (double) * psf->sf.channels) + return (psf->error = SFE_BAD_COMMAND_PARAM) ; + return psf_calc_max_all_channels (psf, (double*) data, SF_TRUE) ; + + case SFC_GET_SIGNAL_MAX : + if (data == NULL || datasize != sizeof (double)) + { psf->error = SFE_BAD_COMMAND_PARAM ; + return SF_FALSE ; + } ; + return psf_get_signal_max (psf, (double *) data) ; + + case SFC_GET_MAX_ALL_CHANNELS : + if (data == NULL || datasize != SIGNED_SIZEOF (double) * psf->sf.channels) + { psf->error = SFE_BAD_COMMAND_PARAM ; + return SF_FALSE ; + } ; + return psf_get_max_all_channels (psf, (double*) data) ; + + case SFC_UPDATE_HEADER_NOW : + if (psf->write_header) + psf->write_header (psf, SF_TRUE) ; + break ; + + case SFC_SET_UPDATE_HEADER_AUTO : + psf->auto_header = datasize ? SF_TRUE : SF_FALSE ; + return psf->auto_header ; + break ; + + case SFC_SET_ADD_DITHER_ON_WRITE : + case SFC_SET_ADD_DITHER_ON_READ : + /* + ** FIXME ! + ** These are obsolete. Just return. + ** Remove some time after version 1.0.8. + */ + break ; + + case SFC_SET_DITHER_ON_WRITE : + if (data == NULL || datasize != SIGNED_SIZEOF (SF_DITHER_INFO)) + return (psf->error = SFE_BAD_COMMAND_PARAM) ; + memcpy (&psf->write_dither, data, sizeof (psf->write_dither)) ; + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + dither_init (psf, SFM_WRITE) ; + break ; + + case SFC_SET_DITHER_ON_READ : + if (data == NULL || datasize != SIGNED_SIZEOF (SF_DITHER_INFO)) + return (psf->error = SFE_BAD_COMMAND_PARAM) ; + memcpy (&psf->read_dither, data, sizeof (psf->read_dither)) ; + if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR) + dither_init (psf, SFM_READ) ; + break ; + + case SFC_FILE_TRUNCATE : + if (psf->file.mode != SFM_WRITE && psf->file.mode != SFM_RDWR) + return SF_TRUE ; + if (datasize != sizeof (sf_count_t)) + return SF_TRUE ; + if (data == NULL || datasize != sizeof (sf_count_t)) + { psf->error = SFE_BAD_COMMAND_PARAM ; + return SF_FALSE ; + } + else + { sf_count_t position ; + + position = *((sf_count_t*) data) ; + + if (sf_seek (sndfile, position, SEEK_SET) != position) + return SF_TRUE ; + + psf->sf.frames = position ; + + position = psf_fseek (psf, 0, SEEK_CUR) ; + + return psf_ftruncate (psf, position) ; + } ; + break ; + + case SFC_SET_RAW_START_OFFSET : + if (data == NULL || datasize != sizeof (sf_count_t)) + return (psf->error = SFE_BAD_COMMAND_PARAM) ; + + if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_RAW) + return (psf->error = SFE_BAD_COMMAND_PARAM) ; + + psf->dataoffset = *((sf_count_t*) data) ; + sf_seek (sndfile, 0, SEEK_CUR) ; + break ; + + case SFC_GET_EMBED_FILE_INFO : + if (data == NULL || datasize != sizeof (SF_EMBED_FILE_INFO)) + return (psf->error = SFE_BAD_COMMAND_PARAM) ; + + ((SF_EMBED_FILE_INFO*) data)->offset = psf->fileoffset ; + ((SF_EMBED_FILE_INFO*) data)->length = psf->filelength ; + break ; + + /* Lite remove start */ + case SFC_TEST_IEEE_FLOAT_REPLACE : + psf->ieee_replace = (datasize) ? SF_TRUE : SF_FALSE ; + if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_FLOAT) + float32_init (psf) ; + else if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_DOUBLE) + double64_init (psf) ; + else + return (psf->error = SFE_BAD_COMMAND_PARAM) ; + break ; + /* Lite remove end */ + + case SFC_SET_CLIPPING : + psf->add_clipping = (datasize) ? SF_TRUE : SF_FALSE ; + return psf->add_clipping ; + + case SFC_GET_CLIPPING : + return psf->add_clipping ; + + case SFC_GET_LOOP_INFO : + if (datasize != sizeof (SF_LOOP_INFO) || data == NULL) + { psf->error = SFE_BAD_COMMAND_PARAM ; + return SF_FALSE ; + } ; + if (psf->loop_info == NULL) + return SF_FALSE ; + memcpy (data, psf->loop_info, sizeof (SF_LOOP_INFO)) ; + return SF_TRUE ; + + case SFC_SET_BROADCAST_INFO : + { int format = SF_CONTAINER (psf->sf.format) ; + + /* Only WAV and RF64 supports the BEXT (Broadcast) chunk. */ + if (format != SF_FORMAT_WAV && format != SF_FORMAT_WAVEX && format != SF_FORMAT_RF64) + return SF_FALSE ; + } ; + + /* Only makes sense in SFM_WRITE or SFM_RDWR mode. */ + if ((psf->file.mode != SFM_WRITE) && (psf->file.mode != SFM_RDWR)) + return SF_FALSE ; + /* If data has already been written this must fail. */ + if (psf->broadcast_16k == NULL && psf->have_written) + { psf->error = SFE_CMD_HAS_DATA ; + return SF_FALSE ; + } ; + + if (NOT (broadcast_var_set (psf, data, datasize))) + return SF_FALSE ; + + if (psf->write_header) + psf->write_header (psf, SF_TRUE) ; + return SF_TRUE ; + + case SFC_GET_BROADCAST_INFO : + if (data == NULL) + { psf->error = SFE_BAD_COMMAND_PARAM ; + return SF_FALSE ; + } ; + return broadcast_var_get (psf, data, datasize) ; + + case SFC_SET_CART_INFO : + { int format = SF_CONTAINER (psf->sf.format) ; + /* Only WAV and RF64 support cart chunk format */ + if (format != SF_FORMAT_WAV && format != SF_FORMAT_RF64) + return SF_FALSE ; + } ; + + /* Only makes sense in SFM_WRITE or SFM_RDWR mode */ + if ((psf->file.mode != SFM_WRITE) && (psf->file.mode != SFM_RDWR)) + return SF_FALSE ; + /* If data has already been written this must fail. */ + if (psf->cart_16k == NULL && psf->have_written) + { psf->error = SFE_CMD_HAS_DATA ; + return SF_FALSE ; + } ; + if (NOT (cart_var_set (psf, data, datasize))) + return SF_FALSE ; + if (psf->write_header) + psf->write_header (psf, SF_TRUE) ; + return SF_TRUE ; + + case SFC_GET_CART_INFO : + if (data == NULL) + { psf->error = SFE_BAD_COMMAND_PARAM ; + return SF_FALSE ; + } ; + return cart_var_get (psf, data, datasize) ; + + case SFC_GET_CUE_COUNT : + if (datasize != sizeof (uint32_t) || data == NULL) + { psf->error = SFE_BAD_COMMAND_PARAM ; + return SF_FALSE ; + } ; + if (psf->cues != NULL) + { *((uint32_t *) data) = psf->cues->cue_count ; + return SF_TRUE ; + } ; + return SF_FALSE ; + + case SFC_GET_CUE : + if (datasize < (int) sizeof (uint32_t) || data == NULL) + { psf->error = SFE_BAD_COMMAND_PARAM ; + return SF_FALSE ; + } ; + if (psf->cues == NULL) + return SF_FALSE ; + psf_get_cues (psf, data, datasize) ; + return SF_TRUE ; + + case SFC_SET_CUE : + if (psf->have_written) + { psf->error = SFE_CMD_HAS_DATA ; + return SF_FALSE ; + } ; + if (datasize < (int) sizeof (uint32_t) || data == NULL) + { psf->error = SFE_BAD_COMMAND_PARAM ; + return SF_FALSE ; + } ; + if (psf->cues == NULL && (psf->cues = psf_cues_dup (data, datasize)) == NULL) + { psf->error = SFE_MALLOC_FAILED ; + return SF_FALSE ; + } ; + return SF_TRUE ; + + case SFC_GET_INSTRUMENT : + if (datasize != sizeof (SF_INSTRUMENT) || data == NULL) + { psf->error = SFE_BAD_COMMAND_PARAM ; + return SF_FALSE ; + } ; + if (psf->instrument == NULL) + return SF_FALSE ; + memcpy (data, psf->instrument, sizeof (SF_INSTRUMENT)) ; + return SF_TRUE ; + + case SFC_SET_INSTRUMENT : + /* If data has already been written this must fail. */ + if (psf->have_written) + { psf->error = SFE_CMD_HAS_DATA ; + return SF_FALSE ; + } ; + if (datasize != sizeof (SF_INSTRUMENT) || data == NULL) + { psf->error = SFE_BAD_COMMAND_PARAM ; + return SF_FALSE ; + } ; + + if (psf->instrument == NULL && (psf->instrument = psf_instrument_alloc ()) == NULL) + { psf->error = SFE_MALLOC_FAILED ; + return SF_FALSE ; + } ; + memcpy (psf->instrument, data, sizeof (SF_INSTRUMENT)) ; + return SF_TRUE ; + + case SFC_RAW_DATA_NEEDS_ENDSWAP : + return psf->data_endswap ; + + case SFC_GET_CHANNEL_MAP_INFO : + if (psf->channel_map == NULL) + return SF_FALSE ; + + if (data == NULL || datasize != SIGNED_SIZEOF (psf->channel_map [0]) * psf->sf.channels) + { psf->error = SFE_BAD_COMMAND_PARAM ; + return SF_FALSE ; + } ; + + memcpy (data, psf->channel_map, datasize) ; + return SF_TRUE ; + + case SFC_SET_CHANNEL_MAP_INFO : + if (psf->have_written) + { psf->error = SFE_CMD_HAS_DATA ; + return SF_FALSE ; + } ; + if (data == NULL || datasize != SIGNED_SIZEOF (psf->channel_map [0]) * psf->sf.channels) + { psf->error = SFE_BAD_COMMAND_PARAM ; + return SF_FALSE ; + } ; + + { int *iptr ; + + for (iptr = data ; iptr < (int*) data + psf->sf.channels ; iptr++) + { if (*iptr <= SF_CHANNEL_MAP_INVALID || *iptr >= SF_CHANNEL_MAP_MAX) + { psf->error = SFE_BAD_COMMAND_PARAM ; + return SF_FALSE ; + } ; + } ; + } ; + + free (psf->channel_map) ; + if ((psf->channel_map = malloc (datasize)) == NULL) + { psf->error = SFE_MALLOC_FAILED ; + return SF_FALSE ; + } ; + + memcpy (psf->channel_map, data, datasize) ; + + /* + ** Pass the command down to the container's command handler. + ** Don't pass user data, use validated psf->channel_map data instead. + */ + if (psf->command) + return psf->command (psf, command, NULL, 0) ; + return SF_FALSE ; + + case SFC_SET_VBR_ENCODING_QUALITY : + if (data == NULL || datasize != sizeof (double)) + return SF_FALSE ; + + quality = *((double *) data) ; + quality = 1.0 - SF_MAX (0.0, SF_MIN (1.0, quality)) ; + return sf_command (sndfile, SFC_SET_COMPRESSION_LEVEL, &quality, sizeof (quality)) ; + + case SFC_SET_OGG_PAGE_LATENCY_MS : + if (data == NULL || datasize != sizeof (double)) + return SF_FALSE ; + + latency = *((double *) data) ; + return sf_command (sndfile, SFC_SET_OGG_PAGE_LATENCY, &latency, sizeof (latency)) ; + + default : + /* Must be a file specific command. Pass it on. */ + if (psf->command) + return psf->command (psf, command, data, datasize) ; + + psf_log_printf (psf, "*** sf_command : cmd = 0x%X\n", command) ; + return (psf->error = SFE_BAD_COMMAND_PARAM) ; + } ; + + return 0 ; +} /* sf_command */ + +/*------------------------------------------------------------------------------ +*/ + +sf_count_t +sf_seek (SNDFILE *sndfile, sf_count_t offset, int whence) +{ SF_PRIVATE *psf ; + sf_count_t seek_from_start = 0, retval ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (! psf->sf.seekable) + { psf->error = SFE_NOT_SEEKABLE ; + return PSF_SEEK_ERROR ; + } ; + + /* If the whence parameter has a mode ORed in, check to see that + ** it makes sense. + */ + if (((whence & SFM_MASK) == SFM_WRITE && psf->file.mode == SFM_READ) || + ((whence & SFM_MASK) == SFM_READ && psf->file.mode == SFM_WRITE)) + { psf->error = SFE_WRONG_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + /* Convert all SEEK_CUR and SEEK_END into seek_from_start to be + ** used with SEEK_SET. + */ + switch (whence) + { /* The SEEK_SET behaviour is independant of mode. */ + case SEEK_SET : + case SEEK_SET | SFM_READ : + case SEEK_SET | SFM_WRITE : + case SEEK_SET | SFM_RDWR : + seek_from_start = offset ; + break ; + + /* The SEEK_CUR is a little more tricky. */ + case SEEK_CUR : + if (offset == 0) + { if (psf->file.mode == SFM_READ) + return psf->read_current ; + if (psf->file.mode == SFM_WRITE) + return psf->write_current ; + } ; + if (psf->file.mode == SFM_READ) + seek_from_start = psf->read_current + offset ; + else if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + seek_from_start = psf->write_current + offset ; + else + psf->error = SFE_AMBIGUOUS_SEEK ; + break ; + + case SEEK_CUR | SFM_READ : + if (offset == 0) + return psf->read_current ; + seek_from_start = psf->read_current + offset ; + break ; + + case SEEK_CUR | SFM_WRITE : + if (offset == 0) + return psf->write_current ; + seek_from_start = psf->write_current + offset ; + break ; + + /* The SEEK_END */ + case SEEK_END : + case SEEK_END | SFM_READ : + case SEEK_END | SFM_WRITE : + seek_from_start = psf->sf.frames + offset ; + break ; + + default : + psf->error = SFE_BAD_SEEK ; + break ; + } ; + + if (psf->error) + return PSF_SEEK_ERROR ; + + if (psf->file.mode == SFM_RDWR || psf->file.mode == SFM_WRITE) + { if (seek_from_start < 0) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + } + else if (seek_from_start < 0 || seek_from_start > psf->sf.frames) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + if (psf->seek) + { int new_mode = (whence & SFM_MASK) ? (whence & SFM_MASK) : psf->file.mode ; + + retval = psf->seek (psf, new_mode, seek_from_start) ; + + switch (new_mode) + { case SFM_READ : + psf->read_current = retval ; + break ; + case SFM_WRITE : + psf->write_current = retval ; + break ; + case SFM_RDWR : + psf->read_current = retval ; + psf->write_current = retval ; + new_mode = SFM_READ ; + break ; + } ; + + psf->last_op = new_mode ; + + return retval ; + } ; + + psf->error = SFE_AMBIGUOUS_SEEK ; + return PSF_SEEK_ERROR ; +} /* sf_seek */ + +/*------------------------------------------------------------------------------ +*/ + +const char* +sf_get_string (SNDFILE *sndfile, int str_type) +{ SF_PRIVATE *psf ; + + if ((psf = (SF_PRIVATE*) sndfile) == NULL) + return NULL ; + if (psf->Magick != SNDFILE_MAGICK) + return NULL ; + + return psf_get_string (psf, str_type) ; +} /* sf_get_string */ + +int +sf_set_string (SNDFILE *sndfile, int str_type, const char* str) +{ SF_PRIVATE *psf ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + return psf_set_string (psf, str_type, str) ; +} /* sf_get_string */ + +/*------------------------------------------------------------------------------ +*/ + +int +sf_current_byterate (SNDFILE *sndfile) +{ SF_PRIVATE *psf ; + + if ((psf = (SF_PRIVATE*) sndfile) == NULL) + return -1 ; + if (psf->Magick != SNDFILE_MAGICK) + return -1 ; + + /* This should cover all PCM and floating point formats. */ + if (psf->bytewidth) + return psf->sf.samplerate * psf->sf.channels * psf->bytewidth ; + + if (psf->byterate) + return psf->byterate (psf) ; + + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_IMA_ADPCM : + case SF_FORMAT_MS_ADPCM : + case SF_FORMAT_VOX_ADPCM : + return (psf->sf.samplerate * psf->sf.channels) / 2 ; + + case SF_FORMAT_GSM610 : + return (psf->sf.samplerate * psf->sf.channels * 13000) / 8000 ; + + case SF_FORMAT_NMS_ADPCM_16: + return psf->sf.samplerate / 4 + 10 ; + + case SF_FORMAT_NMS_ADPCM_24: + return psf->sf.samplerate * 3 / 8 + 10 ; + + case SF_FORMAT_NMS_ADPCM_32: + return psf->sf.samplerate / 2 + 10 ; + + case SF_FORMAT_G721_32 : /* 32kbs G721 ADPCM encoding. */ + return (psf->sf.samplerate * psf->sf.channels) / 2 ; + + case SF_FORMAT_G723_24 : /* 24kbs G723 ADPCM encoding. */ + return (psf->sf.samplerate * psf->sf.channels * 3) / 8 ; + + case SF_FORMAT_G723_40 : /* 40kbs G723 ADPCM encoding. */ + return (psf->sf.samplerate * psf->sf.channels * 5) / 8 ; + + default : + break ; + } ; + + return -1 ; +} /* sf_current_byterate */ + +/*============================================================================== +*/ + +sf_count_t +sf_read_raw (SNDFILE *sndfile, void *ptr, sf_count_t bytes) +{ SF_PRIVATE *psf ; + sf_count_t count, extra ; + int bytewidth, blockwidth ; + + if (bytes == 0) + return 0 ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + bytewidth = (psf->bytewidth > 0) ? psf->bytewidth : 1 ; + blockwidth = (psf->blockwidth > 0) ? psf->blockwidth : 1 ; + + if (psf->file.mode == SFM_WRITE) + { psf->error = SFE_NOT_READMODE ; + return 0 ; + } ; + + if (bytes < 0 || psf->read_current >= psf->sf.frames) + { psf_memset (ptr, 0, bytes) ; + return 0 ; + } ; + + if (bytes % (psf->sf.channels * bytewidth)) + { psf->error = SFE_BAD_READ_ALIGN ; + return 0 ; + } ; + + if (psf->last_op != SFM_READ) + if (psf->seek (psf, SFM_READ, psf->read_current) < 0) + return 0 ; + + count = psf_fread (ptr, 1, bytes, psf) ; + + if (psf->read_current + count / blockwidth <= psf->sf.frames) + psf->read_current += count / blockwidth ; + else + { count = (psf->sf.frames - psf->read_current) * blockwidth ; + extra = bytes - count ; + psf_memset (((char *) ptr) + count, 0, extra) ; + psf->read_current = psf->sf.frames ; + } ; + + psf->last_op = SFM_READ ; + + return count ; +} /* sf_read_raw */ + +/*------------------------------------------------------------------------------ +*/ + +sf_count_t +sf_read_short (SNDFILE *sndfile, short *ptr, sf_count_t len) +{ SF_PRIVATE *psf ; + sf_count_t count, extra ; + + if (len == 0) + return 0 ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (len <= 0) + { psf->error = SFE_NEGATIVE_RW_LEN ; + return 0 ; + } ; + + if (psf->file.mode == SFM_WRITE) + { psf->error = SFE_NOT_READMODE ; + return 0 ; + } ; + + if (len % psf->sf.channels) + { psf->error = SFE_BAD_READ_ALIGN ; + return 0 ; + } ; + + if (psf->read_current >= psf->sf.frames) + { psf_memset (ptr, 0, len * sizeof (short)) ; + return 0 ; /* End of file. */ + } ; + + if (psf->read_short == NULL || psf->seek == NULL) + { psf->error = SFE_UNIMPLEMENTED ; + return 0 ; + } ; + + if (psf->last_op != SFM_READ) + if (psf->seek (psf, SFM_READ, psf->read_current) < 0) + return 0 ; + + count = psf->read_short (psf, ptr, len) ; + + if (psf->read_current + count / psf->sf.channels <= psf->sf.frames) + psf->read_current += count / psf->sf.channels ; + else + { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ; + extra = len - count ; + psf_memset (ptr + count, 0, extra * sizeof (short)) ; + psf->read_current = psf->sf.frames ; + } ; + + psf->last_op = SFM_READ ; + + return count ; +} /* sf_read_short */ + +sf_count_t +sf_readf_short (SNDFILE *sndfile, short *ptr, sf_count_t frames) +{ SF_PRIVATE *psf ; + sf_count_t count, extra ; + + if (frames == 0) + return 0 ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (frames <= 0) + { psf->error = SFE_NEGATIVE_RW_LEN ; + return 0 ; + } ; + + if (psf->file.mode == SFM_WRITE) + { psf->error = SFE_NOT_READMODE ; + return 0 ; + } ; + + if (psf->read_current >= psf->sf.frames) + { psf_memset (ptr, 0, frames * psf->sf.channels * sizeof (short)) ; + return 0 ; /* End of file. */ + } ; + + if (psf->read_short == NULL || psf->seek == NULL) + { psf->error = SFE_UNIMPLEMENTED ; + return 0 ; + } ; + + if (psf->last_op != SFM_READ) + if (psf->seek (psf, SFM_READ, psf->read_current) < 0) + return 0 ; + + count = psf->read_short (psf, ptr, frames * psf->sf.channels) ; + + if (psf->read_current + count / psf->sf.channels <= psf->sf.frames) + psf->read_current += count / psf->sf.channels ; + else + { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ; + extra = frames * psf->sf.channels - count ; + psf_memset (ptr + count, 0, extra * sizeof (short)) ; + psf->read_current = psf->sf.frames ; + } ; + + psf->last_op = SFM_READ ; + + return count / psf->sf.channels ; +} /* sf_readf_short */ + +/*------------------------------------------------------------------------------ +*/ + +sf_count_t +sf_read_int (SNDFILE *sndfile, int *ptr, sf_count_t len) +{ SF_PRIVATE *psf ; + sf_count_t count, extra ; + + if (len == 0) + return 0 ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (len <= 0) + { psf->error = SFE_NEGATIVE_RW_LEN ; + return 0 ; + } ; + + if (psf->file.mode == SFM_WRITE) + { psf->error = SFE_NOT_READMODE ; + return 0 ; + } ; + + if (len % psf->sf.channels) + { psf->error = SFE_BAD_READ_ALIGN ; + return 0 ; + } ; + + if (psf->read_current >= psf->sf.frames) + { psf_memset (ptr, 0, len * sizeof (int)) ; + return 0 ; + } ; + + if (psf->read_int == NULL || psf->seek == NULL) + { psf->error = SFE_UNIMPLEMENTED ; + return 0 ; + } ; + + if (psf->last_op != SFM_READ) + if (psf->seek (psf, SFM_READ, psf->read_current) < 0) + return 0 ; + + count = psf->read_int (psf, ptr, len) ; + + if (psf->read_current + count / psf->sf.channels <= psf->sf.frames) + psf->read_current += count / psf->sf.channels ; + else + { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ; + extra = len - count ; + psf_memset (ptr + count, 0, extra * sizeof (int)) ; + psf->read_current = psf->sf.frames ; + } ; + + psf->last_op = SFM_READ ; + + return count ; +} /* sf_read_int */ + +sf_count_t +sf_readf_int (SNDFILE *sndfile, int *ptr, sf_count_t frames) +{ SF_PRIVATE *psf ; + sf_count_t count, extra ; + + if (frames == 0) + return 0 ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (frames <= 0) + { psf->error = SFE_NEGATIVE_RW_LEN ; + return 0 ; + } ; + + if (psf->file.mode == SFM_WRITE) + { psf->error = SFE_NOT_READMODE ; + return 0 ; + } ; + + if (psf->read_current >= psf->sf.frames) + { psf_memset (ptr, 0, frames * psf->sf.channels * sizeof (int)) ; + return 0 ; + } ; + + if (psf->read_int == NULL || psf->seek == NULL) + { psf->error = SFE_UNIMPLEMENTED ; + return 0 ; + } ; + + if (psf->last_op != SFM_READ) + if (psf->seek (psf, SFM_READ, psf->read_current) < 0) + return 0 ; + + count = psf->read_int (psf, ptr, frames * psf->sf.channels) ; + + if (psf->read_current + count / psf->sf.channels <= psf->sf.frames) + psf->read_current += count / psf->sf.channels ; + else + { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ; + extra = frames * psf->sf.channels - count ; + psf_memset (ptr + count, 0, extra * sizeof (int)) ; + psf->read_current = psf->sf.frames ; + } ; + + psf->last_op = SFM_READ ; + + return count / psf->sf.channels ; +} /* sf_readf_int */ + +/*------------------------------------------------------------------------------ +*/ + +sf_count_t +sf_read_float (SNDFILE *sndfile, float *ptr, sf_count_t len) +{ SF_PRIVATE *psf ; + sf_count_t count, extra ; + + if (len == 0) + return 0 ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (len <= 0) + { psf->error = SFE_NEGATIVE_RW_LEN ; + return 0 ; + } ; + + if (psf->file.mode == SFM_WRITE) + { psf->error = SFE_NOT_READMODE ; + return 0 ; + } ; + + if (len % psf->sf.channels) + { psf->error = SFE_BAD_READ_ALIGN ; + return 0 ; + } ; + + if (psf->read_current >= psf->sf.frames) + { psf_memset (ptr, 0, len * sizeof (float)) ; + return 0 ; + } ; + + if (psf->read_float == NULL || psf->seek == NULL) + { psf->error = SFE_UNIMPLEMENTED ; + return 0 ; + } ; + + if (psf->last_op != SFM_READ) + if (psf->seek (psf, SFM_READ, psf->read_current) < 0) + return 0 ; + + count = psf->read_float (psf, ptr, len) ; + + if (psf->read_current + count / psf->sf.channels <= psf->sf.frames) + psf->read_current += count / psf->sf.channels ; + else + { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ; + extra = len - count ; + psf_memset (ptr + count, 0, extra * sizeof (float)) ; + psf->read_current = psf->sf.frames ; + } ; + + psf->last_op = SFM_READ ; + + return count ; +} /* sf_read_float */ + +sf_count_t +sf_readf_float (SNDFILE *sndfile, float *ptr, sf_count_t frames) +{ SF_PRIVATE *psf ; + sf_count_t count, extra ; + + if (frames == 0) + return 0 ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (frames <= 0) + { psf->error = SFE_NEGATIVE_RW_LEN ; + return 0 ; + } ; + + if (psf->file.mode == SFM_WRITE) + { psf->error = SFE_NOT_READMODE ; + return 0 ; + } ; + + if (psf->read_current >= psf->sf.frames) + { psf_memset (ptr, 0, frames * psf->sf.channels * sizeof (float)) ; + return 0 ; + } ; + + if (psf->read_float == NULL || psf->seek == NULL) + { psf->error = SFE_UNIMPLEMENTED ; + return 0 ; + } ; + + if (psf->last_op != SFM_READ) + if (psf->seek (psf, SFM_READ, psf->read_current) < 0) + return 0 ; + + count = psf->read_float (psf, ptr, frames * psf->sf.channels) ; + + if (psf->read_current + count / psf->sf.channels <= psf->sf.frames) + psf->read_current += count / psf->sf.channels ; + else + { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ; + extra = frames * psf->sf.channels - count ; + psf_memset (ptr + count, 0, extra * sizeof (float)) ; + psf->read_current = psf->sf.frames ; + } ; + + psf->last_op = SFM_READ ; + + return count / psf->sf.channels ; +} /* sf_readf_float */ + +/*------------------------------------------------------------------------------ +*/ + +sf_count_t +sf_read_double (SNDFILE *sndfile, double *ptr, sf_count_t len) +{ SF_PRIVATE *psf ; + sf_count_t count, extra ; + + if (len == 0) + return 0 ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (len <= 0) + { psf->error = SFE_NEGATIVE_RW_LEN ; + return 0 ; + } ; + + if (psf->file.mode == SFM_WRITE) + { psf->error = SFE_NOT_READMODE ; + return 0 ; + } ; + + if (len % psf->sf.channels) + { psf->error = SFE_BAD_READ_ALIGN ; + return 0 ; + } ; + + if (psf->read_current >= psf->sf.frames) + { psf_memset (ptr, 0, len * sizeof (double)) ; + return 0 ; + } ; + + if (psf->read_double == NULL || psf->seek == NULL) + { psf->error = SFE_UNIMPLEMENTED ; + return 0 ; + } ; + + if (psf->last_op != SFM_READ) + if (psf->seek (psf, SFM_READ, psf->read_current) < 0) + return 0 ; + + count = psf->read_double (psf, ptr, len) ; + + if (psf->read_current + count / psf->sf.channels <= psf->sf.frames) + psf->read_current += count / psf->sf.channels ; + else + { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ; + extra = len - count ; + psf_memset (ptr + count, 0, extra * sizeof (double)) ; + psf->read_current = psf->sf.frames ; + } ; + + psf->last_op = SFM_READ ; + + return count ; +} /* sf_read_double */ + +sf_count_t +sf_readf_double (SNDFILE *sndfile, double *ptr, sf_count_t frames) +{ SF_PRIVATE *psf ; + sf_count_t count, extra ; + + if (frames == 0) + return 0 ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (frames <= 0) + { psf->error = SFE_NEGATIVE_RW_LEN ; + return 0 ; + } ; + + if (psf->file.mode == SFM_WRITE) + { psf->error = SFE_NOT_READMODE ; + return 0 ; + } ; + + if (psf->read_current >= psf->sf.frames) + { psf_memset (ptr, 0, frames * psf->sf.channels * sizeof (double)) ; + return 0 ; + } ; + + if (psf->read_double == NULL || psf->seek == NULL) + { psf->error = SFE_UNIMPLEMENTED ; + return 0 ; + } ; + + if (psf->last_op != SFM_READ) + if (psf->seek (psf, SFM_READ, psf->read_current) < 0) + return 0 ; + + count = psf->read_double (psf, ptr, frames * psf->sf.channels) ; + + if (psf->read_current + count / psf->sf.channels <= psf->sf.frames) + psf->read_current += count / psf->sf.channels ; + else + { count = (psf->sf.frames - psf->read_current) * psf->sf.channels ; + extra = frames * psf->sf.channels - count ; + psf_memset (ptr + count, 0, extra * sizeof (double)) ; + psf->read_current = psf->sf.frames ; + } ; + + psf->last_op = SFM_READ ; + + return count / psf->sf.channels ; +} /* sf_readf_double */ + +/*------------------------------------------------------------------------------ +*/ + +sf_count_t +sf_write_raw (SNDFILE *sndfile, const void *ptr, sf_count_t len) +{ SF_PRIVATE *psf ; + sf_count_t count ; + int bytewidth, blockwidth ; + + if (len == 0) + return 0 ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (len <= 0) + { psf->error = SFE_NEGATIVE_RW_LEN ; + return 0 ; + } ; + + bytewidth = (psf->bytewidth > 0) ? psf->bytewidth : 1 ; + blockwidth = (psf->blockwidth > 0) ? psf->blockwidth : 1 ; + + if (psf->file.mode == SFM_READ) + { psf->error = SFE_NOT_WRITEMODE ; + return 0 ; + } ; + + if (len % (psf->sf.channels * bytewidth)) + { psf->error = SFE_BAD_WRITE_ALIGN ; + return 0 ; + } ; + + if (psf->last_op != SFM_WRITE) + if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) + return 0 ; + + if (psf->have_written == SF_FALSE && psf->write_header != NULL) + { if ((psf->error = psf->write_header (psf, SF_FALSE))) + return 0 ; + } ; + psf->have_written = SF_TRUE ; + + count = psf_fwrite (ptr, 1, len, psf) ; + + psf->write_current += count / blockwidth ; + + psf->last_op = SFM_WRITE ; + + if (psf->write_current > psf->sf.frames) + { psf->sf.frames = psf->write_current ; + psf->dataend = 0 ; + } ; + + if (psf->auto_header && psf->write_header != NULL) + psf->write_header (psf, SF_TRUE) ; + + return count ; +} /* sf_write_raw */ + +/*------------------------------------------------------------------------------ +*/ + +sf_count_t +sf_write_short (SNDFILE *sndfile, const short *ptr, sf_count_t len) +{ SF_PRIVATE *psf ; + sf_count_t count ; + + if (len == 0) + return 0 ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (len <= 0) + { psf->error = SFE_NEGATIVE_RW_LEN ; + return 0 ; + } ; + + if (psf->file.mode == SFM_READ) + { psf->error = SFE_NOT_WRITEMODE ; + return 0 ; + } ; + + if (len % psf->sf.channels) + { psf->error = SFE_BAD_WRITE_ALIGN ; + return 0 ; + } ; + + if (psf->write_short == NULL || psf->seek == NULL) + { psf->error = SFE_UNIMPLEMENTED ; + return 0 ; + } ; + + if (psf->last_op != SFM_WRITE) + if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) + return 0 ; + + if (psf->have_written == SF_FALSE && psf->write_header != NULL) + { if ((psf->error = psf->write_header (psf, SF_FALSE))) + return 0 ; + } ; + psf->have_written = SF_TRUE ; + + count = psf->write_short (psf, ptr, len) ; + + psf->write_current += count / psf->sf.channels ; + + psf->last_op = SFM_WRITE ; + + if (psf->write_current > psf->sf.frames) + { psf->sf.frames = psf->write_current ; + psf->dataend = 0 ; + } ; + + if (psf->auto_header && psf->write_header != NULL) + psf->write_header (psf, SF_TRUE) ; + + return count ; +} /* sf_write_short */ + +sf_count_t +sf_writef_short (SNDFILE *sndfile, const short *ptr, sf_count_t frames) +{ SF_PRIVATE *psf ; + sf_count_t count ; + + if (frames == 0) + return 0 ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (frames <= 0) + { psf->error = SFE_NEGATIVE_RW_LEN ; + return 0 ; + } ; + + if (psf->file.mode == SFM_READ) + { psf->error = SFE_NOT_WRITEMODE ; + return 0 ; + } ; + + if (psf->write_short == NULL || psf->seek == NULL) + { psf->error = SFE_UNIMPLEMENTED ; + return 0 ; + } ; + + if (psf->last_op != SFM_WRITE) + if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) + return 0 ; + + if (psf->have_written == SF_FALSE && psf->write_header != NULL) + { if ((psf->error = psf->write_header (psf, SF_FALSE))) + return 0 ; + } ; + psf->have_written = SF_TRUE ; + + count = psf->write_short (psf, ptr, frames * psf->sf.channels) ; + + psf->write_current += count / psf->sf.channels ; + + psf->last_op = SFM_WRITE ; + + if (psf->write_current > psf->sf.frames) + { psf->sf.frames = psf->write_current ; + psf->dataend = 0 ; + } ; + + if (psf->auto_header && psf->write_header != NULL) + psf->write_header (psf, SF_TRUE) ; + + return count / psf->sf.channels ; +} /* sf_writef_short */ + +/*------------------------------------------------------------------------------ +*/ + +sf_count_t +sf_write_int (SNDFILE *sndfile, const int *ptr, sf_count_t len) +{ SF_PRIVATE *psf ; + sf_count_t count ; + + if (len == 0) + return 0 ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (len <= 0) + { psf->error = SFE_NEGATIVE_RW_LEN ; + return 0 ; + } ; + + if (psf->file.mode == SFM_READ) + { psf->error = SFE_NOT_WRITEMODE ; + return 0 ; + } ; + + if (len % psf->sf.channels) + { psf->error = SFE_BAD_WRITE_ALIGN ; + return 0 ; + } ; + + if (psf->write_int == NULL || psf->seek == NULL) + { psf->error = SFE_UNIMPLEMENTED ; + return 0 ; + } ; + + if (psf->last_op != SFM_WRITE) + if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) + return 0 ; + + if (psf->have_written == SF_FALSE && psf->write_header != NULL) + { if ((psf->error = psf->write_header (psf, SF_FALSE))) + return 0 ; + } ; + psf->have_written = SF_TRUE ; + + count = psf->write_int (psf, ptr, len) ; + + psf->write_current += count / psf->sf.channels ; + + psf->last_op = SFM_WRITE ; + + if (psf->write_current > psf->sf.frames) + { psf->sf.frames = psf->write_current ; + psf->dataend = 0 ; + } ; + + if (psf->auto_header && psf->write_header != NULL) + psf->write_header (psf, SF_TRUE) ; + + return count ; +} /* sf_write_int */ + +sf_count_t +sf_writef_int (SNDFILE *sndfile, const int *ptr, sf_count_t frames) +{ SF_PRIVATE *psf ; + sf_count_t count ; + + if (frames == 0) + return 0 ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (frames <= 0) + { psf->error = SFE_NEGATIVE_RW_LEN ; + return 0 ; + } ; + + if (psf->file.mode == SFM_READ) + { psf->error = SFE_NOT_WRITEMODE ; + return 0 ; + } ; + + if (psf->write_int == NULL || psf->seek == NULL) + { psf->error = SFE_UNIMPLEMENTED ; + return 0 ; + } ; + + if (psf->last_op != SFM_WRITE) + if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) + return 0 ; + + if (psf->have_written == SF_FALSE && psf->write_header != NULL) + { if ((psf->error = psf->write_header (psf, SF_FALSE))) + return 0 ; + } ; + psf->have_written = SF_TRUE ; + + count = psf->write_int (psf, ptr, frames * psf->sf.channels) ; + + psf->write_current += count / psf->sf.channels ; + + psf->last_op = SFM_WRITE ; + + if (psf->write_current > psf->sf.frames) + { psf->sf.frames = psf->write_current ; + psf->dataend = 0 ; + } ; + + if (psf->auto_header && psf->write_header != NULL) + psf->write_header (psf, SF_TRUE) ; + + return count / psf->sf.channels ; +} /* sf_writef_int */ + +/*------------------------------------------------------------------------------ +*/ + +sf_count_t +sf_write_float (SNDFILE *sndfile, const float *ptr, sf_count_t len) +{ SF_PRIVATE *psf ; + sf_count_t count ; + + if (len == 0) + return 0 ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (len <= 0) + { psf->error = SFE_NEGATIVE_RW_LEN ; + return 0 ; + } ; + + if (psf->file.mode == SFM_READ) + { psf->error = SFE_NOT_WRITEMODE ; + return 0 ; + } ; + + if (len % psf->sf.channels) + { psf->error = SFE_BAD_WRITE_ALIGN ; + return 0 ; + } ; + + if (psf->write_float == NULL || psf->seek == NULL) + { psf->error = SFE_UNIMPLEMENTED ; + return 0 ; + } ; + + if (psf->last_op != SFM_WRITE) + if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) + return 0 ; + + if (psf->have_written == SF_FALSE && psf->write_header != NULL) + { if ((psf->error = psf->write_header (psf, SF_FALSE))) + return 0 ; + } ; + psf->have_written = SF_TRUE ; + + count = psf->write_float (psf, ptr, len) ; + + psf->write_current += count / psf->sf.channels ; + + psf->last_op = SFM_WRITE ; + + if (psf->write_current > psf->sf.frames) + { psf->sf.frames = psf->write_current ; + psf->dataend = 0 ; + } ; + + if (psf->auto_header && psf->write_header != NULL) + psf->write_header (psf, SF_TRUE) ; + + return count ; +} /* sf_write_float */ + +sf_count_t +sf_writef_float (SNDFILE *sndfile, const float *ptr, sf_count_t frames) +{ SF_PRIVATE *psf ; + sf_count_t count ; + + if (frames == 0) + return 0 ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (frames <= 0) + { psf->error = SFE_NEGATIVE_RW_LEN ; + return 0 ; + } ; + + if (psf->file.mode == SFM_READ) + { psf->error = SFE_NOT_WRITEMODE ; + return 0 ; + } ; + + if (psf->write_float == NULL || psf->seek == NULL) + { psf->error = SFE_UNIMPLEMENTED ; + return 0 ; + } ; + + if (psf->last_op != SFM_WRITE) + if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) + return 0 ; + + if (psf->have_written == SF_FALSE && psf->write_header != NULL) + { if ((psf->error = psf->write_header (psf, SF_FALSE))) + return 0 ; + } ; + psf->have_written = SF_TRUE ; + + count = psf->write_float (psf, ptr, frames * psf->sf.channels) ; + + psf->write_current += count / psf->sf.channels ; + + psf->last_op = SFM_WRITE ; + + if (psf->write_current > psf->sf.frames) + { psf->sf.frames = psf->write_current ; + psf->dataend = 0 ; + } ; + + if (psf->auto_header && psf->write_header != NULL) + psf->write_header (psf, SF_TRUE) ; + + return count / psf->sf.channels ; +} /* sf_writef_float */ + +/*------------------------------------------------------------------------------ +*/ + +sf_count_t +sf_write_double (SNDFILE *sndfile, const double *ptr, sf_count_t len) +{ SF_PRIVATE *psf ; + sf_count_t count ; + + if (len == 0) + return 0 ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (len <= 0) + { psf->error = SFE_NEGATIVE_RW_LEN ; + return 0 ; + } ; + + if (psf->file.mode == SFM_READ) + { psf->error = SFE_NOT_WRITEMODE ; + return 0 ; + } ; + + if (len % psf->sf.channels) + { psf->error = SFE_BAD_WRITE_ALIGN ; + return 0 ; + } ; + + if (psf->write_double == NULL || psf->seek == NULL) + { psf->error = SFE_UNIMPLEMENTED ; + return 0 ; + } ; + + if (psf->last_op != SFM_WRITE) + if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) + return 0 ; + + if (psf->have_written == SF_FALSE && psf->write_header != NULL) + { if ((psf->error = psf->write_header (psf, SF_FALSE))) + return 0 ; + } ; + psf->have_written = SF_TRUE ; + + count = psf->write_double (psf, ptr, len) ; + + psf->write_current += count / psf->sf.channels ; + + psf->last_op = SFM_WRITE ; + + if (psf->write_current > psf->sf.frames) + { psf->sf.frames = psf->write_current ; + psf->dataend = 0 ; + } ; + + if (psf->auto_header && psf->write_header != NULL) + psf->write_header (psf, SF_TRUE) ; + + return count ; +} /* sf_write_double */ + +sf_count_t +sf_writef_double (SNDFILE *sndfile, const double *ptr, sf_count_t frames) +{ SF_PRIVATE *psf ; + sf_count_t count ; + + if (frames == 0) + return 0 ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (frames <= 0) + { psf->error = SFE_NEGATIVE_RW_LEN ; + return 0 ; + } ; + + if (psf->file.mode == SFM_READ) + { psf->error = SFE_NOT_WRITEMODE ; + return 0 ; + } ; + + if (psf->write_double == NULL || psf->seek == NULL) + { psf->error = SFE_UNIMPLEMENTED ; + return 0 ; + } ; + + if (psf->last_op != SFM_WRITE) + if (psf->seek (psf, SFM_WRITE, psf->write_current) < 0) + return 0 ; + + if (psf->have_written == SF_FALSE && psf->write_header != NULL) + { if ((psf->error = psf->write_header (psf, SF_FALSE))) + return 0 ; + } ; + psf->have_written = SF_TRUE ; + + count = psf->write_double (psf, ptr, frames * psf->sf.channels) ; + + psf->write_current += count / psf->sf.channels ; + + psf->last_op = SFM_WRITE ; + + if (psf->write_current > psf->sf.frames) + { psf->sf.frames = psf->write_current ; + psf->dataend = 0 ; + } ; + + if (psf->auto_header && psf->write_header != NULL) + psf->write_header (psf, SF_TRUE) ; + + return count / psf->sf.channels ; +} /* sf_writef_double */ + +/*========================================================================= +** Private functions. +*/ + +static int +try_resource_fork (SF_PRIVATE * psf) +{ int old_error = psf->error ; + + /* Set READ mode now, to see if resource fork exists. */ + psf->rsrc.mode = SFM_READ ; + if (psf_open_rsrc (psf) != 0) + { psf->error = old_error ; + return 0 ; + } ; + + /* More checking here. */ + psf_log_printf (psf, "Resource fork : %s\n", psf->rsrc.path.c) ; + + return SF_FORMAT_SD2 ; +} /* try_resource_fork */ + +static int +format_from_extension (SF_PRIVATE *psf) +{ char *cptr ; + char buffer [16] ; + int format = 0 ; + + if ((cptr = strrchr (psf->file.name.c, '.')) == NULL) + return 0 ; + + cptr ++ ; + if (strlen (cptr) > sizeof (buffer) - 1) + return 0 ; + + psf_strlcpy (buffer, sizeof (buffer), cptr) ; + buffer [sizeof (buffer) - 1] = 0 ; + + /* Convert everything in the buffer to lower case. */ + cptr = buffer ; + while (*cptr) + { *cptr = tolower (*cptr) ; + cptr ++ ; + } ; + + cptr = buffer ; + + if (strcmp (cptr, "au") == 0) + { psf->sf.channels = 1 ; + psf->sf.samplerate = 8000 ; + format = SF_FORMAT_RAW | SF_FORMAT_ULAW ; + } + else if (strcmp (cptr, "snd") == 0) + { psf->sf.channels = 1 ; + psf->sf.samplerate = 8000 ; + format = SF_FORMAT_RAW | SF_FORMAT_ULAW ; + } + + else if (strcmp (cptr, "vox") == 0 || strcmp (cptr, "vox8") == 0) + { psf->sf.channels = 1 ; + psf->sf.samplerate = 8000 ; + format = SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM ; + } + else if (strcmp (cptr, "vox6") == 0) + { psf->sf.channels = 1 ; + psf->sf.samplerate = 6000 ; + format = SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM ; + } + else if (strcmp (cptr, "gsm") == 0) + { psf->sf.channels = 1 ; + psf->sf.samplerate = 8000 ; + format = SF_FORMAT_RAW | SF_FORMAT_GSM610 ; + } + + /* For RAW files, make sure the dataoffset if set correctly. */ + if ((SF_CONTAINER (format)) == SF_FORMAT_RAW) + psf->dataoffset = 0 ; + + return format ; +} /* format_from_extension */ + +static int +guess_file_type (SF_PRIVATE *psf) +{ uint32_t buffer [3], format ; + + if (psf_binheader_readf (psf, "b", &buffer, SIGNED_SIZEOF (buffer)) != SIGNED_SIZEOF (buffer)) + { psf->error = SFE_BAD_FILE_READ ; + return 0 ; + } ; + + if ((buffer [0] == MAKE_MARKER ('R', 'I', 'F', 'F') || buffer [0] == MAKE_MARKER ('R', 'I', 'F', 'X')) + && buffer [2] == MAKE_MARKER ('W', 'A', 'V', 'E')) + return SF_FORMAT_WAV ; + + if (buffer [0] == MAKE_MARKER ('F', 'O', 'R', 'M')) + { if (buffer [2] == MAKE_MARKER ('A', 'I', 'F', 'F') || buffer [2] == MAKE_MARKER ('A', 'I', 'F', 'C')) + return SF_FORMAT_AIFF ; + if (buffer [2] == MAKE_MARKER ('8', 'S', 'V', 'X') || buffer [2] == MAKE_MARKER ('1', '6', 'S', 'V')) + return SF_FORMAT_SVX ; + return 0 ; + } ; + + if (buffer [0] == MAKE_MARKER ('.', 's', 'n', 'd') || buffer [0] == MAKE_MARKER ('d', 'n', 's', '.')) + return SF_FORMAT_AU ; + + if ((buffer [0] == MAKE_MARKER ('f', 'a', 'p', ' ') || buffer [0] == MAKE_MARKER (' ', 'p', 'a', 'f'))) + return SF_FORMAT_PAF ; + + if (buffer [0] == MAKE_MARKER ('N', 'I', 'S', 'T')) + return SF_FORMAT_NIST ; + + if (buffer [0] == MAKE_MARKER ('C', 'r', 'e', 'a') && buffer [1] == MAKE_MARKER ('t', 'i', 'v', 'e')) + return SF_FORMAT_VOC ; + + if ((buffer [0] & MAKE_MARKER (0xFF, 0xFF, 0xF8, 0xFF)) == MAKE_MARKER (0x64, 0xA3, 0x00, 0x00) || + (buffer [0] & MAKE_MARKER (0xFF, 0xF8, 0xFF, 0xFF)) == MAKE_MARKER (0x00, 0x00, 0xA3, 0x64)) + return SF_FORMAT_IRCAM ; + + if (buffer [0] == MAKE_MARKER ('r', 'i', 'f', 'f')) + return SF_FORMAT_W64 ; + + if (buffer [0] == MAKE_MARKER (0, 0, 0x03, 0xE8) && buffer [1] == MAKE_MARKER (0, 0, 0, 1) && + buffer [2] == MAKE_MARKER (0, 0, 0, 1)) + return SF_FORMAT_MAT4 ; + + if (buffer [0] == MAKE_MARKER (0, 0, 0, 0) && buffer [1] == MAKE_MARKER (1, 0, 0, 0) && + buffer [2] == MAKE_MARKER (1, 0, 0, 0)) + return SF_FORMAT_MAT4 ; + + if (buffer [0] == MAKE_MARKER ('M', 'A', 'T', 'L') && buffer [1] == MAKE_MARKER ('A', 'B', ' ', '5')) + return SF_FORMAT_MAT5 ; + + if (buffer [0] == MAKE_MARKER ('P', 'V', 'F', '1')) + return SF_FORMAT_PVF ; + + if (buffer [0] == MAKE_MARKER ('E', 'x', 't', 'e') && buffer [1] == MAKE_MARKER ('n', 'd', 'e', 'd') && + buffer [2] == MAKE_MARKER (' ', 'I', 'n', 's')) + return SF_FORMAT_XI ; + + if (buffer [0] == MAKE_MARKER ('c', 'a', 'f', 'f') && buffer [2] == MAKE_MARKER ('d', 'e', 's', 'c')) + return SF_FORMAT_CAF ; + + if (buffer [0] == MAKE_MARKER ('O', 'g', 'g', 'S')) + return SF_FORMAT_OGG ; + + if (buffer [0] == MAKE_MARKER ('A', 'L', 'a', 'w') && buffer [1] == MAKE_MARKER ('S', 'o', 'u', 'n') + && buffer [2] == MAKE_MARKER ('d', 'F', 'i', 'l')) + return SF_FORMAT_WVE ; + + if (buffer [0] == MAKE_MARKER ('D', 'i', 'a', 'm') && buffer [1] == MAKE_MARKER ('o', 'n', 'd', 'W') + && buffer [2] == MAKE_MARKER ('a', 'r', 'e', ' ')) + return SF_FORMAT_DWD ; + + if (buffer [0] == MAKE_MARKER ('L', 'M', '8', '9') || buffer [0] == MAKE_MARKER ('5', '3', 0, 0)) + return SF_FORMAT_TXW ; + + if ((buffer [0] & MAKE_MARKER (0xFF, 0xFF, 0x80, 0xFF)) == MAKE_MARKER (0xF0, 0x7E, 0, 0x01)) + return SF_FORMAT_SDS ; + + if ((buffer [0] & MAKE_MARKER (0xFF, 0xFF, 0, 0)) == MAKE_MARKER (1, 4, 0, 0)) + return SF_FORMAT_MPC2K ; + + if (buffer [0] == MAKE_MARKER ('C', 'A', 'T', ' ') && buffer [2] == MAKE_MARKER ('R', 'E', 'X', '2')) + return SF_FORMAT_REX2 ; + + if (buffer [0] == MAKE_MARKER (0x30, 0x26, 0xB2, 0x75) && buffer [1] == MAKE_MARKER (0x8E, 0x66, 0xCF, 0x11)) + return 0 /*-SF_FORMAT_WMA-*/ ; + + /* HMM (Hidden Markov Model) Tool Kit. */ + if (buffer [2] == MAKE_MARKER (0, 2, 0, 0) && 2 * ((int64_t) BE2H_32 (buffer [0])) + 12 == psf->filelength) + return SF_FORMAT_HTK ; + + if (buffer [0] == MAKE_MARKER ('f', 'L', 'a', 'C')) + return SF_FORMAT_FLAC ; + + if (buffer [0] == MAKE_MARKER ('2', 'B', 'I', 'T')) + return SF_FORMAT_AVR ; + + if (buffer [0] == MAKE_MARKER ('R', 'F', '6', '4') && buffer [2] == MAKE_MARKER ('W', 'A', 'V', 'E')) + return SF_FORMAT_RF64 ; + + if (buffer [0] == MAKE_MARKER ('I', 'D', '3', 2) || buffer [0] == MAKE_MARKER ('I', 'D', '3', 3) + || buffer [0] == MAKE_MARKER ('I', 'D', '3', 4)) + { psf_log_printf (psf, "Found 'ID3' marker.\n") ; + if (id3_skip (psf)) + return guess_file_type (psf) ; + return 0 ; + } ; + + /* Turtle Beach SMP 16-bit */ + if (buffer [0] == MAKE_MARKER ('S', 'O', 'U', 'N') && buffer [1] == MAKE_MARKER ('D', ' ', 'S', 'A')) + return 0 ; + + /* Yamaha sampler format. */ + if (buffer [0] == MAKE_MARKER ('S', 'Y', '8', '0') || buffer [0] == MAKE_MARKER ('S', 'Y', '8', '5')) + return 0 ; + + if (buffer [0] == MAKE_MARKER ('a', 'j', 'k', 'g')) + return 0 /*-SF_FORMAT_SHN-*/ ; + + /* This must be the last one. */ + if (psf->filelength > 0 && (format = try_resource_fork (psf)) != 0) + return format ; + + return 0 ; +} /* guess_file_type */ + + +static int +validate_sfinfo (SF_INFO *sfinfo) +{ if (sfinfo->samplerate < 1) + return 0 ; + if (sfinfo->frames < 0) + return 0 ; + if (sfinfo->channels < 1) + return 0 ; + if ((SF_CONTAINER (sfinfo->format)) == 0) + return 0 ; + if ((SF_CODEC (sfinfo->format)) == 0) + return 0 ; + if (sfinfo->sections < 1) + return 0 ; + return 1 ; +} /* validate_sfinfo */ + +static int +validate_psf (SF_PRIVATE *psf) +{ + if (psf->datalength < 0) + { psf_log_printf (psf, "Invalid SF_PRIVATE field : datalength == %D.\n", psf->datalength) ; + return 0 ; + } ; + if (psf->dataoffset < 0) + { psf_log_printf (psf, "Invalid SF_PRIVATE field : dataoffset == %D.\n", psf->dataoffset) ; + return 0 ; + } ; + if (psf->blockwidth && psf->blockwidth != psf->sf.channels * psf->bytewidth) + { psf_log_printf (psf, "Invalid SF_PRIVATE field : channels * bytewidth == %d.\n", + psf->sf.channels * psf->bytewidth) ; + return 0 ; + } ; + return 1 ; +} /* validate_psf */ + +static void +save_header_info (SF_PRIVATE *psf) +{ snprintf (sf_parselog, sizeof (sf_parselog), "%s", psf->parselog.buf) ; +} /* save_header_info */ + +static int +copy_filename (SF_PRIVATE *psf, const char *path) +{ const char *ccptr ; + char *cptr ; + + if (strlen (path) > 1 && strlen (path) - 1 >= sizeof (psf->file.path.c)) + { psf->error = SFE_FILENAME_TOO_LONG ; + return psf->error ; + } ; + + snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", path) ; + if ((ccptr = strrchr (path, '/')) || (ccptr = strrchr (path, '\\'))) + ccptr ++ ; + else + ccptr = path ; + + snprintf (psf->file.name.c, sizeof (psf->file.name.c), "%s", ccptr) ; + + /* Now grab the directory. */ + snprintf (psf->file.dir.c, sizeof (psf->file.dir.c), "%s", path) ; + if ((cptr = strrchr (psf->file.dir.c, '/')) || (cptr = strrchr (psf->file.dir.c, '\\'))) + cptr [1] = 0 ; + else + psf->file.dir.c [0] = 0 ; + + return 0 ; +} /* copy_filename */ + +/*============================================================================== +*/ + +static int +psf_close (SF_PRIVATE *psf) +{ uint32_t k ; + int error = 0 ; + + if (psf->codec_close) + { error = psf->codec_close (psf) ; + /* To prevent it being called in psf->container_close(). */ + psf->codec_close = NULL ; + } ; + + if (psf->container_close) + error = psf->container_close (psf) ; + + error = psf_fclose (psf) ; + psf_close_rsrc (psf) ; + + /* For an ISO C compliant implementation it is ok to free a NULL pointer. */ + free (psf->header.ptr) ; + free (psf->container_data) ; + free (psf->codec_data) ; + free (psf->interleave) ; + free (psf->dither) ; + free (psf->peak_info) ; + free (psf->broadcast_16k) ; + free (psf->loop_info) ; + free (psf->instrument) ; + free (psf->cues) ; + free (psf->channel_map) ; + free (psf->format_desc) ; + free (psf->strings.storage) ; + + if (psf->wchunks.chunks) + for (k = 0 ; k < psf->wchunks.used ; k++) + free (psf->wchunks.chunks [k].data) ; + free (psf->rchunks.chunks) ; + free (psf->wchunks.chunks) ; + free (psf->iterator) ; + free (psf->cart_16k) ; + + free (psf) ; + + return error ; +} /* psf_close */ + +SNDFILE * +psf_open_file (SF_PRIVATE *psf, SF_INFO *sfinfo) +{ int error, format ; + + sf_errno = error = 0 ; + sf_parselog [0] = 0 ; + + if (psf->error) + { error = psf->error ; + goto error_exit ; + } ; + + if (psf->file.mode != SFM_READ && psf->file.mode != SFM_WRITE && psf->file.mode != SFM_RDWR) + { error = SFE_BAD_OPEN_MODE ; + goto error_exit ; + } ; + + if (sfinfo == NULL) + { error = SFE_BAD_SF_INFO_PTR ; + goto error_exit ; + } ; + + if (psf->file.mode == SFM_READ) + { if ((SF_CONTAINER (sfinfo->format)) == SF_FORMAT_RAW) + { if (sf_format_check (sfinfo) == 0) + { error = SFE_RAW_BAD_FORMAT ; + goto error_exit ; + } ; + } + else + memset (sfinfo, 0, sizeof (SF_INFO)) ; + } ; + + memcpy (&psf->sf, sfinfo, sizeof (SF_INFO)) ; + + psf->Magick = SNDFILE_MAGICK ; + psf->norm_float = SF_TRUE ; + psf->norm_double = SF_TRUE ; + psf->dataoffset = -1 ; + psf->datalength = -1 ; + psf->read_current = -1 ; + psf->write_current = -1 ; + psf->auto_header = SF_FALSE ; + psf->rwf_endian = SF_ENDIAN_LITTLE ; + psf->seek = psf_default_seek ; + psf->float_int_mult = 0 ; + psf->float_max = -1.0 ; + + /* An attempt at a per SF_PRIVATE unique id. */ + psf->unique_id = psf_rand_int32 () ; + + psf->sf.sections = 1 ; + + psf->is_pipe = psf_is_pipe (psf) ; + + if (psf->is_pipe) + { psf->sf.seekable = SF_FALSE ; + psf->filelength = SF_COUNT_MAX ; + } + else + { psf->sf.seekable = SF_TRUE ; + + /* File is open, so get the length. */ + psf->filelength = psf_get_filelen (psf) ; + } ; + + if (psf->fileoffset > 0) + { switch (psf->file.mode) + { case SFM_READ : + if (psf->filelength < 44) + { psf_log_printf (psf, "Short filelength: %D (fileoffset: %D)\n", psf->filelength, psf->fileoffset) ; + error = SFE_BAD_OFFSET ; + goto error_exit ; + } ; + break ; + + case SFM_WRITE : + psf->fileoffset = 0 ; + psf_fseek (psf, 0, SEEK_END) ; + psf->fileoffset = psf_ftell (psf) ; + break ; + + case SFM_RDWR : + error = SFE_NO_EMBEDDED_RDWR ; + goto error_exit ; + } ; + + psf_log_printf (psf, "Embedded file offset : %D\n", psf->fileoffset) ; + } ; + + if (psf->filelength == SF_COUNT_MAX) + psf_log_printf (psf, "Length : unknown\n") ; + else + psf_log_printf (psf, "Length : %D\n", psf->filelength) ; + + if (psf->file.mode == SFM_WRITE || (psf->file.mode == SFM_RDWR && psf->filelength == 0)) + { /* If the file is being opened for write or RDWR and the file is currently + ** empty, then the SF_INFO struct must contain valid data. + */ + if ((SF_CONTAINER (psf->sf.format)) == 0) + { error = SFE_ZERO_MAJOR_FORMAT ; + goto error_exit ; + } ; + if ((SF_CODEC (psf->sf.format)) == 0) + { error = SFE_ZERO_MINOR_FORMAT ; + goto error_exit ; + } ; + + if (sf_format_check (&psf->sf) == 0) + { error = SFE_BAD_OPEN_FORMAT ; + goto error_exit ; + } ; + } + else if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_RAW) + { /* If type RAW has not been specified then need to figure out file type. */ + psf->sf.format = guess_file_type (psf) ; + + if (psf->sf.format == 0) + psf->sf.format = format_from_extension (psf) ; + } ; + + /* Prevent unnecessary seeks */ + psf->last_op = psf->file.mode ; + + /* Set bytewidth if known. */ + switch (SF_CODEC (psf->sf.format)) + { case SF_FORMAT_PCM_S8 : + case SF_FORMAT_PCM_U8 : + case SF_FORMAT_ULAW : + case SF_FORMAT_ALAW : + case SF_FORMAT_DPCM_8 : + psf->bytewidth = 1 ; + break ; + + case SF_FORMAT_PCM_16 : + case SF_FORMAT_DPCM_16 : + psf->bytewidth = 2 ; + break ; + + case SF_FORMAT_PCM_24 : + psf->bytewidth = 3 ; + break ; + + case SF_FORMAT_PCM_32 : + case SF_FORMAT_FLOAT : + psf->bytewidth = 4 ; + break ; + + case SF_FORMAT_DOUBLE : + psf->bytewidth = 8 ; + break ; + } ; + + /* Call the initialisation function for the relevant file type. */ + switch (SF_CONTAINER (psf->sf.format)) + { case SF_FORMAT_WAV : + case SF_FORMAT_WAVEX : + error = wav_open (psf) ; + break ; + + case SF_FORMAT_AIFF : + error = aiff_open (psf) ; + break ; + + case SF_FORMAT_AU : + error = au_open (psf) ; + break ; + + case SF_FORMAT_RAW : + error = raw_open (psf) ; + break ; + + case SF_FORMAT_W64 : + error = w64_open (psf) ; + break ; + + case SF_FORMAT_RF64 : + error = rf64_open (psf) ; + break ; + + /* Lite remove start */ + case SF_FORMAT_PAF : + error = paf_open (psf) ; + break ; + + case SF_FORMAT_SVX : + error = svx_open (psf) ; + break ; + + case SF_FORMAT_NIST : + error = nist_open (psf) ; + break ; + + case SF_FORMAT_IRCAM : + error = ircam_open (psf) ; + break ; + + case SF_FORMAT_VOC : + error = voc_open (psf) ; + break ; + + case SF_FORMAT_SDS : + error = sds_open (psf) ; + break ; + + case SF_FORMAT_OGG : + error = ogg_open (psf) ; + break ; + + case SF_FORMAT_TXW : + error = txw_open (psf) ; + break ; + + case SF_FORMAT_WVE : + error = wve_open (psf) ; + break ; + + case SF_FORMAT_DWD : + error = dwd_open (psf) ; + break ; + + case SF_FORMAT_MAT4 : + error = mat4_open (psf) ; + break ; + + case SF_FORMAT_MAT5 : + error = mat5_open (psf) ; + break ; + + case SF_FORMAT_PVF : + error = pvf_open (psf) ; + break ; + + case SF_FORMAT_XI : + error = xi_open (psf) ; + break ; + + case SF_FORMAT_HTK : + error = htk_open (psf) ; + break ; + + case SF_FORMAT_SD2 : + error = sd2_open (psf) ; + break ; + + case SF_FORMAT_REX2 : + error = rx2_open (psf) ; + break ; + + case SF_FORMAT_AVR : + error = avr_open (psf) ; + break ; + + case SF_FORMAT_FLAC : + error = flac_open (psf) ; + break ; + + case SF_FORMAT_CAF : + error = caf_open (psf) ; + break ; + + case SF_FORMAT_MPC2K : + error = mpc2k_open (psf) ; + break ; + + /* Lite remove end */ + + default : + error = SF_ERR_UNRECOGNISED_FORMAT ; + } ; + + if (error) + goto error_exit ; + + /* For now, check whether embedding is supported. */ + format = SF_CONTAINER (psf->sf.format) ; + if (psf->fileoffset > 0) + { switch (format) + { case SF_FORMAT_WAV : + case SF_FORMAT_WAVEX : + case SF_FORMAT_AIFF : + case SF_FORMAT_AU : + /* Actual embedded files. */ + break ; + + case SF_FORMAT_FLAC : + /* Flac with an ID3v2 header? */ + break ; + + default : + error = SFE_NO_EMBED_SUPPORT ; + goto error_exit ; + } ; + } ; + + if (psf->fileoffset > 0) + psf_log_printf (psf, "Embedded file length : %D\n", psf->filelength) ; + + if (psf->file.mode == SFM_RDWR && sf_format_check (&psf->sf) == 0) + { error = SFE_BAD_MODE_RW ; + goto error_exit ; + } ; + + if (validate_sfinfo (&psf->sf) == 0) + { psf_log_SF_INFO (psf) ; + save_header_info (psf) ; + error = SFE_BAD_SF_INFO ; + goto error_exit ; + } ; + + if (validate_psf (psf) == 0) + { save_header_info (psf) ; + error = SFE_INTERNAL ; + goto error_exit ; + } ; + + psf->read_current = 0 ; + psf->write_current = 0 ; + if (psf->file.mode == SFM_RDWR) + { psf->write_current = psf->sf.frames ; + psf->have_written = psf->sf.frames > 0 ? SF_TRUE : SF_FALSE ; + } ; + + memcpy (sfinfo, &psf->sf, sizeof (SF_INFO)) ; + + if (psf->file.mode == SFM_WRITE) + { /* Zero out these fields. */ + sfinfo->frames = 0 ; + sfinfo->sections = 0 ; + sfinfo->seekable = 0 ; + } ; + + return (SNDFILE *) psf ; + +error_exit : + sf_errno = error ; + + if (error == SFE_SYSTEM) + snprintf (sf_syserr, sizeof (sf_syserr), "%s", psf->syserr) ; + snprintf (sf_parselog, sizeof (sf_parselog), "%s", psf->parselog.buf) ; + + switch (error) + { case SF_ERR_SYSTEM : + case SF_ERR_UNSUPPORTED_ENCODING : + case SFE_UNIMPLEMENTED : + break ; + + case SFE_RAW_BAD_FORMAT : + break ; + + default : + if (psf->file.mode == SFM_READ) + { psf_log_printf (psf, "Parse error : %s\n", sf_error_number (error)) ; + error = SF_ERR_MALFORMED_FILE ; + } ; + } ; + + psf_close (psf) ; + return NULL ; +} /* psf_open_file */ + +/*============================================================================== +** Chunk getting and setting. +** This works for AIFF, CAF, RF64 and WAV. +** It doesn't work for W64 because W64 uses weird GUID style chunk markers. +*/ + +int +sf_set_chunk (SNDFILE * sndfile, const SF_CHUNK_INFO * chunk_info) +{ SF_PRIVATE *psf ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (chunk_info == NULL || chunk_info->data == NULL) + return SFE_BAD_CHUNK_PTR ; + + if (psf->set_chunk) + return psf->set_chunk (psf, chunk_info) ; + + return SFE_BAD_CHUNK_FORMAT ; +} /* sf_set_chunk */ + +SF_CHUNK_ITERATOR * +sf_get_chunk_iterator (SNDFILE * sndfile, const SF_CHUNK_INFO * chunk_info) +{ SF_PRIVATE *psf ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (chunk_info) + return psf_get_chunk_iterator (psf, chunk_info->id) ; + + return psf_get_chunk_iterator (psf, NULL) ; +} /* sf_get_chunk_iterator */ + +SF_CHUNK_ITERATOR * +sf_next_chunk_iterator (SF_CHUNK_ITERATOR * iterator) +{ SF_PRIVATE *psf ; + SNDFILE *sndfile = iterator ? iterator->sndfile : NULL ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (psf->next_chunk_iterator) + return psf->next_chunk_iterator (psf, iterator) ; + + return NULL ; +} /* sf_get_chunk_iterator_next */ + +int +sf_get_chunk_size (const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) +{ SF_PRIVATE *psf ; + SNDFILE *sndfile = iterator ? iterator->sndfile : NULL ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (chunk_info == NULL) + return SFE_BAD_CHUNK_PTR ; + + if (psf->get_chunk_size) + return psf->get_chunk_size (psf, iterator, chunk_info) ; + + return SFE_BAD_CHUNK_FORMAT ; +} /* sf_get_chunk_size */ + +int +sf_get_chunk_data (const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) +{ SF_PRIVATE *psf ; + SNDFILE *sndfile = iterator ? iterator->sndfile : NULL ; + + VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf, 1) ; + + if (chunk_info == NULL || chunk_info->data == NULL) + return SFE_BAD_CHUNK_PTR ; + + if (psf->get_chunk_data) + return psf->get_chunk_data (psf, iterator, chunk_info) ; + + return SFE_BAD_CHUNK_FORMAT ; +} /* sf_get_chunk_data */ diff --git a/libsndfile-1.0.31/src/strings.c b/libsndfile-1.0.31/src/strings.c new file mode 100644 index 0000000..7aadff6 --- /dev/null +++ b/libsndfile-1.0.31/src/strings.c @@ -0,0 +1,187 @@ +/* +** Copyright (C) 2001-2016 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#include "sndfile.h" +#include "common.h" + +#define STRINGS_DEBUG 0 + +int +psf_store_string (SF_PRIVATE *psf, int str_type, const char *str) +{ char new_str [128] ; + size_t str_len ; + int k, str_flags ; + + if (str == NULL) + return SFE_STR_BAD_STRING ; + + str_len = strlen (str) ; + + /* A few extra checks for write mode. */ + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if ((psf->strings.flags & SF_STR_ALLOW_START) == 0) + return SFE_STR_NO_SUPPORT ; + if (psf->have_written && (psf->strings.flags & SF_STR_ALLOW_END) == 0) + return SFE_STR_NO_SUPPORT ; + /* Only allow zero length strings for software. */ + if (str_type != SF_STR_SOFTWARE && str_len == 0) + return SFE_STR_BAD_STRING ; + } ; + + /* Find the next free slot in table. */ + for (k = 0 ; k < SF_MAX_STRINGS ; k++) + { /* If we find a matching entry clear it. */ + if (psf->strings.data [k].type == str_type) + psf->strings.data [k].type = -1 ; + + if (psf->strings.data [k].type == 0) + break ; + } ; + + /* Determine flags */ + str_flags = SF_STR_LOCATE_START ; + if (psf->file.mode == SFM_RDWR || psf->have_written) + { if ((psf->strings.flags & SF_STR_ALLOW_END) == 0) + return SFE_STR_NO_ADD_END ; + str_flags = SF_STR_LOCATE_END ; + } ; + + /* More sanity checking. */ + if (k >= SF_MAX_STRINGS) + return SFE_STR_MAX_COUNT ; + + if (k == 0 && psf->strings.storage_used != 0) + { psf_log_printf (psf, "SFE_STR_WEIRD : k == 0 && psf->strings.storage_used != 0\n") ; + return SFE_STR_WEIRD ; + } ; + + if (k != 0 && psf->strings.storage_used == 0) + { psf_log_printf (psf, "SFE_STR_WEIRD : k != 0 && psf->strings.storage_used == 0\n") ; + return SFE_STR_WEIRD ; + } ; + + /* Special case for the first string. */ + if (k == 0) + psf->strings.storage_used = 0 ; + + switch (str_type) + { case SF_STR_SOFTWARE : + /* In write mode, want to append libsndfile-version to string. */ + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if (strstr (str, PACKAGE_NAME) == NULL) + { /* + ** If the supplied string does not already contain a + ** libsndfile-X.Y.Z component, then add it. + */ + if (strlen (str) == 0) + snprintf (new_str, sizeof (new_str), "%s-%s", PACKAGE_NAME, PACKAGE_VERSION) ; + else + snprintf (new_str, sizeof (new_str), "%s (%s-%s)", str, PACKAGE_NAME, PACKAGE_VERSION) ; + } + else + snprintf (new_str, sizeof (new_str), "%s", str) ; + + str = new_str ; + } ; + break ; + + case SF_STR_TITLE : + case SF_STR_COPYRIGHT : + case SF_STR_ARTIST : + case SF_STR_COMMENT : + case SF_STR_DATE : + case SF_STR_ALBUM : + case SF_STR_LICENSE : + case SF_STR_TRACKNUMBER : + case SF_STR_GENRE : + break ; + + default : + psf_log_printf (psf, "%s : SFE_STR_BAD_TYPE\n", __func__) ; + return SFE_STR_BAD_TYPE ; + } ; + + /* Plus one to catch string terminator. */ + str_len = strlen (str) + 1 ; + + if (psf->strings.storage_used + str_len + 1 > psf->strings.storage_len) + { char * temp = psf->strings.storage ; + size_t newlen = 2 * psf->strings.storage_len + str_len + 1 ; + + newlen = newlen < 256 ? 256 : newlen ; + + if ((psf->strings.storage = realloc (temp, newlen)) == NULL) + { psf->strings.storage = temp ; + return SFE_MALLOC_FAILED ; + } ; + + psf->strings.storage_len = newlen ; + } ; + + psf->strings.data [k].type = str_type ; + psf->strings.data [k].offset = psf->strings.storage_used ; + psf->strings.data [k].flags = str_flags ; + + memcpy (psf->strings.storage + psf->strings.storage_used, str, str_len) ; + psf->strings.storage_used += str_len ; + + psf->strings.flags |= str_flags ; + +#if STRINGS_DEBUG + printf ("storage_used : %zd / %zd\n", psf->strings.storage_used, psf->strings.storage_len) ; + psf_hexdump (psf->strings.storage, psf->strings.storage_used) ; +#endif + + return 0 ; +} /* psf_store_string */ + +int +psf_set_string (SF_PRIVATE *psf, int str_type, const char *str) +{ if (psf->file.mode == SFM_READ) + return SFE_STR_NOT_WRITE ; + + return psf_store_string (psf, str_type, str) ; +} /* psf_set_string */ + +const char* +psf_get_string (SF_PRIVATE *psf, int str_type) +{ int k ; + + for (k = 0 ; k < SF_MAX_STRINGS ; k++) + if (str_type == psf->strings.data [k].type) + return psf->strings.storage + psf->strings.data [k].offset ; + + return NULL ; +} /* psf_get_string */ + +int +psf_location_string_count (const SF_PRIVATE * psf, int location) +{ int k, count = 0 ; + + for (k = 0 ; k < SF_MAX_STRINGS ; k++) + if (psf->strings.data [k].type > 0 && psf->strings.data [k].flags & location) + count ++ ; + + return count ; +} /* psf_location_string_count */ diff --git a/libsndfile-1.0.31/src/svx.c b/libsndfile-1.0.31/src/svx.c new file mode 100644 index 0000000..72d803f --- /dev/null +++ b/libsndfile-1.0.31/src/svx.c @@ -0,0 +1,401 @@ +/* +** Copyright (C) 1999-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + + +/*------------------------------------------------------------------------------ + * Macros to handle big/little endian issues. +*/ + +#define FORM_MARKER (MAKE_MARKER ('F', 'O', 'R', 'M')) +#define SVX8_MARKER (MAKE_MARKER ('8', 'S', 'V', 'X')) +#define SV16_MARKER (MAKE_MARKER ('1', '6', 'S', 'V')) +#define VHDR_MARKER (MAKE_MARKER ('V', 'H', 'D', 'R')) +#define BODY_MARKER (MAKE_MARKER ('B', 'O', 'D', 'Y')) + +#define ATAK_MARKER (MAKE_MARKER ('A', 'T', 'A', 'K')) +#define RLSE_MARKER (MAKE_MARKER ('R', 'L', 'S', 'E')) + +#define c_MARKER (MAKE_MARKER ('(', 'c', ')', ' ')) +#define NAME_MARKER (MAKE_MARKER ('N', 'A', 'M', 'E')) +#define AUTH_MARKER (MAKE_MARKER ('A', 'U', 'T', 'H')) +#define ANNO_MARKER (MAKE_MARKER ('A', 'N', 'N', 'O')) +#define CHAN_MARKER (MAKE_MARKER ('C', 'H', 'A', 'N')) + +/*------------------------------------------------------------------------------ + * Typedefs for file chunks. +*/ + +typedef struct +{ unsigned int oneShotHiSamples, repeatHiSamples, samplesPerHiCycle ; + unsigned short samplesPerSec ; + unsigned char octave, compression ; + unsigned int volume ; +} VHDR_CHUNK ; + +enum { + HAVE_FORM = 0x01, + + HAVE_SVX = 0x02, + HAVE_VHDR = 0x04, + HAVE_BODY = 0x08 +} ; + +/*------------------------------------------------------------------------------ + * Private static functions. +*/ + +static int svx_close (SF_PRIVATE *psf) ; +static int svx_write_header (SF_PRIVATE *psf, int calc_length) ; +static int svx_read_header (SF_PRIVATE *psf) ; + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +svx_open (SF_PRIVATE *psf) +{ int error ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = svx_read_header (psf))) + return error ; + + psf->endian = SF_ENDIAN_BIG ; /* All SVX files are big endian. */ + + psf->blockwidth = psf->sf.channels * psf->bytewidth ; + if (psf->blockwidth) + psf->sf.frames = psf->datalength / psf->blockwidth ; + + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + } ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if (psf->is_pipe) + return SFE_NO_PIPE_WRITE ; + + if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_SVX) + return SFE_BAD_OPEN_FORMAT ; + + psf->endian = SF_ENDIAN (psf->sf.format) ; + + if (psf->endian == SF_ENDIAN_LITTLE || (CPU_IS_LITTLE_ENDIAN && psf->endian == SF_ENDIAN_CPU)) + return SFE_BAD_ENDIAN ; + + psf->endian = SF_ENDIAN_BIG ; /* All SVX files are big endian. */ + + error = svx_write_header (psf, SF_FALSE) ; + if (error) + return error ; + + psf->write_header = svx_write_header ; + } ; + + psf->container_close = svx_close ; + + if ((error = pcm_init (psf))) + return error ; + + return 0 ; +} /* svx_open */ + +/*------------------------------------------------------------------------------ +*/ + +static int +svx_read_header (SF_PRIVATE *psf) +{ VHDR_CHUNK vhdr ; + uint32_t chunk_size, marker ; + int filetype = 0, parsestage = 0, done = 0 ; + int bytecount = 0, channels ; + + if (psf->filelength > SF_PLATFORM_S64 (0xffffffff)) + psf_log_printf (psf, "Warning : filelength > 0xffffffff. This is bad!!!!\n") ; + + memset (&vhdr, 0, sizeof (vhdr)) ; + psf_binheader_readf (psf, "p", 0) ; + + /* Set default number of channels. Modify later if necessary */ + psf->sf.channels = 1 ; + + psf->sf.format = SF_FORMAT_SVX ; + + while (! done) + { psf_binheader_readf (psf, "Em4", &marker, &chunk_size) ; + + switch (marker) + { case FORM_MARKER : + if (parsestage) + return SFE_SVX_NO_FORM ; + + if (chunk_size != psf->filelength - 2 * sizeof (chunk_size)) + psf_log_printf (psf, "FORM : %u (should be %u)\n", chunk_size, (uint32_t) psf->filelength - 2 * sizeof (chunk_size)) ; + else + psf_log_printf (psf, "FORM : %u\n", chunk_size) ; + parsestage |= HAVE_FORM ; + + psf_binheader_readf (psf, "m", &marker) ; + + filetype = marker ; + psf_log_printf (psf, " %M\n", marker) ; + parsestage |= HAVE_SVX ; + break ; + + case VHDR_MARKER : + if (! (parsestage & (HAVE_FORM | HAVE_SVX))) + return SFE_SVX_NO_FORM ; + + psf_log_printf (psf, " VHDR : %d\n", chunk_size) ; + + psf_binheader_readf (psf, "E4442114", &(vhdr.oneShotHiSamples), &(vhdr.repeatHiSamples), + &(vhdr.samplesPerHiCycle), &(vhdr.samplesPerSec), &(vhdr.octave), &(vhdr.compression), + &(vhdr.volume)) ; + + psf_log_printf (psf, " OneShotHiSamples : %d\n", vhdr.oneShotHiSamples) ; + psf_log_printf (psf, " RepeatHiSamples : %d\n", vhdr.repeatHiSamples) ; + psf_log_printf (psf, " samplesPerHiCycle : %d\n", vhdr.samplesPerHiCycle) ; + psf_log_printf (psf, " Sample Rate : %d\n", vhdr.samplesPerSec) ; + psf_log_printf (psf, " Octave : %d\n", vhdr.octave) ; + + psf_log_printf (psf, " Compression : %d => ", vhdr.compression) ; + + switch (vhdr.compression) + { case 0 : psf_log_printf (psf, "None.\n") ; + break ; + case 1 : psf_log_printf (psf, "Fibonacci delta\n") ; + break ; + case 2 : psf_log_printf (psf, "Exponential delta\n") ; + break ; + } ; + + psf_log_printf (psf, " Volume : %d\n", vhdr.volume) ; + + psf->sf.samplerate = vhdr.samplesPerSec ; + + if (filetype == SVX8_MARKER) + { psf->sf.format |= SF_FORMAT_PCM_S8 ; + psf->bytewidth = 1 ; + } + else if (filetype == SV16_MARKER) + { psf->sf.format |= SF_FORMAT_PCM_16 ; + psf->bytewidth = 2 ; + } ; + + parsestage |= HAVE_VHDR ; + break ; + + case BODY_MARKER : + if (! (parsestage & HAVE_VHDR)) + return SFE_SVX_NO_BODY ; + + psf->datalength = chunk_size ; + + psf->dataoffset = psf_ftell (psf) ; + if (psf->dataoffset < 0) + return SFE_SVX_NO_BODY ; + + if (psf->datalength > psf->filelength - psf->dataoffset) + { psf_log_printf (psf, " BODY : %D (should be %D)\n", psf->datalength, psf->filelength - psf->dataoffset) ; + psf->datalength = psf->filelength - psf->dataoffset ; + } + else + psf_log_printf (psf, " BODY : %D\n", psf->datalength) ; + + parsestage |= HAVE_BODY ; + + if (! psf->sf.seekable) + break ; + + psf_fseek (psf, psf->datalength, SEEK_CUR) ; + break ; + + case NAME_MARKER : + if (! (parsestage & HAVE_SVX)) + return SFE_SVX_NO_FORM ; + + psf_log_printf (psf, " %M : %u\n", marker, chunk_size) ; + + if (strlen (psf->file.name.c) != chunk_size) + { if (chunk_size > sizeof (psf->file.name.c) - 1) + return SFE_SVX_BAD_NAME_LENGTH ; + + psf_binheader_readf (psf, "b", psf->file.name.c, chunk_size) ; + psf->file.name.c [chunk_size] = 0 ; + } + else + psf_binheader_readf (psf, "j", chunk_size) ; + break ; + + case ANNO_MARKER : + if (! (parsestage & HAVE_SVX)) + return SFE_SVX_NO_FORM ; + + psf_log_printf (psf, " %M : %u\n", marker, chunk_size) ; + + psf_binheader_readf (psf, "j", chunk_size) ; + break ; + + case CHAN_MARKER : + if (! (parsestage & HAVE_SVX)) + return SFE_SVX_NO_FORM ; + + psf_log_printf (psf, " %M : %u\n", marker, chunk_size) ; + + bytecount += psf_binheader_readf (psf, "E4", &channels) ; + + if (channels == 2 || channels == 4) + psf_log_printf (psf, " Channels : %d => mono\n", channels) ; + else if (channels == 6) + { psf->sf.channels = 2 ; + psf_log_printf (psf, " Channels : %d => stereo\n", channels) ; + } + else + psf_log_printf (psf, " Channels : %d *** assuming mono\n", channels) ; + + psf_binheader_readf (psf, "j", chunk_size - bytecount) ; + break ; + + + case AUTH_MARKER : + case c_MARKER : + if (! (parsestage & HAVE_SVX)) + return SFE_SVX_NO_FORM ; + + psf_log_printf (psf, " %M : %u\n", marker, chunk_size) ; + + psf_binheader_readf (psf, "j", chunk_size) ; + break ; + + default : + if (chunk_size >= 0xffff0000) + { done = SF_TRUE ; + psf_log_printf (psf, "*** Unknown chunk marker (%X) at position %D with length %u. Exiting parser.\n", marker, psf_ftell (psf) - 8, chunk_size) ; + break ; + } ; + + if (psf_isprint ((marker >> 24) & 0xFF) && psf_isprint ((marker >> 16) & 0xFF) + && psf_isprint ((marker >> 8) & 0xFF) && psf_isprint (marker & 0xFF)) + { psf_log_printf (psf, "%M : %u (unknown marker)\n", marker, chunk_size) ; + psf_binheader_readf (psf, "j", chunk_size) ; + break ; + } ; + if ((chunk_size = psf_ftell (psf)) & 0x03) + { psf_log_printf (psf, " Unknown chunk marker at position %d. Resynching.\n", chunk_size - 4) ; + + psf_binheader_readf (psf, "j", -3) ; + break ; + } ; + psf_log_printf (psf, "*** Unknown chunk marker (%X) at position %D. Exiting parser.\n", marker, psf_ftell (psf) - 8) ; + done = SF_TRUE ; + } ; /* switch (marker) */ + + if (! psf->sf.seekable && (parsestage & HAVE_BODY)) + break ; + + if (psf_ftell (psf) >= psf->filelength - SIGNED_SIZEOF (chunk_size)) + break ; + } ; /* while (1) */ + + if (vhdr.compression) + return SFE_SVX_BAD_COMP ; + + if (psf->dataoffset <= 0) + return SFE_SVX_NO_DATA ; + + return 0 ; +} /* svx_read_header */ + +static int +svx_close (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + svx_write_header (psf, SF_TRUE) ; + + return 0 ; +} /* svx_close */ + +static int +svx_write_header (SF_PRIVATE *psf, int calc_length) +{ static char annotation [] = "libsndfile by Erik de Castro Lopo\0\0\0" ; + sf_count_t current ; + + current = psf_ftell (psf) ; + + if (calc_length) + { psf->filelength = psf_get_filelen (psf) ; + + psf->datalength = psf->filelength - psf->dataoffset ; + + if (psf->dataend) + psf->datalength -= psf->filelength - psf->dataend ; + + psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; + } ; + + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + psf_fseek (psf, 0, SEEK_SET) ; + + /* FORM marker and FORM size. */ + psf_binheader_writef (psf, "Etm8", BHWm (FORM_MARKER), BHW8 ((psf->filelength < 8) ? + psf->filelength * 0 : psf->filelength - 8)) ; + + psf_binheader_writef (psf, "m", BHWm ((psf->bytewidth == 1) ? SVX8_MARKER : SV16_MARKER)) ; + + /* VHDR chunk. */ + psf_binheader_writef (psf, "Em4", BHWm (VHDR_MARKER), BHW4 (sizeof (VHDR_CHUNK))) ; + /* VHDR : oneShotHiSamples, repeatHiSamples, samplesPerHiCycle */ + psf_binheader_writef (psf, "E444", BHW4 (psf->sf.frames), BHW4 (0), BHW4 (0)) ; + /* VHDR : samplesPerSec, octave, compression */ + psf_binheader_writef (psf, "E211", BHW2 (psf->sf.samplerate), BHW1 (1), BHW1 (0)) ; + /* VHDR : volume */ + psf_binheader_writef (psf, "E4", BHW4 ((psf->bytewidth == 1) ? 0xFF : 0xFFFF)) ; + + if (psf->sf.channels == 2) + psf_binheader_writef (psf, "Em44", BHWm (CHAN_MARKER), BHW4 (4), BHW4 (6)) ; + + /* Filename and annotation strings. */ + psf_binheader_writef (psf, "Emsms", BHWm (NAME_MARKER), BHWs (psf->file.name.c), BHWm (ANNO_MARKER), BHWs (annotation)) ; + + /* BODY marker and size. */ + psf_binheader_writef (psf, "Etm8", BHWm (BODY_MARKER), BHW8 ((psf->datalength < 0) ? + psf->datalength * 0 : psf->datalength)) ; + + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + if (psf->error) + return psf->error ; + + psf->dataoffset = psf->header.indx ; + + if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + + return psf->error ; +} /* svx_write_header */ + diff --git a/libsndfile-1.0.31/src/test_audio_detect.c b/libsndfile-1.0.31/src/test_audio_detect.c new file mode 100644 index 0000000..20926df --- /dev/null +++ b/libsndfile-1.0.31/src/test_audio_detect.c @@ -0,0 +1,113 @@ +/* +** Copyright (C) 2007-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include +#include + +#include "common.h" +#include "sfendian.h" + +#include "test_main.h" + +static unsigned char float_le_mono [] = +{ 0x36, 0x86, 0x21, 0x44, 0xB5, 0xB4, 0x49, 0x44, 0xA2, 0xC0, 0x71, 0x44, 0x7B, 0xD1, 0x8C, 0x44, + 0x54, 0xAA, 0xA0, 0x44, 0x60, 0x67, 0xB4, 0x44, 0x22, 0x05, 0xC8, 0x44, 0x29, 0x80, 0xDB, 0x44, + 0x04, 0xD5, 0xEE, 0x44, 0x27, 0x00, 0x01, 0x45, 0x50, 0x7F, 0x0A, 0x45, 0x53, 0xE6, 0x13, 0x45, + 0x85, 0x33, 0x1D, 0x45, 0x43, 0x65, 0x26, 0x45, 0xEC, 0x79, 0x2F, 0x45, 0xE3, 0x6F, 0x38, 0x45, + 0x98, 0x45, 0x41, 0x45, 0x77, 0xF9, 0x49, 0x45, 0xF6, 0x89, 0x52, 0x45, 0x8F, 0xF5, 0x5A, 0x45, + 0xC9, 0x3A, 0x63, 0x45, 0x28, 0x58, 0x6B, 0x45, 0x3C, 0x4C, 0x73, 0x45, 0x9F, 0x15, 0x7B, 0x45, + 0x75, 0x59, 0x81, 0x45, 0x64, 0x11, 0x85, 0x45, 0xF1, 0xB1, 0x88, 0x45, 0x78, 0x3A, 0x8C, 0x45, + 0x58, 0xAA, 0x8F, 0x45, 0xF2, 0x00, 0x93, 0x45, 0xB2, 0x3D, 0x96, 0x45, 0x01, 0x60, 0x99, 0x45, + 0x50, 0x67, 0x9C, 0x45, 0x15, 0x53, 0x9F, 0x45, 0xCC, 0x22, 0xA2, 0x45, 0xF0, 0xD5, 0xA4, 0x45, + 0x07, 0x6C, 0xA7, 0x45, 0x9C, 0xE4, 0xA9, 0x45, 0x3D, 0x3F, 0xAC, 0x45, 0x7A, 0x7B, 0xAE, 0x45, + 0xF2, 0x98, 0xB0, 0x45, 0x3C, 0x97, 0xB2, 0x45, 0x02, 0x76, 0xB4, 0x45, 0xEC, 0x34, 0xB6, 0x45, + 0xA8, 0xD3, 0xB7, 0x45, 0xEB, 0x51, 0xB9, 0x45, 0x6F, 0xAF, 0xBA, 0x45, 0xF5, 0xEB, 0xBB, 0x45, + 0x41, 0x07, 0xBD, 0x45, 0x21, 0x01, 0xBE, 0x45, 0x64, 0xD9, 0xBE, 0x45, 0xE3, 0x8F, 0xBF, 0x45, + 0x7E, 0x24, 0xC0, 0x45, 0x15, 0x97, 0xC0, 0x45, 0x92, 0xE7, 0xC0, 0x45, 0xE8, 0x15, 0xC1, 0x45, + 0x7E, 0x24, 0xC0, 0x45, 0x15, 0x97, 0xC0, 0x45, 0x92, 0xE7, 0xC0, 0x45, 0xE8, 0x15, 0xC1, 0x45, + 0x7E, 0x24, 0xC0, 0x45, 0x15, 0x97, 0xC0, 0x45, 0x92, 0xE7, 0xC0, 0x45, 0xE8, 0x15, 0xC1, 0x45, +} ; + +static unsigned char int24_32_le_stereo [] = +{ + 0x00, 0xE7, 0xFB, 0xFF, 0x00, 0x7C, 0xFD, 0xFF, 0x00, 0xA2, 0xFC, 0xFF, 0x00, 0x2B, 0xFC, 0xFF, + 0x00, 0xF3, 0xFD, 0xFF, 0x00, 0x19, 0xFB, 0xFF, 0x00, 0xA5, 0xFE, 0xFF, 0x00, 0x8D, 0xFA, 0xFF, + 0x00, 0x91, 0xFF, 0xFF, 0x00, 0xB5, 0xFA, 0xFF, 0x00, 0x91, 0x00, 0x00, 0x00, 0x5E, 0xFB, 0xFF, + 0x00, 0xD9, 0x01, 0x00, 0x00, 0x82, 0xFB, 0xFF, 0x00, 0xDF, 0x03, 0x00, 0x00, 0x44, 0xFC, 0xFF, + 0x00, 0x1C, 0x05, 0x00, 0x00, 0x77, 0xFC, 0xFF, 0x00, 0x8D, 0x06, 0x00, 0x00, 0x4F, 0xFC, 0xFF, + 0x00, 0x84, 0x07, 0x00, 0x00, 0x74, 0xFC, 0xFF, 0x00, 0x98, 0x08, 0x00, 0x00, 0x33, 0xFD, 0xFF, + 0x00, 0xB9, 0x09, 0x00, 0x00, 0x48, 0xFF, 0xFF, 0x00, 0xD1, 0x0A, 0x00, 0x00, 0x10, 0x02, 0x00, + 0x00, 0x28, 0x0C, 0x00, 0x00, 0xA2, 0x05, 0x00, 0x00, 0xA7, 0x0C, 0x00, 0x00, 0x45, 0x08, 0x00, + 0x00, 0x44, 0x0D, 0x00, 0x00, 0x1A, 0x0A, 0x00, 0x00, 0x65, 0x0D, 0x00, 0x00, 0x51, 0x0B, 0x00, + 0x00, 0x8B, 0x0D, 0x00, 0x00, 0x18, 0x0B, 0x00, 0x00, 0x37, 0x0E, 0x00, 0x00, 0x24, 0x0B, 0x00, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0xDD, 0x0A, 0x00, 0x00, 0x83, 0x10, 0x00, 0x00, 0x31, 0x0A, 0x00, + 0x00, 0x07, 0x12, 0x00, 0x00, 0xC0, 0x08, 0x00, 0x00, 0xF7, 0x12, 0x00, 0x00, 0x47, 0x06, 0x00, + 0x00, 0xDD, 0x12, 0x00, 0x00, 0x6A, 0x03, 0x00, 0x00, 0xD5, 0x11, 0x00, 0x00, 0x99, 0x00, 0x00, + 0x00, 0x01, 0x10, 0x00, 0x00, 0xC5, 0xFE, 0xFF, 0x00, 0xF4, 0x0D, 0x00, 0x00, 0x97, 0xFD, 0xFF, + 0x00, 0x62, 0x0B, 0x00, 0x00, 0x75, 0xFC, 0xFF, 0x00, 0xE9, 0x08, 0x00, 0x00, 0xC0, 0xFB, 0xFF, + 0x00, 0x80, 0x06, 0x00, 0x00, 0x3C, 0xFB, 0xFF, 0x00, 0xDA, 0x03, 0x00, 0x00, 0xE4, 0xFA, 0xFF, + 0x00, 0xEB, 0x01, 0x00, 0x00, 0x21, 0xFB, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0xE7, 0xFB, 0xFF, +} ; + + +void +test_audio_detect (void) +{ + SF_PRIVATE psf ; + AUDIO_DETECT ad ; + int errors = 0 ; + + print_test_name ("Testing audio detect") ; + + memset (&psf, 0, sizeof (psf)) ; + + ad.endianness = SF_ENDIAN_LITTLE ; + ad.channels = 1 ; + if (audio_detect (&psf, &ad, float_le_mono, sizeof (float_le_mono)) != SF_FORMAT_FLOAT) + { puts (" float_le_mono") ; + errors ++ ; + } ; + + ad.endianness = SF_ENDIAN_LITTLE ; + ad.channels = 2 ; + if (audio_detect (&psf, &ad, int24_32_le_stereo, sizeof (int24_32_le_stereo)) != SF_FORMAT_PCM_32) + { if (errors == 0) puts ("\nFailed tests :\n") ; + puts (" int24_32_le_stereo") ; + errors ++ ; + } ; + + if (errors != 0) + { printf ("\n Errors : %d\n\n", errors) ; + exit (1) ; + } ; + + puts ("ok") ; + + return ; +} /* test_audio_detect */ diff --git a/libsndfile-1.0.31/src/test_binheader_writef.c b/libsndfile-1.0.31/src/test_binheader_writef.c new file mode 100644 index 0000000..8b1f9c1 --- /dev/null +++ b/libsndfile-1.0.31/src/test_binheader_writef.c @@ -0,0 +1,61 @@ +/* +** Copyright (C) 2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#include "common.h" + +#include "test_main.h" + +void +test_binheader_writef (void) +{ char buffer [18] ; + SF_PRIVATE sf_private, *psf ; + int k, errors = 0 ; + + print_test_name ("Testing binheader_writef") ; + + memset (&sf_private, 0, sizeof (sf_private)) ; + + psf = &sf_private ; + for (k = 0 ; errors == 0 && k < 10 ; k++) + { psf_strlcpy (buffer, sizeof (buffer), "abcdefghijklmnop") ; + buffer [k] = 0 ; + + psf_binheader_writef (psf, "Ep", BHWp (buffer)) ; + + if ((psf->header.indx & 1) != 0) + errors = 1 ; + } ; + + free (psf->header.ptr) ; + + if (errors) + { puts ("\nExiting due to errors.\n") ; + exit (1) ; + } ; + + puts ("ok") ; +} /* test_log_printf */ + diff --git a/libsndfile-1.0.31/src/test_broadcast_var.c b/libsndfile-1.0.31/src/test_broadcast_var.c new file mode 100644 index 0000000..dbea943 --- /dev/null +++ b/libsndfile-1.0.31/src/test_broadcast_var.c @@ -0,0 +1,119 @@ +/* +** Copyright (C) 2010-2012 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#include "common.h" + +#include "test_main.h" + +#define BCAST_MAX 512 + +typedef SF_BROADCAST_INFO_VAR (BCAST_MAX) SF_BROADCAST_INFO_512 ; + +static void +fill_coding_history (SF_BROADCAST_INFO_512 * bi) +{ static const char *lines [] = + { "Lorem ipsum dolor sit amet,\nconsectetur adipiscing elit.", + "Donec dignissim erat\nvehicula libero condimentum\ndictum porta augue faucibus.", + "Maecenas nec turpis\nsit amet quam\nfaucibus adipiscing.", + "Mauris aliquam,\nlectus interdum\ntincidunt luctus.", + "\n\n\n\n\n\n\n\n\n\n\n\n", + "In auctor lorem\nvel est euismod\ncondimentum.", + "\n\n\n\n\n\n\n\n\n\n\n\n", + "Ut vitae magna\nid dui placerat vehicula\nin id lectus.", + "\n\n\n\n\n\n\n\n\n\n\n\n", + "Sed lacus leo,\nmolestie et luctus ac,\ntincidunt sit amet nisi.", + "\n\n\n\n\n\n\n\n\n\n\n\n", + "Sed ligula neque,\ngravida semper vulputate laoreet,\ngravida eu tellus.", + "Donec dolor dolor,\nscelerisque in consequat ornare,\ntempor nec nisl." + } ; + int k ; + + bi->coding_history [0] = 0 ; + + for (k = 0 ; strlen (bi->coding_history) < bi->coding_history_size - 1 ; k ++) + append_snprintf (bi->coding_history, bi->coding_history_size, "%s\n", lines [k % ARRAY_LEN (lines)]) ; + + return ; +} /* fill_coding_listory */ + +static void +test_broadcast_var_set (void) +{ SF_PRIVATE sf_private, *psf ; + int k ; + + psf = &sf_private ; + memset (psf, 0, sizeof (sf_private)) ; + + print_test_name ("Testing broadcast_var_set ") ; + + for (k = 64 ; k < BCAST_MAX ; k++) + { + SF_BROADCAST_INFO_512 bi ; + + memset (&bi, 0, sizeof (bi)) ; + + bi.coding_history_size = k ; + fill_coding_history (&bi) ; + bi.coding_history_size -- ; + + broadcast_var_set (psf, (SF_BROADCAST_INFO*) &bi, sizeof (bi)) ; + } ; + + if (psf->broadcast_16k != NULL) + free (psf->broadcast_16k) ; + + puts ("ok") ; +} /* test_broadcast_var_set */ + +static void +test_broadcast_var_zero (void) +{ SF_PRIVATE sf_private, *psf ; + SF_BROADCAST_INFO_VAR (0) bi ; + + psf = &sf_private ; + memset (psf, 0, sizeof (sf_private)) ; + psf->file.mode = SFM_RDWR ; + + print_test_name ("Testing broadcast_var_zero ") ; + + memset (&bi, 0, sizeof (bi)) ; + + broadcast_var_set (psf, (SF_BROADCAST_INFO*) &bi, sizeof (bi)) ; + + if (psf->broadcast_16k->coding_history_size != 0) + { printf ("\n\nLine %d: coding_history_size %d should be zero.\n\n", __LINE__, psf->broadcast_16k->coding_history_size) ; + exit (1) ; + } ; + + if (psf->broadcast_16k != NULL) + free (psf->broadcast_16k) ; + + puts ("ok") ; +} /* test_broadcast_var_zero */ + +void +test_broadcast_var (void) +{ test_broadcast_var_set () ; + test_broadcast_var_zero () ; +} /* test_broadcast_var */ diff --git a/libsndfile-1.0.31/src/test_cart_var.c b/libsndfile-1.0.31/src/test_cart_var.c new file mode 100644 index 0000000..532a755 --- /dev/null +++ b/libsndfile-1.0.31/src/test_cart_var.c @@ -0,0 +1,91 @@ +/* +** Copyright (C) 2010-2013 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#include "common.h" + +#include "test_main.h" + +#define CART_MAX 512 + +typedef SF_CART_INFO_VAR (CART_MAX) SF_CART_INFO_512 ; + +static void +fill_tag_text (SF_CART_INFO_512 * ci) +{ static const char *lines [] = + { "Lorem ipsum dolor sit amet,\nconsectetur adipiscing elit.", + "Donec dignissim erat\nvehicula libero condimentum\ndictum porta augue faucibus.", + "Maecenas nec turpis\nsit amet quam\nfaucibus adipiscing.", + "Mauris aliquam,\nlectus interdum\ntincidunt luctus.", + "\n\n\n\n\n\n\n\n\n\n\n\n", + "In auctor lorem\nvel est euismod\ncondimentum.", + "\n\n\n\n\n\n\n\n\n\n\n\n", + "Ut vitae magna\nid dui placerat vehicula\nin id lectus.", + "\n\n\n\n\n\n\n\n\n\n\n\n", + "Sed lacus leo,\nmolestie et luctus ac,\ntincidunt sit amet nisi.", + "\n\n\n\n\n\n\n\n\n\n\n\n", + "Sed ligula neque,\ngravida semper vulputate laoreet,\ngravida eu tellus.", + "Donec dolor dolor,\nscelerisque in consequat ornare,\ntempor nec nisl." + } ; + int k ; + + ci->tag_text [0] = 0 ; + + for (k = 0 ; strlen (ci->tag_text) < ci->tag_text_size - 1 ; k ++) + append_snprintf (ci->tag_text, ci->tag_text_size, "%s\n", lines [k % ARRAY_LEN (lines)]) ; + + return ; +} /* fill_tag_text */ + +void +test_cart_var (void) +{ SF_PRIVATE sf_private, *psf ; + SF_CART_TIMER timer ; + int k ; + + psf = &sf_private ; + memset (psf, 0, sizeof (sf_private)) ; + + print_test_name ("Testing cart_var_set ") ; + + for (k = 64 ; k < CART_MAX ; k++) + { + SF_CART_INFO_512 ci ; + + memset (&ci, 0, sizeof (ci)) ; + + memset (&timer, 0, sizeof (timer)) ; + memcpy (ci.post_timers, &timer, sizeof (timer)) ; + + ci.tag_text_size = k ; + fill_tag_text (&ci) ; + ci.tag_text_size -- ; + + cart_var_set (psf, (SF_CART_INFO*) &ci, sizeof (ci)) ; + } ; + + if (psf->cart_16k != NULL) + free (psf->cart_16k) ; + + puts ("ok") ; +} /* test_cart_var */ diff --git a/libsndfile-1.0.31/src/test_conversions.c b/libsndfile-1.0.31/src/test_conversions.c new file mode 100644 index 0000000..329e226 --- /dev/null +++ b/libsndfile-1.0.31/src/test_conversions.c @@ -0,0 +1,112 @@ +/* +** Copyright (C) 2006-2016 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "test_main.h" + + +/* +** This is a bit rough, but it is the nicest way to do it. +*/ + +#define cmp_test(line, ival, tval, str) \ + if (ival != tval) \ + { printf (str, line, ival, tval) ; \ + exit (1) ; \ + } ; + +static void +conversion_test (char endian) +{ + SF_PRIVATE sf_private, *psf ; + const char * filename = "conversion.bin" ; + int64_t i64 = SF_PLATFORM_S64 (0x0123456789abcdef), t64 = 0 ; + char format_str [16] ; + char test_name [64] ; + char i8 = 12, t8 = 0 ; + short i16 = 0x123, t16 = 0 ; + int i24 = 0x23456, t24 = 0 ; + int i32 = 0x0a0b0c0d, t32 = 0 ; + int bytes ; + + snprintf (format_str, sizeof (format_str), "%c12348", endian) ; + + snprintf (test_name, sizeof (test_name), "Testing %s conversions", endian == 'e' ? "little endian" : "big endian") ; + print_test_name (test_name) ; + + psf = &sf_private ; + memset (psf, 0, sizeof (sf_private)) ; + + psf->file.mode = SFM_WRITE ; + snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", filename) ; + + if (psf_fopen (psf) != 0) + { printf ("\n\nError : failed to open file '%s' for write.\n\n", filename) ; + exit (1) ; + } ; + + psf_binheader_writef (psf, format_str, i8, i16, i24, i32, i64) ; + psf_fwrite (psf->header.ptr, 1, psf->header.indx, psf) ; + free (psf->header.ptr) ; + psf_fclose (psf) ; + + memset (psf, 0, sizeof (sf_private)) ; + + psf->file.mode = SFM_READ ; + snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", filename) ; + + if (psf_fopen (psf) != 0) + { printf ("\n\nError : failed to open file '%s' for read.\n\n", filename) ; + exit (1) ; + } ; + + bytes = psf_binheader_readf (psf, format_str, &t8, &t16, &t24, &t32, &t64) ; + free (psf->header.ptr) ; + psf_fclose (psf) ; + + if (bytes != 18) + { printf ("\n\nLine %d : read %d bytes.\n\n", __LINE__, bytes) ; + exit (1) ; + } ; + + cmp_test (__LINE__, i8, t8, "\n\nLine %d : 8 bit int failed %d -> %d.\n\n") ; + cmp_test (__LINE__, i16, t16, "\n\nLine %d : 16 bit int failed 0x%x -> 0x%x.\n\n") ; + cmp_test (__LINE__, i24, t24, "\n\nLine %d : 24 bit int failed 0x%x -> 0x%x.\n\n") ; + cmp_test (__LINE__, i32, t32, "\n\nLine %d : 32 bit int failed 0x%x -> 0x%x.\n\n") ; + cmp_test (__LINE__, i64, t64, "\n\nLine %d : 64 bit int failed 0x%" PRIx64 "x -> 0x%" PRIx64 "x.\n\n") ; + + remove (filename) ; + puts ("ok") ; +} /* conversion_test */ + +void +test_conversions (void) +{ + conversion_test ('E') ; + conversion_test ('e') ; +} /* test_conversion */ + diff --git a/libsndfile-1.0.31/src/test_endswap.c b/libsndfile-1.0.31/src/test_endswap.c new file mode 100644 index 0000000..13655e6 --- /dev/null +++ b/libsndfile-1.0.31/src/test_endswap.c @@ -0,0 +1,322 @@ +/* +** Copyright (C) 2002-2016 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include "common.h" +#include "sfendian.h" + +#include "test_main.h" + +#define FMT_SHORT "0x%04x\n" +#define FMT_INT "0x%08x\n" +#define FMT_INT64 "0x%016" PRIx64 "\n" + +/*============================================================================== +** Test functions. +*/ + + +static void +dump_short_array (const char * name, short * data, int datalen) +{ int k ; + + printf ("%-6s : ", name) ; + for (k = 0 ; k < datalen ; k++) + printf (FMT_SHORT, data [k]) ; + putchar ('\n') ; +} /* dump_short_array */ + +static void +test_endswap_short (void) +{ short orig [4], first [4], second [4] ; + int64_t k ; + + printf (" %-40s : ", "test_endswap_short") ; + fflush (stdout) ; + + for (k = 0 ; k < ARRAY_LEN (orig) ; k++) + orig [k] = 0x3210 + k ; + + endswap_short_copy (first, orig, ARRAY_LEN (first)) ; + endswap_short_copy (second, first, ARRAY_LEN (second)) ; + + if (memcmp (orig, first, sizeof (orig)) == 0) + { printf ("\n\nLine %d : test 1 : these two array should not be the same:\n\n", __LINE__) ; + dump_short_array ("orig", orig, ARRAY_LEN (orig)) ; + dump_short_array ("first", first, ARRAY_LEN (first)) ; + exit (1) ; + } ; + + if (memcmp (orig, second, sizeof (orig)) != 0) + { printf ("\n\nLine %d : test 2 : these two array should be the same:\n\n", __LINE__) ; + dump_short_array ("orig", orig, ARRAY_LEN (orig)) ; + dump_short_array ("second", second, ARRAY_LEN (second)) ; + exit (1) ; + } ; + + endswap_short_array (first, ARRAY_LEN (first)) ; + + if (memcmp (orig, first, sizeof (orig)) != 0) + { printf ("\n\nLine %d : test 3 : these two array should be the same:\n\n", __LINE__) ; + dump_short_array ("orig", orig, ARRAY_LEN (orig)) ; + dump_short_array ("first", first, ARRAY_LEN (first)) ; + exit (1) ; + } ; + + endswap_short_copy (first, orig, ARRAY_LEN (first)) ; + endswap_short_copy (first, first, ARRAY_LEN (first)) ; + + if (memcmp (orig, first, sizeof (orig)) != 0) + { printf ("\n\nLine %d : test 4 : these two array should be the same:\n\n", __LINE__) ; + dump_short_array ("orig", orig, ARRAY_LEN (orig)) ; + dump_short_array ("first", first, ARRAY_LEN (first)) ; + exit (1) ; + } ; + + puts ("ok") ; +} /* test_endswap_short */ + +static void +dump_int_array (const char * name, int * data, int datalen) +{ int k ; + + printf ("%-6s : ", name) ; + for (k = 0 ; k < datalen ; k++) + printf (FMT_INT, data [k]) ; + putchar ('\n') ; +} /* dump_int_array */ + +static void +test_endswap_int (void) +{ int orig [4], first [4], second [4] ; + int64_t k ; + + printf (" %-40s : ", "test_endswap_int") ; + fflush (stdout) ; + + for (k = 0 ; k < ARRAY_LEN (orig) ; k++) + orig [k] = 0x76543210 + k ; + + endswap_int_copy (first, orig, ARRAY_LEN (first)) ; + endswap_int_copy (second, first, ARRAY_LEN (second)) ; + + if (memcmp (orig, first, sizeof (orig)) == 0) + { printf ("\n\nLine %d : test 1 : these two array should not be the same:\n\n", __LINE__) ; + dump_int_array ("orig", orig, ARRAY_LEN (orig)) ; + dump_int_array ("first", first, ARRAY_LEN (first)) ; + exit (1) ; + } ; + + if (memcmp (orig, second, sizeof (orig)) != 0) + { printf ("\n\nLine %d : test 2 : these two array should be the same:\n\n", __LINE__) ; + dump_int_array ("orig", orig, ARRAY_LEN (orig)) ; + dump_int_array ("second", second, ARRAY_LEN (second)) ; + exit (1) ; + } ; + + endswap_int_array (first, ARRAY_LEN (first)) ; + + if (memcmp (orig, first, sizeof (orig)) != 0) + { printf ("\n\nLine %d : test 3 : these two array should be the same:\n\n", __LINE__) ; + dump_int_array ("orig", orig, ARRAY_LEN (orig)) ; + dump_int_array ("first", first, ARRAY_LEN (first)) ; + exit (1) ; + } ; + + endswap_int_copy (first, orig, ARRAY_LEN (first)) ; + endswap_int_copy (first, first, ARRAY_LEN (first)) ; + + if (memcmp (orig, first, sizeof (orig)) != 0) + { printf ("\n\nLine %d : test 4 : these two array should be the same:\n\n", __LINE__) ; + dump_int_array ("orig", orig, ARRAY_LEN (orig)) ; + dump_int_array ("first", first, ARRAY_LEN (first)) ; + exit (1) ; + } ; + + puts ("ok") ; +} /* test_endswap_int */ + +static void +dump_int64_t_array (const char * name, int64_t * data, int datalen) +{ int k ; + + printf ("%-6s : ", name) ; + for (k = 0 ; k < datalen ; k++) + printf (FMT_INT64, data [k]) ; + putchar ('\n') ; +} /* dump_int64_t_array */ + +static void +test_endswap_int64_t (void) +{ int64_t orig [4], first [4], second [4] ; + int64_t k ; + + printf (" %-40s : ", "test_endswap_int64_t") ; + fflush (stdout) ; + + for (k = 0 ; k < ARRAY_LEN (orig) ; k++) + orig [k] = 0x0807050540302010LL + k ; + + endswap_int64_t_copy (first, orig, ARRAY_LEN (first)) ; + endswap_int64_t_copy (second, first, ARRAY_LEN (second)) ; + + if (memcmp (orig, first, sizeof (orig)) == 0) + { printf ("\n\nLine %d : test 1 : these two array should not be the same:\n\n", __LINE__) ; + dump_int64_t_array ("orig", orig, ARRAY_LEN (orig)) ; + dump_int64_t_array ("first", first, ARRAY_LEN (first)) ; + exit (1) ; + } ; + + if (memcmp (orig, second, sizeof (orig)) != 0) + { printf ("\n\nLine %d : test 2 : these two array should be the same:\n\n", __LINE__) ; + dump_int64_t_array ("orig", orig, ARRAY_LEN (orig)) ; + dump_int64_t_array ("second", second, ARRAY_LEN (second)) ; + exit (1) ; + } ; + + endswap_int64_t_array (first, ARRAY_LEN (first)) ; + + if (memcmp (orig, first, sizeof (orig)) != 0) + { printf ("\n\nLine %d : test 3 : these two array should be the same:\n\n", __LINE__) ; + dump_int64_t_array ("orig", orig, ARRAY_LEN (orig)) ; + dump_int64_t_array ("first", first, ARRAY_LEN (first)) ; + exit (1) ; + } ; + + endswap_int64_t_copy (first, orig, ARRAY_LEN (first)) ; + endswap_int64_t_copy (first, first, ARRAY_LEN (first)) ; + + if (memcmp (orig, first, sizeof (orig)) != 0) + { printf ("\n\nLine %d : test 4 : these two array should be the same:\n\n", __LINE__) ; + dump_int64_t_array ("orig", orig, ARRAY_LEN (orig)) ; + dump_int64_t_array ("first", first, ARRAY_LEN (first)) ; + exit (1) ; + } ; + + puts ("ok") ; +} /* test_endswap_int64_t */ + + + +static void +test_psf_put_be16 (void) +{ const char *test = "AB" ; + uint8_t array [32] ; + int k ; + + printf (" %-40s : ", __func__) ; + fflush (stdout) ; + + for (k = 0 ; k < 10 ; k++) + { memset (array, 0, sizeof (array)) ; + + psf_put_be16 (array, k, 0x4142) ; + if (memcmp (array + k, test, sizeof (int16_t)) != 0) + { printf ("\n\nLine %d : Put failed at index %d.\n", __LINE__, k) ; + exit (1) ; + } ; + if (psf_get_be16 (array, k) != 0x4142) + { printf ("\n\nLine %d : Get failed at index %d.\n", __LINE__, k) ; + exit (1) ; + } ; + } ; + + puts ("ok") ; +} /* test_psf_put_be16 */ + +static void +test_psf_put_be32 (void) +{ const char *test = "0123" ; + uint8_t array [32] ; + int k ; + + printf (" %-40s : ", __func__) ; + fflush (stdout) ; + + for (k = 0 ; k < 10 ; k++) + { memset (array, 0, sizeof (array)) ; + + psf_put_be32 (array, k, 0x30313233) ; + if (memcmp (array + k, test, sizeof (int32_t)) != 0) + { printf ("\n\nLine %d : Put failed at index %d.\n", __LINE__, k) ; + exit (1) ; + } ; + if (psf_get_be32 (array, k) != 0x30313233) + { printf ("\n\nLine %d : Get failed at index %d.\n", __LINE__, k) ; + exit (1) ; + } ; + } ; + + puts ("ok") ; +} /* test_psf_put_be32 */ + +static void +test_psf_put_be64 (void) +{ const char *test = "01234567" ; + uint8_t array [32] ; + int k ; + + printf (" %-40s : ", __func__) ; + fflush (stdout) ; + + for (k = 0 ; k < 10 ; k++) + { memset (array, 0, sizeof (array)) ; + + psf_put_be64 (array, k, 0x3031323334353637) ; + if (memcmp (array + k, test, sizeof (int64_t)) != 0) + { printf ("\n\nLine %d : Put failed at index %d.\n", __LINE__, k) ; + exit (1) ; + } ; + if (psf_get_be64 (array, k) != 0x3031323334353637) + { printf ("\n\nLine %d : Get failed at index %d.\n", __LINE__, k) ; + exit (1) ; + } ; + } ; + + puts ("ok") ; +} /* test_psf_put_be64 */ + + +void +test_endswap (void) +{ + test_endswap_short () ; + test_endswap_int () ; + test_endswap_int64_t () ; + + + test_psf_put_be16 () ; + test_psf_put_be32 () ; + test_psf_put_be64 () ; + + +} /* test_endswap */ + diff --git a/libsndfile-1.0.31/src/test_endswap.def b/libsndfile-1.0.31/src/test_endswap.def new file mode 100644 index 0000000..1d6ab1f --- /dev/null +++ b/libsndfile-1.0.31/src/test_endswap.def @@ -0,0 +1,40 @@ +autogen definitions test_endswap.tpl; + +int_type = { + name = short ; + value = '0x3210' ; + format = FMT_SHORT ; + } ; + +int_type = { + name = int ; + value = '0x76543210' ; + format = FMT_INT ; + } ; + +int_type = { + name = int64_t ; + value = '0x0807050540302010LL' ; + format = FMT_INT64 ; + } ; + +int_size = { + name = 16 ; + typename = int16_t ; + value = '0x4142' ; + strval = "AB" ; + } ; + +int_size = { + name = 32 ; + typename = int32_t ; + value = '0x30313233' ; + strval = "0123" ; + } ; + +int_size = { + name = 64 ; + typename = int64_t ; + value = '0x3031323334353637' ; + strval = "01234567" ; + } ; diff --git a/libsndfile-1.0.31/src/test_endswap.tpl b/libsndfile-1.0.31/src/test_endswap.tpl new file mode 100644 index 0000000..348a6be --- /dev/null +++ b/libsndfile-1.0.31/src/test_endswap.tpl @@ -0,0 +1,153 @@ +[+ AutoGen5 template c +] +/* +** Copyright (C) 2002-2016 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include "common.h" +#include "sfendian.h" + +#include "test_main.h" + +#define FMT_SHORT "0x%04x\n" +#define FMT_INT "0x%08x\n" +#define FMT_INT64 "0x%016" PRIx64 "\n" + +/*============================================================================== +** Test functions. +*/ + +[+ FOR int_type +] +static void +dump_[+ (get "name") +]_array (const char * name, [+ (get "name") +] * data, int datalen) +{ int k ; + + printf ("%-6s : ", name) ; + for (k = 0 ; k < datalen ; k++) + printf ([+ (get "format") +], data [k]) ; + putchar ('\n') ; +} /* dump_[+ (get "name") +]_array */ + +static void +test_endswap_[+ (get "name") +] (void) +{ [+ (get "name") +] orig [4], first [4], second [4] ; + int64_t k ; + + printf (" %-40s : ", "test_endswap_[+ (get "name") +]") ; + fflush (stdout) ; + + for (k = 0 ; k < ARRAY_LEN (orig) ; k++) + orig [k] = [+ (get "value") +] + k ; + + endswap_[+ (get "name") +]_copy (first, orig, ARRAY_LEN (first)) ; + endswap_[+ (get "name") +]_copy (second, first, ARRAY_LEN (second)) ; + + if (memcmp (orig, first, sizeof (orig)) == 0) + { printf ("\n\nLine %d : test 1 : these two array should not be the same:\n\n", __LINE__) ; + dump_[+ (get "name") +]_array ("orig", orig, ARRAY_LEN (orig)) ; + dump_[+ (get "name") +]_array ("first", first, ARRAY_LEN (first)) ; + exit (1) ; + } ; + + if (memcmp (orig, second, sizeof (orig)) != 0) + { printf ("\n\nLine %d : test 2 : these two array should be the same:\n\n", __LINE__) ; + dump_[+ (get "name") +]_array ("orig", orig, ARRAY_LEN (orig)) ; + dump_[+ (get "name") +]_array ("second", second, ARRAY_LEN (second)) ; + exit (1) ; + } ; + + endswap_[+ (get "name") +]_array (first, ARRAY_LEN (first)) ; + + if (memcmp (orig, first, sizeof (orig)) != 0) + { printf ("\n\nLine %d : test 3 : these two array should be the same:\n\n", __LINE__) ; + dump_[+ (get "name") +]_array ("orig", orig, ARRAY_LEN (orig)) ; + dump_[+ (get "name") +]_array ("first", first, ARRAY_LEN (first)) ; + exit (1) ; + } ; + + endswap_[+ (get "name") +]_copy (first, orig, ARRAY_LEN (first)) ; + endswap_[+ (get "name") +]_copy (first, first, ARRAY_LEN (first)) ; + + if (memcmp (orig, first, sizeof (orig)) != 0) + { printf ("\n\nLine %d : test 4 : these two array should be the same:\n\n", __LINE__) ; + dump_[+ (get "name") +]_array ("orig", orig, ARRAY_LEN (orig)) ; + dump_[+ (get "name") +]_array ("first", first, ARRAY_LEN (first)) ; + exit (1) ; + } ; + + puts ("ok") ; +} /* test_endswap_[+ (get "name") +] */ +[+ ENDFOR int_type ++] + +[+ FOR int_size +] +static void +test_psf_put_be[+ (get "name") +] (void) +{ const char *test = "[+ (get "strval") +]" ; + uint8_t array [32] ; + int k ; + + printf (" %-40s : ", __func__) ; + fflush (stdout) ; + + for (k = 0 ; k < 10 ; k++) + { memset (array, 0, sizeof (array)) ; + + psf_put_be[+ (get "name") +] (array, k, [+ (get "value") +]) ; + if (memcmp (array + k, test, sizeof ([+ (get "typename") +])) != 0) + { printf ("\n\nLine %d : Put failed at index %d.\n", __LINE__, k) ; + exit (1) ; + } ; + if (psf_get_be[+ (get "name") +] (array, k) != [+ (get "value") +]) + { printf ("\n\nLine %d : Get failed at index %d.\n", __LINE__, k) ; + exit (1) ; + } ; + } ; + + puts ("ok") ; +} /* test_psf_put_be[+ (get "name") +] */ +[+ ENDFOR int_size ++] + +void +test_endswap (void) +{ +[+ FOR int_type ++] test_endswap_[+ (get "name") +] () ; +[+ ENDFOR int_type ++] + +[+ FOR int_size ++] test_psf_put_be[+ (get "name") +] () ; +[+ ENDFOR int_size ++] + +} /* test_endswap */ + diff --git a/libsndfile-1.0.31/src/test_file_io.c b/libsndfile-1.0.31/src/test_file_io.c new file mode 100644 index 0000000..36a85b0 --- /dev/null +++ b/libsndfile-1.0.31/src/test_file_io.c @@ -0,0 +1,492 @@ +/* +** Copyright (C) 2002-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include +#include +#include + +#include "common.h" + +#include "test_main.h" + +static void make_data (int *data, int len, int seed) ; + +static void file_open_test (const char *filename) ; +static void file_read_write_test (const char *filename) ; +static void file_truncate_test (const char *filename) ; + +static void test_open_or_die (SF_PRIVATE *psf, int linenum) ; +static void test_close_or_die (SF_PRIVATE *psf, int linenum) ; + +static void test_write_or_die (SF_PRIVATE *psf, void *data, sf_count_t bytes, sf_count_t items, sf_count_t new_position, int linenum) ; +static void test_read_or_die (SF_PRIVATE *psf, void *data, sf_count_t bytes, sf_count_t items, sf_count_t new_position, int linenum) ; +static void test_equal_or_die (int *array1, int *array2, int len, int linenum) ; +static void test_seek_or_die (SF_PRIVATE *psf, sf_count_t offset, int whence, sf_count_t new_position, int linenum) ; +static void test_tell_or_die (SF_PRIVATE *psf, sf_count_t expected_position, int linenum) ; + + + +/*============================================================================== +** Actual test functions. +*/ + +static void +file_open_test (const char *filename) +{ SF_PRIVATE sf_data, *psf ; + int error ; + + print_test_name ("Testing file open") ; + + memset (&sf_data, 0, sizeof (sf_data)) ; + psf = &sf_data ; + + /* Ensure that the file doesn't already exist. */ + if (unlink (filename) != 0 && errno != ENOENT) + { printf ("\n\nLine %d: unlink failed (%d) : %s\n\n", __LINE__, errno, strerror (errno)) ; + exit (1) ; + } ; + + psf->file.mode = SFM_READ ; + snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", filename) ; + + /* Test that open for read fails if the file doesn't exist. */ + error = psf_fopen (psf) ; + if (error == 0) + { printf ("\n\nLine %d: psf_fopen() should have failed.\n\n", __LINE__) ; + exit (1) ; + } ; + + /* Reset error to zero. */ + psf->error = SFE_NO_ERROR ; + + /* Test file open in write mode. */ + psf->file.mode = SFM_WRITE ; + test_open_or_die (psf, __LINE__) ; + + test_close_or_die (psf, __LINE__) ; + + unlink (psf->file.path.c) ; + + /* Test file open in read/write mode for a non-existant file. */ + psf->file.mode = SFM_RDWR ; + test_open_or_die (psf, __LINE__) ; + + test_close_or_die (psf, __LINE__) ; + + /* Test file open in read/write mode for an existing file. */ + psf->file.mode = SFM_RDWR ; + test_open_or_die (psf, __LINE__) ; + + test_close_or_die (psf, __LINE__) ; + + unlink (psf->file.path.c) ; + puts ("ok") ; +} /* file_open_test */ + +static void +file_read_write_test (const char *filename) +{ static int data_out [512] ; + static int data_in [512] ; + + SF_PRIVATE sf_data, *psf ; + sf_count_t retval ; + + /* + ** Open a new file and write two blocks of data to the file. After each + ** write, test that psf_get_filelen() returns the new length. + */ + + print_test_name ("Testing file write") ; + + memset (&sf_data, 0, sizeof (sf_data)) ; + psf = &sf_data ; + snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", filename) ; + + /* Test file open in write mode. */ + psf->file.mode = SFM_WRITE ; + test_open_or_die (psf, __LINE__) ; + + make_data (data_out, ARRAY_LEN (data_out), 1) ; + test_write_or_die (psf, data_out, sizeof (data_out [0]), ARRAY_LEN (data_out), sizeof (data_out), __LINE__) ; + + if ((retval = psf_get_filelen (psf)) != sizeof (data_out)) + { printf ("\n\nLine %d: file length after write is not correct (%" PRId64 " should be %zd).\n\n", __LINE__, retval, sizeof (data_out)) ; + if (retval == 0) + printf ("An fsync() may be necessary before fstat() in psf_get_filelen().\n\n") ; + exit (1) ; + } ; + + make_data (data_out, ARRAY_LEN (data_out), 2) ; + test_write_or_die (psf, data_out, ARRAY_LEN (data_out), sizeof (data_out [0]), 2 * sizeof (data_out), __LINE__) ; + + if ((retval = psf_get_filelen (psf)) != 2 * sizeof (data_out)) + { printf ("\n\nLine %d: file length after write is not correct. (%" PRId64 " should be %zd)\n\n", __LINE__, retval, 2 * sizeof (data_out)) ; + exit (1) ; + } ; + + test_close_or_die (psf, __LINE__) ; + puts ("ok") ; + + /* + ** Now open the file in read mode, check the file length and check + ** that the data is correct. + */ + + print_test_name ("Testing file read") ; + + /* Test file open in write mode. */ + psf->file.mode = SFM_READ ; + test_open_or_die (psf, __LINE__) ; + + make_data (data_out, ARRAY_LEN (data_out), 1) ; + test_read_or_die (psf, data_in, 1, sizeof (data_in), sizeof (data_in), __LINE__) ; + test_equal_or_die (data_out, data_in, ARRAY_LEN (data_out), __LINE__) ; + + make_data (data_out, ARRAY_LEN (data_out), 2) ; + test_read_or_die (psf, data_in, sizeof (data_in [0]), ARRAY_LEN (data_in), 2 * sizeof (data_in), __LINE__) ; + test_equal_or_die (data_out, data_in, ARRAY_LEN (data_out), __LINE__) ; + + test_close_or_die (psf, __LINE__) ; + + puts ("ok") ; + + /* + ** Open the file in read/write mode, seek around a bit and then seek to + ** the end of the file and write another block of data (3rd block). Then + ** go back and check that all three blocks are correct. + */ + + print_test_name ("Testing file seek") ; + + /* Test file open in read/write mode. */ + psf->file.mode = SFM_RDWR ; + test_open_or_die (psf, __LINE__) ; + + test_seek_or_die (psf, 0, SEEK_SET, 0, __LINE__) ; + test_seek_or_die (psf, 0, SEEK_END, 2 * SIGNED_SIZEOF (data_out), __LINE__) ; + test_seek_or_die (psf, -1 * SIGNED_SIZEOF (data_out), SEEK_CUR, (sf_count_t) sizeof (data_out), __LINE__) ; + + test_seek_or_die (psf, SIGNED_SIZEOF (data_out), SEEK_CUR, 2 * SIGNED_SIZEOF (data_out), __LINE__) ; + make_data (data_out, ARRAY_LEN (data_out), 3) ; + test_write_or_die (psf, data_out, sizeof (data_out [0]), ARRAY_LEN (data_out), 3 * sizeof (data_out), __LINE__) ; + + test_seek_or_die (psf, 0, SEEK_SET, 0, __LINE__) ; + make_data (data_out, ARRAY_LEN (data_out), 1) ; + test_read_or_die (psf, data_in, 1, sizeof (data_in), sizeof (data_in), __LINE__) ; + test_equal_or_die (data_out, data_in, ARRAY_LEN (data_out), __LINE__) ; + + test_seek_or_die (psf, 2 * SIGNED_SIZEOF (data_out), SEEK_SET, 2 * SIGNED_SIZEOF (data_out), __LINE__) ; + make_data (data_out, ARRAY_LEN (data_out), 3) ; + test_read_or_die (psf, data_in, 1, sizeof (data_in), 3 * sizeof (data_in), __LINE__) ; + test_equal_or_die (data_out, data_in, ARRAY_LEN (data_out), __LINE__) ; + + test_seek_or_die (psf, SIGNED_SIZEOF (data_out), SEEK_SET, SIGNED_SIZEOF (data_out), __LINE__) ; + make_data (data_out, ARRAY_LEN (data_out), 2) ; + test_read_or_die (psf, data_in, 1, sizeof (data_in), 2 * sizeof (data_in), __LINE__) ; + test_equal_or_die (data_out, data_in, ARRAY_LEN (data_out), __LINE__) ; + + test_close_or_die (psf, __LINE__) ; + puts ("ok") ; + + /* + ** Now test operations with a non-zero psf->fileoffset field. This field + ** sets an artificial file start positions so that a seek to the start of + ** the file will actually be a seek to the value given by psf->fileoffset. + */ + + print_test_name ("Testing file offset") ; + + /* Test file open in read/write mode. */ + psf->file.mode = SFM_RDWR ; + psf->fileoffset = sizeof (data_out [0]) * ARRAY_LEN (data_out) ; + test_open_or_die (psf, __LINE__) ; + + if ((retval = psf_get_filelen (psf)) != 3 * sizeof (data_out)) + { printf ("\n\nLine %d: file length after write is not correct. (%" PRId64 " should be %zd)\n\n", __LINE__, retval, 3 * sizeof (data_out)) ; + exit (1) ; + } ; + + test_seek_or_die (psf, SIGNED_SIZEOF (data_out), SEEK_SET, SIGNED_SIZEOF (data_out), __LINE__) ; + make_data (data_out, ARRAY_LEN (data_out), 5) ; + test_write_or_die (psf, data_out, sizeof (data_out [0]), ARRAY_LEN (data_out), 2 * sizeof (data_out), __LINE__) ; + test_close_or_die (psf, __LINE__) ; + + /* final test with psf->fileoffset == 0. */ + + psf->file.mode = SFM_RDWR ; + psf->fileoffset = 0 ; + test_open_or_die (psf, __LINE__) ; + + if ((retval = psf_get_filelen (psf)) != 3 * sizeof (data_out)) + { printf ("\n\nLine %d: file length after write is not correct. (%" PRId64 " should be %zd)\n\n", __LINE__, retval, 3 * sizeof (data_out)) ; + exit (1) ; + } ; + + make_data (data_out, ARRAY_LEN (data_out), 1) ; + test_read_or_die (psf, data_in, 1, sizeof (data_in), sizeof (data_in), __LINE__) ; + test_equal_or_die (data_out, data_in, ARRAY_LEN (data_out), __LINE__) ; + + make_data (data_out, ARRAY_LEN (data_out), 2) ; + test_read_or_die (psf, data_in, 1, sizeof (data_in), 2 * sizeof (data_in), __LINE__) ; + test_equal_or_die (data_out, data_in, ARRAY_LEN (data_out), __LINE__) ; + + make_data (data_out, ARRAY_LEN (data_out), 5) ; + test_read_or_die (psf, data_in, 1, sizeof (data_in), 3 * sizeof (data_in), __LINE__) ; + test_equal_or_die (data_out, data_in, ARRAY_LEN (data_out), __LINE__) ; + + test_close_or_die (psf, __LINE__) ; + + puts ("ok") ; +} /* file_read_write_test */ + +static void +file_truncate_test (const char *filename) +{ SF_PRIVATE sf_data, *psf ; + unsigned char buffer [256] ; + int k ; + + /* + ** Open a new file and write two blocks of data to the file. After each + ** write, test that psf_get_filelen() returns the new length. + */ + + print_test_name ("Testing file truncate") ; + + memset (&sf_data, 0, sizeof (sf_data)) ; + memset (buffer, 0xEE, sizeof (buffer)) ; + + psf = &sf_data ; + snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", filename) ; + + /* + ** Open the file write mode, write 0xEE data and then extend the file + ** using truncate (the extended data should be 0x00). + */ + psf->file.mode = SFM_WRITE ; + test_open_or_die (psf, __LINE__) ; + test_write_or_die (psf, buffer, sizeof (buffer) / 2, 1, sizeof (buffer) / 2, __LINE__) ; + psf_ftruncate (psf, sizeof (buffer)) ; + test_close_or_die (psf, __LINE__) ; + + /* Open the file in read mode and check the data. */ + psf->file.mode = SFM_READ ; + test_open_or_die (psf, __LINE__) ; + test_read_or_die (psf, buffer, sizeof (buffer), 1, sizeof (buffer), __LINE__) ; + test_close_or_die (psf, __LINE__) ; + + for (k = 0 ; k < SIGNED_SIZEOF (buffer) / 2 ; k++) + if (buffer [k] != 0xEE) + { printf ("\n\nLine %d : buffer [%d] = %d (should be 0xEE)\n\n", __LINE__, k, buffer [k]) ; + exit (1) ; + } ; + + for (k = SIGNED_SIZEOF (buffer) / 2 ; k < SIGNED_SIZEOF (buffer) ; k++) + if (buffer [k] != 0) + { printf ("\n\nLine %d : buffer [%d] = %d (should be 0)\n\n", __LINE__, k, buffer [k]) ; + exit (1) ; + } ; + + /* Open the file in read/write and shorten the file using truncate. */ + psf->file.mode = SFM_RDWR ; + test_open_or_die (psf, __LINE__) ; + psf_ftruncate (psf, sizeof (buffer) / 4) ; + test_close_or_die (psf, __LINE__) ; + + /* Check the file length. */ + psf->file.mode = SFM_READ ; + test_open_or_die (psf, __LINE__) ; + test_seek_or_die (psf, 0, SEEK_END, SIGNED_SIZEOF (buffer) / 4, __LINE__) ; + test_close_or_die (psf, __LINE__) ; + + puts ("ok") ; +} /* file_truncate_test */ + +static void +file_seek_with_offset_test (const char *filename) +{ SF_PRIVATE sf_data, *psf ; + sf_count_t real_end ; + const size_t fileoffset = 64 ; + + print_test_name ("Testing seek with offset") ; + + /* Open the file created by the previous test for reading. */ + memset (&sf_data, 0, sizeof (sf_data)) ; + psf = &sf_data ; + psf->file.mode = SFM_READ ; + snprintf (psf->file.path.c, sizeof (psf->file.path.c), "%s", filename) ; + test_open_or_die (psf, __LINE__) ; + + /* Gather basic info before setting offset. */ + real_end = psf_fseek (psf, 0, SEEK_END) ; + test_tell_or_die (psf, real_end, __LINE__) ; + + /* Set the fileoffset (usually in a real system this is due to an id3 tag). */ + psf->fileoffset = fileoffset ; + + /* Check tell respects offset. */ + test_tell_or_die (psf, real_end - fileoffset, __LINE__) ; + + /* Check seeking works as expected. */ + test_seek_or_die (psf, 0, SEEK_SET, 0, __LINE__) ; + test_seek_or_die (psf, 0, SEEK_CUR, 0, __LINE__) ; + test_seek_or_die (psf, 0, SEEK_CUR, 0, __LINE__) ; + test_seek_or_die (psf, 0, SEEK_END, real_end - fileoffset, __LINE__) ; + + test_close_or_die (psf, __LINE__) ; + + puts ("ok") ; +} /* file_seek_with_offset_test */ + +/*============================================================================== +** Testing helper functions. +*/ + +static void +test_open_or_die (SF_PRIVATE *psf, int linenum) +{ int error ; + + /* Test that open for read fails if the file doesn't exist. */ + error = psf_fopen (psf) ; + if (error) + { printf ("\n\nLine %d: psf_fopen() failed : %s\n\n", linenum, strerror (errno)) ; + exit (1) ; + } ; + +} /* test_open_or_die */ + +static void +test_close_or_die (SF_PRIVATE *psf, int linenum) +{ + psf_fclose (psf) ; + if (psf_file_valid (psf)) + { printf ("\n\nLine %d: psf->file.filedes should not be valid.\n\n", linenum) ; + exit (1) ; + } ; + +} /* test_close_or_die */ + +static void +test_write_or_die (SF_PRIVATE *psf, void *data, sf_count_t bytes, sf_count_t items, sf_count_t new_position, int linenum) +{ sf_count_t retval ; + + retval = psf_fwrite (data, bytes, items, psf) ; + if (retval != items) + { printf ("\n\nLine %d: psf_write() returned %" PRId64 " (should be %" PRId64 ")\n\n", linenum, retval, items) ; + exit (1) ; + } ; + + if ((retval = psf_ftell (psf)) != new_position) + { printf ("\n\nLine %d: file length after write is not correct. (%" PRId64 " should be %" PRId64 ")\n\n", linenum, retval, new_position) ; + exit (1) ; + } ; + + return ; +} /* test_write_or_die */ + +static void +test_read_or_die (SF_PRIVATE *psf, void *data, sf_count_t bytes, sf_count_t items, sf_count_t new_position, int linenum) +{ sf_count_t retval ; + + retval = psf_fread (data, bytes, items, psf) ; + if (retval != items) + { printf ("\n\nLine %d: psf_write() returned %" PRId64 " (should be %" PRId64 ")\n\n", linenum, retval, items) ; + exit (1) ; + } ; + + if ((retval = psf_ftell (psf)) != new_position) + { printf ("\n\nLine %d: file length after write is not correct. (%" PRId64 " should be %" PRId64 ")\n\n", linenum, retval, new_position) ; + exit (1) ; + } ; + + return ; +} /* test_write_or_die */ + +static void +test_seek_or_die (SF_PRIVATE *psf, sf_count_t offset, int whence, sf_count_t new_position, int linenum) +{ sf_count_t retval ; + + retval = psf_fseek (psf, offset, whence) ; + + if (retval != new_position) + { printf ("\n\nLine %d: psf_fseek() failed. New position is %" PRId64 " (should be %" PRId64 ").\n\n", + linenum, retval, new_position) ; + exit (1) ; + } ; + +} /* test_seek_or_die */ + +static void +test_tell_or_die (SF_PRIVATE *psf, sf_count_t expected_position, int linenum) +{ + sf_count_t retval ; + + retval = psf_ftell (psf) ; + + if (retval != expected_position) + { printf ("\n\nLine %d: psf_ftell() failed. Position reported as %" PRId64 " (should be %" PRId64 ").\n\n", + linenum, retval, expected_position) ; + exit (1) ; + } ; +} + +static void +test_equal_or_die (int *array1, int *array2, int len, int linenum) +{ int k ; + + for (k = 0 ; k < len ; k++) + if (array1 [k] != array2 [k]) + printf ("\n\nLine %d: error at index %d (%d != %d).\n\n", + linenum, k, array1 [k], array2 [k]) ; + + return ; +} /* test_equal_or_die */ + +static void +make_data (int *data, int len, int seed) +{ int k ; + + srand (seed * 3333333 + 14756123) ; + + for (k = 0 ; k < len ; k++) + data [k] = rand () ; + +} /* make_data */ + +void +test_file_io (void) +{ const char *filename = "file_io.dat" ; + + file_open_test (filename) ; + file_read_write_test (filename) ; + file_seek_with_offset_test (filename) ; + file_truncate_test (filename) ; + + unlink (filename) ; +} /* main */ + diff --git a/libsndfile-1.0.31/src/test_float.c b/libsndfile-1.0.31/src/test_float.c new file mode 100644 index 0000000..0787989 --- /dev/null +++ b/libsndfile-1.0.31/src/test_float.c @@ -0,0 +1,104 @@ +/* +** Copyright (C) 2006-2012 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "test_main.h" + +void +test_float_convert (void) +{ static float data [] = + { 0.0, 1.0, -1.0, 1.0 * M_PI, -1.0 * M_PI, + 1e9, -1e9, 1e-9, -1e-9, 1e-10, -1e-10, + 1e-19, -1e-19, 1e19, -1e19, 1e-20, -1e-20, + } ; + + int k ; + + print_test_name (__func__) ; + + for (k = 0 ; k < ARRAY_LEN (data) ; k++) + { unsigned char bytes [4] ; + float test ; + + float32_le_write (data [k], bytes) ; + test = float32_le_read (bytes) ; + + if (fabs (data [k] - test) > 1e-20) + { printf ("\n\nLine %d : Test %d, little endian error %.15g -> %.15g.\n\n", __LINE__, k, data [k], test) ; + exit (1) ; + } ; + + float32_be_write (data [k], bytes) ; + test = float32_be_read (bytes) ; + + if (fabs (data [k] - test) > 1e-20) + { printf ("\n\nLine %d : Test %d, big endian error %.15g -> %.15g.\n\n", __LINE__, k, data [k], test) ; + exit (1) ; + } ; + + } ; + + puts ("ok") ; +} /* test_float_convert */ + +void +test_double_convert (void) +{ static double data [] = + { 0.0, 1.0, -1.0, 1.0 * M_PI, -1.0 * M_PI, + 1e9, -1e9, 1e-9, -1e-9, 1e-10, -1e-10, + 1e-19, -1e-19, 1e19, -1e19, 1e-20, -1e-20, + } ; + + int k ; + + print_test_name (__func__) ; + + for (k = 0 ; k < ARRAY_LEN (data) ; k++) + { unsigned char bytes [8] ; + double test ; + + double64_le_write (data [k], bytes) ; + test = double64_le_read (bytes) ; + + if (fabs (data [k] - test) > 1e-20) + { printf ("\n\nLine %d : Test %d, little endian error %.15g -> %.15g.\n\n", __LINE__, k, data [k], test) ; + exit (1) ; + } ; + + double64_be_write (data [k], bytes) ; + test = double64_be_read (bytes) ; + + if (fabs (data [k] - test) > 1e-20) + { printf ("\n\nLine %d : Test %d, big endian error %.15g -> %.15g.\n\n", __LINE__, k, data [k], test) ; + exit (1) ; + } ; + + } ; + + puts ("ok") ; +} /* test_double_convert */ + diff --git a/libsndfile-1.0.31/src/test_ima_oki_adpcm.c b/libsndfile-1.0.31/src/test_ima_oki_adpcm.c new file mode 100644 index 0000000..6c937d1 --- /dev/null +++ b/libsndfile-1.0.31/src/test_ima_oki_adpcm.c @@ -0,0 +1,157 @@ +/* +** Copyright (C) 2007-2011 Erik de Castro Lopo +** Copyright (c) 2007 +** +** This library is free software; you can redistribute it and/or modify it +** under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2 of the License, or (at +** your option) any later version. +** +** This library is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser +** General Public License for more details. +** +** You should have received a copy of the GNU Lesser General Public License +** along with this library. If not, write to the Free Software Foundation, +** Fifth Floor, 51 Franklin Street, Boston, MA 02111-1301, USA. +*/ + +#include "sfconfig.h" + +#include + +#include "test_main.h" + +#include "ima_oki_adpcm.c" + +static const unsigned char test_codes [] = +{ 0x08, 0x08, 0x04, 0x7f, 0x72, 0xf7, 0x9f, 0x7c, 0xd7, 0xbc, 0x7a, 0xa7, 0xb8, + 0x4b, 0x0b, 0x38, 0xf6, 0x9d, 0x7a, 0xd7, 0xbc, 0x7a, 0xd7, 0xa8, 0x6c, 0x81, + 0x98, 0xe4, 0x0e, 0x7a, 0xd7, 0x9e, 0x7b, 0xc7, 0xab, 0x7a, 0x85, 0xc0, 0xb3, + 0x8f, 0x58, 0xd7, 0xad, 0x7a, 0xd7, 0xad, 0x7a, 0x87, 0xd0, 0x2b, 0x0e, 0x48, + 0xd7, 0xad, 0x78, 0xf7, 0xbc, 0x7a, 0xb7, 0xa8, 0x4b, 0x88, 0x18, 0xd5, 0x8d, + 0x6a, 0xa4, 0x98, 0x08, 0x00, 0x80, 0x88, +} ; + +static const short test_pcm [] = +{ 32, 0, 32, 0, 32, 320, 880, -336, 2304, 4192, -992, 10128, 5360, -16352, + 30208, 2272, -31872, 14688, -7040, -32432, 14128, -1392, -15488, 22960, + 1232, -1584, 21488, -240, 2576, -15360, 960, -1152, -30032, 10320, 1008, + -30032, 16528, 1008, -30032, 16528, -5200, -30592, 15968, 448, -30592, + 15968, 448, -2368, 30960, 3024, -80, 8384, 704, -1616, -29168, -1232, 1872, + -32768, 13792, -1728, -32768, 13792, 4480, -32192, 14368, -7360, -32752, + 13808, -1712, -21456, 16992, 1472, -1344, 26848, -1088, 2016, -17728, 208, + -2112, -32768, 1376, -1728, -32768, 13792, -1728, -32768, 13792, -1728, + -32768, 13792, -1728, -32768, 13792, -1728, -4544, 32767, -1377, 1727, + 15823, -2113, 207, -27345, 591, -2513, -32768, 13792, -1728, -32768, 13792, + 10688, -31632, 14928, -6800, -32192, 14368, -1152, -20896, 17552, 2032, + -784, 22288, 560, -2256, -4816, 2176, 64, -21120, 9920, 6816, -24224, 16128, + 608, -13488, 9584, 272, -2544, 16, -2304, -192, 1728, -16, 1568, 128, -1184, +} ; + + +static void +test_oki_adpcm (void) +{ + IMA_OKI_ADPCM adpcm ; + unsigned char code ; + int i, j ; + + print_test_name ("Testing ima/oki encoder") ; + + ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ; + for (i = 0 ; i < ARRAY_LEN (test_codes) ; i++) + for (j = 0, code = test_codes [i] ; j < 2 ; j++, code <<= 4) + if (adpcm_decode (&adpcm, code >> 4) != test_pcm [2 * i + j]) + { printf ("\n\nFail at i = %d, j = %d.\n\n", i, j) ; + exit (1) ; + } ; + + puts ("ok") ; + + print_test_name ("Testing ima/oki decoder") ; + + ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ; + for (i = 0 ; i < ARRAY_LEN (test_pcm) - 1 ; i += 2) + { code = adpcm_encode (&adpcm, test_pcm [i]) ; + code = (code << 4) | adpcm_encode (&adpcm, test_pcm [i + 1]) ; + if (code != test_codes [i / 2]) + { printf ("\n\nFail at i = %d, %d should be %d\n\n", i, code, test_codes [i / 2]) ; + exit (1) ; + } ; + } ; + + puts ("ok") ; +} /* test_oki_adpcm */ + +static void +test_oki_adpcm_block (void) +{ + IMA_OKI_ADPCM adpcm ; + int k ; + + if (ARRAY_LEN (adpcm.pcm) < ARRAY_LEN (test_pcm)) + { printf ("\n\nLine %d : ARRAY_LEN (adpcm->pcm) > ARRAY_LEN (test_pcm) (%d > %d).\n\n", __LINE__, ARRAY_LEN (adpcm.pcm), ARRAY_LEN (test_pcm)) ; + exit (1) ; + } ; + + if (ARRAY_LEN (adpcm.codes) < ARRAY_LEN (test_codes)) + { printf ("\n\nLine %d : ARRAY_LEN (adcodes->codes) > ARRAY_LEN (test_codes).n", __LINE__) ; + exit (1) ; + } ; + + print_test_name ("Testing ima/oki block encoder") ; + + ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ; + + memcpy (adpcm.pcm, test_pcm, sizeof (adpcm.pcm [0]) * ARRAY_LEN (test_pcm)) ; + adpcm.pcm_count = ARRAY_LEN (test_pcm) ; + adpcm.code_count = 13 ; + + ima_oki_adpcm_encode_block (&adpcm) ; + + if (adpcm.code_count * 2 != ARRAY_LEN (test_pcm)) + { printf ("\n\nLine %d : %d * 2 != %d\n\n", __LINE__, adpcm.code_count * 2, ARRAY_LEN (test_pcm)) ; + exit (1) ; + } ; + + for (k = 0 ; k < ARRAY_LEN (test_codes) ; k++) + if (adpcm.codes [k] != test_codes [k]) + { printf ("\n\nLine %d : Fail at k = %d, %d should be %d\n\n", __LINE__, k, adpcm.codes [k], test_codes [k]) ; + exit (1) ; + } ; + + puts ("ok") ; + + print_test_name ("Testing ima/oki block decoder") ; + + ima_oki_adpcm_init (&adpcm, IMA_OKI_ADPCM_TYPE_OKI) ; + + memcpy (adpcm.codes, test_codes, sizeof (adpcm.codes [0]) * ARRAY_LEN (test_codes)) ; + adpcm.code_count = ARRAY_LEN (test_codes) ; + adpcm.pcm_count = 13 ; + + ima_oki_adpcm_decode_block (&adpcm) ; + + if (adpcm.pcm_count != 2 * ARRAY_LEN (test_codes)) + { printf ("\n\nLine %d : %d * 2 != %d\n\n", __LINE__, adpcm.pcm_count, 2 * ARRAY_LEN (test_codes)) ; + exit (1) ; + } ; + + for (k = 0 ; k < ARRAY_LEN (test_pcm) ; k++) + if (adpcm.pcm [k] != test_pcm [k]) + { printf ("\n\nLine %d : Fail at i = %d, %d should be %d.\n\n", __LINE__, k, adpcm.pcm [k], test_pcm [k]) ; + exit (1) ; + } ; + + puts ("ok") ; +} /* test_oki_adpcm_block */ + +void +test_ima_oki_adpcm (void) +{ + test_oki_adpcm () ; + test_oki_adpcm_block () ; +} /* main */ + diff --git a/libsndfile-1.0.31/src/test_log_printf.c b/libsndfile-1.0.31/src/test_log_printf.c new file mode 100644 index 0000000..e1806a1 --- /dev/null +++ b/libsndfile-1.0.31/src/test_log_printf.c @@ -0,0 +1,123 @@ +/* +** Copyright (C) 2003-2012 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#include "common.h" + +#include "test_main.h" + +#define CMP_0_ARGS(line, err, fmt) \ + { psf->parselog.indx = 0 ; \ + snprintf (buffer, sizeof (buffer), (fmt)) ; \ + psf_log_printf (psf, (fmt)) ; \ + err += compare_strings_or_die (line, fmt, buffer, psf->parselog.buf) ; \ + } + +#define CMP_2_ARGS(line, err, fmt, a) \ + { psf->parselog.indx = 0 ; \ + snprintf (buffer, sizeof (buffer), (fmt), (a), (a)) ; \ + psf_log_printf (psf, (fmt), (a), (a)) ; \ + err += compare_strings_or_die (line, fmt, buffer, psf->parselog.buf) ; \ + } + +#define CMP_4_ARGS(line, err, fmt, a) \ + { psf->parselog.indx = 0 ; \ + snprintf (buffer, sizeof (buffer), (fmt), (a), (a), (a), (a)) ; \ + psf_log_printf (psf, (fmt), (a), (a), (a), (a)) ; \ + err += compare_strings_or_die (line, fmt, buffer, psf->parselog.buf) ; \ + } + +#define CMP_5_ARGS(line, err, fmt, a) \ + { psf->parselog.indx = 0 ; \ + snprintf (buffer, sizeof (buffer), (fmt), (a), (a), (a), (a), (a)) ; \ + psf_log_printf (psf, (fmt), (a), (a), (a), (a), (a)) ; \ + err += compare_strings_or_die (line, fmt, buffer, psf->parselog.buf) ; \ + } + +#define CMP_6_ARGS(line, err, fmt, a) \ + { psf->parselog.indx = 0 ; \ + snprintf (buffer, sizeof (buffer), (fmt), (a), (a), (a), (a), (a), (a)) ; \ + psf_log_printf (psf, (fmt), (a), (a), (a), (a), (a), (a)) ; \ + err += compare_strings_or_die (line, fmt, buffer, psf->parselog.buf) ; \ + } + +static int +compare_strings_or_die (int linenum, const char *fmt, const char* s1, const char* s2) +{ int errors = 0 ; +/*-puts (s1) ;puts (s2) ;-*/ + + if (strcmp (s1, s2) != 0) + { printf ("\n\nLine %d: string compare mismatch:\n\t", linenum) ; + printf ("\"%s\"\n", fmt) ; + printf ("\t\"%s\"\n\t\"%s\"\n", s1, s2) ; + errors ++ ; + } ; + + return errors ; +} /* compare_strings_or_die */ + +void +test_log_printf (void) +{ static char buffer [2048] ; + SF_PRIVATE sf_private, *psf ; + int k, errors = 0 ; + int int_values [] = { 0, 1, 12, 123, 1234, 123456, -1, -12, -123, -1234, -123456 } ; + + print_test_name ("Testing psf_log_printf") ; + + psf = &sf_private ; + memset (psf, 0, sizeof (sf_private)) ; + + CMP_0_ARGS (__LINE__, errors, " ->%%<- ") ; + + /* Test printing of ints. */ + for (k = 0 ; k < ARRAY_LEN (int_values) ; k++) + CMP_6_ARGS (__LINE__, errors, "int A : %d, % d, %4d, % 4d, %04d, % 04d", int_values [k]) ; + + for (k = 0 ; k < ARRAY_LEN (int_values) ; k++) + CMP_5_ARGS (__LINE__, errors, "int B : %+d, %+4d, %+04d, %-d, %-4d", int_values [k]) ; + + for (k = 0 ; k < ARRAY_LEN (int_values) ; k++) + CMP_2_ARGS (__LINE__, errors, "int C : %- d, %- 4d", int_values [k]) ; + + /* Test printing of unsigned ints. */ + for (k = 0 ; k < ARRAY_LEN (int_values) ; k++) + CMP_4_ARGS (__LINE__, errors, "D : %u, %4u, %04u, %0u", int_values [k]) ; + + /* Test printing of hex ints. */ + for (k = 0 ; k < ARRAY_LEN (int_values) ; k++) + CMP_4_ARGS (__LINE__, errors, "E : %X, %4X, %04X, %0X", int_values [k]) ; + + /* Test printing of strings. */ + CMP_4_ARGS (__LINE__, errors, "B %s, %3s, %8s, %-8s", "str") ; + + if (errors) + { puts ("\nExiting due to errors.\n") ; + exit (1) ; + } ; + + puts ("ok") ; +} /* test_log_printf */ + diff --git a/libsndfile-1.0.31/src/test_main.c b/libsndfile-1.0.31/src/test_main.c new file mode 100644 index 0000000..f5a501d --- /dev/null +++ b/libsndfile-1.0.31/src/test_main.c @@ -0,0 +1,70 @@ +/* +** Copyright (C) 2008-2016 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#if defined (HAVE_SYS_TYPES_H) && (HAVE_SYS_TYPES_H == 1) +#include +#endif +#include +#include +#include + +#include "test_main.h" + +static void +test_file_offsets_are_64_bit (void) +{ + print_test_name ("File offsets are 64 bit") ; + + // The Windows specific code path uses the 64 bit file I/O APIs. + if (! USE_WINDOWS_API && sizeof (off_t) != 8) + { printf ("\n\nError : sizeof (off_t) is %zd (should be 8).\n\n", sizeof (off_t)) ; + exit (1) ; + } ; + + puts ("ok") ; +} /* test_file_offsets_are_64_bit */ + +int +main (void) +{ + test_file_offsets_are_64_bit () ; + test_conversions () ; + test_endswap () ; + test_float_convert () ; + test_double_convert () ; + + test_log_printf () ; + test_binheader_writef () ; + test_file_io () ; + + test_audio_detect () ; + test_ima_oki_adpcm () ; + + test_psf_strlcpy_crlf () ; + test_broadcast_var () ; + test_cart_var () ; + + test_nms_adpcm () ; + + return 0 ; +} /* main */ + diff --git a/libsndfile-1.0.31/src/test_main.h b/libsndfile-1.0.31/src/test_main.h new file mode 100644 index 0000000..d08fb2e --- /dev/null +++ b/libsndfile-1.0.31/src/test_main.h @@ -0,0 +1,44 @@ +/* +** Copyright (C) 2008-2016 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +static inline void +print_test_name (const char * name) +{ printf (" %-40s : ", name) ; + fflush (stdout) ; +} /* print_test_name */ + + + +void test_conversions (void) ; +void test_endswap (void) ; +void test_log_printf (void) ; +void test_binheader_writef (void) ; +void test_file_io (void) ; + +void test_float_convert (void) ; +void test_double_convert (void) ; + +void test_audio_detect (void) ; +void test_ima_oki_adpcm (void) ; + +void test_psf_strlcpy_crlf (void) ; +void test_broadcast_var (void) ; + +void test_cart_var (void) ; + +void test_nms_adpcm (void) ; diff --git a/libsndfile-1.0.31/src/test_nms_adpcm.c b/libsndfile-1.0.31/src/test_nms_adpcm.c new file mode 100644 index 0000000..8558a04 --- /dev/null +++ b/libsndfile-1.0.31/src/test_nms_adpcm.c @@ -0,0 +1,400 @@ +/* +** Copyright (C) 2007-2018 Erik de Castro Lopo +** Copyright (C) 2017-2018 Arthur Taylor +** +** This library is free software; you can redistribute it and/or modify it +** under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2 of the License, or (at +** your option) any later version. +** +** This library is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser +** General Public License for more details. +** +** You should have received a copy of the GNU Lesser General Public License +** along with this library. If not, write to the Free Software Foundation, +** Fifth Floor, 51 Franklin Street, Boston, MA 02111-1301, USA. +*/ + +#include "sfconfig.h" + +#include + +#include "test_main.h" + +#include "nms_adpcm.c" + +static const short pcm_data_src [] = +{ 505, 743, 805, 409, 101, -552, -709, -679, + -624, -1174, -1050, 32, -401, -769, -679, 47, + -3273, -4425, -2158, -176, 824, 1057, 1245, 805, + 2414, 3282, 1739, -624, -1197, -1663, -913, 603, + 549, -614, 707, 3314, 2864, 1127, -294, -919, + -1251, -147, 30, -750, -131, 1394, 2197, 1829, + 1387, 417, 391, 533, 581, 179, -210, -210, + -884, -937, -1373, -1338, -1811, -2727, -2536, -1552, + -651, -3556, -7713, -9083, -6182, 1070, 4983, 5341, + 4596, 4682, 6488, 5197, 2401, -2702, -5261, -4036, + -1995, 463, 1056, 2436, 3238, 4395, 4478, 1130, + -2383, -4349, -4547, -3631, -1396, 1029, 2589, 3948, + 4966, 4312, 2362, 492, -1289, -2259, -1659, -597, + 239, 1433, 2353, 2512, 1763, 610, -291, -640, + 7, 132, 432, 438, -1070, -1202, -1071, -1841, + -462, 225, -4465, -11313, -10492, -4522, -2096, -7013, + -11770, -2546, 7687, 12765, 12014, 5324, 1645, 1191, + 3800, -187, -6689, -7778, -4631, 2487, 7352, 7928, + 4317, 2424, 3784, 2301, -1713, -6668, -8345, -6453, + -2303, 2269, 3232, 4114, 5054, 5054, 3768, 1060, + -1793, -3302, -2059, -86, 1153, 1690, 2869, 3841, + 3551, 1919, -197, -1391, -847, 128, 746, 1111, + 431, 559, 1086, 138, -1539, -2758, -1886, 1351, + 2407, -1883, -8356, -10999, -9917, -7329, -4295, -3209, + -11616, -15352, 1032, 12603, 13233, 9059, 4019, 1858, + 3368, 7454, -56, -8600, -7278, -818, 5478, 7039, + 5630, 1186, 1634, 5422, 2518, -3182, -8271, -7889, + -4399, -129, 3205, 2933, 3661, 5886, 6543, 3798, + 374, -2722, -3378, -1804, -24, 385, 1663, 3595, + 4749, 3865, 1402, -851, -1932, -1394, -725, -219, + 290, 658, 1074, 1638, 536, 204, -340, 408, + 1835, 1261, -2872, -4840, -5978, -8177, -7644, -6554, + -8093, -6174, -7796, -17019, -12355, 1280, 12576, 11868, + 10710, 8578, 5605, 9675, 7123, -977, -8770, -6740, + -1327, 2905, 6386, 5026, 3809, 5137, 6392, 2463, + -4924, -8830, -9572, -6122, -1608, 1677, 3379, 5660, + 8236, 7225, 4470, 295, -2628, -3572, -2107, -666, + 951, 3101, 5049, 4759, 2367, -140, -2078, -2471, + -2332, -1547, -798, 410, 1825, 3329, 3092, 352, + -3310, -3307, -1229, -415, 532, 2091, 465, -1430 +} ; + +/* pcm_data encoded as 16kbs from a known reference */ +static const unsigned short test_codes_16 [] = +{ 0x5777, 0xfff0, 0xdcd0, 0x672d, 0x1826, 0xc11c, 0x0822, 0xffee, + 0x3ddc, 0x6372, 0x0116, 0xc8d8, 0x6780, 0x8624, 0x3323, 0x33ef, + 0xd865, 0x4cd8, 0x3372, 0x1096, 0x0049, 0xa911, 0x1288, 0xa74d, + 0x3fee, 0xcc45, 0x52de, 0x6a72, 0x9118, 0xe291, 0x60a2, 0x3164, + 0x73fe, 0xeddf, 0x57b5, 0x185a, 0xe889, 0x460e, 0x2646, 0x8d87, + 0xe5ba, 0x004c +} ; + +/* pcm_data encoded as 24kbs from a known reference */ +static const unsigned short test_codes_24 [] = +{ 0x7776, 0x2fec, 0xceb0, 0xffd0, 0x3241, 0x650a, 0x0a26, 0x61ba, + 0xa10b, 0x3912, 0x39a8, 0xebfa, 0x1fff, 0x8552, 0x2342, 0x0204, + 0x454b, 0xccbb, 0x4318, 0xaa00, 0x1642, 0x3031, 0xfc8f, 0x38ff, + 0xf604, 0x4924, 0x2ddb, 0x0469, 0xbcaa, 0x83b6, 0x0049, 0x8828, + 0x2266, 0x3801, 0x873d, 0xcb86, 0x0eff, 0xef64, 0xd402, 0x44fa, + 0x2867, 0xd1d0, 0xa109, 0x2a11, 0x8a64, 0x4018, 0x1357, 0xd5a5, + 0x4bfc, 0xcbfe, 0x070a, 0x6307, 0x1858, 0x624b, 0xf9a9, 0x783b, + 0x0880, 0x1652, 0xc893, 0x641c, 0xf30d, 0x004c +} ; + +/* pcm_data encoded as 32kbs from a known reference */ +static const unsigned short test_codes_32 [] = +{ 0x7772, 0x0cdc, 0xbec2, 0xacb2, 0xff90, 0x1220, 0x551c, 0xcc84, + 0x2c47, 0x30aa, 0xa10b, 0x0663, 0x2812, 0x28a9, 0xf9ba, 0xceb9, + 0x1fec, 0x9553, 0x2361, 0x9ed8, 0x8314, 0x564b, 0xddba, 0x1346, + 0x6308, 0xab00, 0x0721, 0x2908, 0x3820, 0xf89c, 0x38ff, 0xa2bf, + 0xc535, 0x2933, 0x5de9, 0x8633, 0x8569, 0xbeca, 0x1186, 0x5528, + 0xd000, 0xaa21, 0x0473, 0x2800, 0x1112, 0xa64d, 0xdc17, 0x8eeb, + 0xccac, 0xfe74, 0xc501, 0x63f9, 0x2040, 0x3a73, 0xc9b9, 0x9188, + 0x7318, 0x0a81, 0x9a65, 0x5188, 0x00ba, 0x2256, 0xd5b6, 0x4bfa, + 0xbeac, 0xe8fe, 0x343b, 0x7117, 0x9ca4, 0x915a, 0x563d, 0xcad0, + 0xa837, 0x302a, 0x1a2a, 0x3561, 0x98a9, 0xb9b5, 0x578a, 0xc48b, + 0x25f0, 0x1000 +} ; + + +/* test_codes_16 decoded by a known reference */ +const short pcm_data_out16 [] = +{ 12, 16, 24, 36, 52, -68, -104, -156, + -224, -309, -433, 12, -449, -618, -851, 32, + -871, -1176, -1586, 60, 1172, 634, 1566, 983, + 1995, 2586, 1718, -1152, -815, -2313, -1610, 1261, + 1056, -253, 522, 1799, 2506, 1518, 72, -329, + -1510, -76, 337, -1144, 68, 1369, 2200, 1337, + 1016, 60, 405, 461, 433, 389, -36, -164, + -550, -871, -1212, -1626, -2136, -2791, -2064, -1642, + -485, -1566, -2538, -3445, -4481, 650, 4381, 3799, + 5807, 4742, 6674, 5590, 2072, -2228, -5650, -4983, + -1698, 441, 1333, 3064, 2855, 3815, 5108, 2156, + -2228, -3321, -5028, -4405, -1550, 771, 3232, 3273, + 4008, 5008, 2024, 859, -654, -2746, -1694, -136, + 68, 1409, 1759, 2453, 2016, 522, -514, -445, + 0, 305, 493, 518, -232, -1076, -1116, -1321, + -506, 365, -140, -1132, -2076, -2895, -2357, -2477, + -3325, -2859, 666, 4449, 7164, 6244, 1847, 1365, + 3827, -779, -7682, -8951, -3811, 1718, 6566, 7120, + 4674, 1959, 1819, 2032, -1104, -5220, -8518, -7626, + -2385, 2714, 3510, 3871, 4831, 4024, 4156, 1590, + -1694, -3437, -2393, 96, 959, 1847, 2775, 3638, + 3072, 1734, -204, -1730, -718, -92, 453, 807, + 220, 514, 1349, -40, -1285, -2477, -1566, 1273, + 2586, 546, -2887, -5534, -6883, -7461, -5281, -2224, + -2361, -5104, -48, 9228, 12140, 9048, 3614, 1927, + 4618, 6004, -148, -9871, -5582, -489, 6835, 6746, + 6839, 2851, 3028, 4566, 1461, -2028, -6883, -7642, + -5321, -610, 3385, 3461, 3088, 3389, 4570, 4321, + -389, -2630, -3369, -1706, -136, 220, 1594, 3024, + 4622, 4232, 1265, -943, -2273, -1638, -726, -232, + 365, 538, 995, 1530, 289, 453, -68, 12, + 1184, 1562, 92, -2558, -4859, -6277, -7096, -5461, + -4811, -6020, -8851, -12594, -11501, -943, 12927, 10449, + 8935, 10389, 5662, 5755, 9108, 1827, -10224, -7807, + -148, 3429, 7722, 5212, 4734, 3847, 5570, 3433, + -3931, -8244, -8461, -5397, -1710, 1919, 3787, 4558, + 5040, 5722, 4811, -441, -3140, -4180, -2397, -493, + 1309, 3064, 4116, 5040, 2759, -730, -2445, -2847, + -2080, -1682, -1124, 706, 2032, 3325, 3248, 425, + -3586, -2987, -1397, -188, 144, 1506, 4, -2028 +} ; + +/* test_codes_24 decoded by a known reference */ +static const short pcm_data_out24 [] = +{ 16, 32, 68, 140, 116, -232, -510, -650, + -771, -1329, -1052, -152, -317, -907, -710, -104, + -1144, -2132, -2598, -301, 662, 827, 1469, 702, + 2401, 2987, 1574, -244, -1481, -1365, -903, 738, + 369, -469, 473, 1630, 3124, 1542, -582, -1172, + -1381, -317, 4, -610, -40, 1236, 1843, 1493, + 1349, 417, 389, 630, 686, 188, -228, -168, + -742, -795, -1530, -1473, -1903, -3008, -2907, -1317, + -445, -2309, -4919, -8939, -5867, 1204, 5293, 5337, + 4871, 4562, 5602, 5104, 2485, -2337, -5594, -4240, + -1694, 867, 1281, 2622, 3638, 4228, 4654, 1405, + -1947, -4112, -4184, -3582, -1570, 1325, 2538, 4036, + 5144, 4630, 2718, 518, -1373, -2397, -1642, -453, + 349, 1566, 2558, 2493, 1927, 662, -365, -610, + -136, 188, 453, 437, -385, -1281, -1196, -1534, + -369, 265, -899, -3445, -7176, -4538, -2726, -5650, + -13152, -1694, 7040, 11489, 12224, 5971, 1971, 1779, + 3457, -373, -6040, -7714, -5008, 2594, 7658, 8156, + 4461, 2333, 4369, 2867, -1919, -7180, -8465, -6409, + -2618, 2152, 3120, 4208, 5570, 5558, 4120, 690, + -2088, -3345, -1975, -208, 1180, 1738, 2144, 3289, + 3686, 1819, -417, -1534, -875, 88, 678, 967, + 437, 558, 951, 20, -1638, -2558, -1967, 558, + 2289, 465, -4449, -11080, -8931, -6248, -4208, -3337, + -6493, -14550, -5068, 12305, 13261, 9742, 4261, 1851, + 3016, 6971, 441, -9554, -7096, -975, 5188, 6658, + 5409, 1341, 855, 6164, 1726, -2381, -7991, -7212, + -4799, -433, 3236, 3273, 3253, 4445, 6706, 3329, + 582, -2602, -3028, -1614, -152, 196, 1598, 3638, + 5144, 4016, 1586, -1004, -2016, -1401, -682, -128, + 273, 614, 963, 1614, 425, 269, -449, 277, + 1746, 1240, -1510, -4598, -6397, -8008, -7602, -7152, + -7393, -6738, -8606, -15385, -13385, 1192, 12212, 11152, + 9967, 8622, 5240, 6939, 7369, -2216, -9602, -7425, + -999, 3228, 6329, 4702, 4305, 4550, 6216, 3072, + -4983, -9313, -9437, -5586, -1987, 2088, 3184, 4662, + 8244, 6598, 4606, -277, -2718, -3188, -2321, -437, + 835, 2855, 4638, 4943, 2116, -393, -2269, -2502, + -2445, -1630, -646, 469, 1927, 3188, 2943, 502, + -3148, -3100, -1144, -642, 658, 1843, 449, -1445 +} ; + +/* test_codes_32 decoded by a known reference */ +static const short pcm_data_out32 [] = +{ 20, 96, 417, 433, 140, -506, -742, -714, + -598, -1092, -1044, 56, -445, -702, -622, 76, + -1116, -4293, -2429, -433, 606, 1196, 1357, 650, + 2465, 3040, 1730, -682, -1381, -1759, -867, 518, + 614, -698, 751, 2172, 3216, 1369, -562, -1076, + -1293, -116, -12, -803, -176, 1297, 2228, 1759, + 1257, 425, 453, 614, 622, 188, -212, -220, + -975, -951, -1441, -1309, -1698, -2578, -2405, -1650, + -590, -2293, -7052, -8506, -5907, 1100, 5192, 5305, + 4244, 4425, 6779, 5313, 2152, -2654, -5598, -3803, + -2176, 301, 1080, 2281, 3361, 4485, 4690, 1269, + -2253, -4477, -4562, -3598, -1345, 1108, 2638, 3783, + 4819, 4401, 2357, 409, -1180, -2204, -1730, -662, + 168, 1566, 2550, 2333, 1879, 485, -293, -690, + -28, 176, 445, 413, -767, -1088, -1204, -1847, + -481, 261, -1321, -8714, -10646, -4265, -1979, -7100, + -11678, -1911, 7449, 13333, 11991, 5244, 1935, 1072, + 3638, -4, -6377, -7650, -4819, 2674, 7148, 8036, + 4325, 2433, 3855, 2204, -1638, -6361, -8192, -6634, + -2184, 2144, 3357, 4164, 4783, 5168, 3835, 1100, + -1670, -3224, -2140, -144, 1120, 1755, 2530, 3626, + 3678, 1771, -281, -1289, -875, 48, 755, 1112, + 449, 546, 1140, 232, -1530, -2783, -1871, 1128, + 2216, -1899, -8606, -11333, -10140, -7546, -4357, -2979, + -6044, -14851, -3726, 13136, 13477, 9534, 3871, 1489, + 3526, 7012, 80, -8188, -7140, -1120, 5783, 7060, + 5823, 1337, 1108, 5566, 2345, -3373, -8140, -7919, + -4566, 76, 3060, 2795, 3385, 5907, 6558, 3638, + 257, -2630, -3401, -1807, -116, 349, 1610, 3417, + 4750, 3967, 1489, -907, -1923, -1385, -666, -265, + 253, 682, 1084, 1586, 538, 184, -381, 433, + 1875, 1289, -1574, -4538, -6168, -8196, -7887, -6750, + -7526, -6060, -8148, -16036, -12546, 895, 12991, 12060, + 10827, 8931, 5321, 8646, 7654, -473, -8582, -6614, + -1321, 2803, 6542, 5184, 3847, 4943, 6397, 2148, + -4999, -8799, -9614, -5931, -1574, 1546, 3493, 5397, + 7879, 6919, 4610, 160, -2538, -3582, -2052, -578, + 1060, 2987, 4843, 4791, 2421, -116, -1987, -2518, + -2333, -1534, -855, 365, 1779, 3389, 3080, 477, + -3281, -3120, -1188, -265, 638, 2224, 333, -1377 +} ; + + +static void +test_nms_adpcm_32 (void) +{ + struct nms_adpcm_state nms ; + int16_t *buffer ; + unsigned char code ; + int i, j, sl ; + + buffer = (int16_t *) malloc (sizeof (int16_t) * NMS_SAMPLES_PER_BLOCK) ; + + print_test_name ("Testing nms adpcm 32kbs encoder") ; + + nms_adpcm_codec_init (&nms, NMS32) ; + for (i = 0 ; i * NMS_BLOCK_SHORTS_32 < ARRAY_LEN (test_codes_32) ; i ++) + { /* Unpack the reference */ + nms_adpcm_block_unpack_32 (&(test_codes_32 [i * NMS_BLOCK_SHORTS_32]), buffer, NULL) ; + for (j = 0 ; j < NMS_SAMPLES_PER_BLOCK ; j++) + { sl = pcm_data_src [i * NMS_SAMPLES_PER_BLOCK + j] ; + code = nms_adpcm_encode_sample (&nms, sl) ; + if (code != buffer [j]) + { printf ("\n\nFail at sample %d (block %d, sample %d). Expected 0x%x got 0x%x\n\n", + i * NMS_SAMPLES_PER_BLOCK + j, i, j, buffer [j], code) ; + exit (1) ; + } + } + } + + puts ("ok") ; + + print_test_name ("Testing nms adpcm 32kbs decoder") ; + + nms_adpcm_codec_init (&nms, NMS32) ; + for (i = 0 ; i * NMS_BLOCK_SHORTS_32 < ARRAY_LEN (test_codes_32) ; i ++) + { /* Unpack the code */ + nms_adpcm_block_unpack_32 (&(test_codes_32 [i * NMS_BLOCK_SHORTS_32]), buffer, NULL) ; + for (j = 0 ; j < NMS_SAMPLES_PER_BLOCK ; j++) + { sl = nms_adpcm_decode_sample (&nms, buffer [j]) ; + if (sl != pcm_data_out32 [i * NMS_SAMPLES_PER_BLOCK + j]) + { printf ("\n\nFail at sample %d (block %d, sample %d). Expected %d got %d\n\n", + i * NMS_SAMPLES_PER_BLOCK + j, i, j, pcm_data_out32 [i * NMS_SAMPLES_PER_BLOCK + j], sl) ; + exit (1) ; + } + } + } + + puts ("ok") ; + + free (buffer) ; +} + + +static void +test_nms_adpcm_24 (void) +{ + struct nms_adpcm_state nms ; + int16_t *buffer ; + unsigned char code ; + int i, j, sl ; + + buffer = (int16_t *) malloc (sizeof (int16_t) * NMS_SAMPLES_PER_BLOCK) ; + + + print_test_name ("Testing nms adpcm 24kbs encoder") ; + + nms_adpcm_codec_init (&nms, NMS24) ; + for (i = 0 ; i * NMS_BLOCK_SHORTS_24 < ARRAY_LEN (test_codes_24) ; i ++) + { /* Unpack the reference */ + nms_adpcm_block_unpack_24 (&test_codes_24 [i * NMS_BLOCK_SHORTS_24], buffer, NULL) ; + for (j = 0 ; j < NMS_SAMPLES_PER_BLOCK ; j++) + { sl = pcm_data_src [i * NMS_SAMPLES_PER_BLOCK + j] ; + code = nms_adpcm_encode_sample (&nms, sl) ; + if (code != buffer [j]) + { printf ("\n\nFail at sample %d (block %d, sample %d). Expected 0x%x got 0x%x\n\n", + i * NMS_SAMPLES_PER_BLOCK + j, i, j, buffer [j], code) ; + exit (1) ; + } + } + } + + puts ("ok") ; + + + print_test_name ("Testing nms adpcm 24kbs decoder") ; + + nms_adpcm_codec_init (&nms, NMS24) ; + for (i = 0 ; i * NMS_BLOCK_SHORTS_24 < ARRAY_LEN (test_codes_24) ; i ++) + { /* Unpack the code */ + nms_adpcm_block_unpack_24 (&test_codes_24 [i * NMS_BLOCK_SHORTS_24], buffer, NULL) ; + for (j = 0 ; j < NMS_SAMPLES_PER_BLOCK ; j++) + { sl = nms_adpcm_decode_sample (&nms, buffer [j]) ; + if (sl != pcm_data_out24 [i * NMS_SAMPLES_PER_BLOCK + j]) + { printf ("\n\nFail at sample %d (block %d, sample %d). Expected %d got %d\n\n", + i * NMS_SAMPLES_PER_BLOCK + j, i, j, pcm_data_out24 [i * NMS_SAMPLES_PER_BLOCK + j], sl) ; + exit (1) ; + } + } + } + + puts ("ok") ; + + free (buffer) ; +} /* test_nms_adpcm_24 */ + +static void +test_nms_adpcm_16 (void) +{ struct nms_adpcm_state nms ; + int16_t *buffer ; + unsigned char code ; + int i, j, sl ; + + buffer = (int16_t *) malloc (sizeof (int16_t) * NMS_SAMPLES_PER_BLOCK) ; + + print_test_name ("Testing nms adpcm 16kbs encoder") ; + + nms_adpcm_codec_init (&nms, NMS16) ; + for (i = 0 ; i * NMS_BLOCK_SHORTS_16 < ARRAY_LEN (test_codes_16) ; i ++) + { /* Unpack the reference */ + nms_adpcm_block_unpack_16 (&test_codes_16 [i * NMS_BLOCK_SHORTS_16], buffer, NULL) ; + for (j = 0 ; j < NMS_SAMPLES_PER_BLOCK ; j++) + { sl = pcm_data_src [i * NMS_SAMPLES_PER_BLOCK + j] ; + code = nms_adpcm_encode_sample (&nms, sl) ; + if (code != buffer [j]) + { printf ("\n\nFail at sample %d (block %d, sample %d). Expected 0x%x got 0x%x\n\n", + i * NMS_SAMPLES_PER_BLOCK + j, i, j, buffer [j], code) ; + exit (1) ; + } + } + } + + puts ("ok") ; + + print_test_name ("Testing nms adpcm 16kbs decoder") ; + + nms_adpcm_codec_init (&nms, NMS16) ; + for (i = 0 ; i * NMS_BLOCK_SHORTS_16 < ARRAY_LEN (test_codes_16) ; i ++) + { /* Unpack the code */ + nms_adpcm_block_unpack_16 (&test_codes_16 [i * NMS_BLOCK_SHORTS_16], buffer, NULL) ; + for (j = 0 ; j < NMS_SAMPLES_PER_BLOCK ; j++) + { sl = nms_adpcm_decode_sample (&nms, buffer [j]) ; + if (sl != pcm_data_out16 [i * NMS_SAMPLES_PER_BLOCK + j]) + { printf ("\n\nFail at sample %d (block %d, sample %d). Expected %d got %d\n\n", + i * NMS_SAMPLES_PER_BLOCK + j, i, j, pcm_data_out16 [i * NMS_SAMPLES_PER_BLOCK + j], sl) ; + exit (1) ; + } + } + } + + puts ("ok") ; + + free (buffer) ; +} /* test_nms_adpcm_16 */ + +void +test_nms_adpcm (void) +{ test_nms_adpcm_32 () ; + test_nms_adpcm_24 () ; + test_nms_adpcm_16 () ; +} /* main */ + diff --git a/libsndfile-1.0.31/src/test_strncpy_crlf.c b/libsndfile-1.0.31/src/test_strncpy_crlf.c new file mode 100644 index 0000000..f21addc --- /dev/null +++ b/libsndfile-1.0.31/src/test_strncpy_crlf.c @@ -0,0 +1,59 @@ +/* +** Copyright (C) 2010-2012 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include + +#include "common.h" + +#include "test_main.h" + +void +test_psf_strlcpy_crlf (void) +{ const char *src = "a\nb\nc\n" ; + char *dest ; + int dest_len ; + + print_test_name ("Testing psf_strlcpy_crlf") ; + + for (dest_len = 3 ; dest_len < 30 ; dest_len++) + { dest = calloc (1, dest_len + 1) ; + if (dest == NULL) + { printf ("\n\nLine %d: calloc failed!\n\n", __LINE__) ; + exit (1) ; + } ; + + /* This value needs to be a in the [0, 127] range to avoid tripping up + ** compiles like Sun Studio 12.* + */ + dest [dest_len] = '\x5a' ; + + psf_strlcpy_crlf (dest, src, dest_len, sizeof (*src)) ; + + if (dest [dest_len] != '\x5a') + { printf ("\n\nLine %d: buffer overrun for dest_len == %d\n\n", __LINE__, dest_len) ; + exit (1) ; + } ; + + free (dest) ; + } ; + + puts ("ok") ; +} /* test_psf_strlcpy_crlf */ diff --git a/libsndfile-1.0.31/src/txw.c b/libsndfile-1.0.31/src/txw.c new file mode 100644 index 0000000..16525df --- /dev/null +++ b/libsndfile-1.0.31/src/txw.c @@ -0,0 +1,377 @@ +/* +** Copyright (C) 2002-2012 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +/*=========================================================================== +** Yamaha TX16 Sampler Files. +** +** This header parser was written using information from the SoX source code +** and trial and error experimentation. The code here however is all original. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +#if (ENABLE_EXPERIMENTAL_CODE == 0) + +int +txw_open (SF_PRIVATE *psf) +{ if (psf) + return SFE_UNIMPLEMENTED ; + return 0 ; +} /* txw_open */ + +#else + +/*------------------------------------------------------------------------------ +** Markers. +*/ + +#define TXW_DATA_OFFSET 32 + +#define TXW_LOOPED 0x49 +#define TXW_NO_LOOP 0xC9 + +/*------------------------------------------------------------------------------ +** Private static functions. +*/ + +static int txw_read_header (SF_PRIVATE *psf) ; + +static sf_count_t txw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t txw_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t txw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t txw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t txw_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; + +/*------------------------------------------------------------------------------ +** Public functions. +*/ + +/* + * ftp://ftp.t0.or.at/pub/sound/tx16w/samples.yamaha + * ftp://ftp.t0.or.at/pub/sound/tx16w/faq/tx16w.tec + * http://www.t0.or.at/~mpakesch/tx16w/ + * + * from tx16w.c sox 12.15: (7-Oct-98) (Mark Lakata and Leigh Smith) + * char filetype[6] "LM8953" + * nulls[10], + * dummy_aeg[6] + * format 0x49 = looped, 0xC9 = non-looped + * sample_rate 1 = 33 kHz, 2 = 50 kHz, 3 = 16 kHz + * atc_length[3] if sample rate 0, [2]&0xfe = 6: 33kHz, 0x10:50, 0xf6: 16, + * depending on [5] but to heck with it + * rpt_length[3] (these are for looped samples, attack and loop lengths) + * unused[2] + */ + +typedef struct +{ unsigned char format, srate, sr2, sr3 ; + unsigned short srhash ; + unsigned int attacklen, repeatlen ; +} TXW_HEADER ; + +#define ERROR_666 666 + +int +txw_open (SF_PRIVATE *psf) +{ int error ; + + if (psf->file.mode != SFM_READ) + return SFE_UNIMPLEMENTED ; + + if ((error = txw_read_header (psf))) + return error ; + + if (psf_fseek (psf, psf->dataoffset, SEEK_SET) != psf->dataoffset) + return SFE_BAD_SEEK ; + + psf->read_short = txw_read_s ; + psf->read_int = txw_read_i ; + psf->read_float = txw_read_f ; + psf->read_double = txw_read_d ; + + psf->seek = txw_seek ; + + return 0 ; +} /* txw_open */ + +/*------------------------------------------------------------------------------ +*/ + +static int +txw_read_header (SF_PRIVATE *psf) +{ BUF_UNION ubuf ; + TXW_HEADER txwh ; + const char *strptr ; + + memset (&txwh, 0, sizeof (txwh)) ; + memset (ubuf.cbuf, 0, sizeof (ubuf.cbuf)) ; + psf_binheader_readf (psf, "pb", 0, ubuf.cbuf, 16) ; + + if (memcmp (ubuf.cbuf, "LM8953\0\0\0\0\0\0\0\0\0\0", 16) != 0) + return ERROR_666 ; + + psf_log_printf (psf, "Read only : Yamaha TX-16 Sampler (.txw)\nLM8953\n") ; + + /* Jump 6 bytes (dummp_aeg), read format, read sample rate. */ + psf_binheader_readf (psf, "j11", 6, &txwh.format, &txwh.srate) ; + + /* 8 bytes (atc_length[3], rpt_length[3], unused[2]). */ + psf_binheader_readf (psf, "e33j", &txwh.attacklen, &txwh.repeatlen, 2) ; + txwh.sr2 = (txwh.attacklen >> 16) & 0xFE ; + txwh.sr3 = (txwh.repeatlen >> 16) & 0xFE ; + txwh.attacklen &= 0x1FFFF ; + txwh.repeatlen &= 0x1FFFF ; + + switch (txwh.format) + { case TXW_LOOPED : + strptr = "looped" ; + break ; + + case TXW_NO_LOOP : + strptr = "non-looped" ; + break ; + + default : + psf_log_printf (psf, " Format : 0x%02x => ?????\n", txwh.format) ; + return ERROR_666 ; + } ; + + psf_log_printf (psf, " Format : 0x%02X => %s\n", txwh.format, strptr) ; + + strptr = NULL ; + + switch (txwh.srate) + { case 1 : + psf->sf.samplerate = 33333 ; + break ; + + case 2 : + psf->sf.samplerate = 50000 ; + break ; + + case 3 : + psf->sf.samplerate = 16667 ; + break ; + + default : + /* This is ugly and braindead. */ + txwh.srhash = ((txwh.sr2 & 0xFE) << 8) | (txwh.sr3 & 0xFE) ; + switch (txwh.srhash) + { case ((0x6 << 8) | 0x52) : + psf->sf.samplerate = 33333 ; + break ; + + case ((0x10 << 8) | 0x52) : + psf->sf.samplerate = 50000 ; + break ; + + case ((0xF6 << 8) | 0x52) : + psf->sf.samplerate = 166667 ; + break ; + + default : + strptr = " Sample Rate : Unknown : forcing to 33333\n" ; + psf->sf.samplerate = 33333 ; + break ; + } ; + } ; + + + if (strptr) + psf_log_printf (psf, strptr) ; + else if (txwh.srhash) + psf_log_printf (psf, " Sample Rate : %d (0x%X) => %d\n", txwh.srate, txwh.srhash, psf->sf.samplerate) ; + else + psf_log_printf (psf, " Sample Rate : %d => %d\n", txwh.srate, psf->sf.samplerate) ; + + if (txwh.format == TXW_LOOPED) + { psf_log_printf (psf, " Attack Len : %d\n", txwh.attacklen) ; + psf_log_printf (psf, " Repeat Len : %d\n", txwh.repeatlen) ; + } ; + + psf->dataoffset = TXW_DATA_OFFSET ; + psf->datalength = psf->filelength - TXW_DATA_OFFSET ; + psf->sf.frames = 2 * psf->datalength / 3 ; + + + if (psf->datalength % 3 == 1) + psf_log_printf (psf, "*** File seems to be truncated, %d extra bytes.\n", + (int) (psf->datalength % 3)) ; + + if (txwh.attacklen + txwh.repeatlen > psf->sf.frames) + psf_log_printf (psf, "*** File has been truncated.\n") ; + + psf->sf.format = SF_FORMAT_TXW | SF_FORMAT_PCM_16 ; + psf->sf.channels = 1 ; + psf->sf.sections = 1 ; + psf->sf.seekable = SF_TRUE ; + + return 0 ; +} /* txw_read_header */ + +static sf_count_t +txw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + unsigned char *ucptr ; + short sample ; + int k, bufferlen, readcount, count ; + sf_count_t total = 0 ; + + bufferlen = sizeof (ubuf.cbuf) / 3 ; + bufferlen -= (bufferlen & 1) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = psf_fread (ubuf.cbuf, 3, readcount, psf) ; + + ucptr = ubuf.ucbuf ; + for (k = 0 ; k < readcount ; k += 2) + { sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ; + ptr [total + k] = sample ; + sample = (ucptr [2] << 8) | ((ucptr [1] & 0xF) << 4) ; + ptr [total + k + 1] = sample ; + ucptr += 3 ; + } ; + + total += count ; + len -= readcount ; + } ; + + return total ; +} /* txw_read_s */ + +static sf_count_t +txw_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + unsigned char *ucptr ; + short sample ; + int k, bufferlen, readcount, count ; + sf_count_t total = 0 ; + + bufferlen = sizeof (ubuf.cbuf) / 3 ; + bufferlen -= (bufferlen & 1) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = psf_fread (ubuf.cbuf, 3, readcount, psf) ; + + ucptr = ubuf.ucbuf ; + for (k = 0 ; k < readcount ; k += 2) + { sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ; + ptr [total + k] = sample << 16 ; + sample = (ucptr [2] << 8) | ((ucptr [1] & 0xF) << 4) ; + ptr [total + k + 1] = sample << 16 ; + ucptr += 3 ; + } ; + + total += count ; + len -= readcount ; + } ; + + return total ; +} /* txw_read_i */ + +static sf_count_t +txw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + unsigned char *ucptr ; + short sample ; + int k, bufferlen, readcount, count ; + sf_count_t total = 0 ; + float normfact ; + + if (psf->norm_float == SF_TRUE) + normfact = 1.0 / 0x8000 ; + else + normfact = 1.0 / 0x10 ; + + bufferlen = sizeof (ubuf.cbuf) / 3 ; + bufferlen -= (bufferlen & 1) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = psf_fread (ubuf.cbuf, 3, readcount, psf) ; + + ucptr = ubuf.ucbuf ; + for (k = 0 ; k < readcount ; k += 2) + { sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ; + ptr [total + k] = normfact * sample ; + sample = (ucptr [2] << 8) | ((ucptr [1] & 0xF) << 4) ; + ptr [total + k + 1] = normfact * sample ; + ucptr += 3 ; + } ; + + total += count ; + len -= readcount ; + } ; + + return total ; +} /* txw_read_f */ + +static sf_count_t +txw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + unsigned char *ucptr ; + short sample ; + int k, bufferlen, readcount, count ; + sf_count_t total = 0 ; + double normfact ; + + if (psf->norm_double == SF_TRUE) + normfact = 1.0 / 0x8000 ; + else + normfact = 1.0 / 0x10 ; + + bufferlen = sizeof (ubuf.cbuf) / 3 ; + bufferlen -= (bufferlen & 1) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : len ; + count = psf_fread (ubuf.cbuf, 3, readcount, psf) ; + + ucptr = ubuf.ucbuf ; + for (k = 0 ; k < readcount ; k += 2) + { sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ; + ptr [total + k] = normfact * sample ; + sample = (ucptr [2] << 8) | ((ucptr [1] & 0xF) << 4) ; + ptr [total + k + 1] = normfact * sample ; + ucptr += 3 ; + } ; + + total += count ; + len -= readcount ; + } ; + + return total ; +} /* txw_read_d */ + +static sf_count_t +txw_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) +{ if (psf && mode) + return offset ; + + return 0 ; +} /* txw_seek */ + +#endif diff --git a/libsndfile-1.0.31/src/ulaw.c b/libsndfile-1.0.31/src/ulaw.c new file mode 100644 index 0000000..744e354 --- /dev/null +++ b/libsndfile-1.0.31/src/ulaw.c @@ -0,0 +1,1056 @@ +/* +** Copyright (C) 1999-2013 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include + +#include "sndfile.h" +#include "common.h" + +static sf_count_t ulaw_read_ulaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t ulaw_read_ulaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t ulaw_read_ulaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t ulaw_read_ulaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t ulaw_write_s2ulaw (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t ulaw_write_i2ulaw (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t ulaw_write_f2ulaw (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t ulaw_write_d2ulaw (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +int +ulaw_init (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR) + { psf->read_short = ulaw_read_ulaw2s ; + psf->read_int = ulaw_read_ulaw2i ; + psf->read_float = ulaw_read_ulaw2f ; + psf->read_double = ulaw_read_ulaw2d ; + } ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { psf->write_short = ulaw_write_s2ulaw ; + psf->write_int = ulaw_write_i2ulaw ; + psf->write_float = ulaw_write_f2ulaw ; + psf->write_double = ulaw_write_d2ulaw ; + } ; + + psf->bytewidth = 1 ; + psf->blockwidth = psf->sf.channels ; + + if (psf->filelength > psf->dataoffset) + psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : + psf->filelength - psf->dataoffset ; + else + psf->datalength = 0 ; + + psf->sf.frames = psf->blockwidth > 0 ? psf->datalength / psf->blockwidth : 0 ; + + return 0 ; +} /* ulaw_init */ + +/*============================================================================== +*/ + +static short ulaw_decode [256] = +{ -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956, + -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764, + -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412, + -11900, -11388, -10876, -10364, -9852, -9340, -8828, -8316, + -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140, + -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092, + -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004, + -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980, + -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436, + -1372, -1308, -1244, -1180, -1116, -1052, -988, -924, + -876, -844, -812, -780, -748, -716, -684, -652, + -620, -588, -556, -524, -492, -460, -428, -396, + -372, -356, -340, -324, -308, -292, -276, -260, + -244, -228, -212, -196, -180, -164, -148, -132, + -120, -112, -104, -96, -88, -80, -72, -64, + -56, -48, -40, -32, -24, -16, -8, 0, + + 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956, + 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764, + 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412, + 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316, + 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140, + 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092, + 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004, + 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980, + 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436, + 1372, 1308, 1244, 1180, 1116, 1052, 988, 924, + 876, 844, 812, 780, 748, 716, 684, 652, + 620, 588, 556, 524, 492, 460, 428, 396, + 372, 356, 340, 324, 308, 292, 276, 260, + 244, 228, 212, 196, 180, 164, 148, 132, + 120, 112, 104, 96, 88, 80, 72, 64, + 56, 48, 40, 32, 24, 16, 8, 0 +} ; + +static +unsigned char ulaw_encode [8193] = +{ 0xff, 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xfc, 0xfb, 0xfb, 0xfa, 0xfa, 0xf9, + 0xf9, 0xf8, 0xf8, 0xf7, 0xf7, 0xf6, 0xf6, 0xf5, 0xf5, 0xf4, 0xf4, 0xf3, + 0xf3, 0xf2, 0xf2, 0xf1, 0xf1, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xee, + 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xeb, + 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe5, + 0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe1, 0xe1, 0xe1, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xde, 0xde, 0xde, 0xde, 0xde, + 0xde, 0xde, 0xde, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, + 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xdb, 0xdb, 0xdb, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xd9, + 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, + 0xd8, 0xd8, 0xd8, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd6, + 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, + 0xd5, 0xd5, 0xd5, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd3, + 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, + 0xd2, 0xd2, 0xd2, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd0, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, + 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xce, + 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, + 0xce, 0xce, 0xce, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, + 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, + 0xcb, 0xcb, 0xcb, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, + 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, + 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc8, + 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, + 0xc8, 0xc8, 0xc8, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, + 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc5, + 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, + 0xc5, 0xc5, 0xc5, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, + 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc2, + 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, + 0xc2, 0xc2, 0xc2, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xbe, 0xbe, 0xbe, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbc, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, + 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb8, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb2, 0xb2, 0xb2, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa5, + 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, + 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, + 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, + 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, + 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, + 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa2, 0xa2, 0xa2, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, + 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, + 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, + 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, + 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, + 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0x9f, + 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, + 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, + 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, + 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, + 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, + 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, + 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, + 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, + 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, + 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, + 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, + 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, + 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, + 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, + 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, + 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, + 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, + 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, + 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, + 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, + 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, + 0x9e, 0x9e, 0x9e, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, + 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, + 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, + 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, + 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, + 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, + 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, + 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, + 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, + 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, + 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9c, + 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, + 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, + 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, + 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, + 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, + 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, + 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, + 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, + 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, + 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, + 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, + 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, + 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, + 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, + 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, + 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, + 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, + 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, + 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, + 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, + 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, + 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, + 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, + 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, + 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, + 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, + 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, + 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, + 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, + 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, + 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, + 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, 0x98, 0x98, + 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, + 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, + 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, + 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, + 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, + 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, + 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, + 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, + 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, + 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, + 0x98, 0x98, 0x98, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, + 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, + 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, + 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, + 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, + 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, + 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, + 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, + 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, + 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, + 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, + 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, + 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, + 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, + 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, + 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, + 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, + 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, + 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, + 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, + 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, + 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x95, 0x95, 0x95, 0x95, 0x95, + 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, + 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, + 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, + 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, + 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, + 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, + 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, + 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, + 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, + 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, + 0x95, 0x95, 0x95, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, + 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, + 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, + 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, + 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, + 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, + 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, + 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, + 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, + 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, + 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x93, + 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, + 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, + 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, + 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, + 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, + 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, + 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, + 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, + 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, + 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, + 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, + 0x92, 0x92, 0x92, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, + 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, + 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, + 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, + 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, + 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, + 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, + 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, + 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, + 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, + 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 +} ; + +static inline void +ulaw2s_array (unsigned char *buffer, int count, short *ptr) +{ while (--count >= 0) + ptr [count] = ulaw_decode [(int) buffer [count]] ; +} /* ulaw2s_array */ + +static inline void +ulaw2i_array (unsigned char *buffer, int count, int *ptr) +{ while (--count >= 0) + ptr [count] = ((uint32_t) ulaw_decode [buffer [count]]) << 16 ; +} /* ulaw2i_array */ + +static inline void +ulaw2f_array (unsigned char *buffer, int count, float *ptr, float normfact) +{ while (--count >= 0) + ptr [count] = normfact * ulaw_decode [(int) buffer [count]] ; +} /* ulaw2f_array */ + +static inline void +ulaw2d_array (const unsigned char *buffer, int count, double *ptr, double normfact) +{ while (--count >= 0) + ptr [count] = normfact * ulaw_decode [(int) buffer [count]] ; +} /* ulaw2d_array */ + +static inline void +s2ulaw_array (const short *ptr, int count, unsigned char *buffer) +{ while (--count >= 0) + { if (ptr [count] >= 0) + buffer [count] = ulaw_encode [ptr [count] / 4] ; + else + buffer [count] = 0x7F & ulaw_encode [ptr [count] / -4] ; + } ; +} /* s2ulaw_array */ + +static inline void +i2ulaw_array (const int *ptr, int count, unsigned char *buffer) +{ while (--count >= 0) + { if (ptr [count] == INT_MIN) + buffer [count] = ulaw_encode [INT_MAX >> (16 + 2)] ; + else if (ptr [count] >= 0) + buffer [count] = ulaw_encode [ptr [count] >> (16 + 2)] ; + else + buffer [count] = 0x7F & ulaw_encode [-ptr [count] >> (16 + 2)] ; + } ; +} /* i2ulaw_array */ + +static inline void +f2ulaw_array (const float *ptr, int count, unsigned char *buffer, float normfact) +{ while (--count >= 0) + { if (ptr [count] >= 0) + buffer [count] = ulaw_encode [psf_lrintf (normfact * ptr [count])] ; + else + buffer [count] = 0x7F & ulaw_encode [- psf_lrintf (normfact * ptr [count])] ; + } ; +} /* f2ulaw_array */ + +static inline void +d2ulaw_array (const double *ptr, int count, unsigned char *buffer, double normfact) +{ while (--count >= 0) + { if (!isfinite (ptr [count])) + buffer [count] = 0 ; + else if (ptr [count] >= 0) + buffer [count] = ulaw_encode [psf_lrint (normfact * ptr [count])] ; + else + buffer [count] = 0x7F & ulaw_encode [- psf_lrint (normfact * ptr [count])] ; + } ; +} /* d2ulaw_array */ + +/*============================================================================== +*/ + +static sf_count_t +ulaw_read_ulaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ; + ulaw2s_array (ubuf.ucbuf, readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* ulaw_read_ulaw2s */ + +static sf_count_t +ulaw_read_ulaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ; + ulaw2i_array (ubuf.ucbuf, readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* ulaw_read_ulaw2i */ + +static sf_count_t +ulaw_read_ulaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + float normfact ; + + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ; + ulaw2f_array (ubuf.ucbuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* ulaw_read_ulaw2f */ + +static sf_count_t +ulaw_read_ulaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + double normfact ; + + normfact = (psf->norm_double) ? 1.0 / ((double) 0x8000) : 1.0 ; + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.ucbuf, 1, bufferlen, psf) ; + ulaw2d_array (ubuf.ucbuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* ulaw_read_ulaw2d */ + +/*============================================================================================= +*/ + +static sf_count_t +ulaw_write_s2ulaw (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + s2ulaw_array (ptr + total, bufferlen, ubuf.ucbuf) ; + writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* ulaw_write_s2ulaw */ + +static sf_count_t +ulaw_write_i2ulaw (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + i2ulaw_array (ptr + total, bufferlen, ubuf.ucbuf) ; + writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* ulaw_write_i2ulaw */ + +static sf_count_t +ulaw_write_f2ulaw (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + float normfact ; + + /* Factor in a divide by 4. */ + normfact = (psf->norm_float == SF_TRUE) ? (0.25 * 0x7FFF) : 0.25 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + f2ulaw_array (ptr + total, bufferlen, ubuf.ucbuf, normfact) ; + writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* ulaw_write_f2ulaw */ + +static sf_count_t +ulaw_write_d2ulaw (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + double normfact ; + + /* Factor in a divide by 4. */ + normfact = (psf->norm_double) ? (0.25 * 0x7FFF) : 0.25 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + d2ulaw_array (ptr + total, bufferlen, ubuf.ucbuf, normfact) ; + writecount = psf_fwrite (ubuf.ucbuf, 1, bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* ulaw_write_d2ulaw */ + diff --git a/libsndfile-1.0.31/src/version-metadata.rc b/libsndfile-1.0.31/src/version-metadata.rc new file mode 100644 index 0000000..ef804eb --- /dev/null +++ b/libsndfile-1.0.31/src/version-metadata.rc @@ -0,0 +1,31 @@ +#include + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS +1 VERSIONINFO + FILEVERSION 1,0,31,0 + PRODUCTVERSION 1,0,31,0 + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE VFT2_UNKNOWN + FILEFLAGSMASK 0x00000000 + FILEFLAGS 0x00000000 +{ + BLOCK "StringFileInfo" + { + BLOCK "040904e4" + { + VALUE "FileDescription", "A library for reading and writing audio files." + VALUE "FileVersion", ".0\0" + VALUE "Full Version", "1.0.31" + VALUE "InternalName", "libsndfile" + VALUE "LegalCopyright", "Copyright (C) 1999-2012, Licensed LGPL" + VALUE "ProductName", "libsndfile-1 DLL" + VALUE "ProductVersion", ".0\0" + VALUE "Language", "Language Neutral" + } + } + BLOCK "VarFileInfo" + { + VALUE "Translation", 0x0409, 0x04E4 + } +} diff --git a/libsndfile-1.0.31/src/version-metadata.rc.in b/libsndfile-1.0.31/src/version-metadata.rc.in new file mode 100644 index 0000000..a672e4b --- /dev/null +++ b/libsndfile-1.0.31/src/version-metadata.rc.in @@ -0,0 +1,31 @@ +#include + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS +1 VERSIONINFO + FILEVERSION @WIN_RC_VERSION@,0 + PRODUCTVERSION @WIN_RC_VERSION@,0 + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE VFT2_UNKNOWN + FILEFLAGSMASK 0x00000000 + FILEFLAGS 0x00000000 +{ + BLOCK "StringFileInfo" + { + BLOCK "040904e4" + { + VALUE "FileDescription", "A library for reading and writing audio files." + VALUE "FileVersion", "@CLEAN_VERSION@.0\0" + VALUE "Full Version", "@PACKAGE_VERSION@" + VALUE "InternalName", "libsndfile" + VALUE "LegalCopyright", "Copyright (C) 1999-2012, Licensed LGPL" + VALUE "ProductName", "libsndfile-1 DLL" + VALUE "ProductVersion", "@CLEAN_VERSION@.0\0" + VALUE "Language", "Language Neutral" + } + } + BLOCK "VarFileInfo" + { + VALUE "Translation", 0x0409, 0x04E4 + } +} diff --git a/libsndfile-1.0.31/src/voc.c b/libsndfile-1.0.31/src/voc.c new file mode 100644 index 0000000..380d3a3 --- /dev/null +++ b/libsndfile-1.0.31/src/voc.c @@ -0,0 +1,883 @@ +/* +** Copyright (C) 2001-2018 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +/* RANT: +** The VOC file format is the most brain damaged format I have yet had to deal +** with. No one programmer could have bee stupid enough to put this together. +** Instead it looks like a series of manic, dyslexic assembly language programmers +** hacked it to fit their needs. +** Utterly woeful. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + + +/*------------------------------------------------------------------------------ + * Typedefs for file chunks. +*/ + +#define VOC_MAX_SECTIONS 200 + +enum +{ VOC_TERMINATOR = 0, + VOC_SOUND_DATA = 1, + VOC_SOUND_CONTINUE = 2, + VOC_SILENCE = 3, + VOC_MARKER = 4, + VOC_ASCII = 5, + VOC_REPEAT = 6, + VOC_END_REPEAT = 7, + VOC_EXTENDED = 8, + VOC_EXTENDED_II = 9 +} ; + +typedef struct +{ int samples ; + int offset ; /* Offset of zero => silence. */ +} SND_DATA_BLOCKS ; + +typedef struct +{ unsigned int sections, section_types ; + int samplerate, channels, bitwidth ; + SND_DATA_BLOCKS blocks [VOC_MAX_SECTIONS] ; +} VOC_DATA ; + +/*------------------------------------------------------------------------------ + * Private static functions. +*/ + +static int voc_close (SF_PRIVATE *psf) ; +static int voc_write_header (SF_PRIVATE *psf, int calc_length) ; +static int voc_read_header (SF_PRIVATE *psf) ; + +static const char* voc_encoding2str (int encoding) ; + +#if 0 + +/* These functions would be required for files with more than one VOC_SOUND_DATA +** segment. Not sure whether to bother implementing this. +*/ + +static int voc_multi_init (SF_PRIVATE *psf, VOC_DATA *pvoc) ; + +static int voc_multi_read_uc2s (SF_PRIVATE *psf, short *ptr, int len) ; +static int voc_multi_read_les2s (SF_PRIVATE *psf, short *ptr, int len) ; + +static int voc_multi_read_uc2i (SF_PRIVATE *psf, int *ptr, int len) ; +static int voc_multi_read_les2i (SF_PRIVATE *psf, int *ptr, int len) ; + +static int voc_multi_read_uc2f (SF_PRIVATE *psf, float *ptr, int len) ; +static int voc_multi_read_les2f (SF_PRIVATE *psf, float *ptr, int len) ; + +static int voc_multi_read_uc2d (SF_PRIVATE *psf, double *ptr, int len) ; +static int voc_multi_read_les2d (SF_PRIVATE *psf, double *ptr, int len) ; +#endif + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +voc_open (SF_PRIVATE *psf) +{ int subformat, error = 0 ; + + if (psf->is_pipe) + return SFE_VOC_NO_PIPE ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = voc_read_header (psf))) + return error ; + } ; + + subformat = SF_CODEC (psf->sf.format) ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_VOC) + return SFE_BAD_OPEN_FORMAT ; + + psf->endian = SF_ENDIAN_LITTLE ; + + if ((error = voc_write_header (psf, SF_FALSE))) + return error ; + + psf->write_header = voc_write_header ; + } ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + + psf->container_close = voc_close ; + + switch (subformat) + { case SF_FORMAT_PCM_U8 : + case SF_FORMAT_PCM_16 : + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_ALAW : + error = alaw_init (psf) ; + break ; + + case SF_FORMAT_ULAW : + error = ulaw_init (psf) ; + break ; + + default : return SFE_UNIMPLEMENTED ; + } ; + + return error ; +} /* voc_open */ + +/*------------------------------------------------------------------------------ +*/ + +static int +voc_read_header (SF_PRIVATE *psf) +{ VOC_DATA *pvoc ; + char creative [20] ; + unsigned char block_type, rate_byte ; + short version, checksum, encoding, dataoffset ; + int offset ; + + /* Set position to start of file to begin reading header. */ + offset = psf_binheader_readf (psf, "pb", 0, creative, SIGNED_SIZEOF (creative)) ; + + if (creative [sizeof (creative) - 1] != 0x1A) + return SFE_VOC_NO_CREATIVE ; + + /* Terminate the string. */ + creative [sizeof (creative) - 1] = 0 ; + + if (strcmp ("Creative Voice File", creative)) + return SFE_VOC_NO_CREATIVE ; + + psf_log_printf (psf, "%s\n", creative) ; + + offset += psf_binheader_readf (psf, "e222", &dataoffset, &version, &checksum) ; + + psf->dataoffset = dataoffset ; + + psf_log_printf (psf, "dataoffset : %d\n" + "version : 0x%X\n" + "checksum : 0x%X\n", psf->dataoffset, version, checksum) ; + + if (version != 0x010A && version != 0x0114) + return SFE_VOC_BAD_VERSION ; + + if (! (psf->codec_data = malloc (sizeof (VOC_DATA)))) + return SFE_MALLOC_FAILED ; + + pvoc = (VOC_DATA*) psf->codec_data ; + + memset (pvoc, 0, sizeof (VOC_DATA)) ; + + /* Set the default encoding now. */ + psf->sf.format = SF_FORMAT_VOC ; /* Major format */ + encoding = SF_FORMAT_PCM_U8 ; /* Minor format */ + psf->endian = SF_ENDIAN_LITTLE ; + + while (1) + { char header [256] ; + unsigned size ; + short count ; + + block_type = 0 ; + offset += psf_binheader_readf (psf, "1", &block_type) ; + + switch (block_type) + { case VOC_ASCII : + offset += psf_binheader_readf (psf, "e3", &size) ; + + psf_log_printf (psf, " ASCII : %d\n", size) ; + + if (size < sizeof (header) - 1) + { offset += psf_binheader_readf (psf, "b", header, size) ; + header [size] = 0 ; + psf_log_printf (psf, " text : %s\n", header) ; + continue ; + } + + offset += psf_binheader_readf (psf, "j", size) ; + continue ; + + case VOC_REPEAT : + offset += psf_binheader_readf (psf, "e32", &size, &count) ; + psf_log_printf (psf, " Repeat : %d\n", count) ; + continue ; + + case VOC_SOUND_DATA : + case VOC_EXTENDED : + case VOC_EXTENDED_II : + break ; + + default : psf_log_printf (psf, "*** Weird block marker (%d)\n", block_type) ; + } ; + + break ; + } ; + + if (block_type == VOC_SOUND_DATA) + { unsigned char compression ; + int size ; + + offset += psf_binheader_readf (psf, "e311", &size, &rate_byte, &compression) ; + + psf->sf.samplerate = 1000000 / (256 - (rate_byte & 0xFF)) ; + + psf_log_printf (psf, " Sound Data : %d\n sr : %d => %dHz\n comp : %d\n", + size, rate_byte, psf->sf.samplerate, compression) ; + + if (offset + size - 1 > psf->filelength) + { psf_log_printf (psf, "Seems to be a truncated file.\n") ; + psf_log_printf (psf, "offset: %d size: %d sum: %d filelength: %D\n", offset, size, offset + size, psf->filelength) ; + return SFE_VOC_BAD_SECTIONS ; + } + else if (psf->filelength - offset - size > 4) + { psf_log_printf (psf, "Seems to be a multi-segment file (#1).\n") ; + psf_log_printf (psf, "offset: %d size: %d sum: %d filelength: %D\n", offset, size, offset + size, psf->filelength) ; + return SFE_VOC_BAD_SECTIONS ; + } ; + + psf->dataoffset = offset ; + psf->dataend = psf->filelength - 1 ; + + psf->sf.channels = 1 ; + psf->bytewidth = 1 ; + + psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_PCM_U8 ; + + return 0 ; + } ; + + if (block_type == VOC_EXTENDED) + { unsigned char pack, stereo, compression ; + unsigned short rate_short ; + int size ; + + offset += psf_binheader_readf (psf, "e3211", &size, &rate_short, &pack, &stereo) ; + + psf_log_printf (psf, " Extended : %d\n", size) ; + if (size == 4) + psf_log_printf (psf, " size : 4\n") ; + else + psf_log_printf (psf, " size : %d (should be 4)\n", size) ; + + psf_log_printf (psf, " pack : %d\n" + " stereo : %s\n", pack, (stereo ? "yes" : "no")) ; + + if (stereo) + { psf->sf.channels = 2 ; + psf->sf.samplerate = 128000000 / (65536 - rate_short) ; + } + else + { psf->sf.channels = 1 ; + psf->sf.samplerate = 256000000 / (65536 - rate_short) ; + } ; + + psf_log_printf (psf, " sr : %d => %dHz\n", (rate_short & 0xFFFF), psf->sf.samplerate) ; + + offset += psf_binheader_readf (psf, "1", &block_type) ; + + if (block_type != VOC_SOUND_DATA) + { psf_log_printf (psf, "*** Expecting VOC_SOUND_DATA section.\n") ; + return SFE_VOC_BAD_FORMAT ; + } ; + + offset += psf_binheader_readf (psf, "e311", &size, &rate_byte, &compression) ; + + psf_log_printf (psf, " Sound Data : %d\n" + " sr : %d\n" + " comp : %d\n", size, rate_byte, compression) ; + + + if (offset + size - 1 > psf->filelength) + { psf_log_printf (psf, "Seems to be a truncated file.\n") ; + psf_log_printf (psf, "offset: %d size: %d sum: %d filelength: %D\n", offset, size, offset + size, psf->filelength) ; + return SFE_VOC_BAD_SECTIONS ; + } + else if (offset + size - 1 < psf->filelength) + { psf_log_printf (psf, "Seems to be a multi-segment file (#2).\n") ; + psf_log_printf (psf, "offset: %d size: %d sum: %d filelength: %D\n", offset, size, offset + size, psf->filelength) ; + return SFE_VOC_BAD_SECTIONS ; + } ; + + psf->dataoffset = offset ; + psf->dataend = psf->filelength - 1 ; + + psf->bytewidth = 1 ; + + psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_PCM_U8 ; + + return 0 ; + } + + if (block_type == VOC_EXTENDED_II) + { unsigned char bitwidth, channels ; + int size, fourbytes ; + + offset += psf_binheader_readf (psf, "e341124", &size, &psf->sf.samplerate, + &bitwidth, &channels, &encoding, &fourbytes) ; + + if (size * 2 == psf->filelength - 39) + { int temp_size = psf->filelength - 31 ; + + psf_log_printf (psf, " Extended II : %d (SoX bug: should be %d)\n", size, temp_size) ; + size = temp_size ; + } + else + psf_log_printf (psf, " Extended II : %d\n", size) ; + + psf_log_printf (psf, " sample rate : %d\n" + " bit width : %d\n" + " channels : %d\n", psf->sf.samplerate, bitwidth, channels) ; + + if (bitwidth == 16 && encoding == 0) + { encoding = 4 ; + psf_log_printf (psf, " encoding : 0 (SoX bug: should be 4 for 16 bit signed PCM)\n") ; + } + else + psf_log_printf (psf, " encoding : %d => %s\n", encoding, voc_encoding2str (encoding)) ; + + + psf_log_printf (psf, " fourbytes : %X\n", fourbytes) ; + + psf->sf.channels = channels ; + + psf->dataoffset = offset ; + psf->dataend = psf->filelength - 1 ; + + if (size + 31 == psf->filelength + 1) + { /* Hack for reading files produced using + ** sf_command (SFC_UPDATE_HEADER_NOW). + */ + psf_log_printf (psf, "Missing zero byte at end of file.\n") ; + size = psf->filelength - 30 ; + psf->dataend = 0 ; + } + else if (size + 31 > psf->filelength) + { psf_log_printf (psf, "Seems to be a truncated file.\n") ; + size = psf->filelength - 31 ; + } + else if (size + 31 < psf->filelength) + psf_log_printf (psf, "Seems to be a multi-segment file (#3).\n") ; + + switch (encoding) + { case 0 : + psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_PCM_U8 ; + psf->bytewidth = 1 ; + break ; + + case 4 : + psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_PCM_16 ; + psf->bytewidth = 2 ; + break ; + + case 6 : + psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_ALAW ; + psf->bytewidth = 1 ; + break ; + + case 7 : + psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_ULAW ; + psf->bytewidth = 1 ; + break ; + + default : /* Unknown */ + return SFE_VOC_BAD_FORMAT ; + break ; + } ; + + } ; + + return 0 ; +} /* voc_read_header */ + +/*==================================================================================== +*/ + +static int +voc_write_header (SF_PRIVATE *psf, int calc_length) +{ sf_count_t current ; + int rate_const, subformat ; + + current = psf_ftell (psf) ; + + if (calc_length) + { psf->filelength = psf_get_filelen (psf) ; + + psf->datalength = psf->filelength - psf->dataoffset ; + if (psf->dataend) + psf->datalength -= psf->filelength - psf->dataend ; + + psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; + } ; + + subformat = SF_CODEC (psf->sf.format) ; + /* Reset the current header length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + psf_fseek (psf, 0, SEEK_SET) ; + + /* VOC marker and 0x1A byte. */ + psf_binheader_writef (psf, "eb1", BHWv ("Creative Voice File"), BHWz (19), BHW1 (0x1A)) ; + + /* Data offset, version and other. */ + psf_binheader_writef (psf, "e222", BHW2 (26), BHW2 (0x0114), BHW2 (0x111F)) ; + + /* Use same logic as SOX. + ** If the file is mono 8 bit data, use VOC_SOUND_DATA. + ** If the file is mono 16 bit data, use VOC_EXTENED. + ** Otherwise use VOC_EXTENED_2. + */ + + if (subformat == SF_FORMAT_PCM_U8 && psf->sf.channels == 1) + { /* samplerate = 1000000 / (256 - rate_const) ; */ + rate_const = 256 - 1000000 / psf->sf.samplerate ; + + /* First type marker, length, rate_const and compression */ + psf_binheader_writef (psf, "e1311", BHW1 (VOC_SOUND_DATA), BHW3 ((int) (psf->datalength + 1)), BHW1 (rate_const), BHW1 (0)) ; + } + else if (subformat == SF_FORMAT_PCM_U8 && psf->sf.channels == 2) + { /* sample_rate = 128000000 / (65536 - rate_short) ; */ + rate_const = 65536 - 128000000 / psf->sf.samplerate ; + + /* First write the VOC_EXTENDED section + ** marker, length, rate_const and compression + */ + psf_binheader_writef (psf, "e13211", BHW1 (VOC_EXTENDED), BHW3 (4), BHW2 (rate_const), BHW1 (0), BHW1 (1)) ; + + /* samplerate = 1000000 / (256 - rate_const) ; */ + rate_const = 256 - 1000000 / psf->sf.samplerate ; + + /* Now write the VOC_SOUND_DATA section + ** marker, length, rate_const and compression + */ + psf_binheader_writef (psf, "e1311", BHW1 (VOC_SOUND_DATA), BHW3 ((int) (psf->datalength + 1)), BHW1 (rate_const), BHW1 (0)) ; + } + else + { int length ; + + if (psf->sf.channels < 1 || psf->sf.channels > 2) + return SFE_CHANNEL_COUNT ; + + switch (subformat) + { case SF_FORMAT_PCM_U8 : + psf->bytewidth = 1 ; + length = psf->sf.frames * psf->sf.channels * psf->bytewidth + 12 ; + /* Marker, length, sample rate, bitwidth, stereo flag, encoding and fourt zero bytes. */ + psf_binheader_writef (psf, "e1341124", BHW1 (VOC_EXTENDED_II), BHW3 (length), BHW4 (psf->sf.samplerate), BHW1 (16), BHW1 (psf->sf.channels), BHW2 (4), BHW4 (0)) ; + break ; + + case SF_FORMAT_PCM_16 : + psf->bytewidth = 2 ; + length = psf->sf.frames * psf->sf.channels * psf->bytewidth + 12 ; + /* Marker, length, sample rate, bitwidth, stereo flag, encoding and fourt zero bytes. */ + psf_binheader_writef (psf, "e1341124", BHW1 (VOC_EXTENDED_II), BHW3 (length), BHW4 (psf->sf.samplerate), BHW1 (16), BHW1 (psf->sf.channels), BHW2 (4), BHW4 (0)) ; + break ; + + case SF_FORMAT_ALAW : + psf->bytewidth = 1 ; + length = psf->sf.frames * psf->sf.channels * psf->bytewidth + 12 ; + psf_binheader_writef (psf, "e1341124", BHW1 (VOC_EXTENDED_II), BHW3 (length), BHW4 (psf->sf.samplerate), BHW1 (8), BHW1 (psf->sf.channels), BHW2 (6), BHW4 (0)) ; + break ; + + case SF_FORMAT_ULAW : + psf->bytewidth = 1 ; + length = psf->sf.frames * psf->sf.channels * psf->bytewidth + 12 ; + psf_binheader_writef (psf, "e1341124", BHW1 (VOC_EXTENDED_II), BHW3 (length), BHW4 (psf->sf.samplerate), BHW1 (8), BHW1 (psf->sf.channels), BHW2 (7), BHW4 (0)) ; + break ; + + default : return SFE_UNIMPLEMENTED ; + } ; + } ; + + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + if (psf->error) + return psf->error ; + + psf->dataoffset = psf->header.indx ; + + if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + + return psf->error ; +} /* voc_write_header */ + +static int +voc_close (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { /* Now we know for certain the length of the file we can re-write + ** correct values for the FORM, 8SVX and BODY chunks. + */ + unsigned char byte = VOC_TERMINATOR ; + + + psf_fseek (psf, 0, SEEK_END) ; + + /* Write terminator */ + psf_fwrite (&byte, 1, 1, psf) ; + + voc_write_header (psf, SF_TRUE) ; + } ; + + return 0 ; +} /* voc_close */ + +static const char* +voc_encoding2str (int encoding) +{ + switch (encoding) + { case 0 : return "8 bit unsigned PCM" ; + case 4 : return "16 bit signed PCM" ; + case 6 : return "A-law" ; + case 7 : return "u-law" ; + default : break ; + } + return "*** Unknown ***" ; +} /* voc_encoding2str */ + +/*==================================================================================== +*/ + +#if 0 +static int +voc_multi_init (SF_PRIVATE *psf, VOC_DATA *pvoc) +{ + psf->sf.frames = 0 ; + + if (pvoc->bitwidth == 8) + { psf->read_short = voc_multi_read_uc2s ; + psf->read_int = voc_multi_read_uc2i ; + psf->read_float = voc_multi_read_uc2f ; + psf->read_double = voc_multi_read_uc2d ; + return 0 ; + } ; + + if (pvoc->bitwidth == 16) + { psf->read_short = voc_multi_read_les2s ; + psf->read_int = voc_multi_read_les2i ; + psf->read_float = voc_multi_read_les2f ; + psf->read_double = voc_multi_read_les2d ; + return 0 ; + } ; + + psf_log_printf (psf, "Error : bitwith != 8 && bitwidth != 16.\n") ; + + return SFE_UNIMPLEMENTED ; +} /* voc_multi_read_int */ + +/*------------------------------------------------------------------------------------ +*/ + +static int +voc_multi_read_uc2s (SF_PRIVATE *psf, short *ptr, int len) +{ + + return 0 ; +} /* voc_multi_read_uc2s */ + +static int +voc_multi_read_les2s (SF_PRIVATE *psf, short *ptr, int len) +{ + + return 0 ; +} /* voc_multi_read_les2s */ + + +static int +voc_multi_read_uc2i (SF_PRIVATE *psf, int *ptr, int len) +{ + + return 0 ; +} /* voc_multi_read_uc2i */ + +static int +voc_multi_read_les2i (SF_PRIVATE *psf, int *ptr, int len) +{ + + return 0 ; +} /* voc_multi_read_les2i */ + + +static int +voc_multi_read_uc2f (SF_PRIVATE *psf, float *ptr, int len) +{ + + return 0 ; +} /* voc_multi_read_uc2f */ + +static int +voc_multi_read_les2f (SF_PRIVATE *psf, float *ptr, int len) +{ + + return 0 ; +} /* voc_multi_read_les2f */ + + +static int +voc_multi_read_uc2d (SF_PRIVATE *psf, double *ptr, int len) +{ + + return 0 ; +} /* voc_multi_read_uc2d */ + +static int +voc_multi_read_les2d (SF_PRIVATE *psf, double *ptr, int len) +{ + + return 0 ; +} /* voc_multi_read_les2d */ + +#endif + +/*------------------------------------------------------------------------------------ + +Creative Voice (VOC) file format +-------------------------------- + +~From: galt@dsd.es.com + +(byte numbers are hex!) + + HEADER (bytes 00-19) + Series of DATA BLOCKS (bytes 1A+) [Must end w/ Terminator Block] + +- --------------------------------------------------------------- + +HEADER: +======= + byte # Description + ------ ------------------------------------------ + 00-12 "Creative Voice File" + 13 1A (eof to abort printing of file) + 14-15 Offset of first datablock in .voc file (std 1A 00 + in Intel Notation) + 16-17 Version number (minor,major) (VOC-HDR puts 0A 01) + 18-19 1's Comp of Ver. # + 1234h (VOC-HDR puts 29 11) + +- --------------------------------------------------------------- + +DATA BLOCK: +=========== + + Data Block: TYPE(1-byte), SIZE(3-bytes), INFO(0+ bytes) + NOTE: Terminator Block is an exception -- it has only the TYPE byte. + + TYPE Description Size (3-byte int) Info + ---- ----------- ----------------- ----------------------- + 00 Terminator (NONE) (NONE) + 01 Sound data 2+length of data * + 02 Sound continue length of data Voice Data + 03 Silence 3 ** + 04 Marker 2 Marker# (2 bytes) + 05 ASCII length of string null terminated string + 06 Repeat 2 Count# (2 bytes) + 07 End repeat 0 (NONE) + 08 Extended 4 *** + + *Sound Info Format: + --------------------- + 00 Sample Rate + 01 Compression Type + 02+ Voice Data + + **Silence Info Format: + ---------------------------- + 00-01 Length of silence - 1 + 02 Sample Rate + + + ***Extended Info Format: + --------------------- + 00-01 Time Constant: Mono: 65536 - (256000000/sample_rate) + Stereo: 65536 - (25600000/(2*sample_rate)) + 02 Pack + 03 Mode: 0 = mono + 1 = stereo + + + Marker# -- Driver keeps the most recent marker in a status byte + Count# -- Number of repetitions + 1 + Count# may be 1 to FFFE for 0 - FFFD repetitions + or FFFF for endless repetitions + Sample Rate -- SR byte = 256-(1000000/sample_rate) + Length of silence -- in units of sampling cycle + Compression Type -- of voice data + 8-bits = 0 + 4-bits = 1 + 2.6-bits = 2 + 2-bits = 3 + Multi DAC = 3+(# of channels) [interesting-- + this isn't in the developer's manual] + + +--------------------------------------------------------------------------------- +Addendum submitted by Votis Kokavessis: + +After some experimenting with .VOC files I found out that there is a Data Block +Type 9, which is not covered in the VOC.TXT file. Here is what I was able to discover +about this block type: + + +TYPE: 09 +SIZE: 12 + length of data +INFO: 12 (twelve) bytes + +INFO STRUCTURE: + +Bytes 0-1: (Word) Sample Rate (e.g. 44100) +Bytes 2-3: zero (could be that bytes 0-3 are a DWord for Sample Rate) +Byte 4: Sample Size in bits (e.g. 16) +Byte 5: Number of channels (e.g. 1 for mono, 2 for stereo) +Byte 6: Unknown (equal to 4 in all files I examined) +Bytes 7-11: zero + + +-------------------------------------------------------------------------------------*/ + +/*===================================================================================== +**===================================================================================== +**===================================================================================== +**===================================================================================== +*/ + +/*------------------------------------------------------------------------ +The following is taken from the Audio File Formats FAQ dated 2-Jan-1995 +and submitted by Guido van Rossum . +-------------------------------------------------------------------------- +Creative Voice (VOC) file format +-------------------------------- + +From: galt@dsd.es.com + +(byte numbers are hex!) + + HEADER (bytes 00-19) + Series of DATA BLOCKS (bytes 1A+) [Must end w/ Terminator Block] + +- --------------------------------------------------------------- + +HEADER: +------- + byte # Description + ------ ------------------------------------------ + 00-12 "Creative Voice File" + 13 1A (eof to abort printing of file) + 14-15 Offset of first datablock in .voc file (std 1A 00 + in Intel Notation) + 16-17 Version number (minor,major) (VOC-HDR puts 0A 01) + 18-19 2's Comp of Ver. # + 1234h (VOC-HDR puts 29 11) + +- --------------------------------------------------------------- + +DATA BLOCK: +----------- + + Data Block: TYPE(1-byte), SIZE(3-bytes), INFO(0+ bytes) + NOTE: Terminator Block is an exception -- it has only the TYPE byte. + + TYPE Description Size (3-byte int) Info + ---- ----------- ----------------- ----------------------- + 00 Terminator (NONE) (NONE) + 01 Sound data 2+length of data * + 02 Sound continue length of data Voice Data + 03 Silence 3 ** + 04 Marker 2 Marker# (2 bytes) + 05 ASCII length of string null terminated string + 06 Repeat 2 Count# (2 bytes) + 07 End repeat 0 (NONE) + 08 Extended 4 *** + + *Sound Info Format: **Silence Info Format: + --------------------- ---------------------------- + 00 Sample Rate 00-01 Length of silence - 1 + 01 Compression Type 02 Sample Rate + 02+ Voice Data + + ***Extended Info Format: + --------------------- + 00-01 Time Constant: Mono: 65536 - (256000000/sample_rate) + Stereo: 65536 - (25600000/(2*sample_rate)) + 02 Pack + 03 Mode: 0 = mono + 1 = stereo + + + Marker# -- Driver keeps the most recent marker in a status byte + Count# -- Number of repetitions + 1 + Count# may be 1 to FFFE for 0 - FFFD repetitions + or FFFF for endless repetitions + Sample Rate -- SR byte = 256-(1000000/sample_rate) + Length of silence -- in units of sampling cycle + Compression Type -- of voice data + 8-bits = 0 + 4-bits = 1 + 2.6-bits = 2 + 2-bits = 3 + Multi DAC = 3+(# of channels) [interesting-- + this isn't in the developer's manual] + +Detailed description of new data blocks (VOC files version 1.20 and above): + + (Source is fax from Barry Boone at Creative Labs, 405/742-6622) + +BLOCK 8 - digitized sound attribute extension, must preceed block 1. + Used to define stereo, 8 bit audio + BYTE bBlockID; // = 8 + BYTE nBlockLen[3]; // 3 byte length + WORD wTimeConstant; // time constant = same as block 1 + BYTE bPackMethod; // same as in block 1 + BYTE bVoiceMode; // 0-mono, 1-stereo + + Data is stored left, right + +BLOCK 9 - data block that supersedes blocks 1 and 8. + Used for stereo, 16 bit. + + BYTE bBlockID; // = 9 + BYTE nBlockLen[3]; // length 12 plus length of sound + DWORD dwSamplesPerSec; // samples per second, not time const. + BYTE bBitsPerSample; // e.g., 8 or 16 + BYTE bChannels; // 1 for mono, 2 for stereo + WORD wFormat; // see below + BYTE reserved[4]; // pad to make block w/o data + // have a size of 16 bytes + + Valid values of wFormat are: + + 0x0000 8-bit unsigned PCM + 0x0001 Creative 8-bit to 4-bit ADPCM + 0x0002 Creative 8-bit to 3-bit ADPCM + 0x0003 Creative 8-bit to 2-bit ADPCM + 0x0004 16-bit signed PCM + 0x0006 CCITT a-Law + 0x0007 CCITT u-Law + 0x02000 Creative 16-bit to 4-bit ADPCM + + Data is stored left, right + +------------------------------------------------------------------------*/ diff --git a/libsndfile-1.0.31/src/vox_adpcm.c b/libsndfile-1.0.31/src/vox_adpcm.c new file mode 100644 index 0000000..50c3d05 --- /dev/null +++ b/libsndfile-1.0.31/src/vox_adpcm.c @@ -0,0 +1,400 @@ +/* +** Copyright (C) 2002-2014 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +/* +** This is the OKI / Dialogic ADPCM encoder/decoder. It converts from +** 12 bit linear sample data to a 4 bit ADPCM. +*/ + +/* + * Note: some early Dialogic hardware does not always reset the ADPCM encoder + * at the start of each vox file. This can result in clipping and/or DC offset + * problems when it comes to decoding the audio. Whilst little can be done + * about the clipping, a DC offset can be removed by passing the decoded audio + * through a high-pass filter at e.g. 10Hz. + */ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" +#include "ima_oki_adpcm.h" + + +static sf_count_t vox_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t vox_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t vox_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t vox_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t vox_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t vox_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t vox_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t vox_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +static int vox_read_block (SF_PRIVATE *psf, IMA_OKI_ADPCM *pvox, short *ptr, int len) ; + +/*------------------------------------------------------------------------------ +*/ + +static int +codec_close (SF_PRIVATE * psf) +{ + IMA_OKI_ADPCM * p = (IMA_OKI_ADPCM *) psf->codec_data ; + + if (p->errors) + psf_log_printf (psf, "*** Warning : ADPCM state errors: %d\n", p->errors) ; + return p->errors ; +} /* code_close */ + +int +vox_adpcm_init (SF_PRIVATE *psf) +{ IMA_OKI_ADPCM *pvox = NULL ; + + if (psf->file.mode == SFM_RDWR) + return SFE_BAD_MODE_RW ; + + if (psf->file.mode == SFM_WRITE && psf->sf.channels != 1) + return SFE_CHANNEL_COUNT ; + + if ((pvox = malloc (sizeof (IMA_OKI_ADPCM))) == NULL) + return SFE_MALLOC_FAILED ; + + psf->codec_data = (void*) pvox ; + memset (pvox, 0, sizeof (IMA_OKI_ADPCM)) ; + + if (psf->file.mode == SFM_WRITE) + { psf->write_short = vox_write_s ; + psf->write_int = vox_write_i ; + psf->write_float = vox_write_f ; + psf->write_double = vox_write_d ; + } + else + { psf_log_printf (psf, "Header-less OKI Dialogic ADPCM encoded file.\n") ; + psf_log_printf (psf, "Setting up for 8kHz, mono, Vox ADPCM.\n") ; + + psf->read_short = vox_read_s ; + psf->read_int = vox_read_i ; + psf->read_float = vox_read_f ; + psf->read_double = vox_read_d ; + } ; + + /* Standard sample rate chennels etc. */ + if (psf->sf.samplerate < 1) + psf->sf.samplerate = 8000 ; + psf->sf.channels = 1 ; + + psf->sf.frames = psf->filelength * 2 ; + + psf->sf.seekable = SF_FALSE ; + psf->codec_close = codec_close ; + + /* Seek back to start of data. */ + if (psf_fseek (psf, 0 , SEEK_SET) == -1) + return SFE_BAD_SEEK ; + + ima_oki_adpcm_init (pvox, IMA_OKI_ADPCM_TYPE_OKI) ; + + return 0 ; +} /* vox_adpcm_init */ + +/*============================================================================== +*/ + +static int +vox_read_block (SF_PRIVATE *psf, IMA_OKI_ADPCM *pvox, short *ptr, int len) +{ int indx = 0, k ; + + while (indx < len) + { pvox->code_count = (len - indx > IMA_OKI_ADPCM_PCM_LEN) ? IMA_OKI_ADPCM_CODE_LEN : (len - indx + 1) / 2 ; + + if ((k = psf_fread (pvox->codes, 1, pvox->code_count, psf)) != pvox->code_count) + { if (psf_ftell (psf) != psf->filelength) + psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pvox->code_count) ; + if (k == 0) + break ; + } ; + + pvox->code_count = k ; + + ima_oki_adpcm_decode_block (pvox) ; + + memcpy (&(ptr [indx]), pvox->pcm, pvox->pcm_count * sizeof (short)) ; + indx += pvox->pcm_count ; + } ; + + return indx ; +} /* vox_read_block */ + + +static sf_count_t +vox_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ IMA_OKI_ADPCM *pvox ; + int readcount, count ; + sf_count_t total = 0 ; + + if (! psf->codec_data) + return 0 ; + pvox = (IMA_OKI_ADPCM*) psf->codec_data ; + + while (len > 0) + { readcount = (len > 0x10000000) ? 0x10000000 : (int) len ; + + count = vox_read_block (psf, pvox, ptr, readcount) ; + + total += count ; + len -= count ; + if (count != readcount) + break ; + } ; + + return total ; +} /* vox_read_s */ + +static sf_count_t +vox_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ IMA_OKI_ADPCM *pvox ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, readcount, count ; + sf_count_t total = 0 ; + + if (! psf->codec_data) + return 0 ; + pvox = (IMA_OKI_ADPCM*) psf->codec_data ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : (int) len ; + count = vox_read_block (psf, pvox, sptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = arith_shift_left (sptr [k], 16) ; + total += count ; + len -= readcount ; + if (count != readcount) + break ; + } ; + + return total ; +} /* vox_read_i */ + +static sf_count_t +vox_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ IMA_OKI_ADPCM *pvox ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, readcount, count ; + sf_count_t total = 0 ; + float normfact ; + + if (! psf->codec_data) + return 0 ; + pvox = (IMA_OKI_ADPCM*) psf->codec_data ; + + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : (int) len ; + count = vox_read_block (psf, pvox, sptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * (float) (sptr [k]) ; + total += count ; + len -= readcount ; + if (count != readcount) + break ; + } ; + + return total ; +} /* vox_read_f */ + +static sf_count_t +vox_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ IMA_OKI_ADPCM *pvox ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, readcount, count ; + sf_count_t total = 0 ; + double normfact ; + + if (! psf->codec_data) + return 0 ; + pvox = (IMA_OKI_ADPCM*) psf->codec_data ; + + normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { readcount = (len >= bufferlen) ? bufferlen : (int) len ; + count = vox_read_block (psf, pvox, sptr, readcount) ; + for (k = 0 ; k < readcount ; k++) + ptr [total + k] = normfact * (double) (sptr [k]) ; + total += count ; + len -= readcount ; + if (count != readcount) + break ; + } ; + + return total ; +} /* vox_read_d */ + +/*------------------------------------------------------------------------------ +*/ + +static int +vox_write_block (SF_PRIVATE *psf, IMA_OKI_ADPCM *pvox, const short *ptr, int len) +{ int indx = 0, k ; + + while (indx < len) + { pvox->pcm_count = (len - indx > IMA_OKI_ADPCM_PCM_LEN) ? IMA_OKI_ADPCM_PCM_LEN : len - indx ; + + memcpy (pvox->pcm, &(ptr [indx]), pvox->pcm_count * sizeof (short)) ; + + ima_oki_adpcm_encode_block (pvox) ; + + if ((k = psf_fwrite (pvox->codes, 1, pvox->code_count, psf)) != pvox->code_count) + psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pvox->code_count) ; + + indx += pvox->pcm_count ; + } ; + + return indx ; +} /* vox_write_block */ + +static sf_count_t +vox_write_s (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ IMA_OKI_ADPCM *pvox ; + int writecount, count ; + sf_count_t total = 0 ; + + if (! psf->codec_data) + return 0 ; + pvox = (IMA_OKI_ADPCM*) psf->codec_data ; + + while (len) + { writecount = (len > 0x10000000) ? 0x10000000 : (int) len ; + + count = vox_write_block (psf, pvox, ptr, writecount) ; + + total += count ; + len -= count ; + if (count != writecount) + break ; + } ; + + return total ; +} /* vox_write_s */ + +static sf_count_t +vox_write_i (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ IMA_OKI_ADPCM *pvox ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, writecount, count ; + sf_count_t total = 0 ; + + if (! psf->codec_data) + return 0 ; + pvox = (IMA_OKI_ADPCM*) psf->codec_data ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : (int) len ; + for (k = 0 ; k < writecount ; k++) + sptr [k] = ptr [total + k] >> 16 ; + count = vox_write_block (psf, pvox, sptr, writecount) ; + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + + return total ; +} /* vox_write_i */ + +static sf_count_t +vox_write_f (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ IMA_OKI_ADPCM *pvox ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, writecount, count ; + sf_count_t total = 0 ; + float normfact ; + + if (! psf->codec_data) + return 0 ; + pvox = (IMA_OKI_ADPCM*) psf->codec_data ; + + normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : (int) len ; + for (k = 0 ; k < writecount ; k++) + sptr [k] = psf_lrintf (normfact * ptr [total + k]) ; + count = vox_write_block (psf, pvox, sptr, writecount) ; + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + + return total ; +} /* vox_write_f */ + +static sf_count_t +vox_write_d (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ IMA_OKI_ADPCM *pvox ; + BUF_UNION ubuf ; + short *sptr ; + int k, bufferlen, writecount, count ; + sf_count_t total = 0 ; + double normfact ; + + if (! psf->codec_data) + return 0 ; + pvox = (IMA_OKI_ADPCM*) psf->codec_data ; + + normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; + + sptr = ubuf.sbuf ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (len > 0) + { writecount = (len >= bufferlen) ? bufferlen : (int) len ; + for (k = 0 ; k < writecount ; k++) + sptr [k] = psf_lrint (normfact * ptr [total + k]) ; + count = vox_write_block (psf, pvox, sptr, writecount) ; + total += count ; + len -= writecount ; + if (count != writecount) + break ; + } ; + + return total ; +} /* vox_write_d */ + diff --git a/libsndfile-1.0.31/src/w64.c b/libsndfile-1.0.31/src/w64.c new file mode 100644 index 0000000..426480b --- /dev/null +++ b/libsndfile-1.0.31/src/w64.c @@ -0,0 +1,638 @@ +/* +** Copyright (C) 1999-2018 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" +#include "wavlike.h" + +/*------------------------------------------------------------------------------ +** W64 files use 16 byte markers as opposed to the four byte marker of +** WAV files. +** For comparison purposes, an integer is required, so make an integer +** hash for the 16 bytes using MAKE_HASH16 macro, but also create a 16 +** byte array containing the complete 16 bytes required when writing the +** header. +*/ + +#define MAKE_HASH16(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, xa, xb, xc, xd, xe, xf) \ + ( (x0) ^ ((x1) << 1) ^ ((x2) << 2) ^ ((x3) << 3) ^ \ + ((x4) << 4) ^ ((x5) << 5) ^ ((x6) << 6) ^ ((x7) << 7) ^ \ + ((x8) << 8) ^ ((x9) << 9) ^ ((xa) << 10) ^ ((xb) << 11) ^ \ + ((xc) << 12) ^ ((xd) << 13) ^ ((xe) << 14) ^ ((xf) << 15) ) + +#define MAKE_MARKER16(name, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, xa, xb, xc, xd, xe, xf) \ + static unsigned char name [16] = { (x0), (x1), (x2), (x3), (x4), (x5), \ + (x6), (x7), (x8), (x9), (xa), (xb), (xc), (xd), (xe), (xf) } + +#define riff_HASH16 MAKE_HASH16 ('r', 'i', 'f', 'f', 0x2E, 0x91, 0xCF, 0x11, \ + 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00) + +#define wave_HASH16 MAKE_HASH16 ('w', 'a', 'v', 'e', 0xF3, 0xAC, 0xD3, 0x11, \ + 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) + +#define fmt_HASH16 MAKE_HASH16 ('f', 'm', 't', ' ', 0xF3, 0xAC, 0xD3, 0x11, \ + 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) + +#define fact_HASH16 MAKE_HASH16 ('f', 'a', 'c', 't', 0xF3, 0xAC, 0xD3, 0x11, \ + 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) + +#define data_HASH16 MAKE_HASH16 ('d', 'a', 't', 'a', 0xF3, 0xAC, 0xD3, 0x11, \ + 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) + +#define ACID_HASH16 MAKE_HASH16 (0x6D, 0x07, 0x1C, 0xEA, 0xA3, 0xEF, 0x78, 0x4C, \ + 0x90, 0x57, 0x7F, 0x79, 0xEE, 0x25, 0x2A, 0xAE) + +#define levl_HASH16 MAKE_HASH16 (0x6c, 0x65, 0x76, 0x6c, 0xf3, 0xac, 0xd3, 0x11, \ + 0xd1, 0x8c, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) + +#define list_HASH16 MAKE_HASH16 (0x6C, 0x69, 0x73, 0x74, 0x2F, 0x91, 0xCF, 0x11, \ + 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00) + +#define junk_HASH16 MAKE_HASH16 (0x6A, 0x75, 0x6E, 0x6b, 0xF3, 0xAC, 0xD3, 0x11, \ + 0x8C, 0xD1, 0x00, 0xC0, 0x4f, 0x8E, 0xDB, 0x8A) + +#define bext_HASH16 MAKE_HASH16 (0x62, 0x65, 0x78, 0x74, 0xf3, 0xac, 0xd3, 0xaa, \ + 0xd1, 0x8c, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) + +#define MARKER_HASH16 MAKE_HASH16 (0x56, 0x62, 0xf7, 0xab, 0x2d, 0x39, 0xd2, 0x11, \ + 0x86, 0xc7, 0x00, 0xc0, 0x4f, 0x8e, 0xdb, 0x8a) + +#define SUMLIST_HASH16 MAKE_HASH16 (0xBC, 0x94, 0x5F, 0x92, 0x5A, 0x52, 0xD2, 0x11, \ + 0x86, 0xDC, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) + + +MAKE_MARKER16 (riff_MARKER16, 'r', 'i', 'f', 'f', 0x2E, 0x91, 0xCF, 0x11, + 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00) ; + + +MAKE_MARKER16 (wave_MARKER16, 'w', 'a', 'v', 'e', 0xF3, 0xAC, 0xD3, 0x11, + 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) ; + +MAKE_MARKER16 (fmt_MARKER16, 'f', 'm', 't', ' ', 0xF3, 0xAC, 0xD3, 0x11, + 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) ; + +MAKE_MARKER16 (fact_MARKER16, 'f', 'a', 'c', 't', 0xF3, 0xAC, 0xD3, 0x11, + 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) ; + +MAKE_MARKER16 (data_MARKER16, 'd', 'a', 't', 'a', 0xF3, 0xAC, 0xD3, 0x11, + 0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) ; + +enum +{ HAVE_riff = 0x01, + HAVE_wave = 0x02, + HAVE_fmt = 0x04, + HAVE_fact = 0x08, + HAVE_data = 0x20 +} ; + +/*------------------------------------------------------------------------------ + * Private static functions. + */ + +static int w64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock) ; +static int w64_write_header (SF_PRIVATE *psf, int calc_length) ; +static int w64_close (SF_PRIVATE *psf) ; + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +w64_open (SF_PRIVATE *psf) +{ WAVLIKE_PRIVATE * wpriv ; + int subformat, error, blockalign = 0, framesperblock = 0 ; + + if ((wpriv = calloc (1, sizeof (WAVLIKE_PRIVATE))) == NULL) + return SFE_MALLOC_FAILED ; + psf->container_data = wpriv ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR &&psf->filelength > 0)) + { if ((error = w64_read_header (psf, &blockalign, &framesperblock))) + return error ; + } ; + + if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_W64) + return SFE_BAD_OPEN_FORMAT ; + + subformat = SF_CODEC (psf->sf.format) ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if (psf->is_pipe) + return SFE_NO_PIPE_WRITE ; + + psf->endian = SF_ENDIAN_LITTLE ; /* All W64 files are little endian. */ + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + + if (subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM) + { blockalign = wavlike_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ; + framesperblock = -1 ; + + /* + ** At this point we don't know the file length so set it stupidly high, but not + ** so high that it triggers undefined behaviour whan something is added to it. + */ + psf->filelength = SF_COUNT_MAX - 10000 ; + psf->datalength = psf->filelength ; + if (psf->sf.frames <= 0) + psf->sf.frames = (psf->blockwidth) ? psf->filelength / psf->blockwidth : psf->filelength ; + } ; + + if ((error = w64_write_header (psf, SF_FALSE))) + return error ; + + psf->write_header = w64_write_header ; + } ; + + psf->container_close = w64_close ; + + switch (subformat) + { case SF_FORMAT_PCM_U8 : + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_32 : + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_ULAW : + error = ulaw_init (psf) ; + break ; + + case SF_FORMAT_ALAW : + error = alaw_init (psf) ; + break ; + + /* Lite remove start */ + case SF_FORMAT_FLOAT : + error = float32_init (psf) ; + break ; + + case SF_FORMAT_DOUBLE : + error = double64_init (psf) ; + break ; + + case SF_FORMAT_IMA_ADPCM : + error = wavlike_ima_init (psf, blockalign, framesperblock) ; + break ; + + case SF_FORMAT_MS_ADPCM : + error = wavlike_msadpcm_init (psf, blockalign, framesperblock) ; + break ; + /* Lite remove end */ + + case SF_FORMAT_GSM610 : + error = gsm610_init (psf) ; + break ; + + default : return SFE_UNIMPLEMENTED ; + } ; + + return error ; +} /* w64_open */ + +/*========================================================================= +** Private functions. +*/ + +static int +w64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock) +{ WAVLIKE_PRIVATE *wpriv ; + WAV_FMT *wav_fmt ; + int dword = 0, marker, format = 0 ; + sf_count_t chunk_size, bytesread = 0 ; + int parsestage = 0, error, done = 0 ; + + if ((wpriv = psf->container_data) == NULL) + return SFE_INTERNAL ; + wav_fmt = &wpriv->wav_fmt ; + + /* Set position to start of file to begin reading header. */ + psf_binheader_readf (psf, "p", 0) ; + + while (! done) + { /* Each new chunk must start on an 8 byte boundary, so jump if needed. */ + if (psf->header.indx & 0x7) + psf_binheader_readf (psf, "j", 8 - (psf->header.indx & 0x7)) ; + + /* Generate hash of 16 byte marker. */ + marker = chunk_size = 0 ; + bytesread = psf_binheader_readf (psf, "eh8", &marker, &chunk_size) ; + if (bytesread == 0) + break ; + switch (marker) + { case riff_HASH16 : + if (parsestage) + return SFE_W64_NO_RIFF ; + + if (psf->filelength != chunk_size) + psf_log_printf (psf, "riff : %D (should be %D)\n", chunk_size, psf->filelength) ; + else + psf_log_printf (psf, "riff : %D\n", chunk_size) ; + + parsestage |= HAVE_riff ; + + bytesread += psf_binheader_readf (psf, "h", &marker) ; + if (marker == wave_HASH16) + { if ((parsestage & HAVE_riff) != HAVE_riff) + return SFE_W64_NO_WAVE ; + psf_log_printf (psf, "wave\n") ; + parsestage |= HAVE_wave ; + } ; + chunk_size = 0 ; + break ; + + case ACID_HASH16: + psf_log_printf (psf, "Looks like an ACID file. Exiting.\n") ; + return SFE_UNIMPLEMENTED ; + + case fmt_HASH16 : + if ((parsestage & (HAVE_riff | HAVE_wave)) != (HAVE_riff | HAVE_wave)) + return SFE_WAV_NO_FMT ; + + psf_log_printf (psf, " fmt : %D\n", chunk_size) ; + + /* size of 16 byte marker and 8 byte chunk_size value. */ + chunk_size -= 24 ; + + if ((error = wavlike_read_fmt_chunk (psf, (int) chunk_size))) + return error ; + + if (chunk_size % 8) + psf_binheader_readf (psf, "j", 8 - (chunk_size % 8)) ; + + format = wav_fmt->format ; + parsestage |= HAVE_fmt ; + chunk_size = 0 ; + break ; + + case fact_HASH16: + { sf_count_t frames ; + + psf_binheader_readf (psf, "e8", &frames) ; + psf_log_printf (psf, "fact : %D\n frames : %D\n", + chunk_size, frames) ; + } ; + chunk_size = 0 ; + break ; + + + case data_HASH16 : + if ((parsestage & (HAVE_riff | HAVE_wave | HAVE_fmt)) != (HAVE_riff | HAVE_wave | HAVE_fmt)) + return SFE_W64_NO_DATA ; + + psf->dataoffset = psf_ftell (psf) ; + psf->datalength = SF_MIN (chunk_size - 24, psf->filelength - psf->dataoffset) ; + + if (chunk_size % 8) + chunk_size += 8 - (chunk_size % 8) ; + + psf_log_printf (psf, "data : %D\n", chunk_size) ; + + parsestage |= HAVE_data ; + + if (! psf->sf.seekable) + break ; + + /* Seek past data and continue reading header. */ + psf_fseek (psf, chunk_size, SEEK_CUR) ; + chunk_size = 0 ; + break ; + + case levl_HASH16 : + psf_log_printf (psf, "levl : %D\n", chunk_size) ; + break ; + + case list_HASH16 : + psf_log_printf (psf, "list : %D\n", chunk_size) ; + break ; + + case junk_HASH16 : + psf_log_printf (psf, "junk : %D\n", chunk_size) ; + break ; + + case bext_HASH16 : + psf_log_printf (psf, "bext : %D\n", chunk_size) ; + break ; + + case MARKER_HASH16 : + psf_log_printf (psf, "marker : %D\n", chunk_size) ; + break ; + + case SUMLIST_HASH16 : + psf_log_printf (psf, "summary list : %D\n", chunk_size) ; + break ; + + default : + psf_log_printf (psf, "*** Unknown chunk marker (%X) at position %D with length %D. Skipping and continuing.\n", marker, psf_ftell (psf) - 8, chunk_size) ; + break ; + } ; /* switch (dword) */ + + if (chunk_size >= psf->filelength) + { psf_log_printf (psf, "*** Chunk size %u > file length %D. Exiting parser.\n", chunk_size, psf->filelength) ; + break ; + } ; + + if (psf->sf.seekable == 0 && (parsestage & HAVE_data)) + break ; + + if (psf_ftell (psf) >= (psf->filelength - (2 * SIGNED_SIZEOF (dword)))) + break ; + + if (chunk_size > 0 && chunk_size < 0xffff0000) + { dword = chunk_size ; + psf_binheader_readf (psf, "j", dword - 24) ; + } ; + } ; /* while (1) */ + + if (psf->dataoffset <= 0) + return SFE_W64_NO_DATA ; + + if (psf->sf.channels < 1) + return SFE_CHANNEL_COUNT_ZERO ; + + if (psf->sf.channels > SF_MAX_CHANNELS) + return SFE_CHANNEL_COUNT ; + + psf->endian = SF_ENDIAN_LITTLE ; /* All W64 files are little endian. */ + + if (psf_ftell (psf) != psf->dataoffset) + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + + if (psf->blockwidth) + { if (psf->filelength - psf->dataoffset < psf->datalength) + psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ; + else + psf->sf.frames = psf->datalength / psf->blockwidth ; + } ; + + switch (format) + { case WAVE_FORMAT_PCM : + case WAVE_FORMAT_EXTENSIBLE : + /* extensible might be FLOAT, MULAW, etc as well! */ + psf->sf.format = SF_FORMAT_W64 | u_bitwidth_to_subformat (psf->bytewidth * 8) ; + break ; + + case WAVE_FORMAT_MULAW : + psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_ULAW) ; + break ; + + case WAVE_FORMAT_ALAW : + psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_ALAW) ; + break ; + + case WAVE_FORMAT_MS_ADPCM : + psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM) ; + *blockalign = wav_fmt->msadpcm.blockalign ; + *framesperblock = wav_fmt->msadpcm.samplesperblock ; + break ; + + case WAVE_FORMAT_IMA_ADPCM : + psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM) ; + *blockalign = wav_fmt->ima.blockalign ; + *framesperblock = wav_fmt->ima.samplesperblock ; + break ; + + case WAVE_FORMAT_GSM610 : + psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_GSM610) ; + break ; + + case WAVE_FORMAT_IEEE_FLOAT : + psf->sf.format = SF_FORMAT_W64 ; + psf->sf.format |= (psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT ; + break ; + + default : return SFE_UNIMPLEMENTED ; + } ; + + return 0 ; +} /* w64_read_header */ + +static int +w64_write_header (SF_PRIVATE *psf, int calc_length) +{ sf_count_t fmt_size, current ; + size_t fmt_pad = 0 ; + int subformat, add_fact_chunk = SF_FALSE ; + + current = psf_ftell (psf) ; + + if (calc_length) + { psf->filelength = psf_get_filelen (psf) ; + + psf->datalength = psf->filelength - psf->dataoffset ; + if (psf->dataend) + psf->datalength -= psf->filelength - psf->dataend ; + + if (psf->bytewidth) + psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; + } ; + + /* Reset the current header length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + psf_fseek (psf, 0, SEEK_SET) ; + + /* riff marker, length, wave and 'fmt ' markers. */ + psf_binheader_writef (psf, "eh8hh", BHWh (riff_MARKER16), BHW8 (psf->filelength), BHWh (wave_MARKER16), BHWh (fmt_MARKER16)) ; + + subformat = SF_CODEC (psf->sf.format) ; + + switch (subformat) + { case SF_FORMAT_PCM_U8 : + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_32 : + fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ; + fmt_pad = (size_t) ((fmt_size & 0x7) ? 8 - (fmt_size & 0x7) : 0) ; + fmt_size += fmt_pad ; + + /* fmt : format, channels, samplerate */ + psf_binheader_writef (psf, "e8224", BHW8 (fmt_size), BHW2 (WAVE_FORMAT_PCM), BHW2 (psf->sf.channels), BHW4 (psf->sf.samplerate)) ; + /* fmt : bytespersec */ + psf_binheader_writef (psf, "e4", BHW4 (psf->sf.samplerate * psf->bytewidth * psf->sf.channels)) ; + /* fmt : blockalign, bitwidth */ + psf_binheader_writef (psf, "e22", BHW2 (psf->bytewidth * psf->sf.channels), BHW2 (psf->bytewidth * 8)) ; + break ; + + case SF_FORMAT_FLOAT : + case SF_FORMAT_DOUBLE : + fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ; + fmt_pad = (size_t) ((fmt_size & 0x7) ? 8 - (fmt_size & 0x7) : 0) ; + fmt_size += fmt_pad ; + + /* fmt : format, channels, samplerate */ + psf_binheader_writef (psf, "e8224", BHW8 (fmt_size), BHW2 (WAVE_FORMAT_IEEE_FLOAT), BHW2 (psf->sf.channels), BHW4 (psf->sf.samplerate)) ; + /* fmt : bytespersec */ + psf_binheader_writef (psf, "e4", BHW4 (psf->sf.samplerate * psf->bytewidth * psf->sf.channels)) ; + /* fmt : blockalign, bitwidth */ + psf_binheader_writef (psf, "e22", BHW2 (psf->bytewidth * psf->sf.channels), BHW2 (psf->bytewidth * 8)) ; + + add_fact_chunk = SF_TRUE ; + break ; + + case SF_FORMAT_ULAW : + fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ; + fmt_pad = (size_t) ((fmt_size & 0x7) ? 8 - (fmt_size & 0x7) : 0) ; + fmt_size += fmt_pad ; + + /* fmt : format, channels, samplerate */ + psf_binheader_writef (psf, "e8224", BHW8 (fmt_size), BHW2 (WAVE_FORMAT_MULAW), BHW2 (psf->sf.channels), BHW4 (psf->sf.samplerate)) ; + /* fmt : bytespersec */ + psf_binheader_writef (psf, "e4", BHW4 (psf->sf.samplerate * psf->bytewidth * psf->sf.channels)) ; + /* fmt : blockalign, bitwidth */ + psf_binheader_writef (psf, "e22", BHW2 (psf->bytewidth * psf->sf.channels), BHW2 (8)) ; + + add_fact_chunk = SF_TRUE ; + break ; + + case SF_FORMAT_ALAW : + fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ; + fmt_pad = (size_t) ((fmt_size & 0x7) ? 8 - (fmt_size & 0x7) : 0) ; + fmt_size += fmt_pad ; + + /* fmt : format, channels, samplerate */ + psf_binheader_writef (psf, "e8224", BHW8 (fmt_size), BHW2 (WAVE_FORMAT_ALAW), BHW2 (psf->sf.channels), BHW4 (psf->sf.samplerate)) ; + /* fmt : bytespersec */ + psf_binheader_writef (psf, "e4", BHW4 (psf->sf.samplerate * psf->bytewidth * psf->sf.channels)) ; + /* fmt : blockalign, bitwidth */ + psf_binheader_writef (psf, "e22", BHW2 (psf->bytewidth * psf->sf.channels), BHW2 (8)) ; + + add_fact_chunk = SF_TRUE ; + break ; + + /* Lite remove start */ + case SF_FORMAT_IMA_ADPCM : + { int blockalign, framesperblock, bytespersec ; + + blockalign = wavlike_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ; + framesperblock = 2 * (blockalign - 4 * psf->sf.channels) / psf->sf.channels + 1 ; + bytespersec = (psf->sf.samplerate * blockalign) / framesperblock ; + + /* fmt chunk. */ + fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ; + fmt_pad = (size_t) ((fmt_size & 0x7) ? 8 - (fmt_size & 0x7) : 0) ; + fmt_size += fmt_pad ; + + /* fmt : size, WAV format type, channels. */ + psf_binheader_writef (psf, "e822", BHW8 (fmt_size), BHW2 (WAVE_FORMAT_IMA_ADPCM), BHW2 (psf->sf.channels)) ; + + /* fmt : samplerate, bytespersec. */ + psf_binheader_writef (psf, "e44", BHW4 (psf->sf.samplerate), BHW4 (bytespersec)) ; + + /* fmt : blockalign, bitwidth, extrabytes, framesperblock. */ + psf_binheader_writef (psf, "e2222", BHW2 (blockalign), BHW2 (4), BHW2 (2), BHW2 (framesperblock)) ; + } ; + + add_fact_chunk = SF_TRUE ; + break ; + + case SF_FORMAT_MS_ADPCM : + { int blockalign, framesperblock, bytespersec, extrabytes ; + + blockalign = wavlike_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ; + framesperblock = 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ; + bytespersec = (psf->sf.samplerate * blockalign) / framesperblock ; + + /* fmt chunk. */ + extrabytes = 2 + 2 + WAVLIKE_MSADPCM_ADAPT_COEFF_COUNT * (2 + 2) ; + fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 + 2 + extrabytes ; + fmt_pad = (size_t) ((fmt_size & 0x7) ? 8 - (fmt_size & 0x7) : 0) ; + fmt_size += fmt_pad ; + + /* fmt : size, W64 format type, channels. */ + psf_binheader_writef (psf, "e822", BHW8 (fmt_size), BHW2 (WAVE_FORMAT_MS_ADPCM), BHW2 (psf->sf.channels)) ; + + /* fmt : samplerate, bytespersec. */ + psf_binheader_writef (psf, "e44", BHW4 (psf->sf.samplerate), BHW4 (bytespersec)) ; + + /* fmt : blockalign, bitwidth, extrabytes, framesperblock. */ + psf_binheader_writef (psf, "e22222", BHW2 (blockalign), BHW2 (4), BHW2 (extrabytes), BHW2 (framesperblock), BHW2 (7)) ; + + wavlike_msadpcm_write_adapt_coeffs (psf) ; + } ; + + add_fact_chunk = SF_TRUE ; + break ; + /* Lite remove end */ + + case SF_FORMAT_GSM610 : + { int bytespersec ; + + bytespersec = (psf->sf.samplerate * WAVLIKE_GSM610_BLOCKSIZE) / WAVLIKE_GSM610_SAMPLES ; + + /* fmt chunk. */ + fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ; + fmt_pad = (size_t) ((fmt_size & 0x7) ? 8 - (fmt_size & 0x7) : 0) ; + fmt_size += fmt_pad ; + + /* fmt : size, WAV format type, channels. */ + psf_binheader_writef (psf, "e822", BHW8 (fmt_size), BHW2 (WAVE_FORMAT_GSM610), BHW2 (psf->sf.channels)) ; + + /* fmt : samplerate, bytespersec. */ + psf_binheader_writef (psf, "e44", BHW4 (psf->sf.samplerate), BHW4 (bytespersec)) ; + + /* fmt : blockalign, bitwidth, extrabytes, framesperblock. */ + psf_binheader_writef (psf, "e2222", BHW2 (WAVLIKE_GSM610_BLOCKSIZE), BHW2 (0), BHW2 (2), BHW2 (WAVLIKE_GSM610_SAMPLES)) ; + } ; + + add_fact_chunk = SF_TRUE ; + break ; + + default : return SFE_UNIMPLEMENTED ; + } ; + + /* Pad to 8 bytes with zeros. */ + if (fmt_pad > 0) + psf_binheader_writef (psf, "z", BHWz (fmt_pad)) ; + + if (add_fact_chunk) + psf_binheader_writef (psf, "eh88", BHWh (fact_MARKER16), BHW8 ((sf_count_t) (16 + 8 + 8)), BHW8 (psf->sf.frames)) ; + + psf_binheader_writef (psf, "eh8", BHWh (data_MARKER16), BHW8 (psf->datalength + 24)) ; + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + if (psf->error) + return psf->error ; + + psf->dataoffset = psf->header.indx ; + + if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + + return psf->error ; +} /* w64_write_header */ + +static int +w64_close (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + w64_write_header (psf, SF_TRUE) ; + + return 0 ; +} /* w64_close */ + diff --git a/libsndfile-1.0.31/src/wav.c b/libsndfile-1.0.31/src/wav.c new file mode 100644 index 0000000..fd3e453 --- /dev/null +++ b/libsndfile-1.0.31/src/wav.c @@ -0,0 +1,1571 @@ +/* +** Copyright (C) 1999-2019 Erik de Castro Lopo +** Copyright (C) 2004-2005 David Viens +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" +#include "wavlike.h" + +/*------------------------------------------------------------------------------ + * Macros to handle big/little endian issues. + */ + +#define RIFF_MARKER (MAKE_MARKER ('R', 'I', 'F', 'F')) +#define RIFX_MARKER (MAKE_MARKER ('R', 'I', 'F', 'X')) +#define WAVE_MARKER (MAKE_MARKER ('W', 'A', 'V', 'E')) +#define fmt_MARKER (MAKE_MARKER ('f', 'm', 't', ' ')) +#define fact_MARKER (MAKE_MARKER ('f', 'a', 'c', 't')) + +#define cue_MARKER (MAKE_MARKER ('c', 'u', 'e', ' ')) +#define slnt_MARKER (MAKE_MARKER ('s', 'l', 'n', 't')) +#define wavl_MARKER (MAKE_MARKER ('w', 'a', 'v', 'l')) +#define plst_MARKER (MAKE_MARKER ('p', 'l', 's', 't')) +#define smpl_MARKER (MAKE_MARKER ('s', 'm', 'p', 'l')) +#define iXML_MARKER (MAKE_MARKER ('i', 'X', 'M', 'L')) +#define levl_MARKER (MAKE_MARKER ('l', 'e', 'v', 'l')) +#define MEXT_MARKER (MAKE_MARKER ('M', 'E', 'X', 'T')) +#define acid_MARKER (MAKE_MARKER ('a', 'c', 'i', 'd')) +#define strc_MARKER (MAKE_MARKER ('s', 't', 'r', 'c')) +#define afsp_MARKER (MAKE_MARKER ('a', 'f', 's', 'p')) +#define clm_MARKER (MAKE_MARKER ('c', 'l', 'm', ' ')) +#define elmo_MARKER (MAKE_MARKER ('e', 'l', 'm', 'o')) +#define FLLR_MARKER (MAKE_MARKER ('F', 'L', 'L', 'R')) + +#define minf_MARKER (MAKE_MARKER ('m', 'i', 'n', 'f')) +#define elm1_MARKER (MAKE_MARKER ('e', 'l', 'm', '1')) +#define regn_MARKER (MAKE_MARKER ('r', 'e', 'g', 'n')) +#define ovwf_MARKER (MAKE_MARKER ('o', 'v', 'w', 'f')) +#define umid_MARKER (MAKE_MARKER ('u', 'm', 'i', 'd')) +#define SyLp_MARKER (MAKE_MARKER ('S', 'y', 'L', 'p')) +#define Cr8r_MARKER (MAKE_MARKER ('C', 'r', '8', 'r')) +#define JUNK_MARKER (MAKE_MARKER ('J', 'U', 'N', 'K')) +#define PMX_MARKER (MAKE_MARKER ('_', 'P', 'M', 'X')) +#define inst_MARKER (MAKE_MARKER ('i', 'n', 's', 't')) +#define AFAn_MARKER (MAKE_MARKER ('A', 'F', 'A', 'n')) + + +/* Weird WAVPACK marker which can show up at the start of the DATA section. */ +#define wvpk_MARKER (MAKE_MARKER ('w', 'v', 'p', 'k')) +#define OggS_MARKER (MAKE_MARKER ('O', 'g', 'g', 'S')) + +#define WAVLIKE_PEAK_CHUNK_SIZE(ch) (2 * sizeof (int) + ch * (sizeof (float) + sizeof (int))) + + +enum +{ HAVE_RIFF = 0x01, + HAVE_WAVE = 0x02, + HAVE_fmt = 0x04, + HAVE_fact = 0x08, + HAVE_PEAK = 0x10, + HAVE_data = 0x20, + HAVE_other = 0x80000000 +} ; + + + +/* known WAVEFORMATEXTENSIBLE GUIDS */ +static const EXT_SUBFORMAT MSGUID_SUBTYPE_PCM = +{ 0x00000001, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } +} ; + +#if 0 +static const EXT_SUBFORMAT MSGUID_SUBTYPE_MS_ADPCM = +{ 0x00000002, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } +} ; +#endif + +static const EXT_SUBFORMAT MSGUID_SUBTYPE_IEEE_FLOAT = +{ 0x00000003, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } +} ; + +static const EXT_SUBFORMAT MSGUID_SUBTYPE_ALAW = +{ 0x00000006, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } +} ; + +static const EXT_SUBFORMAT MSGUID_SUBTYPE_MULAW = +{ 0x00000007, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } +} ; + +/* +** the next two are from +** http://dream.cs.bath.ac.uk/researchdev/wave-ex/bformat.html +*/ +static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM = +{ 0x00000001, 0x0721, 0x11d3, { 0x86, 0x44, 0xC8, 0xC1, 0xCA, 0x00, 0x00, 0x00 } +} ; + +static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT = +{ 0x00000003, 0x0721, 0x11d3, { 0x86, 0x44, 0xC8, 0xC1, 0xCA, 0x00, 0x00, 0x00 } +} ; + + +#if 0 +/* maybe interesting one day to read the following through sf_read_raw */ +/* http://www.bath.ac.uk/~masrwd/pvocex/pvocex.html */ +static const EXT_SUBFORMAT MSGUID_SUBTYPE_PVOCEX = +{ 0x8312B9C2, 0x2E6E, 0x11d4, { 0xA8, 0x24, 0xDE, 0x5B, 0x96, 0xC3, 0xAB, 0x21 } +} ; +#endif + +/*------------------------------------------------------------------------------ +** Private static functions. +*/ + +static int wav_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock) ; +static int wav_write_header (SF_PRIVATE *psf, int calc_length) ; + +static int wav_write_tailer (SF_PRIVATE *psf) ; +static int wav_command (SF_PRIVATE *psf, int command, void *data, int datasize) ; +static int wav_close (SF_PRIVATE *psf) ; + +static int wav_read_smpl_chunk (SF_PRIVATE *psf, uint32_t chunklen) ; +static int wav_read_acid_chunk (SF_PRIVATE *psf, uint32_t chunklen) ; + +static int wav_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info) ; +static SF_CHUNK_ITERATOR * wav_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator) ; +static int wav_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ; +static int wav_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) ; + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +wav_open (SF_PRIVATE *psf) +{ WAVLIKE_PRIVATE * wpriv ; + int format, subformat, error, blockalign = 0, framesperblock = 0 ; + + if ((wpriv = calloc (1, sizeof (WAVLIKE_PRIVATE))) == NULL) + return SFE_MALLOC_FAILED ; + psf->container_data = wpriv ; + + wpriv->wavex_ambisonic = SF_AMBISONIC_NONE ; + psf->strings.flags = SF_STR_ALLOW_START | SF_STR_ALLOW_END ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = wav_read_header (psf, &blockalign, &framesperblock))) + return error ; + + psf->next_chunk_iterator = wav_next_chunk_iterator ; + psf->get_chunk_size = wav_get_chunk_size ; + psf->get_chunk_data = wav_get_chunk_data ; + } ; + + subformat = SF_CODEC (psf->sf.format) ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if (psf->is_pipe) + return SFE_NO_PIPE_WRITE ; + + wpriv->wavex_ambisonic = SF_AMBISONIC_NONE ; + + format = SF_CONTAINER (psf->sf.format) ; + if (format != SF_FORMAT_WAV && format != SF_FORMAT_WAVEX) + return SFE_BAD_OPEN_FORMAT ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + + /* RIFF WAVs are little-endian, RIFX WAVs are big-endian, default to little */ + psf->endian = SF_ENDIAN (psf->sf.format) ; + if (CPU_IS_BIG_ENDIAN && psf->endian == SF_ENDIAN_CPU) + psf->endian = SF_ENDIAN_BIG ; + else if (psf->endian != SF_ENDIAN_BIG) + psf->endian = SF_ENDIAN_LITTLE ; + + if (psf->file.mode != SFM_RDWR || psf->filelength < 44) + { psf->filelength = 0 ; + psf->datalength = 0 ; + psf->dataoffset = 0 ; + psf->sf.frames = 0 ; + } ; + + if (subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM) + { blockalign = wavlike_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ; + framesperblock = -1 ; /* Corrected later. */ + } ; + + /* By default, add the peak chunk to floating point files. Default behaviour + ** can be switched off using sf_command (SFC_SET_PEAK_CHUNK, SF_FALSE). + */ + if (psf->file.mode == SFM_WRITE && (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)) + { if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL) + return SFE_MALLOC_FAILED ; + psf->peak_info->peak_loc = SF_PEAK_START ; + } ; + + psf->write_header = wav_write_header ; + psf->set_chunk = wav_set_chunk ; + } ; + + psf->container_close = wav_close ; + psf->command = wav_command ; + + switch (subformat) + { case SF_FORMAT_PCM_U8 : + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_32 : + error = pcm_init (psf) ; + break ; + + case SF_FORMAT_ULAW : + error = ulaw_init (psf) ; + break ; + + case SF_FORMAT_ALAW : + error = alaw_init (psf) ; + break ; + + /* Lite remove start */ + case SF_FORMAT_FLOAT : + error = float32_init (psf) ; + break ; + + case SF_FORMAT_DOUBLE : + error = double64_init (psf) ; + break ; + + case SF_FORMAT_IMA_ADPCM : + error = wavlike_ima_init (psf, blockalign, framesperblock) ; + break ; + + case SF_FORMAT_MS_ADPCM : + error = wavlike_msadpcm_init (psf, blockalign, framesperblock) ; + break ; + + case SF_FORMAT_G721_32 : + error = g72x_init (psf) ; + break ; + + case SF_FORMAT_NMS_ADPCM_16 : + case SF_FORMAT_NMS_ADPCM_24 : + case SF_FORMAT_NMS_ADPCM_32 : + error = nms_adpcm_init (psf) ; + break ; + + /* Lite remove end */ + + case SF_FORMAT_GSM610 : + error = gsm610_init (psf) ; + break ; + + default : return SFE_UNIMPLEMENTED ; + } ; + + if (psf->file.mode == SFM_WRITE || (psf->file.mode == SFM_RDWR && psf->filelength == 0)) + return psf->write_header (psf, SF_FALSE) ; + + return error ; +} /* wav_open */ + +/*========================================================================= +** Private functions. +*/ + +static int +wav_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock) +{ WAVLIKE_PRIVATE *wpriv ; + WAV_FMT *wav_fmt ; + FACT_CHUNK fact_chunk ; + uint32_t marker, chunk_size = 0, RIFFsize = 0, done = 0 ; + int parsestage = 0, error, format = 0 ; + + if (psf->is_pipe == 0 && psf->filelength > SF_PLATFORM_S64 (0xffffffff)) + psf_log_printf (psf, "Warning : filelength > 0xffffffff. This is bad!!!!\n") ; + + if ((wpriv = psf->container_data) == NULL) + return SFE_INTERNAL ; + wav_fmt = &wpriv->wav_fmt ; + + /* Set position to start of file to begin reading header. */ + psf_binheader_readf (psf, "pmj", 0, &marker, -4) ; + psf->header.indx = 0 ; + + /* RIFX signifies big-endian format for all header and data to prevent + ** lots of code copying here, we'll set the psf->rwf_endian flag once here, + ** and never specify endian-ness for all other header ops/ + */ + psf->rwf_endian = (marker == RIFF_MARKER) ? SF_ENDIAN_LITTLE : SF_ENDIAN_BIG ; + + while (! done) + { size_t jump = chunk_size & 1 ; + + marker = chunk_size = 0 ; + psf_binheader_readf (psf, "jm4", jump, &marker, &chunk_size) ; + if (marker == 0) + { sf_count_t pos = psf_ftell (psf) ; + psf_log_printf (psf, "Have 0 marker at position %D (0x%x).\n", pos, pos) ; + break ; + } ; + + psf_store_read_chunk_u32 (&psf->rchunks, marker, psf_ftell (psf), chunk_size) ; + + switch (marker) + { case RIFF_MARKER : + case RIFX_MARKER : + if (parsestage) + return SFE_WAV_NO_RIFF ; + + parsestage |= HAVE_RIFF ; + + RIFFsize = chunk_size ; + + if (psf->fileoffset > 0 && psf->filelength > RIFFsize + 8) + { /* Set file length. */ + psf->filelength = RIFFsize + 8 ; + if (marker == RIFF_MARKER) + psf_log_printf (psf, "RIFF : %u\n", RIFFsize) ; + else + psf_log_printf (psf, "RIFX : %u\n", RIFFsize) ; + } + else if (psf->filelength < RIFFsize + 2 * SIGNED_SIZEOF (marker)) + { if (marker == RIFF_MARKER) + psf_log_printf (psf, "RIFF : %u (should be %D)\n", RIFFsize, psf->filelength - 2 * SIGNED_SIZEOF (marker)) ; + else + psf_log_printf (psf, "RIFX : %u (should be %D)\n", RIFFsize, psf->filelength - 2 * SIGNED_SIZEOF (marker)) ; + + RIFFsize = psf->filelength - 2 * SIGNED_SIZEOF (RIFFsize) ; + } + else + { if (marker == RIFF_MARKER) + psf_log_printf (psf, "RIFF : %u\n", RIFFsize) ; + else + psf_log_printf (psf, "RIFX : %u\n", RIFFsize) ; + } ; + + psf_binheader_readf (psf, "m", &marker) ; + if (marker != WAVE_MARKER) + return SFE_WAV_NO_WAVE ; + parsestage |= HAVE_WAVE ; + psf_log_printf (psf, "WAVE\n") ; + chunk_size = 0 ; + break ; + + case fmt_MARKER : + if ((parsestage & (HAVE_RIFF | HAVE_WAVE)) != (HAVE_RIFF | HAVE_WAVE)) + return SFE_WAV_NO_FMT ; + + /* If this file has a SECOND fmt chunk, I don't want to know about it. */ + if (parsestage & HAVE_fmt) + break ; + + parsestage |= HAVE_fmt ; + + psf_log_printf (psf, "fmt : %d\n", chunk_size) ; + + if ((error = wavlike_read_fmt_chunk (psf, chunk_size))) + return error ; + + format = wav_fmt->format ; + break ; + + case data_MARKER : + if ((parsestage & (HAVE_RIFF | HAVE_WAVE | HAVE_fmt)) != (HAVE_RIFF | HAVE_WAVE | HAVE_fmt)) + return SFE_WAV_NO_DATA ; + + if (psf->file.mode == SFM_RDWR && (parsestage & HAVE_other) != 0) + return SFE_RDWR_BAD_HEADER ; + + parsestage |= HAVE_data ; + + psf->datalength = chunk_size ; + if (psf->datalength & 1) + psf_log_printf (psf, "*** 'data' chunk should be an even number of bytes in length.\n") ; + + psf->dataoffset = psf_ftell (psf) ; + + if (psf->dataoffset > 0) + { if (chunk_size == 0 && RIFFsize == 8 && psf->filelength > 44) + { psf_log_printf (psf, "*** Looks like a WAV file which wasn't closed properly. Fixing it.\n") ; + psf->datalength = psf->filelength - psf->dataoffset ; + } ; + + if (psf->datalength > psf->filelength - psf->dataoffset) + { psf_log_printf (psf, "data : %D (should be %D)\n", psf->datalength, psf->filelength - psf->dataoffset) ; + psf->datalength = psf->filelength - psf->dataoffset ; + } + else + psf_log_printf (psf, "data : %D\n", psf->datalength) ; + + /* Only set dataend if there really is data at the end. */ + if (psf->datalength + psf->dataoffset < psf->filelength) + psf->dataend = psf->datalength + psf->dataoffset ; + + psf->datalength += chunk_size & 1 ; + chunk_size = 0 ; + } ; + + if (! psf->sf.seekable || psf->dataoffset < 0) + break ; + + /* Seek past data and continue reading header. */ + psf_fseek (psf, psf->datalength, SEEK_CUR) ; + + if (psf_ftell (psf) != psf->datalength + psf->dataoffset) + psf_log_printf (psf, "*** psf_fseek past end error ***\n") ; + break ; + + case fact_MARKER : + if ((parsestage & (HAVE_RIFF | HAVE_WAVE)) != (HAVE_RIFF | HAVE_WAVE)) + return SFE_WAV_BAD_FACT ; + + parsestage |= HAVE_fact ; + + if ((parsestage & HAVE_fmt) != HAVE_fmt) + psf_log_printf (psf, "*** Should have 'fmt ' chunk before 'fact'\n") ; + + psf_binheader_readf (psf, "4", & (fact_chunk.frames)) ; + + if (chunk_size > SIGNED_SIZEOF (fact_chunk)) + psf_binheader_readf (psf, "j", (int) (chunk_size - SIGNED_SIZEOF (fact_chunk))) ; + + if (chunk_size) + psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ; + else + psf_log_printf (psf, "%M : %u (should not be zero)\n", marker, chunk_size) ; + + psf_log_printf (psf, " frames : %d\n", fact_chunk.frames) ; + break ; + + case PEAK_MARKER : + if ((parsestage & (HAVE_RIFF | HAVE_WAVE | HAVE_fmt)) != (HAVE_RIFF | HAVE_WAVE | HAVE_fmt)) + return SFE_WAV_PEAK_B4_FMT ; + + parsestage |= HAVE_PEAK ; + + psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ; + if ((error = wavlike_read_peak_chunk (psf, chunk_size)) != 0) + return error ; + psf->peak_info->peak_loc = ((parsestage & HAVE_data) == 0) ? SF_PEAK_START : SF_PEAK_END ; + break ; + + case cue_MARKER : + parsestage |= HAVE_other ; + + { uint32_t thisread, bytesread, cue_count, position, offset ; + int id, chunk_id, chunk_start, block_start, cue_index ; + + bytesread = psf_binheader_readf (psf, "4", &cue_count) ; + psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ; + + if (cue_count > 2500) /* 2500 is close to the largest number of cues possible because of block sizes */ + { psf_log_printf (psf, " Count : %u (skipping)\n", cue_count) ; + psf_binheader_readf (psf, "j", chunk_size - bytesread) ; + break ; + } ; + + psf_log_printf (psf, " Count : %d\n", cue_count) ; + + if (psf->cues) + { free (psf->cues) ; + psf->cues = NULL ; + } ; + + if ((psf->cues = psf_cues_alloc (cue_count)) == NULL) + return SFE_MALLOC_FAILED ; + + cue_index = 0 ; + + while (cue_count) + { + if ((thisread = psf_binheader_readf (psf, "e44m444", &id, &position, &chunk_id, &chunk_start, &block_start, &offset)) == 0) + break ; + bytesread += thisread ; + + if (cue_index < 10) /* avoid swamping log buffer with cues */ + psf_log_printf (psf, " Cue ID : %2d" + " Pos : %5u Chunk : %M" + " Chk Start : %d Blk Start : %d" + " Offset : %5d\n", + id, position, chunk_id, chunk_start, block_start, offset) ; + else if (cue_index == 10) + psf_log_printf (psf, " (Skipping)\n") ; + + psf->cues->cue_points [cue_index].indx = id ; + psf->cues->cue_points [cue_index].position = position ; + psf->cues->cue_points [cue_index].fcc_chunk = chunk_id ; + psf->cues->cue_points [cue_index].chunk_start = chunk_start ; + psf->cues->cue_points [cue_index].block_start = block_start ; + psf->cues->cue_points [cue_index].sample_offset = offset ; + psf->cues->cue_points [cue_index].name [0] = '\0' ; + cue_count -- ; + cue_index ++ ; + } ; + + if (bytesread != chunk_size) + { psf_log_printf (psf, "**** Chunk size weirdness (%d != %d)\n", chunk_size, bytesread) ; + psf_binheader_readf (psf, "j", chunk_size - bytesread) ; + } ; + } ; + break ; + + case smpl_MARKER : + parsestage |= HAVE_other ; + + psf_log_printf (psf, "smpl : %u\n", chunk_size) ; + + if ((error = wav_read_smpl_chunk (psf, chunk_size))) + return error ; + break ; + + case acid_MARKER : + parsestage |= HAVE_other ; + + psf_log_printf (psf, "acid : %u\n", chunk_size) ; + + if ((error = wav_read_acid_chunk (psf, chunk_size))) + return error ; + break ; + + case INFO_MARKER : + case LIST_MARKER : + parsestage |= HAVE_other ; + + if ((error = wavlike_subchunk_parse (psf, marker, chunk_size)) != 0) + return error ; + break ; + + case bext_MARKER : + /* + The 'bext' chunk can actually be updated, so don't need to set this. + parsestage |= HAVE_other ; + */ + if ((error = wavlike_read_bext_chunk (psf, chunk_size))) + return error ; + break ; + + case PAD_MARKER : + /* + We can eat into a 'PAD ' chunk if we need to. + parsestage |= HAVE_other ; + */ + psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ; + psf_binheader_readf (psf, "j", chunk_size) ; + break ; + + case cart_MARKER: + if ((error = wavlike_read_cart_chunk (psf, chunk_size))) + return error ; + break ; + + case iXML_MARKER : /* See http://en.wikipedia.org/wiki/IXML */ + case strc_MARKER : /* Multiple of 32 bytes. */ + case afsp_MARKER : + case clm_MARKER : + case elmo_MARKER : + case levl_MARKER : + case plst_MARKER : + case minf_MARKER : + case elm1_MARKER : + case regn_MARKER : + case ovwf_MARKER : + case inst_MARKER : + case AFAn_MARKER : + case umid_MARKER : + case SyLp_MARKER : + case Cr8r_MARKER : + case JUNK_MARKER : + case PMX_MARKER : + case DISP_MARKER : + case MEXT_MARKER : + case FLLR_MARKER : + psf_log_printf (psf, "%M : %u\n", marker, chunk_size) ; + psf_binheader_readf (psf, "j", chunk_size) ; + break ; + + default : + if (chunk_size >= 0xffff0000) + { done = SF_TRUE ; + psf_log_printf (psf, "*** Unknown chunk marker (%X) at position %D with length %u. Exiting parser.\n", marker, psf_ftell (psf) - 8, chunk_size) ; + break ; + } ; + + if (psf_isprint ((marker >> 24) & 0xFF) && psf_isprint ((marker >> 16) & 0xFF) + && psf_isprint ((marker >> 8) & 0xFF) && psf_isprint (marker & 0xFF)) + { psf_log_printf (psf, "*** %M : %u (unknown marker)\n", marker, chunk_size) ; + psf_binheader_readf (psf, "j", chunk_size) ; + break ; + } ; + if (psf_ftell (psf) & 0x03) + { psf_log_printf (psf, " Unknown chunk marker at position %D. Resynching.\n", psf_ftell (psf) - 8) ; + psf_binheader_readf (psf, "j", -3) ; + /* File is too messed up so we prevent editing in RDWR mode here. */ + parsestage |= HAVE_other ; + break ; + } ; + psf_log_printf (psf, "*** Unknown chunk marker (%X) at position %D. Exiting parser.\n", marker, psf_ftell (psf) - 8) ; + done = SF_TRUE ; + break ; + } ; /* switch (marker) */ + + if (chunk_size >= psf->filelength) + { psf_log_printf (psf, "*** Chunk size %u > file length %D. Exiting parser.\n", chunk_size, psf->filelength) ; + break ; + } ; + + if (! psf->sf.seekable && (parsestage & HAVE_data)) + break ; + + if (psf_ftell (psf) >= psf->filelength - SIGNED_SIZEOF (chunk_size)) + { psf_log_printf (psf, "End\n") ; + break ; + } ; + } ; /* while (1) */ + + if (psf->dataoffset <= 0) + return SFE_WAV_NO_DATA ; + + if (psf->sf.channels < 1) + return SFE_CHANNEL_COUNT_ZERO ; + + if (psf->sf.channels > SF_MAX_CHANNELS) + return SFE_CHANNEL_COUNT ; + + if (format != WAVE_FORMAT_PCM && (parsestage & HAVE_fact) == 0) + psf_log_printf (psf, "**** All non-PCM format files should have a 'fact' chunk.\n") ; + + /* WAVs can be little or big endian */ + psf->endian = psf->rwf_endian ; + + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + + if (psf->is_pipe == 0) + { /* + ** Check for 'wvpk' at the start of the DATA section. Not able to + ** handle this. + */ + psf_binheader_readf (psf, "4", &marker) ; + if (marker == wvpk_MARKER || marker == OggS_MARKER) + return SFE_WAV_WVPK_DATA ; + } ; + + /* Seek to start of DATA section. */ + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + + if (psf->blockwidth) + { if (psf->filelength - psf->dataoffset < psf->datalength) + psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ; + else + psf->sf.frames = psf->datalength / psf->blockwidth ; + } ; + + switch (format) + { case WAVE_FORMAT_EXTENSIBLE : + if (psf->sf.format == (SF_FORMAT_WAVEX | SF_FORMAT_MS_ADPCM)) + { *blockalign = wav_fmt->msadpcm.blockalign ; + *framesperblock = wav_fmt->msadpcm.samplesperblock ; + } ; + break ; + + case WAVE_FORMAT_NMS_VBXADPCM : + *blockalign = wav_fmt->min.blockalign ; + *framesperblock = 160 ; + switch (wav_fmt->min.bitwidth) + { case 2 : + psf->sf.format = SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_16 ; + break ; + case 3 : + psf->sf.format = SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_24 ; + break ; + case 4 : + psf->sf.format = SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_32 ; + break ; + + default : + return SFE_UNIMPLEMENTED ; + } + break ; + + case WAVE_FORMAT_PCM : + psf->sf.format = SF_FORMAT_WAV | u_bitwidth_to_subformat (psf->bytewidth * 8) ; + break ; + + case WAVE_FORMAT_MULAW : + case IBM_FORMAT_MULAW : + psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_ULAW) ; + break ; + + case WAVE_FORMAT_ALAW : + case IBM_FORMAT_ALAW : + psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_ALAW) ; + break ; + + case WAVE_FORMAT_MS_ADPCM : + psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM) ; + *blockalign = wav_fmt->msadpcm.blockalign ; + *framesperblock = wav_fmt->msadpcm.samplesperblock ; + break ; + + case WAVE_FORMAT_IMA_ADPCM : + psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM) ; + *blockalign = wav_fmt->ima.blockalign ; + *framesperblock = wav_fmt->ima.samplesperblock ; + break ; + + case WAVE_FORMAT_GSM610 : + psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_GSM610) ; + break ; + + case WAVE_FORMAT_IEEE_FLOAT : + psf->sf.format = SF_FORMAT_WAV ; + psf->sf.format |= (psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT ; + break ; + + case WAVE_FORMAT_G721_ADPCM : + psf->sf.format = SF_FORMAT_WAV | SF_FORMAT_G721_32 ; + break ; + + default : return SFE_UNIMPLEMENTED ; + } ; + + if (wpriv->fmt_is_broken) + wavlike_analyze (psf) ; + + /* Only set the format endian-ness if its non-standard big-endian. */ + if (psf->endian == SF_ENDIAN_BIG) + psf->sf.format |= SF_ENDIAN_BIG ; + + return 0 ; +} /* wav_read_header */ + +static int +wav_write_fmt_chunk (SF_PRIVATE *psf) +{ int subformat, fmt_size, add_fact_chunk = 0 ; + + subformat = SF_CODEC (psf->sf.format) ; + + switch (subformat) + { case SF_FORMAT_PCM_U8 : + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_32 : + fmt_size = 2 + 2 + 4 + 4 + 2 + 2 ; + + /* fmt : format, channels, samplerate */ + psf_binheader_writef (psf, "4224", BHW4 (fmt_size), BHW2 (WAVE_FORMAT_PCM), BHW2 (psf->sf.channels), BHW4 (psf->sf.samplerate)) ; + /* fmt : bytespersec */ + psf_binheader_writef (psf, "4", BHW4 (psf->sf.samplerate * psf->bytewidth * psf->sf.channels)) ; + /* fmt : blockalign, bitwidth */ + psf_binheader_writef (psf, "22", BHW2 (psf->bytewidth * psf->sf.channels), BHW2 (psf->bytewidth * 8)) ; + break ; + + case SF_FORMAT_FLOAT : + case SF_FORMAT_DOUBLE : + fmt_size = 2 + 2 + 4 + 4 + 2 + 2 ; + + /* fmt : format, channels, samplerate */ + psf_binheader_writef (psf, "4224", BHW4 (fmt_size), BHW2 (WAVE_FORMAT_IEEE_FLOAT), BHW2 (psf->sf.channels), BHW4 (psf->sf.samplerate)) ; + /* fmt : bytespersec */ + psf_binheader_writef (psf, "4", BHW4 (psf->sf.samplerate * psf->bytewidth * psf->sf.channels)) ; + /* fmt : blockalign, bitwidth */ + psf_binheader_writef (psf, "22", BHW2 (psf->bytewidth * psf->sf.channels), BHW2 (psf->bytewidth * 8)) ; + + add_fact_chunk = SF_TRUE ; + break ; + + case SF_FORMAT_ULAW : + fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 ; + + /* fmt : format, channels, samplerate */ + psf_binheader_writef (psf, "4224", BHW4 (fmt_size), BHW2 (WAVE_FORMAT_MULAW), BHW2 (psf->sf.channels), BHW4 (psf->sf.samplerate)) ; + /* fmt : bytespersec */ + psf_binheader_writef (psf, "4", BHW4 (psf->sf.samplerate * psf->bytewidth * psf->sf.channels)) ; + /* fmt : blockalign, bitwidth, extrabytes */ + psf_binheader_writef (psf, "222", BHW2 (psf->bytewidth * psf->sf.channels), BHW2 (8), BHW2 (0)) ; + + add_fact_chunk = SF_TRUE ; + break ; + + case SF_FORMAT_ALAW : + fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 ; + + /* fmt : format, channels, samplerate */ + psf_binheader_writef (psf, "4224", BHW4 (fmt_size), BHW2 (WAVE_FORMAT_ALAW), BHW2 (psf->sf.channels), BHW4 (psf->sf.samplerate)) ; + /* fmt : bytespersec */ + psf_binheader_writef (psf, "4", BHW4 (psf->sf.samplerate * psf->bytewidth * psf->sf.channels)) ; + /* fmt : blockalign, bitwidth, extrabytes */ + psf_binheader_writef (psf, "222", BHW2 (psf->bytewidth * psf->sf.channels), BHW2 (8), BHW2 (0)) ; + + add_fact_chunk = SF_TRUE ; + break ; + + /* Lite remove start */ + case SF_FORMAT_IMA_ADPCM : + { int blockalign, framesperblock, bytespersec ; + + blockalign = wavlike_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ; + framesperblock = 2 * (blockalign - 4 * psf->sf.channels) / psf->sf.channels + 1 ; + bytespersec = (psf->sf.samplerate * blockalign) / framesperblock ; + + /* fmt chunk. */ + fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ; + + /* fmt : size, WAV format type, channels, samplerate, bytespersec */ + psf_binheader_writef (psf, "42244", BHW4 (fmt_size), BHW2 (WAVE_FORMAT_IMA_ADPCM), + BHW2 (psf->sf.channels), BHW4 (psf->sf.samplerate), BHW4 (bytespersec)) ; + + /* fmt : blockalign, bitwidth, extrabytes, framesperblock. */ + psf_binheader_writef (psf, "2222", BHW2 (blockalign), BHW2 (4), BHW2 (2), BHW2 (framesperblock)) ; + } ; + + add_fact_chunk = SF_TRUE ; + break ; + + case SF_FORMAT_MS_ADPCM : + { int blockalign, framesperblock, bytespersec, extrabytes ; + + blockalign = wavlike_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ; + framesperblock = 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ; + bytespersec = (psf->sf.samplerate * blockalign) / framesperblock ; + + /* fmt chunk. */ + extrabytes = 2 + 2 + WAVLIKE_MSADPCM_ADAPT_COEFF_COUNT * (2 + 2) ; + fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + extrabytes ; + + /* fmt : size, WAV format type, channels. */ + psf_binheader_writef (psf, "422", BHW4 (fmt_size), BHW2 (WAVE_FORMAT_MS_ADPCM), BHW2 (psf->sf.channels)) ; + + /* fmt : samplerate, bytespersec. */ + psf_binheader_writef (psf, "44", BHW4 (psf->sf.samplerate), BHW4 (bytespersec)) ; + + /* fmt : blockalign, bitwidth, extrabytes, framesperblock. */ + psf_binheader_writef (psf, "22222", BHW2 (blockalign), BHW2 (4), BHW2 (extrabytes), BHW2 (framesperblock), BHW2 (7)) ; + + wavlike_msadpcm_write_adapt_coeffs (psf) ; + } ; + + add_fact_chunk = SF_TRUE ; + break ; + + + case SF_FORMAT_G721_32 : + /* fmt chunk. */ + fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ; + + /* fmt : size, WAV format type, channels, samplerate, bytespersec */ + psf_binheader_writef (psf, "42244", BHW4 (fmt_size), BHW2 (WAVE_FORMAT_G721_ADPCM), + BHW2 (psf->sf.channels), BHW4 (psf->sf.samplerate), BHW4 (psf->sf.samplerate * psf->sf.channels / 2)) ; + + /* fmt : blockalign, bitwidth, extrabytes, auxblocksize. */ + psf_binheader_writef (psf, "2222", BHW2 (64), BHW2 (4), BHW2 (2), BHW2 (0)) ; + + add_fact_chunk = SF_TRUE ; + break ; + + case SF_FORMAT_NMS_ADPCM_16 : + case SF_FORMAT_NMS_ADPCM_24 : + case SF_FORMAT_NMS_ADPCM_32 : + { int bytespersec, blockalign, bitwidth ; + + bitwidth = subformat == SF_FORMAT_NMS_ADPCM_16 ? 2 : subformat == SF_FORMAT_NMS_ADPCM_24 ? 3 : 4 ; + blockalign = 20 * bitwidth + 2 ; + bytespersec = psf->sf.samplerate * blockalign / 160 ; + + /* fmt chunk. */ + fmt_size = 2 + 2 + 4 + 4 + 2 + 2 ; + + /* fmt : format, channels, samplerate */ + psf_binheader_writef (psf, "4224", BHW4 (fmt_size), BHW2 (WAVE_FORMAT_NMS_VBXADPCM), + BHW2 (psf->sf.channels), BHW4 (psf->sf.samplerate)) ; + /* fmt : bytespersec, blockalign, bitwidth */ + psf_binheader_writef (psf, "422", BHW4 (bytespersec), BHW2 (blockalign), BHW2 (bitwidth)) ; + + add_fact_chunk = SF_TRUE ; + break ; + } + + /* Lite remove end */ + + case SF_FORMAT_GSM610 : + { int blockalign, framesperblock, bytespersec ; + + blockalign = WAVLIKE_GSM610_BLOCKSIZE ; + framesperblock = WAVLIKE_GSM610_SAMPLES ; + bytespersec = (psf->sf.samplerate * blockalign) / framesperblock ; + + /* fmt chunk. */ + fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ; + + /* fmt : size, WAV format type, channels. */ + psf_binheader_writef (psf, "422", BHW4 (fmt_size), BHW2 (WAVE_FORMAT_GSM610), BHW2 (psf->sf.channels)) ; + + /* fmt : samplerate, bytespersec. */ + psf_binheader_writef (psf, "44", BHW4 (psf->sf.samplerate), BHW4 (bytespersec)) ; + + /* fmt : blockalign, bitwidth, extrabytes, framesperblock. */ + psf_binheader_writef (psf, "2222", BHW2 (blockalign), BHW2 (0), BHW2 (2), BHW2 (framesperblock)) ; + } ; + + add_fact_chunk = SF_TRUE ; + break ; + + default : return SFE_UNIMPLEMENTED ; + } ; + + if (add_fact_chunk) + psf_binheader_writef (psf, "tm48", BHWm (fact_MARKER), BHW4 (4), BHW8 (psf->sf.frames)) ; + + return 0 ; +} /* wav_write_fmt_chunk */ + +static int +wavex_write_fmt_chunk (SF_PRIVATE *psf) +{ WAVLIKE_PRIVATE *wpriv ; + int subformat, fmt_size ; + + if ((wpriv = psf->container_data) == NULL) + return SFE_INTERNAL ; + + subformat = SF_CODEC (psf->sf.format) ; + + /* initial section (same for all, it appears) */ + switch (subformat) + { case SF_FORMAT_PCM_U8 : + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_32 : + case SF_FORMAT_FLOAT : + case SF_FORMAT_DOUBLE : + case SF_FORMAT_ULAW : + case SF_FORMAT_ALAW : + fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 + 4 + 4 + 2 + 2 + 8 ; + + /* fmt : format, channels, samplerate */ + psf_binheader_writef (psf, "4224", BHW4 (fmt_size), BHW2 (WAVE_FORMAT_EXTENSIBLE), BHW2 (psf->sf.channels), BHW4 (psf->sf.samplerate)) ; + /* fmt : bytespersec */ + psf_binheader_writef (psf, "4", BHW4 (psf->sf.samplerate * psf->bytewidth * psf->sf.channels)) ; + /* fmt : blockalign, bitwidth */ + psf_binheader_writef (psf, "22", BHW2 (psf->bytewidth * psf->sf.channels), BHW2 (psf->bytewidth * 8)) ; + + /* cbSize 22 is sizeof (WAVEFORMATEXTENSIBLE) - sizeof (WAVEFORMATEX) */ + psf_binheader_writef (psf, "2", BHW2 (22)) ; + + /* wValidBitsPerSample, for our use same as bitwidth as we use it fully */ + psf_binheader_writef (psf, "2", BHW2 (psf->bytewidth * 8)) ; + + /* For an Ambisonic file set the channel mask to zero. + ** Otherwise use a default based on the channel count. + */ + if (wpriv->wavex_ambisonic != SF_AMBISONIC_NONE) + psf_binheader_writef (psf, "4", BHW4 (0)) ; + else if (wpriv->wavex_channelmask != 0) + psf_binheader_writef (psf, "4", BHW4 (wpriv->wavex_channelmask)) ; + else + { /* + ** Ok some liberty is taken here to use the most commonly used channel masks + ** instead of "no mapping". If you really want to use "no mapping" for 8 channels and less + ** please don't use wavex. (otherwise we'll have to create a new SF_COMMAND) + */ + switch (psf->sf.channels) + { case 1 : /* center channel mono */ + psf_binheader_writef (psf, "4", BHW4 (0x4)) ; + break ; + + case 2 : /* front left and right */ + psf_binheader_writef (psf, "4", BHW4 (0x1 | 0x2)) ; + break ; + + case 4 : /* Quad */ + psf_binheader_writef (psf, "4", BHW4 (0x1 | 0x2 | 0x10 | 0x20)) ; + break ; + + case 6 : /* 5.1 */ + psf_binheader_writef (psf, "4", BHW4 (0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20)) ; + break ; + + case 8 : /* 7.1 */ + psf_binheader_writef (psf, "4", BHW4 (0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20 | 0x40 | 0x80)) ; + break ; + + default : /* 0 when in doubt , use direct out, ie NO mapping*/ + psf_binheader_writef (psf, "4", BHW4 (0x0)) ; + break ; + } ; + } ; + break ; + + case SF_FORMAT_MS_ADPCM : /* Todo, GUID exists might have different header as per wav_write_header */ + default : + return SFE_UNIMPLEMENTED ; + } ; + + /* GUID section, different for each */ + + switch (subformat) + { case SF_FORMAT_PCM_U8 : + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_32 : + wavlike_write_guid (psf, wpriv->wavex_ambisonic == SF_AMBISONIC_NONE ? + &MSGUID_SUBTYPE_PCM : &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM) ; + break ; + + case SF_FORMAT_FLOAT : + case SF_FORMAT_DOUBLE : + wavlike_write_guid (psf, wpriv->wavex_ambisonic == SF_AMBISONIC_NONE ? + &MSGUID_SUBTYPE_IEEE_FLOAT : &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT) ; + break ; + + case SF_FORMAT_ULAW : + wavlike_write_guid (psf, &MSGUID_SUBTYPE_MULAW) ; + break ; + + case SF_FORMAT_ALAW : + wavlike_write_guid (psf, &MSGUID_SUBTYPE_ALAW) ; + break ; + +#if 0 + /* This is dead code due to return in previous switch statement. */ + case SF_FORMAT_MS_ADPCM : /* todo, GUID exists */ + wavlike_write_guid (psf, &MSGUID_SUBTYPE_MS_ADPCM) ; + break ; + return SFE_UNIMPLEMENTED ; +#endif + + default : return SFE_UNIMPLEMENTED ; + } ; + + psf_binheader_writef (psf, "tm48", BHWm (fact_MARKER), BHW4 (4), BHW8 (psf->sf.frames)) ; + + return 0 ; +} /* wavex_write_fmt_chunk */ + + +static int +wav_write_header (SF_PRIVATE *psf, int calc_length) +{ sf_count_t current ; + int error, has_data = SF_FALSE ; + + current = psf_ftell (psf) ; + + if (current > psf->dataoffset) + has_data = SF_TRUE ; + + if (calc_length) + { psf->filelength = psf_get_filelen (psf) ; + + psf->datalength = psf->filelength - psf->dataoffset ; + + if (psf->dataend) + psf->datalength -= psf->filelength - psf->dataend ; + else if (psf->bytewidth > 0 && psf->sf.seekable == SF_TRUE) + psf->datalength = psf->sf.frames * psf->bytewidth * psf->sf.channels ; + } ; + + /* Reset the current header length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + psf_fseek (psf, 0, SEEK_SET) ; + + /* + ** RIFX signifies big-endian format for all header and data. + ** To prevent lots of code copying here, we'll set the psf->rwf_endian flag + ** once here, and never specify endian-ness for all other header operations. + */ + + /* RIFF/RIFX marker, length, WAVE and 'fmt ' markers. */ + + if (psf->endian == SF_ENDIAN_LITTLE) + psf_binheader_writef (psf, "etm8", BHWm (RIFF_MARKER), BHW8 ((psf->filelength < 8) ? 8 : psf->filelength - 8)) ; + else + psf_binheader_writef (psf, "Etm8", BHWm (RIFX_MARKER), BHW8 ((psf->filelength < 8) ? 8 : psf->filelength - 8)) ; + + /* WAVE and 'fmt ' markers. */ + psf_binheader_writef (psf, "mm", BHWm (WAVE_MARKER), BHWm (fmt_MARKER)) ; + + /* Write the 'fmt ' chunk. */ + switch (SF_CONTAINER (psf->sf.format)) + { case SF_FORMAT_WAV : + if ((error = wav_write_fmt_chunk (psf)) != 0) + return error ; + break ; + + case SF_FORMAT_WAVEX : + if ((error = wavex_write_fmt_chunk (psf)) != 0) + return error ; + break ; + + default : + return SFE_UNIMPLEMENTED ; + } ; + + /* The LIST/INFO chunk. */ + if (psf->strings.flags & SF_STR_LOCATE_START) + wavlike_write_strings (psf, SF_STR_LOCATE_START) ; + + if (psf->peak_info != NULL && psf->peak_info->peak_loc == SF_PEAK_START) + wavlike_write_peak_chunk (psf) ; + + if (psf->broadcast_16k != NULL) + wavlike_write_bext_chunk (psf) ; + + if (psf->cart_16k != NULL) + wavlike_write_cart_chunk (psf) ; + + if (psf->cues != NULL) + { uint32_t k ; + + psf_binheader_writef (psf, "em44", BHWm (cue_MARKER), BHW4 (4 + psf->cues->cue_count * 6 * 4), BHW4 (psf->cues->cue_count)) ; + + for (k = 0 ; k < psf->cues->cue_count ; k++) + psf_binheader_writef (psf, "e44m444", BHW4 (psf->cues->cue_points [k].indx), BHW4 (psf->cues->cue_points [k].position), + BHWm (psf->cues->cue_points [k].fcc_chunk), BHW4 (psf->cues->cue_points [k].chunk_start), + BHW4 (psf->cues->cue_points [k].block_start), BHW4 (psf->cues->cue_points [k].sample_offset)) ; + } ; + + if (psf->instrument != NULL) + { int tmp ; + double dtune = (double) (0x40000000) / 25.0 ; + + psf_binheader_writef (psf, "m4", BHWm (smpl_MARKER), BHW4 (9 * 4 + psf->instrument->loop_count * 6 * 4)) ; + psf_binheader_writef (psf, "44", BHW4 (0), BHW4 (0)) ; /* Manufacturer zero is everyone */ + tmp = (int) (1.0e9 / psf->sf.samplerate) ; /* Sample period in nano seconds */ + psf_binheader_writef (psf, "44", BHW4 (tmp), BHW4 (psf->instrument->basenote)) ; + tmp = (uint32_t) (psf->instrument->detune * dtune + 0.5) ; + psf_binheader_writef (psf, "4", BHW4 (tmp)) ; + psf_binheader_writef (psf, "44", BHW4 (0), BHW4 (0)) ; /* SMTPE format */ + psf_binheader_writef (psf, "44", BHW4 (psf->instrument->loop_count), BHW4 (0)) ; + + /* Make sure we don't read past the loops array end. */ + if (psf->instrument->loop_count > ARRAY_LEN (psf->instrument->loops)) + psf->instrument->loop_count = ARRAY_LEN (psf->instrument->loops) ; + + for (tmp = 0 ; tmp < psf->instrument->loop_count ; tmp++) + { int type ; + + type = psf->instrument->loops [tmp].mode ; + type = (type == SF_LOOP_FORWARD ? 0 : type == SF_LOOP_BACKWARD ? 2 : type == SF_LOOP_ALTERNATING ? 1 : 32) ; + + psf_binheader_writef (psf, "44", BHW4 (tmp), BHW4 (type)) ; + psf_binheader_writef (psf, "44", BHW4 (psf->instrument->loops [tmp].start), BHW4 (psf->instrument->loops [tmp].end - 1)) ; + psf_binheader_writef (psf, "44", BHW4 (0), BHW4 (psf->instrument->loops [tmp].count)) ; + } ; + } ; + + /* Write custom headers. */ + if (psf->wchunks.used > 0) + wavlike_write_custom_chunks (psf) ; + + if (psf->header.indx + 16 < psf->dataoffset) + { /* Add PAD data if necessary. */ + size_t k = psf->dataoffset - (psf->header.indx + 16) ; + psf_binheader_writef (psf, "m4z", BHWm (PAD_MARKER), BHW4 (k), BHWz (k)) ; + } ; + + psf_binheader_writef (psf, "tm8", BHWm (data_MARKER), BHW8 (psf->datalength)) ; + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + if (psf->error) + return psf->error ; + + if (has_data && psf->dataoffset != psf->header.indx) + { psf_log_printf (psf, "Oooops : has_data && psf->dataoffset != psf->header.indx\n") ; + return psf->error = SFE_INTERNAL ; + } ; + + psf->dataoffset = psf->header.indx ; + + if (! has_data) + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + else if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + + return psf->error ; +} /* wav_write_header */ + + +static int +wav_write_tailer (SF_PRIVATE *psf) +{ + /* Reset the current header buffer length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + + if (psf->bytewidth > 0 && psf->sf.seekable == SF_TRUE) + { psf->datalength = psf->sf.frames * psf->bytewidth * psf->sf.channels ; + psf->dataend = psf->dataoffset + psf->datalength ; + } ; + + if (psf->dataend > 0) + psf_fseek (psf, psf->dataend, SEEK_SET) ; + else + psf->dataend = psf_fseek (psf, 0, SEEK_END) ; + + if (psf->dataend & 1) + psf_binheader_writef (psf, "z", BHWz (1)) ; + + /* Add a PEAK chunk if requested. */ + if (psf->peak_info != NULL && psf->peak_info->peak_loc == SF_PEAK_END) + wavlike_write_peak_chunk (psf) ; + + if (psf->strings.flags & SF_STR_LOCATE_END) + wavlike_write_strings (psf, SF_STR_LOCATE_END) ; + + /* Write the tailer. */ + if (psf->header.indx > 0) + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + return 0 ; +} /* wav_write_tailer */ + +static int +wav_close (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { wav_write_tailer (psf) ; + + if (psf->file.mode == SFM_RDWR) + { sf_count_t current = psf_ftell (psf) ; + + /* + ** If the mode is RDWR and the current position is less than the + ** filelength, truncate the file. + */ + + if (current < psf->filelength) + { psf_ftruncate (psf, current) ; + psf->filelength = current ; + } ; + } ; + + psf->write_header (psf, SF_TRUE) ; + } ; + + return 0 ; +} /* wav_close */ + +static int +wav_command (SF_PRIVATE *psf, int command, void * UNUSED (data), int datasize) +{ WAVLIKE_PRIVATE *wpriv ; + + if ((wpriv = psf->container_data) == NULL) + return SFE_INTERNAL ; + + switch (command) + { case SFC_WAVEX_SET_AMBISONIC : + if ((SF_CONTAINER (psf->sf.format)) == SF_FORMAT_WAVEX) + { if (datasize == SF_AMBISONIC_NONE) + wpriv->wavex_ambisonic = SF_AMBISONIC_NONE ; + else if (datasize == SF_AMBISONIC_B_FORMAT) + wpriv->wavex_ambisonic = SF_AMBISONIC_B_FORMAT ; + else + return 0 ; + } ; + return wpriv->wavex_ambisonic ; + + case SFC_WAVEX_GET_AMBISONIC : + return wpriv->wavex_ambisonic ; + + case SFC_SET_CHANNEL_MAP_INFO : + wpriv->wavex_channelmask = wavlike_gen_channel_mask (psf->channel_map, psf->sf.channels) ; + return (wpriv->wavex_channelmask != 0) ; + + default : + break ; + } ; + + return 0 ; +} /* wav_command */ + +static int +wav_read_smpl_chunk (SF_PRIVATE *psf, uint32_t chunklen) +{ char buffer [512] ; + uint32_t thisread, bytesread = 0, dword, sampler_data, loop_count, actually_loop_count = 0 ; + uint32_t note, pitch, start, end, type = -1, count ; + int j, k ; + + chunklen += (chunklen & 1) ; + + bytesread += psf_binheader_readf (psf, "4", &dword) ; + psf_log_printf (psf, " Manufacturer : %X\n", dword) ; + + bytesread += psf_binheader_readf (psf, "4", &dword) ; + psf_log_printf (psf, " Product : %u\n", dword) ; + + bytesread += psf_binheader_readf (psf, "4", &dword) ; + psf_log_printf (psf, " Period : %u nsec\n", dword) ; + + bytesread += psf_binheader_readf (psf, "4", ¬e) ; + psf_log_printf (psf, " Midi Note : %u\n", note) ; + + bytesread += psf_binheader_readf (psf, "4", &pitch) ; + if (pitch != 0) + { snprintf (buffer, sizeof (buffer), "%f", + (1.0 * 0x80000000) / ((uint32_t) pitch)) ; + psf_log_printf (psf, " Pitch Fract. : %s\n", buffer) ; + } + else + psf_log_printf (psf, " Pitch Fract. : 0\n") ; + + bytesread += psf_binheader_readf (psf, "4", &dword) ; + psf_log_printf (psf, " SMPTE Format : %u\n", dword) ; + + bytesread += psf_binheader_readf (psf, "4", &dword) ; + snprintf (buffer, sizeof (buffer), "%02d:%02d:%02d %02d", + (dword >> 24) & 0x7F, (dword >> 16) & 0x7F, (dword >> 8) & 0x7F, dword & 0x7F) ; + psf_log_printf (psf, " SMPTE Offset : %s\n", buffer) ; + + bytesread += psf_binheader_readf (psf, "4", &loop_count) ; + psf_log_printf (psf, " Loop Count : %u\n", loop_count) ; + + if (loop_count == 0 && chunklen == bytesread) + return 0 ; + + /* Sampler Data holds the number of data bytes after the CUE chunks which + ** is not actually CUE data. Display value after CUE data. + */ + bytesread += psf_binheader_readf (psf, "4", &sampler_data) ; + + if (psf->instrument) + { psf_log_printf (psf, " Found more than one SMPL chunk, using last one.\n") ; + free (psf->instrument) ; + psf->instrument = NULL ; + } ; + if ((psf->instrument = psf_instrument_alloc ()) == NULL) + return SFE_MALLOC_FAILED ; + + psf->instrument->loop_count = loop_count ; + + for (j = 0 ; loop_count > 0 && chunklen - bytesread >= 24 ; j ++) + { if ((thisread = psf_binheader_readf (psf, "4", &dword)) == 0) + break ; + bytesread += thisread ; + psf_log_printf (psf, " Cue ID : %2u", dword) ; + + bytesread += psf_binheader_readf (psf, "4", &type) ; + psf_log_printf (psf, " Type : %2u", type) ; + + bytesread += psf_binheader_readf (psf, "4", &start) ; + psf_log_printf (psf, " Start : %5u", start) ; + + bytesread += psf_binheader_readf (psf, "4", &end) ; + psf_log_printf (psf, " End : %5u", end) ; + + bytesread += psf_binheader_readf (psf, "4", &dword) ; + psf_log_printf (psf, " Fraction : %5u", dword) ; + + bytesread += psf_binheader_readf (psf, "4", &count) ; + psf_log_printf (psf, " Count : %5u\n", count) ; + + if (j < ARRAY_LEN (psf->instrument->loops)) + { psf->instrument->loops [j].start = start ; + psf->instrument->loops [j].end = end + 1 ; + psf->instrument->loops [j].count = count ; + + switch (type) + { case 0 : + psf->instrument->loops [j].mode = SF_LOOP_FORWARD ; + break ; + case 1 : + psf->instrument->loops [j].mode = SF_LOOP_ALTERNATING ; + break ; + case 2 : + psf->instrument->loops [j].mode = SF_LOOP_BACKWARD ; + break ; + default: + psf->instrument->loops [j].mode = SF_LOOP_NONE ; + break ; + } ; + } ; + actually_loop_count ++ ; + } ; + + if (actually_loop_count > ARRAY_LEN (psf->instrument->loops)) + { + psf_log_printf (psf, "*** Warning, actual Loop Points count exceeds %u, changing Loop Count from %u to %u\n", ARRAY_LEN (psf->instrument->loops), loop_count, ARRAY_LEN (psf->instrument->loops)) ; + psf->instrument->loop_count = ARRAY_LEN (psf->instrument->loops) ; + } + else if (loop_count != actually_loop_count) + { psf_log_printf (psf, "*** Warning, actual Loop Points count != Loop Count, changing Loop Count from %u to %u\n", loop_count, actually_loop_count) ; + psf->instrument->loop_count = actually_loop_count ; + } ; + + if (chunklen - bytesread == 0) + { if (sampler_data != 0) + psf_log_printf (psf, " Sampler Data : %u (should be 0)\n", sampler_data) ; + else + psf_log_printf (psf, " Sampler Data : %u\n", sampler_data) ; + } + else + { if (sampler_data != chunklen - bytesread) + { psf_log_printf (psf, " Sampler Data : %u (should have been %u)\n", sampler_data, chunklen - bytesread) ; + sampler_data = chunklen - bytesread ; + } + else + psf_log_printf (psf, " Sampler Data : %u\n", sampler_data) ; + + psf_log_printf (psf, " ") ; + for (k = 0 ; k < (int) sampler_data ; k++) + { char ch ; + + if (k > 0 && (k % 20) == 0) + psf_log_printf (psf, "\n ") ; + + if ((thisread = psf_binheader_readf (psf, "1", &ch)) == 0) + break ; + bytesread += thisread ; + psf_log_printf (psf, "%02X ", ch & 0xFF) ; + } ; + + psf_log_printf (psf, "\n") ; + } ; + + psf->instrument->basenote = note ; + psf->instrument->detune = (int8_t) (pitch / (0x40000000 / 25.0) + 0.5) ; + psf->instrument->gain = 1 ; + psf->instrument->velocity_lo = psf->instrument->key_lo = 0 ; + psf->instrument->velocity_hi = psf->instrument->key_hi = 127 ; + + return 0 ; +} /* wav_read_smpl_chunk */ + +/* +** The acid chunk goes a little something like this: +** +** 4 bytes 'acid' +** 4 bytes (int) length of chunk starting at next byte +** +** 4 bytes (int) type of file: +** this appears to be a bit mask,however some combinations +** are probably impossible and/or qualified as "errors" +** +** 0x01 On: One Shot Off: Loop +** 0x02 On: Root note is Set Off: No root +** 0x04 On: Stretch is On, Off: Strech is OFF +** 0x08 On: Disk Based Off: Ram based +** 0x10 On: ?????????? Off: ????????? (Acidizer puts that ON) +** +** 2 bytes (short) root note +** if type 0x10 is OFF : [C,C#,(...),B] -> [0x30 to 0x3B] +** if type 0x10 is ON : [C,C#,(...),B] -> [0x3C to 0x47] +** (both types fit on same MIDI pitch albeit different octaves, so who cares) +** +** 2 bytes (short) ??? always set to 0x8000 +** 4 bytes (float) ??? seems to be always 0 +** 4 bytes (int) number of beats +** 2 bytes (short) meter denominator //always 4 in SF/ACID +** 2 bytes (short) meter numerator //always 4 in SF/ACID +** //are we sure about the order?? usually its num/denom +** 4 bytes (float) tempo +** +*/ + +static int +wav_read_acid_chunk (SF_PRIVATE *psf, uint32_t chunklen) +{ char buffer [512] ; + uint32_t bytesread = 0 ; + int beats, flags ; + short rootnote, q1, meter_denom, meter_numer ; + float q2, tempo ; + + chunklen += (chunklen & 1) ; + + bytesread += psf_binheader_readf (psf, "422f", &flags, &rootnote, &q1, &q2) ; + + snprintf (buffer, sizeof (buffer), "%f", q2) ; + + psf_log_printf (psf, " Flags : 0x%04x (%s,%s,%s,%s,%s)\n", flags, + (flags & 0x01) ? "OneShot" : "Loop", + (flags & 0x02) ? "RootNoteValid" : "RootNoteInvalid", + (flags & 0x04) ? "StretchOn" : "StretchOff", + (flags & 0x08) ? "DiskBased" : "RAMBased", + (flags & 0x10) ? "??On" : "??Off") ; + + psf_log_printf (psf, " Root note : 0x%x\n ???? : 0x%04x\n ???? : %s\n", + rootnote, q1, buffer) ; + + bytesread += psf_binheader_readf (psf, "422f", &beats, &meter_denom, &meter_numer, &tempo) ; + snprintf (buffer, sizeof (buffer), "%f", tempo) ; + psf_log_printf (psf, " Beats : %d\n Meter : %d/%d\n Tempo : %s\n", + beats, meter_numer, meter_denom, buffer) ; + + psf_binheader_readf (psf, "j", chunklen - bytesread) ; + + if (psf->loop_info) + { psf_log_printf (psf, " Found existing loop info, using last one.\n") ; + free (psf->loop_info) ; + psf->loop_info = NULL ; + } ; + if ((psf->loop_info = calloc (1, sizeof (SF_LOOP_INFO))) == NULL) + return SFE_MALLOC_FAILED ; + + psf->loop_info->time_sig_num = meter_numer ; + psf->loop_info->time_sig_den = meter_denom ; + psf->loop_info->loop_mode = (flags & 0x01) ? SF_LOOP_NONE : SF_LOOP_FORWARD ; + psf->loop_info->num_beats = beats ; + psf->loop_info->bpm = tempo ; + psf->loop_info->root_key = (flags & 0x02) ? rootnote : -1 ; + + return 0 ; +} /* wav_read_acid_chunk */ + +/*============================================================================== +*/ + +static int +wav_set_chunk (SF_PRIVATE *psf, const SF_CHUNK_INFO * chunk_info) +{ return psf_save_write_chunk (&psf->wchunks, chunk_info) ; +} /* wav_set_chunk */ + +static SF_CHUNK_ITERATOR * +wav_next_chunk_iterator (SF_PRIVATE *psf, SF_CHUNK_ITERATOR * iterator) +{ return psf_next_chunk_iterator (&psf->rchunks, iterator) ; +} /* wav_next_chunk_iterator */ + +static int +wav_get_chunk_size (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) +{ int indx ; + + if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0) + return SFE_UNKNOWN_CHUNK ; + + chunk_info->datalen = psf->rchunks.chunks [indx].len ; + + return SFE_NO_ERROR ; +} /* wav_get_chunk_size */ + +static int +wav_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info) +{ int indx ; + sf_count_t pos ; + + if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0) + return SFE_UNKNOWN_CHUNK ; + + if (chunk_info->data == NULL) + return SFE_BAD_CHUNK_DATA_PTR ; + + chunk_info->id_size = psf->rchunks.chunks [indx].id_size ; + memcpy (chunk_info->id, psf->rchunks.chunks [indx].id, sizeof (chunk_info->id) / sizeof (*chunk_info->id)) ; + + pos = psf_ftell (psf) ; + psf_fseek (psf, psf->rchunks.chunks [indx].offset, SEEK_SET) ; + psf_fread (chunk_info->data, SF_MIN (chunk_info->datalen, psf->rchunks.chunks [indx].len), 1, psf) ; + psf_fseek (psf, pos, SEEK_SET) ; + + return SFE_NO_ERROR ; +} /* wav_get_chunk_data */ diff --git a/libsndfile-1.0.31/src/wavlike.c b/libsndfile-1.0.31/src/wavlike.c new file mode 100644 index 0000000..b59c684 --- /dev/null +++ b/libsndfile-1.0.31/src/wavlike.c @@ -0,0 +1,1350 @@ +/* +** Copyright (C) 1999-2020 Erik de Castro Lopo +** Copyright (C) 2004-2005 David Viens +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" +#include "wavlike.h" + + +#define WAV_BEXT_MIN_CHUNK_SIZE 602 +#define WAV_BEXT_MAX_CHUNK_SIZE (10 * 1024) + +#define WAV_CART_MIN_CHUNK_SIZE 2048 +#define WAV_CART_MAX_CHUNK_SIZE 0xffffffff + + +static int exif_subchunk_parse (SF_PRIVATE *psf, uint32_t length) ; + + +/* Known WAVEFORMATEXTENSIBLE GUIDS. */ +static const EXT_SUBFORMAT MSGUID_SUBTYPE_PCM = +{ 0x00000001, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } +} ; + +static const EXT_SUBFORMAT MSGUID_SUBTYPE_MS_ADPCM = +{ 0x00000002, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } +} ; + +static const EXT_SUBFORMAT MSGUID_SUBTYPE_IEEE_FLOAT = +{ 0x00000003, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } +} ; + +static const EXT_SUBFORMAT MSGUID_SUBTYPE_ALAW = +{ 0x00000006, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } +} ; + +static const EXT_SUBFORMAT MSGUID_SUBTYPE_MULAW = +{ 0x00000007, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } +} ; + +/* +** the next two are from +** http://dream.cs.bath.ac.uk/researchdev/wave-ex/bformat.html +*/ + +static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM = +{ 0x00000001, 0x0721, 0x11d3, { 0x86, 0x44, 0xc8, 0xc1, 0xca, 0x00, 0x00, 0x00 } +} ; + +static const EXT_SUBFORMAT MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT = +{ 0x00000003, 0x0721, 0x11d3, { 0x86, 0x44, 0xc8, 0xc1, 0xca, 0x00, 0x00, 0x00 } +} ; + + +#if 0 +/* maybe interesting one day to read the following through sf_read_raw */ +/* http://www.bath.ac.uk/~masrwd/pvocex/pvocex.html */ +static const EXT_SUBFORMAT MSGUID_SUBTYPE_PVOCEX = +{ 0x8312b9c2, 0x2e6e, 0x11d4, { 0xa8, 0x24, 0xde, 0x5b, 0x96, 0xc3, 0xab, 0x21 } +} ; +#endif + +/* This stores which bit in dwChannelMask maps to which channel */ +static const struct chanmap_s +{ int id ; + const char * name ; +} channel_mask_bits [] = +{ /* WAVEFORMATEXTENSIBLE doesn't distuingish FRONT_LEFT from LEFT */ + { SF_CHANNEL_MAP_LEFT, "L" }, + { SF_CHANNEL_MAP_RIGHT, "R" }, + { SF_CHANNEL_MAP_CENTER, "C" }, + { SF_CHANNEL_MAP_LFE, "LFE" }, + { SF_CHANNEL_MAP_REAR_LEFT, "Ls" }, + { SF_CHANNEL_MAP_REAR_RIGHT, "Rs" }, + { SF_CHANNEL_MAP_FRONT_LEFT_OF_CENTER, "Lc" }, + { SF_CHANNEL_MAP_FRONT_RIGHT_OF_CENTER, "Rc" }, + { SF_CHANNEL_MAP_REAR_CENTER, "Cs" }, + { SF_CHANNEL_MAP_SIDE_LEFT, "Sl" }, + { SF_CHANNEL_MAP_SIDE_RIGHT, "Sr" }, + { SF_CHANNEL_MAP_TOP_CENTER, "Tc" }, + { SF_CHANNEL_MAP_TOP_FRONT_LEFT, "Tfl" }, + { SF_CHANNEL_MAP_TOP_FRONT_CENTER, "Tfc" }, + { SF_CHANNEL_MAP_TOP_FRONT_RIGHT, "Tfr" }, + { SF_CHANNEL_MAP_TOP_REAR_LEFT, "Trl" }, + { SF_CHANNEL_MAP_TOP_REAR_CENTER, "Trc" }, + { SF_CHANNEL_MAP_TOP_REAR_RIGHT, "Trr" }, +} ; + +/*------------------------------------------------------------------------------ + * Private static functions. + */ + +static int +wavex_guid_equal (const EXT_SUBFORMAT * first, const EXT_SUBFORMAT * second) +{ return !memcmp (first, second, sizeof (EXT_SUBFORMAT)) ; +} /* wavex_guid_equal */ + + + +int +wavlike_read_fmt_chunk (SF_PRIVATE *psf, int fmtsize) +{ WAVLIKE_PRIVATE * wpriv ; + WAV_FMT *wav_fmt ; + int bytesread, k, bytespersec = 0 ; + + if ((wpriv = psf->container_data) == NULL) + return SFE_INTERNAL ; + wav_fmt = &wpriv->wav_fmt ; + + memset (wav_fmt, 0, sizeof (WAV_FMT)) ; + + if (fmtsize < 16) + return SFE_WAV_FMT_SHORT ; + + /* assume psf->rwf_endian is already properly set */ + + /* Read the minimal WAV file header here. */ + bytesread = psf_binheader_readf (psf, "224422", + &(wav_fmt->format), &(wav_fmt->min.channels), + &(wav_fmt->min.samplerate), &(wav_fmt->min.bytespersec), + &(wav_fmt->min.blockalign), &(wav_fmt->min.bitwidth)) ; + + psf_log_printf (psf, " Format : 0x%X => %s\n", wav_fmt->format, wavlike_format_str (wav_fmt->format)) ; + psf_log_printf (psf, " Channels : %d\n", wav_fmt->min.channels) ; + psf_log_printf (psf, " Sample Rate : %d\n", wav_fmt->min.samplerate) ; + + if (wav_fmt->format == WAVE_FORMAT_PCM && wav_fmt->min.blockalign == 0 + && wav_fmt->min.bitwidth > 0 && wav_fmt->min.channels > 0) + { wav_fmt->min.blockalign = wav_fmt->min.bitwidth / 8 + (wav_fmt->min.bitwidth % 8 > 0 ? 1 : 0) ; + wav_fmt->min.blockalign *= wav_fmt->min.channels ; + psf_log_printf (psf, " Block Align : 0 (should be %d)\n", wav_fmt->min.blockalign) ; + } + else + psf_log_printf (psf, " Block Align : %d\n", wav_fmt->min.blockalign) ; + + if (wav_fmt->format == WAVE_FORMAT_PCM && wav_fmt->min.bitwidth == 24 && + wav_fmt->min.blockalign == 4 * wav_fmt->min.channels) + { psf_log_printf (psf, " Bit Width : 24\n") ; + + psf_log_printf (psf, "\n" + " Ambiguous information in 'fmt ' chunk. Possibile file types:\n" + " 0) Invalid IEEE float file generated by Syntrillium's Cooledit!\n" + " 1) File generated by ALSA's arecord containing 24 bit samples in 32 bit containers.\n" + " 2) 24 bit file with incorrect Block Align value.\n" + "\n") ; + + wpriv->fmt_is_broken = 1 ; + } + else if (wav_fmt->min.bitwidth == 0) + { switch (wav_fmt->format) + { case WAVE_FORMAT_GSM610 : + case WAVE_FORMAT_IPP_ITU_G_723_1 : + psf_log_printf (psf, " Bit Width : %d\n", wav_fmt->min.bitwidth) ; + break ; + default : + psf_log_printf (psf, " Bit Width : %d (should not be 0)\n", wav_fmt->min.bitwidth) ; + } + } + else + { switch (wav_fmt->format) + { case WAVE_FORMAT_GSM610 : + case WAVE_FORMAT_IPP_ITU_G_723_1 : + psf_log_printf (psf, " Bit Width : %d (should be 0)\n", wav_fmt->min.bitwidth) ; + break ; + default : + psf_log_printf (psf, " Bit Width : %d\n", wav_fmt->min.bitwidth) ; + } + } ; + + psf->sf.samplerate = wav_fmt->min.samplerate ; + psf->sf.frames = 0 ; /* Correct this when reading data chunk. */ + psf->sf.channels = wav_fmt->min.channels ; + + switch (wav_fmt->format) + { case WAVE_FORMAT_PCM : + case WAVE_FORMAT_IEEE_FLOAT : + bytespersec = wav_fmt->min.samplerate * wav_fmt->min.blockalign ; + if (wav_fmt->min.bytespersec != (unsigned) bytespersec) + psf_log_printf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->min.bytespersec, bytespersec) ; + else + psf_log_printf (psf, " Bytes/sec : %d\n", wav_fmt->min.bytespersec) ; + + psf->bytewidth = BITWIDTH2BYTES (wav_fmt->min.bitwidth) ; + break ; + + case WAVE_FORMAT_ALAW : + case WAVE_FORMAT_MULAW : + if (wav_fmt->min.bytespersec != wav_fmt->min.samplerate * wav_fmt->min.blockalign) + psf_log_printf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->min.bytespersec, wav_fmt->min.samplerate * wav_fmt->min.blockalign) ; + else + psf_log_printf (psf, " Bytes/sec : %d\n", wav_fmt->min.bytespersec) ; + + psf->bytewidth = 1 ; + if (fmtsize >= 18) + { bytesread += psf_binheader_readf (psf, "2", &(wav_fmt->size20.extrabytes)) ; + psf_log_printf (psf, " Extra Bytes : %d\n", wav_fmt->size20.extrabytes) ; + } ; + break ; + + case WAVE_FORMAT_IMA_ADPCM : + if (wav_fmt->min.bitwidth != 4) + return SFE_WAV_ADPCM_NOT4BIT ; + if (wav_fmt->min.channels < 1 || wav_fmt->min.channels > 2) + return SFE_WAV_ADPCM_CHANNELS ; + + bytesread += psf_binheader_readf (psf, "22", &(wav_fmt->ima.extrabytes), &(wav_fmt->ima.samplesperblock)) ; + psf_log_printf (psf, " Extra Bytes : %d\n", wav_fmt->ima.extrabytes) ; + if (wav_fmt->ima.samplesperblock < 1) + { psf_log_printf (psf, " Samples/Block : %d (should be > 0)\n", wav_fmt->ima.samplesperblock) ; + return SFE_WAV_ADPCM_SAMPLES ; + } + else + psf_log_printf (psf, " Samples/Block : %d\n", wav_fmt->ima.samplesperblock) ; + + bytespersec = (wav_fmt->ima.samplerate * wav_fmt->ima.blockalign) / wav_fmt->ima.samplesperblock ; + if (wav_fmt->ima.bytespersec != (unsigned) bytespersec) + psf_log_printf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->ima.bytespersec, bytespersec) ; + else + psf_log_printf (psf, " Bytes/sec : %d\n", wav_fmt->ima.bytespersec) ; + + break ; + + case WAVE_FORMAT_MS_ADPCM : + if (wav_fmt->msadpcm.bitwidth != 4) + return SFE_WAV_ADPCM_NOT4BIT ; + if (wav_fmt->msadpcm.channels < 1 || wav_fmt->msadpcm.channels > 2) + return SFE_WAV_ADPCM_CHANNELS ; + + bytesread += psf_binheader_readf (psf, "222", &(wav_fmt->msadpcm.extrabytes), + &(wav_fmt->msadpcm.samplesperblock), &(wav_fmt->msadpcm.numcoeffs)) ; + + psf_log_printf (psf, " Extra Bytes : %d\n", wav_fmt->msadpcm.extrabytes) ; + if (wav_fmt->ima.samplesperblock < 1) + { psf_log_printf (psf, " Samples/Block : %d (should be > 0)\n", wav_fmt->ima.samplesperblock) ; + return SFE_WAV_ADPCM_SAMPLES ; + } + else + psf_log_printf (psf, " Samples/Block : %d\n", wav_fmt->ima.samplesperblock) ; + + bytespersec = (wav_fmt->min.samplerate * wav_fmt->min.blockalign) / wav_fmt->msadpcm.samplesperblock ; + if (wav_fmt->min.bytespersec == (unsigned) bytespersec) + psf_log_printf (psf, " Bytes/sec : %d\n", wav_fmt->min.bytespersec) ; + else if (wav_fmt->min.bytespersec == (wav_fmt->min.samplerate / wav_fmt->msadpcm.samplesperblock) * wav_fmt->min.blockalign) + psf_log_printf (psf, " Bytes/sec : %d (should be %d (MS BUG!))\n", wav_fmt->min.bytespersec, bytespersec) ; + else + psf_log_printf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->min.bytespersec, bytespersec) ; + + if (wav_fmt->msadpcm.numcoeffs > ARRAY_LEN (wav_fmt->msadpcm.coeffs)) + { psf_log_printf (psf, " No. of Coeffs : %d (should be <= %d)\n", wav_fmt->msadpcm.numcoeffs, ARRAY_LEN (wav_fmt->msadpcm.coeffs)) ; + wav_fmt->msadpcm.numcoeffs = ARRAY_LEN (wav_fmt->msadpcm.coeffs) ; + } + else + psf_log_printf (psf, " No. of Coeffs : %d\n", wav_fmt->msadpcm.numcoeffs) ; + + psf_log_printf (psf, " Index Coeffs1 Coeffs2\n") ; + for (k = 0 ; k < wav_fmt->msadpcm.numcoeffs ; k++) + { char buffer [128] ; + + bytesread += + psf_binheader_readf (psf, "22", &(wav_fmt->msadpcm.coeffs [k].coeff1), &(wav_fmt->msadpcm.coeffs [k].coeff2)) ; + snprintf (buffer, sizeof (buffer), " %2d %7d %7d\n", k, wav_fmt->msadpcm.coeffs [k].coeff1, wav_fmt->msadpcm.coeffs [k].coeff2) ; + psf_log_printf (psf, buffer) ; + } ; + break ; + + case WAVE_FORMAT_GSM610 : + if (wav_fmt->gsm610.channels != 1 || wav_fmt->gsm610.blockalign != 65) + return SFE_WAV_GSM610_FORMAT ; + + bytesread += + psf_binheader_readf (psf, "22", &(wav_fmt->gsm610.extrabytes), &(wav_fmt->gsm610.samplesperblock)) ; + + if (wav_fmt->gsm610.samplesperblock != 320) + return SFE_WAV_GSM610_FORMAT ; + + bytespersec = (wav_fmt->gsm610.samplerate * wav_fmt->gsm610.blockalign) / wav_fmt->gsm610.samplesperblock ; + if (wav_fmt->gsm610.bytespersec != (unsigned) bytespersec) + psf_log_printf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->gsm610.bytespersec, bytespersec) ; + else + psf_log_printf (psf, " Bytes/sec : %d\n", wav_fmt->gsm610.bytespersec) ; + + psf_log_printf (psf, " Extra Bytes : %d\n", wav_fmt->gsm610.extrabytes) ; + psf_log_printf (psf, " Samples/Block : %d\n", wav_fmt->gsm610.samplesperblock) ; + break ; + + case WAVE_FORMAT_EXTENSIBLE : + if (wav_fmt->ext.bytespersec != wav_fmt->ext.samplerate * wav_fmt->ext.blockalign) + psf_log_printf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->ext.bytespersec, wav_fmt->ext.samplerate * wav_fmt->ext.blockalign) ; + else + psf_log_printf (psf, " Bytes/sec : %d\n", wav_fmt->ext.bytespersec) ; + + bytesread += + psf_binheader_readf (psf, "224", &(wav_fmt->ext.extrabytes), &(wav_fmt->ext.validbits), + &(wav_fmt->ext.channelmask)) ; + + psf_log_printf (psf, " Valid Bits : %d\n", wav_fmt->ext.validbits) ; + + if (wav_fmt->ext.channelmask == 0) + psf_log_printf (psf, " Channel Mask : 0x0 (should not be zero)\n") ; + else + { char buffer [512] ; + unsigned bit ; + + wpriv->wavex_channelmask = wav_fmt->ext.channelmask ; + + /* It's probably wise to ignore the channel mask if it is all zero */ + free (psf->channel_map) ; + + if ((psf->channel_map = calloc (psf->sf.channels, sizeof (psf->channel_map [0]))) == NULL) + return SFE_MALLOC_FAILED ; + + /* Terminate the buffer we're going to append_snprintf into. */ + buffer [0] = 0 ; + + for (bit = k = 0 ; bit < ARRAY_LEN (channel_mask_bits) && k < psf->sf.channels ; bit++) + { + if (wav_fmt->ext.channelmask & (1 << bit)) + { if (k > psf->sf.channels) + { psf_log_printf (psf, "*** More channel map bits than there are channels.\n") ; + break ; + } ; + + psf->channel_map [k++] = channel_mask_bits [bit].id ; + append_snprintf (buffer, sizeof (buffer), "%s, ", channel_mask_bits [bit].name) ; + } ; + } ; + + /* Remove trailing ", ". */ + bit = strlen (buffer) ; + if (bit >= 2) + { buffer [--bit] = 0 ; + buffer [--bit] = 0 ; + } ; + + if (k != psf->sf.channels) + { psf_log_printf (psf, " Channel Mask : 0x%X\n", wav_fmt->ext.channelmask) ; + psf_log_printf (psf, "*** Less channel map bits than there are channels.\n") ; + } + else + psf_log_printf (psf, " Channel Mask : 0x%X (%s)\n", wav_fmt->ext.channelmask, buffer) ; + } ; + + bytesread += psf_binheader_readf (psf, "422", &(wav_fmt->ext.esf.esf_field1), &(wav_fmt->ext.esf.esf_field2), &(wav_fmt->ext.esf.esf_field3)) ; + + /* compare the esf_fields with each known GUID? and print? */ + psf_log_printf (psf, " Subformat\n") ; + psf_log_printf (psf, " esf_field1 : 0x%X\n", wav_fmt->ext.esf.esf_field1) ; + psf_log_printf (psf, " esf_field2 : 0x%X\n", wav_fmt->ext.esf.esf_field2) ; + psf_log_printf (psf, " esf_field3 : 0x%X\n", wav_fmt->ext.esf.esf_field3) ; + psf_log_printf (psf, " esf_field4 : ") ; + for (k = 0 ; k < 8 ; k++) + { bytesread += psf_binheader_readf (psf, "1", &(wav_fmt->ext.esf.esf_field4 [k])) ; + psf_log_printf (psf, "0x%X ", wav_fmt->ext.esf.esf_field4 [k] & 0xFF) ; + } ; + psf_log_printf (psf, "\n") ; + psf->bytewidth = BITWIDTH2BYTES (wav_fmt->ext.bitwidth) ; + + /* Compare GUIDs for known ones. */ + if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_PCM)) + { psf->sf.format = SF_FORMAT_WAVEX | u_bitwidth_to_subformat (psf->bytewidth * 8) ; + psf_log_printf (psf, " format : pcm\n") ; + } + else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_MS_ADPCM)) + { psf->sf.format = (SF_FORMAT_WAVEX | SF_FORMAT_MS_ADPCM) ; + psf_log_printf (psf, " format : ms adpcm\n") ; + } + else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_IEEE_FLOAT)) + { psf->sf.format = SF_FORMAT_WAVEX | ((psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT) ; + psf_log_printf (psf, " format : IEEE float\n") ; + } + else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_ALAW)) + { psf->sf.format = (SF_FORMAT_WAVEX | SF_FORMAT_ALAW) ; + psf_log_printf (psf, " format : A-law\n") ; + } + else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_MULAW)) + { psf->sf.format = (SF_FORMAT_WAVEX | SF_FORMAT_ULAW) ; + psf_log_printf (psf, " format : u-law\n") ; + } + else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_PCM)) + { psf->sf.format = SF_FORMAT_WAVEX | u_bitwidth_to_subformat (psf->bytewidth * 8) ; + psf_log_printf (psf, " format : pcm (Ambisonic B)\n") ; + wpriv->wavex_ambisonic = SF_AMBISONIC_B_FORMAT ; + } + else if (wavex_guid_equal (&wav_fmt->ext.esf, &MSGUID_SUBTYPE_AMBISONIC_B_FORMAT_IEEE_FLOAT)) + { psf->sf.format = SF_FORMAT_WAVEX | ((psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT) ; + psf_log_printf (psf, " format : IEEE float (Ambisonic B)\n") ; + wpriv->wavex_ambisonic = SF_AMBISONIC_B_FORMAT ; + } + else + return SFE_UNIMPLEMENTED ; + + break ; + + case WAVE_FORMAT_G721_ADPCM : + psf_log_printf (psf, " Bytes/sec : %d\n", wav_fmt->g72x.bytespersec) ; + if (fmtsize >= 20) + { bytesread += psf_binheader_readf (psf, "22", &(wav_fmt->g72x.extrabytes), &(wav_fmt->g72x.auxblocksize)) ; + if (wav_fmt->g72x.extrabytes == 0) + psf_log_printf (psf, " Extra Bytes : %d (should be 2)\n", wav_fmt->g72x.extrabytes) ; + else + psf_log_printf (psf, " Extra Bytes : %d\n", wav_fmt->g72x.extrabytes) ; + psf_log_printf (psf, " Aux Blk Size : %d\n", wav_fmt->g72x.auxblocksize) ; + } + else if (fmtsize == 18) + { bytesread += psf_binheader_readf (psf, "2", &(wav_fmt->g72x.extrabytes)) ; + psf_log_printf (psf, " Extra Bytes : %d%s\n", wav_fmt->g72x.extrabytes, wav_fmt->g72x.extrabytes != 0 ? " (should be 0)" : "") ; + } + else + psf_log_printf (psf, "*** 'fmt ' chunk should be bigger than this!\n") ; + break ; + + case WAVE_FORMAT_NMS_VBXADPCM : + if (wav_fmt->min.channels != 1 || wav_fmt->min.bitwidth < 2 || wav_fmt->min.bitwidth * 20 + 2 != wav_fmt->min.blockalign) + return SFE_WAV_NMS_FORMAT ; + + bytespersec = (wav_fmt->min.samplerate * wav_fmt->min.blockalign) / 160 ; + if (wav_fmt->min.bytespersec == (unsigned) bytespersec) + psf_log_printf (psf, " Bytes/sec : %d\n", wav_fmt->min.bytespersec) ; + else + psf_log_printf (psf, " Bytes/sec : %d (should be %d)\n", wav_fmt->min.bytespersec, bytespersec) ; + if (fmtsize >= 18) + { bytesread += psf_binheader_readf (psf, "2", &(wav_fmt->size20.extrabytes)) ; + psf_log_printf (psf, " Extra Bytes : %d\n", wav_fmt->size20.extrabytes) ; + } ; + break ; + + default : + psf_log_printf (psf, "*** No 'fmt ' chunk dumper for this format!\n") ; + return SFE_WAV_BAD_FMT ; + } ; + + if (bytesread > fmtsize) + { psf_log_printf (psf, "*** wavlike_read_fmt_chunk (bytesread > fmtsize)\n") ; + return SFE_WAV_BAD_FMT ; + } + else + psf_binheader_readf (psf, "j", fmtsize - bytesread) ; + + psf->blockwidth = wav_fmt->min.channels * psf->bytewidth ; + + return 0 ; +} /* wavlike_read_fmt_chunk */ + +void +wavlike_write_guid (SF_PRIVATE *psf, const EXT_SUBFORMAT * subformat) +{ + psf_binheader_writef (psf, "422b", BHW4 (subformat->esf_field1), + BHW2 (subformat->esf_field2), BHW2 (subformat->esf_field3), + BHWv (subformat->esf_field4), BHWz (8)) ; +} /* wavlike_write_guid */ + + +int +wavlike_gen_channel_mask (const int *chan_map, int channels) +{ int chan, mask = 0, bit = -1, last_bit = -1 ; + + if (chan_map == NULL) + return 0 ; + + for (chan = 0 ; chan < channels ; chan ++) + { int k ; + + for (k = bit + 1 ; k < ARRAY_LEN (channel_mask_bits) ; k++) + if (chan_map [chan] == channel_mask_bits [k].id) + { bit = k ; + break ; + } ; + + /* Check for bad sequence. */ + if (bit <= last_bit) + return 0 ; + + mask += 1 << bit ; + last_bit = bit ; + } ; + + return mask ; +} /* wavlike_gen_channel_mask */ + +void +wavlike_analyze (SF_PRIVATE *psf) +{ unsigned char buffer [4096] ; + AUDIO_DETECT ad ; + int format = 0 ; + + if (psf->is_pipe) + { psf_log_printf (psf, "*** Error : Reading from a pipe. Can't analyze data section to figure out real data format.\n\n") ; + return ; + } ; + + psf_log_printf (psf, "---------------------------------------------------\n" + "Format is known to be broken. Using detection code.\n") ; + + /* Code goes here. */ + ad.endianness = SF_ENDIAN_LITTLE ; + ad.channels = psf->sf.channels ; + + psf_fseek (psf, 3 * 4 * 50, SEEK_SET) ; + + while (psf_fread (buffer, 1, sizeof (buffer), psf) == sizeof (buffer)) + { format = audio_detect (psf, &ad, buffer, sizeof (buffer)) ; + if (format != 0) + break ; + } ; + + /* Seek to start of DATA section. */ + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + + if (format == 0) + { psf_log_printf (psf, "wavlike_analyze : detection failed.\n") ; + return ; + } ; + + switch (format) + { case SF_FORMAT_PCM_32 : + case SF_FORMAT_FLOAT : + psf_log_printf (psf, "wavlike_analyze : found format : 0x%X\n", format) ; + psf->sf.format = (psf->sf.format & ~SF_FORMAT_SUBMASK) + format ; + psf->bytewidth = 4 ; + psf->blockwidth = psf->sf.channels * psf->bytewidth ; + break ; + + case SF_FORMAT_PCM_24 : + psf_log_printf (psf, "wavlike_analyze : found format : 0x%X\n", format) ; + psf->sf.format = (psf->sf.format & ~SF_FORMAT_SUBMASK) + format ; + psf->bytewidth = 3 ; + psf->blockwidth = psf->sf.channels * psf->bytewidth ; + break ; + + default : + psf_log_printf (psf, "wavlike_analyze : unhandled format : 0x%X\n", format) ; + break ; + } ; + + return ; +} /* wavlike_analyze */ + +/*============================================================================== +*/ + +typedef struct +{ int ID ; + const char *name ; +} WAV_FORMAT_DESC ; + +#define STR(x) #x +#define FORMAT_TYPE(x) { x, STR (x) } + +static WAV_FORMAT_DESC wave_descs [] = +{ FORMAT_TYPE (WAVE_FORMAT_PCM), + FORMAT_TYPE (WAVE_FORMAT_MS_ADPCM), + FORMAT_TYPE (WAVE_FORMAT_IEEE_FLOAT), + FORMAT_TYPE (WAVE_FORMAT_VSELP), + FORMAT_TYPE (WAVE_FORMAT_IBM_CVSD), + FORMAT_TYPE (WAVE_FORMAT_ALAW), + FORMAT_TYPE (WAVE_FORMAT_MULAW), + FORMAT_TYPE (WAVE_FORMAT_OKI_ADPCM), + FORMAT_TYPE (WAVE_FORMAT_IMA_ADPCM), + FORMAT_TYPE (WAVE_FORMAT_MEDIASPACE_ADPCM), + FORMAT_TYPE (WAVE_FORMAT_SIERRA_ADPCM), + FORMAT_TYPE (WAVE_FORMAT_G723_ADPCM), + FORMAT_TYPE (WAVE_FORMAT_DIGISTD), + FORMAT_TYPE (WAVE_FORMAT_DIGIFIX), + FORMAT_TYPE (WAVE_FORMAT_DIALOGIC_OKI_ADPCM), + FORMAT_TYPE (WAVE_FORMAT_MEDIAVISION_ADPCM), + FORMAT_TYPE (WAVE_FORMAT_CU_CODEC), + FORMAT_TYPE (WAVE_FORMAT_YAMAHA_ADPCM), + FORMAT_TYPE (WAVE_FORMAT_SONARC), + FORMAT_TYPE (WAVE_FORMAT_DSPGROUP_TRUESPEECH), + FORMAT_TYPE (WAVE_FORMAT_ECHOSC1), + FORMAT_TYPE (WAVE_FORMAT_AUDIOFILE_AF36), + FORMAT_TYPE (WAVE_FORMAT_APTX), + FORMAT_TYPE (WAVE_FORMAT_AUDIOFILE_AF10), + FORMAT_TYPE (WAVE_FORMAT_PROSODY_1612), + FORMAT_TYPE (WAVE_FORMAT_LRC), + FORMAT_TYPE (WAVE_FORMAT_DOLBY_AC2), + FORMAT_TYPE (WAVE_FORMAT_GSM610), + FORMAT_TYPE (WAVE_FORMAT_MSNAUDIO), + FORMAT_TYPE (WAVE_FORMAT_ANTEX_ADPCME), + FORMAT_TYPE (WAVE_FORMAT_CONTROL_RES_VQLPC), + FORMAT_TYPE (WAVE_FORMAT_DIGIREAL), + FORMAT_TYPE (WAVE_FORMAT_DIGIADPCM), + FORMAT_TYPE (WAVE_FORMAT_CONTROL_RES_CR10), + FORMAT_TYPE (WAVE_FORMAT_NMS_VBXADPCM), + FORMAT_TYPE (WAVE_FORMAT_ROLAND_RDAC), + FORMAT_TYPE (WAVE_FORMAT_ECHOSC3), + FORMAT_TYPE (WAVE_FORMAT_ROCKWELL_ADPCM), + FORMAT_TYPE (WAVE_FORMAT_ROCKWELL_DIGITALK), + FORMAT_TYPE (WAVE_FORMAT_XEBEC), + FORMAT_TYPE (WAVE_FORMAT_G721_ADPCM), + FORMAT_TYPE (WAVE_FORMAT_G728_CELP), + FORMAT_TYPE (WAVE_FORMAT_MSG723), + FORMAT_TYPE (WAVE_FORMAT_MPEG), + FORMAT_TYPE (WAVE_FORMAT_RT24), + FORMAT_TYPE (WAVE_FORMAT_PAC), + FORMAT_TYPE (WAVE_FORMAT_MPEGLAYER3), + FORMAT_TYPE (WAVE_FORMAT_LUCENT_G723), + FORMAT_TYPE (WAVE_FORMAT_CIRRUS), + FORMAT_TYPE (WAVE_FORMAT_ESPCM), + FORMAT_TYPE (WAVE_FORMAT_VOXWARE), + FORMAT_TYPE (WAVE_FORMAT_CANOPUS_ATRAC), + FORMAT_TYPE (WAVE_FORMAT_G726_ADPCM), + FORMAT_TYPE (WAVE_FORMAT_G722_ADPCM), + FORMAT_TYPE (WAVE_FORMAT_DSAT), + FORMAT_TYPE (WAVE_FORMAT_DSAT_DISPLAY), + FORMAT_TYPE (WAVE_FORMAT_VOXWARE_BYTE_ALIGNED), + FORMAT_TYPE (WAVE_FORMAT_VOXWARE_AC8), + FORMAT_TYPE (WAVE_FORMAT_VOXWARE_AC10), + FORMAT_TYPE (WAVE_FORMAT_VOXWARE_AC16), + FORMAT_TYPE (WAVE_FORMAT_VOXWARE_AC20), + FORMAT_TYPE (WAVE_FORMAT_VOXWARE_RT24), + FORMAT_TYPE (WAVE_FORMAT_VOXWARE_RT29), + FORMAT_TYPE (WAVE_FORMAT_VOXWARE_RT29HW), + FORMAT_TYPE (WAVE_FORMAT_VOXWARE_VR12), + FORMAT_TYPE (WAVE_FORMAT_VOXWARE_VR18), + FORMAT_TYPE (WAVE_FORMAT_VOXWARE_TQ40), + FORMAT_TYPE (WAVE_FORMAT_SOFTSOUND), + FORMAT_TYPE (WAVE_FORMAT_VOXARE_TQ60), + FORMAT_TYPE (WAVE_FORMAT_MSRT24), + FORMAT_TYPE (WAVE_FORMAT_G729A), + FORMAT_TYPE (WAVE_FORMAT_MVI_MV12), + FORMAT_TYPE (WAVE_FORMAT_DF_G726), + FORMAT_TYPE (WAVE_FORMAT_DF_GSM610), + FORMAT_TYPE (WAVE_FORMAT_ONLIVE), + FORMAT_TYPE (WAVE_FORMAT_SBC24), + FORMAT_TYPE (WAVE_FORMAT_DOLBY_AC3_SPDIF), + FORMAT_TYPE (WAVE_FORMAT_ZYXEL_ADPCM), + FORMAT_TYPE (WAVE_FORMAT_PHILIPS_LPCBB), + FORMAT_TYPE (WAVE_FORMAT_PACKED), + FORMAT_TYPE (WAVE_FORMAT_RHETOREX_ADPCM), + FORMAT_TYPE (IBM_FORMAT_MULAW), + FORMAT_TYPE (IBM_FORMAT_ALAW), + FORMAT_TYPE (IBM_FORMAT_ADPCM), + FORMAT_TYPE (WAVE_FORMAT_VIVO_G723), + FORMAT_TYPE (WAVE_FORMAT_VIVO_SIREN), + FORMAT_TYPE (WAVE_FORMAT_DIGITAL_G723), + FORMAT_TYPE (WAVE_FORMAT_CREATIVE_ADPCM), + FORMAT_TYPE (WAVE_FORMAT_CREATIVE_FASTSPEECH8), + FORMAT_TYPE (WAVE_FORMAT_CREATIVE_FASTSPEECH10), + FORMAT_TYPE (WAVE_FORMAT_QUARTERDECK), + FORMAT_TYPE (WAVE_FORMAT_FM_TOWNS_SND), + FORMAT_TYPE (WAVE_FORMAT_BZV_DIGITAL), + FORMAT_TYPE (WAVE_FORMAT_VME_VMPCM), + FORMAT_TYPE (WAVE_FORMAT_OLIGSM), + FORMAT_TYPE (WAVE_FORMAT_OLIADPCM), + FORMAT_TYPE (WAVE_FORMAT_OLICELP), + FORMAT_TYPE (WAVE_FORMAT_OLISBC), + FORMAT_TYPE (WAVE_FORMAT_OLIOPR), + FORMAT_TYPE (WAVE_FORMAT_LH_CODEC), + FORMAT_TYPE (WAVE_FORMAT_NORRIS), + FORMAT_TYPE (WAVE_FORMAT_SOUNDSPACE_MUSICOMPRESS), + FORMAT_TYPE (WAVE_FORMAT_DVM), + FORMAT_TYPE (WAVE_FORMAT_INTERWAV_VSC112), + FORMAT_TYPE (WAVE_FORMAT_IPP_ITU_G_723_1), + FORMAT_TYPE (WAVE_FORMAT_EXTENSIBLE), +} ; + +char const* +wavlike_format_str (int k) +{ int lower, upper, mid ; + + lower = -1 ; + upper = sizeof (wave_descs) / sizeof (WAV_FORMAT_DESC) ; + + /* binary search */ + if ((wave_descs [0].ID <= k) && (k <= wave_descs [upper - 1].ID)) + { + while (lower + 1 < upper) + { mid = (upper + lower) / 2 ; + + if (k == wave_descs [mid].ID) + return wave_descs [mid].name ; + if (k < wave_descs [mid].ID) + upper = mid ; + else + lower = mid ; + } ; + } ; + + return "Unknown format" ; +} /* wavlike_format_str */ + +int +wavlike_srate2blocksize (int srate_chan_product) +{ if (srate_chan_product < 12000) + return 256 ; + if (srate_chan_product < 23000) + return 512 ; + if (srate_chan_product < 44000) + return 1024 ; + return 2048 ; +} /* srate2blocksize */ + +int +wavlike_read_bext_chunk (SF_PRIVATE *psf, uint32_t chunksize) +{ + SF_BROADCAST_INFO_16K * b ; + uint32_t bytes = 0 ; + + if (chunksize < WAV_BEXT_MIN_CHUNK_SIZE) + { psf_log_printf (psf, "bext : %u (should be >= %d)\n", chunksize, WAV_BEXT_MIN_CHUNK_SIZE) ; + psf_binheader_readf (psf, "j", chunksize) ; + return 0 ; + } ; + + if (chunksize > WAV_BEXT_MAX_CHUNK_SIZE) + { psf_log_printf (psf, "bext : %u (should be < %d)\n", chunksize, WAV_BEXT_MAX_CHUNK_SIZE) ; + psf_binheader_readf (psf, "j", chunksize) ; + return 0 ; + } ; + + if (chunksize >= sizeof (SF_BROADCAST_INFO_16K)) + { psf_log_printf (psf, "bext : %u too big to be handled\n", chunksize) ; + psf_binheader_readf (psf, "j", chunksize) ; + return 0 ; + } ; + + psf_log_printf (psf, "bext : %u\n", chunksize) ; + + if (!psf->broadcast_16k) + { psf->broadcast_16k = broadcast_var_alloc () ; + if (!psf->broadcast_16k) + { psf->error = SFE_MALLOC_FAILED ; + return psf->error ; + } + } + else + { psf_log_printf (psf, "bext : found more than one bext chunk, using last one.\n") ; + memset (psf->broadcast_16k, 0, sizeof (SF_BROADCAST_INFO_16K)) ; + } + + b = psf->broadcast_16k ; + + bytes += psf_binheader_readf (psf, "b", b->description, sizeof (b->description)) ; + bytes += psf_binheader_readf (psf, "b", b->originator, sizeof (b->originator)) ; + bytes += psf_binheader_readf (psf, "b", b->originator_reference, sizeof (b->originator_reference)) ; + bytes += psf_binheader_readf (psf, "b", b->origination_date, sizeof (b->origination_date)) ; + bytes += psf_binheader_readf (psf, "b", b->origination_time, sizeof (b->origination_time)) ; + bytes += psf_binheader_readf (psf, "442", &b->time_reference_low, &b->time_reference_high, &b->version) ; + bytes += psf_binheader_readf (psf, "b", &b->umid, sizeof (b->umid)) ; + bytes += psf_binheader_readf (psf, "22", &b->loudness_value, &b->loudness_range) ; + bytes += psf_binheader_readf (psf, "222", &b->max_true_peak_level, &b->max_momentary_loudness, &b->max_shortterm_loudness) ; + bytes += psf_binheader_readf (psf, "j", 180) ; + + if (chunksize > WAV_BEXT_MIN_CHUNK_SIZE) + { /* File has coding history data. */ + + b->coding_history_size = chunksize - WAV_BEXT_MIN_CHUNK_SIZE ; + + /* We do not parse the coding history */ + bytes += psf_binheader_readf (psf, "b", BHWv (b->coding_history), BHWz (b->coding_history_size)) ; + } ; + + if (bytes < chunksize) + psf_binheader_readf (psf, "j", BHWj (chunksize - bytes)) ; + + return 0 ; +} /* wavlike_read_bext_chunk */ + +int +wavlike_write_bext_chunk (SF_PRIVATE *psf) +{ SF_BROADCAST_INFO_16K *b ; + + if (psf->broadcast_16k == NULL) + return -1 ; + + b = psf->broadcast_16k ; + + psf_binheader_writef (psf, "m4", BHWm (bext_MARKER), BHW4 (WAV_BEXT_MIN_CHUNK_SIZE + b->coding_history_size)) ; + + /* + ** Note that it is very important that the field widths of the SF_BROADCAST_INFO + ** struct match those of the bext chunk fields. + */ + + psf_binheader_writef (psf, "b", BHWv (b->description), BHWz (sizeof (b->description))) ; + psf_binheader_writef (psf, "b", BHWv (b->originator), BHWz (sizeof (b->originator))) ; + psf_binheader_writef (psf, "b", BHWv (b->originator_reference), BHWz (sizeof (b->originator_reference))) ; + psf_binheader_writef (psf, "b", BHWv (b->origination_date), BHWz (sizeof (b->origination_date))) ; + psf_binheader_writef (psf, "b", BHWv (b->origination_time), BHWz (sizeof (b->origination_time))) ; + psf_binheader_writef (psf, "442", BHW4 (b->time_reference_low), BHW4 (b->time_reference_high), BHW2 (b->version)) ; + psf_binheader_writef (psf, "b", BHWv (b->umid), BHWz (sizeof (b->umid))) ; + psf_binheader_writef (psf, "22", BHW2 (b->loudness_value), BHW2 (b->loudness_range)) ; + psf_binheader_writef (psf, "222", BHW2 (b->max_true_peak_level), BHW2 (b->max_momentary_loudness), BHW2 (b->max_shortterm_loudness)) ; + psf_binheader_writef (psf, "z", BHWz (180)) ; + + if (b->coding_history_size > 0) + psf_binheader_writef (psf, "b", BHWv (b->coding_history), BHWz (b->coding_history_size)) ; + + return 0 ; +} /* wavlike_write_bext_chunk */ + +int +wavlike_read_cart_chunk (SF_PRIVATE *psf, uint32_t chunksize) +{ SF_CART_INFO_16K *c ; + uint32_t bytes = 0 ; + int k ; + + if (chunksize < WAV_CART_MIN_CHUNK_SIZE) + { psf_log_printf (psf, "cart : %u (should be >= %d)\n", chunksize, WAV_CART_MIN_CHUNK_SIZE) ; + psf_binheader_readf (psf, "j", chunksize) ; + return 0 ; + } ; + if (chunksize > WAV_CART_MAX_CHUNK_SIZE) + { psf_log_printf (psf, "cart : %u (should be < %d)\n", chunksize, WAV_CART_MAX_CHUNK_SIZE) ; + psf_binheader_readf (psf, "j", chunksize) ; + return 0 ; + } ; + + if (chunksize >= sizeof (SF_CART_INFO_16K)) + { psf_log_printf (psf, "cart : %u too big to be handled\n", chunksize) ; + psf_binheader_readf (psf, "j", chunksize) ; + return 0 ; + } ; + + psf_log_printf (psf, "cart : %u\n", chunksize) ; + + if (psf->cart_16k) + { psf_log_printf (psf, " Found more than one cart chunk, using last one.\n") ; + free (psf->cart_16k) ; + psf->cart_16k = NULL ; + } ; + + if ((psf->cart_16k = cart_var_alloc ()) == NULL) + { psf->error = SFE_MALLOC_FAILED ; + return psf->error ; + } ; + + c = psf->cart_16k ; + bytes += psf_binheader_readf (psf, "b", c->version, sizeof (c->version)) ; + bytes += psf_binheader_readf (psf, "b", c->title, sizeof (c->title)) ; + bytes += psf_binheader_readf (psf, "b", c->artist, sizeof (c->artist)) ; + bytes += psf_binheader_readf (psf, "b", c->cut_id, sizeof (c->cut_id)) ; + bytes += psf_binheader_readf (psf, "b", c->client_id, sizeof (c->client_id)) ; + bytes += psf_binheader_readf (psf, "b", c->category, sizeof (c->category)) ; + bytes += psf_binheader_readf (psf, "b", c->classification, sizeof (c->classification)) ; + bytes += psf_binheader_readf (psf, "b", c->out_cue, sizeof (c->out_cue)) ; + bytes += psf_binheader_readf (psf, "b", c->start_date, sizeof (c->start_date)) ; + bytes += psf_binheader_readf (psf, "b", c->start_time, sizeof (c->start_time)) ; + bytes += psf_binheader_readf (psf, "b", c->end_date, sizeof (c->end_date)) ; + bytes += psf_binheader_readf (psf, "b", c->end_time, sizeof (c->end_time)) ; + bytes += psf_binheader_readf (psf, "b", c->producer_app_id, sizeof (c->producer_app_id)) ; + bytes += psf_binheader_readf (psf, "b", c->producer_app_version, sizeof (c->producer_app_version)) ; + bytes += psf_binheader_readf (psf, "b", c->user_def, sizeof (c->user_def)) ; + bytes += psf_binheader_readf (psf, "e4", &c->level_reference, sizeof (c->level_reference)) ; + + for (k = 0 ; k < ARRAY_LEN (c->post_timers) ; k++) + bytes += psf_binheader_readf (psf, "b4", &c->post_timers [k].usage, make_size_t (4), &c->post_timers [k].value) ; + + bytes += psf_binheader_readf (psf, "b", c->reserved, sizeof (c->reserved)) ; + bytes += psf_binheader_readf (psf, "b", c->url, sizeof (c->url)) ; + + if (chunksize > WAV_CART_MIN_CHUNK_SIZE) + { /* File has tag text. */ + c->tag_text_size = chunksize - WAV_CART_MIN_CHUNK_SIZE ; + bytes += psf_binheader_readf (psf, "b", c->tag_text, make_size_t (c->tag_text_size)) ; + } ; + + return 0 ; +} /* wavlike_read_cart_chunk */ + +int +wavlike_write_cart_chunk (SF_PRIVATE *psf) +{ SF_CART_INFO_16K *c ; + int k ; + + if (psf->cart_16k == NULL) + return -1 ; + + c = psf->cart_16k ; + psf_binheader_writef (psf, "m4", BHWm (cart_MARKER), BHW4 (WAV_CART_MIN_CHUNK_SIZE + c->tag_text_size)) ; + /* + ** Note that it is very important that the field widths of the SF_CART_INFO + ** struct match those of the cart chunk fields. + */ + psf_binheader_writef (psf, "b", BHWv (c->version), BHWz (sizeof (c->version))) ; + psf_binheader_writef (psf, "b", BHWv (c->title), BHWz (sizeof (c->title))) ; + psf_binheader_writef (psf, "b", BHWv (c->artist), BHWz (sizeof (c->artist))) ; + psf_binheader_writef (psf, "b", BHWv (c->cut_id), BHWz (sizeof (c->cut_id))) ; + psf_binheader_writef (psf, "b", BHWv (c->client_id), BHWz (sizeof (c->client_id))) ; + psf_binheader_writef (psf, "b", BHWv (c->category), BHWz (sizeof (c->category))) ; + psf_binheader_writef (psf, "b", BHWv (c->classification), BHWz (sizeof (c->classification))) ; + psf_binheader_writef (psf, "b", BHWv (c->out_cue), BHWz (sizeof (c->out_cue))) ; + psf_binheader_writef (psf, "b", BHWv (c->start_date), BHWz (sizeof (c->start_date))) ; + psf_binheader_writef (psf, "b", BHWv (c->start_time), BHWz (sizeof (c->start_time))) ; + psf_binheader_writef (psf, "b", BHWv (c->end_date), BHWz (sizeof (c->end_date))) ; + psf_binheader_writef (psf, "b", BHWv (c->end_time), BHWz (sizeof (c->end_time))) ; + psf_binheader_writef (psf, "b", BHWv (c->producer_app_id), BHWz (sizeof (c->producer_app_id))) ; + psf_binheader_writef (psf, "b", BHWv (c->producer_app_version), BHWz (sizeof (c->producer_app_version))) ; + psf_binheader_writef (psf, "b", BHWv (c->user_def), BHWz (sizeof (c->user_def))) ; + psf_binheader_writef (psf, "e4", BHW4 (c->level_reference)) ; + + for (k = 0 ; k < ARRAY_LEN (c->post_timers) ; k++) + psf_binheader_writef (psf, "b4", BHWv (c->post_timers [k].usage), BHWz (4), BHW4 (c->post_timers [k].value)) ; + + psf_binheader_writef (psf, "z", BHWz (sizeof (c->reserved))) ; // just write zeros, we don't have any other use for it + psf_binheader_writef (psf, "b", BHWv (c->url), BHWz (sizeof (c->url))) ; + + if (c->tag_text_size > 0) + psf_binheader_writef (psf, "b", BHWv (c->tag_text), BHWz (c->tag_text_size)) ; + + return 0 ; +} /* wavlike_write_cart_chunk */ + +int +wavlike_subchunk_parse (SF_PRIVATE *psf, int chunk, uint32_t chunk_length) +{ sf_count_t current_pos ; + char buffer [2048] ; + uint32_t chunk_size, bytesread = 0 ; + + current_pos = psf_fseek (psf, 0, SEEK_CUR) ; + + if (chunk_length <= 8) + { /* This case is for broken files generated by PEAK. */ + psf_log_printf (psf, "%M : %u (weird length)\n", chunk, chunk_length) ; + psf_binheader_readf (psf, "mj", &chunk, chunk_length - 4) ; + psf_log_printf (psf, " %M\n", chunk) ; + return 0 ; + } ; + + if (current_pos + chunk_length > psf->filelength) + { psf_log_printf (psf, "%M : %u (should be %d)\n", chunk, chunk_length, (int) (psf->filelength - current_pos)) ; + chunk_length = psf->filelength - current_pos ; + } + else + psf_log_printf (psf, "%M : %u\n", chunk, chunk_length) ; + + while (bytesread < chunk_length) + { uint32_t thisread ; + + if ((thisread = psf_binheader_readf (psf, "m", &chunk)) == 0) + break ; + bytesread += thisread ; + + switch (chunk) + { case adtl_MARKER : + case INFO_MARKER : + /* These markers don't contain anything, not even a chunk lebgth. */ + psf_log_printf (psf, " %M\n", chunk) ; + continue ; + + case exif_MARKER : + psf_log_printf (psf, " %M\n", chunk) ; + if (chunk_length > bytesread) + bytesread += exif_subchunk_parse (psf, chunk_length - bytesread) ; + continue ; + + case data_MARKER : + psf_log_printf (psf, " %M inside a LIST block??? Backing out.\n", chunk) ; + /* Jump back four bytes and return to caller. */ + psf_binheader_readf (psf, "j", -4) ; + return 0 ; + + case 0 : + /* + ** Four zero bytes where a marker was expected. Assume this means + ** the rest of the chunk is garbage. + */ + psf_log_printf (psf, " *** Found weird-ass zero marker. Jumping to end of chunk.\n") ; + if (bytesread < chunk_length) + bytesread += psf_binheader_readf (psf, "j", chunk_length - bytesread) ; + psf_log_printf (psf, " *** Offset is now : 0x%X\n", psf_fseek (psf, 0, SEEK_CUR)) ; + return 0 ; + + default : + break ; + } ; + + switch (chunk) + { case ISFT_MARKER : + case ICOP_MARKER : + case IARL_MARKER : + case IART_MARKER : + case ICMT_MARKER : + case ICRD_MARKER : + case IENG_MARKER : + case IGNR_MARKER : + case INAM_MARKER : + case IPRD_MARKER : + case ISBJ_MARKER : + case ISRC_MARKER : + case IAUT_MARKER : + case ITRK_MARKER : + bytesread += psf_binheader_readf (psf, "4", &chunk_size) ; + chunk_size += (chunk_size & 1) ; + if (chunk_size >= SIGNED_SIZEOF (buffer) || chunk_size >= chunk_length) + { psf_log_printf (psf, " *** %M : %u (too big)\n", chunk, chunk_size) ; + goto cleanup_subchunk_parse ; + } ; + + bytesread += psf_binheader_readf (psf, "b", buffer, chunk_size) ; + buffer [chunk_size] = 0 ; + psf_log_printf (psf, " %M : %s\n", chunk, buffer) ; + break ; + + case labl_MARKER : + { int mark_id ; + + bytesread += psf_binheader_readf (psf, "44", &chunk_size, &mark_id) ; + chunk_size -= 4 ; + chunk_size += (chunk_size & 1) ; + if (chunk_size < 1 || chunk_size >= SIGNED_SIZEOF (buffer) || chunk_size >= chunk_length) + { psf_log_printf (psf, " *** %M : %u (too big)\n", chunk, chunk_size) ; + goto cleanup_subchunk_parse ; + } ; + + bytesread += psf_binheader_readf (psf, "b", buffer, chunk_size) ; + buffer [chunk_size] = 0 ; + + if (mark_id < 10) /* avoid swamping log buffer with labels */ + psf_log_printf (psf, " %M : %u : %s\n", chunk, mark_id, buffer) ; + else if (mark_id == 10) + psf_log_printf (psf, " (Skipping)\n") ; + + if (psf->cues) + { unsigned int i = 0 ; + + /* find id to store label */ + while (i < psf->cues->cue_count && psf->cues->cue_points [i].indx != mark_id) + i++ ; + + if (i < psf->cues->cue_count) + memcpy (psf->cues->cue_points [i].name, buffer, sizeof (psf->cues->cue_points [i].name)) ; + } ; + } ; + break ; + + case DISP_MARKER : + case ltxt_MARKER : + case note_MARKER : + bytesread += psf_binheader_readf (psf, "4", &chunk_size) ; + chunk_size += (chunk_size & 1) ; + if (chunk_size >= SIGNED_SIZEOF (buffer) || chunk_size >= chunk_length) + { psf_log_printf (psf, " *** %M : %u (too big)\n", chunk, chunk_size) ; + goto cleanup_subchunk_parse ; + } ; + + psf_log_printf (psf, " %M : %u\n", chunk, chunk_size) ; + goto cleanup_subchunk_parse ; + + default : + bytesread += psf_binheader_readf (psf, "4", &chunk_size) ; + chunk_size += (chunk_size & 1) ; + psf_log_printf (psf, " *** %M : %u\n", chunk, chunk_size) ; + if (bytesread + chunk_size > chunk_length) + { bytesread += psf_binheader_readf (psf, "j", chunk_length - bytesread + 4) ; + continue ; + } + else + bytesread += psf_binheader_readf (psf, "j", chunk_size) ; + + if (chunk_size >= chunk_length) + return 0 ; + break ; + } ; + + switch (chunk) + { case ISFT_MARKER : + psf_store_string (psf, SF_STR_SOFTWARE, buffer) ; + break ; + case ICOP_MARKER : + psf_store_string (psf, SF_STR_COPYRIGHT, buffer) ; + break ; + case INAM_MARKER : + psf_store_string (psf, SF_STR_TITLE, buffer) ; + break ; + case IART_MARKER : + psf_store_string (psf, SF_STR_ARTIST, buffer) ; + break ; + case ICMT_MARKER : + psf_store_string (psf, SF_STR_COMMENT, buffer) ; + break ; + case ICRD_MARKER : + psf_store_string (psf, SF_STR_DATE, buffer) ; + break ; + case IGNR_MARKER : + psf_store_string (psf, SF_STR_GENRE, buffer) ; + break ; + case IPRD_MARKER : + psf_store_string (psf, SF_STR_ALBUM, buffer) ; + break ; + case ITRK_MARKER : + psf_store_string (psf, SF_STR_TRACKNUMBER, buffer) ; + break ; + } ; + } ; + +cleanup_subchunk_parse : + + if (chunk_length > bytesread) + bytesread += psf_binheader_readf (psf, "j", chunk_length - bytesread) ; + + return 0 ; +} /* wavlike_subchunk_parse */ + +void +wavlike_write_strings (SF_PRIVATE *psf, int location) +{ int k, prev_head_index, saved_head_index ; + + if (psf_location_string_count (psf, location) == 0) + return ; + + prev_head_index = psf->header.indx + 4 ; + + psf_binheader_writef (psf, "m4m", BHWm (LIST_MARKER), BHW4 (0xBADBAD), BHWm (INFO_MARKER)) ; + + for (k = 0 ; k < SF_MAX_STRINGS ; k++) + { if (psf->strings.data [k].type == 0) + break ; + if (psf->strings.data [k].type < 0 || psf->strings.data [k].flags != location) + continue ; + + switch (psf->strings.data [k].type) + { case SF_STR_SOFTWARE : + psf_binheader_writef (psf, "ms", BHWm (ISFT_MARKER), BHWs (psf->strings.storage + psf->strings.data [k].offset)) ; + break ; + + case SF_STR_TITLE : + psf_binheader_writef (psf, "ms", BHWm (INAM_MARKER), BHWs (psf->strings.storage + psf->strings.data [k].offset)) ; + break ; + + case SF_STR_COPYRIGHT : + psf_binheader_writef (psf, "ms", BHWm (ICOP_MARKER), BHWs (psf->strings.storage + psf->strings.data [k].offset)) ; + break ; + + case SF_STR_ARTIST : + psf_binheader_writef (psf, "ms", BHWm (IART_MARKER), BHWs (psf->strings.storage + psf->strings.data [k].offset)) ; + break ; + + case SF_STR_COMMENT : + psf_binheader_writef (psf, "ms", BHWm (ICMT_MARKER), BHWs (psf->strings.storage + psf->strings.data [k].offset)) ; + break ; + + case SF_STR_DATE : + psf_binheader_writef (psf, "ms", BHWm (ICRD_MARKER), BHWs (psf->strings.storage + psf->strings.data [k].offset)) ; + break ; + + case SF_STR_GENRE : + psf_binheader_writef (psf, "ms", BHWm (IGNR_MARKER), BHWs (psf->strings.storage + psf->strings.data [k].offset)) ; + break ; + + case SF_STR_ALBUM : + psf_binheader_writef (psf, "ms", BHWm (IPRD_MARKER), BHWs (psf->strings.storage + psf->strings.data [k].offset)) ; + break ; + + case SF_STR_TRACKNUMBER : + psf_binheader_writef (psf, "ms", BHWm (ITRK_MARKER), BHWs (psf->strings.storage + psf->strings.data [k].offset)) ; + break ; + + default : + break ; + } ; + } ; + + saved_head_index = psf->header.indx ; + psf->header.indx = prev_head_index ; + psf_binheader_writef (psf, "4", BHW4 (saved_head_index - prev_head_index - 4)) ; + psf->header.indx = saved_head_index ; + +} /* wavlike_write_strings */ + +int +wavlike_read_peak_chunk (SF_PRIVATE * psf, size_t chunk_size) +{ char buffer [256] ; + uint32_t uk ; + + if (chunk_size != WAVLIKE_PEAK_CHUNK_SIZE (psf->sf.channels)) + { psf_binheader_readf (psf, "j", chunk_size) ; + psf_log_printf (psf, "*** File PEAK chunk size doesn't fit with number of channels (%d).\n", psf->sf.channels) ; + return SFE_WAV_BAD_PEAK ; + } ; + + if (psf->peak_info) + { psf_log_printf (psf, "*** Found existing peak info, using last one.\n") ; + free (psf->peak_info) ; + psf->peak_info = NULL ; + } ; + if ((psf->peak_info = peak_info_calloc (psf->sf.channels)) == NULL) + return SFE_MALLOC_FAILED ; + + /* read in rest of PEAK chunk. */ + psf_binheader_readf (psf, "44", & (psf->peak_info->version), & (psf->peak_info->timestamp)) ; + + if (psf->peak_info->version != 1) + psf_log_printf (psf, " version : %d *** (should be version 1)\n", psf->peak_info->version) ; + else + psf_log_printf (psf, " version : %d\n", psf->peak_info->version) ; + + psf_log_printf (psf, " time stamp : %d\n", psf->peak_info->timestamp) ; + psf_log_printf (psf, " Ch Position Value\n") ; + + for (uk = 0 ; uk < (uint32_t) psf->sf.channels ; uk++) + { float value ; + uint32_t position ; + + psf_binheader_readf (psf, "f4", &value, &position) ; + psf->peak_info->peaks [uk].value = value ; + psf->peak_info->peaks [uk].position = position ; + + snprintf (buffer, sizeof (buffer), " %2d %-12" PRId64 " %g\n", + uk, psf->peak_info->peaks [uk].position, psf->peak_info->peaks [uk].value) ; + buffer [sizeof (buffer) - 1] = 0 ; + psf_log_printf (psf, "%s", buffer) ; + } ; + + return 0 ; +} /* wavlike_read_peak_chunk */ + +void +wavlike_write_peak_chunk (SF_PRIVATE * psf) +{ int k ; + + if (psf->peak_info == NULL) + return ; + + psf_binheader_writef (psf, "m4", BHWm (PEAK_MARKER), BHW4 (WAVLIKE_PEAK_CHUNK_SIZE (psf->sf.channels))) ; + psf_binheader_writef (psf, "44", BHW4 (1), BHW4 (time (NULL))) ; + for (k = 0 ; k < psf->sf.channels ; k++) + psf_binheader_writef (psf, "ft8", BHWf (psf->peak_info->peaks [k].value), BHW8 (psf->peak_info->peaks [k].position)) ; +} /* wavlike_write_peak_chunk */ + +/*============================================================================== +*/ + +static int +exif_fill_and_sink (SF_PRIVATE *psf, char* buf, size_t bufsz, size_t toread) +{ + size_t bytesread = 0 ; + + buf [0] = 0 ; + bufsz -= 1 ; + if (toread < bufsz) + bufsz = toread ; + bytesread = psf_binheader_readf (psf, "b", buf, bufsz) ; + buf [bufsz] = 0 ; + + if (bytesread == bufsz && toread > bufsz) + bytesread += psf_binheader_readf (psf, "j", toread - bufsz) ; + + return bytesread ; +} /* exif_fill_and_sink */ + +/* +** Exif specification for audio files, at JEITA CP-3451 Exif 2.2 section 5 +** (Exif Audio File Specification) http://www.exif.org/Exif2-2.PDF +*/ +static int +exif_subchunk_parse (SF_PRIVATE *psf, uint32_t length) +{ uint32_t marker, dword = 0, vmajor = -1, vminor = -1, bytesread = 0 ; + char buf [4096] ; + int thisread ; + + while (bytesread < length) + { + if ((thisread = psf_binheader_readf (psf, "m", &marker)) == 0) + break ; + bytesread += thisread ; + + switch (marker) + { + case 0 : /* camera padding? */ + break ; + + case ever_MARKER : + bytesread += psf_binheader_readf (psf, "j4", 4, &dword) ; + vmajor = 10 * (((dword >> 24) & 0xff) - '0') + (((dword >> 16) & 0xff) - '0') ; + vminor = 10 * (((dword >> 8) & 0xff) - '0') + ((dword & 0xff) - '0') ; + psf_log_printf (psf, " EXIF Version : %u.%02u\n", vmajor, vminor) ; + break ; + + case olym_MARKER : + bytesread += psf_binheader_readf (psf, "4", &dword) ; + psf_log_printf (psf, "%M : %u\n", marker, dword) ; + if (dword > length || bytesread + dword > length) + break ; + dword += (dword & 1) ; + bytesread += psf_binheader_readf (psf, "j", dword) ; + break ; + + case emnt_MARKER : /* design information: null-terminated string */ + case emdl_MARKER : /* model name ; null-terminated string */ + case ecor_MARKER : /* manufacturer: null-terminated string */ + case etim_MARKER : /* creation time: null-terminated string in the format "hour:minute:second.subsecond" */ + case erel_MARKER : /* relation info: null-terminated string (filename) */ + case eucm_MARKER : /* user comment: 4-byte size follows, then possibly unicode data */ + bytesread += psf_binheader_readf (psf, "4", &dword) ; + bytesread += sizeof (dword) ; + dword += (dword & 1) ; + + if (dword >= sizeof (buf)) + { psf_log_printf (psf, "*** Marker '%M' is too big %u\n\n", marker, dword) ; + return bytesread ; + } ; + + bytesread += exif_fill_and_sink (psf, buf, sizeof (buf), dword) ; + + /* BAD - don't know what's going on here -- maybe a bug in the camera */ + /* field should be NULL-terminated but there's no room for it with the reported number */ + /* example output: emdl : 8 (EX-Z1050) */ + if (marker == emdl_MARKER && dword == strlen (buf) /* should be >= strlen+1*/) + { psf_log_printf (psf, " *** field size too small for string (sinking 2 bytes)\n") ; + bytesread += psf_binheader_readf (psf, "j", 2) ; + } ; + + psf_log_printf (psf, " %M : %u (%s)\n", marker, dword, buf) ; + if (dword > length) + return bytesread ; + break ; + + default : + psf_log_printf (psf, " *** %M (%u): -- ignored --\n", marker, marker) ; + break ; + } ; + } ; + + return bytesread ; +} /* exif_subchunk_parse */ + +void +wavlike_write_custom_chunks (SF_PRIVATE * psf) +{ uint32_t k ; + + for (k = 0 ; k < psf->wchunks.used ; k++) + psf_binheader_writef (psf, "m4b", BHWm (psf->wchunks.chunks [k].mark32), BHW4 (psf->wchunks.chunks [k].len), + BHWv (psf->wchunks.chunks [k].data), BHWz (psf->wchunks.chunks [k].len)) ; + +} /* wavlike_write_custom_chunks */ diff --git a/libsndfile-1.0.31/src/wavlike.h b/libsndfile-1.0.31/src/wavlike.h new file mode 100644 index 0000000..4cde1e9 --- /dev/null +++ b/libsndfile-1.0.31/src/wavlike.h @@ -0,0 +1,358 @@ +/* +** Copyright (C) 1999-2016 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +/* This file contains definitions commong to WAV and W64 files. */ + + +#ifndef WAVLIKE_H_INCLUDED +#define WAVLIKE_H_INCLUDED + +/*------------------------------------------------------------------------------ +** Chunk markers. +*/ + +#define adtl_MARKER MAKE_MARKER ('a', 'd', 't', 'l') +#define bext_MARKER MAKE_MARKER ('b', 'e', 'x', 't') +#define cart_MARKER MAKE_MARKER ('c', 'a', 'r', 't') +#define data_MARKER MAKE_MARKER ('d', 'a', 't', 'a') +#define labl_MARKER MAKE_MARKER ('l', 'a', 'b', 'l') +#define ltxt_MARKER MAKE_MARKER ('l', 't', 'x', 't') +#define note_MARKER MAKE_MARKER ('n', 'o', 't', 'e') +#define DISP_MARKER MAKE_MARKER ('D', 'I', 'S', 'P') +#define INFO_MARKER MAKE_MARKER ('I', 'N', 'F', 'O') +#define LIST_MARKER MAKE_MARKER ('L', 'I', 'S', 'T') +#define PAD_MARKER MAKE_MARKER ('P', 'A', 'D', ' ') +#define PEAK_MARKER MAKE_MARKER ('P', 'E', 'A', 'K') + +#define ISFT_MARKER MAKE_MARKER ('I', 'S', 'F', 'T') +#define ICRD_MARKER MAKE_MARKER ('I', 'C', 'R', 'D') +#define ICOP_MARKER MAKE_MARKER ('I', 'C', 'O', 'P') +#define IARL_MARKER MAKE_MARKER ('I', 'A', 'R', 'L') +#define IART_MARKER MAKE_MARKER ('I', 'A', 'R', 'T') +#define INAM_MARKER MAKE_MARKER ('I', 'N', 'A', 'M') +#define IENG_MARKER MAKE_MARKER ('I', 'E', 'N', 'G') +#define IGNR_MARKER MAKE_MARKER ('I', 'G', 'N', 'R') +#define ICOP_MARKER MAKE_MARKER ('I', 'C', 'O', 'P') +#define IPRD_MARKER MAKE_MARKER ('I', 'P', 'R', 'D') +#define ISRC_MARKER MAKE_MARKER ('I', 'S', 'R', 'C') +#define ISBJ_MARKER MAKE_MARKER ('I', 'S', 'B', 'J') +#define ICMT_MARKER MAKE_MARKER ('I', 'C', 'M', 'T') +#define IAUT_MARKER MAKE_MARKER ('I', 'A', 'U', 'T') +#define ITRK_MARKER MAKE_MARKER ('I', 'T', 'R', 'K') + +#define exif_MARKER MAKE_MARKER ('e', 'x', 'i', 'f') +#define ever_MARKER MAKE_MARKER ('e', 'v', 'e', 'r') +#define etim_MARKER MAKE_MARKER ('e', 't', 'i', 'm') +#define ecor_MARKER MAKE_MARKER ('e', 'c', 'o', 'r') +#define emdl_MARKER MAKE_MARKER ('e', 'm', 'd', 'l') +#define emnt_MARKER MAKE_MARKER ('e', 'm', 'n', 't') +#define erel_MARKER MAKE_MARKER ('e', 'r', 'e', 'l') +#define eucm_MARKER MAKE_MARKER ('e', 'u', 'c', 'm') +#define olym_MARKER MAKE_MARKER ('o', 'l', 'y', 'm') + +/*------------------------------------------------------------------------------ +** List of known WAV format tags +*/ + +enum +{ + /* keep sorted for wavlike_format_str() */ + WAVE_FORMAT_UNKNOWN = 0x0000, /* Microsoft Corporation */ + WAVE_FORMAT_PCM = 0x0001, /* Microsoft PCM format */ + WAVE_FORMAT_MS_ADPCM = 0x0002, /* Microsoft ADPCM */ + WAVE_FORMAT_IEEE_FLOAT = 0x0003, /* Micrososft 32 bit float format */ + WAVE_FORMAT_VSELP = 0x0004, /* Compaq Computer Corporation */ + WAVE_FORMAT_IBM_CVSD = 0x0005, /* IBM Corporation */ + WAVE_FORMAT_ALAW = 0x0006, /* Microsoft Corporation */ + WAVE_FORMAT_MULAW = 0x0007, /* Microsoft Corporation */ + WAVE_FORMAT_OKI_ADPCM = 0x0010, /* OKI */ + WAVE_FORMAT_IMA_ADPCM = 0x0011, /* Intel Corporation */ + WAVE_FORMAT_MEDIASPACE_ADPCM = 0x0012, /* Videologic */ + WAVE_FORMAT_SIERRA_ADPCM = 0x0013, /* Sierra Semiconductor Corp */ + WAVE_FORMAT_G723_ADPCM = 0x0014, /* Antex Electronics Corporation */ + WAVE_FORMAT_DIGISTD = 0x0015, /* DSP Solutions, Inc. */ + WAVE_FORMAT_DIGIFIX = 0x0016, /* DSP Solutions, Inc. */ + WAVE_FORMAT_DIALOGIC_OKI_ADPCM = 0x0017, /* Dialogic Corporation */ + WAVE_FORMAT_MEDIAVISION_ADPCM = 0x0018, /* Media Vision, Inc. */ + WAVE_FORMAT_CU_CODEC = 0x0019, /* Hewlett-Packard Company */ + WAVE_FORMAT_YAMAHA_ADPCM = 0x0020, /* Yamaha Corporation of America */ + WAVE_FORMAT_SONARC = 0x0021, /* Speech Compression */ + WAVE_FORMAT_DSPGROUP_TRUESPEECH = 0x0022, /* DSP Group, Inc */ + WAVE_FORMAT_ECHOSC1 = 0x0023, /* Echo Speech Corporation */ + WAVE_FORMAT_AUDIOFILE_AF36 = 0x0024, /* Audiofile, Inc. */ + WAVE_FORMAT_APTX = 0x0025, /* Audio Processing Technology */ + WAVE_FORMAT_AUDIOFILE_AF10 = 0x0026, /* Audiofile, Inc. */ + WAVE_FORMAT_PROSODY_1612 = 0x0027, /* Aculab plc */ + WAVE_FORMAT_LRC = 0x0028, /* Merging Technologies S.A. */ + WAVE_FORMAT_DOLBY_AC2 = 0x0030, /* Dolby Laboratories */ + WAVE_FORMAT_GSM610 = 0x0031, /* Microsoft Corporation */ + WAVE_FORMAT_MSNAUDIO = 0x0032, /* Microsoft Corporation */ + WAVE_FORMAT_ANTEX_ADPCME = 0x0033, /* Antex Electronics Corporation */ + WAVE_FORMAT_CONTROL_RES_VQLPC = 0x0034, /* Control Resources Limited */ + WAVE_FORMAT_DIGIREAL = 0x0035, /* DSP Solutions, Inc. */ + WAVE_FORMAT_DIGIADPCM = 0x0036, /* DSP Solutions, Inc. */ + WAVE_FORMAT_CONTROL_RES_CR10 = 0x0037, /* Control Resources Limited */ + WAVE_FORMAT_NMS_VBXADPCM = 0x0038, /* Natural MicroSystems */ + WAVE_FORMAT_ROLAND_RDAC = 0x0039, /* Roland */ + WAVE_FORMAT_ECHOSC3 = 0x003A, /* Echo Speech Corporation */ + WAVE_FORMAT_ROCKWELL_ADPCM = 0x003B, /* Rockwell International */ + WAVE_FORMAT_ROCKWELL_DIGITALK = 0x003C, /* Rockwell International */ + WAVE_FORMAT_XEBEC = 0x003D, /* Xebec Multimedia Solutions Limited */ + WAVE_FORMAT_G721_ADPCM = 0x0040, /* Antex Electronics Corporation */ + WAVE_FORMAT_G728_CELP = 0x0041, /* Antex Electronics Corporation */ + WAVE_FORMAT_MSG723 = 0x0042, /* Microsoft Corporation */ + WAVE_FORMAT_MPEG = 0x0050, /* Microsoft Corporation */ + WAVE_FORMAT_RT24 = 0x0052, /* InSoft Inc. */ + WAVE_FORMAT_PAC = 0x0053, /* InSoft Inc. */ + WAVE_FORMAT_MPEGLAYER3 = 0x0055, /* MPEG 3 Layer 1 */ + WAVE_FORMAT_LUCENT_G723 = 0x0059, /* Lucent Technologies */ + WAVE_FORMAT_CIRRUS = 0x0060, /* Cirrus Logic */ + WAVE_FORMAT_ESPCM = 0x0061, /* ESS Technology */ + WAVE_FORMAT_VOXWARE = 0x0062, /* Voxware Inc */ + WAVE_FORMAT_CANOPUS_ATRAC = 0x0063, /* Canopus, Co., Ltd. */ + WAVE_FORMAT_G726_ADPCM = 0x0064, /* APICOM */ + WAVE_FORMAT_G722_ADPCM = 0x0065, /* APICOM */ + WAVE_FORMAT_DSAT = 0x0066, /* Microsoft Corporation */ + WAVE_FORMAT_DSAT_DISPLAY = 0x0067, /* Microsoft Corporation */ + WAVE_FORMAT_VOXWARE_BYTE_ALIGNED = 0x0069, /* Voxware Inc. */ + WAVE_FORMAT_VOXWARE_AC8 = 0x0070, /* Voxware Inc. */ + WAVE_FORMAT_VOXWARE_AC10 = 0x0071, /* Voxware Inc. */ + WAVE_FORMAT_VOXWARE_AC16 = 0x0072, /* Voxware Inc. */ + WAVE_FORMAT_VOXWARE_AC20 = 0x0073, /* Voxware Inc. */ + WAVE_FORMAT_VOXWARE_RT24 = 0x0074, /* Voxware Inc. */ + WAVE_FORMAT_VOXWARE_RT29 = 0x0075, /* Voxware Inc. */ + WAVE_FORMAT_VOXWARE_RT29HW = 0x0076, /* Voxware Inc. */ + WAVE_FORMAT_VOXWARE_VR12 = 0x0077, /* Voxware Inc. */ + WAVE_FORMAT_VOXWARE_VR18 = 0x0078, /* Voxware Inc. */ + WAVE_FORMAT_VOXWARE_TQ40 = 0x0079, /* Voxware Inc. */ + WAVE_FORMAT_SOFTSOUND = 0x0080, /* Softsound, Ltd. */ + WAVE_FORMAT_VOXARE_TQ60 = 0x0081, /* Voxware Inc. */ + WAVE_FORMAT_MSRT24 = 0x0082, /* Microsoft Corporation */ + WAVE_FORMAT_G729A = 0x0083, /* AT&T Laboratories */ + WAVE_FORMAT_MVI_MV12 = 0x0084, /* Motion Pixels */ + WAVE_FORMAT_DF_G726 = 0x0085, /* DataFusion Systems (Pty) (Ltd) */ + WAVE_FORMAT_DF_GSM610 = 0x0086, /* DataFusion Systems (Pty) (Ltd) */ + /* removed because duplicate */ + /* WAVE_FORMAT_ISIAUDIO = 0x0088, */ /* Iterated Systems, Inc. */ + WAVE_FORMAT_ONLIVE = 0x0089, /* OnLive! Technologies, Inc. */ + WAVE_FORMAT_SBC24 = 0x0091, /* Siemens Business Communications Systems */ + WAVE_FORMAT_DOLBY_AC3_SPDIF = 0x0092, /* Sonic Foundry */ + WAVE_FORMAT_ZYXEL_ADPCM = 0x0097, /* ZyXEL Communications, Inc. */ + WAVE_FORMAT_PHILIPS_LPCBB = 0x0098, /* Philips Speech Processing */ + WAVE_FORMAT_PACKED = 0x0099, /* Studer Professional Audio AG */ + WAVE_FORMAT_RHETOREX_ADPCM = 0x0100, /* Rhetorex, Inc. */ + + /* removed because of the following */ + /* WAVE_FORMAT_IRAT = 0x0101,*/ /* BeCubed Software Inc. */ + + /* these three are unofficial */ + IBM_FORMAT_MULAW = 0x0101, /* IBM mu-law format */ + IBM_FORMAT_ALAW = 0x0102, /* IBM a-law format */ + IBM_FORMAT_ADPCM = 0x0103, /* IBM AVC Adaptive Differential PCM format */ + + WAVE_FORMAT_VIVO_G723 = 0x0111, /* Vivo Software */ + WAVE_FORMAT_VIVO_SIREN = 0x0112, /* Vivo Software */ + WAVE_FORMAT_DIGITAL_G723 = 0x0123, /* Digital Equipment Corporation */ + WAVE_FORMAT_CREATIVE_ADPCM = 0x0200, /* Creative Labs, Inc */ + WAVE_FORMAT_CREATIVE_FASTSPEECH8 = 0x0202, /* Creative Labs, Inc */ + WAVE_FORMAT_CREATIVE_FASTSPEECH10 = 0x0203, /* Creative Labs, Inc */ + WAVE_FORMAT_QUARTERDECK = 0x0220, /* Quarterdeck Corporation */ + WAVE_FORMAT_FM_TOWNS_SND = 0x0300, /* Fujitsu Corporation */ + WAVE_FORMAT_BZV_DIGITAL = 0x0400, /* Brooktree Corporation */ + WAVE_FORMAT_VME_VMPCM = 0x0680, /* AT&T Labs, Inc. */ + WAVE_FORMAT_OLIGSM = 0x1000, /* Ing C. Olivetti & C., S.p.A. */ + WAVE_FORMAT_OLIADPCM = 0x1001, /* Ing C. Olivetti & C., S.p.A. */ + WAVE_FORMAT_OLICELP = 0x1002, /* Ing C. Olivetti & C., S.p.A. */ + WAVE_FORMAT_OLISBC = 0x1003, /* Ing C. Olivetti & C., S.p.A. */ + WAVE_FORMAT_OLIOPR = 0x1004, /* Ing C. Olivetti & C., S.p.A. */ + WAVE_FORMAT_LH_CODEC = 0x1100, /* Lernout & Hauspie */ + WAVE_FORMAT_NORRIS = 0x1400, /* Norris Communications, Inc. */ + /* removed because duplicate */ + /* WAVE_FORMAT_ISIAUDIO = 0x1401, */ /* AT&T Labs, Inc. */ + WAVE_FORMAT_SOUNDSPACE_MUSICOMPRESS = 0x1500, /* AT&T Labs, Inc. */ + WAVE_FORMAT_DVM = 0x2000, /* FAST Multimedia AG */ + WAVE_FORMAT_INTERWAV_VSC112 = 0x7150, /* ????? */ + + WAVE_FORMAT_IPP_ITU_G_723_1 = 0x7230, /* Intel Performance Primitives g723 codec. */ + + WAVE_FORMAT_EXTENSIBLE = 0xFFFE +} ; + +typedef struct +{ unsigned short format ; + unsigned short channels ; + unsigned int samplerate ; + unsigned int bytespersec ; + unsigned short blockalign ; + unsigned short bitwidth ; +} MIN_WAV_FMT ; + +typedef struct +{ unsigned short format ; + unsigned short channels ; + unsigned int samplerate ; + unsigned int bytespersec ; + unsigned short blockalign ; + unsigned short bitwidth ; + unsigned short extrabytes ; + unsigned short dummy ; +} WAV_FMT_SIZE20 ; + +typedef struct +{ unsigned short format ; + unsigned short channels ; + unsigned int samplerate ; + unsigned int bytespersec ; + unsigned short blockalign ; + unsigned short bitwidth ; + unsigned short extrabytes ; + unsigned short samplesperblock ; + unsigned short numcoeffs ; + struct + { short coeff1 ; + short coeff2 ; + } coeffs [7] ; +} MS_ADPCM_WAV_FMT ; + +typedef struct +{ unsigned short format ; + unsigned short channels ; + unsigned int samplerate ; + unsigned int bytespersec ; + unsigned short blockalign ; + unsigned short bitwidth ; + unsigned short extrabytes ; + unsigned short samplesperblock ; +} IMA_ADPCM_WAV_FMT ; + +typedef struct +{ unsigned short format ; + unsigned short channels ; + unsigned int samplerate ; + unsigned int bytespersec ; + unsigned short blockalign ; + unsigned short bitwidth ; + unsigned short extrabytes ; + unsigned short auxblocksize ; +} G72x_ADPCM_WAV_FMT ; + + +typedef struct +{ unsigned short format ; + unsigned short channels ; + unsigned int samplerate ; + unsigned int bytespersec ; + unsigned short blockalign ; + unsigned short bitwidth ; + unsigned short extrabytes ; + unsigned short samplesperblock ; +} GSM610_WAV_FMT ; + +typedef struct +{ unsigned int esf_field1 ; + unsigned short esf_field2 ; + unsigned short esf_field3 ; + unsigned char esf_field4 [8] ; +} EXT_SUBFORMAT ; + +typedef struct +{ unsigned short format ; + unsigned short channels ; + unsigned int samplerate ; + unsigned int bytespersec ; + unsigned short blockalign ; + unsigned short bitwidth ; + unsigned short extrabytes ; + unsigned short validbits ; + unsigned int channelmask ; + EXT_SUBFORMAT esf ; +} EXTENSIBLE_WAV_FMT ; + +typedef union +{ unsigned short format ; + MIN_WAV_FMT min ; + IMA_ADPCM_WAV_FMT ima ; + MS_ADPCM_WAV_FMT msadpcm ; + G72x_ADPCM_WAV_FMT g72x ; + EXTENSIBLE_WAV_FMT ext ; + GSM610_WAV_FMT gsm610 ; + WAV_FMT_SIZE20 size20 ; + char padding [512] ; +} WAV_FMT ; + +typedef struct +{ int frames ; +} FACT_CHUNK ; + +typedef struct +{ /* For ambisonic commands */ + int wavex_ambisonic ; + unsigned wavex_channelmask ; + + /* Set to true when 'fmt ' chunk is ambiguous.*/ + int fmt_is_broken ; + WAV_FMT wav_fmt ; + + /* + ** Set to true when RF64 should be converted back to RIFF when writing the + ** header. + */ + int rf64_downgrade ; +} WAVLIKE_PRIVATE ; + +#define WAVLIKE_GSM610_BLOCKSIZE 65 +#define WAVLIKE_GSM610_SAMPLES 320 + +#define WAVLIKE_PEAK_CHUNK_SIZE(ch) (2 * sizeof (int) + ch * (sizeof (float) + sizeof (int))) + +/*------------------------------------------------------------------------------------ +** Functions defined in wav_ms_adpcm.c +*/ + +#define WAVLIKE_MSADPCM_ADAPT_COEFF_COUNT 7 + +void wavlike_msadpcm_write_adapt_coeffs (SF_PRIVATE *psf) ; + +/*------------------------------------------------------------------------------------ +** Functions defined in wavlike.c +*/ + +char const* wavlike_format_str (int k) ; + +int wavlike_srate2blocksize (int srate_chan_product) ; +int wavlike_read_fmt_chunk (SF_PRIVATE *psf, int fmtsize) ; +void wavlike_write_guid (SF_PRIVATE *psf, const EXT_SUBFORMAT * subformat) ; +void wavlike_analyze (SF_PRIVATE *psf) ; +int wavlike_gen_channel_mask (const int *chan_map, int channels) ; + +int wavlike_read_bext_chunk (SF_PRIVATE *psf, uint32_t chunksize) ; +int wavlike_write_bext_chunk (SF_PRIVATE *psf) ; + +int wavlike_read_cart_chunk (SF_PRIVATE *psf, uint32_t chunksize) ; +int wavlike_write_cart_chunk (SF_PRIVATE *psf) ; + +int wavlike_subchunk_parse (SF_PRIVATE *psf, int chunk, uint32_t length) ; +void wavlike_write_strings (SF_PRIVATE *psf, int location) ; + +int wavlike_read_peak_chunk (SF_PRIVATE * psf, size_t chunk_size) ; +void wavlike_write_peak_chunk (SF_PRIVATE * psf) ; + +void wavlike_write_custom_chunks (SF_PRIVATE * psf) ; + +#endif + diff --git a/libsndfile-1.0.31/src/windows.c b/libsndfile-1.0.31/src/windows.c new file mode 100644 index 0000000..2ef3002 --- /dev/null +++ b/libsndfile-1.0.31/src/windows.c @@ -0,0 +1,92 @@ +/* +** Copyright (C) 2009-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +/* +** This needs to be a separate file so that we don't have to include +** elsewhere (too many symbol clashes). +*/ + + +#include "sfconfig.h" + +#if OS_IS_WIN32 +#include + +#define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1 +#include "sndfile.h" +#include "common.h" + +extern int sf_errno ; + +static void copy_filename (SF_PRIVATE * psf, LPCWSTR wpath) ; + +SNDFILE* +sf_wchar_open (LPCWSTR wpath, int mode, SF_INFO *sfinfo) +{ SF_PRIVATE *psf ; + char utf8name [512] ; + + if ((psf = psf_allocate ()) == NULL) + { sf_errno = SFE_MALLOC_FAILED ; + return NULL ; + } ; + + psf_init_files (psf) ; + + if (WideCharToMultiByte (CP_UTF8, 0, wpath, -1, utf8name, sizeof (utf8name), NULL, NULL) == 0) + psf->file.path.wc [0] = 0 ; + + psf_log_printf (psf, "File : '%s' (utf-8 converted from ucs-2)\n", utf8name) ; + + copy_filename (psf, wpath) ; + psf->file.use_wchar = SF_TRUE ; + psf->file.mode = mode ; + + psf->error = psf_fopen (psf) ; + + return psf_open_file (psf, sfinfo) ; +} /* sf_wchar_open */ + + +static void +copy_filename (SF_PRIVATE *psf, LPCWSTR wpath) +{ const wchar_t *cwcptr ; + wchar_t *wcptr ; + + wcsncpy (psf->file.path.wc, wpath, ARRAY_LEN (psf->file.path.wc)) ; + psf->file.path.wc [ARRAY_LEN (psf->file.path.wc) - 1] = 0 ; + if ((cwcptr = wcsrchr (wpath, '/')) || (cwcptr = wcsrchr (wpath, '\\'))) + cwcptr ++ ; + else + cwcptr = wpath ; + + wcsncpy (psf->file.name.wc, cwcptr, ARRAY_LEN (psf->file.name.wc)) ; + psf->file.name.wc [ARRAY_LEN (psf->file.name.wc) - 1] = 0 ; + + /* Now grab the directory. */ + wcsncpy (psf->file.dir.wc, wpath, ARRAY_LEN (psf->file.dir.wc)) ; + psf->file.dir.wc [ARRAY_LEN (psf->file.dir.wc) - 1] = 0 ; + + if ((wcptr = wcsrchr (psf->file.dir.wc, '/')) || (wcptr = wcsrchr (psf->file.dir.wc, '\\'))) + wcptr [1] = 0 ; + else + psf->file.dir.wc [0] = 0 ; + + return ; +} /* copy_filename */ + +#endif diff --git a/libsndfile-1.0.31/src/wve.c b/libsndfile-1.0.31/src/wve.c new file mode 100644 index 0000000..4b9fc8a --- /dev/null +++ b/libsndfile-1.0.31/src/wve.c @@ -0,0 +1,209 @@ +/* +** Copyright (C) 2002-2017 Erik de Castro Lopo +** Copyright (C) 2007 Reuben Thomas +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +/*------------------------------------------------------------------------------ +** Macros to handle big/little endian issues, and other magic numbers. +*/ + +#define ALAW_MARKER MAKE_MARKER ('A', 'L', 'a', 'w') +#define SOUN_MARKER MAKE_MARKER ('S', 'o', 'u', 'n') +#define DFIL_MARKER MAKE_MARKER ('d', 'F', 'i', 'l') +#define ESSN_MARKER MAKE_MARKER ('e', '*', '*', '\0') +#define PSION_VERSION ((unsigned short) 3856) +#define PSION_DATAOFFSET 0x20 + +/*------------------------------------------------------------------------------ +** Private static functions. +*/ + +static int wve_read_header (SF_PRIVATE *psf) ; +static int wve_write_header (SF_PRIVATE *psf, int calc_length) ; +static int wve_close (SF_PRIVATE *psf) ; + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +wve_open (SF_PRIVATE *psf) +{ int error = 0 ; + + if (psf->is_pipe) + return SFE_WVE_NO_PIPE ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = wve_read_header (psf))) + return error ; + } ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_WVE) + return SFE_BAD_OPEN_FORMAT ; + + psf->endian = SF_ENDIAN_BIG ; + + if ((error = wve_write_header (psf, SF_FALSE))) + return error ; + + psf->write_header = wve_write_header ; + } ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + + psf->container_close = wve_close ; + + error = alaw_init (psf) ; + + return error ; +} /* wve_open */ + +/*------------------------------------------------------------------------------ +*/ + +static int +wve_read_header (SF_PRIVATE *psf) +{ int marker ; + unsigned short version, padding, repeats, trash ; + unsigned datalength ; + + /* Set position to start of file to begin reading header. */ + psf_binheader_readf (psf, "pm", 0, &marker) ; + if (marker != ALAW_MARKER) + { psf_log_printf (psf, "Could not find '%M'\n", ALAW_MARKER) ; + return SFE_WVE_NOT_WVE ; + } ; + + psf_binheader_readf (psf, "m", &marker) ; + if (marker != SOUN_MARKER) + { psf_log_printf (psf, "Could not find '%M'\n", SOUN_MARKER) ; + return SFE_WVE_NOT_WVE ; + } ; + + psf_binheader_readf (psf, "m", &marker) ; + if (marker != DFIL_MARKER) + { psf_log_printf (psf, "Could not find '%M'\n", DFIL_MARKER) ; + return SFE_WVE_NOT_WVE ; + } ; + + psf_binheader_readf (psf, "m", &marker) ; + if (marker != ESSN_MARKER) + { psf_log_printf (psf, "Could not find '%M'\n", ESSN_MARKER) ; + return SFE_WVE_NOT_WVE ; + } ; + + psf_binheader_readf (psf, "E2", &version) ; + + psf_log_printf (psf, "Psion Palmtop Alaw (.wve)\n" + " Sample Rate : 8000\n" + " Channels : 1\n" + " Encoding : A-law\n") ; + + if (version != PSION_VERSION) + psf_log_printf (psf, "Psion version %d should be %d\n", version, PSION_VERSION) ; + + psf_binheader_readf (psf, "E4", &datalength) ; + psf->dataoffset = PSION_DATAOFFSET ; + if (datalength != psf->filelength - psf->dataoffset) + { psf->datalength = psf->filelength - psf->dataoffset ; + psf_log_printf (psf, "Data length %d should be %D\n", datalength, psf->datalength) ; + } + else + psf->datalength = datalength ; + + psf_binheader_readf (psf, "E22222", &padding, &repeats, &trash, &trash, &trash) ; + + psf->sf.format = SF_FORMAT_WVE | SF_FORMAT_ALAW ; + psf->sf.samplerate = 8000 ; + psf->sf.frames = psf->datalength ; + psf->sf.channels = 1 ; + + return SFE_NO_ERROR ; +} /* wve_read_header */ + +/*------------------------------------------------------------------------------ +*/ + +static int +wve_write_header (SF_PRIVATE *psf, int calc_length) +{ sf_count_t current ; + unsigned datalen ; + + current = psf_ftell (psf) ; + + if (calc_length) + { psf->filelength = psf_get_filelen (psf) ; + + psf->datalength = psf->filelength - psf->dataoffset ; + if (psf->dataend) + psf->datalength -= psf->filelength - psf->dataend ; + + psf->sf.frames = psf->datalength / (psf->bytewidth * psf->sf.channels) ; + } ; + + /* Reset the current header length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + psf_fseek (psf, 0, SEEK_SET) ; + + /* Write header. */ + datalen = psf->datalength ; + psf_binheader_writef (psf, "Emmmm", BHWm (ALAW_MARKER), BHWm (SOUN_MARKER), BHWm (DFIL_MARKER), BHWm (ESSN_MARKER)) ; + psf_binheader_writef (psf, "E2422222", BHW2 (PSION_VERSION), BHW4 (datalen), BHW2 (0), BHW2 (0), BHW2 (0), BHW2 (0), BHW2 (0)) ; + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + if (psf->sf.channels != 1) + return SFE_CHANNEL_COUNT ; + + if (psf->error) + return psf->error ; + + psf->dataoffset = psf->header.indx ; + + if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + + return psf->error ; +} /* wve_write_header */ + +/*------------------------------------------------------------------------------ +*/ + +static int +wve_close (SF_PRIVATE *psf) +{ + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { /* Now we know for certain the length of the file we can re-write + ** the header. + */ + wve_write_header (psf, SF_TRUE) ; + } ; + + return 0 ; +} /* wve_close */ diff --git a/libsndfile-1.0.31/src/xi.c b/libsndfile-1.0.31/src/xi.c new file mode 100644 index 0000000..c102060 --- /dev/null +++ b/libsndfile-1.0.31/src/xi.c @@ -0,0 +1,1230 @@ +/* +** Copyright (C) 2003-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include +#include + +#include "sndfile.h" +#include "sfendian.h" +#include "common.h" + +#define MAX_XI_SAMPLES 16 + +/*------------------------------------------------------------------------------ +** Private static functions and tyepdefs. +*/ + +typedef struct +{ /* Warning, this filename is NOT nul terminated. */ + char filename [22] ; + char software [20] ; + char sample_name [22] ; + + int loop_begin, loop_end ; + int sample_flags ; + + /* Data for encoder and decoder. */ + short last_16 ; +} XI_PRIVATE ; + +static int xi_close (SF_PRIVATE *psf) ; +static int xi_write_header (SF_PRIVATE *psf, int calc_length) ; +static int xi_read_header (SF_PRIVATE *psf) ; +static int dpcm_init (SF_PRIVATE *psf) ; + + +static sf_count_t dpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ; + +/*------------------------------------------------------------------------------ +** Public function. +*/ + +int +xi_open (SF_PRIVATE *psf) +{ XI_PRIVATE *pxi ; + int subformat, error = 0 ; + + if (psf->is_pipe) + return SFE_XI_NO_PIPE ; + + if (psf->codec_data) + pxi = psf->codec_data ; + else if ((pxi = calloc (1, sizeof (XI_PRIVATE))) == NULL) + return SFE_MALLOC_FAILED ; + + psf->codec_data = pxi ; + + if (psf->file.mode == SFM_READ || (psf->file.mode == SFM_RDWR && psf->filelength > 0)) + { if ((error = xi_read_header (psf))) + return error ; + } ; + + subformat = SF_CODEC (psf->sf.format) ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { if ((SF_CONTAINER (psf->sf.format)) != SF_FORMAT_XI) + return SFE_BAD_OPEN_FORMAT ; + + psf->endian = SF_ENDIAN_LITTLE ; + psf->sf.channels = 1 ; /* Always mono */ + psf->sf.samplerate = 44100 ; /* Always */ + + /* Set up default instrument and software name. */ + memcpy (pxi->filename, "Default Name ", sizeof (pxi->filename)) ; + memcpy (pxi->software, PACKAGE_NAME "-" PACKAGE_VERSION " ", sizeof (pxi->software)) ; + + memset (pxi->sample_name, 0, sizeof (pxi->sample_name)) ; + snprintf (pxi->sample_name, sizeof (pxi->sample_name), "%s", "Sample #1") ; + + pxi->sample_flags = (subformat == SF_FORMAT_DPCM_16) ? 16 : 0 ; + + if (xi_write_header (psf, SF_FALSE)) + return psf->error ; + + psf->write_header = xi_write_header ; + } ; + + psf->container_close = xi_close ; + psf->seek = dpcm_seek ; + + psf->sf.seekable = SF_FALSE ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + + switch (subformat) + { case SF_FORMAT_DPCM_8 : /* 8-bit differential PCM. */ + case SF_FORMAT_DPCM_16 : /* 16-bit differential PCM. */ + error = dpcm_init (psf) ; + break ; + + default : break ; + } ; + + return error ; +} /* xi_open */ + +/*------------------------------------------------------------------------------ +*/ + +static int +xi_close (SF_PRIVATE * UNUSED (psf)) +{ + return 0 ; +} /* xi_close */ + +/*============================================================================== +*/ + +static sf_count_t dpcm_read_dsc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t dpcm_read_dsc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t dpcm_read_dsc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t dpcm_read_dsc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t dpcm_write_s2dsc (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t dpcm_write_i2dsc (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t dpcm_write_f2dsc (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t dpcm_write_d2dsc (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +static sf_count_t dpcm_read_dles2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ; +static sf_count_t dpcm_read_dles2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ; +static sf_count_t dpcm_read_dles2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ; +static sf_count_t dpcm_read_dles2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ; + +static sf_count_t dpcm_write_s2dles (SF_PRIVATE *psf, const short *ptr, sf_count_t len) ; +static sf_count_t dpcm_write_i2dles (SF_PRIVATE *psf, const int *ptr, sf_count_t len) ; +static sf_count_t dpcm_write_f2dles (SF_PRIVATE *psf, const float *ptr, sf_count_t len) ; +static sf_count_t dpcm_write_d2dles (SF_PRIVATE *psf, const double *ptr, sf_count_t len) ; + +static int +dpcm_init (SF_PRIVATE *psf) +{ if (psf->bytewidth == 0 || psf->sf.channels == 0) + return SFE_INTERNAL ; + + psf->blockwidth = psf->bytewidth * psf->sf.channels ; + + if (psf->file.mode == SFM_READ || psf->file.mode == SFM_RDWR) + { switch (psf->bytewidth) + { case 1 : + psf->read_short = dpcm_read_dsc2s ; + psf->read_int = dpcm_read_dsc2i ; + psf->read_float = dpcm_read_dsc2f ; + psf->read_double = dpcm_read_dsc2d ; + break ; + case 2 : + psf->read_short = dpcm_read_dles2s ; + psf->read_int = dpcm_read_dles2i ; + psf->read_float = dpcm_read_dles2f ; + psf->read_double = dpcm_read_dles2d ; + break ; + default : + psf_log_printf (psf, "dpcm_init() returning SFE_UNIMPLEMENTED\n") ; + return SFE_UNIMPLEMENTED ; + } ; + } ; + + if (psf->file.mode == SFM_WRITE || psf->file.mode == SFM_RDWR) + { switch (psf->bytewidth) + { case 1 : + psf->write_short = dpcm_write_s2dsc ; + psf->write_int = dpcm_write_i2dsc ; + psf->write_float = dpcm_write_f2dsc ; + psf->write_double = dpcm_write_d2dsc ; + break ; + case 2 : + psf->write_short = dpcm_write_s2dles ; + psf->write_int = dpcm_write_i2dles ; + psf->write_float = dpcm_write_f2dles ; + psf->write_double = dpcm_write_d2dles ; + break ; + default : + psf_log_printf (psf, "dpcm_init() returning SFE_UNIMPLEMENTED\n") ; + return SFE_UNIMPLEMENTED ; + } ; + } ; + + psf->filelength = psf_get_filelen (psf) ; + psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : + psf->filelength - psf->dataoffset ; + psf->sf.frames = psf->datalength / psf->blockwidth ; + + return 0 ; +} /* dpcm_init */ + +/*============================================================================== +*/ + +static sf_count_t +dpcm_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) +{ BUF_UNION ubuf ; + XI_PRIVATE *pxi ; + int total, bufferlen, len ; + + if ((pxi = psf->codec_data) == NULL) + return SFE_INTERNAL ; + + if (psf->datalength < 0 || psf->dataoffset < 0) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + if (offset == 0) + { psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + pxi->last_16 = 0 ; + return 0 ; + } ; + + if (offset < 0 || offset > psf->sf.frames) + { psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + if (mode != SFM_READ) + { /* What to do about write??? */ + psf->error = SFE_BAD_SEEK ; + return PSF_SEEK_ERROR ; + } ; + + psf_fseek (psf, psf->dataoffset, SEEK_SET) ; + + if ((SF_CODEC (psf->sf.format)) == SF_FORMAT_DPCM_16) + { total = offset ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (total > 0) + { len = (total > bufferlen) ? bufferlen : total ; + total -= dpcm_read_dles2s (psf, ubuf.sbuf, len) ; + } ; + } + else + { total = offset ; + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + while (total > 0) + { len = (total > bufferlen) ? bufferlen : total ; + total -= dpcm_read_dsc2s (psf, ubuf.sbuf, len) ; + } ; + } ; + + return offset ; +} /* dpcm_seek */ + + +static int +xi_write_header (SF_PRIVATE *psf, int UNUSED (calc_length)) +{ XI_PRIVATE *pxi ; + sf_count_t current ; + const char *string ; + + if ((pxi = psf->codec_data) == NULL) + return SFE_INTERNAL ; + + current = psf_ftell (psf) ; + + /* Reset the current header length to zero. */ + psf->header.ptr [0] = 0 ; + psf->header.indx = 0 ; + psf_fseek (psf, 0, SEEK_SET) ; + + string = "Extended Instrument: " ; + psf_binheader_writef (psf, "b", BHWv (string), BHWz (strlen (string))) ; + psf_binheader_writef (psf, "b1", BHWv (pxi->filename), BHWz (sizeof (pxi->filename)), BHW1 (0x1A)) ; + + /* Write software version and two byte XI version. */ + psf_binheader_writef (psf, "eb2", BHWv (pxi->software), BHWz (sizeof (pxi->software)), BHW2 ((1 << 8) + 2)) ; + + /* + ** Jump note numbers (96), volume envelope (48), pan envelope (48), + ** volume points (1), pan points (1) + */ + psf_binheader_writef (psf, "z", BHWz ((size_t) (96 + 48 + 48 + 1 + 1))) ; + + /* Jump volume loop (3 bytes), pan loop (3), envelope flags (3), vibrato (3) + ** fade out (2), 22 unknown bytes, and then write sample_count (2 bytes). + */ + psf_binheader_writef (psf, "ez2z2", BHWz ((size_t) (4 * 3)), BHW2 (0x1234), BHWz (22), BHW2 (1)) ; + + pxi->loop_begin = 0 ; + pxi->loop_end = 0 ; + + psf_binheader_writef (psf, "et844", BHW8 (psf->sf.frames), BHW4 (pxi->loop_begin), BHW4 (pxi->loop_end)) ; + + /* volume, fine tune, flags, pan, note, namelen */ + psf_binheader_writef (psf, "111111", BHW1 (128), BHW1 (0), BHW1 (pxi->sample_flags), BHW1 (128), BHW1 (0), BHW1 (strlen (pxi->sample_name))) ; + + psf_binheader_writef (psf, "b", BHWv (pxi->sample_name), BHWz (sizeof (pxi->sample_name))) ; + + + + + + /* Header construction complete so write it out. */ + psf_fwrite (psf->header.ptr, psf->header.indx, 1, psf) ; + + if (psf->error) + return psf->error ; + + psf->dataoffset = psf->header.indx ; + + if (current > 0) + psf_fseek (psf, current, SEEK_SET) ; + + return psf->error ; +} /* xi_write_header */ + +static int +xi_read_header (SF_PRIVATE *psf) +{ char buffer [64], name [32] ; + short version, fade_out, sample_count ; + int k, loop_begin, loop_end ; + int sample_sizes [MAX_XI_SAMPLES] ; + + psf_binheader_readf (psf, "pb", 0, buffer, 21) ; + + memset (sample_sizes, 0, sizeof (sample_sizes)) ; + + buffer [20] = 0 ; + if (strcmp (buffer, "Extended Instrument:") != 0) + return SFE_XI_BAD_HEADER ; + + memset (buffer, 0, sizeof (buffer)) ; + psf_binheader_readf (psf, "b", buffer, 23) ; + + if (buffer [22] != 0x1A) + return SFE_XI_BAD_HEADER ; + + buffer [22] = 0 ; + for (k = 21 ; k >= 0 && buffer [k] == ' ' ; k --) + buffer [k] = 0 ; + + psf_log_printf (psf, "Extended Instrument : %s\n", buffer) ; + psf_store_string (psf, SF_STR_TITLE, buffer) ; + + psf_binheader_readf (psf, "be2", buffer, 20, &version) ; + buffer [19] = 0 ; + for (k = 18 ; k >= 0 && buffer [k] == ' ' ; k --) + buffer [k] = 0 ; + + psf_log_printf (psf, "Software : %s\nVersion : %d.%02d\n", buffer, version / 256, version % 256) ; + psf_store_string (psf, SF_STR_SOFTWARE, buffer) ; + + /* Jump note numbers (96), volume envelope (48), pan envelope (48), + ** volume points (1), pan points (1) + */ + psf_binheader_readf (psf, "j", 96 + 48 + 48 + 1 + 1) ; + + psf_binheader_readf (psf, "b", buffer, 12) ; + psf_log_printf (psf, "Volume Loop\n sustain : %u\n begin : %u\n end : %u\n", + buffer [0], buffer [1], buffer [2]) ; + psf_log_printf (psf, "Pan Loop\n sustain : %u\n begin : %u\n end : %u\n", + buffer [3], buffer [4], buffer [5]) ; + psf_log_printf (psf, "Envelope Flags\n volume : 0x%X\n pan : 0x%X\n", + buffer [6] & 0xFF, buffer [7] & 0xFF) ; + + psf_log_printf (psf, "Vibrato\n type : %u\n sweep : %u\n depth : %u\n rate : %u\n", + buffer [8], buffer [9], buffer [10], buffer [11]) ; + + /* + ** Read fade_out then jump reserved (2 bytes) and ???? (20 bytes) and + ** sample_count. + */ + psf_binheader_readf (psf, "e2j2", &fade_out, 2 + 20, &sample_count) ; + psf_log_printf (psf, "Fade out : %d\n", fade_out) ; + + /* XI file can contain up to 16 samples. */ + if (sample_count > MAX_XI_SAMPLES) + return SFE_XI_EXCESS_SAMPLES ; + + if (psf->instrument == NULL && (psf->instrument = psf_instrument_alloc ()) == NULL) + return SFE_MALLOC_FAILED ; + + psf->instrument->basenote = 0 ; + /* Log all data for each sample. */ + for (k = 0 ; k < sample_count ; k++) + { psf_binheader_readf (psf, "e444", &(sample_sizes [k]), &loop_begin, &loop_end) ; + + /* Read 5 know bytes, 1 unknown byte and 22 name bytes. */ + psf_binheader_readf (psf, "bb", buffer, 6, name, 22) ; + name [21] = 0 ; + + psf_log_printf (psf, "Sample #%d\n name : %s\n", k + 1, name) ; + + psf_log_printf (psf, " size : %d\n", sample_sizes [k]) ; + + + + psf_log_printf (psf, " loop\n begin : %d\n end : %d\n", loop_begin, loop_end) ; + + psf_log_printf (psf, " volume : %u\n f. tune : %d\n flags : 0x%02X ", + buffer [0] & 0xFF, buffer [1] & 0xFF, buffer [2] & 0xFF) ; + + psf_log_printf (psf, " (") ; + if (buffer [2] & 1) + psf_log_printf (psf, " Loop") ; + if (buffer [2] & 2) + psf_log_printf (psf, " PingPong") ; + psf_log_printf (psf, (buffer [2] & 16) ? " 16bit" : " 8bit") ; + psf_log_printf (psf, " )\n") ; + + psf_log_printf (psf, " pan : %u\n note : %d\n namelen : %d\n", + buffer [3] & 0xFF, buffer [4], buffer [5]) ; + + psf->instrument->basenote = buffer [4] ; + if (buffer [2] & 1) + { psf->instrument->loop_count = 1 ; + psf->instrument->loops [0].mode = (buffer [2] & 2) ? SF_LOOP_ALTERNATING : SF_LOOP_FORWARD ; + psf->instrument->loops [0].start = loop_begin ; + psf->instrument->loops [0].end = loop_end ; + } ; + + if (k != 0) + continue ; + + if (buffer [2] & 16) + { psf->sf.format = SF_FORMAT_XI | SF_FORMAT_DPCM_16 ; + psf->bytewidth = 2 ; + } + else + { psf->sf.format = SF_FORMAT_XI | SF_FORMAT_DPCM_8 ; + psf->bytewidth = 1 ; + } ; + } ; + + while (sample_count > 1 && sample_sizes [sample_count - 1] == 0) + sample_count -- ; + + /* Currently, we can only handle 1 sample per file. */ + + if (sample_count > 2) + { psf_log_printf (psf, "*** Sample count is less than 16 but more than 1.\n") ; + psf_log_printf (psf, " sample count : %d sample_sizes [%d] : %d\n", + sample_count, sample_count - 1, sample_sizes [sample_count - 1]) ; + return SFE_XI_EXCESS_SAMPLES ; + } ; + + psf->datalength = sample_sizes [0] ; + + psf->dataoffset = psf_ftell (psf) ; + if (psf->dataoffset < 0) + { psf_log_printf (psf, "*** Bad Data Offset : %D\n", psf->dataoffset) ; + return SFE_BAD_OFFSET ; + } ; + psf_log_printf (psf, "Data Offset : %D\n", psf->dataoffset) ; + + if (psf->dataoffset + psf->datalength > psf->filelength) + { psf_log_printf (psf, "*** File seems to be truncated. Should be at least %D bytes long.\n", + psf->dataoffset + sample_sizes [0]) ; + psf->datalength = psf->filelength - psf->dataoffset ; + } ; + + if (psf_fseek (psf, psf->dataoffset, SEEK_SET) != psf->dataoffset) + return SFE_BAD_SEEK ; + + psf->endian = SF_ENDIAN_LITTLE ; + psf->sf.channels = 1 ; /* Always mono */ + psf->sf.samplerate = 44100 ; /* Always */ + + psf->blockwidth = psf->sf.channels * psf->bytewidth ; + + if (! psf->sf.frames && psf->blockwidth) + psf->sf.frames = (psf->filelength - psf->dataoffset) / psf->blockwidth ; + + psf->instrument->gain = 1 ; + psf->instrument->velocity_lo = psf->instrument->key_lo = 0 ; + psf->instrument->velocity_hi = psf->instrument->key_hi = 127 ; + + return 0 ; +} /* xi_read_header */ + +/*============================================================================== +*/ + +static void dsc2s_array (XI_PRIVATE *pxi, signed char *src, int count, short *dest) ; +static void dsc2i_array (XI_PRIVATE *pxi, signed char *src, int count, int *dest) ; +static void dsc2f_array (XI_PRIVATE *pxi, signed char *src, int count, float *dest, float normfact) ; +static void dsc2d_array (XI_PRIVATE *pxi, signed char *src, int count, double *dest, double normfact) ; + +static void dles2s_array (XI_PRIVATE *pxi, short *src, int count, short *dest) ; +static void dles2i_array (XI_PRIVATE *pxi, short *src, int count, int *dest) ; +static void dles2f_array (XI_PRIVATE *pxi, short *src, int count, float *dest, float normfact) ; +static void dles2d_array (XI_PRIVATE *pxi, short *src, int count, double *dest, double normfact) ; + +static sf_count_t +dpcm_read_dsc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + XI_PRIVATE *pxi ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + if ((pxi = psf->codec_data) == NULL) + return 0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; + dsc2s_array (pxi, ubuf.scbuf, readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* dpcm_read_dsc2s */ + +static sf_count_t +dpcm_read_dsc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + XI_PRIVATE *pxi ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + if ((pxi = psf->codec_data) == NULL) + return 0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; + dsc2i_array (pxi, ubuf.scbuf, readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* dpcm_read_dsc2i */ + +static sf_count_t +dpcm_read_dsc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + XI_PRIVATE *pxi ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + float normfact ; + + if ((pxi = psf->codec_data) == NULL) + return 0 ; + + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; + dsc2f_array (pxi, ubuf.scbuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* dpcm_read_dsc2f */ + +static sf_count_t +dpcm_read_dsc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + XI_PRIVATE *pxi ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + double normfact ; + + if ((pxi = psf->codec_data) == NULL) + return 0 ; + + normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; + dsc2d_array (pxi, ubuf.scbuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* dpcm_read_dsc2d */ + +/*------------------------------------------------------------------------------ +*/ + +static sf_count_t +dpcm_read_dles2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + XI_PRIVATE *pxi ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + if ((pxi = psf->codec_data) == NULL) + return 0 ; + + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + dles2s_array (pxi, ubuf.sbuf, readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* dpcm_read_dles2s */ + +static sf_count_t +dpcm_read_dles2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + XI_PRIVATE *pxi ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + + if ((pxi = psf->codec_data) == NULL) + return 0 ; + + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + dles2i_array (pxi, ubuf.sbuf, readcount, ptr + total) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* dpcm_read_dles2i */ + +static sf_count_t +dpcm_read_dles2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + XI_PRIVATE *pxi ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + float normfact ; + + if ((pxi = psf->codec_data) == NULL) + return 0 ; + + normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + dles2f_array (pxi, ubuf.sbuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* dpcm_read_dles2f */ + +static sf_count_t +dpcm_read_dles2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + XI_PRIVATE *pxi ; + int bufferlen, readcount ; + sf_count_t total = 0 ; + double normfact ; + + if ((pxi = psf->codec_data) == NULL) + return 0 ; + + normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + readcount = psf_fread (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + dles2d_array (pxi, ubuf.sbuf, readcount, ptr + total, normfact) ; + total += readcount ; + if (readcount < bufferlen) + break ; + len -= readcount ; + } ; + + return total ; +} /* dpcm_read_dles2d */ + +/*============================================================================== +*/ + +static void s2dsc_array (XI_PRIVATE *pxi, const short *src, signed char *dest, int count) ; +static void i2dsc_array (XI_PRIVATE *pxi, const int *src, signed char *dest, int count) ; +static void f2dsc_array (XI_PRIVATE *pxi, const float *src, signed char *dest, int count, float normfact) ; +static void d2dsc_array (XI_PRIVATE *pxi, const double *src, signed char *dest, int count, double normfact) ; + +static void s2dles_array (XI_PRIVATE *pxi, const short *src, short *dest, int count) ; +static void i2dles_array (XI_PRIVATE *pxi, const int *src, short *dest, int count) ; +static void f2dles_array (XI_PRIVATE *pxi, const float *src, short *dest, int count, float normfact) ; +static void d2dles_array (XI_PRIVATE *pxi, const double *src, short *dest, int count, double normfact) ; + + +static sf_count_t +dpcm_write_s2dsc (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + XI_PRIVATE *pxi ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + if ((pxi = psf->codec_data) == NULL) + return 0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + s2dsc_array (pxi, ptr + total, ubuf.scbuf, bufferlen) ; + writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* dpcm_write_s2dsc */ + +static sf_count_t +dpcm_write_i2dsc (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + XI_PRIVATE *pxi ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + if ((pxi = psf->codec_data) == NULL) + return 0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + i2dsc_array (pxi, ptr + total, ubuf.scbuf, bufferlen) ; + writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* dpcm_write_i2dsc */ + +static sf_count_t +dpcm_write_f2dsc (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + XI_PRIVATE *pxi ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + float normfact ; + + if ((pxi = psf->codec_data) == NULL) + return 0 ; + + normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7F) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + f2dsc_array (pxi, ptr + total, ubuf.scbuf, bufferlen, normfact) ; + writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* dpcm_write_f2dsc */ + +static sf_count_t +dpcm_write_d2dsc (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + XI_PRIVATE *pxi ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + double normfact ; + + if ((pxi = psf->codec_data) == NULL) + return 0 ; + + normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7F) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.ucbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + d2dsc_array (pxi, ptr + total, ubuf.scbuf, bufferlen, normfact) ; + writecount = psf_fwrite (ubuf.scbuf, sizeof (signed char), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* dpcm_write_d2dsc */ + + +static sf_count_t +dpcm_write_s2dles (SF_PRIVATE *psf, const short *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + XI_PRIVATE *pxi ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + if ((pxi = psf->codec_data) == NULL) + return 0 ; + + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + s2dles_array (pxi, ptr + total, ubuf.sbuf, bufferlen) ; + writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* dpcm_write_s2dles */ + +static sf_count_t +dpcm_write_i2dles (SF_PRIVATE *psf, const int *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + XI_PRIVATE *pxi ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + + if ((pxi = psf->codec_data) == NULL) + return 0 ; + + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + i2dles_array (pxi, ptr + total, ubuf.sbuf, bufferlen) ; + writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* dpcm_write_i2dles */ + +static sf_count_t +dpcm_write_f2dles (SF_PRIVATE *psf, const float *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + XI_PRIVATE *pxi ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + float normfact ; + + if ((pxi = psf->codec_data) == NULL) + return 0 ; + + normfact = (psf->norm_float == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + f2dles_array (pxi, ptr + total, ubuf.sbuf, bufferlen, normfact) ; + writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* dpcm_write_f2dles */ + +static sf_count_t +dpcm_write_d2dles (SF_PRIVATE *psf, const double *ptr, sf_count_t len) +{ BUF_UNION ubuf ; + XI_PRIVATE *pxi ; + int bufferlen, writecount ; + sf_count_t total = 0 ; + double normfact ; + + if ((pxi = psf->codec_data) == NULL) + return 0 ; + + normfact = (psf->norm_double == SF_TRUE) ? (1.0 * 0x7FFF) : 1.0 ; + + bufferlen = ARRAY_LEN (ubuf.sbuf) ; + + while (len > 0) + { if (len < bufferlen) + bufferlen = (int) len ; + d2dles_array (pxi, ptr + total, ubuf.sbuf, bufferlen, normfact) ; + writecount = psf_fwrite (ubuf.sbuf, sizeof (short), bufferlen, psf) ; + total += writecount ; + if (writecount < bufferlen) + break ; + len -= writecount ; + } ; + + return total ; +} /* dpcm_write_d2dles */ + + +/*============================================================================== +*/ + +static void +dsc2s_array (XI_PRIVATE *pxi, signed char *src, int count, short *dest) +{ signed char last_val ; + int k ; + + last_val = pxi->last_16 >> 8 ; + + for (k = 0 ; k < count ; k++) + { last_val += src [k] ; + dest [k] = arith_shift_left (last_val, 8) ; + } ; + + pxi->last_16 = arith_shift_left (last_val, 8) ; +} /* dsc2s_array */ + +static void +dsc2i_array (XI_PRIVATE *pxi, signed char *src, int count, int *dest) +{ signed char last_val ; + int k ; + + last_val = pxi->last_16 >> 8 ; + + for (k = 0 ; k < count ; k++) + { last_val += src [k] ; + dest [k] = arith_shift_left (last_val, 24) ; + } ; + + pxi->last_16 = arith_shift_left (last_val, 8) ; +} /* dsc2i_array */ + +static void +dsc2f_array (XI_PRIVATE *pxi, signed char *src, int count, float *dest, float normfact) +{ signed char last_val ; + int k ; + + last_val = pxi->last_16 >> 8 ; + + for (k = 0 ; k < count ; k++) + { last_val += src [k] ; + dest [k] = last_val * normfact ; + } ; + + pxi->last_16 = arith_shift_left (last_val, 8) ; +} /* dsc2f_array */ + +static void +dsc2d_array (XI_PRIVATE *pxi, signed char *src, int count, double *dest, double normfact) +{ signed char last_val ; + int k ; + + last_val = pxi->last_16 >> 8 ; + + for (k = 0 ; k < count ; k++) + { last_val += src [k] ; + dest [k] = last_val * normfact ; + } ; + + pxi->last_16 = arith_shift_left (last_val, 8) ; +} /* dsc2d_array */ + +/*------------------------------------------------------------------------------ +*/ + +static void +s2dsc_array (XI_PRIVATE *pxi, const short *src, signed char *dest, int count) +{ signed char last_val, current ; + int k ; + + last_val = pxi->last_16 >> 8 ; + + for (k = 0 ; k < count ; k++) + { current = src [k] >> 8 ; + dest [k] = current - last_val ; + last_val = current ; + } ; + + pxi->last_16 = arith_shift_left (last_val, 8) ; +} /* s2dsc_array */ + +static void +i2dsc_array (XI_PRIVATE *pxi, const int *src, signed char *dest, int count) +{ signed char last_val, current ; + int k ; + + last_val = pxi->last_16 >> 8 ; + + for (k = 0 ; k < count ; k++) + { current = src [k] >> 24 ; + dest [k] = current - last_val ; + last_val = current ; + } ; + + pxi->last_16 = arith_shift_left (last_val, 8) ; +} /* i2dsc_array */ + +static void +f2dsc_array (XI_PRIVATE *pxi, const float *src, signed char *dest, int count, float normfact) +{ signed char last_val, current ; + int k ; + + last_val = pxi->last_16 >> 8 ; + + for (k = 0 ; k < count ; k++) + { current = psf_lrintf (src [k] * normfact) ; + dest [k] = current - last_val ; + last_val = current ; + } ; + + pxi->last_16 = arith_shift_left (last_val, 8) ; +} /* f2dsc_array */ + +static void +d2dsc_array (XI_PRIVATE *pxi, const double *src, signed char *dest, int count, double normfact) +{ signed char last_val, current ; + int k ; + + last_val = pxi->last_16 >> 8 ; + + for (k = 0 ; k < count ; k++) + { current = psf_lrint (src [k] * normfact) ; + dest [k] = current - last_val ; + last_val = current ; + } ; + + pxi->last_16 = arith_shift_left (last_val, 8) ; +} /* d2dsc_array */ + +/*============================================================================== +*/ + +static void +dles2s_array (XI_PRIVATE *pxi, short *src, int count, short *dest) +{ short last_val ; + int k ; + + last_val = pxi->last_16 ; + + for (k = 0 ; k < count ; k++) + { last_val += LE2H_16 (src [k]) ; + dest [k] = last_val ; + } ; + + pxi->last_16 = last_val ; +} /* dles2s_array */ + +static void +dles2i_array (XI_PRIVATE *pxi, short *src, int count, int *dest) +{ short last_val ; + int k ; + + last_val = pxi->last_16 ; + + for (k = 0 ; k < count ; k++) + { last_val += LE2H_16 (src [k]) ; + dest [k] = arith_shift_left (last_val, 16) ; + } ; + + pxi->last_16 = last_val ; +} /* dles2i_array */ + +static void +dles2f_array (XI_PRIVATE *pxi, short *src, int count, float *dest, float normfact) +{ short last_val ; + int k ; + + last_val = pxi->last_16 ; + + for (k = 0 ; k < count ; k++) + { last_val += LE2H_16 (src [k]) ; + dest [k] = last_val * normfact ; + } ; + + pxi->last_16 = last_val ; +} /* dles2f_array */ + +static void +dles2d_array (XI_PRIVATE *pxi, short *src, int count, double *dest, double normfact) +{ short last_val ; + int k ; + + last_val = pxi->last_16 ; + + for (k = 0 ; k < count ; k++) + { last_val += LE2H_16 (src [k]) ; + dest [k] = last_val * normfact ; + } ; + + pxi->last_16 = last_val ; +} /* dles2d_array */ + +/*------------------------------------------------------------------------------ +*/ + +static void +s2dles_array (XI_PRIVATE *pxi, const short *src, short *dest, int count) +{ short diff, last_val ; + int k ; + + last_val = pxi->last_16 ; + + for (k = 0 ; k < count ; k++) + { diff = src [k] - last_val ; + dest [k] = LE2H_16 (diff) ; + last_val = src [k] ; + } ; + + pxi->last_16 = last_val ; +} /* s2dles_array */ + +static void +i2dles_array (XI_PRIVATE *pxi, const int *src, short *dest, int count) +{ short diff, last_val ; + int k ; + + last_val = pxi->last_16 ; + + for (k = 0 ; k < count ; k++) + { diff = (src [k] >> 16) - last_val ; + dest [k] = LE2H_16 (diff) ; + last_val = src [k] >> 16 ; + } ; + + pxi->last_16 = last_val ; +} /* i2dles_array */ + +static void +f2dles_array (XI_PRIVATE *pxi, const float *src, short *dest, int count, float normfact) +{ short diff, last_val, current ; + int k ; + + last_val = pxi->last_16 ; + + for (k = 0 ; k < count ; k++) + { current = psf_lrintf (src [k] * normfact) ; + diff = current - last_val ; + dest [k] = LE2H_16 (diff) ; + last_val = current ; + } ; + + pxi->last_16 = last_val ; +} /* f2dles_array */ + +static void +d2dles_array (XI_PRIVATE *pxi, const double *src, short *dest, int count, double normfact) +{ short diff, last_val, current ; + int k ; + + last_val = pxi->last_16 ; + + for (k = 0 ; k < count ; k++) + { current = psf_lrint (src [k] * normfact) ; + diff = current - last_val ; + dest [k] = LE2H_16 (diff) ; + last_val = current ; + } ; + + pxi->last_16 = last_val ; +} /* d2dles_array */ + diff --git a/libsndfile-1.0.31/tests/aiff_rw_test.c b/libsndfile-1.0.31/tests/aiff_rw_test.c new file mode 100644 index 0000000..54eec4b --- /dev/null +++ b/libsndfile-1.0.31/tests/aiff_rw_test.c @@ -0,0 +1,169 @@ +/* +** Copyright (C) 2003-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif +#include +#include + + +#include + +#include "utils.h" + + +static unsigned char aifc_data [] = +{ 'F' , 'O' , 'R' , 'M' , + 0x00, 0x00, 0x01, 0xE8, /* FORM length */ + + 'A' , 'I' , 'F' , 'C' , + 0x43, 0x4F, 0x4D, 0x4D, /* COMM */ + 0x00, 0x00, 0x00, 0x26, /* COMM length */ + 0x00, 0x01, 0x00, 0x00, 0x00, 0xAE, 0x00, 0x10, 0x40, 0x0D, 0xAC, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x4F, 0x4E, 0x45, 0x0D, 'N' , + 'o' , 't' , ' ' , 'c' , 'o' , 'm' , 'p' , 'r' , 'e' , 's' , 's' , 'e' , + 'd' , 0x00, + + 'F' , 'V' , 'E' , 'R' , 0x00, 0x00, 0x00, 0x04, 0xA2, 0x80, 0x51, 0x40, + + /* A 'MARK' chunk. */ + 'M' , 'A' , 'R' , 'K' , 0x00, 0x00, 0x00, 0x36, 0x00, 0x05, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 'A' , + 0x00, 0x02, 0x00, 0x00, 0x11, 0x3A, 0x02, 'B' , 'C' , 0x00, + 0x00, 0x03, 0x00, 0x00, 0x22, 0x74, 0x03, 'D' , 'E' , 'F', + 0x00, 0x04, 0x00, 0x00, 0x33, 0xAE, 0x04, 'G' , 'H' , 'I', 'J' , 0x00, + 0x00, 0x05, 0x00, 0x00, 0x44, 0xE8, 0x05, 'K' , 'L' , 'M', 'N' , 'O' , + + 'S' , 'S' , 'N' , 'D' , + 0x00, 0x00, 0x01, 0x64, /* SSND length */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xE0, 0xFF, 0xDB, 0xFF, 0xD0, 0xFF, 0xD5, 0xFF, 0xD6, 0xFF, 0xD0, + 0xFF, 0xBF, 0xFF, 0xBE, 0xFF, 0xB9, 0xFF, 0xC8, 0xFF, 0xBF, 0xFF, 0xD5, + 0xFF, 0xC3, 0xFF, 0xBF, 0xFF, 0xB3, 0xFF, 0xBE, 0xFF, 0xB4, 0xFF, 0xAD, + 0xFF, 0xAC, 0xFF, 0xAF, 0xFF, 0xB9, 0xFF, 0xB3, 0xFF, 0xA4, 0xFF, 0xA5, + 0xFF, 0x93, 0xFF, 0x95, 0xFF, 0x97, 0xFF, 0x98, 0xFF, 0x99, 0xFF, 0x9E, + 0xFF, 0x90, 0xFF, 0x80, 0xFF, 0x81, 0xFF, 0x7C, 0xFF, 0x80, 0xFF, 0x7C, + 0xFF, 0x72, 0xFF, 0x72, 0xFF, 0x6C, 0xFF, 0x75, 0xFF, 0x6E, 0xFF, 0x6F, + 0xFF, 0x66, 0xFF, 0x62, 0xFF, 0x5C, 0xFF, 0x64, 0xFF, 0x50, 0xFF, 0x56, + 0xFF, 0x56, 0xFF, 0x4A, 0xFF, 0x4A, 0xFF, 0x49, 0xFF, 0x44, 0xFF, 0x49, + 0xFF, 0x3B, 0xFF, 0x3F, 0xFF, 0x48, 0xFF, 0x46, 0xFF, 0x42, 0xFF, 0x49, + 0xFF, 0x43, 0xFF, 0x36, 0xFF, 0x40, 0xFF, 0x35, 0xFF, 0x3F, 0xFF, 0x36, + 0xFF, 0x37, 0xFF, 0x2E, 0xFF, 0x23, 0xFF, 0x23, 0xFF, 0x21, 0xFF, 0x1F, + 0xFF, 0x25, 0xFF, 0x2C, 0xFF, 0x1E, 0xFF, 0x22, 0xFF, 0x24, 0xFF, 0x2B, + 0xFF, 0x35, 0xFF, 0x27, 0xFF, 0x2E, 0xFF, 0x21, 0xFF, 0x18, 0xFF, 0x21, + 0xFF, 0x20, 0xFF, 0x0F, 0xFF, 0x21, 0xFF, 0x1A, 0xFF, 0x10, 0xFF, 0x09, + 0xFF, 0x1E, 0xFF, 0x19, 0xFF, 0x21, 0xFF, 0x13, 0xFF, 0x1B, 0xFF, 0x18, + 0xFF, 0x21, 0xFF, 0x0F, 0xFF, 0x1A, 0xFF, 0x16, 0xFF, 0x21, 0xFF, 0x1B, + 0xFF, 0x1B, 0xFF, 0x23, 0xFF, 0x1A, 0xFF, 0x21, 0xFF, 0x26, 0xFF, 0x23, + 0xFF, 0x26, 0xFF, 0x27, 0xFF, 0x30, 0xFF, 0x27, 0xFF, 0x2F, 0xFF, 0x28, + 0xFF, 0x2C, 0xFF, 0x27, 0xFF, 0x33, 0xFF, 0x29, 0xFF, 0x33, 0xFF, 0x3A, + 0xFF, 0x42, 0xFF, 0x3B, 0xFF, 0x4D, 0xFF, 0x4B, 0xFF, 0x4D, 0xFF, 0x4A, + 0xFF, 0x67, 0xFF, 0x77, 0xFF, 0x73, 0xFF, 0x7B, 0xFF, 0xDE, 0xFF, 0xAD, + 0x00, 0x4A, 0x00, 0x63, 0xEC, 0x8C, 0x03, 0xBB, 0x0E, 0xE4, 0x08, 0xF2, + 0x00, 0x70, 0xE3, 0xD1, 0xE5, 0xE4, 0x01, 0x6E, 0x0A, 0x67, 0x1C, 0x74, + 0xF8, 0x8E, 0x10, 0x7B, 0xEA, 0x3C, 0x09, 0x87, 0x1B, 0x24, 0xEF, 0x05, + 0x17, 0x76, 0x0D, 0x5B, 0x02, 0x43, 0xF5, 0xEF, 0x0C, 0x1D, 0xF7, 0x61, + 0x05, 0x95, 0x0B, 0xC2, 0xF1, 0x69, 0x1A, 0xA1, 0xEC, 0x75, 0xF4, 0x11, + 0x13, 0x4F, 0x13, 0x71, 0xFA, 0x33, 0xEC, 0x32, 0xC8, 0xCF, 0x05, 0xB0, + 0x0B, 0x61, 0x33, 0x19, 0xCE, 0x37, 0xEF, 0xD4, 0x21, 0x9D, 0xFA, 0xAE, +} ; + +static void rw_test (const char *filename) ; + +int +main (void) +{ const char *filename = "rw.aifc" ; + + print_test_name ("aiff_rw_test", filename) ; + + dump_data_to_file (filename, aifc_data, sizeof (aifc_data)) ; + + rw_test (filename) ; + + unlink (filename) ; + + puts ("ok") ; + return 0 ; +} /* main */ + +/*============================================================================== +*/ + +static void +rw_test (const char *filename) +{ SNDFILE *file ; + SF_INFO sfinfo_rd, sfinfo_rw ; + + memset (&sfinfo_rd, 0, sizeof (sfinfo_rd)) ; + memset (&sfinfo_rw, 0, sizeof (sfinfo_rw)) ; + + /* Open the file in read only mode and fill in the SF_INFO struct. */ + if ((file = sf_open (filename, SFM_READ, &sfinfo_rd)) == NULL) + { printf ("\n\nLine %d : sf_open SFM_READ failed : %s\n\n", __LINE__, sf_strerror (NULL)) ; + exit (1) ; + } ; + check_log_buffer_or_die (file, __LINE__) ; + sf_close (file) ; + + /* Now open read/write and close the file. */ + if ((file = sf_open (filename, SFM_RDWR, &sfinfo_rw)) == NULL) + { printf ("\n\nLine %d : sf_open SFM_RDWR failed : %s\n\n", __LINE__, sf_strerror (NULL)) ; + exit (1) ; + } ; + check_log_buffer_or_die (file, __LINE__) ; + sf_close (file) ; + + /* Open again as read only again and fill in a new SF_INFO struct. */ + memset (&sfinfo_rw, 0, sizeof (sfinfo_rw)) ; + if ((file = sf_open (filename, SFM_READ, &sfinfo_rw)) == NULL) + { printf ("\n\nLine %d : sf_open SFM_RDWR failed : %s\n\n", __LINE__, sf_strerror (NULL)) ; + exit (1) ; + } ; + check_log_buffer_or_die (file, __LINE__) ; + sf_close (file) ; + + /* Now compare the two. */ + if (sfinfo_rd.format != sfinfo_rw.format) + { printf ("\n\nLine %d : format mismatch (0x%08X != 0x%08X).\n\n", __LINE__, + sfinfo_rd.format, sfinfo_rw.format) ; + exit (1) ; + } ; + + if (sfinfo_rd.channels != sfinfo_rw.channels) + { printf ("\n\nLine %d : channel count mismatch (%d != %d).\n\n", __LINE__, + sfinfo_rd.channels, sfinfo_rw.channels) ; + exit (1) ; + } ; + + if (sfinfo_rd.frames != sfinfo_rw.frames) + { printf ("\n\nLine %d : frame count mismatch (rd %" PRId64 " != rw %" PRId64 ").\n\n", __LINE__, + sfinfo_rd.frames, sfinfo_rw.frames) ; + exit (1) ; + } ; + + return ; +} /* rw_test */ + diff --git a/libsndfile-1.0.31/tests/alaw_test.c b/libsndfile-1.0.31/tests/alaw_test.c new file mode 100644 index 0000000..b928083 --- /dev/null +++ b/libsndfile-1.0.31/tests/alaw_test.c @@ -0,0 +1,238 @@ +/* +** Copyright (C) 1999-2012 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "utils.h" + +#define BUFFER_SIZE (65536) + +static unsigned char alaw_encode (int sample) ; +static int alaw_decode (unsigned int alawbyte) ; + +static short short_buffer [BUFFER_SIZE] ; +static unsigned char alaw_buffer [BUFFER_SIZE] ; + +int +main (void) +{ SNDFILE *file ; + SF_INFO sfinfo ; + const char *filename ; + int k ; + + print_test_name ("alaw_test", "encoder") ; + + filename = "test.raw" ; + + sf_info_setup (&sfinfo, SF_FORMAT_RAW | SF_FORMAT_ALAW, 44100, 1) ; + + if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) + { printf ("sf_open_write failed with error : ") ; + fflush (stdout) ; + puts (sf_strerror (NULL)) ; + exit (1) ; + } ; + + /* Generate a file containing all possible 16 bit sample values + ** and write it to disk as alaw encoded.frames. + */ + + for (k = 0 ; k < 0x10000 ; k++) + short_buffer [k] = k & 0xFFFF ; + + sf_write_short (file, short_buffer, BUFFER_SIZE) ; + sf_close (file) ; + + /* Now open that file and compare the alaw encoded sample values + ** with what they should be. + */ + + if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) + { printf ("sf_open_write failed with error : ") ; + puts (sf_strerror (NULL)) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + if (sf_read_raw (file, alaw_buffer, BUFFER_SIZE) != BUFFER_SIZE) + { printf ("sf_read_raw : ") ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + for (k = 0 ; k < 0x10000 ; k++) + if (alaw_encode (short_buffer [k]) != alaw_buffer [k]) + { printf ("Encoder error : sample #%d (0x%02X should be 0x%02X)\n", k, alaw_buffer [k], alaw_encode (short_buffer [k])) ; + exit (1) ; + } ; + + sf_close (file) ; + + puts ("ok") ; + + print_test_name ("alaw_test", "decoder") ; + /* Now generate a file containing all possible 8 bit encoded + ** sample values and write it to disk as alaw encoded.frames. + */ + + if (! (file = sf_open (filename, SFM_WRITE, &sfinfo))) + { printf ("sf_open_write failed with error : ") ; + puts (sf_strerror (NULL)) ; + exit (1) ; + } ; + + for (k = 0 ; k < 256 ; k++) + alaw_buffer [k] = k & 0xFF ; + + sf_write_raw (file, alaw_buffer, 256) ; + sf_close (file) ; + + /* Now open that file and compare the alaw decoded sample values + ** with what they should be. + */ + + if (! (file = sf_open (filename, SFM_READ, &sfinfo))) + { printf ("sf_open_write failed with error : ") ; + puts (sf_strerror (NULL)) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + if (sf_read_short (file, short_buffer, 256) != 256) + { printf ("sf_read_short : ") ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + + for (k = 0 ; k < 256 ; k++) + if (short_buffer [k] != alaw_decode (alaw_buffer [k])) + { printf ("Decoder error : sample #%d (0x%02X should be 0x%02X)\n", k, short_buffer [k], alaw_decode (alaw_buffer [k])) ; + exit (1) ; + } ; + + sf_close (file) ; + + puts ("ok") ; + + unlink (filename) ; + + return 0 ; +} /* main */ + + +/*================================================================================= +** The following routines came from the sox-12.15 (Sound eXcahcnge) distribution. +** +** This code is not compiled into libsndfile. It is only used to test the +** libsndfile lookup tables for correctness. +** +** I have included the original authors comments. +*/ + +/* +** A-law routines by Graeme W. Gill. +** Date: 93/5/7 +** +** References: +** 1) CCITT Recommendation G.711 +** +*/ + +#define ACLIP 31744 + +static +unsigned char alaw_encode (int sample) +{ static int exp_lut [128] = + { 1, 1, 2, 2, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7 + } ; + + int sign, exponent, mantissa ; + unsigned char Alawbyte ; + + /* Get the sample into sign-magnitude. */ + sign = ((~sample) >> 8) & 0x80 ; /* set aside the sign */ + if (sign == 0) + sample = -sample ; /* get magnitude */ + if (sample > ACLIP) + sample = ACLIP ; /* clip the magnitude */ + + /* Convert from 16 bit linear to ulaw. */ + if (sample >= 256) + { exponent = exp_lut [(sample >> 8) & 0x7F] ; + mantissa = (sample >> (exponent + 3)) & 0x0F ; + Alawbyte = ((exponent << 4) | mantissa) ; + } + else + Alawbyte = (sample >> 4) ; + + Alawbyte ^= (sign ^ 0x55) ; + + return Alawbyte ; +} /* alaw_encode */ + +static +int alaw_decode (unsigned int Alawbyte) +{ static int exp_lut [8] = { 0, 264, 528, 1056, 2112, 4224, 8448, 16896 } ; + int sign, exponent, mantissa, sample ; + + Alawbyte ^= 0x55 ; + sign = (Alawbyte & 0x80) ; + Alawbyte &= 0x7f ; /* get magnitude */ + if (Alawbyte >= 16) + { exponent = (Alawbyte >> 4) & 0x07 ; + mantissa = Alawbyte & 0x0F ; + sample = exp_lut [exponent] + (mantissa << (exponent + 3)) ; + } + else + sample = (Alawbyte << 4) + 8 ; + if (sign == 0) + sample = -sample ; + + return sample ; +} /* alaw_decode */ + diff --git a/libsndfile-1.0.31/tests/benchmark.c b/libsndfile-1.0.31/tests/benchmark.c new file mode 100644 index 0000000..4983125 --- /dev/null +++ b/libsndfile-1.0.31/tests/benchmark.c @@ -0,0 +1,545 @@ +/* +** Copyright (C) 2002-2012 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include + +#if HAVE_UNISTD_H +#include +#endif + +#if (HAVE_DECL_S_IRGRP == 0) +#include +#endif + +#include +#include +#include +#include +#include + +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846264338 +#endif + +/* +** Neat solution to the Win32/OS2 binary file flage requirement. +** If O_BINARY isn't already defined by the inclusion of the system +** headers, set it to zero. +*/ +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +#define WRITE_FLAGS (O_WRONLY | O_CREAT | O_TRUNC | O_BINARY) +#define READ_FLAGS (O_RDONLY | O_BINARY) + +#if (defined (WIN32) || defined (_WIN32) || defined (__OS2__)) + #define WRITE_PERMS 0777 +#else + #define WRITE_PERMS (S_IRUSR | S_IWUSR | S_IRGRP) +#endif + +#define BUFFER_SIZE (1 << 18) +#define BLOCK_COUNT (30) +#define TEST_DURATION (5) /* 5 Seconds. */ + +typedef struct +{ double write_rate ; + double read_rate ; +} PERF_STATS ; + +static void *data = NULL ; + +static void calc_raw_performance (PERF_STATS *stats) ; + +static void calc_short_performance (int format, double read_rate, double write_rate) ; +static void calc_int_performance (int format, double read_rate, double write_rate) ; +static void calc_float_performance (int format, double read_rate, double write_rate) ; + + +static int cpu_is_big_endian (void) ; + +static const char* get_subtype_str (int subtype) ; + +int +main (int argc, char *argv []) +{ PERF_STATS stats ; + char buffer [256] = "Benchmarking " ; + int format_major ; + + if (! (data = malloc (BUFFER_SIZE * sizeof (double)))) + { perror ("Error : malloc failed") ; + exit (1) ; + } ; + + sf_command (NULL, SFC_GET_LIB_VERSION, buffer + strlen (buffer), sizeof (buffer) - strlen (buffer)) ; + + puts (buffer) ; + memset (buffer, '-', strlen (buffer)) ; + puts (buffer) ; + printf ("Each test takes a little over %d seconds.\n\n", TEST_DURATION) ; + + calc_raw_performance (&stats) ; + + if (argc < 2 || strcmp ("--native-only", argv [1]) == 0) + { puts ("\nNative endian I/O :") ; + format_major = cpu_is_big_endian () ? SF_FORMAT_AIFF : SF_FORMAT_WAV ; + + calc_short_performance (format_major | SF_FORMAT_PCM_16, stats.read_rate, stats.write_rate) ; + calc_int_performance (format_major | SF_FORMAT_PCM_24, stats.read_rate, stats.write_rate) ; + calc_int_performance (format_major | SF_FORMAT_PCM_32, stats.read_rate, stats.write_rate) ; + calc_float_performance (format_major | SF_FORMAT_PCM_16, stats.read_rate, stats.write_rate) ; + calc_float_performance (format_major | SF_FORMAT_PCM_24, stats.read_rate, stats.write_rate) ; + calc_float_performance (format_major | SF_FORMAT_PCM_32, stats.read_rate, stats.write_rate) ; + calc_float_performance (format_major | SF_FORMAT_FLOAT , stats.read_rate, stats.write_rate) ; + } ; + + if (argc < 2 || strcmp ("--swap-only", argv [1]) == 0) + { puts ("\nEndian swapped I/O :") ; + format_major = cpu_is_big_endian () ? SF_FORMAT_WAV : SF_FORMAT_AIFF ; + + calc_short_performance (format_major | SF_FORMAT_PCM_16, stats.read_rate, stats.write_rate) ; + calc_int_performance (format_major | SF_FORMAT_PCM_24, stats.read_rate, stats.write_rate) ; + calc_int_performance (format_major | SF_FORMAT_PCM_32, stats.read_rate, stats.write_rate) ; + calc_float_performance (format_major | SF_FORMAT_PCM_16, stats.read_rate, stats.write_rate) ; + calc_float_performance (format_major | SF_FORMAT_PCM_24, stats.read_rate, stats.write_rate) ; + calc_float_performance (format_major | SF_FORMAT_PCM_32, stats.read_rate, stats.write_rate) ; + calc_float_performance (format_major | SF_FORMAT_FLOAT , stats.read_rate, stats.write_rate) ; + } ; + + puts ("") ; + + free (data) ; + + return 0 ; +} /* main */ + +/*============================================================================== +*/ + +static void +calc_raw_performance (PERF_STATS *stats) +{ clock_t start_clock, clock_time ; + int fd, k, byte_count, retval, op_count ; + const char *filename ; + + filename = "benchmark.dat" ; + + byte_count = BUFFER_SIZE * sizeof (short) ; + + /* Collect write stats */ + printf (" Raw write PCM_16 : ") ; + fflush (stdout) ; + + clock_time = 0 ; + op_count = 0 ; + start_clock = clock () ; + + while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) + { if ((fd = open (filename, WRITE_FLAGS, WRITE_PERMS)) < 0) + { printf ("Error : not able to open file : %s\n", filename) ; + perror ("") ; + exit (1) ; + } ; + + for (k = 0 ; k < BLOCK_COUNT ; k++) + { if ((retval = write (fd, data, byte_count)) != byte_count) + { printf ("Error : write returned %d (should have been %d)\n", retval, byte_count) ; + exit (1) ; + } ; + } ; + + close (fd) ; + + clock_time = clock () - start_clock ; + op_count ++ ; + } ; + + stats->write_rate = (1.0 * BUFFER_SIZE) * BLOCK_COUNT * op_count ; + stats->write_rate *= (1.0 * CLOCKS_PER_SEC) / clock_time ; + printf ("%10.0f samples per sec\n", stats->write_rate) ; + + /* Collect read stats */ + printf (" Raw read PCM_16 : ") ; + fflush (stdout) ; + + clock_time = 0 ; + op_count = 0 ; + start_clock = clock () ; + + while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) + { if ((fd = open (filename, READ_FLAGS)) < 0) + { printf ("Error : not able to open file : %s\n", filename) ; + perror ("") ; + exit (1) ; + } ; + + for (k = 0 ; k < BLOCK_COUNT ; k++) + { if ((retval = read (fd, data, byte_count)) != byte_count) + { printf ("Error : write returned %d (should have been %d)\n", retval, byte_count) ; + exit (1) ; + } ; + } ; + + close (fd) ; + + clock_time = clock () - start_clock ; + op_count ++ ; + } ; + + stats->read_rate = (1.0 * BUFFER_SIZE) * BLOCK_COUNT * op_count ; + stats->read_rate *= (1.0 * CLOCKS_PER_SEC) / clock_time ; + printf ("%10.0f samples per sec\n", stats->read_rate) ; + + unlink (filename) ; +} /* calc_raw_performance */ + +/*------------------------------------------------------------------------------ +*/ + +static void +calc_short_performance (int format, double read_rate, double write_rate) +{ SNDFILE *file ; + SF_INFO sfinfo ; + clock_t start_clock, clock_time ; + double performance ; + int k, item_count, retval, op_count ; + const char* subtype ; + short *short_data ; + const char *filename ; + + filename = "benchmark.dat" ; + subtype = get_subtype_str (format & SF_FORMAT_SUBMASK) ; + + short_data = data ; + item_count = BUFFER_SIZE ; + for (k = 0 ; k < item_count ; k++) + short_data [k] = 32700.0 * sin (2 * M_PI * k / 32000.0) ; + + /* Collect write stats */ + printf (" Write %-5s to %s : ", "short", subtype) ; + fflush (stdout) ; + + sfinfo.channels = 1 ; + sfinfo.format = format ; + sfinfo.frames = 1 ; + sfinfo.samplerate = 32000 ; + + clock_time = 0 ; + op_count = 0 ; + start_clock = clock () ; + + while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) + { if (! (file = sf_open (filename, SFM_WRITE, &sfinfo))) + { printf ("Error : not able to open file : %s\n", filename) ; + perror ("") ; + exit (1) ; + } ; + + /* Turn off the addition of a PEAK chunk. */ + sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; + + for (k = 0 ; k < BLOCK_COUNT ; k++) + { if ((retval = sf_write_short (file, short_data, item_count)) != item_count) + { printf ("Error : sf_write_short returned %d (should have been %d)\n", retval, item_count) ; + exit (1) ; + } ; + } ; + + sf_close (file) ; + + clock_time = clock () - start_clock ; + op_count ++ ; + } ; + + performance = (1.0 * BUFFER_SIZE) * BLOCK_COUNT * op_count ; + performance *= (1.0 * CLOCKS_PER_SEC) / clock_time ; + printf ("%6.2f%% of raw write\n", 100.0 * performance / write_rate) ; + + /* Collect read stats */ + printf (" Read %-5s from %s : ", "short", subtype) ; + fflush (stdout) ; + + clock_time = 0 ; + op_count = 0 ; + start_clock = clock () ; + + while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) + { if (! (file = sf_open (filename, SFM_READ, &sfinfo))) + { printf ("Error : not able to open file : %s\n", filename) ; + perror ("") ; + exit (1) ; + } ; + + for (k = 0 ; k < BLOCK_COUNT ; k++) + { if ((retval = sf_read_short (file, short_data, item_count)) != item_count) + { printf ("Error : write returned %d (should have been %d)\n", retval, item_count) ; + exit (1) ; + } ; + } ; + + sf_close (file) ; + + clock_time = clock () - start_clock ; + op_count ++ ; + } ; + + performance = (1.0 * item_count) * BLOCK_COUNT * op_count ; + performance *= (1.0 * CLOCKS_PER_SEC) / clock_time ; + printf ("%6.2f%% of raw read\n", 100.0 * performance / read_rate) ; + + unlink (filename) ; + +} /* calc_short_performance */ +static void +calc_int_performance (int format, double read_rate, double write_rate) +{ SNDFILE *file ; + SF_INFO sfinfo ; + clock_t start_clock, clock_time ; + double performance ; + int k, item_count, retval, op_count ; + const char* subtype ; + int *int_data ; + const char *filename ; + + filename = "benchmark.dat" ; + subtype = get_subtype_str (format & SF_FORMAT_SUBMASK) ; + + int_data = data ; + item_count = BUFFER_SIZE ; + for (k = 0 ; k < item_count ; k++) + int_data [k] = 32700.0 * (1 << 16) * sin (2 * M_PI * k / 32000.0) ; + + /* Collect write stats */ + printf (" Write %-5s to %s : ", "int", subtype) ; + fflush (stdout) ; + + sfinfo.channels = 1 ; + sfinfo.format = format ; + sfinfo.frames = 1 ; + sfinfo.samplerate = 32000 ; + + clock_time = 0 ; + op_count = 0 ; + start_clock = clock () ; + + while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) + { if (! (file = sf_open (filename, SFM_WRITE, &sfinfo))) + { printf ("Error : not able to open file : %s\n", filename) ; + perror ("") ; + exit (1) ; + } ; + + /* Turn off the addition of a PEAK chunk. */ + sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; + + for (k = 0 ; k < BLOCK_COUNT ; k++) + { if ((retval = sf_write_int (file, int_data, item_count)) != item_count) + { printf ("Error : sf_write_short returned %d (should have been %d)\n", retval, item_count) ; + exit (1) ; + } ; + } ; + + sf_close (file) ; + + clock_time = clock () - start_clock ; + op_count ++ ; + } ; + + performance = (1.0 * BUFFER_SIZE) * BLOCK_COUNT * op_count ; + performance *= (1.0 * CLOCKS_PER_SEC) / clock_time ; + printf ("%6.2f%% of raw write\n", 100.0 * performance / write_rate) ; + + /* Collect read stats */ + printf (" Read %-5s from %s : ", "int", subtype) ; + fflush (stdout) ; + + clock_time = 0 ; + op_count = 0 ; + start_clock = clock () ; + + while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) + { if (! (file = sf_open (filename, SFM_READ, &sfinfo))) + { printf ("Error : not able to open file : %s\n", filename) ; + perror ("") ; + exit (1) ; + } ; + + for (k = 0 ; k < BLOCK_COUNT ; k++) + { if ((retval = sf_read_int (file, int_data, item_count)) != item_count) + { printf ("Error : write returned %d (should have been %d)\n", retval, item_count) ; + exit (1) ; + } ; + } ; + + sf_close (file) ; + + clock_time = clock () - start_clock ; + op_count ++ ; + } ; + + performance = (1.0 * item_count) * BLOCK_COUNT * op_count ; + performance *= (1.0 * CLOCKS_PER_SEC) / clock_time ; + printf ("%6.2f%% of raw read\n", 100.0 * performance / read_rate) ; + + unlink (filename) ; + +} /* calc_int_performance */ +static void +calc_float_performance (int format, double read_rate, double write_rate) +{ SNDFILE *file ; + SF_INFO sfinfo ; + clock_t start_clock, clock_time ; + double performance ; + int k, item_count, retval, op_count ; + const char* subtype ; + float *float_data ; + const char *filename ; + + filename = "benchmark.dat" ; + subtype = get_subtype_str (format & SF_FORMAT_SUBMASK) ; + + float_data = data ; + item_count = BUFFER_SIZE ; + for (k = 0 ; k < item_count ; k++) + float_data [k] = 1.0 * sin (2 * M_PI * k / 32000.0) ; + + /* Collect write stats */ + printf (" Write %-5s to %s : ", "float", subtype) ; + fflush (stdout) ; + + sfinfo.channels = 1 ; + sfinfo.format = format ; + sfinfo.frames = 1 ; + sfinfo.samplerate = 32000 ; + + clock_time = 0 ; + op_count = 0 ; + start_clock = clock () ; + + while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) + { if (! (file = sf_open (filename, SFM_WRITE, &sfinfo))) + { printf ("Error : not able to open file : %s\n", filename) ; + perror ("") ; + exit (1) ; + } ; + + /* Turn off the addition of a PEAK chunk. */ + sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; + + for (k = 0 ; k < BLOCK_COUNT ; k++) + { if ((retval = sf_write_float (file, float_data, item_count)) != item_count) + { printf ("Error : sf_write_short returned %d (should have been %d)\n", retval, item_count) ; + exit (1) ; + } ; + } ; + + sf_close (file) ; + + clock_time = clock () - start_clock ; + op_count ++ ; + } ; + + performance = (1.0 * BUFFER_SIZE) * BLOCK_COUNT * op_count ; + performance *= (1.0 * CLOCKS_PER_SEC) / clock_time ; + printf ("%6.2f%% of raw write\n", 100.0 * performance / write_rate) ; + + /* Collect read stats */ + printf (" Read %-5s from %s : ", "float", subtype) ; + fflush (stdout) ; + + clock_time = 0 ; + op_count = 0 ; + start_clock = clock () ; + + while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) + { if (! (file = sf_open (filename, SFM_READ, &sfinfo))) + { printf ("Error : not able to open file : %s\n", filename) ; + perror ("") ; + exit (1) ; + } ; + + for (k = 0 ; k < BLOCK_COUNT ; k++) + { if ((retval = sf_read_float (file, float_data, item_count)) != item_count) + { printf ("Error : write returned %d (should have been %d)\n", retval, item_count) ; + exit (1) ; + } ; + } ; + + sf_close (file) ; + + clock_time = clock () - start_clock ; + op_count ++ ; + } ; + + performance = (1.0 * item_count) * BLOCK_COUNT * op_count ; + performance *= (1.0 * CLOCKS_PER_SEC) / clock_time ; + printf ("%6.2f%% of raw read\n", 100.0 * performance / read_rate) ; + + unlink (filename) ; + +} /* calc_float_performance */ + + +/*============================================================================== +*/ + +static int +cpu_is_big_endian (void) +{ unsigned char *cptr ; + int endtest ; + + endtest = 0x12345678 ; + + cptr = (unsigned char*) (&endtest) ; + + if (cptr [0] == 0x12 && cptr [1] == 0x34 && cptr [3] == 0x78) + return SF_TRUE ; + + return SF_FALSE ; +} /* cpu_is_big_endian */ + +static const char* +get_subtype_str (int subtype) +{ switch (subtype) + { case SF_FORMAT_PCM_16 : + return "PCM_16" ; + + case SF_FORMAT_PCM_24 : + return "PCM_24" ; + + case SF_FORMAT_PCM_32 : + return "PCM_32" ; + + case SF_FORMAT_FLOAT : + return "FLOAT " ; + + case SF_FORMAT_DOUBLE : + return "DOUBLE" ; + + default : break ; + } ; + + return "UNKNOWN" ; +} /* get_subtype_str */ + diff --git a/libsndfile-1.0.31/tests/benchmark.def b/libsndfile-1.0.31/tests/benchmark.def new file mode 100644 index 0000000..382bf3b --- /dev/null +++ b/libsndfile-1.0.31/tests/benchmark.def @@ -0,0 +1,17 @@ +autogen definitions benchmark.tpl; + +data_type = { + type_name = short ; + multiplier = "32700.0" ; + }; + +data_type = { + type_name = int ; + multiplier = "32700.0 * (1 << 16)" ; + }; + +data_type = { + type_name = float ; + multiplier = "1.0" ; + }; + diff --git a/libsndfile-1.0.31/tests/benchmark.tpl b/libsndfile-1.0.31/tests/benchmark.tpl new file mode 100644 index 0000000..14b22e2 --- /dev/null +++ b/libsndfile-1.0.31/tests/benchmark.tpl @@ -0,0 +1,360 @@ +[+ AutoGen5 template c +] +/* +** Copyright (C) 2002-2012 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include + +#if HAVE_UNISTD_H +#include +#endif + +#if (HAVE_DECL_S_IRGRP == 0) +#include +#endif + +#include +#include +#include +#include +#include + +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846264338 +#endif + +/* +** Neat solution to the Win32/OS2 binary file flage requirement. +** If O_BINARY isn't already defined by the inclusion of the system +** headers, set it to zero. +*/ +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +#define WRITE_FLAGS (O_WRONLY | O_CREAT | O_TRUNC | O_BINARY) +#define READ_FLAGS (O_RDONLY | O_BINARY) + +#if (defined (WIN32) || defined (_WIN32) || defined (__OS2__)) + #define WRITE_PERMS 0777 +#else + #define WRITE_PERMS (S_IRUSR | S_IWUSR | S_IRGRP) +#endif + +#define BUFFER_SIZE (1 << 18) +#define BLOCK_COUNT (30) +#define TEST_DURATION (5) /* 5 Seconds. */ + +typedef struct +{ double write_rate ; + double read_rate ; +} PERF_STATS ; + +static void *data = NULL ; + +static void calc_raw_performance (PERF_STATS *stats) ; + +[+ FOR data_type ++]static void calc_[+ (get "type_name") +]_performance (int format, double read_rate, double write_rate) ; +[+ ENDFOR data_type ++] + +static int cpu_is_big_endian (void) ; + +static const char* get_subtype_str (int subtype) ; + +int +main (int argc, char *argv []) +{ PERF_STATS stats ; + char buffer [256] = "Benchmarking " ; + int format_major ; + + if (! (data = malloc (BUFFER_SIZE * sizeof (double)))) + { perror ("Error : malloc failed") ; + exit (1) ; + } ; + + sf_command (NULL, SFC_GET_LIB_VERSION, buffer + strlen (buffer), sizeof (buffer) - strlen (buffer)) ; + + puts (buffer) ; + memset (buffer, '-', strlen (buffer)) ; + puts (buffer) ; + printf ("Each test takes a little over %d seconds.\n\n", TEST_DURATION) ; + + calc_raw_performance (&stats) ; + + if (argc < 2 || strcmp ("--native-only", argv [1]) == 0) + { puts ("\nNative endian I/O :") ; + format_major = cpu_is_big_endian () ? SF_FORMAT_AIFF : SF_FORMAT_WAV ; + + calc_short_performance (format_major | SF_FORMAT_PCM_16, stats.read_rate, stats.write_rate) ; + calc_int_performance (format_major | SF_FORMAT_PCM_24, stats.read_rate, stats.write_rate) ; + calc_int_performance (format_major | SF_FORMAT_PCM_32, stats.read_rate, stats.write_rate) ; + calc_float_performance (format_major | SF_FORMAT_PCM_16, stats.read_rate, stats.write_rate) ; + calc_float_performance (format_major | SF_FORMAT_PCM_24, stats.read_rate, stats.write_rate) ; + calc_float_performance (format_major | SF_FORMAT_PCM_32, stats.read_rate, stats.write_rate) ; + calc_float_performance (format_major | SF_FORMAT_FLOAT , stats.read_rate, stats.write_rate) ; + } ; + + if (argc < 2 || strcmp ("--swap-only", argv [1]) == 0) + { puts ("\nEndian swapped I/O :") ; + format_major = cpu_is_big_endian () ? SF_FORMAT_WAV : SF_FORMAT_AIFF ; + + calc_short_performance (format_major | SF_FORMAT_PCM_16, stats.read_rate, stats.write_rate) ; + calc_int_performance (format_major | SF_FORMAT_PCM_24, stats.read_rate, stats.write_rate) ; + calc_int_performance (format_major | SF_FORMAT_PCM_32, stats.read_rate, stats.write_rate) ; + calc_float_performance (format_major | SF_FORMAT_PCM_16, stats.read_rate, stats.write_rate) ; + calc_float_performance (format_major | SF_FORMAT_PCM_24, stats.read_rate, stats.write_rate) ; + calc_float_performance (format_major | SF_FORMAT_PCM_32, stats.read_rate, stats.write_rate) ; + calc_float_performance (format_major | SF_FORMAT_FLOAT , stats.read_rate, stats.write_rate) ; + } ; + + puts ("") ; + + free (data) ; + + return 0 ; +} /* main */ + +/*============================================================================== +*/ + +static void +calc_raw_performance (PERF_STATS *stats) +{ clock_t start_clock, clock_time ; + int fd, k, byte_count, retval, op_count ; + const char *filename ; + + filename = "benchmark.dat" ; + + byte_count = BUFFER_SIZE * sizeof (short) ; + + /* Collect write stats */ + printf (" Raw write PCM_16 : ") ; + fflush (stdout) ; + + clock_time = 0 ; + op_count = 0 ; + start_clock = clock () ; + + while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) + { if ((fd = open (filename, WRITE_FLAGS, WRITE_PERMS)) < 0) + { printf ("Error : not able to open file : %s\n", filename) ; + perror ("") ; + exit (1) ; + } ; + + for (k = 0 ; k < BLOCK_COUNT ; k++) + { if ((retval = write (fd, data, byte_count)) != byte_count) + { printf ("Error : write returned %d (should have been %d)\n", retval, byte_count) ; + exit (1) ; + } ; + } ; + + close (fd) ; + + clock_time = clock () - start_clock ; + op_count ++ ; + } ; + + stats->write_rate = (1.0 * BUFFER_SIZE) * BLOCK_COUNT * op_count ; + stats->write_rate *= (1.0 * CLOCKS_PER_SEC) / clock_time ; + printf ("%10.0f samples per sec\n", stats->write_rate) ; + + /* Collect read stats */ + printf (" Raw read PCM_16 : ") ; + fflush (stdout) ; + + clock_time = 0 ; + op_count = 0 ; + start_clock = clock () ; + + while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) + { if ((fd = open (filename, READ_FLAGS)) < 0) + { printf ("Error : not able to open file : %s\n", filename) ; + perror ("") ; + exit (1) ; + } ; + + for (k = 0 ; k < BLOCK_COUNT ; k++) + { if ((retval = read (fd, data, byte_count)) != byte_count) + { printf ("Error : write returned %d (should have been %d)\n", retval, byte_count) ; + exit (1) ; + } ; + } ; + + close (fd) ; + + clock_time = clock () - start_clock ; + op_count ++ ; + } ; + + stats->read_rate = (1.0 * BUFFER_SIZE) * BLOCK_COUNT * op_count ; + stats->read_rate *= (1.0 * CLOCKS_PER_SEC) / clock_time ; + printf ("%10.0f samples per sec\n", stats->read_rate) ; + + unlink (filename) ; +} /* calc_raw_performance */ + +/*------------------------------------------------------------------------------ +*/ + +[+ FOR data_type ++]static void +calc_[+ (get "type_name") +]_performance (int format, double read_rate, double write_rate) +{ SNDFILE *file ; + SF_INFO sfinfo ; + clock_t start_clock, clock_time ; + double performance ; + int k, item_count, retval, op_count ; + const char* subtype ; + [+ (get "type_name") +] *[+ (get "type_name") +]_data ; + const char *filename ; + + filename = "benchmark.dat" ; + subtype = get_subtype_str (format & SF_FORMAT_SUBMASK) ; + + [+ (get "type_name") +]_data = data ; + item_count = BUFFER_SIZE ; + for (k = 0 ; k < item_count ; k++) + [+ (get "type_name") +]_data [k] = [+ (get "multiplier") +] * sin (2 * M_PI * k / 32000.0) ; + + /* Collect write stats */ + printf (" Write %-5s to %s : ", "[+ (get "type_name") +]", subtype) ; + fflush (stdout) ; + + sfinfo.channels = 1 ; + sfinfo.format = format ; + sfinfo.frames = 1 ; + sfinfo.samplerate = 32000 ; + + clock_time = 0 ; + op_count = 0 ; + start_clock = clock () ; + + while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) + { if (! (file = sf_open (filename, SFM_WRITE, &sfinfo))) + { printf ("Error : not able to open file : %s\n", filename) ; + perror ("") ; + exit (1) ; + } ; + + /* Turn off the addition of a PEAK chunk. */ + sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; + + for (k = 0 ; k < BLOCK_COUNT ; k++) + { if ((retval = sf_write_[+ (get "type_name") +] (file, [+ (get "type_name") +]_data, item_count)) != item_count) + { printf ("Error : sf_write_short returned %d (should have been %d)\n", retval, item_count) ; + exit (1) ; + } ; + } ; + + sf_close (file) ; + + clock_time = clock () - start_clock ; + op_count ++ ; + } ; + + performance = (1.0 * BUFFER_SIZE) * BLOCK_COUNT * op_count ; + performance *= (1.0 * CLOCKS_PER_SEC) / clock_time ; + printf ("%6.2f%% of raw write\n", 100.0 * performance / write_rate) ; + + /* Collect read stats */ + printf (" Read %-5s from %s : ", "[+ (get "type_name") +]", subtype) ; + fflush (stdout) ; + + clock_time = 0 ; + op_count = 0 ; + start_clock = clock () ; + + while (clock_time < (CLOCKS_PER_SEC * TEST_DURATION)) + { if (! (file = sf_open (filename, SFM_READ, &sfinfo))) + { printf ("Error : not able to open file : %s\n", filename) ; + perror ("") ; + exit (1) ; + } ; + + for (k = 0 ; k < BLOCK_COUNT ; k++) + { if ((retval = sf_read_[+ (get "type_name") +] (file, [+ (get "type_name") +]_data, item_count)) != item_count) + { printf ("Error : write returned %d (should have been %d)\n", retval, item_count) ; + exit (1) ; + } ; + } ; + + sf_close (file) ; + + clock_time = clock () - start_clock ; + op_count ++ ; + } ; + + performance = (1.0 * item_count) * BLOCK_COUNT * op_count ; + performance *= (1.0 * CLOCKS_PER_SEC) / clock_time ; + printf ("%6.2f%% of raw read\n", 100.0 * performance / read_rate) ; + + unlink (filename) ; + +} /* calc_[+ (get "type_name") +]_performance */ +[+ ENDFOR data_type ++] + +/*============================================================================== +*/ + +static int +cpu_is_big_endian (void) +{ unsigned char *cptr ; + int endtest ; + + endtest = 0x12345678 ; + + cptr = (unsigned char*) (&endtest) ; + + if (cptr [0] == 0x12 && cptr [1] == 0x34 && cptr [3] == 0x78) + return SF_TRUE ; + + return SF_FALSE ; +} /* cpu_is_big_endian */ + +static const char* +get_subtype_str (int subtype) +{ switch (subtype) + { case SF_FORMAT_PCM_16 : + return "PCM_16" ; + + case SF_FORMAT_PCM_24 : + return "PCM_24" ; + + case SF_FORMAT_PCM_32 : + return "PCM_32" ; + + case SF_FORMAT_FLOAT : + return "FLOAT " ; + + case SF_FORMAT_DOUBLE : + return "DOUBLE" ; + + default : break ; + } ; + + return "UNKNOWN" ; +} /* get_subtype_str */ + diff --git a/libsndfile-1.0.31/tests/channel_test.c b/libsndfile-1.0.31/tests/channel_test.c new file mode 100644 index 0000000..a69cd32 --- /dev/null +++ b/libsndfile-1.0.31/tests/channel_test.c @@ -0,0 +1,138 @@ +/* +** Copyright (C) 2001-2015 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include + +#include "utils.h" + +#define BUFFER_LEN (1 << 10) +#define LOG_BUFFER_SIZE 1024 + +static void channel_test (void) ; +static double max_diff (const float *a, const float *b, unsigned int len, unsigned int * position) ; + +int +main (void) // int argc, char *argv []) +{ channel_test () ; + return 0 ; +} /* main */ + +/*============================================================================================ +** Here are the test functions. +*/ + +static void +channel_test (void) +{ static float float_data [1024] ; + static float read_float [1024] ; + static int read_int [1024] ; + static short read_short [1024] ; + unsigned int ch, k, position = 0 ; + + gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 0.9) ; + + for (ch = 1 ; ch <= 8 ; ch++) + { SNDFILE *file ; + SF_INFO wsfinfo, rsfinfo ; + sf_count_t wframes = ARRAY_LEN (float_data) / ch ; + double maxdiff ; + char filename [256] ; + + snprintf (filename, sizeof (filename), "chan_%d.wav", ch) ; + print_test_name (__func__, filename) ; + + sf_info_setup (&wsfinfo, SF_FORMAT_WAV | SF_FORMAT_FLOAT, 48000, ch) ; + sf_info_clear (&rsfinfo) ; + + /* Write the test file. */ + file = test_open_file_or_die (filename, SFM_WRITE, &wsfinfo, SF_FALSE, __LINE__) ; + test_writef_float_or_die (file, 0, float_data, wframes, __LINE__) ; + sf_close (file) ; + + /* Read it as float and test. */ + file = test_open_file_or_die (filename, SFM_READ, &rsfinfo, SF_FALSE, __LINE__) ; + exit_if_true (rsfinfo.frames == 0, + "\n\nLine %d : Frames in file %" PRId64 ".\n\n", __LINE__, rsfinfo.frames) ; + exit_if_true (wframes != rsfinfo.frames, + "\n\nLine %d : Wrote %" PRId64 ", read %" PRId64 " frames.\n\n", __LINE__, wframes, rsfinfo.frames) ; + + sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; + + test_readf_float_or_die (file, 0, read_float, rsfinfo.frames, __LINE__) ; + compare_float_or_die (float_data, read_float, ch * rsfinfo.frames, __LINE__) ; + + /* Read it as short and test. */ + test_seek_or_die (file, 0, SEEK_SET, 0, ch, __LINE__) ; + test_readf_short_or_die (file, 0, read_short, rsfinfo.frames, __LINE__) ; + + for (k = 0 ; k < ARRAY_LEN (read_float) ; k++) + read_float [k] = read_short [k] * (0.9 / 0x8000) ; + + maxdiff = max_diff (float_data, read_float, ch * rsfinfo.frames, &position) ; + exit_if_true (maxdiff > 0.5, "\n\nLine %d : Max diff is %f at index %u\n\n", __LINE__, maxdiff, position) ; + + /* Read it as int and test. */ + test_seek_or_die (file, 0, SEEK_SET, 0, ch, __LINE__) ; + test_readf_int_or_die (file, 0, read_int, rsfinfo.frames, __LINE__) ; + + for (k = 0 ; k < ARRAY_LEN (read_float) ; k++) + read_float [k] = read_int [k] * (0.9 / 0x80000000) ; + + maxdiff = max_diff (float_data, read_float, ch * rsfinfo.frames, &position) ; + exit_if_true (maxdiff > 0.5, "\n\nLine %d : Max diff is %f at index %u\n\n", __LINE__, maxdiff, position) ; + + sf_close (file) ; + unlink (filename) ; + printf ("ok\n") ; + } ; + + return ; +} /* channel_test */ + +static double +max_diff (const float *a, const float *b, unsigned int len, unsigned int * position) +{ double mdiff = 0.0, diff ; + unsigned int k ; + + for (k = 0 ; k < len ; k++) + { diff = fabs (a [k] - b [k]) ; + if (diff > mdiff) + { mdiff = diff ; + *position = k ; + } ; + } ; + + return mdiff ; +} /* max_diff */ diff --git a/libsndfile-1.0.31/tests/checksum_test.c b/libsndfile-1.0.31/tests/checksum_test.c new file mode 100644 index 0000000..4b37b3d --- /dev/null +++ b/libsndfile-1.0.31/tests/checksum_test.c @@ -0,0 +1,129 @@ +/* +** Copyright (C) 2008-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include + +#include "utils.h" + +#define SAMPLE_RATE 8000 + +typedef struct +{ int enc_fmt ; + + const char * enc_name ; + const char * dec_name ; + + uint64_t enc_cksum ; + uint64_t dec_cksum ; +} CHECKSUM ; + +static CHECKSUM +checksum_orig [] = +{ + { SF_FORMAT_RAW | SF_FORMAT_ULAW, + "checksum.ulaw", "cksum_ulaw.pcm16", + 0xbd99d34ccbe2fLL, 0xda82168ed82e9LL + }, + { SF_FORMAT_RAW | SF_FORMAT_ALAW, + "checksum.alaw", "cksum_alaw.pcm16", + 0x0004afddc0fcf4bdLL, 0x2e7320230b88LL + }, + { SF_FORMAT_RAW | SF_FORMAT_GSM610, + "checksum.gsm", "cksum_gsm.pcm16", + 0xa06a3faaaf684LL, 0x2d7ff668efeb9LL + }, + { SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, + "checksum.vox", "cksum_vox.pcm16", + 0x7c9d7afdb96a1LL, 0xe540df74a4b14LL + }, +} ; + +static void checksum_test (const CHECKSUM * cksum) ; + +static float orig [1 << 14] ; +static short data [1 << 14] ; + +int +main (void) +{ unsigned k ; + + gen_windowed_sine_float (orig, ARRAY_LEN (orig), 0.9) ; + + for (k = 0 ; k < ARRAY_LEN (checksum_orig) ; k++) + checksum_test (&checksum_orig [k]) ; + + return 0 ; +} /* main */ + +/*============================================================================== +*/ + +static void +checksum_test (const CHECKSUM * cksum) +{ SNDFILE * file ; + SF_INFO info ; + + print_test_name (__func__, cksum->enc_name) ; + + memset (&info, 0, sizeof (info)) ; + info.format = cksum->enc_fmt ; + info.channels = 1 ; + info.samplerate = SAMPLE_RATE ; + + file = test_open_file_or_die (cksum->enc_name, SFM_WRITE, &info, 0, __LINE__) ; + test_write_float_or_die (file, 0, orig, ARRAY_LEN (orig), __LINE__) ; + sf_close (file) ; + + check_file_hash_or_die (cksum->enc_name, cksum->enc_cksum, __LINE__) ; + puts ("ok") ; + + /*------------------------------------------------------------------------*/ + + print_test_name (__func__, cksum->dec_name) ; + + info.format = cksum->enc_fmt ; + info.channels = 1 ; + info.samplerate = SAMPLE_RATE ; + + file = test_open_file_or_die (cksum->enc_name, SFM_READ, &info, 0, __LINE__) ; + test_read_short_or_die (file, 0, data, ARRAY_LEN (data), __LINE__) ; + sf_close (file) ; + + info.format = SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_16 ; + info.channels = 1 ; + info.samplerate = SAMPLE_RATE ; + + file = test_open_file_or_die (cksum->dec_name, SFM_WRITE, &info, 0, __LINE__) ; + test_write_short_or_die (file, 0, data, ARRAY_LEN (data), __LINE__) ; + sf_close (file) ; + + check_file_hash_or_die (cksum->dec_name, cksum->dec_cksum, __LINE__) ; + + remove (cksum->enc_name) ; + remove (cksum->dec_name) ; + + puts ("ok") ; +} /* checksum_test */ + diff --git a/libsndfile-1.0.31/tests/chunk_test.c b/libsndfile-1.0.31/tests/chunk_test.c new file mode 100644 index 0000000..ed34064 --- /dev/null +++ b/libsndfile-1.0.31/tests/chunk_test.c @@ -0,0 +1,446 @@ +/* +** Copyright (C) 2003-2016 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "sfendian.h" +#include "utils.h" + +#define BUFFER_LEN (1 << 10) +#define LOG_BUFFER_SIZE 1024 + +static void chunk_test (const char *filename, int format) ; +static void wav_subchunk_test (size_t chunk_size) ; +static void large_free_test (const char *filename, int format, size_t chunk_size) ; + +int +main (int argc, char *argv []) +{ int do_all = 0 ; + int test_count = 0, k ; + + if (argc != 2) + { printf ("Usage : %s \n", argv [0]) ; + printf (" Where is one of the following:\n") ; + printf (" wav - test adding chunks to WAV files\n") ; + printf (" aiff - test adding chunks to AIFF files\n") ; + printf (" caf - test adding chunks to CAF files\n") ; + printf (" rf64 - test adding chunks to RF64 files\n") ; + printf (" all - perform all tests\n") ; + exit (1) ; + } ; + + do_all = ! strcmp (argv [1], "all") ; + + if (do_all || ! strcmp (argv [1], "wav")) + { chunk_test ("chunks_pcm16.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; + chunk_test ("chunks_pcm16.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; + chunk_test ("chunks_pcm16.wavex", SF_FORMAT_WAVEX | SF_FORMAT_PCM_16) ; + + for (k = 100 ; k < 10000 ; k *= 4) + wav_subchunk_test (k) ; + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "aiff")) + { chunk_test ("chunks_pcm16.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "caf")) + { chunk_test ("chunks_pcm16.caf", SF_FORMAT_CAF | SF_FORMAT_PCM_16) ; + chunk_test ("chunks_alac.caf", SF_FORMAT_CAF | SF_FORMAT_ALAC_16) ; + large_free_test ("large_free.caf", SF_FORMAT_CAF | SF_FORMAT_PCM_16, 100) ; + large_free_test ("large_free.caf", SF_FORMAT_CAF | SF_FORMAT_PCM_16, 20000) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "rf64")) + { chunk_test ("chunks_pcm16.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ; + test_count++ ; + } ; + + if (test_count == 0) + { printf ("Mono : ************************************\n") ; + printf ("Mono : * No '%s' test defined.\n", argv [1]) ; + printf ("Mono : ************************************\n") ; + return 1 ; + } ; + + return 0 ; +} /* main */ + + +/*============================================================================================ +** Here are the test functions. +*/ + +static void +chunk_test_helper (const char *filename, int format, const char * testdata) +{ SNDFILE *file ; + SF_INFO sfinfo ; + SF_CHUNK_INFO chunk_info ; + SF_CHUNK_ITERATOR * iterator ; + uint32_t length_before ; + int err, allow_fd ; + + switch (format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_ALAC_16 : + allow_fd = SF_FALSE ; + break ; + default : + allow_fd = SF_TRUE ; + break ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.channels = 1 ; + sfinfo.frames = 0 ; + sfinfo.format = format ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + + /* Set up the chunk to write. */ + memset (&chunk_info, 0, sizeof (chunk_info)) ; + snprintf (chunk_info.id, sizeof (chunk_info.id), "Test") ; + chunk_info.id_size = 4 ; + chunk_info.data = strdup (testdata) ; + chunk_info.datalen = strlen (chunk_info.data) ; + + length_before = chunk_info.datalen ; + + err = sf_set_chunk (file, &chunk_info) ; + exit_if_true ( + err != SF_ERR_NO_ERROR, + "\n\nLine %d : sf_set_chunk returned for testdata '%s' : %s\n\n", __LINE__, testdata, sf_error_number (err) + ) ; + + memset (chunk_info.data, 0, chunk_info.datalen) ; + free (chunk_info.data) ; + + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; + + memset (&chunk_info, 0, sizeof (chunk_info)) ; + snprintf (chunk_info.id, sizeof (chunk_info.id), "Test") ; + chunk_info.id_size = 4 ; + + iterator = sf_get_chunk_iterator (file, &chunk_info) ; + err = sf_get_chunk_size (iterator, &chunk_info) ; + exit_if_true ( + err != SF_ERR_NO_ERROR, + "\n\nLine %d : sf_get_chunk_size returned for testdata '%s' : %s\n\n", __LINE__, testdata, sf_error_number (err) + ) ; + + exit_if_true ( + length_before > chunk_info.datalen || chunk_info.datalen - length_before > 4, + "\n\nLine %d : testdata '%s' : Bad chunk length %u (previous length %u)\n\n", __LINE__, testdata, chunk_info.datalen, length_before + ) ; + + chunk_info.data = malloc (chunk_info.datalen) ; + err = sf_get_chunk_data (iterator, &chunk_info) ; + exit_if_true ( + err != SF_ERR_NO_ERROR, + "\n\nLine %d : sf_get_chunk_size returned for testdata '%s' : %s\n\n", __LINE__, testdata, sf_error_number (err) + ) ; + + exit_if_true ( + memcmp (testdata, chunk_info.data, length_before), + "\n\nLine %d : Data compare failed.\n %s\n %s\n\n", __LINE__, testdata, (char*) chunk_info.data + ) ; + + free (chunk_info.data) ; + + sf_close (file) ; + unlink (filename) ; +} /* chunk_test_helper */ + +static void +multichunk_test_helper (const char *filename, int format, const char * testdata [], size_t testdata_len) +{ SNDFILE *file ; + SF_INFO sfinfo ; + SF_CHUNK_INFO chunk_info ; + SF_CHUNK_ITERATOR * iterator ; + uint32_t length_before [16] ; + int err, allow_fd ; + size_t i ; + + + exit_if_true ( + ARRAY_LEN (length_before) < testdata_len, + "\n\nLine %d : Bad array length.\n\n", __LINE__ + ) ; + + + sfinfo.samplerate = 44100 ; + sfinfo.channels = 1 ; + sfinfo.frames = 0 ; + sfinfo.format = format ; + + switch (format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_ALAC_16 : + allow_fd = SF_FALSE ; + break ; + default : + allow_fd = SF_TRUE ; + break ; + } ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + + /* Set up the chunk to write. */ + for (i = 0 ; i < testdata_len ; i++) + { memset (&chunk_info, 0, sizeof (chunk_info)) ; + snprintf (chunk_info.id, sizeof (chunk_info.id), "Test") ; + chunk_info.id_size = 4 ; + + chunk_info.data = strdup (testdata [i]) ; + chunk_info.datalen = strlen (chunk_info.data) ; + + length_before [i] = chunk_info.datalen ; + + err = sf_set_chunk (file, &chunk_info) ; + exit_if_true ( + err != SF_ERR_NO_ERROR, + "\n\nLine %d : sf_set_chunk returned for testdata[%d] '%s' : %s\n\n", __LINE__, (int) i, testdata [i], sf_error_number (err) + ) ; + + memset (chunk_info.data, 0, chunk_info.datalen) ; + free (chunk_info.data) ; + } + + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; + + memset (&chunk_info, 0, sizeof (chunk_info)) ; + snprintf (chunk_info.id, sizeof (chunk_info.id), "Test") ; + chunk_info.id_size = 4 ; + + iterator = sf_get_chunk_iterator (file, &chunk_info) ; + + i = 0 ; + while (iterator) + { memset (&chunk_info, 0, sizeof (chunk_info)) ; + err = sf_get_chunk_size (iterator, &chunk_info) ; + exit_if_true ( + i > testdata_len, + "\n\nLine %d : iterated to chunk #%d, but only %d chunks have been written\n\n", __LINE__, (int) i, (int) testdata_len + ) ; + + exit_if_true ( + err != SF_ERR_NO_ERROR, + "\n\nLine %d : sf_get_chunk_size returned for testdata[%d] '%s' : %s\n\n", __LINE__, (int) i, testdata [i], sf_error_number (err) + ) ; + + exit_if_true ( + length_before [i] > chunk_info.datalen || chunk_info.datalen - length_before [i] > 4, + "\n\nLine %d : testdata[%d] '%s' : Bad chunk length %u (previous length %u)\n\n", __LINE__, (int) i, testdata [i], chunk_info.datalen, length_before [i] + ) ; + + chunk_info.data = malloc (chunk_info.datalen) ; + err = sf_get_chunk_data (iterator, &chunk_info) ; + exit_if_true ( + err != SF_ERR_NO_ERROR, + "\n\nLine %d : sf_get_chunk_size returned for testdata[%d] '%s' : %s\n\n", __LINE__, (int) i, testdata [i], sf_error_number (err) + ) ; + + exit_if_true ( + 4 != chunk_info.id_size, + "\n\nLine %d : testdata[%d] : Bad ID length %u (previous length %u)\n\n", __LINE__, (int) i, chunk_info.id_size, 4 + ) ; + exit_if_true ( + memcmp ("Test", chunk_info.id, 4), + "\n\nLine %d : ID compare failed at %d.\n %s\n %s\n\n", __LINE__, (int) i, "Test", (char*) chunk_info.id + ) ; + + exit_if_true ( + memcmp (testdata [i], chunk_info.data, length_before [i]), + "\n\nLine %d : Data compare failed at %d.\n %s\n %s\n\n", __LINE__, (int) i, testdata [i], (char*) chunk_info.data + ) ; + + free (chunk_info.data) ; + iterator = sf_next_chunk_iterator (iterator) ; + i++ ; + } + + sf_close (file) ; + unlink (filename) ; +} /* multichunk_test_helper */ + + +static void +chunk_test (const char *filename, int format) +{ const char* testdata [] = + { "There can be only one.", "", "A", "AB", "ABC", "ABCD", "ABCDE" } ; + uint32_t k ; + + print_test_name (__func__, filename) ; + + for (k = 0 ; k < ARRAY_LEN (testdata) ; k++) + chunk_test_helper (filename, format, testdata [k]) ; + + multichunk_test_helper (filename, format, testdata, ARRAY_LEN (testdata)) ; + + puts ("ok") ; +} /* chunk_test */ + + +static void +wav_subchunk_test (size_t chunk_size) +{ SNDFILE * file ; + SF_INFO sfinfo ; + SF_CHUNK_INFO chunk_info ; + char filename [256] ; + char chunk_data [10240] ; + short audio [16] ; + int err, value ; + + snprintf (filename, sizeof (filename), "subchunk_%04d.wav", (int) chunk_size) ; + print_test_name (__func__, filename) ; + + exit_if_true (sizeof (chunk_data) < chunk_size, "\n\nLine %d : sizeof (data) < chunk_size\n\n", __LINE__) ; + + memset (chunk_data, 53, sizeof (chunk_data)) ; + chunk_data [chunk_size] = 0 ; + + /* Fill in the chunk data. */ + value = MAKE_MARKER ('a', 'd', 't', 'l') ; + memcpy (chunk_data, &value, sizeof (value)) ; + value = MAKE_MARKER ('n', 'o', 't', 'e') ; + memcpy (chunk_data + 4, &value, sizeof (value)) ; + value = H2LE_32 (chunk_size - 12) ; + memcpy (chunk_data + 8, &value, sizeof (value)) ; + + sfinfo.samplerate = 44100 ; + sfinfo.channels = 1 ; + sfinfo.frames = 0 ; + sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + /* Set up the chunk to write. */ + memset (&chunk_info, 0, sizeof (chunk_info)) ; + snprintf (chunk_info.id, sizeof (chunk_info.id), "LIST") ; + chunk_info.id_size = 4 ; + chunk_info.data = chunk_data ; + chunk_info.datalen = chunk_size ; + + err = sf_set_chunk (file, &chunk_info) ; + exit_if_true ( + err != SF_ERR_NO_ERROR, + "\n\nLine %d : sf_set_chunk returned for testdata : %s\n\n", __LINE__, sf_error_number (err) + ) ; + + memset (chunk_info.data, 0, chunk_info.datalen) ; + + /* Add some audio data. */ + memset (audio, 0, sizeof (audio)) ; + sf_write_short (file, audio, ARRAY_LEN (audio)) ; + + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + exit_if_true ( + sfinfo.frames != ARRAY_LEN (audio), + "\n\nLine %d : Incorrect sample count (%d should be %d)\n", __LINE__, (int) sfinfo.frames, (int) ARRAY_LEN (audio) + ) ; + + if (chunk_size < 512) + check_log_buffer_or_die (file, __LINE__) ; + + sf_close (file) ; + + unlink (filename) ; + puts ("ok") ; +} /* wav_subchunk_test */ + +static void +large_free_test (const char *filename, int format, size_t chunk_size) +{ SNDFILE * file ; + SF_INFO sfinfo ; + SF_CHUNK_INFO chunk_info ; + char chunk_data [20002] ; + short audio [16] ; + int err ; + + print_test_name (__func__, filename) ; + + exit_if_true (sizeof (chunk_data) <= chunk_size, "\n\nLine %d : sizeof (data) < chunk_size\n\n", __LINE__) ; + + memset (chunk_data, 53, sizeof (chunk_data)) ; + chunk_data [chunk_size] = 0 ; + + sfinfo.samplerate = 44100 ; + sfinfo.channels = 1 ; + sfinfo.frames = 0 ; + sfinfo.format = format ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + /* Set up the chunk to write. */ + memset (&chunk_info, 0, sizeof (chunk_info)) ; + snprintf (chunk_info.id, sizeof (chunk_info.id), "free") ; + chunk_info.id_size = 4 ; + chunk_info.data = chunk_data ; + chunk_info.datalen = chunk_size ; + + err = sf_set_chunk (file, &chunk_info) ; + exit_if_true ( + err != SF_ERR_NO_ERROR, + "\n\nLine %d : sf_set_chunk returned for testdata : %s\n\n", __LINE__, sf_error_number (err) + ) ; + + memset (chunk_info.data, 0, chunk_info.datalen) ; + + /* Add some audio data. */ + memset (audio, 0, sizeof (audio)) ; + sf_write_short (file, audio, ARRAY_LEN (audio)) ; + + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + exit_if_true ( + sfinfo.frames != ARRAY_LEN (audio), + "\n\nLine %d : Incorrect sample count (%d should be %d)\n", __LINE__, (int) sfinfo.frames, (int) ARRAY_LEN (audio) + ) ; + + if (chunk_size < 512) + check_log_buffer_or_die (file, __LINE__) ; + + sf_close (file) ; + + unlink (filename) ; + puts ("ok") ; +} /* large_free_test */ diff --git a/libsndfile-1.0.31/tests/command_test.c b/libsndfile-1.0.31/tests/command_test.c new file mode 100644 index 0000000..625d8e5 --- /dev/null +++ b/libsndfile-1.0.31/tests/command_test.c @@ -0,0 +1,1806 @@ +/* +** Copyright (C) 2001-2019 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include + +#include "sfendian.h" +#include "utils.h" + +#define BUFFER_LEN (1 << 10) +#define LOG_BUFFER_SIZE 1024 +#define data_MARKER MAKE_MARKER ('d', 'a', 't', 'a') + +static void float_norm_test (const char *filename) ; +static void double_norm_test (const char *filename) ; +static void format_tests (void) ; +static void calc_peak_test (int filetype, const char *filename, int channels) ; +static void truncate_test (const char *filename, int filetype) ; +static void instrument_test (const char *filename, int filetype) ; +static void cue_test (const char *filename, int filetype) ; +static void cue_test_var (const char *filename, int filetype, int count) ; +static void channel_map_test (const char *filename, int filetype) ; +static void current_sf_info_test (const char *filename) ; +static void raw_needs_endswap_test (const char *filename, int filetype) ; + +static void broadcast_test (const char *filename, int filetype) ; +static void broadcast_rdwr_test (const char *filename, int filetype) ; +static void broadcast_coding_history_test (const char *filename) ; +static void broadcast_coding_history_size (const char *filename) ; + +/* Cart Chunk tests */ +static void cart_test (const char *filename, int filetype) ; +static void cart_rdwr_test (const char *filename, int filetype) ; + +/* Force the start of this buffer to be double aligned. Sparc-solaris will +** choke if its not. +*/ + +static int int_data [BUFFER_LEN] ; +static float float_data [BUFFER_LEN] ; +static double double_data [BUFFER_LEN] ; + +int +main (int argc, char *argv []) +{ int do_all = 0 ; + int test_count = 0 ; + + if (argc != 2) + { printf ("Usage : %s \n", argv [0]) ; + printf (" Where is one of the following:\n") ; + printf (" ver - test sf_command (SFC_GETLIB_VERSION)\n") ; + printf (" norm - test floating point normalisation\n") ; + printf (" format - test format string commands\n") ; + printf (" peak - test peak calculation\n") ; + printf (" trunc - test file truncation\n") ; + printf (" inst - test set/get of SF_INSTRUMENT.\n") ; + printf (" cue - test set/get of SF_CUES.\n") ; + printf (" chanmap - test set/get of channel map data..\n") ; + printf (" bext - test set/get of SF_BROADCAST_INFO.\n") ; + printf (" bextch - test set/get of SF_BROADCAST_INFO coding_history.\n") ; + printf (" cart - test set/get of SF_CART_INFO.\n") ; + printf (" rawend - test SFC_RAW_NEEDS_ENDSWAP.\n") ; + printf (" all - perform all tests\n") ; + exit (1) ; + } ; + + do_all = ! strcmp (argv [1], "all") ; + + if (do_all || strcmp (argv [1], "ver") == 0) + { char buffer [128] ; + + print_test_name ("version_test", "(none)") ; + buffer [0] = 0 ; + sf_command (NULL, SFC_GET_LIB_VERSION, buffer, sizeof (buffer)) ; + if (strlen (buffer) < 1) + { printf ("Line %d: could not retrieve lib version.\n", __LINE__) ; + exit (1) ; + } ; + puts ("ok") ; + test_count ++ ; + } ; + + if (do_all || strcmp (argv [1], "norm") == 0) + { /* Preliminary float/double normalisation tests. More testing + ** is done in the program 'floating_point_test'. + */ + float_norm_test ("float.wav") ; + double_norm_test ("double.wav") ; + test_count ++ ; + } ; + + if (do_all || strcmp (argv [1], "peak") == 0) + { calc_peak_test (SF_ENDIAN_BIG | SF_FORMAT_RAW, "be-peak.raw", 1) ; + calc_peak_test (SF_ENDIAN_LITTLE | SF_FORMAT_RAW, "le-peak.raw", 1) ; + calc_peak_test (SF_ENDIAN_BIG | SF_FORMAT_RAW, "be-peak.raw", 7) ; + calc_peak_test (SF_ENDIAN_LITTLE | SF_FORMAT_RAW, "le-peak.raw", 7) ; + test_count ++ ; + } ; + + if (do_all || ! strcmp (argv [1], "format")) + { format_tests () ; + test_count ++ ; + } ; + + if (do_all || strcmp (argv [1], "trunc") == 0) + { truncate_test ("truncate.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_32) ; + truncate_test ("truncate.au" , SF_FORMAT_AU | SF_FORMAT_PCM_16) ; + test_count ++ ; + } ; + + if (do_all || strcmp (argv [1], "inst") == 0) + { instrument_test ("instrument.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; + /*-instrument_test ("instrument.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_24) ;-*/ + /*-instrument_test ("instrument.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_16) ;-*/ + test_count ++ ; + } ; + + if (do_all || strcmp (argv [1], "cue") == 0) + { /* 2500 is close to the largest number of cues possible because of block sizes (enforced in aiff.c, wav.c) */ + int cuecounts [] = { 0, 1, 10, 100, 101, 1000, 1001, 2500 } ; + unsigned int i ; + + cue_test ("cue.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; + cue_test ("cue.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_24) ; + + for (i = 0 ; i < ARRAY_LEN (cuecounts) ; i++) + { cue_test_var ("cue.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16, cuecounts [i]) ; + cue_test_var ("cue.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_24, cuecounts [i]) ; + } ; + + test_count ++ ; + } ; + + if (do_all || strcmp (argv [1], "current_sf_info") == 0) + { current_sf_info_test ("current.wav") ; + test_count ++ ; + } ; + + if (do_all || strcmp (argv [1], "bext") == 0) + { broadcast_test ("broadcast.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; + broadcast_rdwr_test ("broadcast.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; + + broadcast_test ("broadcast.wavex", SF_FORMAT_WAVEX | SF_FORMAT_PCM_16) ; + broadcast_rdwr_test ("broadcast.wavex", SF_FORMAT_WAVEX | SF_FORMAT_PCM_16) ; + + broadcast_test ("broadcast.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ; + broadcast_rdwr_test ("broadcast.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ; + test_count ++ ; + } ; + + if (do_all || strcmp (argv [1], "cart") == 0) + { cart_test ("cart.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; + cart_rdwr_test ("cart.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; + cart_test ("cart.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ; + cart_rdwr_test ("cart.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ; + test_count ++ ; + } ; + + if (do_all || strcmp (argv [1], "bextch") == 0) + { broadcast_coding_history_test ("coding_history.wav") ; + broadcast_coding_history_size ("coding_hist_size.wav") ; + test_count ++ ; + } ; + + if (do_all || strcmp (argv [1], "chanmap") == 0) + { channel_map_test ("chanmap.wavex", SF_FORMAT_WAVEX | SF_FORMAT_PCM_16) ; + channel_map_test ("chanmap.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ; + channel_map_test ("chanmap.aifc" , SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ; + channel_map_test ("chanmap.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_16) ; + test_count ++ ; + } ; + + if (do_all || strcmp (argv [1], "rawend") == 0) + { raw_needs_endswap_test ("raw_end.wav", SF_FORMAT_WAV) ; + raw_needs_endswap_test ("raw_end.wavex", SF_FORMAT_WAVEX) ; + raw_needs_endswap_test ("raw_end.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV) ; + raw_needs_endswap_test ("raw_end.aiff", SF_FORMAT_AIFF) ; + raw_needs_endswap_test ("raw_end.aiff_le", SF_ENDIAN_LITTLE | SF_FORMAT_AIFF) ; + test_count ++ ; + } ; + + if (test_count == 0) + { printf ("Mono : ************************************\n") ; + printf ("Mono : * No '%s' test defined.\n", argv [1]) ; + printf ("Mono : ************************************\n") ; + return 1 ; + } ; + + return 0 ; +} /* main */ + +/*============================================================================================ +** Here are the test functions. +*/ + +static void +float_norm_test (const char *filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + unsigned int k ; + + print_test_name ("float_norm_test", filename) ; + + sfinfo.samplerate = 44100 ; + sfinfo.format = (SF_FORMAT_RAW | SF_FORMAT_PCM_16) ; + sfinfo.channels = 1 ; + sfinfo.frames = BUFFER_LEN ; + + /* Create float_data with all values being less than 1.0. */ + for (k = 0 ; k < BUFFER_LEN / 2 ; k++) + float_data [k] = (k + 5) / (2.0 * BUFFER_LEN) ; + for (k = BUFFER_LEN / 2 ; k < BUFFER_LEN ; k++) + float_data [k] = (k + 5) ; + + if (! (file = sf_open (filename, SFM_WRITE, &sfinfo))) + { printf ("Line %d: sf_open_write failed with error : ", __LINE__) ; + fflush (stdout) ; + puts (sf_strerror (NULL)) ; + exit (1) ; + } ; + + /* Normalisation is on by default so no need to do anything here. */ + + if ((k = sf_write_float (file, float_data, BUFFER_LEN / 2)) != BUFFER_LEN / 2) + { printf ("Line %d: sf_write_float failed with short write (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; + exit (1) ; + } ; + + /* Turn normalisation off. */ + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + + if ((k = sf_write_float (file, float_data + BUFFER_LEN / 2, BUFFER_LEN / 2)) != BUFFER_LEN / 2) + { printf ("Line %d: sf_write_float failed with short write (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; + exit (1) ; + } ; + + sf_close (file) ; + + /* sfinfo struct should still contain correct data. */ + if (! (file = sf_open (filename, SFM_READ, &sfinfo))) + { printf ("Line %d: sf_open_read failed with error : ", __LINE__) ; + fflush (stdout) ; + puts (sf_strerror (NULL)) ; + exit (1) ; + } ; + + if (sfinfo.format != (SF_FORMAT_RAW | SF_FORMAT_PCM_16)) + { printf ("Line %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, (SF_FORMAT_RAW | SF_FORMAT_PCM_16), sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != BUFFER_LEN) + { printf ("\n\nLine %d: Incorrect number of.frames in file. (%d => %" PRId64 ")\n", __LINE__, BUFFER_LEN, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("Line %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + /* Read float_data and check that it is normalised (ie default). */ + if ((k = sf_read_float (file, float_data, BUFFER_LEN)) != BUFFER_LEN) + { printf ("\n\nLine %d: sf_read_float failed with short read (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; + exit (1) ; + } ; + + for (k = 0 ; k < BUFFER_LEN ; k++) + if (float_data [k] >= 1.0) + { printf ("\n\nLine %d: float_data [%d] == %f which is greater than 1.0\n", __LINE__, k, float_data [k]) ; + exit (1) ; + } ; + + /* Seek to start of file, turn normalisation off, read float_data and check again. */ + sf_seek (file, 0, SEEK_SET) ; + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + + if ((k = sf_read_float (file, float_data, BUFFER_LEN)) != BUFFER_LEN) + { printf ("\n\nLine %d: sf_read_float failed with short read (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; + exit (1) ; + } ; + + for (k = 0 ; k < BUFFER_LEN ; k++) + if (float_data [k] < 1.0) + { printf ("\n\nLine %d: float_data [%d] == %f which is less than 1.0\n", __LINE__, k, float_data [k]) ; + exit (1) ; + } ; + + /* Seek to start of file, turn normalisation on, read float_data and do final check. */ + sf_seek (file, 0, SEEK_SET) ; + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_TRUE) ; + + if ((k = sf_read_float (file, float_data, BUFFER_LEN)) != BUFFER_LEN) + { printf ("\n\nLine %d: sf_read_float failed with short read (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; + exit (1) ; + } ; + + for (k = 0 ; k < BUFFER_LEN ; k++) + if (float_data [k] > 1.0) + { printf ("\n\nLine %d: float_data [%d] == %f which is greater than 1.0\n", __LINE__, k, float_data [k]) ; + exit (1) ; + } ; + + + sf_close (file) ; + + unlink (filename) ; + + printf ("ok\n") ; +} /* float_norm_test */ + +static void +double_norm_test (const char *filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + unsigned int k ; + + print_test_name ("double_norm_test", filename) ; + + sfinfo.samplerate = 44100 ; + sfinfo.format = (SF_FORMAT_RAW | SF_FORMAT_PCM_16) ; + sfinfo.channels = 1 ; + sfinfo.frames = BUFFER_LEN ; + + /* Create double_data with all values being less than 1.0. */ + for (k = 0 ; k < BUFFER_LEN / 2 ; k++) + double_data [k] = (k + 5) / (2.0 * BUFFER_LEN) ; + for (k = BUFFER_LEN / 2 ; k < BUFFER_LEN ; k++) + double_data [k] = (k + 5) ; + + if (! (file = sf_open (filename, SFM_WRITE, &sfinfo))) + { printf ("Line %d: sf_open_write failed with error : ", __LINE__) ; + fflush (stdout) ; + puts (sf_strerror (NULL)) ; + exit (1) ; + } ; + + /* Normailsation is on by default so no need to do anything here. */ + /*-sf_command (file, "set-norm-double", "true", 0) ;-*/ + + if ((k = sf_write_double (file, double_data, BUFFER_LEN / 2)) != BUFFER_LEN / 2) + { printf ("Line %d: sf_write_double failed with short write (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; + exit (1) ; + } ; + + /* Turn normalisation off. */ + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + + if ((k = sf_write_double (file, double_data + BUFFER_LEN / 2, BUFFER_LEN / 2)) != BUFFER_LEN / 2) + { printf ("Line %d: sf_write_double failed with short write (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; + exit (1) ; + } ; + + sf_close (file) ; + + if (! (file = sf_open (filename, SFM_READ, &sfinfo))) + { printf ("Line %d: sf_open_read failed with error : ", __LINE__) ; + fflush (stdout) ; + puts (sf_strerror (NULL)) ; + exit (1) ; + } ; + + if (sfinfo.format != (SF_FORMAT_RAW | SF_FORMAT_PCM_16)) + { printf ("Line %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, (SF_FORMAT_RAW | SF_FORMAT_PCM_16), sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != BUFFER_LEN) + { printf ("\n\nLine %d: Incorrect number of.frames in file. (%d => %" PRId64 ")\n", __LINE__, BUFFER_LEN, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("Line %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + /* Read double_data and check that it is normalised (ie default). */ + if ((k = sf_read_double (file, double_data, BUFFER_LEN)) != BUFFER_LEN) + { printf ("\n\nLine %d: sf_read_double failed with short read (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; + exit (1) ; + } ; + + for (k = 0 ; k < BUFFER_LEN ; k++) + if (double_data [k] >= 1.0) + { printf ("\n\nLine %d: double_data [%d] == %f which is greater than 1.0\n", __LINE__, k, double_data [k]) ; + exit (1) ; + } ; + + /* Seek to start of file, turn normalisation off, read double_data and check again. */ + sf_seek (file, 0, SEEK_SET) ; + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + + if ((k = sf_read_double (file, double_data, BUFFER_LEN)) != BUFFER_LEN) + { printf ("\n\nLine %d: sf_read_double failed with short read (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; + exit (1) ; + } ; + + for (k = 0 ; k < BUFFER_LEN ; k++) + if (double_data [k] < 1.0) + { printf ("\n\nLine %d: double_data [%d] == %f which is less than 1.0\n", __LINE__, k, double_data [k]) ; + exit (1) ; + } ; + + /* Seek to start of file, turn normalisation on, read double_data and do final check. */ + sf_seek (file, 0, SEEK_SET) ; + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_TRUE) ; + + if ((k = sf_read_double (file, double_data, BUFFER_LEN)) != BUFFER_LEN) + { printf ("\n\nLine %d: sf_read_double failed with short read (%d ->%d)\n", __LINE__, BUFFER_LEN, k) ; + exit (1) ; + } ; + + for (k = 0 ; k < BUFFER_LEN ; k++) + if (double_data [k] > 1.0) + { printf ("\n\nLine %d: double_data [%d] == %f which is greater than 1.0\n", __LINE__, k, double_data [k]) ; + exit (1) ; + } ; + + + sf_close (file) ; + + unlink (filename) ; + + printf ("ok\n") ; +} /* double_norm_test */ + +static void +format_tests (void) +{ SF_FORMAT_INFO format_info ; + SF_INFO sfinfo ; + const char *last_name ; + int k, count ; + + print_test_name ("format_tests", "(null)") ; + + /* Clear out SF_INFO struct and set channels > 0. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.channels = 1 ; + + /* First test simple formats. */ + + sf_command (NULL, SFC_GET_SIMPLE_FORMAT_COUNT, &count, sizeof (int)) ; + + if (count < 0 || count > 30) + { printf ("Line %d: Weird count.\n", __LINE__) ; + exit (1) ; + } ; + + format_info.format = 0 ; + sf_command (NULL, SFC_GET_SIMPLE_FORMAT, &format_info, sizeof (format_info)) ; + + last_name = format_info.name ; + for (k = 1 ; k < count ; k ++) + { format_info.format = k ; + sf_command (NULL, SFC_GET_SIMPLE_FORMAT, &format_info, sizeof (format_info)) ; + if (strcmp (last_name, format_info.name) >= 0) + { printf ("\n\nLine %d: format names out of sequence `%s' < `%s'.\n", __LINE__, last_name, format_info.name) ; + exit (1) ; + } ; + sfinfo.format = format_info.format ; + + if (! sf_format_check (&sfinfo)) + { printf ("\n\nLine %d: sf_format_check failed.\n", __LINE__) ; + printf (" Name : %s\n", format_info.name) ; + printf (" Format : 0x%X\n", sfinfo.format) ; + printf (" Channels : 0x%X\n", sfinfo.channels) ; + printf (" Sample Rate : 0x%X\n", sfinfo.samplerate) ; + exit (1) ; + } ; + last_name = format_info.name ; + } ; + format_info.format = 666 ; + sf_command (NULL, SFC_GET_SIMPLE_FORMAT, &format_info, sizeof (format_info)) ; + + /* Now test major formats. */ + sf_command (NULL, SFC_GET_FORMAT_MAJOR_COUNT, &count, sizeof (int)) ; + + if (count < 0 || count > 30) + { printf ("Line %d: Weird count.\n", __LINE__) ; + exit (1) ; + } ; + + format_info.format = 0 ; + sf_command (NULL, SFC_GET_FORMAT_MAJOR, &format_info, sizeof (format_info)) ; + + last_name = format_info.name ; + for (k = 1 ; k < count ; k ++) + { format_info.format = k ; + sf_command (NULL, SFC_GET_FORMAT_MAJOR, &format_info, sizeof (format_info)) ; + if (strcmp (last_name, format_info.name) >= 0) + { printf ("\n\nLine %d: format names out of sequence (%d) `%s' < `%s'.\n", __LINE__, k, last_name, format_info.name) ; + exit (1) ; + } ; + + last_name = format_info.name ; + } ; + format_info.format = 666 ; + sf_command (NULL, SFC_GET_FORMAT_MAJOR, &format_info, sizeof (format_info)) ; + + /* Now test subtype formats. */ + sf_command (NULL, SFC_GET_FORMAT_SUBTYPE_COUNT, &count, sizeof (int)) ; + + if (count < 0 || count > 30) + { printf ("Line %d: Weird count.\n", __LINE__) ; + exit (1) ; + } ; + + format_info.format = 0 ; + sf_command (NULL, SFC_GET_FORMAT_SUBTYPE, &format_info, sizeof (format_info)) ; + + last_name = format_info.name ; + for (k = 1 ; k < count ; k ++) + { format_info.format = k ; + sf_command (NULL, SFC_GET_FORMAT_SUBTYPE, &format_info, sizeof (format_info)) ; + } ; + format_info.format = 666 ; + sf_command (NULL, SFC_GET_FORMAT_SUBTYPE, &format_info, sizeof (format_info)) ; + + + printf ("ok\n") ; +} /* format_tests */ + +static void +calc_peak_test (int filetype, const char *filename, int channels) +{ SNDFILE *file ; + SF_INFO sfinfo ; + char label [128] ; + int k, format ; + sf_count_t buffer_len, frame_count ; + double peak ; + + snprintf (label, sizeof (label), "calc_peak_test (%d channels)", channels) ; + print_test_name (label, filename) ; + + format = filetype | SF_FORMAT_PCM_16 ; + + buffer_len = BUFFER_LEN - (BUFFER_LEN % channels) ; + frame_count = buffer_len / channels ; + + sfinfo.samplerate = 44100 ; + sfinfo.format = format ; + sfinfo.channels = channels ; + sfinfo.frames = frame_count ; + + /* Create double_data with max value of 0.5. */ + for (k = 0 ; k < buffer_len ; k++) + double_data [k] = (k + 1) / (2.0 * buffer_len) ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + test_writef_double_or_die (file, 0, double_data, frame_count, __LINE__) ; + + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != format) + { printf ("Line %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != frame_count) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%" PRId64 " => %" PRId64 ")\n", __LINE__, frame_count, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != channels) + { printf ("Line %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + sf_command (file, SFC_CALC_SIGNAL_MAX, &peak, sizeof (peak)) ; + if (fabs (peak - (1 << 14)) > 1.0) + { printf ("Line %d : Peak value should be %d (is %f).\n", __LINE__, (1 << 14), peak) ; + exit (1) ; + } ; + + sf_command (file, SFC_CALC_NORM_SIGNAL_MAX, &peak, sizeof (peak)) ; + if (fabs (peak - 0.5) > 4e-5) + { printf ("Line %d : Peak value should be %f (is %f).\n", __LINE__, 0.5, peak) ; + exit (1) ; + } ; + + sf_close (file) ; + + format = (filetype | SF_FORMAT_FLOAT) ; + sfinfo.samplerate = 44100 ; + sfinfo.format = format ; + sfinfo.channels = channels ; + sfinfo.frames = frame_count ; + + /* Create double_data with max value of 0.5. */ + for (k = 0 ; k < buffer_len ; k++) + double_data [k] = (k + 1) / (2.0 * buffer_len) ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + test_writef_double_or_die (file, 0, double_data, frame_count, __LINE__) ; + + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != format) + { printf ("Line %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != frame_count) + { printf ("\n\nLine %d: Incorrect number of.frames in file. (%" PRId64 " => %" PRId64 ")\n", __LINE__, frame_count, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != channels) + { printf ("Line %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + sf_command (file, SFC_CALC_SIGNAL_MAX, &peak, sizeof (peak)) ; + if (fabs (peak - 0.5) > 1e-5) + { printf ("Line %d : Peak value should be %f (is %f).\n", __LINE__, 0.5, peak) ; + exit (1) ; + } ; + + sf_command (file, SFC_CALC_NORM_SIGNAL_MAX, &peak, sizeof (peak)) ; + if (fabs (peak - 0.5) > 1e-5) + { printf ("Line %d : Peak value should be %f (is %f).\n", __LINE__, 0.5, peak) ; + exit (1) ; + } ; + + sf_close (file) ; + + unlink (filename) ; + + printf ("ok\n") ; +} /* calc_peak_test */ + +static void +truncate_test (const char *filename, int filetype) +{ SNDFILE *file ; + SF_INFO sfinfo ; + sf_count_t len ; + + print_test_name ("truncate_test", filename) ; + + sfinfo.samplerate = 11025 ; + sfinfo.format = filetype ; + sfinfo.channels = 2 ; + + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_int_or_die (file, 0, int_data, BUFFER_LEN, __LINE__) ; + + len = 100 ; + if (sf_command (file, SFC_FILE_TRUNCATE, &len, sizeof (len))) + { printf ("Line %d: sf_command (SFC_FILE_TRUNCATE) returned error.\n", __LINE__) ; + exit (1) ; + } ; + + test_seek_or_die (file, 0, SEEK_CUR, len, 2, __LINE__) ; + test_seek_or_die (file, 0, SEEK_END, len, 2, __LINE__) ; + + sf_close (file) ; + + unlink (filename) ; + puts ("ok") ; +} /* truncate_test */ + +/*------------------------------------------------------------------------------ +*/ + +static void +instrumet_rw_test (const char *filename) +{ SNDFILE *sndfile ; + SF_INFO sfinfo ; + SF_INSTRUMENT inst ; + memset (&sfinfo, 0, sizeof (SF_INFO)) ; + + sndfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ; + + if (sf_command (sndfile, SFC_GET_INSTRUMENT, &inst, sizeof (inst)) == SF_TRUE) + { inst.basenote = 22 ; + + if (sf_command (sndfile, SFC_SET_INSTRUMENT, &inst, sizeof (inst)) == SF_TRUE) + printf ("Sucess: [%s] updated\n", filename) ; + else + printf ("Error: SFC_SET_INSTRUMENT on [%s] [%s]\n", filename, sf_strerror (sndfile)) ; + } + else + printf ("Error: SFC_GET_INSTRUMENT on [%s] [%s]\n", filename, sf_strerror (sndfile)) ; + + + if (sf_command (sndfile, SFC_UPDATE_HEADER_NOW, NULL, 0) != 0) + printf ("Error: SFC_UPDATE_HEADER_NOW on [%s] [%s]\n", filename, sf_strerror (sndfile)) ; + + sf_write_sync (sndfile) ; + sf_close (sndfile) ; + + return ; +} /* instrumet_rw_test */ + +static void +instrument_test (const char *filename, int filetype) +{ static SF_INSTRUMENT write_inst = + { 2, /* gain */ + 3, /* detune */ + 4, /* basenote */ + 5, 6, /* key low and high */ + 7, 8, /* velocity low and high */ + 2, /* loop_count */ + { { 801, 2, 3, 0 }, + { 801, 3, 4, 0 }, + } + } ; + SF_INSTRUMENT read_inst ; + SNDFILE *file ; + SF_INFO sfinfo ; + + print_test_name ("instrument_test", filename) ; + + sfinfo.samplerate = 11025 ; + sfinfo.format = filetype ; + sfinfo.channels = 1 ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + if (sf_command (file, SFC_SET_INSTRUMENT, &write_inst, sizeof (write_inst)) == SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_SET_INSTRUMENT) failed.\n\n", __LINE__) ; + exit (1) ; + } ; + test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; + sf_close (file) ; + + memset (&read_inst, 0, sizeof (read_inst)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + if (sf_command (file, SFC_GET_INSTRUMENT, &read_inst, sizeof (read_inst)) == SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_GET_INSTRUMENT) failed.\n\n", __LINE__) ; + exit (1) ; + return ; + } ; + check_log_buffer_or_die (file, __LINE__) ; + sf_close (file) ; + + if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_WAV) + { /* + ** For all the fields that WAV doesn't support, modify the + ** write_inst struct to hold the default value that the WAV + ** module should hold. + */ + write_inst.key_lo = write_inst.velocity_lo = 0 ; + write_inst.key_hi = write_inst.velocity_hi = 127 ; + write_inst.gain = 1 ; + } ; + + if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_XI) + { /* + ** For all the fields that XI doesn't support, modify the + ** write_inst struct to hold the default value that the XI + ** module should hold. + */ + write_inst.basenote = 0 ; + write_inst.detune = 0 ; + write_inst.key_lo = write_inst.velocity_lo = 0 ; + write_inst.key_hi = write_inst.velocity_hi = 127 ; + write_inst.gain = 1 ; + } ; + + if (memcmp (&write_inst, &read_inst, sizeof (write_inst)) != 0) + { printf ("\n\nLine %d : instrument comparison failed.\n\n", __LINE__) ; + printf ("W Base Note : %u\n" + " Detune : %u\n" + " Low Note : %u\tHigh Note : %u\n" + " Low Vel. : %u\tHigh Vel. : %u\n" + " Gain : %d\tCount : %d\n" + " mode : %d\n" + " start : %d\tend : %d\tcount :%d\n" + " mode : %d\n" + " start : %d\tend : %d\tcount :%d\n\n", + write_inst.basenote, + write_inst.detune, + write_inst.key_lo, write_inst.key_hi, + write_inst.velocity_lo, write_inst.velocity_hi, + write_inst.gain, write_inst.loop_count, + write_inst.loops [0].mode, write_inst.loops [0].start, + write_inst.loops [0].end, write_inst.loops [0].count, + write_inst.loops [1].mode, write_inst.loops [1].start, + write_inst.loops [1].end, write_inst.loops [1].count) ; + printf ("R Base Note : %u\n" + " Detune : %u\n" + " Low Note : %u\tHigh Note : %u\n" + " Low Vel. : %u\tHigh Vel. : %u\n" + " Gain : %d\tCount : %d\n" + " mode : %d\n" + " start : %d\tend : %d\tcount :%d\n" + " mode : %d\n" + " start : %d\tend : %d\tcount :%d\n\n", + read_inst.basenote, + read_inst.detune, + read_inst.key_lo, read_inst.key_hi, + read_inst.velocity_lo, read_inst.velocity_hi, + read_inst.gain, read_inst.loop_count, + read_inst.loops [0].mode, read_inst.loops [0].start, + read_inst.loops [0].end, read_inst.loops [0].count, + read_inst.loops [1].mode, read_inst.loops [1].start, + read_inst.loops [1].end, read_inst.loops [1].count) ; + + if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_XI) + exit (1) ; + } ; + + if (0) instrumet_rw_test (filename) ; + + unlink (filename) ; + puts ("ok") ; +} /* instrument_test */ + +static void +print_cue (SF_CUES *cue, int i) +{ + printf (" indx[%d] : %d\n" + " position : %u\n" + " fcc_chunk : %x\n" + " chunk_start : %d\n" + " block_start : %d\n" + " sample_offset : %u\n" + " name : %s\n", + i, + cue->cue_points [i].indx, + cue->cue_points [i].position, + cue->cue_points [i].fcc_chunk, + cue->cue_points [i].chunk_start, + cue->cue_points [i].block_start, + cue->cue_points [i].sample_offset, + cue->cue_points [i].name) ; +} + +static int +cue_compare (SF_CUES *write_cue, SF_CUES *read_cue, size_t cue_size, int line) +{ + if (memcmp (write_cue, read_cue, cue_size) != 0) + { + printf ("\n\nLine %d : cue comparison failed.\n\n", line) ; + printf ("W Cue count : %d\n", write_cue->cue_count) ; + if (write_cue->cue_count > 0) + print_cue (write_cue, 0) ; + if (write_cue->cue_count > 2) /* print last if at least 2 */ + print_cue (write_cue, write_cue->cue_count - 1) ; + + printf ("R Cue count : %d\n", read_cue->cue_count) ; + if (read_cue->cue_count > 0) + print_cue (read_cue, 0) ; + if (read_cue->cue_count > 2) /* print last if at least 2 */ + print_cue (read_cue, read_cue->cue_count - 1) ; + + return SF_FALSE ; + } ; + + return SF_TRUE ; +} /* cue_compare */ + +static void +cue_rw_test (const char *filename) +{ SNDFILE *sndfile ; + SF_INFO sfinfo ; + SF_CUES cues ; + memset (&sfinfo, 0, sizeof (SF_INFO)) ; + + sndfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ; + + exit_if_true ( + sf_command (sndfile, SFC_GET_CUE_COUNT, &cues.cue_count, sizeof (cues.cue_count)) != SF_TRUE, + "\nLine %d: SFC_GET_CUE_COUNT command failed.\n\n", __LINE__ + ) ; + + exit_if_true ( + cues.cue_count != 3, + "\nLine %d: Expected cue_count (%u) to be 3.\n\n", __LINE__, cues.cue_count + ) ; + + if (sf_command (sndfile, SFC_GET_CUE, &cues, sizeof (cues)) == SF_TRUE) + { cues.cue_points [1].sample_offset = 3 ; + + if (sf_command (sndfile, SFC_SET_CUE, &cues, sizeof (cues)) == SF_TRUE) + printf ("Sucess: [%s] updated\n", filename) ; + else + printf ("Error: SFC_SET_CUE on [%s] [%s]\n", filename, sf_strerror (sndfile)) ; + } + else + printf ("Error: SFC_GET_CUE on [%s] [%s]\n", filename, sf_strerror (sndfile)) ; + + + if (sf_command (sndfile, SFC_UPDATE_HEADER_NOW, NULL, 0) != 0) + printf ("Error: SFC_UPDATE_HEADER_NOW on [%s] [%s]\n", filename, sf_strerror (sndfile)) ; + + sf_write_sync (sndfile) ; + sf_close (sndfile) ; + + return ; +} /* cue_rw_test */ + +static void +cue_test (const char *filename, int filetype) +{ SF_CUES write_cue ; + SF_CUES read_cue ; + SNDFILE *file ; + SF_INFO sfinfo ; + + if (filetype == (SF_FORMAT_WAV | SF_FORMAT_PCM_16)) + { write_cue = (SF_CUES) + { 2, /* cue_count */ + { { 1, 0, data_MARKER, 0, 0, 1, "" }, + { 2, 0, data_MARKER, 0, 0, 2, "" }, + } + } ; + } + else + { write_cue = (SF_CUES) + { 2, /* cue_count */ + { { 1, 0, data_MARKER, 0, 0, 1, "Cue1" }, + { 2, 0, data_MARKER, 0, 0, 2, "Cue2" }, + } + } ; + } + + print_test_name ("cue_test", filename) ; + + sfinfo.samplerate = 11025 ; + sfinfo.format = filetype ; + sfinfo.channels = 1 ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + if (sf_command (file, SFC_SET_CUE, &write_cue, sizeof (write_cue)) == SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_SET_CUE) failed.\n\n", __LINE__) ; + exit (1) ; + } ; + test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; + sf_close (file) ; + + memset (&read_cue, 0, sizeof (read_cue)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + if (sf_command (file, SFC_GET_CUE, &read_cue, sizeof (read_cue)) == SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_GET_CUE) failed.\n\n", __LINE__) ; + exit (1) ; + return ; + } ; + check_log_buffer_or_die (file, __LINE__) ; + sf_close (file) ; + + if (cue_compare (&write_cue, &read_cue, sizeof (write_cue), __LINE__) == SF_FALSE) + exit (1) ; + + if (0) cue_rw_test (filename) ; + + unlink (filename) ; + puts ("ok") ; +} /* cue_test */ + +/* calculate size of SF_CUES struct given number of cues */ +#define SF_CUES_SIZE(count) (sizeof (uint32_t) + sizeof (SF_CUE_POINT) * (count)) + +static void +cue_test_var (const char *filename, int filetype, int count) +{ size_t cues_size = SF_CUES_SIZE (count) ; + SF_CUES *write_cue = calloc (1, cues_size) ; + SF_CUES *read_cue = calloc (1, cues_size) ; + SNDFILE *file ; + SF_INFO sfinfo ; + char name [40] ; + int i ; + + snprintf (name, sizeof (name), "cue_test_var %d", count) ; + print_test_name (name, filename) ; + + if (write_cue == NULL || read_cue == NULL) + { printf ("ok (can't alloc)\n") ; + return ; + } ; + + write_cue->cue_count = count ; + for (i = 0 ; i < count ; i++) + { write_cue->cue_points [i] = (SF_CUE_POINT) { i, 0, data_MARKER, 0, 0, i, "" } ; + if (filetype == (SF_FORMAT_AIFF | SF_FORMAT_PCM_24)) + snprintf (write_cue->cue_points [i].name, sizeof (write_cue->cue_points [i].name), "Cue%03d", i) ; + } ; + + sfinfo.samplerate = 11025 ; + sfinfo.format = filetype ; + sfinfo.channels = 1 ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + if (sf_command (file, SFC_SET_CUE, write_cue, cues_size) == SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_SET_CUE) failed with %d cues, datasize %zu --> error: %s\n\n", __LINE__, count, cues_size, sf_strerror (file)) ; + exit (1) ; + } ; + test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; + sf_close (file) ; + + memset (read_cue, 0, cues_size) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sf_command (file, SFC_GET_CUE, read_cue, cues_size) == SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_GET_CUE) failed with %d cues, datasize %zu --> error: %s\n\n", __LINE__, count, cues_size, sf_strerror (file)) ; + exit (1) ; + } ; + check_log_buffer_or_die (file, __LINE__) ; + sf_close (file) ; + + if (cue_compare (write_cue, read_cue, cues_size, __LINE__) == SF_FALSE) + { printf ("\n\nLine %d : cue_compare failed.\n\n", __LINE__) ; + exit (1) ; + } ; + + free (write_cue) ; + free (read_cue) ; + unlink (filename) ; + puts ("ok") ; +} /* cue_test_var */ + +static void +current_sf_info_test (const char *filename) +{ SNDFILE *outfile, *infile ; + SF_INFO outinfo, ininfo ; + + print_test_name ("current_sf_info_test", filename) ; + + outinfo.samplerate = 44100 ; + outinfo.format = (SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; + outinfo.channels = 1 ; + outinfo.frames = 0 ; + + outfile = test_open_file_or_die (filename, SFM_WRITE, &outinfo, SF_TRUE, __LINE__) ; + sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, 0) ; + + exit_if_true (outinfo.frames != 0, + "\n\nLine %d : Initial sfinfo.frames is not zero.\n\n", __LINE__ + ) ; + + test_write_double_or_die (outfile, 0, double_data, BUFFER_LEN, __LINE__) ; + sf_command (outfile, SFC_GET_CURRENT_SF_INFO, &outinfo, sizeof (outinfo)) ; + + exit_if_true (outinfo.frames != BUFFER_LEN, + "\n\nLine %d : Initial sfinfo.frames (%" PRId64 ") should be %d.\n\n", __LINE__, + outinfo.frames, BUFFER_LEN + ) ; + + /* Read file making sure no channel map exists. */ + memset (&ininfo, 0, sizeof (ininfo)) ; + infile = test_open_file_or_die (filename, SFM_READ, &ininfo, SF_TRUE, __LINE__) ; + + test_write_double_or_die (outfile, 0, double_data, BUFFER_LEN, __LINE__) ; + + sf_command (infile, SFC_GET_CURRENT_SF_INFO, &ininfo, sizeof (ininfo)) ; + + exit_if_true (ininfo.frames != BUFFER_LEN, + "\n\nLine %d : Initial sfinfo.frames (%" PRId64 ") should be %d.\n\n", __LINE__, + ininfo.frames, BUFFER_LEN + ) ; + + sf_close (outfile) ; + sf_close (infile) ; + + unlink (filename) ; + puts ("ok") ; +} /* current_sf_info_test */ + +static void +broadcast_test (const char *filename, int filetype) +{ static SF_BROADCAST_INFO bc_write, bc_read ; + SNDFILE *file ; + SF_INFO sfinfo ; + int errors = 0 ; + + print_test_name ("broadcast_test", filename) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 11025 ; + sfinfo.format = filetype ; + sfinfo.channels = 1 ; + + memset (&bc_write, 0, sizeof (bc_write)) ; + + snprintf (bc_write.description, sizeof (bc_write.description), "Test description") ; + snprintf (bc_write.originator, sizeof (bc_write.originator), "Test originator") ; + snprintf (bc_write.originator_reference, sizeof (bc_write.originator_reference), "%08x-%08x", (unsigned int) time (NULL), (unsigned int) (~ time (NULL))) ; + snprintf (bc_write.origination_date, sizeof (bc_write.origination_date), "%d/%02d/%02d", 2006, 3, 30) ; + snprintf (bc_write.origination_time, sizeof (bc_write.origination_time), "%02d:%02d:%02d", 20, 27, 0) ; + snprintf (bc_write.umid, sizeof (bc_write.umid), "Some umid") ; + bc_write.coding_history_size = 0 ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + if (sf_command (file, SFC_SET_BROADCAST_INFO, &bc_write, sizeof (bc_write)) == SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ; + exit (1) ; + } ; + test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; + sf_close (file) ; + + memset (&bc_read, 0, sizeof (bc_read)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + if (sf_command (file, SFC_GET_BROADCAST_INFO, &bc_read, sizeof (bc_read)) == SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_GET_BROADCAST_INFO) failed.\n\n", __LINE__) ; + exit (1) ; + return ; + } ; + check_log_buffer_or_die (file, __LINE__) ; + sf_close (file) ; + + if (bc_read.version != 2) + { printf ("\n\nLine %d : Read bad version number %d.\n\n", __LINE__, bc_read.version) ; + exit (1) ; + return ; + } ; + + bc_read.version = bc_write.version = 0 ; + + if (memcmp (bc_write.description, bc_read.description, sizeof (bc_write.description)) != 0) + { printf ("\n\nLine %d : description mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, bc_write.description, bc_read.description) ; + errors ++ ; + } ; + + if (memcmp (bc_write.originator, bc_read.originator, sizeof (bc_write.originator)) != 0) + { printf ("\n\nLine %d : originator mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, bc_write.originator, bc_read.originator) ; + errors ++ ; + } ; + + if (memcmp (bc_write.originator_reference, bc_read.originator_reference, sizeof (bc_write.originator_reference)) != 0) + { printf ("\n\nLine %d : originator_reference mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, bc_write.originator_reference, bc_read.originator_reference) ; + errors ++ ; + } ; + + if (memcmp (bc_write.origination_date, bc_read.origination_date, sizeof (bc_write.origination_date)) != 0) + { printf ("\n\nLine %d : origination_date mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, bc_write.origination_date, bc_read.origination_date) ; + errors ++ ; + } ; + + if (memcmp (bc_write.origination_time, bc_read.origination_time, sizeof (bc_write.origination_time)) != 0) + { printf ("\n\nLine %d : origination_time mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, bc_write.origination_time, bc_read.origination_time) ; + errors ++ ; + } ; + + if (memcmp (bc_write.umid, bc_read.umid, sizeof (bc_write.umid)) != 0) + { printf ("\n\nLine %d : umid mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, bc_write.umid, bc_read.umid) ; + errors ++ ; + } ; + + if (errors) + exit (1) ; + + unlink (filename) ; + puts ("ok") ; +} /* broadcast_test */ + +static void +broadcast_rdwr_test (const char *filename, int filetype) +{ SF_BROADCAST_INFO binfo ; + SNDFILE *file ; + SF_INFO sfinfo ; + sf_count_t frames ; + + print_test_name (__func__, filename) ; + + create_short_sndfile (filename, filetype, 2) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + memset (&binfo, 0, sizeof (binfo)) ; + + snprintf (binfo.description, sizeof (binfo.description), "Test description") ; + snprintf (binfo.originator, sizeof (binfo.originator), "Test originator") ; + snprintf (binfo.originator_reference, sizeof (binfo.originator_reference), "%08x-%08x", (unsigned int) time (NULL), (unsigned int) (~ time (NULL))) ; + snprintf (binfo.origination_date, sizeof (binfo.origination_date), "%d/%02d/%02d", 2006, 3, 30) ; + snprintf (binfo.origination_time, sizeof (binfo.origination_time), "%02d:%02d:%02d", 20, 27, 0) ; + snprintf (binfo.umid, sizeof (binfo.umid), "Some umid") ; + binfo.coding_history_size = 0 ; + + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; + frames = sfinfo.frames ; + if (sf_command (file, SFC_SET_BROADCAST_INFO, &binfo, sizeof (binfo)) != SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) should have failed but didn't.\n\n", __LINE__) ; + exit (1) ; + } ; + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_close (file) ; + exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ; + + unlink (filename) ; + puts ("ok") ; +} /* broadcast_rdwr_test */ + +static void +check_coding_history_newlines (const char *filename) +{ static SF_BROADCAST_INFO bc_write, bc_read ; + SNDFILE *file ; + SF_INFO sfinfo ; + unsigned k ; + + sfinfo.samplerate = 22050 ; + sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ; + sfinfo.channels = 1 ; + + memset (&bc_write, 0, sizeof (bc_write)) ; + + snprintf (bc_write.description, sizeof (bc_write.description), "Test description") ; + snprintf (bc_write.originator, sizeof (bc_write.originator), "Test originator") ; + snprintf (bc_write.originator_reference, sizeof (bc_write.originator_reference), "%08x-%08x", (unsigned int) time (NULL), (unsigned int) (~ time (NULL))) ; + snprintf (bc_write.origination_date, sizeof (bc_write.origination_date), "%d/%02d/%02d", 2006, 3, 30) ; + snprintf (bc_write.origination_time, sizeof (bc_write.origination_time), "%02d:%02d:%02d", 20, 27, 0) ; + snprintf (bc_write.umid, sizeof (bc_write.umid), "Some umid") ; + bc_write.coding_history_size = snprintf (bc_write.coding_history, sizeof (bc_write.coding_history), "This has\nUnix\nand\rMac OS9\rline endings.\nLast line") ; ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + if (sf_command (file, SFC_SET_BROADCAST_INFO, &bc_write, sizeof (bc_write)) == SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ; + exit (1) ; + } ; + + test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; + sf_close (file) ; + + memset (&bc_read, 0, sizeof (bc_read)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + if (sf_command (file, SFC_GET_BROADCAST_INFO, &bc_read, sizeof (bc_read)) == SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ; + exit (1) ; + } ; + check_log_buffer_or_die (file, __LINE__) ; + sf_close (file) ; + + if (bc_read.coding_history_size == 0) + { printf ("\n\nLine %d : missing coding history.\n\n", __LINE__) ; + exit (1) ; + } ; + + if (strstr (bc_read.coding_history, "Last line") == NULL) + { printf ("\n\nLine %d : coding history truncated.\n\n", __LINE__) ; + exit (1) ; + } ; + + for (k = 1 ; k < bc_read.coding_history_size ; k++) + { if (bc_read.coding_history [k] == '\n' && bc_read.coding_history [k - 1] != '\r') + { printf ("\n\nLine %d : '\\n' without '\\r' before.\n\n", __LINE__) ; + exit (1) ; + } ; + + if (bc_read.coding_history [k] == '\r' && bc_read.coding_history [k + 1] != '\n') + { printf ("\n\nLine %d : '\\r' without '\\n' after.\n\n", __LINE__) ; + exit (1) ; + } ; + + if (bc_read.coding_history [k] == 0 && k < bc_read.coding_history_size - 1) + { printf ("\n\nLine %d : '\\0' within coding history at index %d of %d.\n\n", __LINE__, k, bc_read.coding_history_size) ; + exit (1) ; + } ; + } ; + + return ; +} /* check_coding_history_newlines */ + +static void +broadcast_coding_history_test (const char *filename) +{ static SF_BROADCAST_INFO bc_write, bc_read ; + SNDFILE *file ; + SF_INFO sfinfo ; + const char *default_history = "A=PCM,F=22050,W=16,M=mono" ; + const char *supplied_history = + "A=PCM,F=44100,W=24,M=mono,T=other\r\n" + "A=PCM,F=22050,W=16,M=mono,T=yet_another\r\n" ; + + print_test_name ("broadcast_coding_history_test", filename) ; + + sfinfo.samplerate = 22050 ; + sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ; + sfinfo.channels = 1 ; + + memset (&bc_write, 0, sizeof (bc_write)) ; + + snprintf (bc_write.description, sizeof (bc_write.description), "Test description") ; + snprintf (bc_write.originator, sizeof (bc_write.originator), "Test originator") ; + snprintf (bc_write.originator_reference, sizeof (bc_write.originator_reference), "%08x-%08x", (unsigned int) time (NULL), (unsigned int) (~ time (NULL))) ; + snprintf (bc_write.origination_date, sizeof (bc_write.origination_date), "%d/%02d/%02d", 2006, 3, 30) ; + snprintf (bc_write.origination_time, sizeof (bc_write.origination_time), "%02d:%02d:%02d", 20, 27, 0) ; + snprintf (bc_write.umid, sizeof (bc_write.umid), "Some umid") ; + /* Coding history will be filled in by the library. */ + bc_write.coding_history_size = 0 ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + if (sf_command (file, SFC_SET_BROADCAST_INFO, &bc_write, sizeof (bc_write)) == SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ; + exit (1) ; + } ; + + test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; + sf_close (file) ; + + memset (&bc_read, 0, sizeof (bc_read)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + if (sf_command (file, SFC_GET_BROADCAST_INFO, &bc_read, sizeof (bc_read)) == SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ; + exit (1) ; + } ; + check_log_buffer_or_die (file, __LINE__) ; + sf_close (file) ; + + if (bc_read.coding_history_size == 0) + { printf ("\n\nLine %d : missing coding history.\n\n", __LINE__) ; + exit (1) ; + } ; + + if (bc_read.coding_history_size < strlen (default_history) || memcmp (bc_read.coding_history, default_history, strlen (default_history)) != 0) + { printf ("\n\n" + "Line %d : unexpected coding history '%.*s',\n" + " should be '%s'\n\n", __LINE__, bc_read.coding_history_size, bc_read.coding_history, default_history) ; + exit (1) ; + } ; + + bc_write.coding_history_size = strlen (supplied_history) ; + bc_write.coding_history_size = snprintf (bc_write.coding_history, sizeof (bc_write.coding_history), "%s", supplied_history) ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + if (sf_command (file, SFC_SET_BROADCAST_INFO, &bc_write, sizeof (bc_write)) == SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ; + exit (1) ; + } ; + + test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; + sf_close (file) ; + + memset (&bc_read, 0, sizeof (bc_read)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + if (sf_command (file, SFC_GET_BROADCAST_INFO, &bc_read, sizeof (bc_read)) == SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + sf_close (file) ; + + if (strstr (bc_read.coding_history, supplied_history) != bc_read.coding_history) + { printf ("\n\nLine %d : unexpected coding history :\n" + "----------------------------------------------------\n%s" + "----------------------------------------------------\n" + "should be this :\n" + "----------------------------------------------------\n%s" + "----------------------------------------------------\n" + "with one more line at the end.\n\n", + __LINE__, bc_read.coding_history, supplied_history) ; + exit (1) ; + } ; + + check_coding_history_newlines (filename) ; + + unlink (filename) ; + puts ("ok") ; +} /* broadcast_coding_history_test */ + +/*============================================================================== +*/ + +static void +broadcast_coding_history_size (const char *filename) +{ /* SF_BROADCAST_INFO struct with coding_history field of 1024 bytes. */ + static SF_BROADCAST_INFO_VAR (1024) bc_write ; + static SF_BROADCAST_INFO_VAR (1024) bc_read ; + SNDFILE *file ; + SF_INFO sfinfo ; + int k ; + + print_test_name (__func__, filename) ; + + sfinfo.samplerate = 22050 ; + sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ; + sfinfo.channels = 1 ; + + memset (&bc_write, 0, sizeof (bc_write)) ; + + snprintf (bc_write.description, sizeof (bc_write.description), "Test description") ; + snprintf (bc_write.originator, sizeof (bc_write.originator), "Test originator") ; + snprintf (bc_write.originator_reference, sizeof (bc_write.originator_reference), "%08x-%08x", (unsigned int) time (NULL), (unsigned int) (~ time (NULL))) ; + snprintf (bc_write.origination_date, sizeof (bc_write.origination_date), "%d/%02d/%02d", 2006, 3, 30) ; + snprintf (bc_write.origination_time, sizeof (bc_write.origination_time), "%02d:%02d:%02d", 20, 27, 0) ; + snprintf (bc_write.umid, sizeof (bc_write.umid), "Some umid") ; + bc_write.coding_history_size = 0 ; + + for (k = 0 ; bc_write.coding_history_size < 512 ; k++) + { snprintf (bc_write.coding_history + bc_write.coding_history_size, + sizeof (bc_write.coding_history) - bc_write.coding_history_size, "line %4d\n", k) ; + bc_write.coding_history_size = strlen (bc_write.coding_history) ; + } ; + + exit_if_true (bc_write.coding_history_size < 512, + "\n\nLine %d : bc_write.coding_history_size (%d) should be > 512.\n\n", __LINE__, bc_write.coding_history_size) ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + if (sf_command (file, SFC_SET_BROADCAST_INFO, &bc_write, sizeof (bc_write)) == SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ; + exit (1) ; + } ; + + test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; + sf_close (file) ; + + memset (&bc_read, 0, sizeof (bc_read)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + if (sf_command (file, SFC_GET_BROADCAST_INFO, &bc_read, sizeof (bc_read)) == SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_SET_BROADCAST_INFO) failed.\n\n", __LINE__) ; + exit (1) ; + } ; + check_log_buffer_or_die (file, __LINE__) ; + sf_close (file) ; + + exit_if_true (bc_read.coding_history_size < 512, + "\n\nLine %d : unexpected coding history size %d (should be > 512).\n\n", __LINE__, bc_read.coding_history_size) ; + + exit_if_true (strstr (bc_read.coding_history, "libsndfile") == NULL, + "\n\nLine %d : coding history incomplete (should contain 'libsndfile').\n\n", __LINE__) ; + + unlink (filename) ; + puts ("ok") ; +} /* broadcast_coding_history_size */ + +/*============================================================================== +*/ +static void +cart_test (const char *filename, int filetype) +{ static SF_CART_INFO ca_write, ca_read ; + SNDFILE *file ; + SF_INFO sfinfo ; + int errors = 0 ; + + print_test_name ("cart_test", filename) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 11025 ; + sfinfo.format = filetype ; + sfinfo.channels = 1 ; + memset (&ca_write, 0, sizeof (ca_write)) ; + + // example test data + snprintf (ca_write.artist, sizeof (ca_write.artist), "Test artist") ; + snprintf (ca_write.version, sizeof (ca_write.version), "Test version") ; + snprintf (ca_write.cut_id, sizeof (ca_write.cut_id), "Test cut ID") ; + snprintf (ca_write.client_id, sizeof (ca_write.client_id), "Test client ID") ; + snprintf (ca_write.category, sizeof (ca_write.category), "Test category") ; + snprintf (ca_write.classification, sizeof (ca_write.classification), "Test classification") ; + snprintf (ca_write.out_cue, sizeof (ca_write.out_cue), "Test out cue") ; + snprintf (ca_write.start_date, sizeof (ca_write.start_date), "%d/%02d/%02d", 2006, 3, 30) ; + snprintf (ca_write.start_time, sizeof (ca_write.start_time), "%02d:%02d:%02d", 20, 27, 0) ; + snprintf (ca_write.end_date, sizeof (ca_write.end_date), "%d/%02d/%02d", 2006, 3, 30) ; + snprintf (ca_write.end_time, sizeof (ca_write.end_time), "%02d:%02d:%02d", 20, 27, 0) ; + snprintf (ca_write.producer_app_id, sizeof (ca_write.producer_app_id), "Test producer app id") ; + snprintf (ca_write.producer_app_version, sizeof (ca_write.producer_app_version), "Test producer app version") ; + snprintf (ca_write.user_def, sizeof (ca_write.user_def), "test user def test test") ; + ca_write.level_reference = 42 ; + snprintf (ca_write.url, sizeof (ca_write.url), "http://www.test.com/test_url") ; + snprintf (ca_write.tag_text, sizeof (ca_write.tag_text), "tag text test! \r\n") ; // must be terminated \r\n to be valid + ca_write.tag_text_size = strlen (ca_write.tag_text) ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + if (sf_command (file, SFC_SET_CART_INFO, &ca_write, sizeof (ca_write)) == SF_FALSE) + exit (1) ; + + test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; + sf_close (file) ; + + memset (&ca_read, 0, sizeof (ca_read)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + if (sf_command (file, SFC_GET_CART_INFO, &ca_read, sizeof (ca_read)) == SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_GET_CART_INFO) failed.\n\n", __LINE__) ; + exit (1) ; + return ; + } ; + check_log_buffer_or_die (file, __LINE__) ; + sf_close (file) ; + + + if (memcmp (ca_write.artist, ca_read.artist, sizeof (ca_write.artist)) != 0) + { printf ("\n\nLine %d : artist mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.artist, ca_read.artist) ; + errors ++ ; + } ; + + if (memcmp (ca_write.version, ca_read.version, sizeof (ca_write.version)) != 0) + { printf ("\n\nLine %d : version mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.version, ca_read.version) ; + errors ++ ; + } ; + + if (memcmp (ca_write.title, ca_read.title, sizeof (ca_write.title)) != 0) + { printf ("\n\nLine %d : title mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.title, ca_read.title) ; + errors ++ ; + } ; + + if (memcmp (ca_write.cut_id, ca_read.cut_id, sizeof (ca_write.cut_id)) != 0) + { printf ("\n\nLine %d : cut_id mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.cut_id, ca_read.cut_id) ; + errors ++ ; + } ; + + if (memcmp (ca_write.client_id, ca_read.client_id, sizeof (ca_write.client_id)) != 0) + { printf ("\n\nLine %d : client_id mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.client_id, ca_read.client_id) ; + errors ++ ; + } ; + + if (memcmp (ca_write.category, ca_read.category, sizeof (ca_write.category)) != 0) + { printf ("\n\nLine %d : category mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.category, ca_read.category) ; + errors ++ ; + } ; + + if (memcmp (ca_write.out_cue, ca_read.out_cue, sizeof (ca_write.out_cue)) != 0) + { printf ("\n\nLine %d : out_cue mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.out_cue, ca_read.out_cue) ; + errors ++ ; + } ; + + if (memcmp (ca_write.start_date, ca_read.start_date, sizeof (ca_write.start_date)) != 0) + { printf ("\n\nLine %d : start_date mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.start_date, ca_read.start_date) ; + errors ++ ; + } ; + + + if (memcmp (ca_write.start_time, ca_read.start_time, sizeof (ca_write.start_time)) != 0) + { printf ("\n\nLine %d : start_time mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.start_time, ca_read.start_time) ; + errors ++ ; + } ; + + + if (memcmp (ca_write.end_date, ca_read.end_date, sizeof (ca_write.end_date)) != 0) + { printf ("\n\nLine %d : end_date mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.end_date, ca_read.end_date) ; + errors ++ ; + } ; + + + if (memcmp (ca_write.end_time, ca_read.end_time, sizeof (ca_write.end_time)) != 0) + { printf ("\n\nLine %d : end_time mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.end_time, ca_read.end_time) ; + errors ++ ; + } ; + + + if (memcmp (ca_write.producer_app_id, ca_read.producer_app_id, sizeof (ca_write.producer_app_id)) != 0) + { printf ("\n\nLine %d : producer_app_id mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.producer_app_id, ca_read.producer_app_id) ; + errors ++ ; + } ; + + + if (memcmp (ca_write.producer_app_version, ca_read.producer_app_version, sizeof (ca_write.producer_app_version)) != 0) + { printf ("\n\nLine %d : producer_app_version mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.producer_app_version, ca_read.producer_app_version) ; + errors ++ ; + } ; + + + if (memcmp (ca_write.user_def, ca_read.user_def, sizeof (ca_write.user_def)) != 0) + { printf ("\n\nLine %d : user_def mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.user_def, ca_read.user_def) ; + errors ++ ; + } ; + + + if (ca_write.level_reference != ca_read.level_reference) + { printf ("\n\nLine %d : level_reference mismatch :\n\twrite : '%d'\n\tread : '%d'\n\n", __LINE__, ca_write.level_reference, ca_read.level_reference) ; + errors ++ ; + } ; + + // TODO: make this more helpful + if (memcmp (ca_write.post_timers, ca_read.post_timers, sizeof (ca_write.post_timers)) != 0) + { printf ("\n\nLine %d : post_timers mismatch :\n'\n\n", __LINE__) ; + errors ++ ; + } ; + + if (memcmp (ca_write.url, ca_read.url, sizeof (ca_write.url)) != 0) + { printf ("\n\nLine %d : url mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.url, ca_read.url) ; + errors ++ ; + } ; + + + if (memcmp (ca_write.tag_text, ca_read.tag_text, (size_t) (ca_read.tag_text_size)) != 0) + { printf ("\n\nLine %d : tag_text mismatch :\n\twrite : '%s'\n\tread : '%s'\n\n", __LINE__, ca_write.tag_text, ca_read.tag_text) ; + errors ++ ; + } ; + + + if (errors) + exit (1) ; + + unlink (filename) ; + puts ("ok") ; +} /* cart_test */ + +static void +cart_rdwr_test (const char *filename, int filetype) +{ SF_CART_INFO cinfo ; + SNDFILE *file ; + SF_INFO sfinfo ; + sf_count_t frames ; + + print_test_name (__func__, filename) ; + + create_short_sndfile (filename, filetype, 2) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + memset (&cinfo, 0, sizeof (cinfo)) ; + + snprintf (cinfo.artist, sizeof (cinfo.artist), "Test artist") ; + snprintf (cinfo.version, sizeof (cinfo.version), "Test version") ; + snprintf (cinfo.cut_id, sizeof (cinfo.cut_id), "Test cut ID") ; + snprintf (cinfo.client_id, sizeof (cinfo.client_id), "Test client ID") ; + snprintf (cinfo.category, sizeof (cinfo.category), "Test category") ; + snprintf (cinfo.classification, sizeof (cinfo.classification), "Test classification") ; + snprintf (cinfo.out_cue, sizeof (cinfo.out_cue), "Test out cue") ; + snprintf (cinfo.start_date, sizeof (cinfo.start_date), "%d/%02d/%02d", 2006, 3, 30) ; + snprintf (cinfo.start_time, sizeof (cinfo.start_time), "%02d:%02d:%02d", 20, 27, 0) ; + snprintf (cinfo.end_date, sizeof (cinfo.end_date), "%d/%02d/%02d", 2006, 3, 30) ; + snprintf (cinfo.end_time, sizeof (cinfo.end_time), "%02d:%02d:%02d", 20, 27, 0) ; + snprintf (cinfo.producer_app_id, sizeof (cinfo.producer_app_id), "Test producer app id") ; + snprintf (cinfo.producer_app_version, sizeof (cinfo.producer_app_version), "Test producer app version") ; + snprintf (cinfo.user_def, sizeof (cinfo.user_def), "test user def test test") ; + cinfo.level_reference = 42 ; + snprintf (cinfo.url, sizeof (cinfo.url), "http://www.test.com/test_url") ; + snprintf (cinfo.tag_text, sizeof (cinfo.tag_text), "tag text test!\r\n") ; + cinfo.tag_text_size = strlen (cinfo.tag_text) ; + + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; + frames = sfinfo.frames ; + if (sf_command (file, SFC_SET_CART_INFO, &cinfo, sizeof (cinfo)) != SF_FALSE) + { printf ("\n\nLine %d : sf_command (SFC_SET_CART_INFO) should have failed but didn't.\n\n", __LINE__) ; + exit (1) ; + } ; + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_close (file) ; + exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ; + + unlink (filename) ; + puts ("ok") ; +} /* cart_rdwr_test */ + +/*============================================================================== +*/ + +static void +channel_map_test (const char *filename, int filetype) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int channel_map_read [4], channel_map_write [4] = + { SF_CHANNEL_MAP_LEFT, SF_CHANNEL_MAP_RIGHT, SF_CHANNEL_MAP_LFE, + SF_CHANNEL_MAP_REAR_CENTER + } ; + + print_test_name ("channel_map_test", filename) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 11025 ; + sfinfo.format = filetype ; + sfinfo.channels = ARRAY_LEN (channel_map_read) ; + + switch (filetype & SF_FORMAT_TYPEMASK) + { /* WAVEX and RF64 have a default channel map, even if you don't specify one. */ + case SF_FORMAT_WAVEX : + case SF_FORMAT_RF64 : + /* Write file without channel map. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; + sf_close (file) ; + + /* Read file making default channel map exists. */ + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + exit_if_true ( + sf_command (file, SFC_GET_CHANNEL_MAP_INFO, channel_map_read, sizeof (channel_map_read)) == SF_FALSE, + "\n\nLine %d : sf_command (SFC_GET_CHANNEL_MAP_INFO) should not have failed.\n\n", __LINE__ + ) ; + check_log_buffer_or_die (file, __LINE__) ; + sf_close (file) ; + break ; + + default : + break ; + } ; + + /* Write file with a channel map. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + exit_if_true ( + sf_command (file, SFC_SET_CHANNEL_MAP_INFO, channel_map_write, sizeof (channel_map_write)) == SF_FALSE, + "\n\nLine %d : sf_command (SFC_SET_CHANNEL_MAP_INFO) failed.\n\n", __LINE__ + ) ; + test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; + sf_close (file) ; + + /* Read file making sure no channel map exists. */ + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + exit_if_true ( + sf_command (file, SFC_GET_CHANNEL_MAP_INFO, channel_map_read, sizeof (channel_map_read)) != SF_TRUE, + "\n\nLine %d : sf_command (SFC_GET_CHANNEL_MAP_INFO) failed.\n\n", __LINE__ + ) ; + check_log_buffer_or_die (file, __LINE__) ; + sf_close (file) ; + + exit_if_true ( + memcmp (channel_map_read, channel_map_write, sizeof (channel_map_read)) != 0, + "\n\nLine %d : Channel map read does not match channel map written.\n\n", __LINE__ + ) ; + + unlink (filename) ; + puts ("ok") ; +} /* channel_map_test */ + +static void +raw_needs_endswap_test (const char *filename, int filetype) +{ static int subtypes [] = + { SF_FORMAT_FLOAT, SF_FORMAT_DOUBLE, + SF_FORMAT_PCM_16, SF_FORMAT_PCM_24, SF_FORMAT_PCM_32 + } ; + SNDFILE *file ; + SF_INFO sfinfo ; + unsigned k ; + int needs_endswap ; + + print_test_name (__func__, filename) ; + + for (k = 0 ; k < ARRAY_LEN (subtypes) ; k++) + { + if (filetype == (SF_ENDIAN_LITTLE | SF_FORMAT_AIFF)) + switch (subtypes [k]) + { /* Little endian AIFF does not AFAIK support fl32 and fl64. */ + case SF_FORMAT_FLOAT : + case SF_FORMAT_DOUBLE : + continue ; + default : + break ; + } ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 11025 ; + sfinfo.format = filetype | subtypes [k] ; + sfinfo.channels = 1 ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_double_or_die (file, 0, double_data, BUFFER_LEN, __LINE__) ; + sf_close (file) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + needs_endswap = sf_command (file, SFC_RAW_DATA_NEEDS_ENDSWAP, NULL, 0) ; + + switch (filetype) + { case SF_FORMAT_WAV : + case SF_FORMAT_WAVEX : + case SF_FORMAT_AIFF | SF_ENDIAN_LITTLE : + exit_if_true (needs_endswap != CPU_IS_BIG_ENDIAN, + "\n\nLine %d : SFC_RAW_DATA_NEEDS_ENDSWAP failed for (%d | %d).\n\n", __LINE__, filetype, k) ; + break ; + + case SF_FORMAT_AIFF : + case SF_FORMAT_WAV | SF_ENDIAN_BIG : + exit_if_true (needs_endswap != CPU_IS_LITTLE_ENDIAN, + "\n\nLine %d : SFC_RAW_DATA_NEEDS_ENDSWAP failed for (%d | %d).\n\n", __LINE__, filetype, k) ; + break ; + + default : + printf ("\n\nLine %d : bad format value %d.\n\n", __LINE__, filetype) ; + exit (1) ; + break ; + } ; + + sf_close (file) ; + } ; + + unlink (filename) ; + puts ("ok") ; +} /* raw_needs_endswap_test */ diff --git a/libsndfile-1.0.31/tests/compression_size_test.c b/libsndfile-1.0.31/tests/compression_size_test.c new file mode 100644 index 0000000..c8f43c8 --- /dev/null +++ b/libsndfile-1.0.31/tests/compression_size_test.c @@ -0,0 +1,211 @@ +/* +** Copyright (C) 2007-2016 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include + +#include "utils.h" +#include "dft_cmp.h" + +#define SAMPLE_RATE 16000 +#define DATA_LENGTH (SAMPLE_RATE) + +static float data_out [DATA_LENGTH] ; + +static inline float +max_float (float a, float b) +{ return a > b ? a : b ; +} /* max_float */ + +static void +vorbis_test (void) +{ static float float_data [DFT_DATA_LENGTH] ; + const char * filename = "vorbis_test.oga" ; + SNDFILE * file ; + SF_INFO sfinfo ; + float max_abs = 0.0 ; + unsigned k ; + + print_test_name ("vorbis_test", filename) ; + + /* Generate float data. */ + gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 1.0) ; + + /* Set up output file type. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ; + sfinfo.channels = 1 ; + sfinfo.samplerate = SAMPLE_RATE ; + + /* Write the output file. */ + + /* The Vorbis encoder has a bug on PowerPC and X86-64 with sample rates + ** <= 22050. Increasing the sample rate to 32000 avoids triggering it. + ** See https://trac.xiph.org/ticket/1229 + */ + if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) + { const char * errstr ; + + errstr = sf_strerror (NULL) ; + if (strstr (errstr, "Sample rate chosen is known to trigger a Vorbis") == NULL) + { printf ("Line %d: sf_open (SFM_WRITE) failed : %s\n", __LINE__, errstr) ; + dump_log_buffer (NULL) ; + exit (1) ; + } ; + + printf ("\n Sample rate -> 32kHz ") ; + sfinfo.samplerate = 32000 ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + } ; + + test_write_float_or_die (file, 0, float_data, ARRAY_LEN (float_data), __LINE__) ; + sf_close (file) ; + + memset (float_data, 0, sizeof (float_data)) ; + + /* Read the file back in again. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + test_read_float_or_die (file, 0, float_data, ARRAY_LEN (float_data), __LINE__) ; + sf_close (file) ; + + for (k = 0 ; k < ARRAY_LEN (float_data) ; k ++) + max_abs = max_float (max_abs, fabs (float_data [k])) ; + + exit_if_true (max_abs > 1.023, + "\n\nLine %d : max_abs %f should be < 1.023.\n\n", __LINE__, max_abs) ; + + puts ("ok") ; + unlink (filename) ; +} /* vorbis_test */ + +static void +compression_size_test (int format, const char * filename) +{ /* + ** Encode two files, one at quality 0.3 and one at quality 0.5 and then + ** make sure that the quality 0.3 files is the smaller of the two. + */ + char q3_fname [64] ; + char q6_fname [64] ; + char test_name [64] ; + + SNDFILE *q3_file, *q6_file ; + SF_INFO sfinfo ; + int q3_size, q6_size ; + double quality ; + int k ; + + snprintf (q3_fname, sizeof (q3_fname), "q3_%s", filename) ; + snprintf (q6_fname, sizeof (q6_fname), "q6_%s", filename) ; + + snprintf (test_name, sizeof (test_name), "q[36]_%s", filename) ; + print_test_name (__func__, test_name) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + /* Set up output file type. */ + sfinfo.format = format ; + sfinfo.channels = 1 ; + sfinfo.samplerate = SAMPLE_RATE ; + + /* Write the output file. */ + q3_file = test_open_file_or_die (q3_fname, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + q6_file = test_open_file_or_die (q6_fname, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + + quality = 0.3 ; + sf_command (q3_file, SFC_SET_VBR_ENCODING_QUALITY, &quality, sizeof (quality)) ; + quality = 0.6 ; + sf_command (q6_file, SFC_SET_VBR_ENCODING_QUALITY, &quality, sizeof (quality)) ; + + for (k = 0 ; k < 5 ; k++) + { gen_lowpass_signal_float (data_out, ARRAY_LEN (data_out)) ; + test_write_float_or_die (q3_file, 0, data_out, ARRAY_LEN (data_out), __LINE__) ; + test_write_float_or_die (q6_file, 0, data_out, ARRAY_LEN (data_out), __LINE__) ; + } ; + + sf_close (q3_file) ; + sf_close (q6_file) ; + + q3_size = file_length (q3_fname) ; + q6_size = file_length (q6_fname) ; + + exit_if_true (q3_size >= q6_size, + "\n\nLine %d : q3 size (%d) >= q6 size (%d)\n\n", __LINE__, q3_size, q6_size) ; + + puts ("ok") ; + unlink (q3_fname) ; + unlink (q6_fname) ; +} /* compression_size_test */ + + + +int +main (int argc, char *argv []) +{ int all_tests = 0, tests = 0 ; + + if (argc != 2) + { printf ( + "Usage : %s \n" + " Where is one of:\n" + " vorbis - test Ogg/Vorbis\n" + " flac - test FLAC\n" + " opus - test Opus\n" + " all - perform all tests\n", + argv [0]) ; + exit (0) ; + } ; + + if (! HAVE_EXTERNAL_XIPH_LIBS) + { puts (" No Ogg/Vorbis tests because Ogg/Vorbis support was not compiled in.") ; + return 0 ; + } ; + + if (strcmp (argv [1], "all") == 0) + all_tests = 1 ; + + if (all_tests || strcmp (argv [1], "vorbis") == 0) + { vorbis_test () ; + compression_size_test (SF_FORMAT_OGG | SF_FORMAT_VORBIS, "vorbis.oga") ; + tests ++ ; + } ; + + if (all_tests || strcmp (argv [1], "flac") == 0) + { compression_size_test (SF_FORMAT_FLAC | SF_FORMAT_PCM_16, "pcm16.flac") ; + tests ++ ; + } ; + + if (all_tests || strcmp (argv [1], "opus") == 0) + { compression_size_test (SF_FORMAT_OGG | SF_FORMAT_OPUS, "opus.opus") ; + tests ++ ; + } ; + + return 0 ; +} /* main */ diff --git a/libsndfile-1.0.31/tests/cpp_test.cc b/libsndfile-1.0.31/tests/cpp_test.cc new file mode 100644 index 0000000..6e39da6 --- /dev/null +++ b/libsndfile-1.0.31/tests/cpp_test.cc @@ -0,0 +1,315 @@ +/* +** Copyright (C) 2006-2012 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#include + +#include "utils.h" + +static short sbuffer [100] ; +static int ibuffer [100] ; +static float fbuffer [100] ; +static double dbuffer [100] ; + +static void +ceeplusplus_wchar_test (void) +{ +#if 0 + LPCWSTR filename = L"wchar_test.wav" ; + + print_test_name (__func__, "ceeplusplus_wchar_test.wav") ; + + /* Use this scope to make sure the created file is closed. */ + { + SndfileHandle file (filename, SFM_WRITE, SF_FORMAT_WAV | SF_FORMAT_PCM_16, 2, 44100) ; + + if (file.refCount () != 1) + { printf ("\n\n%s %d : Error : Reference count (%d) should be 1.\n\n", __func__, __LINE__, file.refCount ()) ; + exit (1) ; + } ; + + /* This should check that the file did in fact get created with a + ** wchar_t * filename. + */ + exit_if_true ( + GetFileAttributesW (filename) == INVALID_FILE_ATTRIBUTES, + "\n\nLine %d : GetFileAttributes failed.\n\n", __LINE__ + ) ; + } + + /* Use this because the file was created with CreateFileW. */ + DeleteFileW (filename) ; + + puts ("ok") ; +#endif +} /* ceeplusplus_wchar_test */ + + + +static void +create_file (const char * filename, int format) +{ SndfileHandle file ; + + if (file.refCount () != 0) + { printf ("\n\n%s %d : Error : Reference count (%d) should be zero.\n\n", __func__, __LINE__, file.refCount ()) ; + exit (1) ; + } ; + + file = SndfileHandle (filename, SFM_WRITE, format, 2, 48000) ; + + if (file.refCount () != 1) + { printf ("\n\n%s %d : Error : Reference count (%d) should be 1.\n\n", __func__, __LINE__, file.refCount ()) ; + exit (1) ; + } ; + + file.setString (SF_STR_TITLE, filename) ; + + /* Item write. */ + file.write (sbuffer, ARRAY_LEN (sbuffer)) ; + file.write (ibuffer, ARRAY_LEN (ibuffer)) ; + file.write (fbuffer, ARRAY_LEN (fbuffer)) ; + file.write (dbuffer, ARRAY_LEN (dbuffer)) ; + + /* Frame write. */ + file.writef (sbuffer, ARRAY_LEN (sbuffer) / file.channels ()) ; + file.writef (ibuffer, ARRAY_LEN (ibuffer) / file.channels ()) ; + file.writef (fbuffer, ARRAY_LEN (fbuffer) / file.channels ()) ; + file.writef (dbuffer, ARRAY_LEN (dbuffer) / file.channels ()) ; + + /* RAII takes care of the SndfileHandle. */ +} /* create_file */ + +static void +check_title (const SndfileHandle & file, const char * filename) +{ const char *title = NULL ; + + title = file.getString (SF_STR_TITLE) ; + + if (title == NULL) + { printf ("\n\n%s %d : Error : No title.\n\n", __func__, __LINE__) ; + exit (1) ; + } ; + + if (strcmp (filename, title) != 0) + { printf ("\n\n%s %d : Error : title '%s' should be '%s'\n\n", __func__, __LINE__, title, filename) ; + exit (1) ; + } ; + + return ; +} /* check_title */ + +static void +read_file (const char * filename, int format) +{ SndfileHandle file ; + sf_count_t count ; + + if (file) + { printf ("\n\n%s %d : Error : should not be here.\n\n", __func__, __LINE__) ; + exit (1) ; + } ; + + file = SndfileHandle (filename) ; + + if (1) + { SndfileHandle file2 = file ; + + if (file.refCount () != 2 || file2.refCount () != 2) + { printf ("\n\n%s %d : Error : Reference count (%d) should be two.\n\n", __func__, __LINE__, file.refCount ()) ; + exit (1) ; + } ; + } ; + + if (file.refCount () != 1) + { printf ("\n\n%s %d : Error : Reference count (%d) should be one.\n\n", __func__, __LINE__, file.refCount ()) ; + exit (1) ; + } ; + + if (! file) + { printf ("\n\n%s %d : Error : should not be here.\n\n", __func__, __LINE__) ; + exit (1) ; + } ; + + if (file.format () != format) + { printf ("\n\n%s %d : Error : format 0x%08x should be 0x%08x.\n\n", __func__, __LINE__, file.format (), format) ; + exit (1) ; + } ; + + if (file.channels () != 2) + { printf ("\n\n%s %d : Error : channels %d should be 2.\n\n", __func__, __LINE__, file.channels ()) ; + exit (1) ; + } ; + + if (file.frames () != ARRAY_LEN (sbuffer) * 4) + { printf ("\n\n%s %d : Error : frames %ld should be %lu.\n\n", __func__, __LINE__, + (long) file.frames (), (long) ARRAY_LEN (sbuffer) * 4 / 2) ; + exit (1) ; + } ; + + switch (format & SF_FORMAT_TYPEMASK) + { case SF_FORMAT_AU : + break ; + + default : + check_title (file, filename) ; + break ; + } ; + + /* Item read. */ + file.read (sbuffer, ARRAY_LEN (sbuffer)) ; + file.read (ibuffer, ARRAY_LEN (ibuffer)) ; + file.read (fbuffer, ARRAY_LEN (fbuffer)) ; + file.read (dbuffer, ARRAY_LEN (dbuffer)) ; + + /* Frame read. */ + file.readf (sbuffer, ARRAY_LEN (sbuffer) / file.channels ()) ; + file.readf (ibuffer, ARRAY_LEN (ibuffer) / file.channels ()) ; + file.readf (fbuffer, ARRAY_LEN (fbuffer) / file.channels ()) ; + file.readf (dbuffer, ARRAY_LEN (dbuffer) / file.channels ()) ; + + count = file.seek (file.frames () - 10, SEEK_SET) ; + if (count != file.frames () - 10) + { printf ("\n\n%s %d : Error : offset (%ld) should be %ld\n\n", __func__, __LINE__, + (long) count, (long) (file.frames () - 10)) ; + exit (1) ; + } ; + + count = file.read (sbuffer, ARRAY_LEN (sbuffer)) ; + if (count != 10 * file.channels ()) + { printf ("\n\n%s %d : Error : count (%ld) should be %ld\n\n", __func__, __LINE__, + (long) count, (long) (10 * file.channels ())) ; + exit (1) ; + } ; + + /* RAII takes care of the SndfileHandle. */ +} /* read_file */ + +static void +ceeplusplus_test (const char *filename, int format) +{ + print_test_name ("ceeplusplus_test", filename) ; + + create_file (filename, format) ; + read_file (filename, format) ; + + remove (filename) ; + puts ("ok") ; +} /* ceeplusplus_test */ + +static void +ceeplusplus_extra_test (void) +{ SndfileHandle file ; + const char * filename = "bad_file_name.wav" ; + int error ; + + print_test_name ("ceeplusplus_extra_test", filename) ; + + file = SndfileHandle (filename) ; + + error = file.error () ; + if (error == 0) + { printf ("\n\n%s %d : error should not be zero.\n\n", __func__, __LINE__) ; + exit (1) ; + } ; + + if (file.strError () == NULL) + { printf ("\n\n%s %d : strError should not return NULL.\n\n", __func__, __LINE__) ; + exit (1) ; + } ; + + if (file.seek (0, SEEK_SET) != 0) + { printf ("\n\n%s %d : bad seek ().\n\n", __func__, __LINE__) ; + exit (1) ; + } ; + + puts ("ok") ; +} /* ceeplusplus_extra_test */ + + +static void +ceeplusplus_rawhandle_test (const char *filename) +{ + SNDFILE* handle ; + { + SndfileHandle file (filename) ; + handle = file.rawHandle () ; + sf_read_float (handle, fbuffer, ARRAY_LEN (fbuffer)) ; + } +} /* ceeplusplus_rawhandle_test */ + +static void +ceeplusplus_takeOwnership_test (const char *filename) +{ + SNDFILE* handle ; + { + SndfileHandle file (filename) ; + handle = file.takeOwnership () ; + } + + if (sf_read_float (handle, fbuffer, ARRAY_LEN (fbuffer)) <= 0) + { printf ("\n\n%s %d : error when taking ownership of handle.\n\n", __func__, __LINE__) ; + exit (1) ; + } + + if (sf_close (handle) != 0) + { printf ("\n\n%s %d : cannot close file.\n\n", __func__, __LINE__) ; + exit (1) ; + } + + SndfileHandle file (filename) ; + SndfileHandle file2 (file) ; + + if (file2.takeOwnership ()) + { printf ("\n\n%s %d : taking ownership of shared handle is not allowed.\n\n", __func__, __LINE__) ; + exit (1) ; + } +} /* ceeplusplus_takeOwnership_test */ + +static void +ceeplusplus_handle_test (const char *filename, int format) +{ + print_test_name ("ceeplusplus_handle_test", filename) ; + + create_file (filename, format) ; + + if (0) ceeplusplus_rawhandle_test (filename) ; + ceeplusplus_takeOwnership_test (filename) ; + + remove (filename) ; + puts ("ok") ; +} /* ceeplusplus_test */ + +int +main (void) +{ + ceeplusplus_test ("cpp_test.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; + ceeplusplus_test ("cpp_test.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_S8) ; + ceeplusplus_test ("cpp_test.au", SF_FORMAT_AU | SF_FORMAT_FLOAT) ; + + ceeplusplus_extra_test () ; + ceeplusplus_handle_test ("cpp_test.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; + + ceeplusplus_wchar_test () ; + + return 0 ; +} /* main */ + diff --git a/libsndfile-1.0.31/tests/dft_cmp.c b/libsndfile-1.0.31/tests/dft_cmp.c new file mode 100644 index 0000000..03bd464 --- /dev/null +++ b/libsndfile-1.0.31/tests/dft_cmp.c @@ -0,0 +1,151 @@ +/* +** Copyright (C) 2002-2015 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#include "dft_cmp.h" +#include "utils.h" + +#ifndef M_PI +#define M_PI 3.14159265358979323846264338 +#endif + +#define DFT_SPEC_LENGTH (DFT_DATA_LENGTH / 2) + +static void dft_magnitude (const double *data, double *spectrum) ; +static double calc_max_spectral_difference (const double *spec1, const double *spec2) ; + +/*-------------------------------------------------------------------------------- +** Public functions. +*/ + +double +dft_cmp_float (int linenum, const float *in_data, const float *test_data, int len, double target_snr, int allow_exit) +{ static double orig [DFT_DATA_LENGTH] ; + static double test [DFT_DATA_LENGTH] ; + unsigned k ; + + if (len != DFT_DATA_LENGTH) + { printf ("Error (line %d) : dft_cmp_float : Bad input array length.\n", linenum) ; + return 1 ; + } ; + + for (k = 0 ; k < ARRAY_LEN (orig) ; k++) + { test [k] = test_data [k] ; + orig [k] = in_data [k] ; + } ; + + return dft_cmp_double (linenum, orig, test, len, target_snr, allow_exit) ; +} /* dft_cmp_float */ + +double +dft_cmp_double (int linenum, const double *orig, const double *test, int len, double target_snr, int allow_exit) +{ static double orig_spec [DFT_SPEC_LENGTH] ; + static double test_spec [DFT_SPEC_LENGTH] ; + double snr ; + + if (! orig || ! test) + { printf ("Error (line %d) : dft_cmp_double : Bad input arrays.\n", linenum) ; + return 1 ; + } ; + + if (len != DFT_DATA_LENGTH) + { printf ("Error (line %d) : dft_cmp_double : Bad input array length.\n", linenum) ; + return 1 ; + } ; + + dft_magnitude (orig, orig_spec) ; + dft_magnitude (test, test_spec) ; + + snr = calc_max_spectral_difference (orig_spec, test_spec) ; + + if (snr > target_snr) + { printf ("\n\nLine %d: Actual SNR (% 4.1f) > target SNR (% 4.1f).\n\n", linenum, snr, target_snr) ; + oct_save_double (orig, test, len) ; + if (allow_exit) + exit (1) ; + } ; + + if (snr < -500.0) + snr = -500.0 ; + + return snr ; +} /* dft_cmp_double */ + +/*-------------------------------------------------------------------------------- +** Quick dirty calculation of magnitude spectrum for real valued data using +** Discrete Fourier Transform. Since the data is real, the DFT is only +** calculated for positive frequencies. +*/ + +static void +dft_magnitude (const double *data, double *spectrum) +{ static double cos_angle [DFT_DATA_LENGTH] = { 0.0 } ; + static double sin_angle [DFT_DATA_LENGTH] ; + + double real_part, imag_part ; + int k, n ; + + /* If sine and cosine tables haven't been initialised, do so. */ + if (cos_angle [0] == 0.0) + for (n = 0 ; n < DFT_DATA_LENGTH ; n++) + { cos_angle [n] = cos (2.0 * M_PI * n / DFT_DATA_LENGTH) ; + sin_angle [n] = -1.0 * sin (2.0 * M_PI * n / DFT_DATA_LENGTH) ; + } ; + + /* DFT proper. Since the data is real, only generate a half spectrum. */ + for (k = 1 ; k < DFT_SPEC_LENGTH ; k++) + { real_part = 0.0 ; + imag_part = 0.0 ; + + for (n = 0 ; n < DFT_DATA_LENGTH ; n++) + { real_part += data [n] * cos_angle [(k * n) % DFT_DATA_LENGTH] ; + imag_part += data [n] * sin_angle [(k * n) % DFT_DATA_LENGTH] ; + } ; + + spectrum [k] = sqrt (real_part * real_part + imag_part * imag_part) ; + } ; + + spectrum [DFT_SPEC_LENGTH - 1] = 0.0 ; + + spectrum [0] = spectrum [1] = spectrum [2] = 0.0 ; + + return ; +} /* dft_magnitude */ + +static double +calc_max_spectral_difference (const double *orig, const double *test) +{ double orig_max = 0.0, max_diff = 0.0 ; + int k ; + + for (k = 0 ; k < DFT_SPEC_LENGTH ; k++) + { if (orig_max < orig [k]) + orig_max = orig [k] ; + if (max_diff < fabs (orig [k] - test [k])) + max_diff = fabs (orig [k] - test [k]) ; + } ; + + if (max_diff < 1e-25) + return -500.0 ; + + return 20.0 * log10 (max_diff / orig_max) ; +} /* calc_max_spectral_difference */ diff --git a/libsndfile-1.0.31/tests/dft_cmp.h b/libsndfile-1.0.31/tests/dft_cmp.h new file mode 100644 index 0000000..faa5fe0 --- /dev/null +++ b/libsndfile-1.0.31/tests/dft_cmp.h @@ -0,0 +1,25 @@ +/* +** Copyright (C) 2002-2015 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + + +#define DFT_DATA_LENGTH (8192) + +double dft_cmp_float (int linenum, const float *orig, const float *test, int len, double tolerance, int allow_exit) ; + +double dft_cmp_double (int linenum, const double *orig, const double *test, int len, double tolerance, int allow_exit) ; + diff --git a/libsndfile-1.0.31/tests/dither_test.c b/libsndfile-1.0.31/tests/dither_test.c new file mode 100644 index 0000000..c092844 --- /dev/null +++ b/libsndfile-1.0.31/tests/dither_test.c @@ -0,0 +1,184 @@ +/* +** Copyright (C) 2003-2013 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + + +#include "sfconfig.h" +#include +#include +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif +#include +#include + +#include + +#include "utils.h" + +#define BUFFER_LEN (1 << 16) +#define LOG_BUFFER_SIZE 1024 + +static void dither_test (const char *filename, int filetype) ; + +/* Force the start of this buffer to be double aligned. Sparc-solaris will +** choke if its not. +*/ +static short data_out [BUFFER_LEN] ; + +int +main (int argc, char *argv []) +{ int do_all = 0 ; + int test_count = 0 ; + + if (argc != 2) + { printf ("Usage : %s \n", argv [0]) ; + printf (" Where is one of the following:\n") ; + printf (" wav - test WAV file peak chunk\n") ; + printf (" aiff - test AIFF file PEAK chunk\n") ; + printf (" all - perform all tests\n") ; + exit (1) ; + } ; + + do_all = ! strcmp (argv [1], "all") ; + + if (do_all || ! strcmp (argv [1], "wav")) + { dither_test ("dither.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "aiff")) + { dither_test ("dither.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_S8) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "au")) + { dither_test ("dither.au", SF_FORMAT_AU | SF_FORMAT_PCM_S8) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "svx")) + { dither_test ("dither.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_S8) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "nist")) + { dither_test ("dither.nist", SF_FORMAT_NIST | SF_FORMAT_PCM_S8) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "paf")) + { dither_test ("dither.paf", SF_FORMAT_PAF | SF_FORMAT_PCM_S8) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "ircam")) + { dither_test ("dither.ircam", SF_FORMAT_IRCAM | SF_FORMAT_PCM_S8) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "voc")) + { dither_test ("dither.voc", SF_FORMAT_VOC | SF_FORMAT_PCM_S8) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "w64")) + { dither_test ("dither.w64", SF_FORMAT_W64 | SF_FORMAT_PCM_S8) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mat4")) + { dither_test ("dither.mat4", SF_FORMAT_MAT4 | SF_FORMAT_PCM_S8) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mat5")) + { dither_test ("dither.mat5", SF_FORMAT_MAT5 | SF_FORMAT_PCM_S8) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "pvf")) + { dither_test ("dither.pvf", SF_FORMAT_PVF | SF_FORMAT_PCM_S8) ; + test_count++ ; + } ; + + if (test_count == 0) + { printf ("Mono : ************************************\n") ; + printf ("Mono : * No '%s' test defined.\n", argv [1]) ; + printf ("Mono : ************************************\n") ; + return 1 ; + } ; + + return 0 ; +} /* main */ + + +/*============================================================================================ +** Here are the test functions. +*/ + +static void +dither_test (const char *filename, int filetype) +{ SNDFILE *file ; + SF_INFO sfinfo ; + SF_DITHER_INFO dither ; + + print_test_name ("dither_test", filename) ; + + sfinfo.samplerate = 44100 ; + sfinfo.format = filetype ; + sfinfo.channels = 1 ; + sfinfo.frames = 0 ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + /* Check for old version of the dither API. */ + if (sf_command (file, SFC_SET_DITHER_ON_WRITE, NULL, SF_TRUE) == 0) + { printf ("\n\nLine %d: Should have an error here but don't.\n\n", __LINE__) ; + exit (1) ; + } ; + + memset (&dither, 0, sizeof (dither)) ; + dither.type = SFD_WHITE ; + dither.level = 0 ; + + if (sf_command (file, SFC_SET_DITHER_ON_WRITE, &dither, sizeof (dither)) != 0) + { printf ("\n\nLine %d: sf_command (SFC_SET_DITHER_ON_WRITE) returned error : %s\n\n", + __LINE__, sf_strerror (file)) ; + exit (1) ; + } ; + + /* Write data to file. */ + test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ; + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.frames != BUFFER_LEN) + { printf ("\n\nLine %d: Bad frame count %d (should be %d)\n\n", __LINE__, (int) sfinfo.frames, BUFFER_LEN) ; + } ; + + sf_close (file) ; + /*-unlink (filename) ;-*/ + + puts ("ok") ; +} /* dither_test */ + diff --git a/libsndfile-1.0.31/tests/dwvw_test.c b/libsndfile-1.0.31/tests/dwvw_test.c new file mode 100644 index 0000000..b2cae06 --- /dev/null +++ b/libsndfile-1.0.31/tests/dwvw_test.c @@ -0,0 +1,111 @@ +/* +** Copyright (C) 2002-2014 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "utils.h" + +#define BUFFER_SIZE (10000) + +#ifndef M_PI +#define M_PI 3.14159265358979323846264338 +#endif + +static void dwvw_test (const char *filename, int format, int bit_width) ; + +int +main (void) +{ + dwvw_test ("dwvw12.raw", SF_FORMAT_RAW | SF_FORMAT_DWVW_12, 12) ; + dwvw_test ("dwvw16.raw", SF_FORMAT_RAW | SF_FORMAT_DWVW_16, 16) ; + dwvw_test ("dwvw24.raw", SF_FORMAT_RAW | SF_FORMAT_DWVW_24, 24) ; + + return 0 ; +} /* main */ + +static void +dwvw_test (const char *filename, int format, int bit_width) +{ static int write_buf [BUFFER_SIZE] ; + static int read_buf [BUFFER_SIZE] ; + + SNDFILE *file ; + SF_INFO sfinfo ; + double value ; + int k, bit_mask ; + + srand (123456) ; + + /* Only want to grab the top bit_width bits. */ + bit_mask = arith_shift_left (-1, 32 - bit_width) ; + + print_test_name ("dwvw_test", filename) ; + + sf_info_setup (&sfinfo, format, 44100, 1) ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + /* Generate random.frames. */ + for (k = 0 ; k < BUFFER_SIZE / 2 ; k++) + { value = 0x7FFFFFFF * sin (123.0 / sfinfo.samplerate * 2 * k * M_PI) ; + write_buf [k] = bit_mask & lrint (value) ; + } ; + + for ( ; k < BUFFER_SIZE ; k++) + write_buf [k] = bit_mask & (arith_shift_left (rand (), 11) ^ (rand () >> 11)) ; + + sf_write_int (file, write_buf, BUFFER_SIZE) ; + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if ((k = sf_read_int (file, read_buf, BUFFER_SIZE)) != BUFFER_SIZE) + { printf ("Error (line %d) : Only read %d/%d.frames.\n", __LINE__, k, BUFFER_SIZE) ; + exit (1) ; + } + + for (k = 0 ; k < BUFFER_SIZE ; k++) + { if (read_buf [k] != write_buf [k]) + { printf ("Error (line %d) : %d != %d at position %d/%d\n", __LINE__, + write_buf [k] >> (32 - bit_width), read_buf [k] >> (32 - bit_width), + k, BUFFER_SIZE) ; + oct_save_int (write_buf, read_buf, BUFFER_SIZE) ; + exit (1) ; + } ; + } ; + + sf_close (file) ; + + unlink (filename) ; + printf ("ok\n") ; + + return ; +} /* dwvw_test */ + diff --git a/libsndfile-1.0.31/tests/error_test.c b/libsndfile-1.0.31/tests/error_test.c new file mode 100644 index 0000000..2e348e4 --- /dev/null +++ b/libsndfile-1.0.31/tests/error_test.c @@ -0,0 +1,287 @@ +/* +** Copyright (C) 1999-2018 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#if OS_IS_WIN32 +#include +#endif + +#include + +#include "utils.h" + +#define BUFFER_SIZE (1 << 15) +#define SHORT_BUFFER (256) + +static void +error_number_test (void) +{ const char *noerror, *errstr ; + int k ; + + print_test_name ("error_number_test", "") ; + + noerror = sf_error_number (0) ; + + for (k = 1 ; k < 300 ; k++) + { errstr = sf_error_number (k) ; + + /* Test for termination condition. */ + if (errstr == noerror) + break ; + + /* Test for error. */ + if (strstr (errstr, "This is a bug in libsndfile.")) + { printf ("\n\nError : error number %d : %s\n\n\n", k, errstr) ; + exit (1) ; + } ; + } ; + + + puts ("ok") ; + return ; +} /* error_number_test */ + +static void +error_value_test (void) +{ static unsigned char aiff_data [0x1b0] = + { 'F' , 'O' , 'R' , 'M' , + 0x00, 0x00, 0x01, 0xA8, /* FORM length */ + + 'A' , 'I' , 'F' , 'C' , + } ; + + const char *filename = "error.aiff" ; + SNDFILE *file ; + SF_INFO sfinfo ; + int error_num ; + + print_test_name ("error_value_test", filename) ; + + dump_data_to_file (filename, aiff_data, sizeof (aiff_data)) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = sf_open (filename, SFM_READ, &sfinfo) ; + if (file != NULL) + { printf ("\n\nLine %d : Should not have been able to open this file.\n\n", __LINE__) ; + exit (1) ; + } ; + + if ((error_num = sf_error (NULL)) <= 1 || error_num > 300) + { printf ("\n\nLine %d : Should not have had an error number of %d.\n\n", __LINE__, error_num) ; + exit (1) ; + } ; + + remove (filename) ; + puts ("ok") ; + return ; +} /* error_value_test */ + +static void +no_file_test (const char * filename) +{ SNDFILE *sndfile ; + SF_INFO sfinfo ; + + print_test_name (__func__, filename) ; + + unlink (filename) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sndfile = sf_open (filename, SFM_READ, &sfinfo) ; + + exit_if_true (sndfile != NULL, "\n\nLine %d : should not have received a valid SNDFILE* pointer.\n", __LINE__) ; + + unlink (filename) ; + puts ("ok") ; +} /* no_file_test */ + +static void +zero_length_test (const char *filename) +{ SNDFILE *sndfile ; + SF_INFO sfinfo ; + FILE *file ; + + print_test_name (__func__, filename) ; + + /* Create a zero length file. */ + file = fopen (filename, "w") ; + exit_if_true (file == NULL, "\n\nLine %d : fopen ('%s') failed.\n", __LINE__, filename) ; + fclose (file) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sndfile = sf_open (filename, SFM_READ, &sfinfo) ; + + exit_if_true (sndfile != NULL, "\n\nLine %d : should not have received a valid SNDFILE* pointer.\n", __LINE__) ; + + exit_if_true (0 && sf_error (NULL) != SF_ERR_UNRECOGNISED_FORMAT, + "\n\nLine %3d : Error : %s\n should be : %s\n", __LINE__, + sf_strerror (NULL), sf_error_number (SF_ERR_UNRECOGNISED_FORMAT)) ; + + unlink (filename) ; + puts ("ok") ; +} /* zero_length_test */ + +static void +bad_wav_test (const char * filename) +{ SNDFILE *sndfile ; + SF_INFO sfinfo ; + + FILE *file ; + const char data [] = "RIFF WAVEfmt " ; + + print_test_name (__func__, filename) ; + + if ((file = fopen (filename, "w")) == NULL) + { printf ("\n\nLine %d : fopen returned NULL.\n", __LINE__) ; + exit (1) ; + } ; + + exit_if_true (fwrite (data, sizeof (data), 1, file) != 1, "\n\nLine %d : fwrite failed.\n", __LINE__) ; + fclose (file) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sndfile = sf_open (filename, SFM_READ, &sfinfo) ; + + if (sndfile) + { printf ("\n\nLine %d : should not have received a valid SNDFILE* pointer.\n", __LINE__) ; + exit (1) ; + } ; + + unlink (filename) ; + puts ("ok") ; +} /* bad_wav_test */ + +static void +error_close_test (void) +{ static short buffer [SHORT_BUFFER] ; + const char *filename = "error_close.wav" ; + SNDFILE *sndfile ; + SF_INFO sfinfo ; + FILE *file ; + + print_test_name (__func__, filename) ; + + /* Open a FILE* from which we will extract a file descriptor. */ + if ((file = fopen (filename, "w")) == NULL) + { printf ("\n\nLine %d : fopen returned NULL.\n", __LINE__) ; + exit (1) ; + } ; + + /* Set parameters for writing the file. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.channels = 1 ; + sfinfo.samplerate = 44100 ; + sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ; + + sndfile = sf_open_fd (fileno (file), SFM_WRITE, &sfinfo, SF_TRUE) ; + if (sndfile == NULL) + { printf ("\n\nLine %d : sf_open_fd failed : %s\n", __LINE__, sf_strerror (NULL)) ; + exit (1) ; + } ; + + test_write_short_or_die (sndfile, 0, buffer, ARRAY_LEN (buffer), __LINE__) ; + + /* Now close the fd associated with file before calling sf_close. */ + fclose (file) ; + + if (sf_close (sndfile) == 0) + { +#if OS_IS_WIN32 + OSVERSIONINFOEX osvi ; + + memset (&osvi, 0, sizeof (OSVERSIONINFOEX)) ; + osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX) ; + + if (GetVersionEx ((OSVERSIONINFO *) &osvi)) + { printf ("\n\nLine %d : sf_close should not have returned zero.\n", __LINE__) ; + printf ("\nHowever, this is a known bug in version %d.%d of windows so we'll ignore it.\n\n", + (int) osvi.dwMajorVersion, (int) osvi.dwMinorVersion) ; + } ; +#else + printf ("\n\nLine %d : sf_close should not have returned zero.\n", __LINE__) ; + exit (1) ; +#endif + } ; + + unlink (filename) ; + puts ("ok") ; +} /* error_close_test */ + +static void +unrecognised_test (void) +{ const char *filename = "unrecognised.bin" ; + SNDFILE *sndfile ; + SF_INFO sfinfo ; + FILE *file ; + int k ; + + print_test_name (__func__, filename) ; + + file = fopen (filename, "wb") ; + exit_if_true (file == NULL, + "\n\nLine %d : fopen ('%s') failed : %s\n", __LINE__, filename, strerror (errno) + ) ; + fputs ("Unrecognised file", file) ; + fclose (file) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sndfile = sf_open (filename, SFM_READ, &sfinfo) ; + + exit_if_true (sndfile != NULL, + "\n\nLine %d : SNDFILE* pointer (%p) should ne NULL.\n", __LINE__, sndfile + ) ; + + k = sf_error (sndfile) ; + exit_if_true (k != SF_ERR_UNRECOGNISED_FORMAT, + "\n\nLine %d : error (%d) should have been SF_ERR_UNRECOGNISED_FORMAT (%d).\n", + __LINE__, k, SF_ERR_UNRECOGNISED_FORMAT + ) ; + + unlink (filename) ; + puts ("ok") ; +} /* unrecognised_test */ + +int +main (void) +{ + error_number_test () ; + error_value_test () ; + + error_close_test () ; + + no_file_test ("no_file.wav") ; + zero_length_test ("zero_length.wav") ; + bad_wav_test ("bad_wav.wav") ; + + unrecognised_test () ; + + return 0 ; +} /* main */ + diff --git a/libsndfile-1.0.31/tests/external_libs_test.c b/libsndfile-1.0.31/tests/external_libs_test.c new file mode 100644 index 0000000..0c6fcf8 --- /dev/null +++ b/libsndfile-1.0.31/tests/external_libs_test.c @@ -0,0 +1,204 @@ +/* +** Copyright (C) 2008-2017 Erik de Castro Lopo +** +** This program is free software ; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation ; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY ; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "utils.h" + +static void major_format_test (void) ; +static void subtype_format_test (void) ; +static void simple_format_test (void) ; +static void flac_subset_test (void) ; + +int +main (void) +{ + major_format_test () ; + subtype_format_test () ; + simple_format_test () ; + + if (HAVE_EXTERNAL_XIPH_LIBS) + flac_subset_test () ; + + return 0 ; +} /* main */ + +static void +major_format_test (void) +{ SF_FORMAT_INFO info ; + int have_ogg = 0, have_flac = 0 ; + int m, major_count ; + + print_test_name (__func__, NULL) ; + + sf_command (NULL, SFC_GET_FORMAT_MAJOR_COUNT, &major_count, sizeof (int)) ; + + for (m = 0 ; m < major_count ; m++) + { info.format = m ; + sf_command (NULL, SFC_GET_FORMAT_MAJOR, &info, sizeof (info)) ; + + have_flac = info.format == SF_FORMAT_FLAC ? 1 : have_flac ; + have_ogg = info.format == SF_FORMAT_OGG ? 1 : have_ogg ; + } ; + + if (HAVE_EXTERNAL_XIPH_LIBS) + { exit_if_true (have_flac == 0, "\n\nLine %d : FLAC should be available.\n\n", __LINE__) ; + exit_if_true (have_ogg == 0, "\n\nLine %d : Ogg/Vorbis should be available.\n\n", __LINE__) ; + } + else + { exit_if_true (have_flac, "\n\nLine %d : FLAC should not be available.\n\n", __LINE__) ; + exit_if_true (have_ogg, "\n\nLine %d : Ogg/Vorbis should not be available.\n\n", __LINE__) ; + } ; + + puts ("ok") ; +} /* major_format_test */ + +static void +subtype_format_test (void) +{ SF_FORMAT_INFO info ; + int have_vorbis = 0 , have_opus = 0 ; + int s, subtype_count ; + + print_test_name (__func__, NULL) ; + + sf_command (NULL, SFC_GET_FORMAT_SUBTYPE_COUNT, &subtype_count, sizeof (int)) ; + + for (s = 0 ; s < subtype_count ; s++) + { info.format = s ; + sf_command (NULL, SFC_GET_FORMAT_SUBTYPE, &info, sizeof (info)) ; + + have_vorbis = info.format == SF_FORMAT_VORBIS ? 1 : have_vorbis ; + have_opus = info.format == SF_FORMAT_OPUS ? 1 : have_opus ; + } ; + + if (HAVE_EXTERNAL_XIPH_LIBS) + { exit_if_true (have_vorbis == 0, "\n\nLine %d : Ogg/Vorbis should be available.\n\n", __LINE__) ; + exit_if_true (have_opus == 0, "\n\nLine %d : Ogg/Opus should be available.\n\n", __LINE__) ; + } + else + { exit_if_true (have_vorbis, "\n\nLine %d : Ogg/Vorbis should not be available.\n\n", __LINE__) ; + exit_if_true (have_opus, "\n\nLine %d : Ogg/Opus should not be available.\n\n", __LINE__) ; + } ; + + puts ("ok") ; +} /* subtype_format_test */ + +static void +simple_format_test (void) +{ SF_FORMAT_INFO info ; + int have_flac = 0, have_ogg = 0, have_vorbis = 0, have_opus = 0 ; + int s, simple_count ; + + print_test_name (__func__, NULL) ; + + sf_command (NULL, SFC_GET_SIMPLE_FORMAT_COUNT, &simple_count, sizeof (int)) ; + + for (s = 0 ; s < simple_count ; s++) + { info.format = s ; + sf_command (NULL, SFC_GET_SIMPLE_FORMAT, &info, sizeof (info)) ; + + switch (info.format & SF_FORMAT_TYPEMASK) + { case SF_FORMAT_FLAC : + have_flac = 1 ; + break ; + + case SF_FORMAT_OGG : + have_ogg = 1 ; + break ; + + default : + break ; + } ; + + switch (info.format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_VORBIS : + have_vorbis = 1 ; + break ; + + case SF_FORMAT_OPUS : + have_opus = 1 ; + break ; + + default : + break ; + } ; + + } ; + + if (HAVE_EXTERNAL_XIPH_LIBS) + { exit_if_true (have_flac == 0, "\n\nLine %d : FLAC should be available.\n\n", __LINE__) ; + exit_if_true (have_ogg == 0, "\n\nLine %d : Ogg/Vorbis should be available.\n\n", __LINE__) ; + exit_if_true (have_vorbis == 0, "\n\nLine %d : Ogg/Vorbis should be available.\n\n", __LINE__) ; + exit_if_true (have_opus == 0, "\n\nLine %d : Ogg/Opus should be available.\n\n", __LINE__) ; + } + else + { exit_if_true (have_flac, "\n\nLine %d : FLAC should not be available.\n\n", __LINE__) ; + exit_if_true (have_ogg, "\n\nLine %d : Ogg/Vorbis should not be available.\n\n", __LINE__) ; + exit_if_true (have_vorbis, "\n\nLine %d : Ogg/Vorbis should not be available.\n\n", __LINE__) ; + exit_if_true (have_opus, "\n\nLine %d : Ogg/Opus should not be available.\n\n", __LINE__) ; + } ; + + puts ("ok") ; +} /* simple_format_test */ + +static void +flac_subset_test (void) +{ float whatever [256] ; + SNDFILE *file ; + SF_INFO sfinfo ; + sf_count_t rc ; + int samplerate ; + const char *filename = "subset_test.flac" ; + + /* For some formats (like FLAC) the headers are written *just* before the + ** first bit of audio data. This test makes sure errors in that process + ** are caught. + */ + + print_test_name (__func__, NULL) ; + + for (samplerate = 65536 ; samplerate < 655350 ; samplerate *= 4) + { sfinfo.samplerate = samplerate ; + sfinfo.channels = 1 ; + sfinfo.frames = 0 ; + sfinfo.format = SF_FORMAT_FLAC | SF_FORMAT_PCM_16 ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + rc = sf_write_float (file, whatever, ARRAY_LEN (whatever)) ; + unlink (filename) ; + exit_if_true (rc != 0, "\n\nLine %d : return code (%d) should be 0.\n\n", __LINE__, (int) rc) ; + + sf_close (file) ; + } ; + + puts ("ok") ; +} /* flac_subset_test */ + diff --git a/libsndfile-1.0.31/tests/fix_this.c b/libsndfile-1.0.31/tests/fix_this.c new file mode 100644 index 0000000..5c697ea --- /dev/null +++ b/libsndfile-1.0.31/tests/fix_this.c @@ -0,0 +1,334 @@ +/* +** Copyright (C) 1999-2014 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif +#include +#include + +#include + +#include "utils.h" + +#define BUFFER_SIZE (1 << 14) +#define SAMPLE_RATE (11025) + +#ifndef M_PI +#define M_PI 3.14159265358979323846264338 +#endif + +static void lcomp_test_int (const char *str, const char *filename, int filetype, double margin) ; + +static int error_function (double data, double orig, double margin) ; +static int decay_response (int k) ; + +static void gen_signal_double (double *data, double scale, int datalen) ; + +/* Force the start of these buffers to be double aligned. Sparc-solaris will +** choke if they are not. +*/ + +typedef union +{ double d [BUFFER_SIZE + 1] ; + int i [BUFFER_SIZE + 1] ; +} BUFFER ; + +static BUFFER data_buffer ; +static BUFFER orig_buffer ; + +int +main (void) +{ const char *filename = "test.au" ; + + lcomp_test_int ("au_g721", filename, SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G721_32, 0.06) ; + + return 0 ; +} /* main */ + +/*============================================================================================ +** Here are the test functions. +*/ + +static void +lcomp_test_int (const char *str, const char *filename, int filetype, double margin) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k, m, *orig, *data ; + sf_count_t datalen, seekpos ; + int64_t sum_abs ; + double scale ; + + printf ("\nThis is program is not part of the libsndfile test suite.\n\n") ; + + printf (" lcomp_test_int : %s ... ", str) ; + fflush (stdout) ; + + datalen = BUFFER_SIZE ; + + scale = 1.0 * 0x10000 ; + + data = data_buffer.i ; + orig = orig_buffer.i ; + + gen_signal_double (orig_buffer.d, 32000.0 * scale, datalen) ; + for (k = 0 ; k < datalen ; k++) + orig [k] = orig_buffer.d [k] ; + + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = 123456789 ; /* Ridiculous value. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + if (! (file = sf_open (filename, SFM_WRITE, &sfinfo))) + { printf ("sf_open_write failed with error : ") ; + puts (sf_strerror (NULL)) ; + exit (1) ; + } ; + + if ((k = sf_writef_int (file, orig, datalen)) != datalen) + { printf ("sf_writef_int failed with short write (%" PRId64 " => %d).\n", datalen, k) ; + exit (1) ; + } ; + sf_close (file) ; + + memset (data, 0, datalen * sizeof (int)) ; + + if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + if (! (file = sf_open (filename, SFM_READ, &sfinfo))) + { printf ("sf_open_read failed with error : ") ; + puts (sf_strerror (NULL)) ; + exit (1) ; + } ; + + if ((sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)) != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("Line %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < datalen) + { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.frames > (datalen + datalen / 2)) + { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("Incorrect number of channels in file.\n") ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + if ((k = sf_readf_int (file, data, datalen)) != datalen) + { printf ("Line %d: short read (%d should be %" PRId64 ").\n", __LINE__, k, datalen) ; + exit (1) ; + } ; + + sum_abs = 0 ; + for (k = 0 ; k < datalen ; k++) + { if (error_function (data [k] / scale, orig [k] / scale, margin)) + { printf ("Line %d: Incorrect sample (#%d : %f should be %f).\n", __LINE__, k, data [k] / scale, orig [k] / scale) ; + oct_save_int (orig, data, datalen) ; + exit (1) ; + } ; + sum_abs += abs (data [k]) ; + } ; + + if (sum_abs < 1.0) + { printf ("Line %d: Signal is all zeros.\n", __LINE__) ; + exit (1) ; + } ; + + if ((k = sf_readf_int (file, data, datalen)) != sfinfo.frames - datalen) + { printf ("Line %d: Incorrect read length (%" PRId64 " should be %d).\n", __LINE__, sfinfo.frames - datalen, k) ; + exit (1) ; + } ; + + /* This check is only for block based encoders which must append silence + ** to the end of a file so as to fill out a block. + */ + if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM) + for (k = 0 ; k < sfinfo.frames - datalen ; k++) + if (ABS (data [k] / scale) > decay_response (k)) + { printf ("Line %d : Incorrect sample B (#%d : abs (%d) should be < %d).\n", __LINE__, k, data [k], decay_response (k)) ; + exit (1) ; + } ; + + if (! sfinfo.seekable) + { printf ("ok\n") ; + return ; + } ; + + /* Now test sf_seek function. */ + + if ((k = sf_seek (file, 0, SEEK_SET)) != 0) + { printf ("Line %d: Seek to start of file failed (%d).\n", __LINE__, k) ; + exit (1) ; + } ; + + for (m = 0 ; m < 3 ; m++) + { int n ; + + if ((k = sf_readf_int (file, data, 11)) != 11) + { printf ("Line %d: Incorrect read length (11 => %d).\n", __LINE__, k) ; + exit (1) ; + } ; + + for (k = 0 ; k < 11 ; k++) + if (error_function (data [k] / scale, orig [k + m * 11] / scale, margin)) + { printf ("Line %d: Incorrect sample (m = %d) (#%d : %d => %d).\n", __LINE__, m, k + m * 11, orig [k + m * 11], data [k]) ; + for (n = 0 ; n < 1 ; n++) + printf ("%d ", data [n]) ; + printf ("\n") ; + exit (1) ; + } ; + } ; + + seekpos = BUFFER_SIZE / 10 ; + + /* Check seek from start of file. */ + if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos) + { printf ("Seek to start of file + %" PRId64 " failed (%d).\n", seekpos, k) ; + exit (1) ; + } ; + + if ((k = sf_readf_int (file, data, 1)) != 1) + { printf ("Line %d: sf_readf_int (file, data, 1) returned %d.\n", __LINE__, k) ; + exit (1) ; + } ; + + if (error_function ((double) data [0], (double) orig [seekpos], margin)) + { printf ("Line %d: sf_seek (SEEK_SET) followed by sf_readf_int failed (%d, %d).\n", __LINE__, orig [1], data [0]) ; + exit (1) ; + } ; + + if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1) + { printf ("Line %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %" PRId64 ")\n", __LINE__, k, seekpos + 1) ; + exit (1) ; + } ; + + seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ; + k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ; + sf_readf_int (file, data, 1) ; + if (error_function ((double) data [0], (double) orig [seekpos], margin) || k != seekpos) + { printf ("Line %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %" PRId64 ").\n", __LINE__, data [0], orig [seekpos], k, seekpos + 1) ; + exit (1) ; + } ; + + seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ; + /* Check seek backward from current position. */ + k = sf_seek (file, -20, SEEK_CUR) ; + sf_readf_int (file, data, 1) ; + if (error_function ((double) data [0], (double) orig [seekpos], margin) || k != seekpos) + { printf ("sf_seek (backwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %" PRId64 ").\n", data [0], orig [seekpos], k, seekpos) ; + exit (1) ; + } ; + + /* Check that read past end of file returns number of items. */ + sf_seek (file, (int) sfinfo.frames, SEEK_SET) ; + + if ((k = sf_readf_int (file, data, datalen)) != 0) + { printf ("Line %d: Return value from sf_readf_int past end of file incorrect (%d).\n", __LINE__, k) ; + exit (1) ; + } ; + + /* Check seek backward from end. */ + if ((k = sf_seek (file, 5 - (int) sfinfo.frames, SEEK_END)) != 5) + { printf ("sf_seek (SEEK_END) returned %d instead of %d.\n", k, 5) ; + exit (1) ; + } ; + + sf_readf_int (file, data, 1) ; + if (error_function (data [0] / scale, orig [5] / scale, margin)) + { printf ("Line %d: sf_seek (SEEK_END) followed by sf_readf_short failed (%d should be %d).\n", __LINE__, data [0], orig [5]) ; + exit (1) ; + } ; + + sf_close (file) ; + + printf ("ok\n") ; +} /* lcomp_test_int */ + +/*======================================================================================== +** Auxiliary functions +*/ + +#define SIGNAL_MAXVAL 30000.0 +#define DECAY_COUNT 800 + +static int +decay_response (int k) +{ if (k < 1) + return (int) (1.2 * SIGNAL_MAXVAL) ; + if (k > DECAY_COUNT) + return 0 ; + return (int) (1.2 * SIGNAL_MAXVAL * (DECAY_COUNT - k) / (1.0 * DECAY_COUNT)) ; +} /* decay_response */ + +static void +gen_signal_double (double *data, double scale, int datalen) +{ int k, ramplen ; + double amp = 0.0 ; + + ramplen = datalen / 18 ; + + for (k = 0 ; k < datalen ; k++) + { if (k <= ramplen) + amp = scale * k / ((double) ramplen) ; + else if (k > datalen - ramplen) + amp = scale * (datalen - k) / ((double) ramplen) ; + + data [k] = amp * (0.4 * sin (33.3 * 2.0 * M_PI * ((double) (k + 1)) / ((double) SAMPLE_RATE)) + + 0.3 * cos (201.1 * 2.0 * M_PI * ((double) (k + 1)) / ((double) SAMPLE_RATE))) ; + } ; + + return ; +} /* gen_signal_double */ + +static int +error_function (double data, double orig, double margin) +{ double error ; + + if (fabs (orig) <= 500.0) + error = fabs (fabs (data) - fabs (orig)) / 2000.0 ; + else if (fabs (orig) <= 1000.0) + error = fabs (data - orig) / 3000.0 ; + else + error = fabs (data - orig) / fabs (orig) ; + + if (error > margin) + { printf ("\n\n*******************\nError : %f\n", error) ; + return 1 ; + } ; + return 0 ; +} /* error_function */ + diff --git a/libsndfile-1.0.31/tests/floating_point_test.c b/libsndfile-1.0.31/tests/floating_point_test.c new file mode 100644 index 0000000..6de5d90 --- /dev/null +++ b/libsndfile-1.0.31/tests/floating_point_test.c @@ -0,0 +1,737 @@ +/* +** Copyright (C) 1999-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "dft_cmp.h" +#include "utils.h" + +#define SAMPLE_RATE 16000 + +static void float_scaled_test (const char *filename, int allow_exit, int replace_float, int filetype, double target_snr) ; +static void double_scaled_test (const char *filename, int allow_exit, int replace_float, int filetype, double target_snr) ; + +static void float_short_little_test (const char * filename) ; +static void float_short_big_test (const char * filename) ; +static void float_int_little_test (const char * filename) ; +static void float_int_big_test (const char * filename) ; +static void double_short_little_test (const char * filename) ; +static void double_short_big_test (const char * filename) ; +static void double_int_little_test (const char * filename) ; +static void double_int_big_test (const char * filename) ; + + +static double double_data [DFT_DATA_LENGTH] ; +static double double_test [DFT_DATA_LENGTH] ; + +static float float_data [DFT_DATA_LENGTH] ; +static float float_test [DFT_DATA_LENGTH] ; + +static double double_data [DFT_DATA_LENGTH] ; +static short short_data [DFT_DATA_LENGTH] ; +static int int_data [DFT_DATA_LENGTH] ; + +int +main (int argc, char *argv []) +{ int allow_exit = 1 ; + + if (argc == 2 && ! strstr (argv [1], "no-exit")) + allow_exit = 0 ; + +#if (HAVE_LRINTF == 0) + puts ("*** Cannot run this test on this platform because it lacks lrintf().") ; + exit (0) ; +#endif + + /* Float tests. */ + float_scaled_test ("float.raw", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, + OS_IS_OPENBSD ? -98.0 : -163.0) ; + + /* Test both signed and unsigned 8 bit files. */ + float_scaled_test ("pcm_s8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_S8, -39.0) ; + float_scaled_test ("pcm_u8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_U8, -39.0) ; + + float_scaled_test ("pcm_16.raw", allow_exit, SF_FALSE, SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_16, -87.0) ; + float_scaled_test ("pcm_24.raw", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_24, -138.0) ; + float_scaled_test ("pcm_32.raw", allow_exit, SF_FALSE, SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_32, -163.0) ; + + float_scaled_test ("ulaw.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_ULAW, -50.0) ; + float_scaled_test ("alaw.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_ALAW, -49.0) ; + + float_scaled_test ("ima_adpcm.wav", allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, -47.0) ; + float_scaled_test ("ms_adpcm.wav" , allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, -40.0) ; + float_scaled_test ("gsm610.raw" , allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_GSM610, -33.0) ; + + float_scaled_test ("g721_32.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G721_32, -32.3) ; + float_scaled_test ("g723_24.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_24, -32.3) ; + float_scaled_test ("g723_40.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_40, -40.0) ; + + /* PAF files do not use the same encoding method for 24 bit PCM data as other file + ** formats so we need to explicitly test it here. + */ + float_scaled_test ("le_paf_24.paf", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_24, -149.0) ; + float_scaled_test ("be_paf_24.paf", allow_exit, SF_FALSE, SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_24, -149.0) ; + + float_scaled_test ("dwvw_12.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_12, -64.0) ; + float_scaled_test ("dwvw_16.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_16, -92.0) ; + float_scaled_test ("dwvw_24.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_24, -151.0) ; + + float_scaled_test ("adpcm.vox", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, -40.0) ; + + float_scaled_test ("dpcm_16.xi", allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_16, -90.0) ; + float_scaled_test ("dpcm_8.xi" , allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_8 , -41.0) ; + + float_scaled_test ("pcm_s8.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_S8, -89.0) ; + float_scaled_test ("pcm_16.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_16, -132.0) ; + float_scaled_test ("pcm_24.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_24, -170.0) ; + + float_scaled_test ("alac_16.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_16, -90.0) ; + float_scaled_test ("alac_32.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_32, -76.0) ; + float_scaled_test ("alac_24.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_24, -153.0) ; + float_scaled_test ("alac_20.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_20, -125.0) ; + +#if HAVE_EXTERNAL_XIPH_LIBS + float_scaled_test ("flac_8.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_S8, -39.0) ; + float_scaled_test ("flac_16.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_16, -87.0) ; + float_scaled_test ("flac_24.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_24, -138.0) ; + + float_scaled_test ("vorbis.oga", allow_exit, SF_FALSE, SF_FORMAT_OGG | SF_FORMAT_VORBIS, -31.0) ; + + float_scaled_test ("opus.opus", allow_exit, SF_FALSE, SF_FORMAT_OGG | SF_FORMAT_OPUS, -32.0) ; +#endif + + float_scaled_test ("replace_float.raw", allow_exit, SF_TRUE, SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, -163.0) ; + + /*============================================================================== + ** Double tests. + */ + + double_scaled_test ("double.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DOUBLE, -201.0) ; + + /* Test both signed (AIFF) and unsigned (WAV) 8 bit files. */ + double_scaled_test ("pcm_s8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_S8, -39.0) ; + double_scaled_test ("pcm_u8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_U8, -39.0) ; + + double_scaled_test ("pcm_16.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_16, -87.0) ; + double_scaled_test ("pcm_24.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_24, -135.0) ; + double_scaled_test ("pcm_32.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_32, -184.0) ; + + double_scaled_test ("ulaw.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_ULAW, -50.0) ; + double_scaled_test ("alaw.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_ALAW, -49.0) ; + + double_scaled_test ("ima_adpcm.wav", allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, -47.0) ; + double_scaled_test ("ms_adpcm.wav" , allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, -40.0) ; + double_scaled_test ("gsm610.raw" , allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_GSM610, -33.0) ; + + double_scaled_test ("g721_32.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G721_32, -32.3) ; + double_scaled_test ("g723_24.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_24, -32.3) ; + double_scaled_test ("g723_40.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_40, -40.0) ; + + /* 24 bit PCM PAF files tested here. */ + double_scaled_test ("be_paf_24.paf", allow_exit, SF_FALSE, SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_24, -151.0) ; + double_scaled_test ("le_paf_24.paf", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_24, -151.0) ; + + double_scaled_test ("dwvw_12.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_12, -64.0) ; + double_scaled_test ("dwvw_16.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_16, -92.0) ; + double_scaled_test ("dwvw_24.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_24, -151.0) ; + + double_scaled_test ("adpcm.vox" , allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, -40.0) ; + + double_scaled_test ("dpcm_16.xi", allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_16, -90.0) ; + double_scaled_test ("dpcm_8.xi" , allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_8 , -41.0) ; + + double_scaled_test ("pcm_s8.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_S8, -89.0) ; + double_scaled_test ("pcm_16.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_16, -132.0) ; + double_scaled_test ("pcm_24.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_24, -180.0) ; + + double_scaled_test ("alac_16.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_16, -90.0) ; + double_scaled_test ("alac_20.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_20, -125.0) ; + double_scaled_test ("alac_24.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_24, -153.0) ; + double_scaled_test ("alac_32.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_32, -186.0) ; + +#if HAVE_EXTERNAL_XIPH_LIBS + double_scaled_test ("flac_8.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_S8, -39.0) ; + double_scaled_test ("flac_16.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_16, -87.0) ; + double_scaled_test ("flac_24.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_24, -138.0) ; + + double_scaled_test ("vorbis.oga", allow_exit, SF_FALSE, SF_FORMAT_OGG | SF_FORMAT_VORBIS, -29.0) ; + double_scaled_test ("opus.opus", allow_exit, SF_FALSE, SF_FORMAT_OGG | SF_FORMAT_OPUS, -32.0) ; +#endif + + double_scaled_test ("replace_double.raw", allow_exit, SF_TRUE, SF_FORMAT_RAW | SF_FORMAT_DOUBLE, -201.0) ; + + putchar ('\n') ; + /* Float int tests. */ + float_short_little_test ("float_short_little.au") ; + float_short_big_test ("float_short_big.au") ; + float_int_little_test ("float_int_little.au") ; + float_int_big_test ("float_int_big.au") ; + double_short_little_test ("double_short_little.au") ; + double_short_big_test ("double_short_big.au") ; + double_int_little_test ("double_int_little.au") ; + double_int_big_test ("double_int_big.au") ; + + + return 0 ; +} /* main */ + +/*============================================================================================ + * Here are the test functions. + */ + +static void +float_scaled_test (const char *filename, int allow_exit, int replace_float, int filetype, double target_snr) +{ SNDFILE *file ; + SF_INFO sfinfo ; + double snr ; + int byterate ; + + print_test_name ("float_scaled_test", filename) ; + + gen_windowed_sine_float (float_data, DFT_DATA_LENGTH, 0.9999) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DFT_DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + + test_write_float_or_die (file, 0, float_data, DFT_DATA_LENGTH, __LINE__) ; + + sf_close (file) ; + + memset (float_test, 0, sizeof (float_test)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + + exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit_if_true (sfinfo.frames < DFT_DATA_LENGTH, "\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; + exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_float_or_die (file, 0, float_test, DFT_DATA_LENGTH, __LINE__) ; + + byterate = sf_current_byterate (file) ; + exit_if_true (byterate <= 0, "\n\nLine %d: byterate is zero.\n", __LINE__) ; + + sf_close (file) ; + + snr = dft_cmp_float (__LINE__, float_data, float_test, DFT_DATA_LENGTH, target_snr, allow_exit) ; + + exit_if_true (snr > target_snr, "% 6.1fdB SNR\n\n Error : should be better than % 6.1fdB\n\n", snr, target_snr) ; + + printf ("% 6.1fdB SNR ... ok\n", snr) ; + + unlink (filename) ; + + return ; +} /* float_scaled_test */ + +static void +double_scaled_test (const char *filename, int allow_exit, int replace_float, int filetype, double target_snr) +{ SNDFILE *file ; + SF_INFO sfinfo ; + double snr ; + int byterate ; + + print_test_name ("double_scaled_test", filename) ; + + gen_windowed_sine_double (double_data, DFT_DATA_LENGTH, 0.9999) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DFT_DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + + test_write_double_or_die (file, 0, double_data, DFT_DATA_LENGTH, __LINE__) ; + + sf_close (file) ; + + memset (double_test, 0, sizeof (double_test)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + + exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit_if_true (sfinfo.frames < DFT_DATA_LENGTH, "\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; + exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_double_or_die (file, 0, double_test, DFT_DATA_LENGTH, __LINE__) ; + + byterate = sf_current_byterate (file) ; + exit_if_true (byterate <= 0, "\n\nLine %d: byterate is zero.\n", __LINE__) ; + + sf_close (file) ; + + snr = dft_cmp_double (__LINE__, double_data, double_test, DFT_DATA_LENGTH, target_snr, allow_exit) ; + + exit_if_true (snr > target_snr, "% 6.1fdB SNR\n\n Error : should be better than % 6.1fdB\n\n", snr, target_snr) ; + + printf ("% 6.1fdB SNR ... ok\n", snr) ; + + unlink (filename) ; + + return ; +} /* double_scaled_test */ + +/*============================================================================== +*/ + + +static void +float_short_little_test (const char * filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int max ; + unsigned k ; + + print_test_name ("float_short_little_test", filename) ; + + gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 0.9999) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = ARRAY_LEN (short_data) ; + sfinfo.channels = 1 ; + sfinfo.format = SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_FLOAT ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_float_or_die (file, 0, float_data, ARRAY_LEN (float_data), __LINE__) ; + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.frames != ARRAY_LEN (float_data)) + { printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; + + test_read_short_or_die (file, 0, short_data, ARRAY_LEN (short_data), __LINE__) ; + sf_close (file) ; + + max = 0 ; + for (k = 0 ; k < ARRAY_LEN (short_data) ; k++) + if (abs (short_data [k]) > max) + max = abs (short_data [k]) ; + + if (1.0 * abs (max - 0x7FFF) / 0x7FFF > 0.01) + { printf ("\n\nLine %d: Bad maximum (%d should be %d).\n\n", __LINE__, max, 0x7FFF) ; + exit (1) ; + } ; + + unlink (filename) ; + puts ("ok") ; +} /* float_short_little_test */ + +static void +float_short_big_test (const char * filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int max ; + unsigned k ; + + print_test_name ("float_short_big_test", filename) ; + + gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 0.9999) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = ARRAY_LEN (short_data) ; + sfinfo.channels = 1 ; + sfinfo.format = SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_FLOAT ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_float_or_die (file, 0, float_data, ARRAY_LEN (float_data), __LINE__) ; + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.frames != ARRAY_LEN (float_data)) + { printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; + + test_read_short_or_die (file, 0, short_data, ARRAY_LEN (short_data), __LINE__) ; + sf_close (file) ; + + max = 0 ; + for (k = 0 ; k < ARRAY_LEN (short_data) ; k++) + if (abs (short_data [k]) > max) + max = abs (short_data [k]) ; + + if (1.0 * abs (max - 0x7FFF) / 0x7FFF > 0.01) + { printf ("\n\nLine %d: Bad maximum (%d should be %d).\n\n", __LINE__, max, 0x7FFF) ; + exit (1) ; + } ; + + unlink (filename) ; + puts ("ok") ; +} /* float_short_big_test */ + +static void +float_int_little_test (const char * filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int max ; + unsigned k ; + + print_test_name ("float_int_little_test", filename) ; + + gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 0.9999) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = ARRAY_LEN (int_data) ; + sfinfo.channels = 1 ; + sfinfo.format = SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_FLOAT ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_float_or_die (file, 0, float_data, ARRAY_LEN (float_data), __LINE__) ; + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.frames != ARRAY_LEN (float_data)) + { printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; + + test_read_int_or_die (file, 0, int_data, ARRAY_LEN (int_data), __LINE__) ; + sf_close (file) ; + + max = 0 ; + for (k = 0 ; k < ARRAY_LEN (int_data) ; k++) + if (abs (int_data [k]) > max) + max = abs (int_data [k]) ; + + if (1.0 * abs (max - 0x7FFFFFFF) / 0x7FFFFFFF > 0.01) + { printf ("\n\nLine %d: Bad maximum (%d should be %d).\n\n", __LINE__, max, 0x7FFFFFFF) ; + exit (1) ; + } ; + + unlink (filename) ; + puts ("ok") ; +} /* float_int_little_test */ + +static void +float_int_big_test (const char * filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int max ; + unsigned k ; + + print_test_name ("float_int_big_test", filename) ; + + gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 0.9999) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = ARRAY_LEN (int_data) ; + sfinfo.channels = 1 ; + sfinfo.format = SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_FLOAT ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_float_or_die (file, 0, float_data, ARRAY_LEN (float_data), __LINE__) ; + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.frames != ARRAY_LEN (float_data)) + { printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; + + test_read_int_or_die (file, 0, int_data, ARRAY_LEN (int_data), __LINE__) ; + sf_close (file) ; + + max = 0 ; + for (k = 0 ; k < ARRAY_LEN (int_data) ; k++) + if (abs (int_data [k]) > max) + max = abs (int_data [k]) ; + + if (1.0 * abs (max - 0x7FFFFFFF) / 0x7FFFFFFF > 0.01) + { printf ("\n\nLine %d: Bad maximum (%d should be %d).\n\n", __LINE__, max, 0x7FFFFFFF) ; + exit (1) ; + } ; + + unlink (filename) ; + puts ("ok") ; +} /* float_int_big_test */ + +static void +double_short_little_test (const char * filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int max ; + unsigned k ; + + print_test_name ("double_short_little_test", filename) ; + + gen_windowed_sine_double (double_data, ARRAY_LEN (double_data), 0.9999) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = ARRAY_LEN (short_data) ; + sfinfo.channels = 1 ; + sfinfo.format = SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_DOUBLE ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_double_or_die (file, 0, double_data, ARRAY_LEN (double_data), __LINE__) ; + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.frames != ARRAY_LEN (double_data)) + { printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; + + test_read_short_or_die (file, 0, short_data, ARRAY_LEN (short_data), __LINE__) ; + sf_close (file) ; + + max = 0 ; + for (k = 0 ; k < ARRAY_LEN (short_data) ; k++) + if (abs (short_data [k]) > max) + max = abs (short_data [k]) ; + + if (1.0 * abs (max - 0x7FFF) / 0x7FFF > 0.01) + { printf ("\n\nLine %d: Bad maximum (%d should be %d).\n\n", __LINE__, max, 0x7FFF) ; + exit (1) ; + } ; + + unlink (filename) ; + puts ("ok") ; +} /* double_short_little_test */ + +static void +double_short_big_test (const char * filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int max ; + unsigned k ; + + print_test_name ("double_short_big_test", filename) ; + + gen_windowed_sine_double (double_data, ARRAY_LEN (double_data), 0.9999) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = ARRAY_LEN (short_data) ; + sfinfo.channels = 1 ; + sfinfo.format = SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_DOUBLE ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_double_or_die (file, 0, double_data, ARRAY_LEN (double_data), __LINE__) ; + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.frames != ARRAY_LEN (double_data)) + { printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; + + test_read_short_or_die (file, 0, short_data, ARRAY_LEN (short_data), __LINE__) ; + sf_close (file) ; + + max = 0 ; + for (k = 0 ; k < ARRAY_LEN (short_data) ; k++) + if (abs (short_data [k]) > max) + max = abs (short_data [k]) ; + + if (1.0 * abs (max - 0x7FFF) / 0x7FFF > 0.01) + { printf ("\n\nLine %d: Bad maximum (%d should be %d).\n\n", __LINE__, max, 0x7FFF) ; + exit (1) ; + } ; + + unlink (filename) ; + puts ("ok") ; +} /* double_short_big_test */ + +static void +double_int_little_test (const char * filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int max ; + unsigned k ; + + print_test_name ("double_int_little_test", filename) ; + + gen_windowed_sine_double (double_data, ARRAY_LEN (double_data), 0.9999) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = ARRAY_LEN (int_data) ; + sfinfo.channels = 1 ; + sfinfo.format = SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_DOUBLE ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_double_or_die (file, 0, double_data, ARRAY_LEN (double_data), __LINE__) ; + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.frames != ARRAY_LEN (double_data)) + { printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; + + test_read_int_or_die (file, 0, int_data, ARRAY_LEN (int_data), __LINE__) ; + sf_close (file) ; + + max = 0 ; + for (k = 0 ; k < ARRAY_LEN (int_data) ; k++) + if (abs (int_data [k]) > max) + max = abs (int_data [k]) ; + + if (1.0 * abs (max - 0x7FFFFFFF) / 0x7FFFFFFF > 0.01) + { printf ("\n\nLine %d: Bad maximum (%d should be %d).\n\n", __LINE__, max, 0x7FFFFFFF) ; + exit (1) ; + } ; + + unlink (filename) ; + puts ("ok") ; +} /* double_int_little_test */ + +static void +double_int_big_test (const char * filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int max ; + unsigned k ; + + print_test_name ("double_int_big_test", filename) ; + + gen_windowed_sine_double (double_data, ARRAY_LEN (double_data), 0.9999) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = ARRAY_LEN (int_data) ; + sfinfo.channels = 1 ; + sfinfo.format = SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_DOUBLE ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_double_or_die (file, 0, double_data, ARRAY_LEN (double_data), __LINE__) ; + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.frames != ARRAY_LEN (double_data)) + { printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; + + test_read_int_or_die (file, 0, int_data, ARRAY_LEN (int_data), __LINE__) ; + sf_close (file) ; + + max = 0 ; + for (k = 0 ; k < ARRAY_LEN (int_data) ; k++) + if (abs (int_data [k]) > max) + max = abs (int_data [k]) ; + + if (1.0 * abs (max - 0x7FFFFFFF) / 0x7FFFFFFF > 0.01) + { printf ("\n\nLine %d: Bad maximum (%d should be %d).\n\n", __LINE__, max, 0x7FFFFFFF) ; + exit (1) ; + } ; + + unlink (filename) ; + puts ("ok") ; +} /* double_int_big_test */ + + diff --git a/libsndfile-1.0.31/tests/floating_point_test.def b/libsndfile-1.0.31/tests/floating_point_test.def new file mode 100644 index 0000000..e368ddf --- /dev/null +++ b/libsndfile-1.0.31/tests/floating_point_test.def @@ -0,0 +1,32 @@ +autogen definitions floating_point_test.tpl; + +endian_type = { + end_name = little ; + end_type = SF_ENDIAN_LITTLE ; + } ; + +endian_type = { + end_name = big ; + end_type = SF_ENDIAN_BIG ; + } ; + +float_type = { + float_name = float ; + minor_type = SF_FORMAT_FLOAT ; + } ; + +float_type = { + float_name = double ; + minor_type = SF_FORMAT_DOUBLE ; + } ; + +int_type = { + int_name = short ; + int_max = "0x7FFF" ; + } ; + +int_type = { + int_name = int ; + int_max = "0x7FFFFFFF" ; + } ; + diff --git a/libsndfile-1.0.31/tests/floating_point_test.tpl b/libsndfile-1.0.31/tests/floating_point_test.tpl new file mode 100644 index 0000000..7258fa2 --- /dev/null +++ b/libsndfile-1.0.31/tests/floating_point_test.tpl @@ -0,0 +1,365 @@ +[+ AutoGen5 template c +] +/* +** Copyright (C) 1999-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "dft_cmp.h" +#include "utils.h" + +#define SAMPLE_RATE 16000 + +static void float_scaled_test (const char *filename, int allow_exit, int replace_float, int filetype, double target_snr) ; +static void double_scaled_test (const char *filename, int allow_exit, int replace_float, int filetype, double target_snr) ; + +[+ FOR float_type +][+ FOR int_type +][+ FOR endian_type ++]static void [+ (get "float_name") +]_[+ (get "int_name") +]_[+ (get "end_name") +]_test (const char * filename) ; +[+ ENDFOR endian_type +][+ ENDFOR int_type +][+ ENDFOR float_type ++] + +static double double_data [DFT_DATA_LENGTH] ; +static double double_test [DFT_DATA_LENGTH] ; + +static float float_data [DFT_DATA_LENGTH] ; +static float float_test [DFT_DATA_LENGTH] ; + +static double double_data [DFT_DATA_LENGTH] ; +static short short_data [DFT_DATA_LENGTH] ; +static int int_data [DFT_DATA_LENGTH] ; + +int +main (int argc, char *argv []) +{ int allow_exit = 1 ; + + if (argc == 2 && ! strstr (argv [1], "no-exit")) + allow_exit = 0 ; + +#if (HAVE_LRINTF == 0) + puts ("*** Cannot run this test on this platform because it lacks lrintf().") ; + exit (0) ; +#endif + + /* Float tests. */ + float_scaled_test ("float.raw", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, + OS_IS_OPENBSD ? -98.0 : -163.0) ; + + /* Test both signed and unsigned 8 bit files. */ + float_scaled_test ("pcm_s8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_S8, -39.0) ; + float_scaled_test ("pcm_u8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_U8, -39.0) ; + + float_scaled_test ("pcm_16.raw", allow_exit, SF_FALSE, SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_16, -87.0) ; + float_scaled_test ("pcm_24.raw", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_24, -138.0) ; + float_scaled_test ("pcm_32.raw", allow_exit, SF_FALSE, SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_32, -163.0) ; + + float_scaled_test ("ulaw.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_ULAW, -50.0) ; + float_scaled_test ("alaw.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_ALAW, -49.0) ; + + float_scaled_test ("ima_adpcm.wav", allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, -47.0) ; + float_scaled_test ("ms_adpcm.wav" , allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, -40.0) ; + float_scaled_test ("gsm610.raw" , allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_GSM610, -33.0) ; + + float_scaled_test ("g721_32.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G721_32, -32.3) ; + float_scaled_test ("g723_24.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_24, -32.3) ; + float_scaled_test ("g723_40.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_40, -40.0) ; + + /* PAF files do not use the same encoding method for 24 bit PCM data as other file + ** formats so we need to explicitly test it here. + */ + float_scaled_test ("le_paf_24.paf", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_24, -149.0) ; + float_scaled_test ("be_paf_24.paf", allow_exit, SF_FALSE, SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_24, -149.0) ; + + float_scaled_test ("dwvw_12.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_12, -64.0) ; + float_scaled_test ("dwvw_16.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_16, -92.0) ; + float_scaled_test ("dwvw_24.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_24, -151.0) ; + + float_scaled_test ("adpcm.vox", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, -40.0) ; + + float_scaled_test ("dpcm_16.xi", allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_16, -90.0) ; + float_scaled_test ("dpcm_8.xi" , allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_8 , -41.0) ; + + float_scaled_test ("pcm_s8.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_S8, -89.0) ; + float_scaled_test ("pcm_16.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_16, -132.0) ; + float_scaled_test ("pcm_24.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_24, -170.0) ; + + float_scaled_test ("alac_16.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_16, -90.0) ; + float_scaled_test ("alac_32.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_32, -76.0) ; + float_scaled_test ("alac_24.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_24, -153.0) ; + float_scaled_test ("alac_20.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_20, -125.0) ; + +#if HAVE_EXTERNAL_XIPH_LIBS + float_scaled_test ("flac_8.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_S8, -39.0) ; + float_scaled_test ("flac_16.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_16, -87.0) ; + float_scaled_test ("flac_24.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_24, -138.0) ; + + float_scaled_test ("vorbis.oga", allow_exit, SF_FALSE, SF_FORMAT_OGG | SF_FORMAT_VORBIS, -31.0) ; + + float_scaled_test ("opus.opus", allow_exit, SF_FALSE, SF_FORMAT_OGG | SF_FORMAT_OPUS, -32.0) ; +#endif + + float_scaled_test ("replace_float.raw", allow_exit, SF_TRUE, SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, -163.0) ; + + /*============================================================================== + ** Double tests. + */ + + double_scaled_test ("double.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DOUBLE, -201.0) ; + + /* Test both signed (AIFF) and unsigned (WAV) 8 bit files. */ + double_scaled_test ("pcm_s8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_S8, -39.0) ; + double_scaled_test ("pcm_u8.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_U8, -39.0) ; + + double_scaled_test ("pcm_16.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_16, -87.0) ; + double_scaled_test ("pcm_24.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_24, -135.0) ; + double_scaled_test ("pcm_32.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_PCM_32, -184.0) ; + + double_scaled_test ("ulaw.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_ULAW, -50.0) ; + double_scaled_test ("alaw.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_ALAW, -49.0) ; + + double_scaled_test ("ima_adpcm.wav", allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, -47.0) ; + double_scaled_test ("ms_adpcm.wav" , allow_exit, SF_FALSE, SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, -40.0) ; + double_scaled_test ("gsm610.raw" , allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_GSM610, -33.0) ; + + double_scaled_test ("g721_32.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G721_32, -32.3) ; + double_scaled_test ("g723_24.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_24, -32.3) ; + double_scaled_test ("g723_40.au", allow_exit, SF_FALSE, SF_FORMAT_AU | SF_FORMAT_G723_40, -40.0) ; + + /* 24 bit PCM PAF files tested here. */ + double_scaled_test ("be_paf_24.paf", allow_exit, SF_FALSE, SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_24, -151.0) ; + double_scaled_test ("le_paf_24.paf", allow_exit, SF_FALSE, SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_24, -151.0) ; + + double_scaled_test ("dwvw_12.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_12, -64.0) ; + double_scaled_test ("dwvw_16.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_16, -92.0) ; + double_scaled_test ("dwvw_24.raw", allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_DWVW_24, -151.0) ; + + double_scaled_test ("adpcm.vox" , allow_exit, SF_FALSE, SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, -40.0) ; + + double_scaled_test ("dpcm_16.xi", allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_16, -90.0) ; + double_scaled_test ("dpcm_8.xi" , allow_exit, SF_FALSE, SF_FORMAT_XI | SF_FORMAT_DPCM_8 , -41.0) ; + + double_scaled_test ("pcm_s8.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_S8, -89.0) ; + double_scaled_test ("pcm_16.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_16, -132.0) ; + double_scaled_test ("pcm_24.sds", allow_exit, SF_FALSE, SF_FORMAT_SDS | SF_FORMAT_PCM_24, -180.0) ; + + double_scaled_test ("alac_16.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_16, -90.0) ; + double_scaled_test ("alac_20.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_20, -125.0) ; + double_scaled_test ("alac_24.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_24, -153.0) ; + double_scaled_test ("alac_32.caf", allow_exit, SF_FALSE, SF_FORMAT_CAF | SF_FORMAT_ALAC_32, -186.0) ; + +#if HAVE_EXTERNAL_XIPH_LIBS + double_scaled_test ("flac_8.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_S8, -39.0) ; + double_scaled_test ("flac_16.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_16, -87.0) ; + double_scaled_test ("flac_24.flac", allow_exit, SF_FALSE, SF_FORMAT_FLAC | SF_FORMAT_PCM_24, -138.0) ; + + double_scaled_test ("vorbis.oga", allow_exit, SF_FALSE, SF_FORMAT_OGG | SF_FORMAT_VORBIS, -29.0) ; + double_scaled_test ("opus.opus", allow_exit, SF_FALSE, SF_FORMAT_OGG | SF_FORMAT_OPUS, -32.0) ; +#endif + + double_scaled_test ("replace_double.raw", allow_exit, SF_TRUE, SF_FORMAT_RAW | SF_FORMAT_DOUBLE, -201.0) ; + + putchar ('\n') ; + /* Float int tests. */ +[+ FOR float_type +][+ FOR int_type +][+ FOR endian_type ++] [+ (get "float_name") +]_[+ (get "int_name") +]_[+ (get "end_name") +]_test ("[+ (get "float_name") +]_[+ (get "int_name") +]_[+ (get "end_name") +].au") ; +[+ ENDFOR endian_type +][+ ENDFOR int_type +][+ ENDFOR float_type ++] + + return 0 ; +} /* main */ + +/*============================================================================================ + * Here are the test functions. + */ + +static void +float_scaled_test (const char *filename, int allow_exit, int replace_float, int filetype, double target_snr) +{ SNDFILE *file ; + SF_INFO sfinfo ; + double snr ; + int byterate ; + + print_test_name ("float_scaled_test", filename) ; + + gen_windowed_sine_float (float_data, DFT_DATA_LENGTH, 0.9999) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DFT_DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + + test_write_float_or_die (file, 0, float_data, DFT_DATA_LENGTH, __LINE__) ; + + sf_close (file) ; + + memset (float_test, 0, sizeof (float_test)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + + exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit_if_true (sfinfo.frames < DFT_DATA_LENGTH, "\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; + exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_float_or_die (file, 0, float_test, DFT_DATA_LENGTH, __LINE__) ; + + byterate = sf_current_byterate (file) ; + exit_if_true (byterate <= 0, "\n\nLine %d: byterate is zero.\n", __LINE__) ; + + sf_close (file) ; + + snr = dft_cmp_float (__LINE__, float_data, float_test, DFT_DATA_LENGTH, target_snr, allow_exit) ; + + exit_if_true (snr > target_snr, "% 6.1fdB SNR\n\n Error : should be better than % 6.1fdB\n\n", snr, target_snr) ; + + printf ("% 6.1fdB SNR ... ok\n", snr) ; + + unlink (filename) ; + + return ; +} /* float_scaled_test */ + +static void +double_scaled_test (const char *filename, int allow_exit, int replace_float, int filetype, double target_snr) +{ SNDFILE *file ; + SF_INFO sfinfo ; + double snr ; + int byterate ; + + print_test_name ("double_scaled_test", filename) ; + + gen_windowed_sine_double (double_data, DFT_DATA_LENGTH, 0.9999) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DFT_DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + + test_write_double_or_die (file, 0, double_data, DFT_DATA_LENGTH, __LINE__) ; + + sf_close (file) ; + + memset (double_test, 0, sizeof (double_test)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + + exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit_if_true (sfinfo.frames < DFT_DATA_LENGTH, "\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; + exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_double_or_die (file, 0, double_test, DFT_DATA_LENGTH, __LINE__) ; + + byterate = sf_current_byterate (file) ; + exit_if_true (byterate <= 0, "\n\nLine %d: byterate is zero.\n", __LINE__) ; + + sf_close (file) ; + + snr = dft_cmp_double (__LINE__, double_data, double_test, DFT_DATA_LENGTH, target_snr, allow_exit) ; + + exit_if_true (snr > target_snr, "% 6.1fdB SNR\n\n Error : should be better than % 6.1fdB\n\n", snr, target_snr) ; + + printf ("% 6.1fdB SNR ... ok\n", snr) ; + + unlink (filename) ; + + return ; +} /* double_scaled_test */ + +/*============================================================================== +*/ + +[+ FOR float_type +][+ FOR int_type +][+ FOR endian_type ++] +static void +[+ (get "float_name") +]_[+ (get "int_name") +]_[+ (get "end_name") +]_test (const char * filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int max ; + unsigned k ; + + print_test_name ("[+ (get "float_name") +]_[+ (get "int_name") +]_[+ (get "end_name") +]_test", filename) ; + + gen_windowed_sine_[+ (get "float_name") +] ([+ (get "float_name") +]_data, ARRAY_LEN ([+ (get "float_name") +]_data), 0.9999) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = ARRAY_LEN ([+ (get "int_name") +]_data) ; + sfinfo.channels = 1 ; + sfinfo.format = [+ (get "end_type") +] | SF_FORMAT_AU | [+ (get "minor_type") +] ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_[+ (get "float_name") +]_or_die (file, 0, [+ (get "float_name") +]_data, ARRAY_LEN ([+ (get "float_name") +]_data), __LINE__) ; + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.frames != ARRAY_LEN ([+ (get "float_name") +]_data)) + { printf ("\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; + + test_read_[+ (get "int_name") +]_or_die (file, 0, [+ (get "int_name") +]_data, ARRAY_LEN ([+ (get "int_name") +]_data), __LINE__) ; + sf_close (file) ; + + max = 0 ; + for (k = 0 ; k < ARRAY_LEN ([+ (get "int_name") +]_data) ; k++) + if (abs ([+ (get "int_name") +]_data [k]) > max) + max = abs ([+ (get "int_name") +]_data [k]) ; + + if (1.0 * abs (max - [+ (get "int_max") +]) / [+ (get "int_max") +] > 0.01) + { printf ("\n\nLine %d: Bad maximum (%d should be %d).\n\n", __LINE__, max, [+ (get "int_max") +]) ; + exit (1) ; + } ; + + unlink (filename) ; + puts ("ok") ; +} /* [+ (get "float_name") +]_[+ (get "int_name") +]_[+ (get "end_name") +]_test */ +[+ ENDFOR endian_type +][+ ENDFOR int_type +][+ ENDFOR float_type +] + diff --git a/libsndfile-1.0.31/tests/format_check_test.c b/libsndfile-1.0.31/tests/format_check_test.c new file mode 100644 index 0000000..7ab71c9 --- /dev/null +++ b/libsndfile-1.0.31/tests/format_check_test.c @@ -0,0 +1,156 @@ +/* +** Copyright (C) 2011-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include "sndfile.h" +#include "utils.h" + +static void format_error_test (void) ; +static void format_combo_test (void) ; + +int +main (void) +{ + format_error_test () ; + format_combo_test () ; + + return 0 ; +} /* main */ + +/*============================================================================== +*/ + +static void +format_error_test (void) +{ const char *filename = "format-error.wav" ; + SNDFILE *file ; + SF_INFO info ; + + print_test_name (__func__, NULL) ; + + memset (&info, 0, sizeof (info)) ; + info.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ; + info.channels = 1 ; + info.samplerate = 44100 ; + + info.format = SF_FORMAT_WAV ; + file = sf_open (filename, SFM_WRITE, &info) ; + exit_if_true (file != NULL, "\n\nLine %d : Format should not be valid.\n\n", __LINE__) ; + exit_if_true ( + strstr (sf_strerror (NULL), "minor format") == NULL, + "\n\nLine %d : Error string should reference bad 'minor format'.\n\n", __LINE__ + ) ; + + info.format = SF_FORMAT_PCM_16 ; + file = sf_open (filename, SFM_WRITE, &info) ; + exit_if_true (file != NULL, "\n\nLine %d : Format should not be valid.\n\n", __LINE__) ; + exit_if_true ( + strstr (sf_strerror (NULL), "major format") == NULL, + "\n\nLine %d : Error string should reference bad 'major format'.\n\n", __LINE__ + ) ; + + unlink (filename) ; + puts ("ok") ; +} /* format_error_test */ + +static void +format_combo_test (void) +{ int container_max, codec_max, cont, codec ; + + print_test_name (__func__, NULL) ; + + sf_command (NULL, SFC_GET_FORMAT_MAJOR_COUNT, &container_max, sizeof (container_max)) ; + sf_command (NULL, SFC_GET_FORMAT_SUBTYPE_COUNT, &codec_max, sizeof (codec_max)) ; + + for (cont = 0 ; cont < container_max + 10 ; cont ++) + { SF_FORMAT_INFO major_fmt_info ; + + memset (&major_fmt_info, 0, sizeof (major_fmt_info)) ; + major_fmt_info.format = cont ; + (void) sf_command (NULL, SFC_GET_FORMAT_MAJOR, &major_fmt_info, sizeof (major_fmt_info)) ; + + for (codec = 0 ; codec < codec_max + 10 ; codec ++) + { SF_FORMAT_INFO subtype_fmt_info ; + SNDFILE * sndfile ; + SF_INFO info ; + char filename [128] ; + int subtype_is_valid, check_is_valid ; + + memset (&info, 0, sizeof (info)) ; + memset (&subtype_fmt_info, 0, sizeof (subtype_fmt_info)) ; + subtype_fmt_info.format = codec ; + subtype_is_valid = sf_command (NULL, SFC_GET_FORMAT_SUBTYPE, &subtype_fmt_info, sizeof (subtype_fmt_info)) == 0 ; + + /* Opus only works with a fixed set of sample rates. */ + if (subtype_fmt_info.format == SF_FORMAT_OPUS) + sf_info_setup (&info, major_fmt_info.format | subtype_fmt_info.format, 24000, 1) ; + else + sf_info_setup (&info, major_fmt_info.format | subtype_fmt_info.format, 22050, 1) ; + + check_is_valid = sf_format_check (&info) ; + + exit_if_true ( + NOT (subtype_is_valid) && check_is_valid, + "\n\nLine %d : Subtype is not valid but checks ok.\n", + __LINE__ + ) ; + + snprintf (filename, sizeof (filename), "format-check.%s", major_fmt_info.extension) ; + + sndfile = sf_open (filename, SFM_WRITE, &info) ; + + sf_close (sndfile) ; + unlink (filename) ; + + if (major_fmt_info.extension != NULL && strcmp (major_fmt_info.extension, "sd2") == 0) + { snprintf (filename, sizeof (filename), "._format-check.%s", major_fmt_info.extension) ; + unlink (filename) ; + } ; + + exit_if_true ( + sndfile && NOT (check_is_valid), + "\n\nError : Format was not valid but file opened correctly.\n" + " Container : %s\n" + " Codec : %s\n\n", + major_fmt_info.name, subtype_fmt_info.name + ) ; + + exit_if_true ( + NOT (sndfile) && check_is_valid, + "\n\nError : Format was valid but file failed to open.\n" + " Container : %s\n" + " Codec : %s\n\n", + major_fmt_info.name, subtype_fmt_info.name + ) ; + } ; + } ; + + puts ("ok") ; +} /* format_combo_test */ + diff --git a/libsndfile-1.0.31/tests/generate.c b/libsndfile-1.0.31/tests/generate.c new file mode 100644 index 0000000..87efbb4 --- /dev/null +++ b/libsndfile-1.0.31/tests/generate.c @@ -0,0 +1,75 @@ +/* +** Copyright (C) 2007-2012 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include + +#include "utils.h" +#include "generate.h" + +#define SF_MAX(x, y) ((x) > (y) ? (x) : (y)) + +static float crappy_snare (float *output, int len, int offset, float gain, float maxabs) ; + +void +generate_file (const char * filename, int format, int len) +{ float * output ; + float maxabs = 0.0 ; + + output = calloc (len, sizeof (float)) ; + + maxabs = crappy_snare (output, len, 0, 0.95, maxabs) ; + maxabs = crappy_snare (output, len, len / 4, 0.85, maxabs) ; + maxabs = crappy_snare (output, len, 2 * len / 4, 0.85, maxabs) ; + crappy_snare (output, len, 3 * len / 4, 0.85, maxabs) ; + + write_mono_file (filename, format, 44100, output, len) ; + + free (output) ; +} /* generate_file */ + +static inline float +rand_float (void) +{ return rand () / (0.5 * RAND_MAX) - 1.0 ; +} /* rand_float */ + +static float +crappy_snare (float *output, int len, int offset, float gain, float maxabs) +{ int k ; + float env = 0.0 ; + + for (k = offset ; k < len && env < gain ; k++) + { env += 0.03 ; + output [k] += env * rand_float () ; + maxabs = SF_MAX (maxabs, fabs (output [k])) ; + } ; + + for ( ; k < len && env > 1e-8 ; k++) + { env *= 0.995 ; + output [k] += env * rand_float () ; + maxabs = SF_MAX (maxabs, fabs (output [k])) ; + } ; + + return maxabs ; +} /* crappy_snare */ diff --git a/libsndfile-1.0.31/tests/generate.h b/libsndfile-1.0.31/tests/generate.h new file mode 100644 index 0000000..709ea61 --- /dev/null +++ b/libsndfile-1.0.31/tests/generate.h @@ -0,0 +1,19 @@ +/* +** Copyright (C) 2007-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +void generate_file (const char * filename, int format, int len) ; diff --git a/libsndfile-1.0.31/tests/header_test.c b/libsndfile-1.0.31/tests/header_test.c new file mode 100644 index 0000000..e92c3e2 --- /dev/null +++ b/libsndfile-1.0.31/tests/header_test.c @@ -0,0 +1,785 @@ +/* +** Copyright (C) 2001-2017 Erik de Castro Lopo +** +** This program is free software ; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation ; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY ; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#include + +#if HAVE_UNISTD_H +#include +#endif + +#if (HAVE_DECL_S_IRGRP == 0) +#include +#endif + +#if (defined (WIN32) || defined (_WIN32)) +#include +#include +#endif + +#include + +#include "utils.h" + +#define BUFFER_LEN (1 << 10) +#define LOG_BUFFER_SIZE 1024 + +static void update_header_test (const char *filename, int typemajor) ; +static void update_header_before_write_test (const char *filename, int typemajor) ; + +static void update_seek_short_test (const char *filename, int filetype) ; +static void update_seek_int_test (const char *filename, int filetype) ; +static void update_seek_float_test (const char *filename, int filetype) ; +static void update_seek_double_test (const char *filename, int filetype) ; + + +static void extra_header_test (const char *filename, int filetype) ; + +static void header_shrink_test (const char *filename, int filetype) ; + +/* Force the start of this buffer to be double aligned. Sparc-solaris will +** choke if its not. +*/ +static int data_out [BUFFER_LEN] ; +static int data_in [BUFFER_LEN] ; + +int +main (int argc, char *argv []) +{ int do_all = 0 ; + int test_count = 0 ; + + if (argc != 2) + { printf ("Usage : %s \n", argv [0]) ; + printf (" Where is one of the following:\n") ; + printf (" wav - test WAV file peak chunk\n") ; + printf (" aiff - test AIFF file PEAK chunk\n") ; + printf (" all - perform all tests\n") ; + exit (1) ; + } ; + + do_all= !strcmp (argv [1], "all") ; + + if (do_all || ! strcmp (argv [1], "wav")) + { update_header_test ("header.wav", SF_FORMAT_WAV) ; + update_seek_short_test ("header_short.wav", SF_FORMAT_WAV) ; + update_seek_int_test ("header_int.wav", SF_FORMAT_WAV) ; + update_seek_float_test ("header_float.wav", SF_FORMAT_WAV) ; + update_seek_double_test ("header_double.wav", SF_FORMAT_WAV) ; + header_shrink_test ("header_shrink.wav", SF_FORMAT_WAV) ; + extra_header_test ("extra.wav", SF_FORMAT_WAV) ; + + update_header_test ("header.wavex", SF_FORMAT_WAVEX) ; + update_seek_short_test ("header_short.wavex", SF_FORMAT_WAVEX) ; + update_seek_int_test ("header_int.wavex", SF_FORMAT_WAVEX) ; + update_seek_float_test ("header_float.wavex", SF_FORMAT_WAVEX) ; + update_seek_double_test ("header_double.wavex", SF_FORMAT_WAVEX) ; + header_shrink_test ("header_shrink.wavex", SF_FORMAT_WAVEX) ; + extra_header_test ("extra.wavex", SF_FORMAT_WAVEX) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "aiff")) + { update_header_test ("header.aiff", SF_FORMAT_AIFF) ; + update_seek_short_test ("header_short.aiff", SF_FORMAT_AIFF) ; + update_seek_int_test ("header_int.aiff", SF_FORMAT_AIFF) ; + update_seek_float_test ("header_float.aiff", SF_FORMAT_AIFF) ; + update_seek_double_test ("header_double.aiff", SF_FORMAT_AIFF) ; + header_shrink_test ("header_shrink.wav", SF_FORMAT_AIFF) ; + extra_header_test ("extra.aiff", SF_FORMAT_AIFF) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "au")) + { update_header_test ("header.au", SF_FORMAT_AU) ; + update_seek_short_test ("header_short.au", SF_FORMAT_AU) ; + update_seek_int_test ("header_int.au", SF_FORMAT_AU) ; + update_seek_float_test ("header_float.au", SF_FORMAT_AU) ; + update_seek_double_test ("header_double.au", SF_FORMAT_AU) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "caf")) + { update_header_test ("header.caf", SF_FORMAT_CAF) ; + update_seek_short_test ("header_short.caf", SF_FORMAT_CAF) ; + update_seek_int_test ("header_int.caf", SF_FORMAT_CAF) ; + update_seek_float_test ("header_float.caf", SF_FORMAT_CAF) ; + update_seek_double_test ("header_double.caf", SF_FORMAT_CAF) ; + /* extra_header_test ("extra.caf", SF_FORMAT_CAF) ; */ + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "nist")) + { update_header_test ("header.nist", SF_FORMAT_NIST) ; + update_seek_short_test ("header_short.nist", SF_FORMAT_NIST) ; + update_seek_int_test ("header_int.nist", SF_FORMAT_NIST) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "paf")) + { update_header_test ("header.paf", SF_FORMAT_PAF) ; + update_seek_short_test ("header_short.paf", SF_FORMAT_PAF) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "ircam")) + { update_header_test ("header.ircam", SF_FORMAT_IRCAM) ; + update_seek_short_test ("header_short.ircam", SF_FORMAT_IRCAM) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "w64")) + { update_header_test ("header.w64", SF_FORMAT_W64) ; + update_seek_short_test ("header_short.w64", SF_FORMAT_W64) ; + update_seek_int_test ("header_int.w64", SF_FORMAT_W64) ; + update_seek_float_test ("header_float.w64", SF_FORMAT_W64) ; + update_seek_double_test ("header_double.w64", SF_FORMAT_W64) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "rf64")) + { update_header_test ("header.rf64", SF_FORMAT_RF64) ; + update_seek_short_test ("header_short.rf64", SF_FORMAT_RF64) ; + update_seek_int_test ("header_int.rf64", SF_FORMAT_RF64) ; + update_seek_float_test ("header_float.rf64", SF_FORMAT_RF64) ; + update_seek_double_test ("header_double.rf64", SF_FORMAT_RF64) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mat4")) + { update_header_test ("header.mat4", SF_FORMAT_MAT4) ; + update_seek_short_test ("header_short.mat4", SF_FORMAT_MAT4) ; + update_seek_int_test ("header_int.mat4", SF_FORMAT_MAT4) ; + update_seek_float_test ("header_float.mat4", SF_FORMAT_MAT4) ; + update_seek_double_test ("header_double.mat4", SF_FORMAT_MAT4) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mat5")) + { update_header_test ("header.mat5", SF_FORMAT_MAT5) ; + update_seek_short_test ("header_short.mat5", SF_FORMAT_MAT5) ; + update_seek_int_test ("header_int.mat5", SF_FORMAT_MAT5) ; + update_seek_float_test ("header_float.mat5", SF_FORMAT_MAT5) ; + update_seek_double_test ("header_double.mat5", SF_FORMAT_MAT5) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "pvf")) + { update_header_test ("header.pvf", SF_FORMAT_PVF) ; + update_seek_short_test ("header_short.pvf", SF_FORMAT_PVF) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "avr")) + { update_header_test ("header.avr", SF_FORMAT_AVR) ; + update_seek_short_test ("header_short.avr", SF_FORMAT_AVR) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "htk")) + { update_header_test ("header.htk", SF_FORMAT_HTK) ; + update_seek_short_test ("header_short.htk", SF_FORMAT_HTK) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "svx")) + { update_header_test ("header.svx", SF_FORMAT_SVX) ; + update_seek_short_test ("header_short.svx", SF_FORMAT_SVX) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "voc")) + { update_header_test ("header.voc", SF_FORMAT_VOC) ; + /*-update_seek_short_test ("header_short.voc", SF_FORMAT_VOC) ;-*/ + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "sds")) + { update_header_test ("header.sds", SF_FORMAT_SDS) ; + /*-update_seek_short_test ("header_short.sds", SF_FORMAT_SDS) ;-*/ + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mpc2k")) + { update_header_test ("header.mpc", SF_FORMAT_MPC2K) ; + update_seek_short_test ("header_short.mpc", SF_FORMAT_MPC2K) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "flac")) + { if (HAVE_EXTERNAL_XIPH_LIBS) + update_header_before_write_test ("header.flac", SF_FORMAT_FLAC) ; + else + puts (" No FLAC tests because FLAC support was not compiled in.") ; + test_count++ ; + } ; + + if (test_count == 0) + { printf ("Mono : ************************************\n") ; + printf ("Mono : * No '%s' test defined.\n", argv [1]) ; + printf ("Mono : ************************************\n") ; + return 1 ; + } ; + + return 0 ; +} /* main */ + + +/*============================================================================================ +** Here are the test functions. +*/ + +static void +update_header_sub (const char *filename, int typemajor, int write_mode) +{ SNDFILE *outfile, *infile ; + SF_INFO sfinfo ; + int k ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.format = (typemajor | SF_FORMAT_PCM_16) ; + sfinfo.channels = 1 ; + + outfile = test_open_file_or_die (filename, write_mode, &sfinfo, SF_TRUE, __LINE__) ; + + for (k = 0 ; k < BUFFER_LEN ; k++) + data_out [k] = k + 1 ; + test_write_int_or_die (outfile, 0, data_out, BUFFER_LEN, __LINE__) ; + + if (typemajor != SF_FORMAT_HTK) + { /* The HTK header is not correct when the file is first written. */ + infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_close (infile) ; + } ; + + sf_command (outfile, SFC_UPDATE_HEADER_NOW, NULL, 0) ; + + /* + ** Open file and check log buffer for an error. If header update failed + ** the the log buffer will contain errors. + */ + infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + check_log_buffer_or_die (infile, __LINE__) ; + + if (sfinfo.frames < BUFFER_LEN || sfinfo.frames > BUFFER_LEN + 50) + { printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, BUFFER_LEN) ; + dump_log_buffer (infile) ; + exit (1) ; + } ; + + test_read_int_or_die (infile, 0, data_in, BUFFER_LEN, __LINE__) ; + for (k = 0 ; k < BUFFER_LEN ; k++) + if (data_out [k] != k + 1) + printf ("Error : line %d\n", __LINE__) ; + + sf_close (infile) ; + + /* Set auto update on. */ + sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; + + /* Write more data_out. */ + for (k = 0 ; k < BUFFER_LEN ; k++) + data_out [k] = k + 2 ; + test_write_int_or_die (outfile, 0, data_out, BUFFER_LEN, __LINE__) ; + + /* Open file again and make sure no errors in log buffer. */ + infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + check_log_buffer_or_die (infile, __LINE__) ; + + if (sfinfo.frames < 2 * BUFFER_LEN || sfinfo.frames > 2 * BUFFER_LEN + 50) + { printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 2 * BUFFER_LEN) ; + dump_log_buffer (infile) ; + exit (1) ; + } ; + + sf_close (infile) ; + + sf_close (outfile) ; + + unlink (filename) ; +} /* update_header_sub */ + +static void +update_header_test (const char *filename, int typemajor) +{ + print_test_name ("update_header_test", filename) ; + + update_header_sub (filename, typemajor, SFM_WRITE) ; + update_header_sub (filename, typemajor, SFM_RDWR) ; + + unlink (filename) ; + puts ("ok") ; +} /* update_header_test */ + +static void +update_header_before_write_test (const char *filename, int typemajor) +{ + SNDFILE *outfile ; + SF_INFO sfinfo ; + int k ; + + print_test_name ("update_header_before_write", filename) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.format = (typemajor | SF_FORMAT_PCM_16) ; + sfinfo.channels = 1 ; + + outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + /* FLAC can only write the header once; if the first call to sf_write() will + ** also attempt to write the header, it fails. FLAC-specific regression + */ + sf_command (outfile, SFC_UPDATE_HEADER_NOW, NULL, 0) ; + + for (k = 0 ; k < BUFFER_LEN ; k++) + data_out [k] = k + 1 ; + test_write_int_or_die (outfile, 0, data_out, BUFFER_LEN, __LINE__) ; + + sf_close (outfile) ; + unlink (filename) ; + puts ("ok") ; +} /* update_header_before_write_test */ + +/*============================================================================== +*/ + +static void +update_seek_short_test (const char *filename, int filetype) +{ SNDFILE *outfile, *infile ; + SF_INFO sfinfo ; + sf_count_t frames ; + short buffer [8] ; + int k ; + + print_test_name ("update_seek_short_test", filename) ; + + memset (buffer, 0, sizeof (buffer)) ; + + /* Create sound outfile with no data. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.format = filetype | SF_FORMAT_PCM_16 ; + sfinfo.samplerate = 48000 ; + sfinfo.channels = 2 ; + + if (sf_format_check (&sfinfo) == SF_FALSE) + sfinfo.channels = 1 ; + + outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_close (outfile) ; + + /* Open again for read/write. */ + outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; + + /* + ** In auto header update mode, seeking to the end of the file with + ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END + ** will seek to 0 anyway + */ + if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0) + { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ; + exit (1) ; + } ; + + /* Now write some frames. */ + frames = ARRAY_LEN (buffer) / sfinfo.channels ; + + for (k = 0 ; k < 6 ; k++) + { test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, __LINE__) ; + test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, __LINE__) ; + + /* Open file again and make sure no errors in log buffer. */ + infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + check_log_buffer_or_die (infile, __LINE__) ; + sf_close (infile) ; + + if (sfinfo.frames != k * frames) + { printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %" PRId64 ")\n", __LINE__, sfinfo.frames, k + frames) ; + dump_log_buffer (infile) ; + exit (1) ; + } ; + + if ((k & 1) == 0) + test_write_short_or_die (outfile, k, buffer, sfinfo.channels * frames, __LINE__) ; + else + test_writef_short_or_die (outfile, k, buffer, frames, __LINE__) ; + } ; + + sf_close (outfile) ; + unlink (filename) ; + + puts ("ok") ; + return ; +} /* update_seek_short_test */ + +static void +update_seek_int_test (const char *filename, int filetype) +{ SNDFILE *outfile, *infile ; + SF_INFO sfinfo ; + sf_count_t frames ; + int buffer [8] ; + int k ; + + print_test_name ("update_seek_int_test", filename) ; + + memset (buffer, 0, sizeof (buffer)) ; + + /* Create sound outfile with no data. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.format = filetype | SF_FORMAT_PCM_32 ; + sfinfo.samplerate = 48000 ; + sfinfo.channels = 2 ; + + if (sf_format_check (&sfinfo) == SF_FALSE) + sfinfo.channels = 1 ; + + outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_close (outfile) ; + + /* Open again for read/write. */ + outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; + + /* + ** In auto header update mode, seeking to the end of the file with + ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END + ** will seek to 0 anyway + */ + if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0) + { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ; + exit (1) ; + } ; + + /* Now write some frames. */ + frames = ARRAY_LEN (buffer) / sfinfo.channels ; + + for (k = 0 ; k < 6 ; k++) + { test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, __LINE__) ; + test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, __LINE__) ; + + /* Open file again and make sure no errors in log buffer. */ + infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + check_log_buffer_or_die (infile, __LINE__) ; + sf_close (infile) ; + + if (sfinfo.frames != k * frames) + { printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %" PRId64 ")\n", __LINE__, sfinfo.frames, k + frames) ; + dump_log_buffer (infile) ; + exit (1) ; + } ; + + if ((k & 1) == 0) + test_write_int_or_die (outfile, k, buffer, sfinfo.channels * frames, __LINE__) ; + else + test_writef_int_or_die (outfile, k, buffer, frames, __LINE__) ; + } ; + + sf_close (outfile) ; + unlink (filename) ; + + puts ("ok") ; + return ; +} /* update_seek_int_test */ + +static void +update_seek_float_test (const char *filename, int filetype) +{ SNDFILE *outfile, *infile ; + SF_INFO sfinfo ; + sf_count_t frames ; + float buffer [8] ; + int k ; + + print_test_name ("update_seek_float_test", filename) ; + + memset (buffer, 0, sizeof (buffer)) ; + + /* Create sound outfile with no data. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.format = filetype | SF_FORMAT_FLOAT ; + sfinfo.samplerate = 48000 ; + sfinfo.channels = 2 ; + + if (sf_format_check (&sfinfo) == SF_FALSE) + sfinfo.channels = 1 ; + + outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_close (outfile) ; + + /* Open again for read/write. */ + outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; + + /* + ** In auto header update mode, seeking to the end of the file with + ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END + ** will seek to 0 anyway + */ + if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0) + { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ; + exit (1) ; + } ; + + /* Now write some frames. */ + frames = ARRAY_LEN (buffer) / sfinfo.channels ; + + for (k = 0 ; k < 6 ; k++) + { test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, __LINE__) ; + test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, __LINE__) ; + + /* Open file again and make sure no errors in log buffer. */ + infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + check_log_buffer_or_die (infile, __LINE__) ; + sf_close (infile) ; + + if (sfinfo.frames != k * frames) + { printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %" PRId64 ")\n", __LINE__, sfinfo.frames, k + frames) ; + dump_log_buffer (infile) ; + exit (1) ; + } ; + + if ((k & 1) == 0) + test_write_float_or_die (outfile, k, buffer, sfinfo.channels * frames, __LINE__) ; + else + test_writef_float_or_die (outfile, k, buffer, frames, __LINE__) ; + } ; + + sf_close (outfile) ; + unlink (filename) ; + + puts ("ok") ; + return ; +} /* update_seek_float_test */ + +static void +update_seek_double_test (const char *filename, int filetype) +{ SNDFILE *outfile, *infile ; + SF_INFO sfinfo ; + sf_count_t frames ; + double buffer [8] ; + int k ; + + print_test_name ("update_seek_double_test", filename) ; + + memset (buffer, 0, sizeof (buffer)) ; + + /* Create sound outfile with no data. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.format = filetype | SF_FORMAT_DOUBLE ; + sfinfo.samplerate = 48000 ; + sfinfo.channels = 2 ; + + if (sf_format_check (&sfinfo) == SF_FALSE) + sfinfo.channels = 1 ; + + outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_close (outfile) ; + + /* Open again for read/write. */ + outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; + + /* + ** In auto header update mode, seeking to the end of the file with + ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END + ** will seek to 0 anyway + */ + if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0) + { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ; + exit (1) ; + } ; + + /* Now write some frames. */ + frames = ARRAY_LEN (buffer) / sfinfo.channels ; + + for (k = 0 ; k < 6 ; k++) + { test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, __LINE__) ; + test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, __LINE__) ; + + /* Open file again and make sure no errors in log buffer. */ + infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + check_log_buffer_or_die (infile, __LINE__) ; + sf_close (infile) ; + + if (sfinfo.frames != k * frames) + { printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %" PRId64 ")\n", __LINE__, sfinfo.frames, k + frames) ; + dump_log_buffer (infile) ; + exit (1) ; + } ; + + if ((k & 1) == 0) + test_write_double_or_die (outfile, k, buffer, sfinfo.channels * frames, __LINE__) ; + else + test_writef_double_or_die (outfile, k, buffer, frames, __LINE__) ; + } ; + + sf_close (outfile) ; + unlink (filename) ; + + puts ("ok") ; + return ; +} /* update_seek_double_test */ + + + +static void +header_shrink_test (const char *filename, int filetype) +{ SNDFILE *outfile, *infile ; + SF_INFO sfinfo ; + sf_count_t frames ; + float buffer [8], bufferin [8] ; + + print_test_name ("header_shrink_test", filename) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.format = filetype | SF_FORMAT_FLOAT ; + sfinfo.channels = 1 ; + + memset (buffer, 0xA0, sizeof (buffer)) ; + + /* Now write some frames. */ + frames = ARRAY_LEN (buffer) / sfinfo.channels ; + + /* Test the file with extra header data. */ + outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + + sf_command (outfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ; + sf_command (outfile, SFC_UPDATE_HEADER_NOW, NULL, SF_FALSE) ; + sf_command (outfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; + + test_writef_float_or_die (outfile, 0, buffer, frames, __LINE__) ; + sf_close (outfile) ; + + /* Open again for read. */ + infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + test_readf_float_or_die (infile, 0, bufferin, frames, __LINE__) ; + sf_close (infile) ; + + compare_float_or_die (buffer, bufferin, frames, __LINE__) ; + + unlink (filename) ; + puts ("ok") ; + return ; +} /* header_shrink_test */ + + +static void +extra_header_test (const char *filename, int filetype) +{ SNDFILE *outfile, *infile ; + SF_INFO sfinfo ; + sf_count_t frames ; + short buffer [8] ; + int k = 0 ; + + print_test_name ("extra_header_test", filename) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.format = (filetype | SF_FORMAT_PCM_16) ; + sfinfo.channels = 1 ; + + memset (buffer, 0xA0, sizeof (buffer)) ; + + /* Now write some frames. */ + frames = ARRAY_LEN (buffer) / sfinfo.channels ; + + /* Test the file with extra header data. */ + outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, 504) ; + sf_set_string (outfile, SF_STR_TITLE, filename) ; + test_writef_short_or_die (outfile, k, buffer, frames, 506) ; + sf_set_string (outfile, SF_STR_COPYRIGHT, "(c) 1980 Erik") ; + sf_close (outfile) ; + +#if 1 + /* + ** Erik de Castro Lopo May 23 2004. + ** + ** This file has extra string data in the header and therefore cannot + ** currently be opened in SFM_RDWR mode. This is fixable, but its in + ** a part of the code I don't want to fiddle with until the Ogg/Vorbis + ** integration is done. + */ + + if ((infile = sf_open (filename, SFM_RDWR, &sfinfo)) != NULL) + { printf ("\n\nError : should not be able to open this file in SFM_RDWR.\n\n") ; + exit (1) ; + } ; + + unlink (filename) ; + puts ("ok") ; + return ; +#else + + hexdump_file (filename, 0, 100000) ; + + /* Open again for read/write. */ + outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, 533) ; + + /* + ** In auto header update mode, seeking to the end of the file with + ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END + ** will seek to 0 anyway + */ + if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0) + { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ; + exit (1) ; + } ; + + /* Now write some frames. */ + frames = ARRAY_LEN (buffer) / sfinfo.channels ; + + for (k = 1 ; k < 6 ; k++) + { + printf ("\n*** pass %d\n", k) ; + memset (buffer, 0xA0 + k, sizeof (buffer)) ; + + + test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, 554) ; + test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, 555) ; + + /* Open file again and make sure no errors in log buffer. */ + if (0) + { infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, 559) ; + check_log_buffer_or_die (infile, 560) ; + sf_close (infile) ; + } ; + + if (sfinfo.frames != k * frames) + { printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %" PRId64 ")\n", 565, sfinfo.frames, k + frames) ; + dump_log_buffer (infile) ; + exit (1) ; + } ; + + if ((k & 1) == 0) + test_write_short_or_die (outfile, k, buffer, sfinfo.channels * frames, 571) ; + else + test_writef_short_or_die (outfile, k, buffer, frames, 573) ; + hexdump_file (filename, 0, 100000) ; + } ; + + sf_close (outfile) ; + unlink (filename) ; + + puts ("ok") ; + return ; +#endif +} /* extra_header_test */ diff --git a/libsndfile-1.0.31/tests/header_test.def b/libsndfile-1.0.31/tests/header_test.def new file mode 100644 index 0000000..959703e --- /dev/null +++ b/libsndfile-1.0.31/tests/header_test.def @@ -0,0 +1,22 @@ +autogen definitions header_test.tpl; + +data_type = { + name = "short" ; + format = "SF_FORMAT_PCM_16" ; + } ; + +data_type = { + name = "int" ; + format = "SF_FORMAT_PCM_32" ; + } ; + +data_type = { + name = "float" ; + format = "SF_FORMAT_FLOAT" ; + } ; + +data_type = { + name = "double" ; + format = "SF_FORMAT_DOUBLE" ; + } ; + diff --git a/libsndfile-1.0.31/tests/header_test.tpl b/libsndfile-1.0.31/tests/header_test.tpl new file mode 100644 index 0000000..f4dd5b5 --- /dev/null +++ b/libsndfile-1.0.31/tests/header_test.tpl @@ -0,0 +1,583 @@ +[+ AutoGen5 template c +] +/* +** Copyright (C) 2001-2017 Erik de Castro Lopo +** +** This program is free software ; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation ; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY ; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#include + +#if HAVE_UNISTD_H +#include +#endif + +#if (HAVE_DECL_S_IRGRP == 0) +#include +#endif + +#if (defined (WIN32) || defined (_WIN32)) +#include +#include +#endif + +#include + +#include "utils.h" + +#define BUFFER_LEN (1 << 10) +#define LOG_BUFFER_SIZE 1024 + +static void update_header_test (const char *filename, int typemajor) ; +static void update_header_before_write_test (const char *filename, int typemajor) ; + +[+ FOR data_type ++]static void update_seek_[+ (get "name") +]_test (const char *filename, int filetype) ; +[+ ENDFOR data_type ++] + +static void extra_header_test (const char *filename, int filetype) ; + +static void header_shrink_test (const char *filename, int filetype) ; + +/* Force the start of this buffer to be double aligned. Sparc-solaris will +** choke if its not. +*/ +static int data_out [BUFFER_LEN] ; +static int data_in [BUFFER_LEN] ; + +int +main (int argc, char *argv []) +{ int do_all = 0 ; + int test_count = 0 ; + + if (argc != 2) + { printf ("Usage : %s \n", argv [0]) ; + printf (" Where is one of the following:\n") ; + printf (" wav - test WAV file peak chunk\n") ; + printf (" aiff - test AIFF file PEAK chunk\n") ; + printf (" all - perform all tests\n") ; + exit (1) ; + } ; + + do_all= !strcmp (argv [1], "all") ; + + if (do_all || ! strcmp (argv [1], "wav")) + { update_header_test ("header.wav", SF_FORMAT_WAV) ; + update_seek_short_test ("header_short.wav", SF_FORMAT_WAV) ; + update_seek_int_test ("header_int.wav", SF_FORMAT_WAV) ; + update_seek_float_test ("header_float.wav", SF_FORMAT_WAV) ; + update_seek_double_test ("header_double.wav", SF_FORMAT_WAV) ; + header_shrink_test ("header_shrink.wav", SF_FORMAT_WAV) ; + extra_header_test ("extra.wav", SF_FORMAT_WAV) ; + + update_header_test ("header.wavex", SF_FORMAT_WAVEX) ; + update_seek_short_test ("header_short.wavex", SF_FORMAT_WAVEX) ; + update_seek_int_test ("header_int.wavex", SF_FORMAT_WAVEX) ; + update_seek_float_test ("header_float.wavex", SF_FORMAT_WAVEX) ; + update_seek_double_test ("header_double.wavex", SF_FORMAT_WAVEX) ; + header_shrink_test ("header_shrink.wavex", SF_FORMAT_WAVEX) ; + extra_header_test ("extra.wavex", SF_FORMAT_WAVEX) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "aiff")) + { update_header_test ("header.aiff", SF_FORMAT_AIFF) ; + update_seek_short_test ("header_short.aiff", SF_FORMAT_AIFF) ; + update_seek_int_test ("header_int.aiff", SF_FORMAT_AIFF) ; + update_seek_float_test ("header_float.aiff", SF_FORMAT_AIFF) ; + update_seek_double_test ("header_double.aiff", SF_FORMAT_AIFF) ; + header_shrink_test ("header_shrink.wav", SF_FORMAT_AIFF) ; + extra_header_test ("extra.aiff", SF_FORMAT_AIFF) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "au")) + { update_header_test ("header.au", SF_FORMAT_AU) ; + update_seek_short_test ("header_short.au", SF_FORMAT_AU) ; + update_seek_int_test ("header_int.au", SF_FORMAT_AU) ; + update_seek_float_test ("header_float.au", SF_FORMAT_AU) ; + update_seek_double_test ("header_double.au", SF_FORMAT_AU) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "caf")) + { update_header_test ("header.caf", SF_FORMAT_CAF) ; + update_seek_short_test ("header_short.caf", SF_FORMAT_CAF) ; + update_seek_int_test ("header_int.caf", SF_FORMAT_CAF) ; + update_seek_float_test ("header_float.caf", SF_FORMAT_CAF) ; + update_seek_double_test ("header_double.caf", SF_FORMAT_CAF) ; + /* extra_header_test ("extra.caf", SF_FORMAT_CAF) ; */ + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "nist")) + { update_header_test ("header.nist", SF_FORMAT_NIST) ; + update_seek_short_test ("header_short.nist", SF_FORMAT_NIST) ; + update_seek_int_test ("header_int.nist", SF_FORMAT_NIST) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "paf")) + { update_header_test ("header.paf", SF_FORMAT_PAF) ; + update_seek_short_test ("header_short.paf", SF_FORMAT_PAF) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "ircam")) + { update_header_test ("header.ircam", SF_FORMAT_IRCAM) ; + update_seek_short_test ("header_short.ircam", SF_FORMAT_IRCAM) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "w64")) + { update_header_test ("header.w64", SF_FORMAT_W64) ; + update_seek_short_test ("header_short.w64", SF_FORMAT_W64) ; + update_seek_int_test ("header_int.w64", SF_FORMAT_W64) ; + update_seek_float_test ("header_float.w64", SF_FORMAT_W64) ; + update_seek_double_test ("header_double.w64", SF_FORMAT_W64) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "rf64")) + { update_header_test ("header.rf64", SF_FORMAT_RF64) ; + update_seek_short_test ("header_short.rf64", SF_FORMAT_RF64) ; + update_seek_int_test ("header_int.rf64", SF_FORMAT_RF64) ; + update_seek_float_test ("header_float.rf64", SF_FORMAT_RF64) ; + update_seek_double_test ("header_double.rf64", SF_FORMAT_RF64) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mat4")) + { update_header_test ("header.mat4", SF_FORMAT_MAT4) ; + update_seek_short_test ("header_short.mat4", SF_FORMAT_MAT4) ; + update_seek_int_test ("header_int.mat4", SF_FORMAT_MAT4) ; + update_seek_float_test ("header_float.mat4", SF_FORMAT_MAT4) ; + update_seek_double_test ("header_double.mat4", SF_FORMAT_MAT4) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mat5")) + { update_header_test ("header.mat5", SF_FORMAT_MAT5) ; + update_seek_short_test ("header_short.mat5", SF_FORMAT_MAT5) ; + update_seek_int_test ("header_int.mat5", SF_FORMAT_MAT5) ; + update_seek_float_test ("header_float.mat5", SF_FORMAT_MAT5) ; + update_seek_double_test ("header_double.mat5", SF_FORMAT_MAT5) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "pvf")) + { update_header_test ("header.pvf", SF_FORMAT_PVF) ; + update_seek_short_test ("header_short.pvf", SF_FORMAT_PVF) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "avr")) + { update_header_test ("header.avr", SF_FORMAT_AVR) ; + update_seek_short_test ("header_short.avr", SF_FORMAT_AVR) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "htk")) + { update_header_test ("header.htk", SF_FORMAT_HTK) ; + update_seek_short_test ("header_short.htk", SF_FORMAT_HTK) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "svx")) + { update_header_test ("header.svx", SF_FORMAT_SVX) ; + update_seek_short_test ("header_short.svx", SF_FORMAT_SVX) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "voc")) + { update_header_test ("header.voc", SF_FORMAT_VOC) ; + /*-update_seek_short_test ("header_short.voc", SF_FORMAT_VOC) ;-*/ + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "sds")) + { update_header_test ("header.sds", SF_FORMAT_SDS) ; + /*-update_seek_short_test ("header_short.sds", SF_FORMAT_SDS) ;-*/ + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mpc2k")) + { update_header_test ("header.mpc", SF_FORMAT_MPC2K) ; + update_seek_short_test ("header_short.mpc", SF_FORMAT_MPC2K) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "flac")) + { if (HAVE_EXTERNAL_XIPH_LIBS) + update_header_before_write_test ("header.flac", SF_FORMAT_FLAC) ; + else + puts (" No FLAC tests because FLAC support was not compiled in.") ; + test_count++ ; + } ; + + if (test_count == 0) + { printf ("Mono : ************************************\n") ; + printf ("Mono : * No '%s' test defined.\n", argv [1]) ; + printf ("Mono : ************************************\n") ; + return 1 ; + } ; + + return 0 ; +} /* main */ + + +/*============================================================================================ +** Here are the test functions. +*/ + +static void +update_header_sub (const char *filename, int typemajor, int write_mode) +{ SNDFILE *outfile, *infile ; + SF_INFO sfinfo ; + int k ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.format = (typemajor | SF_FORMAT_PCM_16) ; + sfinfo.channels = 1 ; + + outfile = test_open_file_or_die (filename, write_mode, &sfinfo, SF_TRUE, __LINE__) ; + + for (k = 0 ; k < BUFFER_LEN ; k++) + data_out [k] = k + 1 ; + test_write_int_or_die (outfile, 0, data_out, BUFFER_LEN, __LINE__) ; + + if (typemajor != SF_FORMAT_HTK) + { /* The HTK header is not correct when the file is first written. */ + infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_close (infile) ; + } ; + + sf_command (outfile, SFC_UPDATE_HEADER_NOW, NULL, 0) ; + + /* + ** Open file and check log buffer for an error. If header update failed + ** the the log buffer will contain errors. + */ + infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + check_log_buffer_or_die (infile, __LINE__) ; + + if (sfinfo.frames < BUFFER_LEN || sfinfo.frames > BUFFER_LEN + 50) + { printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, BUFFER_LEN) ; + dump_log_buffer (infile) ; + exit (1) ; + } ; + + test_read_int_or_die (infile, 0, data_in, BUFFER_LEN, __LINE__) ; + for (k = 0 ; k < BUFFER_LEN ; k++) + if (data_out [k] != k + 1) + printf ("Error : line %d\n", __LINE__) ; + + sf_close (infile) ; + + /* Set auto update on. */ + sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; + + /* Write more data_out. */ + for (k = 0 ; k < BUFFER_LEN ; k++) + data_out [k] = k + 2 ; + test_write_int_or_die (outfile, 0, data_out, BUFFER_LEN, __LINE__) ; + + /* Open file again and make sure no errors in log buffer. */ + infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + check_log_buffer_or_die (infile, __LINE__) ; + + if (sfinfo.frames < 2 * BUFFER_LEN || sfinfo.frames > 2 * BUFFER_LEN + 50) + { printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 2 * BUFFER_LEN) ; + dump_log_buffer (infile) ; + exit (1) ; + } ; + + sf_close (infile) ; + + sf_close (outfile) ; + + unlink (filename) ; +} /* update_header_sub */ + +static void +update_header_test (const char *filename, int typemajor) +{ + print_test_name ("update_header_test", filename) ; + + update_header_sub (filename, typemajor, SFM_WRITE) ; + update_header_sub (filename, typemajor, SFM_RDWR) ; + + unlink (filename) ; + puts ("ok") ; +} /* update_header_test */ + +static void +update_header_before_write_test (const char *filename, int typemajor) +{ + SNDFILE *outfile ; + SF_INFO sfinfo ; + int k ; + + print_test_name ("update_header_before_write", filename) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.format = (typemajor | SF_FORMAT_PCM_16) ; + sfinfo.channels = 1 ; + + outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + /* FLAC can only write the header once; if the first call to sf_write() will + ** also attempt to write the header, it fails. FLAC-specific regression + */ + sf_command (outfile, SFC_UPDATE_HEADER_NOW, NULL, 0) ; + + for (k = 0 ; k < BUFFER_LEN ; k++) + data_out [k] = k + 1 ; + test_write_int_or_die (outfile, 0, data_out, BUFFER_LEN, __LINE__) ; + + sf_close (outfile) ; + unlink (filename) ; + puts ("ok") ; +} /* update_header_before_write_test */ + +/*============================================================================== +*/ + +[+ FOR data_type ++]static void +update_seek_[+ (get "name") +]_test (const char *filename, int filetype) +{ SNDFILE *outfile, *infile ; + SF_INFO sfinfo ; + sf_count_t frames ; + [+ (get "name") +] buffer [8] ; + int k ; + + print_test_name ("update_seek_[+ (get "name") +]_test", filename) ; + + memset (buffer, 0, sizeof (buffer)) ; + + /* Create sound outfile with no data. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.format = filetype | [+ (get "format") +] ; + sfinfo.samplerate = 48000 ; + sfinfo.channels = 2 ; + + if (sf_format_check (&sfinfo) == SF_FALSE) + sfinfo.channels = 1 ; + + outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_close (outfile) ; + + /* Open again for read/write. */ + outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; + + /* + ** In auto header update mode, seeking to the end of the file with + ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END + ** will seek to 0 anyway + */ + if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0) + { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ; + exit (1) ; + } ; + + /* Now write some frames. */ + frames = ARRAY_LEN (buffer) / sfinfo.channels ; + + for (k = 0 ; k < 6 ; k++) + { test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, __LINE__) ; + test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, __LINE__) ; + + /* Open file again and make sure no errors in log buffer. */ + infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + check_log_buffer_or_die (infile, __LINE__) ; + sf_close (infile) ; + + if (sfinfo.frames != k * frames) + { printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %" PRId64 ")\n", __LINE__, sfinfo.frames, k + frames) ; + dump_log_buffer (infile) ; + exit (1) ; + } ; + + if ((k & 1) == 0) + test_write_[+ (get "name") +]_or_die (outfile, k, buffer, sfinfo.channels * frames, __LINE__) ; + else + test_writef_[+ (get "name") +]_or_die (outfile, k, buffer, frames, __LINE__) ; + } ; + + sf_close (outfile) ; + unlink (filename) ; + + puts ("ok") ; + return ; +} /* update_seek_[+ (get "name") +]_test */ + +[+ ENDFOR data_type ++] + +static void +header_shrink_test (const char *filename, int filetype) +{ SNDFILE *outfile, *infile ; + SF_INFO sfinfo ; + sf_count_t frames ; + float buffer [8], bufferin [8] ; + + print_test_name ("header_shrink_test", filename) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.format = filetype | SF_FORMAT_FLOAT ; + sfinfo.channels = 1 ; + + memset (buffer, 0xA0, sizeof (buffer)) ; + + /* Now write some frames. */ + frames = ARRAY_LEN (buffer) / sfinfo.channels ; + + /* Test the file with extra header data. */ + outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + + sf_command (outfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ; + sf_command (outfile, SFC_UPDATE_HEADER_NOW, NULL, SF_FALSE) ; + sf_command (outfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; + + test_writef_float_or_die (outfile, 0, buffer, frames, __LINE__) ; + sf_close (outfile) ; + + /* Open again for read. */ + infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + test_readf_float_or_die (infile, 0, bufferin, frames, __LINE__) ; + sf_close (infile) ; + + compare_float_or_die (buffer, bufferin, frames, __LINE__) ; + + unlink (filename) ; + puts ("ok") ; + return ; +} /* header_shrink_test */ + + +static void +extra_header_test (const char *filename, int filetype) +{ SNDFILE *outfile, *infile ; + SF_INFO sfinfo ; + sf_count_t frames ; + short buffer [8] ; + int k = 0 ; + + print_test_name ("extra_header_test", filename) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.format = (filetype | SF_FORMAT_PCM_16) ; + sfinfo.channels = 1 ; + + memset (buffer, 0xA0, sizeof (buffer)) ; + + /* Now write some frames. */ + frames = ARRAY_LEN (buffer) / sfinfo.channels ; + + /* Test the file with extra header data. */ + outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, [+ (tpl-file-line "%2$d") +]) ; + sf_set_string (outfile, SF_STR_TITLE, filename) ; + test_writef_short_or_die (outfile, k, buffer, frames, [+ (tpl-file-line "%2$d") +]) ; + sf_set_string (outfile, SF_STR_COPYRIGHT, "(c) 1980 Erik") ; + sf_close (outfile) ; + +#if 1 + /* + ** Erik de Castro Lopo May 23 2004. + ** + ** This file has extra string data in the header and therefore cannot + ** currently be opened in SFM_RDWR mode. This is fixable, but its in + ** a part of the code I don't want to fiddle with until the Ogg/Vorbis + ** integration is done. + */ + + if ((infile = sf_open (filename, SFM_RDWR, &sfinfo)) != NULL) + { printf ("\n\nError : should not be able to open this file in SFM_RDWR.\n\n") ; + exit (1) ; + } ; + + unlink (filename) ; + puts ("ok") ; + return ; +#else + + hexdump_file (filename, 0, 100000) ; + + /* Open again for read/write. */ + outfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, [+ (tpl-file-line "%2$d") +]) ; + + /* + ** In auto header update mode, seeking to the end of the file with + ** SEEK_SET will fail from the 2nd seek on. seeking to 0, SEEK_END + ** will seek to 0 anyway + */ + if (sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) == 0) + { printf ("\n\nError : sf_command (SFC_SET_UPDATE_HEADER_AUTO) return error : %s\n\n", sf_strerror (outfile)) ; + exit (1) ; + } ; + + /* Now write some frames. */ + frames = ARRAY_LEN (buffer) / sfinfo.channels ; + + for (k = 1 ; k < 6 ; k++) + { + printf ("\n*** pass %d\n", k) ; + memset (buffer, 0xA0 + k, sizeof (buffer)) ; + + + test_seek_or_die (outfile, k * frames, SEEK_SET, k * frames, sfinfo.channels, [+ (tpl-file-line "%2$d") +]) ; + test_seek_or_die (outfile, 0, SEEK_END, k * frames, sfinfo.channels, [+ (tpl-file-line "%2$d") +]) ; + + /* Open file again and make sure no errors in log buffer. */ + if (0) + { infile = test_open_file_or_die (filename, SFM_READ, &sfinfo, [+ (tpl-file-line "%2$d") +]) ; + check_log_buffer_or_die (infile, [+ (tpl-file-line "%2$d") +]) ; + sf_close (infile) ; + } ; + + if (sfinfo.frames != k * frames) + { printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %" PRId64 ")\n", [+ (tpl-file-line "%2$d") +], sfinfo.frames, k + frames) ; + dump_log_buffer (infile) ; + exit (1) ; + } ; + + if ((k & 1) == 0) + test_write_short_or_die (outfile, k, buffer, sfinfo.channels * frames, [+ (tpl-file-line "%2$d") +]) ; + else + test_writef_short_or_die (outfile, k, buffer, frames, [+ (tpl-file-line "%2$d") +]) ; + hexdump_file (filename, 0, 100000) ; + } ; + + sf_close (outfile) ; + unlink (filename) ; + + puts ("ok") ; + return ; +#endif +} /* extra_header_test */ diff --git a/libsndfile-1.0.31/tests/headerless_test.c b/libsndfile-1.0.31/tests/headerless_test.c new file mode 100644 index 0000000..059fa68 --- /dev/null +++ b/libsndfile-1.0.31/tests/headerless_test.c @@ -0,0 +1,187 @@ +/* +** Copyright (C) 1999-2012 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "utils.h" + +#define BUFFER_SIZE (2000) + +static void old_test (void) ; +static void headerless_test (const char * filename, int format, int expected) ; + +int +main (void) +{ + old_test () ; + + headerless_test ("raw.vox", SF_FORMAT_VOX_ADPCM, SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM) ; + headerless_test ("raw.gsm", SF_FORMAT_GSM610, SF_FORMAT_RAW | SF_FORMAT_GSM610) ; + + headerless_test ("raw.snd", SF_FORMAT_ULAW, SF_FORMAT_RAW | SF_FORMAT_ULAW) ; + headerless_test ("raw.au" , SF_FORMAT_ULAW, SF_FORMAT_RAW | SF_FORMAT_ULAW) ; + + return 0 ; +} /* main */ + +static void +headerless_test (const char * filename, int format, int expected) +{ static short buffer [BUFFER_SIZE] ; + SNDFILE *file ; + SF_INFO sfinfo ; + int k ; + + format &= SF_FORMAT_SUBMASK ; + + print_test_name (__func__, filename) ; + + for (k = 0 ; k < BUFFER_SIZE ; k++) + buffer [k] = k ; + + sfinfo.samplerate = 8000 ; + sfinfo.frames = 0 ; + sfinfo.channels = 1 ; + sfinfo.format = SF_FORMAT_RAW | format ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + if ((k = sf_write_short (file, buffer, BUFFER_SIZE)) != BUFFER_SIZE) + { printf ("Line %d: sf_write_short failed with short write (%d => %d).\n", __LINE__, BUFFER_SIZE, k) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + sf_close (file) ; + + memset (buffer, 0, sizeof (buffer)) ; + + /* We should be able to detect these so clear sfinfo. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != expected) + { printf ("Line %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, expected, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < BUFFER_SIZE) + { printf ("Line %d: Incorrect number of.frames in file. (%d => %" PRId64 ")\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("Line %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + sf_close (file) ; + + printf ("ok\n") ; + unlink (filename) ; +} /* headerless_test */ + +static void +old_test (void) +{ static short buffer [BUFFER_SIZE] ; + SNDFILE *file ; + SF_INFO sfinfo ; + int k, filetype ; + const char *filename = "headerless.wav" ; + + print_test_name (__func__, "") ; + + for (k = 0 ; k < BUFFER_SIZE ; k++) + buffer [k] = k ; + + filetype = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ; + + sfinfo.samplerate = 32000 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + if ((k = sf_write_short (file, buffer, BUFFER_SIZE)) != BUFFER_SIZE) + { printf ("Line %d: sf_write_short failed with short write (%d => %d).\n", __LINE__, BUFFER_SIZE, k) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + sf_close (file) ; + + memset (buffer, 0, sizeof (buffer)) ; + + /* Read as RAW but get the bit width and endian-ness correct. */ + sfinfo.format = filetype = SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_16 ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("Line %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < BUFFER_SIZE) + { printf ("Line %d: Incorrect number of.frames in file. (%d => %" PRId64 ")\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("Line %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + if ((k = sf_read_short (file, buffer, BUFFER_SIZE)) != BUFFER_SIZE) + { printf ("Line %d: short read (%d).\n", __LINE__, k) ; + exit (1) ; + } ; + + for (k = 0 ; k < BUFFER_SIZE - 22 ; k++) + if (buffer [k + 22] != k) + { printf ("Line %d: Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, k, buffer [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + + printf ("ok\n") ; + unlink (filename) ; +} /* old_test */ + diff --git a/libsndfile-1.0.31/tests/largefile_test.c b/libsndfile-1.0.31/tests/largefile_test.c new file mode 100644 index 0000000..4c97c90 --- /dev/null +++ b/libsndfile-1.0.31/tests/largefile_test.c @@ -0,0 +1,85 @@ +/* +** Copyright (C) 2006-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "utils.h" + +#define BUFFER_LEN (1024 * 1024) +#define BUFFER_COUNT (768) + +static void largefile_test (int filetype, const char * filename) ; + +int +main (void) +{ + largefile_test (SF_FORMAT_WAV, "largefile.wav") ; + largefile_test (SF_FORMAT_AIFF, "largefile.aiff") ; + + return 0 ; +} /* main */ + +static void +largefile_test (int filetype, const char * filename) +{ static float data [BUFFER_LEN] ; + SNDFILE *file ; + SF_INFO sfinfo ; + int k ; + + print_test_name ("largefile_test", filename) ; + + sfinfo.samplerate = 44100 ; + sfinfo.channels = 2 ; + sfinfo.frames = 0 ; + sfinfo.format = (filetype | SF_FORMAT_PCM_32) ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + for (k = 0 ; k < BUFFER_COUNT ; k++) + test_write_float_or_die (file, k, data, BUFFER_LEN, __LINE__) ; + + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if ((sfinfo.frames * sfinfo.channels) / BUFFER_LEN != BUFFER_COUNT) + { printf ("\n\nLine %d : bad frame count.\n", __LINE__) ; + exit (1) ; + } ; + + sf_close (file) ; + + unlink (filename) ; + puts ("ok") ; + + + return ; +} /* largefile_test */ + diff --git a/libsndfile-1.0.31/tests/locale_test.c b/libsndfile-1.0.31/tests/locale_test.c new file mode 100644 index 0000000..b265301 --- /dev/null +++ b/libsndfile-1.0.31/tests/locale_test.c @@ -0,0 +1,169 @@ +/* +** Copyright (C) 2005-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#if HAVE_LOCALE_H +#include +#endif + +#if OS_IS_WIN32 +#include +#define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1 +#endif + +#include "sndfile.h" +#include "utils.h" + +static void utf8_test (void) ; +static void wchar_test (void) ; + +int +main (void) +{ + utf8_test () ; + wchar_test () ; + + return 0 ; +} /* main */ + +/*============================================================================== +*/ + +static void +wchar_test (void) +{ +#if OS_IS_WIN32 + SNDFILE * file ; + SF_INFO info ; + LPCWSTR filename = L"test.wav" ; + + print_test_name (__func__, "test.wav") ; + + info.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ; + info.channels = 1 ; + info.samplerate = 44100 ; + + file = sf_wchar_open (filename, SFM_WRITE, &info) ; + exit_if_true (file == NULL, "\n\nLine %d : sf_wchar_open failed : %s\n\n", __LINE__, sf_strerror (NULL)) ; + sf_close (file) ; + + /* This should check that the file did in fact get created with a + ** wchar_t * filename. + */ + exit_if_true ( + GetFileAttributesW (filename) == INVALID_FILE_ATTRIBUTES, + "\n\nLine %d : GetFileAttributes failed.\n\n", __LINE__ + ) ; + + /* Use this because the file was created with CreateFileW. */ + DeleteFileW (filename) ; + + puts ("ok") ; +#endif +} /* wchar_test */ + +/*============================================================================== +*/ + +typedef struct +{ const char *locale ; + int utf8 ; + const char *filename ; + int width ; +} LOCALE_DATA ; + +static void locale_test (const LOCALE_DATA * locdata) ; + +static void +utf8_test (void) +{ LOCALE_DATA ldata [] = + { { "de_DE", 1, "F\303\274\303\237e.au", 7 }, + { "en_AU", 1, "kangaroo.au", 11 }, + { "POSIX", 0, "posix.au", 8 }, + { "pt_PT", 1, "concei\303\247\303\243o.au", 12 }, + +#if OS_IS_WIN32 == 0 + { "ja_JP", 1, "\343\201\212\343\201\257\343\202\210\343\201\206\343\201\224\343\201\226\343\201\204\343\201\276\343\201\231.au", 21 }, +#endif + + { "vi_VN", 1, "qu\341\273\221c ng\341\273\257.au", 11 }, + { NULL, 0, NULL, 0 } + } ; + int k ; + + for (k = 0 ; ldata [k].locale != NULL ; k++) + locale_test (ldata + k) ; +} /* utf8_test */ + + +static void +locale_test (const LOCALE_DATA * ldata) +{ +#if (HAVE_LOCALE_H == 0 || HAVE_SETLOCALE == 0) + locname = filename = NULL ; + width = 0 ; + return ; +#else + const short wdata [] = { 1, 2, 3, 4, 5, 6, 7, 8 } ; + short rdata [ARRAY_LEN (wdata)] ; + const char *old_locale ; + char utf8_locname [32] ; + SNDFILE *file ; + SF_INFO sfinfo ; + + snprintf (utf8_locname, sizeof (utf8_locname), "%s%s", ldata->locale, ldata->utf8 ? ".UTF-8" : "") ; + + /* Change the locale saving the old one. */ + if ((old_locale = setlocale (LC_CTYPE, utf8_locname)) == NULL) + return ; + + printf (" locale_test %-8s : %s %*c ", ldata->locale, ldata->filename, 24 - ldata->width, ' ') ; + fflush (stdout) ; + + sfinfo.format = SF_FORMAT_AU | SF_FORMAT_PCM_16 ; + sfinfo.channels = 1 ; + sfinfo.samplerate = 44100 ; + + file = test_open_file_or_die (ldata->filename, SFM_WRITE, &sfinfo, 0, __LINE__) ; + test_write_short_or_die (file, 0, wdata, ARRAY_LEN (wdata), __LINE__) ; + sf_close (file) ; + + file = test_open_file_or_die (ldata->filename, SFM_READ, &sfinfo, 0, __LINE__) ; + test_read_short_or_die (file, 0, rdata, ARRAY_LEN (rdata), __LINE__) ; + sf_close (file) ; + + unlink (ldata->filename) ; + + /* Restore old locale. */ + setlocale (LC_CTYPE, old_locale) ; + + puts ("ok") ; +#endif +} /* locale_test */ + diff --git a/libsndfile-1.0.31/tests/long_read_write_test.c b/libsndfile-1.0.31/tests/long_read_write_test.c new file mode 100644 index 0000000..4862468 --- /dev/null +++ b/libsndfile-1.0.31/tests/long_read_write_test.c @@ -0,0 +1,272 @@ +/* +** Copyright (C) 2015-2016 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "dft_cmp.h" +#include "utils.h" + +#define BUFFER_LENGTH 10000 +#define SAMPLE_RATE 44010 + +static void short_lrw_test (const char *filename, int filetype, const short * output, int out_len) ; +static void int_lrw_test (const char *filename, int filetype, const int * output, int out_len) ; +static void float_lrw_test (const char *filename, int filetype, const float * output, int out_len) ; +static void double_lrw_test (const char *filename, int filetype, const double * output, int out_len) ; + + +static short short_data [BUFFER_LENGTH] ; +static int int_data [BUFFER_LENGTH] ; +static float float_data [BUFFER_LENGTH] ; +static double double_data [BUFFER_LENGTH] ; + +int +main (int argc, char *argv []) +{ int do_all ; + size_t k ; + + if (argc != 2) + { printf ("Usage : %s \n", argv [0]) ; + printf (" Where is one of the following:\n") ; + printf (" alac - test CAF/ALAC file functions\n") ; + printf (" all - perform all tests\n") ; + exit (1) ; + } ; + + for (k = 0 ; k < ARRAY_LEN (short_data) ; k++) + { int value = k / 32 ; + int_data [k] = (value & 1 ? -1 : 1) * value ; + short_data [k] = int_data [k] ; + float_data [k] = int_data [k] / 32000.0 ; + double_data [k] = int_data [k] / 32000.0 ; + } + + do_all = ! strcmp (argv [1], "all") ; + + if (do_all || strcmp (argv [1], "alac") == 0) + { short_lrw_test ("alac.caf", SF_FORMAT_CAF | SF_FORMAT_ALAC_16, short_data, ARRAY_LEN (short_data)) ; + int_lrw_test ("alac.caf", SF_FORMAT_CAF | SF_FORMAT_ALAC_32, int_data, ARRAY_LEN (int_data)) ; + float_lrw_test ("alac.caf", SF_FORMAT_CAF | SF_FORMAT_ALAC_32, float_data, ARRAY_LEN (float_data)) ; + double_lrw_test ("alac.caf", SF_FORMAT_CAF | SF_FORMAT_ALAC_32, double_data, ARRAY_LEN (double_data)) ; + } ; + + return 0 ; +} /* main */ + +/*============================================================================================ + * Here are the test functions. + */ + +static void +short_lrw_test (const char *filename, int filetype, const short * output, int out_len) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k ; + short input [BUFFER_LENGTH] ; + + print_test_name ("short_lrw_test", filename) ; + + exit_if_true (BUFFER_LENGTH > out_len, "\n\nLine %d: Bad array length.\n", __LINE__) ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = out_len ; + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_short_or_die (file, 0, output, out_len, __LINE__) ; + + sf_close (file) ; + + memset (input, 0, sizeof (input)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit_if_true (sfinfo.frames < out_len, "\n\nLine %d: Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; + exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_short_or_die (file, 0, input, out_len, __LINE__) ; + + sf_close (file) ; + + for (k = 0 ; k < out_len ; k++) + exit_if_true (input [k] != output [k], + "\n\nLine: %d: Error on input %d, expected %d, got %d\n", __LINE__, k, output [k], input [k]) ; + + puts ("ok") ; + unlink (filename) ; + + return ; +} /* short_lrw_test */ + +static void +int_lrw_test (const char *filename, int filetype, const int * output, int out_len) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k ; + int input [BUFFER_LENGTH] ; + + print_test_name ("int_lrw_test", filename) ; + + exit_if_true (BUFFER_LENGTH > out_len, "\n\nLine %d: Bad array length.\n", __LINE__) ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = out_len ; + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_int_or_die (file, 0, output, out_len, __LINE__) ; + + sf_close (file) ; + + memset (input, 0, sizeof (input)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit_if_true (sfinfo.frames < out_len, "\n\nLine %d: Incorrect number of frames in file (too int). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; + exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_int_or_die (file, 0, input, out_len, __LINE__) ; + + sf_close (file) ; + + for (k = 0 ; k < out_len ; k++) + exit_if_true (input [k] != output [k], + "\n\nLine: %d: Error on input %d, expected %d, got %d\n", __LINE__, k, output [k], input [k]) ; + + puts ("ok") ; + unlink (filename) ; + + return ; +} /* int_lrw_test */ + +static void +float_lrw_test (const char *filename, int filetype, const float * output, int out_len) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k ; + float input [BUFFER_LENGTH] ; + + print_test_name ("float_lrw_test", filename) ; + + exit_if_true (BUFFER_LENGTH > out_len, "\n\nLine %d: Bad array length.\n", __LINE__) ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = out_len ; + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_float_or_die (file, 0, output, out_len, __LINE__) ; + + sf_close (file) ; + + memset (input, 0, sizeof (input)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit_if_true (sfinfo.frames < out_len, "\n\nLine %d: Incorrect number of frames in file (too float). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; + exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_float_or_die (file, 0, input, out_len, __LINE__) ; + + sf_close (file) ; + + for (k = 0 ; k < out_len ; k++) + exit_if_true (fabs (input [k] - output [k]) > 0.00001, + "\n\nLine: %d: Error on input %d, expected %f, got %f\n", __LINE__, k, output [k], input [k]) ; + + puts ("ok") ; + unlink (filename) ; + + return ; +} /* float_lrw_test */ + +static void +double_lrw_test (const char *filename, int filetype, const double * output, int out_len) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k ; + double input [BUFFER_LENGTH] ; + + print_test_name ("double_lrw_test", filename) ; + + exit_if_true (BUFFER_LENGTH > out_len, "\n\nLine %d: Bad array length.\n", __LINE__) ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = out_len ; + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_double_or_die (file, 0, output, out_len, __LINE__) ; + + sf_close (file) ; + + memset (input, 0, sizeof (input)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + exit_if_true (sfinfo.format != filetype, "\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit_if_true (sfinfo.frames < out_len, "\n\nLine %d: Incorrect number of frames in file (too double). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, DFT_DATA_LENGTH) ; + exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_double_or_die (file, 0, input, out_len, __LINE__) ; + + sf_close (file) ; + + for (k = 0 ; k < out_len ; k++) + exit_if_true (fabs (input [k] - output [k]) > 0.00001, + "\n\nLine: %d: Error on input %d, expected %f, got %f\n", __LINE__, k, output [k], input [k]) ; + + puts ("ok") ; + unlink (filename) ; + + return ; +} /* double_lrw_test */ + diff --git a/libsndfile-1.0.31/tests/lossy_comp_test.c b/libsndfile-1.0.31/tests/lossy_comp_test.c new file mode 100644 index 0000000..cca274c --- /dev/null +++ b/libsndfile-1.0.31/tests/lossy_comp_test.c @@ -0,0 +1,2617 @@ +/* +** Copyright (C) 1999-2016 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "utils.h" + +#define BUFFER_SIZE (1 << 14) +#define SAMPLE_RATE 11025 + +#ifndef M_PI +#define M_PI 3.14159265358979323846264338 +#endif + +#define LCT_MAX(x, y) ((x) > (y) ? (x) : (y)) + +static void lcomp_test_short (const char *filename, int filetype, int chan, double margin) ; +static void lcomp_test_int (const char *filename, int filetype, int chan, double margin) ; +static void lcomp_test_float (const char *filename, int filetype, int chan, double margin) ; +static void lcomp_test_double (const char *filename, int filetype, int chan, double margin) ; + +static void sdlcomp_test_short (const char *filename, int filetype, int chan, double margin) ; +static void sdlcomp_test_int (const char *filename, int filetype, int chan, double margin) ; +static void sdlcomp_test_float (const char *filename, int filetype, int chan, double margin) ; +static void sdlcomp_test_double (const char *filename, int filetype, int chan, double margin) ; + +static void read_raw_test (const char *filename, int filetype, int chan) ; + +static int error_function (double data, double orig, double margin) ; +static int decay_response (int k) ; + +static void gen_signal_double (double *data, double scale, int channels, int datalen) ; + +static void smoothed_diff_short (short *data, unsigned int datalen) ; +static void smoothed_diff_int (int *data, unsigned int datalen) ; +static void smoothed_diff_float (float *data, unsigned int datalen) ; +static void smoothed_diff_double (double *data, unsigned int datalen) ; + +static void check_comment (SNDFILE * file, int format, int lineno) ; + +static int is_lossy (int filetype) ; + +static int check_opus_version (SNDFILE *file) ; + +/* +** Force the start of these buffers to be double aligned. Sparc-solaris will +** choke if they are not. +*/ +typedef union +{ double d [BUFFER_SIZE + 1] ; + float f [BUFFER_SIZE + 1] ; + int i [BUFFER_SIZE + 1] ; + short s [BUFFER_SIZE + 1] ; + char c [BUFFER_SIZE + 1] ; +} BUFFER ; + +static BUFFER data_buffer ; +static BUFFER orig_buffer ; +static BUFFER smooth_buffer ; + +static const char *long_comment = + "This is really quite a long comment. It is designed to be long enough " + "to screw up the encoders and decoders if the file container format does " + "not handle things correctly. If everything is working correctly, the " + "decoder will only decode the actual audio data, and not this string at " + "the end of the file." ; + +int +main (int argc, char *argv []) +{ int do_all = 0 ; + int test_count = 0 ; + + if (argc != 2) + { printf ("Usage : %s \n", argv [0]) ; + printf (" Where is one of the following:\n") ; + printf (" wav_ima - test IMA ADPCM WAV file functions\n") ; + printf (" wav_msadpcm - test MS ADPCM WAV file functions\n") ; + printf (" wav_gsm610 - test GSM 6.10 WAV file functions\n") ; + printf (" wav_ulaw - test u-law WAV file functions\n") ; + printf (" wav_alaw - test A-law WAV file functions\n") ; + printf (" wve - test Psion WVE file functions\n") ; + printf (" all - perform all tests\n") ; + exit (1) ; + } ; + + do_all = ! strcmp (argv [1], "all") ; + + if (do_all || strcmp (argv [1], "wav_pcm") == 0) + { /* This is just a sanity test for PCM encoding. */ + lcomp_test_short ("pcm.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16, 2, 1e-50) ; + lcomp_test_int ("pcm.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_32, 2, 1e-50) ; + lcomp_test_short ("pcm.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_16, 2, 1e-50) ; + lcomp_test_int ("pcm.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_32, 2, 1e-50) ; + /* Lite remove start */ + lcomp_test_float ("pcm.wav", SF_FORMAT_WAV | SF_FORMAT_FLOAT, 2, 1e-50) ; + lcomp_test_double ("pcm.wav", SF_FORMAT_WAV | SF_FORMAT_DOUBLE, 2, 1e-50) ; + /* Lite remove end */ + + read_raw_test ("pcm.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8, 2) ; + test_count++ ; + } ; + + /* For all the rest, if the file format supports more than 1 channel, use stereo. */ + /* Lite remove start */ + if (do_all || strcmp (argv [1], "wav_ima") == 0) + { lcomp_test_short ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + lcomp_test_int ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.65) ; + lcomp_test_float ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + lcomp_test_double ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + + lcomp_test_short ("ima.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + lcomp_test_int ("ima.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + lcomp_test_float ("ima.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + lcomp_test_double ("ima.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + + sdlcomp_test_short ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + sdlcomp_test_int ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + sdlcomp_test_float ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + sdlcomp_test_double ("ima.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "wav_msadpcm") == 0) + { lcomp_test_short ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + lcomp_test_int ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + lcomp_test_float ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + lcomp_test_double ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + + lcomp_test_short ("msadpcm.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + lcomp_test_int ("msadpcm.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + lcomp_test_float ("msadpcm.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + lcomp_test_double ("msadpcm.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + + sdlcomp_test_short ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + sdlcomp_test_int ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + sdlcomp_test_float ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + sdlcomp_test_double ("msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "wav_g721") == 0) + { printf ("**** Fix this later : error bound should be 0.06 ****\n") ; + lcomp_test_short ("g721.wav", SF_FORMAT_WAV | SF_FORMAT_G721_32, 1, 0.7) ; + lcomp_test_int ("g721.wav", SF_FORMAT_WAV | SF_FORMAT_G721_32, 1, 0.7) ; + + lcomp_test_short ("g721.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_G721_32, 1, 0.7) ; + lcomp_test_int ("g721.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_G721_32, 1, 0.7) ; + + test_count++ ; + } ; + /* Lite remove end */ + + if (do_all || strcmp (argv [1], "wav_ulaw") == 0) + { lcomp_test_short ("ulaw.wav", SF_FORMAT_WAV | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_int ("ulaw.wav", SF_FORMAT_WAV | SF_FORMAT_ULAW, 2, 0.04) ; + + lcomp_test_short ("ulaw.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_int ("ulaw.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_ULAW, 2, 0.04) ; + + /* Lite remove start */ + lcomp_test_float ("ulaw.wav", SF_FORMAT_WAV | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_double ("ulaw.wav", SF_FORMAT_WAV | SF_FORMAT_ULAW, 2, 0.04) ; + /* Lite remove end */ + + read_raw_test ("ulaw.wav", SF_FORMAT_WAV | SF_FORMAT_ULAW, 2) ; + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "wav_alaw") == 0) + { lcomp_test_short ("alaw.wav", SF_FORMAT_WAV | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_int ("alaw.wav", SF_FORMAT_WAV | SF_FORMAT_ALAW, 2, 0.04) ; + /* Lite remove start */ + lcomp_test_float ("alaw.wav", SF_FORMAT_WAV | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_double ("alaw.wav", SF_FORMAT_WAV | SF_FORMAT_ALAW, 2, 0.04) ; + /* Lite remove end */ + + read_raw_test ("alaw.wav", SF_FORMAT_WAV | SF_FORMAT_ALAW, 2) ; + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "wav_gsm610") == 0) + { /* Don't do lcomp_test_XXX as the errors are too big. */ + sdlcomp_test_short ("gsm610.wav", SF_FORMAT_WAV | SF_FORMAT_GSM610, 1, 0.24) ; + sdlcomp_test_int ("gsm610.wav", SF_FORMAT_WAV | SF_FORMAT_GSM610, 1, 0.24) ; + + sdlcomp_test_short ("gsm610.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_GSM610, 1, 0.24) ; + sdlcomp_test_int ("gsm610.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_GSM610, 1, 0.24) ; + + /* Lite remove start */ + sdlcomp_test_float ("gsm610.wav", SF_FORMAT_WAV | SF_FORMAT_GSM610, 1, 0.24) ; + sdlcomp_test_double ("gsm610.wav", SF_FORMAT_WAV | SF_FORMAT_GSM610, 1, 0.24) ; + /* Lite remove end */ + test_count++ ; + } ; + + /* Lite remove start */ + if (do_all || strcmp (argv [1], "wav_nmsadpcm") == 0) + { lcomp_test_short ("nms_16.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_16, 1, 0.37) ; + lcomp_test_int ("nms_16.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_16, 1, 0.31) ; + lcomp_test_float ("nms_16.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_16, 1, 0.34) ; + lcomp_test_double ("nms_16.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_16, 1, 0.34) ; + + lcomp_test_short ("nms_24.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_24, 1, 0.15) ; + lcomp_test_int ("nms_24.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_24, 1, 0.10) ; + lcomp_test_float ("nms_24.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_24, 1, 0.14) ; + lcomp_test_double ("nms_24.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_24, 1, 0.14) ; + + lcomp_test_short ("nms_32.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_32, 1, 0.036) ; + lcomp_test_int ("nms_32.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_32, 1, 0.045) ; + lcomp_test_float ("nms_32.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_32, 1, 0.035) ; + lcomp_test_double ("nms_32.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_32, 1, 0.035) ; + + sdlcomp_test_short ("nms_16.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_16, 1, 0.16) ; + sdlcomp_test_int ("nms_16.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_16, 1, 0.16) ; + sdlcomp_test_float ("nms_16.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_16, 1, 0.16) ; + sdlcomp_test_double ("nms_16.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_16, 1, 0.16) ; + + sdlcomp_test_short ("nms_24.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_24, 1, 0.06) ; + sdlcomp_test_int ("nms_24.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_24, 1, 0.06) ; + sdlcomp_test_float ("nms_24.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_24, 1, 0.06) ; + sdlcomp_test_double ("nms_24.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_24, 1, 0.06) ; + + sdlcomp_test_short ("nms_32.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_32, 1, 0.017) ; + sdlcomp_test_int ("nms_32.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_32, 1, 0.018) ; + sdlcomp_test_float ("nms_32.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_32, 1, 0.018) ; + sdlcomp_test_double ("nms_32.wav", SF_FORMAT_WAV | SF_FORMAT_NMS_ADPCM_32, 1, 0.018) ; + + test_count++ ; + } ; + /* Lite remove end */ + + if (do_all || strcmp (argv [1], "aiff_ulaw") == 0) + { lcomp_test_short ("ulaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_int ("ulaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ULAW, 2, 0.04) ; + /* Lite remove start */ + lcomp_test_float ("ulaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_double ("ulaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ULAW, 2, 0.04) ; + /* Lite remove end */ + + read_raw_test ("ulaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ULAW, 2) ; + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "aiff_alaw") == 0) + { lcomp_test_short ("alaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_int ("alaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ALAW, 2, 0.04) ; + /* Lite remove start */ + lcomp_test_float ("alaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_double ("alaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ALAW, 2, 0.04) ; + /* Lite remove end */ + + read_raw_test ("alaw.aiff", SF_FORMAT_AIFF | SF_FORMAT_ALAW, 2) ; + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "aiff_gsm610") == 0) + { /* Don't do lcomp_test_XXX as the errors are too big. */ + sdlcomp_test_short ("gsm610.aiff", SF_FORMAT_AIFF | SF_FORMAT_GSM610, 1, 0.24) ; + sdlcomp_test_int ("gsm610.aiff", SF_FORMAT_AIFF | SF_FORMAT_GSM610, 1, 0.24) ; + /* Lite remove start */ + sdlcomp_test_float ("gsm610.aiff", SF_FORMAT_AIFF | SF_FORMAT_GSM610, 1, 0.24) ; + sdlcomp_test_double ("gsm610.aiff", SF_FORMAT_AIFF | SF_FORMAT_GSM610, 1, 0.24) ; + /* Lite remove end */ + test_count++ ; + } ; + + if (strcmp (argv [1], "aiff_ima") == 0) + { lcomp_test_short ("ima.aiff", SF_FORMAT_AIFF | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + lcomp_test_int ("ima.aiff", SF_FORMAT_AIFF | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + /* Lite remove start */ + lcomp_test_float ("ima.aiff", SF_FORMAT_AIFF | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + lcomp_test_double ("ima.aiff", SF_FORMAT_AIFF | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + /* Lite remove end */ + } ; + + if (do_all || strcmp (argv [1], "au_ulaw") == 0) + { lcomp_test_short ("ulaw.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_int ("ulaw.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_ULAW, 2, 0.04) ; + /* Lite remove start */ + lcomp_test_float ("ulaw.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_double ("ulaw.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_ULAW, 2, 0.04) ; + /* Lite remove end */ + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "au_alaw") == 0) + { lcomp_test_short ("alaw.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_int ("alaw.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_ALAW, 2, 0.04) ; + /* Lite remove start */ + lcomp_test_float ("alaw.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_double ("alaw.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_ALAW, 2, 0.04) ; + /* Lite remove end */ + test_count++ ; + } ; + + /* Lite remove start */ + if (do_all || strcmp (argv [1], "au_g721") == 0) + { printf ("**** Fix this later : error bound should be 0.06 ****\n") ; + lcomp_test_short ("g721.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.7) ; + lcomp_test_int ("g721.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.7) ; + lcomp_test_float ("g721.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.7) ; + lcomp_test_double ("g721.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.7) ; + +/*- sdlcomp_test_short ("g721.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.07) ; + sdlcomp_test_int ("g721.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.07) ; + sdlcomp_test_float ("g721.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.07) ; + sdlcomp_test_double ("g721.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G721_32, 1, 0.12) ; +-*/ + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "au_g723") == 0) + { printf ("**** Fix this later : error bound should be 0.16 ****\n") ; + lcomp_test_short ("g723_24.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.7) ; + lcomp_test_int ("g723_24.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.7) ; + lcomp_test_float ("g723_24.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.7) ; + lcomp_test_double ("g723_24.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.7) ; + + lcomp_test_short ("g723_40.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G723_40, 1, 0.85) ; + lcomp_test_int ("g723_40.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G723_40, 1, 0.84) ; + lcomp_test_float ("g723_40.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G723_40, 1, 0.86) ; + lcomp_test_double ("g723_40.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G723_40, 1, 0.86) ; + +/*- sdlcomp_test_short ("g723.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.15) ; + sdlcomp_test_int ("g723.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.15) ; + sdlcomp_test_float ("g723.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.15) ; + sdlcomp_test_double ("g723.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_G723_24, 1, 0.15) ; +-*/ + test_count++ ; + } ; + /* Lite remove end */ + + if (do_all || strcmp (argv [1], "caf_ulaw") == 0) + { lcomp_test_short ("ulaw.caf", SF_FORMAT_CAF | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_int ("ulaw.caf", SF_FORMAT_CAF | SF_FORMAT_ULAW, 2, 0.04) ; + /* Lite remove start */ + lcomp_test_float ("ulaw.caf", SF_FORMAT_CAF | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_double ("ulaw.caf", SF_FORMAT_CAF | SF_FORMAT_ULAW, 2, 0.04) ; + /* Lite remove end */ + + read_raw_test ("ulaw.caf", SF_FORMAT_CAF | SF_FORMAT_ULAW, 2) ; + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "caf_alaw") == 0) + { lcomp_test_short ("alaw.caf", SF_FORMAT_CAF | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_int ("alaw.caf", SF_FORMAT_CAF | SF_FORMAT_ALAW, 2, 0.04) ; + /* Lite remove start */ + lcomp_test_float ("alaw.caf", SF_FORMAT_CAF | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_double ("alaw.caf", SF_FORMAT_CAF | SF_FORMAT_ALAW, 2, 0.04) ; + /* Lite remove end */ + + read_raw_test ("alaw.caf", SF_FORMAT_CAF | SF_FORMAT_ALAW, 2) ; + test_count++ ; + } ; + + + if (do_all || strcmp (argv [1], "raw_ulaw") == 0) + { lcomp_test_short ("ulaw.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_int ("ulaw.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_ULAW, 2, 0.04) ; + /* Lite remove start */ + lcomp_test_float ("ulaw.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_double ("ulaw.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_ULAW, 2, 0.04) ; + /* Lite remove end */ + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "raw_alaw") == 0) + { lcomp_test_short ("alaw.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_int ("alaw.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_ALAW, 2, 0.04) ; + /* Lite remove start */ + lcomp_test_float ("alaw.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_double ("alaw.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_ALAW, 2, 0.04) ; + /* Lite remove end */ + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "raw_gsm610") == 0) + { /* Don't do lcomp_test_XXX as the errors are too big. */ + sdlcomp_test_short ("raw.gsm", SF_FORMAT_RAW | SF_FORMAT_GSM610, 1, 0.24) ; + sdlcomp_test_int ("raw.gsm", SF_FORMAT_RAW | SF_FORMAT_GSM610, 1, 0.24) ; + sdlcomp_test_float ("raw.gsm", SF_FORMAT_RAW | SF_FORMAT_GSM610, 1, 0.24) ; + sdlcomp_test_double ("raw.gsm", SF_FORMAT_RAW | SF_FORMAT_GSM610, 1, 0.24) ; + test_count++ ; + } ; + + /* Lite remove start */ + if (do_all || strcmp (argv [1], "raw_nmsadpcm") == 0) + { lcomp_test_short ("raw.vce16", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_16, 1, 0.37) ; + lcomp_test_int ("raw.vce16", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_16, 1, 0.31) ; + lcomp_test_float ("raw.vce16", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_16, 1, 0.34) ; + lcomp_test_double ("raw.vce16", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_16, 1, 0.34) ; + + lcomp_test_short ("raw.vce24", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_24, 1, 0.15) ; + lcomp_test_int ("raw.vce24", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_24, 1, 0.10) ; + lcomp_test_float ("raw.vce24", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_24, 1, 0.14) ; + lcomp_test_double ("raw.vce24", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_24, 1, 0.14) ; + + lcomp_test_short ("raw.vce32", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_32, 1, 0.036) ; + lcomp_test_int ("raw.vce32", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_32, 1, 0.045) ; + lcomp_test_float ("raw.vce32", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_32, 1, 0.035) ; + lcomp_test_double ("raw.vce32", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_32, 1, 0.035) ; + + sdlcomp_test_short ("raw.vce16", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_16, 1, 0.16) ; + sdlcomp_test_int ("raw.vce16", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_16, 1, 0.16) ; + sdlcomp_test_float ("raw.vce16", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_16, 1, 0.16) ; + sdlcomp_test_double ("raw.vce16", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_16, 1, 0.16) ; + + sdlcomp_test_short ("raw.vce24", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_24, 1, 0.06) ; + sdlcomp_test_int ("raw.vce24", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_24, 1, 0.06) ; + sdlcomp_test_float ("raw.vce24", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_24, 1, 0.06) ; + sdlcomp_test_double ("raw.vce24", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_24, 1, 0.06) ; + + sdlcomp_test_short ("raw.vce32", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_32, 1, 0.017) ; + sdlcomp_test_int ("raw.vce32", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_32, 1, 0.018) ; + sdlcomp_test_float ("raw.vce32", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_32, 1, 0.018) ; + sdlcomp_test_double ("raw.vce32", SF_FORMAT_RAW | SF_FORMAT_NMS_ADPCM_32, 1, 0.018) ; + + test_count++ ; + } ; + /* Lite remove end */ + + if (do_all || strcmp (argv [1], "ogg_vorbis") == 0) + { if (HAVE_EXTERNAL_XIPH_LIBS) + { /* Don't do lcomp_test_XXX as the errors are too big. */ + sdlcomp_test_short ("vorbis.oga", SF_FORMAT_OGG | SF_FORMAT_VORBIS, 1, 0.30) ; + sdlcomp_test_int ("vorbis.oga", SF_FORMAT_OGG | SF_FORMAT_VORBIS, 1, 0.30) ; + sdlcomp_test_float ("vorbis.oga", SF_FORMAT_OGG | SF_FORMAT_VORBIS, 1, 0.30) ; + sdlcomp_test_double ("vorbis.oga", SF_FORMAT_OGG | SF_FORMAT_VORBIS, 1, 0.30) ; + } + else + puts (" No Ogg/Vorbis tests because Ogg/Vorbis support was not compiled in.") ; + + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "ogg_opus") == 0) + { if (HAVE_EXTERNAL_XIPH_LIBS) + { /* Don't do lcomp_test_XXX as the errors are too big. */ + sdlcomp_test_short ("opus.opus", SF_FORMAT_OGG | SF_FORMAT_OPUS, 1, 0.57) ; + sdlcomp_test_int ("opus.opus", SF_FORMAT_OGG | SF_FORMAT_OPUS, 1, 0.54) ; + sdlcomp_test_float ("opus.opus", SF_FORMAT_OGG | SF_FORMAT_OPUS, 1, 0.55) ; + sdlcomp_test_double ("opus.opus", SF_FORMAT_OGG | SF_FORMAT_OPUS, 1, 0.55) ; + } + else + puts (" No Ogg/Opus tests because Ogg/Opus support was not compiled in.") ; + + test_count++ ; + } ; + + /* Lite remove start */ + if (do_all || strcmp (argv [1], "ircam_ulaw") == 0) + { lcomp_test_short ("ulaw.ircam", SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_int ("ulaw.ircam", SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_float ("ulaw.ircam", SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_double ("ulaw.ircam", SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_ULAW, 2, 0.04) ; + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "ircam_alaw") == 0) + { lcomp_test_short ("alaw.ircam", SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_int ("alaw.ircam", SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_float ("alaw.ircam", SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_double ("alaw.ircam", SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_ALAW, 2, 0.04) ; + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "nist_ulaw") == 0) + { lcomp_test_short ("ulaw.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_int ("ulaw.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_float ("ulaw.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_double ("ulaw.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_ULAW, 2, 0.04) ; + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "nist_alaw") == 0) + { lcomp_test_short ("alaw.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_int ("alaw.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_float ("alaw.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_double ("alaw.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_ALAW, 2, 0.04) ; + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "voc_ulaw") == 0) + { lcomp_test_short ("ulaw.voc", SF_FORMAT_VOC | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_int ("ulaw.voc", SF_FORMAT_VOC | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_float ("ulaw.voc", SF_FORMAT_VOC | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_double ("ulaw.voc", SF_FORMAT_VOC | SF_FORMAT_ULAW, 2, 0.04) ; + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "voc_alaw") == 0) + { lcomp_test_short ("alaw.voc", SF_FORMAT_VOC | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_int ("alaw.voc", SF_FORMAT_VOC | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_float ("alaw.voc", SF_FORMAT_VOC | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_double ("alaw.voc", SF_FORMAT_VOC | SF_FORMAT_ALAW, 2, 0.04) ; + test_count++ ; + } ; + /* Lite remove end */ + + if (do_all || strcmp (argv [1], "w64_ulaw") == 0) + { lcomp_test_short ("ulaw.w64", SF_FORMAT_W64 | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_int ("ulaw.w64", SF_FORMAT_W64 | SF_FORMAT_ULAW, 2, 0.04) ; + /* Lite remove start */ + lcomp_test_float ("ulaw.w64", SF_FORMAT_W64 | SF_FORMAT_ULAW, 2, 0.04) ; + lcomp_test_double ("ulaw.w64", SF_FORMAT_W64 | SF_FORMAT_ULAW, 2, 0.04) ; + /* Lite remove end */ + + read_raw_test ("ulaw.w64", SF_FORMAT_W64 | SF_FORMAT_ULAW, 2) ; + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "w64_alaw") == 0) + { lcomp_test_short ("alaw.w64", SF_FORMAT_W64 | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_int ("alaw.w64", SF_FORMAT_W64 | SF_FORMAT_ALAW, 2, 0.04) ; + /* Lite remove start */ + lcomp_test_float ("alaw.w64", SF_FORMAT_W64 | SF_FORMAT_ALAW, 2, 0.04) ; + lcomp_test_double ("alaw.w64", SF_FORMAT_W64 | SF_FORMAT_ALAW, 2, 0.04) ; + /* Lite remove end */ + + read_raw_test ("alaw.w64", SF_FORMAT_W64 | SF_FORMAT_ALAW, 2) ; + test_count++ ; + } ; + + /* Lite remove start */ + if (do_all || strcmp (argv [1], "w64_ima") == 0) + { lcomp_test_short ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + lcomp_test_int ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + lcomp_test_float ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + lcomp_test_double ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + + sdlcomp_test_short ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + sdlcomp_test_int ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + sdlcomp_test_float ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + sdlcomp_test_double ("ima.w64", SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM, 2, 0.18) ; + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "w64_msadpcm") == 0) + { lcomp_test_short ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + lcomp_test_int ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + lcomp_test_float ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + lcomp_test_double ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + + sdlcomp_test_short ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + sdlcomp_test_int ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + sdlcomp_test_float ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + sdlcomp_test_double ("msadpcm.w64", SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM, 2, 0.36) ; + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "wve") == 0) + { lcomp_test_short ("psion.wve", SF_FORMAT_WVE | SF_FORMAT_ALAW, 1, 0.04) ; + lcomp_test_int ("psion.wve", SF_FORMAT_WVE | SF_FORMAT_ALAW, 1, 0.04) ; + /* Lite remove start */ + lcomp_test_float ("psion.wve", SF_FORMAT_WVE | SF_FORMAT_ALAW, 1, 0.04) ; + lcomp_test_double ("psion.wve", SF_FORMAT_WVE | SF_FORMAT_ALAW, 1, 0.04) ; + /* Lite remove end */ + test_count++ ; + } ; + + /* Lite remove end */ + + if (do_all || strcmp (argv [1], "w64_gsm610") == 0) + { /* Don't do lcomp_test_XXX as the errors are too big. */ + sdlcomp_test_short ("gsm610.w64", SF_FORMAT_W64 | SF_FORMAT_GSM610, 1, 0.2) ; + sdlcomp_test_int ("gsm610.w64", SF_FORMAT_W64 | SF_FORMAT_GSM610, 1, 0.2) ; + /* Lite remove start */ + sdlcomp_test_float ("gsm610.w64", SF_FORMAT_W64 | SF_FORMAT_GSM610, 1, 0.2) ; + sdlcomp_test_double ("gsm610.w64", SF_FORMAT_W64 | SF_FORMAT_GSM610, 1, 0.2) ; + /* Lite remove end */ + test_count++ ; + } ; + + /* Lite remove start */ + if (do_all || strcmp (argv [1], "vox_adpcm") == 0) + { lcomp_test_short ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.17) ; + lcomp_test_int ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.17) ; + lcomp_test_float ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.17) ; + lcomp_test_double ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.17) ; + + sdlcomp_test_short ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.072) ; + sdlcomp_test_int ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.072) ; + sdlcomp_test_float ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.072) ; + sdlcomp_test_double ("adpcm.vox", SF_FORMAT_RAW | SF_FORMAT_VOX_ADPCM, 1, 0.072) ; + test_count++ ; + } ; + + if (do_all || strcmp (argv [1], "xi_dpcm") == 0) + { lcomp_test_short ("8bit.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_8, 1, 0.25) ; + lcomp_test_int ("8bit.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_8, 1, 0.25) ; + + lcomp_test_short ("16bit.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_16, 1, 0.002) ; + lcomp_test_int ("16bit.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_16, 1, 0.002) ; + lcomp_test_float ("16bit.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_16, 1, 0.002) ; + lcomp_test_double ("16bit.xi", SF_FORMAT_XI | SF_FORMAT_DPCM_16, 1, 0.002) ; + test_count++ ; + } ; + /* Lite remove end */ + + if (test_count == 0) + { printf ("************************************\n") ; + printf ("* No '%s' test defined.\n", argv [1]) ; + printf ("************************************\n") ; + return 1 ; + } ; + + return 0 ; +} /* main */ + +/*============================================================================================ +** Here are the test functions. +*/ + +static void +lcomp_test_short (const char *filename, int filetype, int channels, double margin) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k, m, seekpos, half_max_abs ; + sf_count_t datalen ; + short *orig, *data ; + + print_test_name ("lcomp_test_short", filename) ; + + datalen = BUFFER_SIZE / channels ; + + data = data_buffer.s ; + orig = orig_buffer.s ; + + gen_signal_double (orig_buffer.d, 32000.0, channels, datalen) ; + for (k = 0 ; k < channels * datalen ; k++) + orig [k] = (short) (orig_buffer.d [k]) ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = 123456789 ; /* Ridiculous value. */ + sfinfo.channels = channels ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + test_writef_short_or_die (file, 0, orig, datalen, __LINE__) ; + sf_set_string (file, SF_STR_COMMENT, long_comment) ; + sf_close (file) ; + + memset (data, 0, datalen * sizeof (short)) ; + + if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + if ((sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)) != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < datalen / channels) + { printf ("Too few frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ; + exit (1) ; + } ; + + if (sfinfo.frames > (datalen + datalen / 20)) + { printf ("Too many frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ; + exit (1) ; + } ; + + if (sfinfo.channels != channels) + { printf ("Incorrect number of channels in file.\n") ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + check_comment (file, filetype, __LINE__) ; + + test_readf_short_or_die (file, 0, data, datalen, __LINE__) ; + + half_max_abs = 0 ; + for (k = 0 ; k < datalen ; k++) + { if (error_function (data [k], orig [k], margin)) + { printf ("\n\nLine %d: Incorrect sample A (#%d : %d should be %d).\n", __LINE__, k, data [k], orig [k]) ; + oct_save_short (orig, data, datalen) ; + exit (1) ; + } ; + half_max_abs = LCT_MAX (half_max_abs, abs (data [k] / 2)) ; + } ; + + if (half_max_abs < 1.0) + { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ; + exit (1) ; + } ; + + if ((k = sf_readf_short (file, data, datalen)) != sfinfo.frames - datalen) + { printf ("\n\nLine %d: Incorrect read length (%" PRId64 " should be %d).\n", __LINE__, + channels * sfinfo.frames - datalen, k) ; + exit (1) ; + } ; + + /* This check is only for block based encoders which must append silence + ** to the end of a file so as to fill out a block. + */ + for (k = 0 ; k < sfinfo.frames - datalen ; k++) + if (abs (data [channels * k]) > decay_response (channels * k)) + { printf ("\n\nLine %d : Incorrect sample B (#%d : abs (%d) should be < %d).\n", __LINE__, channels * k, data [channels * k], decay_response (channels * k)) ; + exit (1) ; + } ; + + if (! sfinfo.seekable) + { sf_close (file) ; + unlink (filename) ; + printf ("ok\n") ; + return ; + } ; + + /* Now test sf_seek function. */ + + if ((k = sf_seek (file, 0, SEEK_SET)) != 0) + { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ; + exit (1) ; + } ; + + for (m = 0 ; m < 3 ; m++) + { test_readf_short_or_die (file, m, data, 11, __LINE__) ; + + for (k = 0 ; k < channels * 11 ; k++) + if (error_function (1.0 * data [k], 1.0 * orig [k + channels * m * 11], margin)) + { printf ("\n\nLine %d: Incorrect sample (m = %d) (#%d : %d => %d).\n", __LINE__, m, k + channels * m * 11, orig [k + channels * m * 11], data [k]) ; + for (m = 0 ; m < channels ; m++) + printf ("%d ", data [m]) ; + printf ("\n") ; + exit (1) ; + } ; + } ; + + seekpos = BUFFER_SIZE / 10 ; + + /* Check seek from start of file. */ + if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos) + { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ; + exit (1) ; + } ; + + test_readf_short_or_die (file, 0, data, 1, __LINE__) ; + + if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin)) + { printf ("\n\nLine %d: sf_seek (SEEK_SET) followed by sf_readf_short failed (%d, %d).\n", __LINE__, orig [1], data [0]) ; + exit (1) ; + } ; + + if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1) + { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ; + exit (1) ; + } ; + + seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ; + k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ; + test_readf_short_or_die (file, 0, data, 1, __LINE__) ; + if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos) + { printf ("\n\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_short failed (%d, %d) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ; + oct_save_short (orig, data, datalen) ; + exit (1) ; + } ; + + seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ; + /* Check seek backward from current position. */ + k = sf_seek (file, -20, SEEK_CUR) ; + test_readf_short_or_die (file, 0, data, 1, __LINE__) ; + if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos) + { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_readf_short failed (%d, %d) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ; + exit (1) ; + } ; + + /* Check that read past end of file returns number of items. */ + sf_seek (file, sfinfo.frames, SEEK_SET) ; + + if ((k = sf_readf_short (file, data, datalen)) != 0) + { printf ("\n\nLine %d: Return value from sf_readf_short past end of file incorrect (%d).\n", __LINE__, k) ; + exit (1) ; + } ; + + /* Check seek backward from end. */ + if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5) + { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ; + exit (1) ; + } ; + + test_readf_short_or_die (file, 0, data, 1, __LINE__) ; + if (error_function (1.0 * data [0], 1.0 * orig [5 * channels], margin)) + { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_readf_short failed (%d should be %d).\n", __LINE__, data [0], orig [5 * channels]) ; + exit (1) ; + } ; + + sf_close (file) ; + + unlink (filename) ; + printf ("ok\n") ; +} /* lcomp_test_short */ + +/*-------------------------------------------------------------------------------------------- +*/ + +static void +lcomp_test_int (const char *filename, int filetype, int channels, double margin) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k, m, half_max_abs ; + sf_count_t datalen, seekpos ; + double scale, max_val ; + int *orig, *data ; + + print_test_name ("lcomp_test_int", filename) ; + + datalen = BUFFER_SIZE / channels ; + + if (is_lossy (filetype)) + { scale = 1.0 * 0x10000 ; + max_val = 32000.0 * scale ; + } + else + { scale = 1.0 ; + max_val = 0x7fffffff * scale ; + } ; + + data = data_buffer.i ; + orig = orig_buffer.i ; + + gen_signal_double (orig_buffer.d, max_val, channels, datalen) ; + + for (k = 0 ; k < channels * datalen ; k++) + orig [k] = lrint (orig_buffer.d [k]) ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = 123456789 ; /* Ridiculous value. */ + sfinfo.channels = channels ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + test_writef_int_or_die (file, 0, orig, datalen, __LINE__) ; + sf_set_string (file, SF_STR_COMMENT, long_comment) ; + sf_close (file) ; + + memset (data, 0, datalen * sizeof (int)) ; + + if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + if ((sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)) != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < datalen / channels) + { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.frames > (datalen + datalen / 20)) + { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != channels) + { printf ("Incorrect number of channels in file.\n") ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + check_comment (file, filetype, __LINE__) ; + + test_readf_int_or_die (file, 0, data, datalen, __LINE__) ; + + half_max_abs = 0 ; + for (k = 0 ; k < datalen ; k++) + { if (error_function (data [k] / scale, orig [k] / scale, margin)) + { printf ("\nLine %d: Incorrect sample (#%d : %f should be %f).\n", __LINE__, k, data [k] / scale, orig [k] / scale) ; + oct_save_int (orig, data, datalen) ; + exit (1) ; + } ; + half_max_abs = LCT_MAX (half_max_abs, abs (data [k] / 2)) ; + } ; + + if (half_max_abs < 1.0) + { printf ("\n\nLine %d: Signal is all zeros (%d, 0x%X).\n", __LINE__, half_max_abs, half_max_abs) ; + exit (1) ; + } ; + + if ((k = sf_readf_int (file, data, datalen)) != sfinfo.frames - datalen) + { printf ("\n\nLine %d: Incorrect read length (%" PRId64 " should be %d).\n", __LINE__, + channels * sfinfo.frames - datalen, k) ; + exit (1) ; + } ; + + /* This check is only for block based encoders which must append silence + ** to the end of a file so as to fill out a block. + */ + if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM) + for (k = 0 ; k < sfinfo.frames - datalen ; k++) + if (ABS (data [channels * k] / scale) > decay_response (channels * k)) + { printf ("\n\nLine %d : Incorrect sample B (#%d : abs (%d) should be < %d).\n", __LINE__, channels * k, data [channels * k], decay_response (channels * k)) ; + exit (1) ; + } ; + + if (! sfinfo.seekable) + { sf_close (file) ; + unlink (filename) ; + printf ("ok\n") ; + return ; + } ; + + /* Now test sf_seek function. */ + + if ((k = sf_seek (file, 0, SEEK_SET)) != 0) + { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ; + exit (1) ; + } ; + + for (m = 0 ; m < 3 ; m++) + { test_readf_int_or_die (file, m, data, 11, __LINE__) ; + + for (k = 0 ; k < channels * 11 ; k++) + if (error_function (data [k] / scale, orig [k + channels * m * 11] / scale, margin)) + { printf ("\nLine %d: Incorrect sample (m = %d) (#%d : %d => %d).\n", __LINE__, m, k + channels * m * 11, orig [k + channels * m * 11], data [k]) ; + for (m = 0 ; m < channels ; m++) + printf ("%d ", data [m]) ; + printf ("\n") ; + exit (1) ; + } ; + } ; + + seekpos = BUFFER_SIZE / 10 ; + + /* Check seek from start of file. */ + if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos) + { printf ("Seek to start of file + %" PRId64 " failed (%d).\n", seekpos, k) ; + exit (1) ; + } ; + + test_readf_int_or_die (file, 0, data, 1, __LINE__) ; + + if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin)) + { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_readf_int failed (%d, %d).\n", __LINE__, orig [1], data [0]) ; + exit (1) ; + } ; + + if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1) + { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %" PRId64 ")\n", __LINE__, k, seekpos + 1) ; + exit (1) ; + } ; + + seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ; + k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ; + test_readf_int_or_die (file, 0, data, 1, __LINE__) ; + if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos) + { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %" PRId64 ").\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ; + exit (1) ; + } ; + + seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ; + /* Check seek backward from current position. */ + k = sf_seek (file, -20, SEEK_CUR) ; + test_readf_int_or_die (file, 0, data, 1, __LINE__) ; + if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos) + { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %" PRId64 ").\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ; + exit (1) ; + } ; + + /* Check that read past end of file returns number of items. */ + sf_seek (file, sfinfo.frames, SEEK_SET) ; + + if ((k = sf_readf_int (file, data, datalen)) != 0) + { printf ("\n\nLine %d: Return value from sf_readf_int past end of file incorrect (%d).\n", __LINE__, k) ; + exit (1) ; + } ; + + /* Check seek backward from end. */ + if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5) + { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ; + exit (1) ; + } ; + + test_readf_int_or_die (file, 0, data, 1, __LINE__) ; + if (error_function (data [0] / scale, orig [5 * channels] / scale, margin)) + { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_readf_short failed (%d should be %d).\n", __LINE__, data [0], orig [5]) ; + exit (1) ; + } ; + + sf_close (file) ; + + unlink (filename) ; + printf ("ok\n") ; +} /* lcomp_test_int */ + +/*-------------------------------------------------------------------------------------------- +*/ + +static void +lcomp_test_float (const char *filename, int filetype, int channels, double margin) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k, m, seekpos ; + sf_count_t datalen ; + float *orig, *data ; + double half_max_abs ; + + print_test_name ("lcomp_test_float", filename) ; + + datalen = BUFFER_SIZE / channels ; + + data = data_buffer.f ; + orig = orig_buffer.f ; + + gen_signal_double (orig_buffer.d, 32000.0, channels, datalen) ; + for (k = 0 ; k < channels * datalen ; k++) + orig [k] = orig_buffer.d [k] ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = 123456789 ; /* Ridiculous value. */ + sfinfo.channels = channels ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + test_writef_float_or_die (file, 0, orig, datalen, __LINE__) ; + sf_set_string (file, SF_STR_COMMENT, long_comment) ; + sf_close (file) ; + + memset (data, 0, datalen * sizeof (float)) ; + + if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + if ((sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)) != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < datalen / channels) + { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.frames > (datalen + datalen / 20)) + { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != channels) + { printf ("Incorrect number of channels in file.\n") ; + exit (1) ; + } ; + + check_comment (file, filetype, __LINE__) ; + + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + + check_log_buffer_or_die (file, __LINE__) ; + + check_comment (file, filetype, __LINE__) ; + + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + + test_readf_float_or_die (file, 0, data, datalen, __LINE__) ; + + half_max_abs = 0.0 ; + for (k = 0 ; k < datalen ; k++) + { if (error_function (data [k], orig [k], margin)) + { printf ("\nLine %d: Incorrect sample A (#%d : %f should be %f).\n", __LINE__, k, data [k], orig [k]) ; + oct_save_float (orig, data, datalen) ; + exit (1) ; + } ; + half_max_abs = LCT_MAX (half_max_abs, fabs (0.5 * data [k])) ; + } ; + + if (half_max_abs < 1.0) + { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ; + exit (1) ; + } ; + + if ((k = sf_readf_float (file, data, datalen)) != sfinfo.frames - datalen) + { printf ("\n\nLine %d: Incorrect read length (%" PRId64 " should be %d).\n", __LINE__, + channels * sfinfo.frames - datalen, k) ; + exit (1) ; + } ; + + /* This check is only for block based encoders which must append silence + ** to the end of a file so as to fill out a block. + */ + if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM) + for (k = 0 ; k < sfinfo.frames - datalen ; k++) + if (ABS (data [channels * k]) > decay_response (channels * k)) + { printf ("\n\nLine %d : Incorrect sample B (#%d : abs (%f) should be < %d).\n", __LINE__, channels * k, data [channels * k], decay_response (channels * k)) ; + exit (1) ; + } ; + + if (! sfinfo.seekable) + { sf_close (file) ; + unlink (filename) ; + printf ("ok\n") ; + return ; + } ; + + /* Now test sf_seek function. */ + + if ((k = sf_seek (file, 0, SEEK_SET)) != 0) + { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ; + exit (1) ; + } ; + + for (m = 0 ; m < 3 ; m++) + { test_readf_float_or_die (file, 0, data, 11, __LINE__) ; + + for (k = 0 ; k < channels * 11 ; k++) + if (error_function (data [k], orig [k + channels * m * 11], margin)) + { printf ("\nLine %d: Incorrect sample (m = %d) (#%d : %f => %f).\n", __LINE__, m, k + channels * m * 11, orig [k + channels * m * 11], data [k]) ; + for (m = 0 ; m < channels ; m++) + printf ("%f ", data [m]) ; + printf ("\n") ; + exit (1) ; + } ; + } ; + + seekpos = BUFFER_SIZE / 10 ; + + /* Check seek from start of file. */ + if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos) + { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ; + exit (1) ; + } ; + + test_readf_float_or_die (file, 0, data, 1, __LINE__) ; + + if (error_function (data [0], orig [seekpos * channels], margin)) + { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_readf_float failed (%f, %f).\n", __LINE__, orig [1], data [0]) ; + exit (1) ; + } ; + + if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1) + { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ; + exit (1) ; + } ; + + seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ; + k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ; + test_readf_float_or_die (file, 0, data, 1, __LINE__) ; + if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos) + { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_float failed (%f, %f) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ; + exit (1) ; + } ; + + seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ; + /* Check seek backward from current position. */ + k = sf_seek (file, -20, SEEK_CUR) ; + test_readf_float_or_die (file, 0, data, 1, __LINE__) ; + if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos) + { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_readf_float failed (%f, %f) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ; + exit (1) ; + } ; + + /* Check that read past end of file returns number of items. */ + sf_seek (file, sfinfo.frames, SEEK_SET) ; + + if ((k = sf_readf_float (file, data, datalen)) != 0) + { printf ("\n\nLine %d: Return value from sf_readf_float past end of file incorrect (%d).\n", __LINE__, k) ; + exit (1) ; + } ; + + /* Check seek backward from end. */ + if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5) + { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ; + exit (1) ; + } ; + + test_readf_float_or_die (file, 0, data, 1, __LINE__) ; + if (error_function (data [0], orig [5 * channels], margin)) + { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_readf_short failed (%f should be %f).\n", __LINE__, data [0], orig [5 * channels]) ; + exit (1) ; + } ; + + sf_close (file) ; + + unlink (filename) ; + printf ("ok\n") ; +} /* lcomp_test_float */ + +/*-------------------------------------------------------------------------------------------- +*/ + +static void +lcomp_test_double (const char *filename, int filetype, int channels, double margin) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k, m, seekpos ; + sf_count_t datalen ; + double *orig, *data ; + double half_max_abs ; + + print_test_name ("lcomp_test_double", filename) ; + + datalen = BUFFER_SIZE / channels ; + + data = data_buffer.d ; + orig = orig_buffer.d ; + + gen_signal_double (orig_buffer.d, 32000.0, channels, datalen) ; + for (k = 0 ; k < channels * datalen ; k++) + orig [k] = orig_buffer.d [k] ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = 123456789 ; /* Ridiculous value. */ + sfinfo.channels = channels ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + test_writef_double_or_die (file, 0, orig, datalen, __LINE__) ; + sf_set_string (file, SF_STR_COMMENT, long_comment) ; + sf_close (file) ; + + memset (data, 0, datalen * sizeof (double)) ; + + if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + if ((sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)) != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < datalen / channels) + { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.frames > (datalen + datalen / 20)) + { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != channels) + { printf ("Incorrect number of channels in file.\n") ; + exit (1) ; + } ; + + check_comment (file, filetype, __LINE__) ; + + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + + check_log_buffer_or_die (file, __LINE__) ; + + check_comment (file, filetype, __LINE__) ; + + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + + test_readf_double_or_die (file, 0, data, datalen, __LINE__) ; + + half_max_abs = 0.0 ; + for (k = 0 ; k < datalen ; k++) + { if (error_function (data [k], orig [k], margin)) + { printf ("\nLine %d: Incorrect sample A (#%d : %f should be %f).\n", __LINE__, k, data [k], orig [k]) ; + oct_save_double (orig, data, datalen) ; + exit (1) ; + } ; + half_max_abs = LCT_MAX (half_max_abs, ABS (0.5 * data [k])) ; + } ; + + if (half_max_abs < 1.0) + { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ; + exit (1) ; + } ; + + if ((k = sf_readf_double (file, data, datalen)) != sfinfo.frames - datalen) + { printf ("\n\nLine %d: Incorrect read length (%" PRId64 " should be %d).\n", __LINE__, + channels * sfinfo.frames - datalen, k) ; + exit (1) ; + } ; + + /* This check is only for block based encoders which must append silence + ** to the end of a file so as to fill out a block. + */ + if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM) + for (k = 0 ; k < sfinfo.frames - datalen ; k++) + if (ABS (data [channels * k]) > decay_response (channels * k)) + { printf ("\n\nLine %d : Incorrect sample B (#%d : abs (%f) should be < %d).\n", __LINE__, channels * k, data [channels * k], decay_response (channels * k)) ; + exit (1) ; + } ; + + if (! sfinfo.seekable) + { sf_close (file) ; + unlink (filename) ; + printf ("ok\n") ; + return ; + } ; + + /* Now test sf_seek function. */ + + if ((k = sf_seek (file, 0, SEEK_SET)) != 0) + { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ; + exit (1) ; + } ; + + for (m = 0 ; m < 3 ; m++) + { test_readf_double_or_die (file, m, data, 11, __LINE__) ; + + for (k = 0 ; k < channels * 11 ; k++) + if (error_function (data [k], orig [k + channels * m * 11], margin)) + { printf ("\nLine %d: Incorrect sample (m = %d) (#%d : %f => %f).\n", __LINE__, m, k + channels * m * 11, orig [k + channels * m * 11], data [k]) ; + for (m = 0 ; m < channels ; m++) + printf ("%f ", data [m]) ; + printf ("\n") ; + exit (1) ; + } ; + } ; + + seekpos = BUFFER_SIZE / 10 ; + + /* Check seek from start of file. */ + if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos) + { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ; + exit (1) ; + } ; + + test_readf_double_or_die (file, 0, data, 1, __LINE__) ; + + if (error_function (data [0], orig [seekpos * channels], margin)) + { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_readf_double failed (%f, %f).\n", __LINE__, orig [1], data [0]) ; + exit (1) ; + } ; + + if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1) + { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ; + exit (1) ; + } ; + + seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ; + k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ; + test_readf_double_or_die (file, 0, data, 1, __LINE__) ; + if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos) + { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_double failed (%f, %f) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ; + exit (1) ; + } ; + + seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ; + /* Check seek backward from current position. */ + k = sf_seek (file, -20, SEEK_CUR) ; + test_readf_double_or_die (file, 0, data, 1, __LINE__) ; + if (error_function (data [0], orig [seekpos * channels], margin) || k != seekpos) + { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_readf_double failed (%f, %f) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ; + exit (1) ; + } ; + + /* Check that read past end of file returns number of items. */ + sf_seek (file, sfinfo.frames, SEEK_SET) ; + + if ((k = sf_readf_double (file, data, datalen)) != 0) + { printf ("\n\nLine %d: Return value from sf_readf_double past end of file incorrect (%d).\n", __LINE__, k) ; + exit (1) ; + } ; + + /* Check seek backward from end. */ + if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5) + { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ; + exit (1) ; + } ; + + test_readf_double_or_die (file, 0, data, 1, __LINE__) ; + if (error_function (data [0], orig [5 * channels], margin)) + { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_readf_short failed (%f should be %f).\n", __LINE__, data [0], orig [5 * channels]) ; + exit (1) ; + } ; + + sf_close (file) ; + + unlink (filename) ; + printf ("ok\n") ; +} /* lcomp_test_double */ + +/*======================================================================================== +** Smoothed differential loss compression tests. +*/ + +static void +sdlcomp_test_short (const char *filename, int filetype, int channels, double margin) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k, m, seekpos, half_max_abs ; + sf_count_t datalen ; + short *orig, *data, *smooth ; + +channels = 1 ; + print_test_name ("sdlcomp_test_short", filename) ; + + datalen = BUFFER_SIZE ; + + orig = orig_buffer.s ; + data = data_buffer.s ; + smooth = smooth_buffer.s ; + + gen_signal_double (orig_buffer.d, 32000.0, channels, datalen) ; + for (k = 0 ; k < datalen ; k++) + orig [k] = lrint (orig_buffer.d [k]) ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = 123456789 ; /* Ridiculous value. */ + sfinfo.channels = channels ; + sfinfo.format = filetype ; + + /* The Vorbis encoder has a bug on PowerPC and X86-64 with sample rates + ** <= 22050. Increasing the sample rate to 32000 avoids triggering it. + ** See https://trac.xiph.org/ticket/1229 + ** + ** Opus only supports discrete sample rates. Choose supported 12000. + */ + if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) + { const char * errstr ; + + errstr = sf_strerror (NULL) ; + if (strstr (errstr, "Sample rate chosen is known to trigger a Vorbis") != NULL) + { printf ("\n Sample rate -> 32kHz ") ; + sfinfo.samplerate = 32000 ; + } + else if (strstr (errstr, "Opus only supports sample rates of") != NULL) + { printf ("\n Sample rate -> 12kHz ") ; + sfinfo.samplerate = 12000 ; + } + else + { printf ("Line %d: sf_open_fd (SFM_WRITE) failed : %s\n", __LINE__, errstr) ; + dump_log_buffer (NULL) ; + exit (1) ; + } ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + } ; + + if ((filetype & SF_FORMAT_SUBMASK) == SF_FORMAT_OPUS && !check_opus_version (file)) + { sf_close (file) ; + return ; + } ; + + test_write_short_or_die (file, 0, orig, datalen, __LINE__) ; + sf_set_string (file, SF_STR_COMMENT, long_comment) ; + sf_close (file) ; + + memset (data, 0, datalen * sizeof (short)) ; + + if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < datalen / channels) + { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.frames > (datalen + 400)) + { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ; + exit (1) ; + } ; + + if (sfinfo.channels != channels) + { printf ("Incorrect number of channels in file.\n") ; + exit (1) ; + } ; + + check_comment (file, filetype, __LINE__) ; + + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_readf_short_or_die (file, 0, data, datalen, __LINE__) ; + + memcpy (smooth, orig, datalen * sizeof (short)) ; + smoothed_diff_short (data, datalen) ; + smoothed_diff_short (smooth, datalen) ; + + half_max_abs = 0.0 ; + for (k = 0 ; k < datalen ; k++) + { if (error_function (1.0 * data [k], 1.0 * smooth [k], margin)) + { printf ("\nLine %d: Incorrect sample (#%d : %d should be %d).\n", __LINE__, k, data [k], smooth [k]) ; + oct_save_short (orig, smooth, datalen) ; + exit (1) ; + } ; + half_max_abs = LCT_MAX (half_max_abs, ABS (0.5 * data [k])) ; + } ; + + if (half_max_abs < 1) + { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ; + exit (1) ; + } ; + + if ((k = sf_read_short (file, data, datalen)) != sfinfo.frames - datalen) + { printf ("\n\nLine %d: Incorrect read length (%d should be %" PRId64 ").\n", __LINE__, k, sfinfo.frames - datalen) ; + exit (1) ; + } ; + + if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM && + (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_GSM610) + for (k = 0 ; k < sfinfo.frames - datalen ; k++) + if (ABS (data [k]) > decay_response (k)) + { printf ("\n\nLine %d: Incorrect sample (#%" PRId64 " : abs (%d) should be < %d).\n", __LINE__, datalen + k, data [k], decay_response (k)) ; + exit (1) ; + } ; + + /* Now test sf_seek function. */ + if (sfinfo.seekable) + { if ((k = sf_seek (file, 0, SEEK_SET)) != 0) + { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ; + exit (1) ; + } ; + + for (m = 0 ; m < 3 ; m++) + { test_readf_short_or_die (file, m, data, datalen / 7, __LINE__) ; + + smoothed_diff_short (data, datalen / 7) ; + memcpy (smooth, orig + m * datalen / 7, datalen / 7 * sizeof (short)) ; + smoothed_diff_short (smooth, datalen / 7) ; + + for (k = 0 ; k < datalen / 7 ; k++) + if (error_function (1.0 * data [k], 1.0 * smooth [k], margin)) + { printf ("\nLine %d: Incorrect sample C (#%d (%" PRId64 ") : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), smooth [k], data [k]) ; + for (m = 0 ; m < 10 ; m++) + printf ("%d ", data [k]) ; + printf ("\n") ; + exit (1) ; + } ; + } ; /* for (m = 0 ; m < 3 ; m++) */ + + seekpos = BUFFER_SIZE / 10 ; + + /* Check seek from start of file. */ + if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos) + { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ; + exit (1) ; + } ; + test_readf_short_or_die (file, 0, data, 1, __LINE__) ; + + if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin)) + { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_read_short failed (%d, %d).\n", __LINE__, orig [1], data [0]) ; + exit (1) ; + } ; + + if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1) + { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ; + exit (1) ; + } ; + + seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ; + k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ; + test_readf_short_or_die (file, 0, data, 1, __LINE__) ; + if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos) + { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_read_short failed (%d, %d) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ; + exit (1) ; + } ; + + seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ; + /* Check seek backward from current position. */ + k = sf_seek (file, -20, SEEK_CUR) ; + test_readf_short_or_die (file, 0, data, 1, __LINE__) ; + if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos) + { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_read_short failed (%d, %d) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ; + exit (1) ; + } ; + + /* Check that read past end of file returns number of items. */ + sf_seek (file, sfinfo.frames, SEEK_SET) ; + + if ((k = sf_read_short (file, data, datalen)) != 0) + { printf ("\n\nLine %d: Return value from sf_read_short past end of file incorrect (%d).\n", __LINE__, k) ; + exit (1) ; + } ; + + /* Check seek backward from end. */ + + if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5) + { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ; + exit (1) ; + } ; + + test_read_short_or_die (file, 0, data, channels, __LINE__) ; + if (error_function (1.0 * data [0], 1.0 * orig [5 * channels], margin)) + { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_read_short failed (%d should be %d).\n", __LINE__, data [0], orig [5 * channels]) ; + exit (1) ; + } ; + } /* if (sfinfo.seekable) */ + + sf_close (file) ; + + unlink (filename) ; + printf ("ok\n") ; +} /* sdlcomp_test_short */ + +static void +sdlcomp_test_int (const char *filename, int filetype, int channels, double margin) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k, m, seekpos, half_max_abs ; + sf_count_t datalen ; + int *orig, *data, *smooth ; + double scale ; + +channels = 1 ; + + print_test_name ("sdlcomp_test_int", filename) ; + + datalen = BUFFER_SIZE ; + scale = 1.0 * 0x10000 ; + + orig = orig_buffer.i ; + data = data_buffer.i ; + smooth = smooth_buffer.i ; + + gen_signal_double (orig_buffer.d, 32000.0 * scale, channels, datalen) ; + for (k = 0 ; k < datalen ; k++) + orig [k] = lrint (orig_buffer.d [k]) ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = 123456789 ; /* Ridiculous value. */ + sfinfo.channels = channels ; + sfinfo.format = filetype ; + + /* The Vorbis encoder has a bug on PowerPC and X86-64 with sample rates + ** <= 22050. Increasing the sample rate to 32000 avoids triggering it. + ** See https://trac.xiph.org/ticket/1229 + ** + ** Opus only supports discrete sample rates. Choose supported 12000. + */ + if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) + { const char * errstr ; + + errstr = sf_strerror (NULL) ; + if (strstr (errstr, "Sample rate chosen is known to trigger a Vorbis") != NULL) + { printf ("\n Sample rate -> 32kHz ") ; + sfinfo.samplerate = 32000 ; + } + else if (strstr (errstr, "Opus only supports sample rates of") != NULL) + { printf ("\n Sample rate -> 12kHz ") ; + sfinfo.samplerate = 12000 ; + } + else + { printf ("Line %d: sf_open_fd (SFM_WRITE) failed : %s\n", __LINE__, errstr) ; + dump_log_buffer (NULL) ; + exit (1) ; + } ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + } ; + + if ((filetype & SF_FORMAT_SUBMASK) == SF_FORMAT_OPUS && !check_opus_version (file)) + { sf_close (file) ; + return ; + } ; + + test_writef_int_or_die (file, 0, orig, datalen, __LINE__) ; + sf_set_string (file, SF_STR_COMMENT, long_comment) ; + sf_close (file) ; + + memset (data, 0, datalen * sizeof (int)) ; + + if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("Returned format incorrect (0x%08X => 0x%08X).\n", filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < datalen / channels) + { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.frames > (datalen + 400)) + { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ; + exit (1) ; + } ; + + if (sfinfo.channels != channels) + { printf ("Incorrect number of channels in file.\n") ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_readf_int_or_die (file, 0, data, datalen, __LINE__) ; + + memcpy (smooth, orig, datalen * sizeof (int)) ; + smoothed_diff_int (data, datalen) ; + smoothed_diff_int (smooth, datalen) ; + + half_max_abs = abs (data [0] >> 16) ; + for (k = 1 ; k < datalen ; k++) + { if (error_function (data [k] / scale, smooth [k] / scale, margin)) + { printf ("\nLine %d: Incorrect sample (#%d : %d should be %d).\n", __LINE__, k, data [k], smooth [k]) ; + oct_save_int (orig, smooth, datalen) ; + exit (1) ; + } ; + half_max_abs = LCT_MAX (half_max_abs, abs (data [k] / 2)) ; + } ; + + if (half_max_abs < 1) + { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ; + exit (1) ; + } ; + + if ((k = sf_readf_int (file, data, datalen)) != sfinfo.frames - datalen) + { printf ("\n\nLine %d: Incorrect read length (%d should be %" PRId64 ").\n", __LINE__, k, sfinfo.frames - datalen) ; + exit (1) ; + } ; + + if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_IMA_ADPCM && + (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM && + (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_GSM610 && + (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_G721_32 && + (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_G723_24 && + (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_NMS_ADPCM_16 && + (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_NMS_ADPCM_24 && + (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_NMS_ADPCM_32) + for (k = 0 ; k < sfinfo.frames - datalen ; k++) + if (abs (data [k]) > decay_response (k)) + { printf ("\n\nLine %d: Incorrect sample (#%" PRId64 " : abs (%d) should be < %d).\n", __LINE__, datalen + k, data [k], decay_response (k)) ; + exit (1) ; + } ; + + /* Now test sf_seek function. */ + if (sfinfo.seekable) + { if ((k = sf_seek (file, 0, SEEK_SET)) != 0) + { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ; + exit (1) ; + } ; + + for (m = 0 ; m < 3 ; m++) + { test_readf_int_or_die (file, m, data, datalen / 7, __LINE__) ; + + smoothed_diff_int (data, datalen / 7) ; + memcpy (smooth, orig + m * datalen / 7, datalen / 7 * sizeof (int)) ; + smoothed_diff_int (smooth, datalen / 7) ; + + for (k = 0 ; k < datalen / 7 ; k++) + if (error_function (data [k] / scale, smooth [k] / scale, margin)) + { printf ("\nLine %d: Incorrect sample (#%d (%" PRId64 ") : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), smooth [k], data [k]) ; + for (m = 0 ; m < 10 ; m++) + printf ("%d ", data [k]) ; + printf ("\n") ; + exit (1) ; + } ; + } ; /* for (m = 0 ; m < 3 ; m++) */ + + seekpos = BUFFER_SIZE / 10 ; + + /* Check seek from start of file. */ + if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos) + { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ; + exit (1) ; + } ; + test_readf_int_or_die (file, 0, data, 1, __LINE__) ; + + if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin)) + { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_readf_int failed (%d, %d).\n", __LINE__, orig [1], data [0]) ; + exit (1) ; + } ; + + if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1) + { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ; + exit (1) ; + } ; + + seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ; + k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ; + test_readf_int_or_die (file, 0, data, 1, __LINE__) ; + if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos) + { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos + 1) ; + exit (1) ; + } ; + + seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ; + /* Check seek backward from current position. */ + k = sf_seek (file, -20, SEEK_CUR) ; + test_readf_int_or_die (file, 0, data, 1, __LINE__) ; + if (error_function (1.0 * data [0], 1.0 * orig [seekpos * channels], margin) || k != seekpos) + { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_readf_int failed (%d, %d) (%d, %d).\n", __LINE__, data [0], orig [seekpos * channels], k, seekpos) ; + exit (1) ; + } ; + + /* Check that read past end of file returns number of items. */ + sf_seek (file, sfinfo.frames, SEEK_SET) ; + + if ((k = sf_readf_int (file, data, datalen)) != 0) + { printf ("\n\nLine %d: Return value from sf_readf_int past end of file incorrect (%d).\n", __LINE__, k) ; + exit (1) ; + } ; + + /* Check seek backward from end. */ + + if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5) + { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ; + exit (1) ; + } ; + + test_readf_int_or_die (file, 0, data, 1, __LINE__) ; + if (error_function (data [0] / scale, orig [5] / scale, margin)) + { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_readf_int failed (%d should be %d).\n", __LINE__, data [0], orig [5]) ; + exit (1) ; + } ; + } /* if (sfinfo.seekable) */ + + sf_close (file) ; + + unlink (filename) ; + printf ("ok\n") ; +} /* sdlcomp_test_int */ + +static void +sdlcomp_test_float (const char *filename, int filetype, int channels, double margin) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k, m, seekpos ; + sf_count_t datalen ; + float *orig, *data, *smooth ; + double half_max_abs , scale ; + +channels = 1 ; + + print_test_name ("sdlcomp_test_float", filename) ; + + switch ((filetype & SF_FORMAT_SUBMASK)) + { case SF_FORMAT_VORBIS : + /* Vorbis starts to loose fidelity with floating point values outside + ** the range of approximately [-2000.0, 2000.0] (Determined + ** experimentally, not know if it is a limitation of Vorbis or + ** libvorbis.) + */ + scale = 16.0 ; /* 32000/16 = 2000 */ + break ; + + case SF_FORMAT_OPUS : + /* The Opus spec says that non-normalized floating point value + ** support (extended dynamic range in its terms) is optional and + ** cannot be relied upon. + */ + scale = 32000.0 ; /* 32000/32000 = 1 */ + break ; + + default : + scale = 1.0 ; + break ; + } ; + + datalen = BUFFER_SIZE ; + + orig = orig_buffer.f ; + data = data_buffer.f ; + smooth = smooth_buffer.f ; + + gen_signal_double (orig_buffer.d, 32000.0 / scale, channels, datalen) ; + for (k = 0 ; k < datalen ; k++) + orig [k] = orig_buffer.d [k] ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = 123456789 ; /* Ridiculous value. */ + sfinfo.channels = channels ; + sfinfo.format = filetype ; + + + /* The Vorbis encoder has a bug on PowerPC and X86-64 with sample rates + ** <= 22050. Increasing the sample rate to 32000 avoids triggering it. + ** See https://trac.xiph.org/ticket/1229 + ** + ** Opus only supports discrete sample rates. Choose supported 12000. + */ + if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) + { const char * errstr ; + + errstr = sf_strerror (NULL) ; + if (strstr (errstr, "Sample rate chosen is known to trigger a Vorbis") != NULL) + { printf ("\n Sample rate -> 32kHz ") ; + sfinfo.samplerate = 32000 ; + } + else if (strstr (errstr, "Opus only supports sample rates of") != NULL) + { printf ("\n Sample rate -> 12kHz ") ; + sfinfo.samplerate = 12000 ; + } + else + { printf ("Line %d: sf_open_fd (SFM_WRITE) failed : %s\n", __LINE__, errstr) ; + dump_log_buffer (NULL) ; + exit (1) ; + } ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + } ; + + if ((filetype & SF_FORMAT_SUBMASK) == SF_FORMAT_OPUS && !check_opus_version (file)) + { sf_close (file) ; + return ; + } ; + + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + test_write_float_or_die (file, 0, orig, datalen, __LINE__) ; + sf_set_string (file, SF_STR_COMMENT, long_comment) ; + sf_close (file) ; + + memset (data, 0, datalen * sizeof (float)) ; + + if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + if ((sfinfo.format & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK)) != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < datalen / channels) + { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.frames > (datalen + 400)) + { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ; + exit (1) ; + } ; + + if (sfinfo.channels != channels) + { printf ("Incorrect number of channels in file.\n") ; + exit (1) ; + } ; + + check_comment (file, filetype, __LINE__) ; + + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_float_or_die (file, 0, data, datalen, __LINE__) ; + + memcpy (smooth, orig, datalen * sizeof (float)) ; + smoothed_diff_float (data, datalen) ; + smoothed_diff_float (smooth, datalen) ; + + half_max_abs = fabs (data [0]) ; + for (k = 1 ; k < datalen ; k++) + { if (error_function (data [k] * scale, smooth [k] * scale, margin)) + { printf ("\nLine %d: Incorrect sample (#%d : %d should be %d).\n", __LINE__, k, (int) (data [k] * scale), (int) (smooth [k] * scale)) ; + oct_save_float (orig, smooth, datalen) ; + exit (1) ; + } ; + half_max_abs = LCT_MAX (half_max_abs, ABS (0.5 * data [k] * scale)) ; + } ; + + if (half_max_abs <= 0.0) + { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ; + printf ("half_max_abs : % 10.6f\n", half_max_abs) ; + exit (1) ; + } ; + + if ((k = sf_read_float (file, data, datalen)) != sfinfo.frames - datalen) + { printf ("\n\nLine %d: Incorrect read length (%d should be %" PRId64 ").\n", __LINE__, k, sfinfo.frames - datalen) ; + exit (1) ; + } ; + + if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM && + (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_GSM610) + for (k = 0 ; k < sfinfo.frames - datalen ; k++) + if (ABS (data [k]) > decay_response (k)) + { printf ("\n\nLine %d: Incorrect sample (#%" PRId64 " : abs (%d) should be < %d).\n", __LINE__, datalen + k, (int) data [k], (int) decay_response (k)) ; + exit (1) ; + } ; + + /* Now test sf_seek function. */ + if (sfinfo.seekable) + { if ((k = sf_seek (file, 0, SEEK_SET)) != 0) + { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ; + exit (1) ; + } ; + + for (m = 0 ; m < 3 ; m++) + { test_read_float_or_die (file, 0, data, datalen / 7, __LINE__) ; + + smoothed_diff_float (data, datalen / 7) ; + memcpy (smooth, orig + m * datalen / 7, datalen / 7 * sizeof (float)) ; + smoothed_diff_float (smooth, datalen / 7) ; + + for (k = 0 ; k < datalen / 7 ; k++) + if (error_function (data [k] * scale, smooth [k] * scale, margin)) + { printf ("\nLine %d: Incorrect sample C (#%d (%" PRId64 ") : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), (int) (smooth [k] * scale), (int) (data [k] * scale)) ; + for (m = 0 ; m < 10 ; m++) + printf ("%d ", (int) data [k]) ; + printf ("\n") ; + exit (1) ; + } ; + } ; /* for (m = 0 ; m < 3 ; m++) */ + + seekpos = BUFFER_SIZE / 10 ; + + /* Check seek from start of file. */ + if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos) + { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ; + exit (1) ; + } ; + test_read_float_or_die (file, 0, data, channels, __LINE__) ; + + if (error_function (data [0] * scale, orig [seekpos * channels] * scale, margin)) + { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_read_float failed (%d, %d).\n", __LINE__, (int) (orig [1] * scale), (int) (data [0] * scale)) ; + exit (1) ; + } ; + + if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1) + { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ; + exit (1) ; + } ; + + seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ; + k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ; + test_read_float_or_die (file, 0, data, channels, __LINE__) ; + if (error_function (data [0] * scale, orig [seekpos * channels] * scale, margin) || k != seekpos) + { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_read_float failed (%d, %d) (%d, %d).\n", __LINE__, (int) (data [0] * scale), (int) (orig [seekpos * channels] * scale), k, seekpos + 1) ; + exit (1) ; + } ; + + seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ; + /* Check seek backward from current position. */ + k = sf_seek (file, -20, SEEK_CUR) ; + test_read_float_or_die (file, 0, data, channels, __LINE__) ; + if (error_function (data [0] * scale, orig [seekpos * channels] * scale, margin) || k != seekpos) + { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_read_float failed (%d, %d) (%d, %d).\n", __LINE__, (int) (data [0] * scale), (int) (orig [seekpos * channels] * scale), k, seekpos) ; + exit (1) ; + } ; + + /* Check that read past end of file returns number of items. */ + sf_seek (file, sfinfo.frames, SEEK_SET) ; + + if ((k = sf_read_float (file, data, datalen)) != 0) + { printf ("\n\nLine %d: Return value from sf_read_float past end of file incorrect (%d).\n", __LINE__, k) ; + exit (1) ; + } ; + + /* Check seek backward from end. */ + + if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5) + { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ; + exit (1) ; + } ; + + test_read_float_or_die (file, 0, data, channels, __LINE__) ; + if (error_function (data [0] * scale, orig [5 * channels] * scale, margin)) + { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_read_float failed (%f should be %f).\n", __LINE__, data [0] * scale, orig [5 * channels] * scale) ; + exit (1) ; + } ; + } /* if (sfinfo.seekable) */ + + sf_close (file) ; + + unlink (filename) ; + printf ("ok\n") ; +} /* sdlcomp_test_float */ + +static void +sdlcomp_test_double (const char *filename, int filetype, int channels, double margin) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k, m, seekpos ; + sf_count_t datalen ; + double *orig, *data, *smooth, half_max_abs, scale ; + +channels = 1 ; + print_test_name ("sdlcomp_test_double", filename) ; + + switch ((filetype & SF_FORMAT_SUBMASK)) + { case SF_FORMAT_VORBIS : + /* Vorbis starts to loose fidelity with floating point values outside + ** the range of approximately [-2000.0, 2000.0] (Determined + ** experimentally, not know if it is a limitation of Vorbis or + ** libvorbis.) + */ + scale = 16.0 ; /* 32000/16 = 2000 */ + break ; + + case SF_FORMAT_OPUS : + /* The Opus spec says that non-normalized floating point value + ** support (extended dynamic range in its terms) is optional and + ** cannot be relied upon. + */ + scale = 32000.0 ; /* 32000/32000 = 1 */ + break ; + + default : + scale = 1.0 ; + break ; + } ; + + datalen = BUFFER_SIZE ; + + orig = orig_buffer.d ; + data = data_buffer.d ; + smooth = smooth_buffer.d ; + + gen_signal_double (orig_buffer.d, 32000.0 / scale, channels, datalen) ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = 123456789 ; /* Ridiculous value. */ + sfinfo.channels = channels ; + sfinfo.format = filetype ; + + /* The Vorbis encoder has a bug on PowerPC and X86-64 with sample rates + ** <= 22050. Increasing the sample rate to 32000 avoids triggering it. + ** See https://trac.xiph.org/ticket/1229 + ** + ** Opus only supports discrete sample rates. Choose supported 12000. + */ + if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) + { const char * errstr ; + + errstr = sf_strerror (NULL) ; + if (strstr (errstr, "Sample rate chosen is known to trigger a Vorbis") != NULL) + { printf ("\n Sample rate -> 32kHz ") ; + sfinfo.samplerate = 32000 ; + } + else if (strstr (errstr, "Opus only supports sample rates of") != NULL) + { printf ("\n Sample rate -> 12kHz ") ; + sfinfo.samplerate = 12000 ; + } + else + { printf ("Line %d: sf_open_fd (SFM_WRITE) failed : %s\n", __LINE__, errstr) ; + dump_log_buffer (NULL) ; + exit (1) ; + } ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + } ; + + if ((filetype & SF_FORMAT_SUBMASK) == SF_FORMAT_OPUS && !check_opus_version (file)) + { sf_close (file) ; + return ; + } ; + + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + test_write_double_or_die (file, 0, orig, datalen, __LINE__) ; + sf_set_string (file, SF_STR_COMMENT, long_comment) ; + sf_close (file) ; + + memset (data, 0, datalen * sizeof (double)) ; + + if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("Returned format incorrect (0x%08X => 0x%08X).\n", filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < datalen / channels) + { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.frames > (datalen + 400)) + { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ; + exit (1) ; + } ; + + if (sfinfo.channels != channels) + { printf ("Incorrect number of channels in file.\n") ; + exit (1) ; + } ; + + check_comment (file, filetype, __LINE__) ; + + check_comment (file, filetype, __LINE__) ; + + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_double_or_die (file, 0, data, datalen, __LINE__) ; + + memcpy (smooth, orig, datalen * sizeof (double)) ; + smoothed_diff_double (data, datalen) ; + smoothed_diff_double (smooth, datalen) ; + + half_max_abs = 0.0 ; + for (k = 0 ; k < datalen ; k++) + { if (error_function (data [k] * scale, smooth [k] * scale, margin)) + { printf ("\n\nLine %d: Incorrect sample (#%d : %d should be %d).\n", __LINE__, k, (int) (data [k] * scale), (int) (smooth [k] * scale)) ; + oct_save_double (orig, smooth, datalen) ; + exit (1) ; + } ; + half_max_abs = LCT_MAX (half_max_abs, 0.5 * fabs (data [k] * scale)) ; + } ; + + if (half_max_abs < 1.0) + { printf ("\n\nLine %d: Signal is all zeros.\n", __LINE__) ; + exit (1) ; + } ; + + if ((k = sf_read_double (file, data, datalen)) != sfinfo.frames - datalen) + { printf ("\n\nLine %d: Incorrect read length (%d should be %" PRId64 ").\n", __LINE__, k, sfinfo.frames - datalen) ; + exit (1) ; + } ; + + if ((sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_MS_ADPCM && + (sfinfo.format & SF_FORMAT_SUBMASK) != SF_FORMAT_GSM610) + for (k = 0 ; k < sfinfo.frames - datalen ; k++) + if (ABS (data [k]) > decay_response (k)) + { printf ("\n\nLine %d: Incorrect sample (#%" PRId64 " : abs (%d) should be < %d).\n", __LINE__, datalen + k, (int) data [k], (int) decay_response (k)) ; + exit (1) ; + } ; + + /* Now test sf_seek function. */ + if (sfinfo.seekable) + { if ((k = sf_seek (file, 0, SEEK_SET)) != 0) + { printf ("\n\nLine %d: Seek to start of file failed (%d).\n", __LINE__, k) ; + exit (1) ; + } ; + + for (m = 0 ; m < 3 ; m++) + { test_read_double_or_die (file, m, data, datalen / 7, __LINE__) ; + + smoothed_diff_double (data, datalen / 7) ; + memcpy (smooth, orig + m * datalen / 7, datalen / 7 * sizeof (double)) ; + smoothed_diff_double (smooth, datalen / 7) ; + + for (k = 0 ; k < datalen / 7 ; k++) + if (error_function (data [k] * scale, smooth [k] * scale, margin)) + { printf ("\nLine %d: Incorrect sample C (#%d (%" PRId64 ") : %d => %d).\n", __LINE__, k, k + m * (datalen / 7), (int) (smooth [k] * scale), (int) (data [k] * scale)) ; + for (m = 0 ; m < 10 ; m++) + printf ("%d ", (int) data [k]) ; + printf ("\n") ; + exit (1) ; + } ; + } ; /* for (m = 0 ; m < 3 ; m++) */ + + seekpos = BUFFER_SIZE / 10 ; + + /* Check seek from start of file. */ + if ((k = sf_seek (file, seekpos, SEEK_SET)) != seekpos) + { printf ("Seek to start of file + %d failed (%d).\n", seekpos, k) ; + exit (1) ; + } ; + test_read_double_or_die (file, 0, data, channels, __LINE__) ; + + if (error_function (data [0] * scale, orig [seekpos * channels] * scale, margin)) + { printf ("\nLine %d: sf_seek (SEEK_SET) followed by sf_read_double failed (%d, %d).\n", __LINE__, (int) (orig [1] * scale), (int) (data [0] * scale)) ; + exit (1) ; + } ; + + if ((k = sf_seek (file, 0, SEEK_CUR)) != seekpos + 1) + { printf ("\n\nLine %d: sf_seek (SEEK_CUR) with 0 offset failed (%d should be %d)\n", __LINE__, k, seekpos + 1) ; + exit (1) ; + } ; + + seekpos = sf_seek (file, 0, SEEK_CUR) + BUFFER_SIZE / 5 ; + k = sf_seek (file, BUFFER_SIZE / 5, SEEK_CUR) ; + test_read_double_or_die (file, 0, data, channels, __LINE__) ; + if (error_function (data [0] * scale, orig [seekpos * channels] * scale, margin) || k != seekpos) + { printf ("\nLine %d: sf_seek (forwards, SEEK_CUR) followed by sf_read_double failed (%d, %d) (%d, %d).\n", __LINE__, (int) (data [0] * scale), (int) (orig [seekpos * channels] * scale), k, seekpos + 1) ; + exit (1) ; + } ; + + seekpos = sf_seek (file, 0, SEEK_CUR) - 20 ; + /* Check seek backward from current position. */ + k = sf_seek (file, -20, SEEK_CUR) ; + test_read_double_or_die (file, 0, data, channels, __LINE__) ; + if (error_function (data [0] * scale, orig [seekpos * channels] * scale, margin) || k != seekpos) + { printf ("\nLine %d: sf_seek (backwards, SEEK_CUR) followed by sf_read_double failed (%d, %d) (%d, %d).\n", __LINE__, (int) (data [0] * scale), (int) (orig [seekpos * channels] * scale), k, seekpos) ; + exit (1) ; + } ; + + /* Check that read past end of file returns number of items. */ + sf_seek (file, sfinfo.frames, SEEK_SET) ; + + if ((k = sf_read_double (file, data, datalen)) != 0) + { printf ("\n\nLine %d: Return value from sf_read_double past end of file incorrect (%d).\n", __LINE__, k) ; + exit (1) ; + } ; + + /* Check seek backward from end. */ + + if ((k = sf_seek (file, 5 - sfinfo.frames, SEEK_END)) != 5) + { printf ("\n\nLine %d: sf_seek (SEEK_END) returned %d instead of %d.\n", __LINE__, k, 5) ; + exit (1) ; + } ; + + test_read_double_or_die (file, 0, data, channels, __LINE__) ; + if (error_function (data [0] * scale, orig [5 * channels] * scale, margin)) + { printf ("\nLine %d: sf_seek (SEEK_END) followed by sf_read_double failed (%f should be %f).\n", __LINE__, data [0] * scale, orig [5 * channels] * scale) ; + exit (1) ; + } ; + } /* if (sfinfo.seekable) */ + + sf_close (file) ; + + unlink (filename) ; + printf ("ok\n") ; +} /* sdlcomp_test_double */ + +static void +read_raw_test (const char *filename, int filetype, int channels) +{ SNDFILE *file ; + SF_INFO sfinfo ; + sf_count_t count, datalen ; + short *orig, *data ; + int k ; + + print_test_name ("read_raw_test", filename) ; + + datalen = ARRAY_LEN (orig_buffer.s) / 2 ; + + orig = orig_buffer.s ; + data = data_buffer.s ; + + gen_signal_double (orig_buffer.d, 32000.0, channels, datalen) ; + for (k = 0 ; k < datalen ; k++) + orig [k] = lrint (orig_buffer.d [k]) ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = 123456789 ; /* Ridiculous value. */ + sfinfo.channels = channels ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + test_write_short_or_die (file, 0, orig, datalen, __LINE__) ; + sf_set_string (file, SF_STR_COMMENT, long_comment) ; + sf_close (file) ; + + memset (data, 0, datalen * sizeof (double)) ; + + if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("Returned format incorrect (0x%08X => 0x%08X).\n", filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < datalen / channels) + { printf ("Too few.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", datalen, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.frames > (datalen + 400)) + { printf ("Too many.frames in file. (%" PRId64 " should be a little more than %" PRId64 ")\n", sfinfo.frames, datalen) ; + exit (1) ; + } ; + + if (sfinfo.channels != channels) + { printf ("Incorrect number of channels in file.\n") ; + exit (1) ; + } ; + + check_comment (file, filetype, __LINE__) ; + + count = sf_read_raw (file, orig_buffer.c, datalen + 5 * channels) ; + if (count != sfinfo.channels * sfinfo.frames) + { printf ("\nLine %d : sf_read_raw returned %" PRId64 " should be %" PRId64 "\n", __LINE__, count, sfinfo.channels * sfinfo.frames) ; + exit (1) ; + } ; + + sf_close (file) ; + + unlink (filename) ; + printf ("ok\n") ; +} /* read_raw_test */ + +/*======================================================================================== +** Auxiliary functions +*/ + +#define SIGNAL_MAXVAL 30000.0 +#define DECAY_COUNT 1000 + +static int +decay_response (int k) +{ if (k < 1) + return (int) (1.2 * SIGNAL_MAXVAL) ; + if (k > DECAY_COUNT) + return 0 ; + return (int) (1.2 * SIGNAL_MAXVAL * (DECAY_COUNT - k) / (1.0 * DECAY_COUNT)) ; +} /* decay_response */ + +static void +gen_signal_double (double *data, double scale, int channels, int datalen) +{ int k, ramplen ; + double amp = 0.0 ; + + ramplen = DECAY_COUNT ; + + if (channels == 1) + { for (k = 0 ; k < datalen ; k++) + { if (k <= ramplen) + amp = scale * k / ((double) ramplen) ; + else if (k > datalen - ramplen) + amp = scale * (datalen - k) / ((double) ramplen) ; + +/*-printf ("%3d : %g\n", k, amp) ;-*/ + + data [k] = amp * (0.4 * sin (33.3 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE)) + + 0.3 * cos (201.1 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))) ; + } ; + } + else + { for (k = 0 ; k < datalen ; k ++) + { if (k <= ramplen) + amp = scale * k / ((double) ramplen) ; + else if (k > datalen - ramplen) + amp = scale * (datalen - k) / ((double) ramplen) ; + + data [2 * k] = amp * (0.4 * sin (33.3 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE)) + + 0.3 * cos (201.1 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))) ; + data [2 * k + 1] = amp * (0.4 * sin (55.5 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE)) + + 0.3 * cos (201.1 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))) ; + } ; + } ; + + return ; +} /* gen_signal_double */ + +static int +error_function (double data, double orig, double margin) +{ double error ; + + if (fabs (orig) <= 500.0) + error = fabs (fabs (data) - fabs (orig)) / 2000.0 ; + else if (fabs (orig) <= 1000.0) + error = fabs (data - orig) / 3000.0 ; + else + error = fabs (data - orig) / fabs (orig) ; + + if (error > margin) + { printf ("\n\nerror_function (data = %f, orig = %f, margin = %f) -> %f\n", data, orig, margin, error) ; + return 1 ; + } ; + return 0 ; +} /* error_function */ + +static void +smoothed_diff_short (short *data, unsigned int datalen) +{ unsigned int k ; + double memory = 0.0 ; + + /* Calculate the smoothed sample-to-sample difference. */ + for (k = 0 ; k < datalen - 1 ; k++) + { memory = 0.7 * memory + (1 - 0.7) * (double) (data [k+1] - data [k]) ; + data [k] = (short) memory ; + } ; + data [datalen-1] = data [datalen-2] ; + +} /* smoothed_diff_short */ + +static void +smoothed_diff_int (int *data, unsigned int datalen) +{ unsigned int k ; + double memory = 0.0 ; + + /* Calculate the smoothed sample-to-sample difference. */ + for (k = 0 ; k < datalen - 1 ; k++) + { memory = 0.7 * memory + (1 - 0.7) * (double) (data [k+1] - data [k]) ; + data [k] = (int) memory ; + } ; + data [datalen-1] = data [datalen-2] ; + +} /* smoothed_diff_int */ + +static void +smoothed_diff_float (float *data, unsigned int datalen) +{ unsigned int k ; + float memory = 0.0 ; + + /* Calculate the smoothed sample-to-sample difference. */ + for (k = 0 ; k < datalen - 1 ; k++) + { memory = 0.7 * memory + (1 - 0.7) * (data [k+1] - data [k]) ; + data [k] = memory ; + } ; + data [datalen-1] = data [datalen-2] ; + +} /* smoothed_diff_float */ + +static void +smoothed_diff_double (double *data, unsigned int datalen) +{ unsigned int k ; + double memory = 0.0 ; + + /* Calculate the smoothed sample-to-sample difference. */ + for (k = 0 ; k < datalen - 1 ; k++) + { memory = 0.7 * memory + (1 - 0.7) * (data [k+1] - data [k]) ; + data [k] = memory ; + } ; + data [datalen-1] = data [datalen-2] ; + +} /* smoothed_diff_double */ + +static void +check_comment (SNDFILE * file, int format, int lineno) +{ const char *comment ; + + switch (format & SF_FORMAT_TYPEMASK) + { case SF_FORMAT_AIFF : + case SF_FORMAT_WAV : + case SF_FORMAT_WAVEX : + break ; + default : + return ; + } ; + + comment = sf_get_string (file, SF_STR_COMMENT) ; + if (comment == NULL) + { printf ("\n\nLine %d : File does not contain a comment string.\n\n", lineno) ; + exit (1) ; + } ; + + if (strcmp (comment, long_comment) != 0) + { printf ("\n\nLine %d : File comment does not match comment written.\n\n", lineno) ; + exit (1) ; + } ; + + return ; +} /* check_comment */ + +static int +is_lossy (int filetype) +{ + switch (SF_FORMAT_SUBMASK & filetype) + { case SF_FORMAT_PCM_U8 : + case SF_FORMAT_PCM_S8 : + case SF_FORMAT_PCM_16 : + case SF_FORMAT_PCM_24 : + case SF_FORMAT_PCM_32 : + case SF_FORMAT_FLOAT : + case SF_FORMAT_DOUBLE : + return 0 ; + + default : + break ; + } ; + + return 1 ; +} /* is_lossy */ + + +static int +check_opus_version (SNDFILE *file) +{ char log_buf [256] ; + char *str, *p ; + const char *str_libopus = "Opus library version: " ; + int ver_major, ver_minor ; + + sf_command (file, SFC_GET_LOG_INFO, log_buf, sizeof (log_buf)) ; + str = strstr (log_buf, str_libopus) ; + if (str) + { str += strlen (str_libopus) ; + if ((p = strchr (str, '\n'))) + *p = '\0' ; + if (sscanf (str, "libopus %d.%d", &ver_major, &ver_minor) == 2) + { /* Reject versions prior to 1.3 */ + if (ver_major > 1 || (ver_major == 1 && ver_minor >= 3)) + { /* + ** Make sure that the libopus in use is not fixed-point, as it + ** sacrifices accuracy. libopus API documentation explicitly + ** allows checking for this suffix to determine if it is. + */ + if (!strstr (str, "-fixed")) + return 1 ; + } ; + } ; + } ; + + printf ("skipping (%s)\n", str ? str : "unknown libopus version") ; + return 0 ; +} /* check_opus_version */ diff --git a/libsndfile-1.0.31/tests/misc_test.c b/libsndfile-1.0.31/tests/misc_test.c new file mode 100644 index 0000000..31e93d1 --- /dev/null +++ b/libsndfile-1.0.31/tests/misc_test.c @@ -0,0 +1,533 @@ +/* +** Copyright (C) 2001-2017 Erik de Castro Lopo +** +** This program is free software ; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation ; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY ; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#include +#include + +#if HAVE_UNISTD_H +#include +#endif + +#if (HAVE_DECL_S_IRGRP == 0) +#include +#endif + +#if (defined (WIN32) || defined (_WIN32)) +#include +#include +#endif + +#include + +#include "utils.h" + +#define BUFFER_LEN (1 << 10) +#define LOG_BUFFER_SIZE 1024 + +static void zero_data_test (const char *filename, int format) ; +static void filesystem_full_test (int format) ; +static void permission_test (const char *filename, int typemajor) ; +static void wavex_amb_test (const char *filename) ; +static void rf64_downgrade_test (const char *filename) ; +static void rf64_long_file_downgrade_test (const char *filename) ; + +int +main (int argc, char *argv []) +{ int do_all = 0 ; + int test_count = 0 ; + + if (argc != 2) + { printf ("Usage : %s \n", argv [0]) ; + printf (" Where is one of the following:\n") ; + printf (" wav - test WAV file peak chunk\n") ; + printf (" aiff - test AIFF file PEAK chunk\n") ; + printf (" all - perform all tests\n") ; + exit (1) ; + } ; + + do_all = ! strcmp (argv [1], "all") ; + + if (do_all || ! strcmp (argv [1], "wav")) + { zero_data_test ("zerolen.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; + filesystem_full_test (SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; + permission_test ("readonly.wav", SF_FORMAT_WAV) ; + wavex_amb_test ("ambisonic.wav") ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "aiff")) + { zero_data_test ("zerolen.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ; + filesystem_full_test (SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ; + permission_test ("readonly.aiff", SF_FORMAT_AIFF) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "au")) + { zero_data_test ("zerolen.au", SF_FORMAT_AU | SF_FORMAT_PCM_16) ; + filesystem_full_test (SF_FORMAT_AU | SF_FORMAT_PCM_16) ; + permission_test ("readonly.au", SF_FORMAT_AU) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "caf")) + { zero_data_test ("zerolen.caf", SF_FORMAT_CAF | SF_FORMAT_PCM_16) ; + filesystem_full_test (SF_FORMAT_CAF | SF_FORMAT_PCM_16) ; + permission_test ("readonly.caf", SF_FORMAT_CAF) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "svx")) + { zero_data_test ("zerolen.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_16) ; + filesystem_full_test (SF_FORMAT_SVX | SF_FORMAT_PCM_16) ; + permission_test ("readonly.svx", SF_FORMAT_SVX) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "nist")) + { zero_data_test ("zerolen.nist", SF_FORMAT_NIST | SF_FORMAT_PCM_16) ; + filesystem_full_test (SF_FORMAT_NIST | SF_FORMAT_PCM_16) ; + permission_test ("readonly.nist", SF_FORMAT_NIST) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "paf")) + { zero_data_test ("zerolen.paf", SF_FORMAT_PAF | SF_FORMAT_PCM_16) ; + filesystem_full_test (SF_FORMAT_PAF | SF_FORMAT_PCM_16) ; + permission_test ("readonly.paf", SF_FORMAT_PAF) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "ircam")) + { zero_data_test ("zerolen.ircam", SF_FORMAT_IRCAM | SF_FORMAT_PCM_16) ; + filesystem_full_test (SF_FORMAT_IRCAM | SF_FORMAT_PCM_16) ; + permission_test ("readonly.ircam", SF_FORMAT_IRCAM) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "voc")) + { zero_data_test ("zerolen.voc", SF_FORMAT_VOC | SF_FORMAT_PCM_16) ; + filesystem_full_test (SF_FORMAT_VOC | SF_FORMAT_PCM_16) ; + permission_test ("readonly.voc", SF_FORMAT_VOC) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "w64")) + { zero_data_test ("zerolen.w64", SF_FORMAT_W64 | SF_FORMAT_PCM_16) ; + filesystem_full_test (SF_FORMAT_W64 | SF_FORMAT_PCM_16) ; + permission_test ("readonly.w64", SF_FORMAT_W64) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "rf64")) + { zero_data_test ("zerolen.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ; + filesystem_full_test (SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ; + permission_test ("readonly.rf64", SF_FORMAT_RF64) ; + rf64_downgrade_test ("downgrade.wav") ; + /* Disable this by default, because it needs to write 4 gigabytes of data. */ + if (SF_FALSE) + rf64_long_file_downgrade_test ("no-downgrade.rf64") ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mat4")) + { zero_data_test ("zerolen.mat4", SF_FORMAT_MAT4 | SF_FORMAT_PCM_16) ; + filesystem_full_test (SF_FORMAT_MAT4 | SF_FORMAT_PCM_16) ; + permission_test ("readonly.mat4", SF_FORMAT_MAT4) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mat5")) + { zero_data_test ("zerolen.mat5", SF_FORMAT_MAT5 | SF_FORMAT_PCM_16) ; + filesystem_full_test (SF_FORMAT_MAT5 | SF_FORMAT_PCM_16) ; + permission_test ("readonly.mat5", SF_FORMAT_MAT5) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "pvf")) + { zero_data_test ("zerolen.pvf", SF_FORMAT_PVF | SF_FORMAT_PCM_16) ; + filesystem_full_test (SF_FORMAT_PVF | SF_FORMAT_PCM_16) ; + permission_test ("readonly.pvf", SF_FORMAT_PVF) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "htk")) + { zero_data_test ("zerolen.htk", SF_FORMAT_HTK | SF_FORMAT_PCM_16) ; + filesystem_full_test (SF_FORMAT_HTK | SF_FORMAT_PCM_16) ; + permission_test ("readonly.htk", SF_FORMAT_HTK) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "avr")) + { zero_data_test ("zerolen.avr", SF_FORMAT_AVR | SF_FORMAT_PCM_16) ; + filesystem_full_test (SF_FORMAT_AVR | SF_FORMAT_PCM_16) ; + permission_test ("readonly.avr", SF_FORMAT_AVR) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "sds")) + { zero_data_test ("zerolen.sds", SF_FORMAT_SDS | SF_FORMAT_PCM_16) ; + filesystem_full_test (SF_FORMAT_SDS | SF_FORMAT_PCM_16) ; + permission_test ("readonly.sds", SF_FORMAT_SDS) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mpc2k")) + { zero_data_test ("zerolen.mpc", SF_FORMAT_MPC2K | SF_FORMAT_PCM_16) ; + filesystem_full_test (SF_FORMAT_MPC2K | SF_FORMAT_PCM_16) ; + permission_test ("readonly.mpc", SF_FORMAT_MPC2K) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "ogg")) + { zero_data_test ("zerolen.oga", SF_FORMAT_OGG | SF_FORMAT_VORBIS) ; + /*-filesystem_full_test (SF_FORMAT_OGG | SF_FORMAT_VORBIS) ;-*/ + permission_test ("readonly.oga", SF_FORMAT_OGG) ; + test_count++ ; + } ; + + if (test_count == 0) + { printf ("Mono : ************************************\n") ; + printf ("Mono : * No '%s' test defined.\n", argv [1]) ; + printf ("Mono : ************************************\n") ; + return 1 ; + } ; + + return 0 ; +} /* main */ + + +/*============================================================================================ +** Here are the test functions. +*/ + +static void +zero_data_test (const char *filename, int format) +{ SNDFILE *file ; + SF_INFO sfinfo ; + + switch (format & SF_FORMAT_TYPEMASK) + { case SF_FORMAT_OGG : + if (HAVE_EXTERNAL_XIPH_LIBS == 0) + return ; + break ; + default : + break ; + } ; + + print_test_name ("zero_data_test", filename) ; + + sfinfo.samplerate = 44100 ; + sfinfo.format = format ; + sfinfo.channels = 1 ; + sfinfo.frames = 0 ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + sf_close (file) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + sf_close (file) ; + + unlink (filename) ; + puts ("ok") ; +} /* zero_data_test */ + +static void +filesystem_full_test (int format) +{ +#if (defined (WIN32) || defined (_WIN32)) + (void) format ; + /* Can't run this test on Win32 so return. */ + return ; +#else + SNDFILE *file ; + SF_INFO sfinfo ; + struct stat buf ; + + const char *filename = "/dev/full", *errorstr ; + + /* Make sure errno is zero before doing anything else. */ + errno = 0 ; + + print_test_name ("filesystem_full_test", filename) ; + + if (stat (filename, &buf) != 0) + { puts ("/dev/full missing") ; + return ; + } ; + + if (S_ISCHR (buf.st_mode) == 0 && S_ISBLK (buf.st_mode) == 0) + { puts ("/dev/full is not a device file") ; + return ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.format = format ; + sfinfo.channels = 1 ; + sfinfo.frames = 0 ; + + if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) != NULL) + { printf ("\n\nLine %d : Error, file should not have openned.\n", __LINE__ - 1) ; + exit (1) ; + } ; + + errorstr = sf_strerror (file) ; + + if (strstr (errorstr, " space ") == NULL || strstr (errorstr, "device") == NULL) + { printf ("\n\nLine %d : Error bad error string : %s.\n", __LINE__ - 1, errorstr) ; + exit (1) ; + } ; + + puts ("ok") ; +#endif +} /* filesystem_full_test */ + +static void +permission_test (const char *filename, int typemajor) +{ +#if (OS_IS_WIN32) + /* Avoid compiler warnings. */ + (void) filename ; + (void) typemajor ; + + /* Can't run this test on Win32 so return. */ + return ; +#else + + FILE *textfile ; + SNDFILE *file ; + SF_INFO sfinfo ; + const char *errorstr ; + + /* Make sure errno is zero before doing anything else. */ + errno = 0 ; + + if (getuid () == 0) + { /* If running as root bypass this test. + ** Root is allowed to open a readonly file for write. + */ + return ; + } ; + + print_test_name ("permission_test", filename) ; + + if (access (filename, F_OK) == 0) + { chmod (filename, S_IWUSR) ; + unlink (filename) ; + } ; + + if ((textfile = fopen (filename, "w")) == NULL) + { printf ("\n\nLine %d : not able to open text file for write.\n", __LINE__) ; + exit (1) ; + } ; + + fprintf (textfile, "This is a read only file.\n") ; + fclose (textfile) ; + + if (chmod (filename, S_IRUSR | S_IRGRP)) + { printf ("\n\nLine %d : chmod failed", __LINE__) ; + fflush (stdout) ; + perror ("") ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.format = (typemajor | SF_FORMAT_PCM_16) ; + sfinfo.channels = 1 ; + sfinfo.frames = 0 ; + + if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) != NULL) + { printf ("\n\nLine %d : Error, file should not have opened.\n", __LINE__ - 1) ; + exit (1) ; + } ; + + errorstr = sf_strerror (file) ; + + if (strstr (errorstr, "ermission denied") == NULL) + { printf ("\n\nLine %d : Error bad error string : %s.\n", __LINE__ - 1, errorstr) ; + exit (1) ; + } ; + + if (chmod (filename, S_IWUSR | S_IWGRP)) + { printf ("\n\nLine %d : chmod failed", __LINE__) ; + fflush (stdout) ; + perror ("") ; + exit (1) ; + } ; + + unlink (filename) ; + + puts ("ok") ; + +#endif +} /* permission_test */ + +static void +wavex_amb_test (const char *filename) +{ static short buffer [800] ; + SNDFILE *file ; + SF_INFO sfinfo ; + sf_count_t frames ; + + print_test_name (__func__, filename) ; + + sfinfo.samplerate = 44100 ; + sfinfo.format = SF_FORMAT_WAVEX | SF_FORMAT_PCM_16 ; + sfinfo.channels = 4 ; + + frames = ARRAY_LEN (buffer) / sfinfo.channels ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_WAVEX_SET_AMBISONIC, NULL, SF_AMBISONIC_B_FORMAT) ; + test_writef_short_or_die (file, 0, buffer, frames, __LINE__) ; + sf_close (file) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + exit_if_true ( + sf_command (file, SFC_WAVEX_GET_AMBISONIC, NULL, 0) != SF_AMBISONIC_B_FORMAT, + "\n\nLine %d : Error, this file should be in Ambisonic B format.\n", __LINE__ + ) ; + + sf_close (file) ; + + unlink (filename) ; + puts ("ok") ; +} /* wavex_amb_test */ + +static void +rf64_downgrade_test (const char *filename) +{ static short output [BUFFER_LEN] ; + static short input [BUFFER_LEN] ; + + SNDFILE *file ; + SF_INFO sfinfo ; + unsigned k ; + + print_test_name (__func__, filename) ; + + sf_info_clear (&sfinfo) ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = ARRAY_LEN (output) ; + sfinfo.channels = 1 ; + sfinfo.format = SF_FORMAT_RF64 | SF_FORMAT_PCM_16 ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + exit_if_true (sf_command (file, SFC_RF64_AUTO_DOWNGRADE, NULL, SF_FALSE) != SF_FALSE, "\n\nLine %d: sf_command failed.\n", __LINE__) ; + exit_if_true (sf_command (file, SFC_RF64_AUTO_DOWNGRADE, NULL, SF_TRUE) != SF_TRUE, "\n\nLine %d: sf_command failed.\n", __LINE__) ; + + test_write_short_or_die (file, 0, output, ARRAY_LEN (output), __LINE__) ; + + exit_if_true (sf_command (file, SFC_RF64_AUTO_DOWNGRADE, NULL, SF_FALSE) != SF_TRUE, "\n\nLine %d: sf_command failed.\n", __LINE__) ; + exit_if_true (sf_command (file, SFC_RF64_AUTO_DOWNGRADE, NULL, SF_TRUE) != SF_TRUE, "\n\nLine %d: sf_command failed.\n", __LINE__) ; + + sf_close (file) ; + + memset (input, 0, sizeof (input)) ; + sf_info_clear (&sfinfo) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + exit_if_true (sfinfo.format != (SF_FORMAT_WAVEX | SF_FORMAT_PCM_16), "\n\nLine %d: RF64 to WAV downgrade failed.\n", __LINE__) ; + exit_if_true (sfinfo.frames != ARRAY_LEN (output), "\n\nLine %d: Incorrect number of frames in file (too short). (%d should be %d)\n", __LINE__, (int) sfinfo.frames, (int) ARRAY_LEN (output)) ; + exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_short_or_die (file, 0, input, ARRAY_LEN (input), __LINE__) ; + + sf_close (file) ; + + for (k = 0 ; k < ARRAY_LEN (input) ; k++) + exit_if_true (input [k] != output [k], + "\n\nLine: %d: Error on input %d, expected %d, got %d\n", __LINE__, k, output [k], input [k]) ; + + puts ("ok") ; + unlink (filename) ; + + return ; +} /* rf64_downgrade_test */ + +static void +rf64_long_file_downgrade_test (const char *filename) +{ static int output [BUFFER_LEN] ; + static int input [1] = { 0 } ; + + SNDFILE *file ; + SF_INFO sfinfo ; + sf_count_t output_frames = 0 ; + + print_test_name (__func__, filename) ; + + sf_info_clear (&sfinfo) ; + + memset (output, 0, sizeof (output)) ; + output [0] = 0x1020304 ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = ARRAY_LEN (output) ; + sfinfo.channels = 1 ; + sfinfo.format = SF_FORMAT_RF64 | SF_FORMAT_PCM_32 ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + exit_if_true (sf_command (file, SFC_RF64_AUTO_DOWNGRADE, NULL, SF_TRUE) != SF_TRUE, "\n\nLine %d: sf_command failed.\n", __LINE__) ; + + while (output_frames * sizeof (output [0]) < 0x100000000) + { test_write_int_or_die (file, 0, output, ARRAY_LEN (output), __LINE__) ; + output_frames += ARRAY_LEN (output) ; + } ; + + sf_close (file) ; + + sf_info_clear (&sfinfo) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + exit_if_true (sfinfo.format != (SF_FORMAT_RF64 | SF_FORMAT_PCM_32), "\n\nLine %d: RF64 to WAV downgrade should have failed.\n", __LINE__) ; + exit_if_true (sfinfo.channels != 1, "\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit_if_true (sfinfo.frames != output_frames, "\n\nLine %d: Incorrect number of frames in file (%d should be %d).\n", __LINE__, (int) sfinfo.frames, (int) output_frames) ; + + /* Check that the first sample read is the same as the first written. */ + test_read_int_or_die (file, 0, input, ARRAY_LEN (input), __LINE__) ; + exit_if_true (input [0] != output [0], "\n\nLine %d: Bad first sample (0x%08x).\n", __LINE__, input [0]) ; + + check_log_buffer_or_die (file, __LINE__) ; + + sf_close (file) ; + + puts ("ok") ; + unlink (filename) ; + + return ; +} /* rf64_long_file_downgrade_test */ diff --git a/libsndfile-1.0.31/tests/multi_file_test.c b/libsndfile-1.0.31/tests/multi_file_test.c new file mode 100644 index 0000000..502d15a --- /dev/null +++ b/libsndfile-1.0.31/tests/multi_file_test.c @@ -0,0 +1,238 @@ +/* +** Copyright (C) 1999-2012 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#endif + +#if (HAVE_DECL_S_IRGRP == 0) +#include +#endif + +#include +#include +#include + +#include + +#include "utils.h" + +#define DATA_LENGTH (512) + +static void write_file_at_end (int fd, int filetype, int channels, int file_num) ; + +static void multi_file_test (const char *filename, int *formats, int format_count) ; + +static short data [DATA_LENGTH] ; + +static int wav_formats [] = +{ SF_FORMAT_WAV | SF_FORMAT_PCM_16, + SF_FORMAT_WAV | SF_FORMAT_PCM_24, + SF_FORMAT_WAV | SF_FORMAT_ULAW, + SF_FORMAT_WAV | SF_FORMAT_ALAW, + /* Lite remove start */ + SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, + SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, + /* Lite remove end */ + /*-SF_FORMAT_WAV | SF_FORMAT_GSM610 Doesn't work yet. -*/ +} ; + +static int aiff_formats [] = +{ SF_FORMAT_AIFF | SF_FORMAT_PCM_16, + SF_FORMAT_AIFF | SF_FORMAT_PCM_24, + SF_FORMAT_AIFF | SF_FORMAT_ULAW, + SF_FORMAT_AIFF | SF_FORMAT_ALAW +} ; + +static int au_formats [] = +{ SF_FORMAT_AU | SF_FORMAT_PCM_16, + SF_FORMAT_AU | SF_FORMAT_PCM_24, + SF_FORMAT_AU | SF_FORMAT_ULAW, + SF_FORMAT_AU | SF_FORMAT_ALAW +} ; + +static int verbose = SF_FALSE ; + +int +main (int argc, char **argv) +{ int do_all = 0 ; + int test_count = 0 ; + + if (argc == 3 && strcmp (argv [2], "-v") == 0) + { verbose = SF_TRUE ; + argc -- ; + } ; + + if (argc != 2) + { printf ("Usage : %s \n", argv [0]) ; + printf (" Where is one of the following:\n") ; + printf (" wav - test WAV file functions (little endian)\n") ; + printf (" aiff - test AIFF file functions (big endian)\n") ; + printf (" au - test AU file functions\n") ; +#if 0 + printf (" svx - test 8SVX/16SV file functions\n") ; + printf (" nist - test NIST Sphere file functions\n") ; + printf (" ircam - test IRCAM file functions\n") ; + printf (" voc - Create Voice file functions\n") ; + printf (" w64 - Sonic Foundry's W64 file functions\n") ; +#endif + printf (" all - perform all tests\n") ; + exit (1) ; + } ; + + do_all = !strcmp (argv [1], "all") ; + + if (do_all || ! strcmp (argv [1], "wav")) + { multi_file_test ("multi_wav.dat", wav_formats, ARRAY_LEN (wav_formats)) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "aiff")) + { multi_file_test ("multi_aiff.dat", aiff_formats, ARRAY_LEN (aiff_formats)) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "au")) + { multi_file_test ("multi_au.dat", au_formats, ARRAY_LEN (au_formats)) ; + test_count++ ; + } ; + + return 0 ; +} /* main */ + +/*====================================================================================== +*/ + +static void +multi_file_test (const char *filename, int *formats, int format_count) +{ SNDFILE *sndfile ; + SF_INFO sfinfo ; + SF_EMBED_FILE_INFO embed_info ; + sf_count_t filelen ; + int fd, k, file_count = 0 ; + + print_test_name ("multi_file_test", filename) ; + + unlink (filename) ; + + if ((fd = open (filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) < 0) + { printf ("\n\nLine %d: open failed : %s\n", __LINE__, strerror (errno)) ; + exit (1) ; + } ; + + k = write (fd, "1234", 4) ; + + for (k = 0 ; k < format_count ; k++) + write_file_at_end (fd, formats [k], 2, k) ; + + filelen = file_length_fd (fd) ; + + embed_info.offset = 4 ; + embed_info.length = 0 ; + + + for (file_count = 1 ; embed_info.offset + embed_info.length < filelen ; file_count ++) + { + if (verbose) + { puts ("\n------------------------------------") ; + printf ("This offset : %" PRId64 "\n", embed_info.offset + embed_info.length) ; + } ; + + if (lseek (fd, embed_info.offset + embed_info.length, SEEK_SET) < 0) + { printf ("\n\nLine %d: lseek failed : %s\n", __LINE__, strerror (errno)) ; + exit (1) ; + } ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + if ((sndfile = sf_open_fd (fd, SFM_READ, &sfinfo, SF_FALSE)) == NULL) + { printf ("\n\nLine %d: sf_open_fd failed\n", __LINE__) ; + printf ("Embedded file number : %d offset : %" PRId64 "\n", file_count, embed_info.offset) ; + puts (sf_strerror (sndfile)) ; + dump_log_buffer (sndfile) ; + exit (1) ; + } ; + + sf_command (sndfile, SFC_GET_EMBED_FILE_INFO, &embed_info, sizeof (embed_info)) ; + + sf_close (sndfile) ; + + if (verbose) + printf ("\nNext offset : %" PRId64 "\nNext length : %" PRId64 "\n", embed_info.offset, embed_info.length) ; + } ; + + file_count -- ; + + if (file_count != format_count) + { printf ("\n\nLine %d: file count (%d) not equal to %d.\n\n", __LINE__, file_count, format_count) ; + printf ("Embedded file number : %d\n", file_count) ; + exit (1) ; + } ; + + close (fd) ; + unlink (filename) ; + printf ("ok\n") ; + + return ; +} /* multi_file_test */ + +/*====================================================================================== +*/ + +static void +write_file_at_end (int fd, int filetype, int channels, int file_num) +{ SNDFILE *sndfile ; + SF_INFO sfinfo ; + + int frames, k ; + + lseek (fd, 0, SEEK_END) ; + + for (k = 0 ; k < DATA_LENGTH ; k++) + data [k] = k ; + + frames = DATA_LENGTH / channels ; + + sfinfo.format = filetype ; + sfinfo.channels = channels ; + sfinfo.samplerate = 44100 ; + + if ((sndfile = sf_open_fd (fd, SFM_WRITE, &sfinfo, SF_FALSE)) == NULL) + { printf ("\n\nLine %d: sf_open_fd failed\n", __LINE__) ; + printf ("Embedded file number : %d\n", file_num) ; + puts (sf_strerror (sndfile)) ; + dump_log_buffer (sndfile) ; + exit (1) ; + } ; + + if (sf_writef_short (sndfile, data, frames) != frames) + { printf ("\n\nLine %d: short write\n", __LINE__) ; + printf ("Embedded file number : %d\n", file_num) ; + exit (1) ; + } ; + + sf_close (sndfile) ; +} /* write_file_at_end */ + diff --git a/libsndfile-1.0.31/tests/ogg_opus_test.c b/libsndfile-1.0.31/tests/ogg_opus_test.c new file mode 100644 index 0000000..37532be --- /dev/null +++ b/libsndfile-1.0.31/tests/ogg_opus_test.c @@ -0,0 +1,424 @@ +/* +** Copyright (C) 2007-2018 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include +#include +#include + +#include "utils.h" + +#define SAMPLE_RATE 48000 +#define DATA_LENGTH (SAMPLE_RATE / 8) + +typedef union +{ double d [DATA_LENGTH] ; + float f [DATA_LENGTH] ; + int i [DATA_LENGTH] ; + short s [DATA_LENGTH] ; +} BUFFER ; + +static BUFFER data_out ; +static BUFFER data_in ; + +static void +ogg_opus_short_test (void) +{ const char * filename = "ogg_opus_short.opus" ; + + SNDFILE * file ; + SF_INFO sfinfo ; + short seek_data [10] ; + unsigned k ; + + print_test_name ("ogg_opus_short_test", filename) ; + + /* Generate float data. */ + gen_windowed_sine_float (data_out.f, ARRAY_LEN (data_out.f), 1.0 * 0x7F00) ; + + /* Convert to short. */ + for (k = 0 ; k < ARRAY_LEN (data_out.s) ; k++) + data_out.s [k] = lrintf (data_out.f [k]) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + /* Set up output file type. */ + sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_OPUS ; + sfinfo.channels = 1 ; + sfinfo.samplerate = SAMPLE_RATE ; + + /* Write the output file. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + test_write_short_or_die (file, 0, data_out.s, ARRAY_LEN (data_out.s), __LINE__) ; + sf_close (file) ; + + /* Read the file in again. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + test_read_short_or_die (file, 0, data_in.s, ARRAY_LEN (data_in.s), __LINE__) ; + sf_close (file) ; + + puts ("ok") ; + + /* Test seeking. */ + print_test_name ("ogg_opus_seek_test", filename) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + test_read_short_or_die (file, 0, seek_data, ARRAY_LEN (seek_data), __LINE__) ; + compare_short_or_die (seek_data, data_in.s + 10, ARRAY_LEN (seek_data), __LINE__) ; + + /* Test seek to end of file. */ + test_seek_or_die (file, 0, SEEK_END, sfinfo.frames, sfinfo.channels, __LINE__) ; + + sf_close (file) ; + + puts ("ok") ; + + unlink (filename) ; +} /* ogg_opus_short_test */ + +static void +ogg_opus_int_test (void) +{ const char * filename = "ogg_opus_int.opus" ; + + SNDFILE * file ; + SF_INFO sfinfo ; + int seek_data [10] ; + unsigned k ; + + print_test_name ("ogg_opus_int_test", filename) ; + + /* Generate float data. */ + gen_windowed_sine_float (data_out.f, ARRAY_LEN (data_out.f), 1.0 * 0x7FFF0000) ; + + /* Convert to integer. */ + for (k = 0 ; k < ARRAY_LEN (data_out.i) ; k++) + data_out.i [k] = lrintf (data_out.f [k]) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + /* Set up output file type. */ + sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_OPUS ; + sfinfo.channels = 1 ; + sfinfo.samplerate = SAMPLE_RATE ; + + /* Write the output file. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + test_write_int_or_die (file, 0, data_out.i, ARRAY_LEN (data_out.i), __LINE__) ; + sf_close (file) ; + + /* Read the file in again. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + test_read_int_or_die (file, 0, data_in.i, ARRAY_LEN (data_in.i), __LINE__) ; + sf_close (file) ; + + puts ("ok") ; + + /* Test seeking. */ + print_test_name ("ogg_opus_seek_test", filename) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + test_read_int_or_die (file, 0, seek_data, ARRAY_LEN (seek_data), __LINE__) ; + compare_int_or_die (seek_data, data_in.i + 10, ARRAY_LEN (seek_data), __LINE__) ; + + sf_close (file) ; + + puts ("ok") ; + + unlink (filename) ; +} /* ogg_opus_int_test */ + +static void +ogg_opus_float_test (void) +{ const char * filename = "ogg_opus_float.opus" ; + + SNDFILE * file ; + SF_INFO sfinfo ; + float seek_data [10] ; + + print_test_name ("ogg_opus_float_test", filename) ; + + gen_windowed_sine_float (data_out.f, ARRAY_LEN (data_out.f), 0.95) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + /* Set up output file type. */ + sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_OPUS ; + sfinfo.channels = 1 ; + sfinfo.samplerate = SAMPLE_RATE ; + + /* Write the output file. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + test_write_float_or_die (file, 0, data_out.f, ARRAY_LEN (data_out.f), __LINE__) ; + sf_close (file) ; + + /* Read the file in again. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + test_read_float_or_die (file, 0, data_in.f, ARRAY_LEN (data_in.f), __LINE__) ; + sf_close (file) ; + + puts ("ok") ; + + /* Test seeking. */ + print_test_name ("ogg_opus_seek_test", filename) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + test_read_float_or_die (file, 0, seek_data, ARRAY_LEN (seek_data), __LINE__) ; + compare_float_or_die (seek_data, data_in.f + 10, ARRAY_LEN (seek_data), __LINE__) ; + + sf_close (file) ; + + puts ("ok") ; + + unlink (filename) ; +} /* ogg_opus_float_test */ + +static void +ogg_opus_double_test (void) +{ const char * filename = "ogg_opus_double.opus" ; + + SNDFILE * file ; + SF_INFO sfinfo ; + double seek_data [10] ; + + print_test_name ("ogg_opus_double_test", filename) ; + + gen_windowed_sine_double (data_out.d, ARRAY_LEN (data_out.d), 0.95) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + /* Set up output file type. */ + sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_OPUS ; + sfinfo.channels = 1 ; + sfinfo.samplerate = SAMPLE_RATE ; + + /* Write the output file. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + test_write_double_or_die (file, 0, data_out.d, ARRAY_LEN (data_out.d), __LINE__) ; + sf_close (file) ; + + /* Read the file in again. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + test_read_double_or_die (file, 0, data_in.d, ARRAY_LEN (data_in.d), __LINE__) ; + sf_close (file) ; + + puts ("ok") ; + + /* Test seeking. */ + print_test_name ("ogg_opus_seek_test", filename) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + test_read_double_or_die (file, 0, seek_data, ARRAY_LEN (seek_data), __LINE__) ; + compare_double_or_die (seek_data, data_in.d + 10, ARRAY_LEN (seek_data), __LINE__) ; + + sf_close (file) ; + + puts ("ok") ; + + unlink (filename) ; +} /* ogg_opus_double_test */ + + +static void +ogg_opus_stereo_seek_test (const char * filename, int format) +{ static float data [SAMPLE_RATE] ; + static float stereo_out [SAMPLE_RATE * 2] ; + + SNDFILE * file ; + SF_INFO sfinfo ; + sf_count_t pos ; + unsigned k ; + + print_test_name (__func__, filename) ; + + gen_windowed_sine_float (data, ARRAY_LEN (data), 0.95) ; + for (k = 0 ; k < ARRAY_LEN (data) ; k++) + { stereo_out [2 * k] = data [k] ; + stereo_out [2 * k + 1] = data [ARRAY_LEN (data) - k - 1] ; + } ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + /* Set up output file type. */ + sfinfo.format = format ; + sfinfo.channels = 2 ; + sfinfo.samplerate = SAMPLE_RATE ; + + /* Write the output file. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + test_write_float_or_die (file, 0, stereo_out, ARRAY_LEN (stereo_out), __LINE__) ; + sf_close (file) ; + + /* Open file in again for reading. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + /* Read in the whole file. */ + test_read_float_or_die (file, 0, stereo_out, ARRAY_LEN (stereo_out), __LINE__) ; + + /* Now hammer seeking code. */ + test_seek_or_die (file, 234, SEEK_SET, 234, sfinfo.channels, __LINE__) ; + test_readf_float_or_die (file, 0, data, 10, __LINE__) ; + compare_float_or_die (data, stereo_out + (234 * sfinfo.channels), 10, __LINE__) ; + + test_seek_or_die (file, 442, SEEK_SET, 442, sfinfo.channels, __LINE__) ; + test_readf_float_or_die (file, 0, data, 10, __LINE__) ; + compare_float_or_die (data, stereo_out + (442 * sfinfo.channels), 10, __LINE__) ; + + test_seek_or_die (file, 12, SEEK_CUR, 442 + 10 + 12, sfinfo.channels, __LINE__) ; + test_readf_float_or_die (file, 0, data, 10, __LINE__) ; + compare_float_or_die (data, stereo_out + ((442 + 10 + 12) * sfinfo.channels), 10, __LINE__) ; + + test_seek_or_die (file, 12, SEEK_CUR, 442 + 20 + 24, sfinfo.channels, __LINE__) ; + test_readf_float_or_die (file, 0, data, 10, __LINE__) ; + compare_float_or_die (data, stereo_out + ((442 + 20 + 24) * sfinfo.channels), 10, __LINE__) ; + + pos = 500 - sfinfo.frames ; + test_seek_or_die (file, pos, SEEK_END, 500, sfinfo.channels, __LINE__) ; + test_readf_float_or_die (file, 0, data, 10, __LINE__) ; + compare_float_or_die (data, stereo_out + (500 * sfinfo.channels), 10, __LINE__) ; + + pos = 10 - sfinfo.frames ; + test_seek_or_die (file, pos, SEEK_END, 10, sfinfo.channels, __LINE__) ; + test_readf_float_or_die (file, 0, data, 10, __LINE__) ; + compare_float_or_die (data, stereo_out + (10 * sfinfo.channels), 10, __LINE__) ; + + sf_close (file) ; + + puts ("ok") ; + unlink (filename) ; +} /* ogg_opus_stereo_seek_test */ + + +static void +ogg_opus_original_samplerate_test (void) +{ const char * filename = "ogg_opus_original_samplerate.opus" ; + + SNDFILE * file ; + SF_INFO sfinfo ; + int original_samplerate = 54321 ; + sf_count_t frames ; + + print_test_name ("ogg_opus_original_samplerate_test", filename) ; + + gen_windowed_sine_double (data_out.d, ARRAY_LEN (data_out.d), 0.95) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + /* Set up output file type. */ + sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_OPUS ; + sfinfo.channels = 1 ; + sfinfo.samplerate = SAMPLE_RATE ; + + /* Write the output file. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + if (sf_command (file, SFC_SET_ORIGINAL_SAMPLERATE, &original_samplerate, sizeof (original_samplerate)) != SF_TRUE) + { printf ("\nCommand SFC_SET_ORIGINAL_SAMPLERATE failed!\n") ; + exit (1) ; + } ; + test_write_double_or_die (file, 0, data_out.d, ARRAY_LEN (data_out.d), __LINE__) ; + if (sf_command (file, SFC_SET_ORIGINAL_SAMPLERATE, &original_samplerate, sizeof (original_samplerate)) != SF_FALSE) + { printf ("\nCommand SFC_SET_ORIGINAL_SAMPLERATE succeeded when it should have failed!") ; + exit (1) ; + } ; + sf_close (file) ; + + /* Read the file in again. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + original_samplerate = 0 ; + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + if (sf_command (file, SFC_GET_ORIGINAL_SAMPLERATE, &original_samplerate, sizeof (original_samplerate)) != SF_TRUE + || original_samplerate != 54321) + { printf ("\nCommand SFC_GET_ORIGINAL_SAMPLERATE failed!\n") ; + exit (1) ; + } ; + test_read_double_or_die (file, 0, data_in.d, 8, __LINE__) ; + if (sf_command (file, SFC_SET_ORIGINAL_SAMPLERATE, &original_samplerate, sizeof (original_samplerate)) == SF_TRUE) + { printf ("\nCommand SFC_SET_ORIGINAL_SAMPLERATE succeeded when it should have failed!\n") ; + exit (1) ; + } ; + sf_close (file) ; + + /* Test changing the decoder. */ + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + frames = sfinfo.frames ; + original_samplerate = 16000 ; + if (sf_command (file, SFC_SET_ORIGINAL_SAMPLERATE, &original_samplerate, sizeof (original_samplerate)) != SF_TRUE) + { printf ("\nCommand SFC_SET_ORIGINAL_SAMPLERATE failed!\n") ; + exit (1) ; + } ; + if (sf_command (file, SFC_GET_CURRENT_SF_INFO, &sfinfo, sizeof (sfinfo))) + { printf ("\nCommand SFC_GET_CURRENT_SF_INFO failed!\n") ; + exit (1) ; + } ; + if (frames / (48000 / 16000) != sfinfo.frames) + { printf ("\nIncorrect frame count! (%" PRId64 " vs %" PRId64")\n", frames / (48000 / 16000), sfinfo.frames) ; + exit (1) ; + } ; + test_read_double_or_die (file, 0, data_out.d, sfinfo.frames, __LINE__) ; + + sf_close (file) ; + + puts ("ok") ; + + unlink (filename) ; +} /* ogg_opus_original_samplerate_test */ + + +int +main (void) +{ + if (HAVE_EXTERNAL_XIPH_LIBS) + { ogg_opus_short_test () ; + ogg_opus_int_test () ; + ogg_opus_float_test () ; + ogg_opus_double_test () ; + + ogg_opus_stereo_seek_test ("ogg_opus_seek.opus", SF_FORMAT_OGG | SF_FORMAT_OPUS) ; + ogg_opus_original_samplerate_test () ; + } + else + puts (" No Ogg/Opus tests because Ogg/Opus support was not compiled in.") ; + + return 0 ; +} /* main */ diff --git a/libsndfile-1.0.31/tests/ogg_test.c b/libsndfile-1.0.31/tests/ogg_test.c new file mode 100644 index 0000000..ba3d899 --- /dev/null +++ b/libsndfile-1.0.31/tests/ogg_test.c @@ -0,0 +1,348 @@ +/* +** Copyright (C) 2007-2016 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include + +#include "utils.h" + +#define SAMPLE_RATE 44100 +#define DATA_LENGTH (SAMPLE_RATE / 8) + +typedef union +{ double d [DATA_LENGTH] ; + float f [DATA_LENGTH] ; + int i [DATA_LENGTH] ; + short s [DATA_LENGTH] ; +} BUFFER ; + +static BUFFER data_out ; +static BUFFER data_in ; + +static void +ogg_short_test (void) +{ const char * filename = "vorbis_short.oga" ; + + SNDFILE * file ; + SF_INFO sfinfo ; + short seek_data [10] ; + unsigned k ; + + print_test_name ("ogg_short_test", filename) ; + + /* Generate float data. */ + gen_windowed_sine_float (data_out.f, ARRAY_LEN (data_out.f), 1.0 * 0x7F00) ; + + /* Convert to shorteger. */ + for (k = 0 ; k < ARRAY_LEN (data_out.s) ; k++) + data_out.s [k] = lrintf (data_out.f [k]) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + /* Set up output file type. */ + sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ; + sfinfo.channels = 1 ; + sfinfo.samplerate = SAMPLE_RATE ; + + /* Write the output file. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + test_write_short_or_die (file, 0, data_out.s, ARRAY_LEN (data_out.s), __LINE__) ; + sf_close (file) ; + + /* Read the file in again. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + test_read_short_or_die (file, 0, data_in.s, ARRAY_LEN (data_in.s), __LINE__) ; + sf_close (file) ; + + puts ("ok") ; + + /* Test seeking. */ + print_test_name ("ogg_seek_test", filename) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + test_read_short_or_die (file, 0, seek_data, ARRAY_LEN (seek_data), __LINE__) ; + compare_short_or_die (seek_data, data_in.s + 10, ARRAY_LEN (seek_data), __LINE__) ; + + /* Test seek to end of file. */ + test_seek_or_die (file, 0, SEEK_END, sfinfo.frames, sfinfo.channels, __LINE__) ; + + sf_close (file) ; + + puts ("ok") ; + + unlink (filename) ; +} /* ogg_short_test */ + +static void +ogg_int_test (void) +{ const char * filename = "vorbis_int.oga" ; + + SNDFILE * file ; + SF_INFO sfinfo ; + int seek_data [10] ; + unsigned k ; + + print_test_name ("ogg_int_test", filename) ; + + /* Generate float data. */ + gen_windowed_sine_float (data_out.f, ARRAY_LEN (data_out.f), 1.0 * 0x7FFF0000) ; + + /* Convert to integer. */ + for (k = 0 ; k < ARRAY_LEN (data_out.i) ; k++) + data_out.i [k] = lrintf (data_out.f [k]) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + /* Set up output file type. */ + sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ; + sfinfo.channels = 1 ; + sfinfo.samplerate = SAMPLE_RATE ; + + /* Write the output file. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + test_write_int_or_die (file, 0, data_out.i, ARRAY_LEN (data_out.i), __LINE__) ; + sf_close (file) ; + + /* Read the file in again. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + test_read_int_or_die (file, 0, data_in.i, ARRAY_LEN (data_in.i), __LINE__) ; + sf_close (file) ; + + puts ("ok") ; + + /* Test seeking. */ + print_test_name ("ogg_seek_test", filename) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + test_read_int_or_die (file, 0, seek_data, ARRAY_LEN (seek_data), __LINE__) ; + compare_int_or_die (seek_data, data_in.i + 10, ARRAY_LEN (seek_data), __LINE__) ; + + sf_close (file) ; + + puts ("ok") ; + + unlink (filename) ; +} /* ogg_int_test */ + +static void +ogg_float_test (void) +{ const char * filename = "vorbis_float.oga" ; + + SNDFILE * file ; + SF_INFO sfinfo ; + float seek_data [10] ; + + print_test_name ("ogg_float_test", filename) ; + + gen_windowed_sine_float (data_out.f, ARRAY_LEN (data_out.f), 0.95) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + /* Set up output file type. */ + sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ; + sfinfo.channels = 1 ; + sfinfo.samplerate = SAMPLE_RATE ; + + /* Write the output file. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + test_write_float_or_die (file, 0, data_out.f, ARRAY_LEN (data_out.f), __LINE__) ; + sf_close (file) ; + + /* Read the file in again. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + test_read_float_or_die (file, 0, data_in.f, ARRAY_LEN (data_in.f), __LINE__) ; + sf_close (file) ; + + puts ("ok") ; + + /* Test seeking. */ + print_test_name ("ogg_seek_test", filename) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + test_read_float_or_die (file, 0, seek_data, ARRAY_LEN (seek_data), __LINE__) ; + compare_float_or_die (seek_data, data_in.f + 10, ARRAY_LEN (seek_data), __LINE__) ; + + sf_close (file) ; + + puts ("ok") ; + + unlink (filename) ; +} /* ogg_float_test */ + +static void +ogg_double_test (void) +{ const char * filename = "vorbis_double.oga" ; + + SNDFILE * file ; + SF_INFO sfinfo ; + double seek_data [10] ; + + print_test_name ("ogg_double_test", filename) ; + + gen_windowed_sine_double (data_out.d, ARRAY_LEN (data_out.d), 0.95) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + /* Set up output file type. */ + sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ; + sfinfo.channels = 1 ; + sfinfo.samplerate = SAMPLE_RATE ; + + /* Write the output file. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + test_write_double_or_die (file, 0, data_out.d, ARRAY_LEN (data_out.d), __LINE__) ; + sf_close (file) ; + + /* Read the file in again. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + test_read_double_or_die (file, 0, data_in.d, ARRAY_LEN (data_in.d), __LINE__) ; + sf_close (file) ; + + puts ("ok") ; + + /* Test seeking. */ + print_test_name ("ogg_seek_test", filename) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + test_read_double_or_die (file, 0, seek_data, ARRAY_LEN (seek_data), __LINE__) ; + compare_double_or_die (seek_data, data_in.d + 10, ARRAY_LEN (seek_data), __LINE__) ; + + sf_close (file) ; + + puts ("ok") ; + + unlink (filename) ; +} /* ogg_double_test */ + + +static void +ogg_stereo_seek_test (const char * filename, int format) +{ static float data [SAMPLE_RATE] ; + static float stereo_out [SAMPLE_RATE * 2] ; + + SNDFILE * file ; + SF_INFO sfinfo ; + sf_count_t pos ; + unsigned k ; + + print_test_name (__func__, filename) ; + + gen_windowed_sine_float (data, ARRAY_LEN (data), 0.95) ; + for (k = 0 ; k < ARRAY_LEN (data) ; k++) + { stereo_out [2 * k] = data [k] ; + stereo_out [2 * k + 1] = data [ARRAY_LEN (data) - k - 1] ; + } ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + /* Set up output file type. */ + sfinfo.format = format ; + sfinfo.channels = 2 ; + sfinfo.samplerate = SAMPLE_RATE ; + + /* Write the output file. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + test_write_float_or_die (file, 0, stereo_out, ARRAY_LEN (stereo_out), __LINE__) ; + sf_close (file) ; + + /* Open file in again for reading. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + /* Read in the whole file. */ + test_read_float_or_die (file, 0, stereo_out, ARRAY_LEN (stereo_out), __LINE__) ; + + /* Now hammer seeking code. */ + test_seek_or_die (file, 234, SEEK_SET, 234, sfinfo.channels, __LINE__) ; + test_readf_float_or_die (file, 0, data, 10, __LINE__) ; + compare_float_or_die (data, stereo_out + (234 * sfinfo.channels), 10, __LINE__) ; + + test_seek_or_die (file, 442, SEEK_SET, 442, sfinfo.channels, __LINE__) ; + test_readf_float_or_die (file, 0, data, 10, __LINE__) ; + compare_float_or_die (data, stereo_out + (442 * sfinfo.channels), 10, __LINE__) ; + + test_seek_or_die (file, 12, SEEK_CUR, 442 + 10 + 12, sfinfo.channels, __LINE__) ; + test_readf_float_or_die (file, 0, data, 10, __LINE__) ; + compare_float_or_die (data, stereo_out + ((442 + 10 + 12) * sfinfo.channels), 10, __LINE__) ; + + test_seek_or_die (file, 12, SEEK_CUR, 442 + 20 + 24, sfinfo.channels, __LINE__) ; + test_readf_float_or_die (file, 0, data, 10, __LINE__) ; + compare_float_or_die (data, stereo_out + ((442 + 20 + 24) * sfinfo.channels), 10, __LINE__) ; + + pos = 500 - sfinfo.frames ; + test_seek_or_die (file, pos, SEEK_END, 500, sfinfo.channels, __LINE__) ; + test_readf_float_or_die (file, 0, data, 10, __LINE__) ; + compare_float_or_die (data, stereo_out + (500 * sfinfo.channels), 10, __LINE__) ; + + pos = 10 - sfinfo.frames ; + test_seek_or_die (file, pos, SEEK_END, 10, sfinfo.channels, __LINE__) ; + test_readf_float_or_die (file, 0, data, 10, __LINE__) ; + compare_float_or_die (data, stereo_out + (10 * sfinfo.channels), 10, __LINE__) ; + + sf_close (file) ; + + puts ("ok") ; + unlink (filename) ; +} /* ogg_stereo_seek_test */ + + +int +main (void) +{ + if (HAVE_EXTERNAL_XIPH_LIBS) + { ogg_short_test () ; + ogg_int_test () ; + ogg_float_test () ; + ogg_double_test () ; + + /*-ogg_stereo_seek_test ("pcm.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;-*/ + ogg_stereo_seek_test ("vorbis_seek.ogg", SF_FORMAT_OGG | SF_FORMAT_VORBIS) ; + } + else + puts (" No Ogg/Vorbis tests because Ogg/Vorbis support was not compiled in.") ; + + return 0 ; +} /* main */ diff --git a/libsndfile-1.0.31/tests/pcm_test.c b/libsndfile-1.0.31/tests/pcm_test.c new file mode 100644 index 0000000..04947f8 --- /dev/null +++ b/libsndfile-1.0.31/tests/pcm_test.c @@ -0,0 +1,1715 @@ +/* +** Copyright (C) 1999-2013 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "utils.h" + +#define BUFFER_SIZE (1 << 12) + +static void lrintf_test (void) ; + +static void pcm_test_bits_8 (const char *filename, int filetype, uint64_t hash) ; +static void pcm_test_bits_16 (const char *filename, int filetype, uint64_t hash) ; +static void pcm_test_bits_24 (const char *filename, int filetype, uint64_t hash) ; +static void pcm_test_bits_32 (const char *filename, int filetype, uint64_t hash) ; + +static void pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_float) ; +static void pcm_test_double (const char *filename, int filetype, uint64_t hash, int replace_float) ; + +typedef union +{ double d [BUFFER_SIZE + 1] ; + float f [BUFFER_SIZE + 1] ; + int i [BUFFER_SIZE + 1] ; + short s [BUFFER_SIZE + 1] ; +} BUFFER ; + +/* Data written to the file. */ +static BUFFER data_out ; + +/* Data read back from the file. */ +static BUFFER data_in ; + +int +main (void) +{ + lrintf_test () ; + + pcm_test_bits_8 ("pcm-s8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_S8, 0xa335091249dbfLL) ; + pcm_test_bits_8 ("pcm-u8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_U8, 0x48c433d695f3fLL) ; + + pcm_test_bits_16 ("le-pcm16.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0xb956c881ebf08LL) ; + pcm_test_bits_16 ("be-pcm16.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0x2f840c55750f8LL) ; + + pcm_test_bits_24 ("le-pcm24.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0xb6a759ab496f8LL) ; + pcm_test_bits_24 ("be-pcm24.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0xf3eaf9c30b6f8LL) ; + + pcm_test_bits_32 ("le-pcm32.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0xaece1c1c17f08LL) ; + pcm_test_bits_32 ("be-pcm32.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0x9ddf142d0b0f8LL) ; + + /* Lite remove start */ + pcm_test_float ("le-float.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xad04f7554267aLL, SF_FALSE) ; + pcm_test_float ("be-float.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xde3e248fa9186LL, SF_FALSE) ; + + pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x2726f958f669cLL, SF_FALSE) ; + pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x3583f8ee51164LL, SF_FALSE) ; + + pcm_test_float ("le-float.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xad04f7554267aLL, SF_TRUE) ; + pcm_test_float ("be-float.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xde3e248fa9186LL, SF_TRUE) ; + + pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x2726f958f669cLL, SF_TRUE) ; + pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x3583f8ee51164LL, SF_TRUE) ; + /* Lite remove end */ + + return 0 ; +} /* main */ + +/*============================================================================================ +** Here are the test functions. +*/ + +static void +lrintf_test (void) +{ int k, items ; + float *float_data ; + int *int_data ; + + print_test_name ("lrintf_test", "") ; + + items = 1024 ; + + float_data = data_out.f ; + int_data = data_in.i ; + + for (k = 0 ; k < items ; k++) + float_data [k] = (k * ((k % 2) ? 333333.0 : -333333.0)) ; + + for (k = 0 ; k < items ; k++) + int_data [k] = lrintf (float_data [k]) ; + + for (k = 0 ; k < items ; k++) + if (fabs (int_data [k] - float_data [k]) > 1.0) + { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %d).\n", __LINE__, k, float_data [k], int_data [k]) ; + exit (1) ; + } ; + + printf ("ok\n") ; +} /* lrintf_test */ + +static void +pcm_test_bits_8 (const char *filename, int filetype, uint64_t hash) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k, items, zero_count ; + short *short_out, *short_in ; + int *int_out, *int_in ; + /* Lite remove start */ + float *float_out, *float_in ; + double *double_out, *double_in ; + /* Lite remove end */ + + print_test_name ("pcm_test_bits_8", filename) ; + + items = 127 ; + + short_out = data_out.s ; + short_in = data_in.s ; + + zero_count = 0 ; + for (k = 0 ; k < items ; k++) + { short_out [k] = arith_shift_left (k * ((k % 2) ? 1 : -1), 8) ; + zero_count = short_out [k] ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_short_or_die (file, 0, short_out, items, __LINE__) ; + + sf_close (file) ; + + memset (short_in, 0, items * sizeof (short)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_short_or_die (file, 0, short_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (short_out [k] != short_in [k]) + { printf ("\n\nLine %d: Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, short_out [k], short_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + + /* Finally, check the file hash. */ + check_file_hash_or_die (filename, hash, __LINE__) ; + + /*-------------------------------------------------------------------------- + ** Test sf_read/write_int () + */ + zero_count = 0 ; + + int_out = data_out.i ; + int_in = data_in.i ; + for (k = 0 ; k < items ; k++) + { int_out [k] = arith_shift_left (k * ((k % 2) ? 1 : -1), 24) ; + zero_count = int_out [k] ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_int_or_die (file, 0, int_out, items, __LINE__) ; + + sf_close (file) ; + + memset (int_in, 0, items * sizeof (int)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_int_or_die (file, 0, int_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (int_out [k] != int_in [k]) + { printf ("\n\nLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, int_out [k], int_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + + /* Lite remove start */ + /*-------------------------------------------------------------------------- + ** Test sf_read/write_float () + */ + zero_count = 0 ; + + float_out = data_out.f ; + float_in = data_in.f ; + for (k = 0 ; k < items ; k++) + { float_out [k] = (k * ((k % 2) ? 1 : -1)) ; + zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + + test_write_float_or_die (file, 0, float_out, items, __LINE__) ; + + sf_close (file) ; + + memset (float_in, 0, items * sizeof (float)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + + test_read_float_or_die (file, 0, float_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (fabs (float_out [k] - float_in [k]) > 1e-10) + { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + + /*-------------------------------------------------------------------------- + ** Test sf_read/write_double () + */ + zero_count = 0 ; + + double_out = data_out.d ; + double_in = data_in.d ; + for (k = 0 ; k < items ; k++) + { double_out [k] = (k * ((k % 2) ? 1 : -1)) ; + zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + + test_write_double_or_die (file, 0, double_out, items, __LINE__) ; + + sf_close (file) ; + + memset (double_in, 0, items * sizeof (double)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + + test_read_double_or_die (file, 0, double_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (fabs (double_out [k] - double_in [k]) > 1e-10) + { printf ("\n\nLine %d: double : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, double_out [k], double_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + /* Lite remove end */ + unlink (filename) ; + + puts ("ok") ; +} /* pcm_test_bits_8 */ + +static void +pcm_test_bits_16 (const char *filename, int filetype, uint64_t hash) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k, items, zero_count ; + short *short_out, *short_in ; + int *int_out, *int_in ; + /* Lite remove start */ + float *float_out, *float_in ; + double *double_out, *double_in ; + /* Lite remove end */ + + print_test_name ("pcm_test_bits_16", filename) ; + + items = 1024 ; + + short_out = data_out.s ; + short_in = data_in.s ; + + zero_count = 0 ; + for (k = 0 ; k < items ; k++) + { short_out [k] = (k * ((k % 2) ? 3 : -3)) ; + zero_count = short_out [k] ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_short_or_die (file, 0, short_out, items, __LINE__) ; + + sf_close (file) ; + + memset (short_in, 0, items * sizeof (short)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_short_or_die (file, 0, short_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (short_out [k] != short_in [k]) + { printf ("\n\nLine %d: Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, short_out [k], short_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + + /* Finally, check the file hash. */ + check_file_hash_or_die (filename, hash, __LINE__) ; + + /*-------------------------------------------------------------------------- + ** Test sf_read/write_int () + */ + zero_count = 0 ; + + int_out = data_out.i ; + int_in = data_in.i ; + for (k = 0 ; k < items ; k++) + { int_out [k] = arith_shift_left (k * ((k % 2) ? 3 : -3), 16) ; + zero_count = int_out [k] ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_int_or_die (file, 0, int_out, items, __LINE__) ; + + sf_close (file) ; + + memset (int_in, 0, items * sizeof (int)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_int_or_die (file, 0, int_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (int_out [k] != int_in [k]) + { printf ("\n\nLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, int_out [k], int_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + + /* Lite remove start */ + /*-------------------------------------------------------------------------- + ** Test sf_read/write_float () + */ + zero_count = 0 ; + + float_out = data_out.f ; + float_in = data_in.f ; + for (k = 0 ; k < items ; k++) + { float_out [k] = (k * ((k % 2) ? 3 : -3)) ; + zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + + test_write_float_or_die (file, 0, float_out, items, __LINE__) ; + + sf_close (file) ; + + memset (float_in, 0, items * sizeof (float)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + + test_read_float_or_die (file, 0, float_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (fabs (float_out [k] - float_in [k]) > 1e-10) + { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + + /*-------------------------------------------------------------------------- + ** Test sf_read/write_double () + */ + zero_count = 0 ; + + double_out = data_out.d ; + double_in = data_in.d ; + for (k = 0 ; k < items ; k++) + { double_out [k] = (k * ((k % 2) ? 3 : -3)) ; + zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + + test_write_double_or_die (file, 0, double_out, items, __LINE__) ; + + sf_close (file) ; + + memset (double_in, 0, items * sizeof (double)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + + test_read_double_or_die (file, 0, double_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (fabs (double_out [k] - double_in [k]) > 1e-10) + { printf ("\n\nLine %d: double : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, double_out [k], double_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + /* Lite remove end */ + unlink (filename) ; + + puts ("ok") ; +} /* pcm_test_bits_16 */ + +static void +pcm_test_bits_24 (const char *filename, int filetype, uint64_t hash) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k, items, zero_count ; + short *short_out, *short_in ; + int *int_out, *int_in ; + /* Lite remove start */ + float *float_out, *float_in ; + double *double_out, *double_in ; + /* Lite remove end */ + + print_test_name ("pcm_test_bits_24", filename) ; + + items = 1024 ; + + short_out = data_out.s ; + short_in = data_in.s ; + + zero_count = 0 ; + for (k = 0 ; k < items ; k++) + { short_out [k] = (k * ((k % 2) ? 3 : -3)) ; + zero_count = short_out [k] ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_short_or_die (file, 0, short_out, items, __LINE__) ; + + sf_close (file) ; + + memset (short_in, 0, items * sizeof (short)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_short_or_die (file, 0, short_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (short_out [k] != short_in [k]) + { printf ("\n\nLine %d: Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, short_out [k], short_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + + /* Finally, check the file hash. */ + check_file_hash_or_die (filename, hash, __LINE__) ; + + /*-------------------------------------------------------------------------- + ** Test sf_read/write_int () + */ + zero_count = 0 ; + + int_out = data_out.i ; + int_in = data_in.i ; + for (k = 0 ; k < items ; k++) + { int_out [k] = arith_shift_left (k * ((k % 2) ? 3333 : -3333), 8) ; + zero_count = int_out [k] ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_int_or_die (file, 0, int_out, items, __LINE__) ; + + sf_close (file) ; + + memset (int_in, 0, items * sizeof (int)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_int_or_die (file, 0, int_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (int_out [k] != int_in [k]) + { printf ("\n\nLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, int_out [k], int_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + + /* Lite remove start */ + /*-------------------------------------------------------------------------- + ** Test sf_read/write_float () + */ + zero_count = 0 ; + + float_out = data_out.f ; + float_in = data_in.f ; + for (k = 0 ; k < items ; k++) + { float_out [k] = (k * ((k % 2) ? 3333 : -3333)) ; + zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + + test_write_float_or_die (file, 0, float_out, items, __LINE__) ; + + sf_close (file) ; + + memset (float_in, 0, items * sizeof (float)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + + test_read_float_or_die (file, 0, float_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (fabs (float_out [k] - float_in [k]) > 1e-10) + { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + + /*-------------------------------------------------------------------------- + ** Test sf_read/write_double () + */ + zero_count = 0 ; + + double_out = data_out.d ; + double_in = data_in.d ; + for (k = 0 ; k < items ; k++) + { double_out [k] = (k * ((k % 2) ? 3333 : -3333)) ; + zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + + test_write_double_or_die (file, 0, double_out, items, __LINE__) ; + + sf_close (file) ; + + memset (double_in, 0, items * sizeof (double)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + + test_read_double_or_die (file, 0, double_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (fabs (double_out [k] - double_in [k]) > 1e-10) + { printf ("\n\nLine %d: double : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, double_out [k], double_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + /* Lite remove end */ + unlink (filename) ; + + puts ("ok") ; +} /* pcm_test_bits_24 */ + +static void +pcm_test_bits_32 (const char *filename, int filetype, uint64_t hash) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k, items, zero_count ; + short *short_out, *short_in ; + int *int_out, *int_in ; + /* Lite remove start */ + float *float_out, *float_in ; + double *double_out, *double_in ; + /* Lite remove end */ + + print_test_name ("pcm_test_bits_32", filename) ; + + items = 1024 ; + + short_out = data_out.s ; + short_in = data_in.s ; + + zero_count = 0 ; + for (k = 0 ; k < items ; k++) + { short_out [k] = (k * ((k % 2) ? 3 : -3)) ; + zero_count = short_out [k] ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_short_or_die (file, 0, short_out, items, __LINE__) ; + + sf_close (file) ; + + memset (short_in, 0, items * sizeof (short)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_short_or_die (file, 0, short_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (short_out [k] != short_in [k]) + { printf ("\n\nLine %d: Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, short_out [k], short_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + + /* Finally, check the file hash. */ + check_file_hash_or_die (filename, hash, __LINE__) ; + + /*-------------------------------------------------------------------------- + ** Test sf_read/write_int () + */ + zero_count = 0 ; + + int_out = data_out.i ; + int_in = data_in.i ; + for (k = 0 ; k < items ; k++) + { int_out [k] = (k * ((k % 2) ? 333333 : -333333)) ; + zero_count = int_out [k] ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_int_or_die (file, 0, int_out, items, __LINE__) ; + + sf_close (file) ; + + memset (int_in, 0, items * sizeof (int)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_int_or_die (file, 0, int_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (int_out [k] != int_in [k]) + { printf ("\n\nLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, int_out [k], int_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + + /* Lite remove start */ + /*-------------------------------------------------------------------------- + ** Test sf_read/write_float () + */ + zero_count = 0 ; + + float_out = data_out.f ; + float_in = data_in.f ; + for (k = 0 ; k < items ; k++) + { float_out [k] = (k * ((k % 2) ? 333333 : -333333)) ; + zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + + test_write_float_or_die (file, 0, float_out, items, __LINE__) ; + + sf_close (file) ; + + memset (float_in, 0, items * sizeof (float)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + + test_read_float_or_die (file, 0, float_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (fabs (float_out [k] - float_in [k]) > 1e-10) + { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + + /*-------------------------------------------------------------------------- + ** Test sf_read/write_double () + */ + zero_count = 0 ; + + double_out = data_out.d ; + double_in = data_in.d ; + for (k = 0 ; k < items ; k++) + { double_out [k] = (k * ((k % 2) ? 333333 : -333333)) ; + zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + + test_write_double_or_die (file, 0, double_out, items, __LINE__) ; + + sf_close (file) ; + + memset (double_in, 0, items * sizeof (double)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + + test_read_double_or_die (file, 0, double_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (fabs (double_out [k] - double_in [k]) > 1e-10) + { printf ("\n\nLine %d: double : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, double_out [k], double_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + /* Lite remove end */ + unlink (filename) ; + + puts ("ok") ; +} /* pcm_test_bits_32 */ + + + +/*============================================================================== +*/ + +static void +pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_float) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k, items, frames ; + int sign ; + double *data, error ; + + print_test_name (replace_float ? "pcm_test_float (replace)" : "pcm_test_float", filename) ; + + items = BUFFER_SIZE ; + + data = data_out.d ; + for (sign = 1, k = 0 ; k < items ; k++) + { data [k] = ((double) (k * sign)) / 100.0 ; + sign = (sign > 0) ? -1 : 1 ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = items ; + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) + { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + test_write_double_or_die (file, 0, data, items, __LINE__) ; + + sf_close (file) ; + + check_file_hash_or_die (filename, hash, __LINE__) ; + + memset (data, 0, items * sizeof (double)) ; + + if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) + { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + if (sfinfo.format != filetype) + { printf ("\n\nError (%s:%d) Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nError (%s:%d) Mono : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_double_or_die (file, 0, data, items, __LINE__) ; + + for (sign = -1, k = 0 ; k < items ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to end of file. */ + test_seek_or_die (file, 0, SEEK_END, sfinfo.frames, sfinfo.channels, __LINE__) ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data, 4, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 6, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data + 20, 4, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + sf_close (file) ; + + /* Now test Stereo. */ + + if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_SVX) /* SVX is mono only */ + { printf ("ok\n") ; + return ; + } ; + + items = BUFFER_SIZE ; + + data = data_out.d ; + for (sign = -1, k = 0 ; k < items ; k++) + data [k] = ((double) k) / 100.0 * (sign *= -1) ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = items ; + sfinfo.channels = 2 ; + sfinfo.format = filetype ; + + frames = items / sfinfo.channels ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) + { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + test_writef_double_or_die (file, 0, data, frames, __LINE__) ; + + sf_close (file) ; + + check_file_hash_or_die (filename, hash, __LINE__) ; + + memset (data, 0, items * sizeof (double)) ; + + if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) + { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + if (sfinfo.format != filetype) + { printf ("\n\nError (%s:%d) Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != frames) + { printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, frames, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 2) + { printf ("\n\nError (%s:%d) Stereo : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_readf_double_or_die (file, 0, data, frames, __LINE__) ; + for (sign = -1, k = 0 ; k < items ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_readf_double_or_die (file, 0, data, 4, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + + test_readf_double_or_die (file, 0, data + 20, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; + + test_readf_double_or_die (file, 0, data + 40, 2, __LINE__) ; + for (k = 40 ; k < 44 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_readf_double_or_die (file, 0, data + 20, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + sf_close (file) ; + + printf ("ok\n") ; + unlink (filename) ; +} /* pcm_test_float */ + +static void +pcm_test_double (const char *filename, int filetype, uint64_t hash, int replace_float) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k, items, frames ; + int sign ; + double *data, error ; + + /* This is the best test routine. Other should be brought up to this standard. */ + + print_test_name (replace_float ? "pcm_test_double (replace)" : "pcm_test_double", filename) ; + + items = BUFFER_SIZE ; + + data = data_out.d ; + for (sign = 1, k = 0 ; k < items ; k++) + { data [k] = ((double) (k * sign)) / 100.0 ; + sign = (sign > 0) ? -1 : 1 ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = items ; + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) + { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + test_write_double_or_die (file, 0, data, items, __LINE__) ; + + sf_close (file) ; + + check_file_hash_or_die (filename, hash, __LINE__) ; + + memset (data, 0, items * sizeof (double)) ; + + if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) + { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + if (sfinfo.format != filetype) + { printf ("\n\nError (%s:%d) Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nError (%s:%d) Mono : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_double_or_die (file, 0, data, items, __LINE__) ; + + for (sign = -1, k = 0 ; k < items ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data, 4, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; + + test_seek_or_die (file, 0, SEEK_CUR, 14, sfinfo.channels, __LINE__) ; + + for (k = 10 ; k < 14 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 6, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data + 20, 4, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + sf_close (file) ; + + /* Now test Stereo. */ + + if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_SVX) /* SVX is mono only */ + { printf ("ok\n") ; + return ; + } ; + + items = BUFFER_SIZE ; + + data = data_out.d ; + for (sign = -1, k = 0 ; k < items ; k++) + data [k] = ((double) k) / 100.0 * (sign *= -1) ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = items ; + sfinfo.channels = 2 ; + sfinfo.format = filetype ; + + frames = items / sfinfo.channels ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) + { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + test_writef_double_or_die (file, 0, data, frames, __LINE__) ; + + sf_close (file) ; + + check_file_hash_or_die (filename, hash, __LINE__) ; + + memset (data, 0, items * sizeof (double)) ; + + if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) + { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + if (sfinfo.format != filetype) + { printf ("\n\nError (%s:%d) Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != frames) + { printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, frames, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 2) + { printf ("\n\nError (%s:%d) Stereo : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_readf_double_or_die (file, 0, data, frames, __LINE__) ; + + for (sign = -1, k = 0 ; k < items ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data, 4, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; + + test_readf_double_or_die (file, 0, data + 40, 4, __LINE__) ; + for (k = 40 ; k < 44 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames -10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_readf_double_or_die (file, 0, data + 20, 4, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + sf_close (file) ; + + printf ("ok\n") ; + unlink (filename) ; +} /* pcm_test_double */ + +/*============================================================================== +*/ diff --git a/libsndfile-1.0.31/tests/pcm_test.def b/libsndfile-1.0.31/tests/pcm_test.def new file mode 100644 index 0000000..2cc91b5 --- /dev/null +++ b/libsndfile-1.0.31/tests/pcm_test.def @@ -0,0 +1,34 @@ +autogen definitions pcm_test.tpl; + +data_type = { + name = "bits_8" ; + item_count = 127 ; + short_func = "arith_shift_left (k * ((k % 2) ? 1 : -1), 8)" ; + int_func = "arith_shift_left (k * ((k % 2) ? 1 : -1), 24)" ; + float_func = "(k * ((k % 2) ? 1 : -1))" ; + } ; + +data_type = { + name = "bits_16" ; + item_count = 1024 ; + short_func = "(k * ((k % 2) ? 3 : -3))" ; + int_func = "arith_shift_left (k * ((k % 2) ? 3 : -3), 16)" ; + float_func = "(k * ((k % 2) ? 3 : -3))" ; + } ; + +data_type = { + name = "bits_24" ; + item_count = 1024 ; + short_func = "(k * ((k % 2) ? 3 : -3))" ; + int_func = "arith_shift_left (k * ((k % 2) ? 3333 : -3333), 8)" ; + float_func = "(k * ((k % 2) ? 3333 : -3333))" ; + } ; + +data_type = { + name = "bits_32" ; + item_count = 1024 ; + short_func = "(k * ((k % 2) ? 3 : -3))" ; + int_func = "(k * ((k % 2) ? 333333 : -333333))" ; + float_func = "(k * ((k % 2) ? 333333 : -333333))" ; + } ; + diff --git a/libsndfile-1.0.31/tests/pcm_test.tpl b/libsndfile-1.0.31/tests/pcm_test.tpl new file mode 100644 index 0000000..11226fb --- /dev/null +++ b/libsndfile-1.0.31/tests/pcm_test.tpl @@ -0,0 +1,919 @@ +[+ AutoGen5 template c +] +/* +** Copyright (C) 1999-2013 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "utils.h" + +#define BUFFER_SIZE (1 << 12) + +static void lrintf_test (void) ; + +[+ FOR data_type ++]static void pcm_test_[+ (get "name") +] (const char *filename, int filetype, uint64_t hash) ; +[+ ENDFOR data_type ++] +static void pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_float) ; +static void pcm_test_double (const char *filename, int filetype, uint64_t hash, int replace_float) ; + +typedef union +{ double d [BUFFER_SIZE + 1] ; + float f [BUFFER_SIZE + 1] ; + int i [BUFFER_SIZE + 1] ; + short s [BUFFER_SIZE + 1] ; +} BUFFER ; + +/* Data written to the file. */ +static BUFFER data_out ; + +/* Data read back from the file. */ +static BUFFER data_in ; + +int +main (void) +{ + lrintf_test () ; + + pcm_test_bits_8 ("pcm-s8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_S8, 0xa335091249dbfLL) ; + pcm_test_bits_8 ("pcm-u8.raw", SF_FORMAT_RAW | SF_FORMAT_PCM_U8, 0x48c433d695f3fLL) ; + + pcm_test_bits_16 ("le-pcm16.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0xb956c881ebf08LL) ; + pcm_test_bits_16 ("be-pcm16.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_16, 0x2f840c55750f8LL) ; + + pcm_test_bits_24 ("le-pcm24.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0xb6a759ab496f8LL) ; + pcm_test_bits_24 ("be-pcm24.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_24, 0xf3eaf9c30b6f8LL) ; + + pcm_test_bits_32 ("le-pcm32.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0xaece1c1c17f08LL) ; + pcm_test_bits_32 ("be-pcm32.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_32, 0x9ddf142d0b0f8LL) ; + + /* Lite remove start */ + pcm_test_float ("le-float.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xad04f7554267aLL, SF_FALSE) ; + pcm_test_float ("be-float.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xde3e248fa9186LL, SF_FALSE) ; + + pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x2726f958f669cLL, SF_FALSE) ; + pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x3583f8ee51164LL, SF_FALSE) ; + + pcm_test_float ("le-float.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xad04f7554267aLL, SF_TRUE) ; + pcm_test_float ("be-float.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT, 0xde3e248fa9186LL, SF_TRUE) ; + + pcm_test_double ("le-double.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x2726f958f669cLL, SF_TRUE) ; + pcm_test_double ("be-double.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, 0x3583f8ee51164LL, SF_TRUE) ; + /* Lite remove end */ + + return 0 ; +} /* main */ + +/*============================================================================================ +** Here are the test functions. +*/ + +static void +lrintf_test (void) +{ int k, items ; + float *float_data ; + int *int_data ; + + print_test_name ("lrintf_test", "") ; + + items = 1024 ; + + float_data = data_out.f ; + int_data = data_in.i ; + + for (k = 0 ; k < items ; k++) + float_data [k] = (k * ((k % 2) ? 333333.0 : -333333.0)) ; + + for (k = 0 ; k < items ; k++) + int_data [k] = lrintf (float_data [k]) ; + + for (k = 0 ; k < items ; k++) + if (fabs (int_data [k] - float_data [k]) > 1.0) + { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %d).\n", __LINE__, k, float_data [k], int_data [k]) ; + exit (1) ; + } ; + + printf ("ok\n") ; +} /* lrintf_test */ + +[+ FOR data_type ++]static void +pcm_test_[+ (get "name") +] (const char *filename, int filetype, uint64_t hash) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k, items, zero_count ; + short *short_out, *short_in ; + int *int_out, *int_in ; + /* Lite remove start */ + float *float_out, *float_in ; + double *double_out, *double_in ; + /* Lite remove end */ + + print_test_name ("pcm_test_[+ (get "name") +]", filename) ; + + items = [+ (get "item_count") +] ; + + short_out = data_out.s ; + short_in = data_in.s ; + + zero_count = 0 ; + for (k = 0 ; k < items ; k++) + { short_out [k] = [+ (get "short_func") +] ; + zero_count = short_out [k] ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_short_or_die (file, 0, short_out, items, __LINE__) ; + + sf_close (file) ; + + memset (short_in, 0, items * sizeof (short)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_short_or_die (file, 0, short_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (short_out [k] != short_in [k]) + { printf ("\n\nLine %d: Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, short_out [k], short_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + + /* Finally, check the file hash. */ + check_file_hash_or_die (filename, hash, __LINE__) ; + + /*-------------------------------------------------------------------------- + ** Test sf_read/write_int () + */ + zero_count = 0 ; + + int_out = data_out.i ; + int_in = data_in.i ; + for (k = 0 ; k < items ; k++) + { int_out [k] = [+ (get "int_func") +] ; + zero_count = int_out [k] ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros.\n", __LINE__) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_int_or_die (file, 0, int_out, items, __LINE__) ; + + sf_close (file) ; + + memset (int_in, 0, items * sizeof (int)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_int_or_die (file, 0, int_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (int_out [k] != int_in [k]) + { printf ("\n\nLine %d: int : Incorrect sample (#%d : 0x%x => 0x%x).\n", __LINE__, k, int_out [k], int_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + + /* Lite remove start */ + /*-------------------------------------------------------------------------- + ** Test sf_read/write_float () + */ + zero_count = 0 ; + + float_out = data_out.f ; + float_in = data_in.f ; + for (k = 0 ; k < items ; k++) + { float_out [k] = [+ (get "float_func") +] ; + zero_count = (fabs (float_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + + test_write_float_or_die (file, 0, float_out, items, __LINE__) ; + + sf_close (file) ; + + memset (float_in, 0, items * sizeof (float)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + + test_read_float_or_die (file, 0, float_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (fabs (float_out [k] - float_in [k]) > 1e-10) + { printf ("\n\nLine %d: float : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, (double) float_out [k], (double) float_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + + /*-------------------------------------------------------------------------- + ** Test sf_read/write_double () + */ + zero_count = 0 ; + + double_out = data_out.d ; + double_in = data_in.d ; + for (k = 0 ; k < items ; k++) + { double_out [k] = [+ (get "float_func") +] ; + zero_count = (fabs (double_out [k]) > 1e-10) ? zero_count : zero_count + 1 ; + } ; + + if (zero_count > items / 4) + { printf ("\n\nLine %d: too many zeros (%d/%d).\n", __LINE__, zero_count, items) ; + exit (1) ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + + test_write_double_or_die (file, 0, double_out, items, __LINE__) ; + + sf_close (file) ; + + memset (double_in, 0, items * sizeof (double)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %" PRId64 ")\n", __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + + test_read_double_or_die (file, 0, double_in, items, __LINE__) ; + + for (k = 0 ; k < items ; k++) + if (fabs (double_out [k] - double_in [k]) > 1e-10) + { printf ("\n\nLine %d: double : Incorrect sample (#%d : %f => %f).\n", __LINE__, k, double_out [k], double_in [k]) ; + exit (1) ; + } ; + + sf_close (file) ; + /* Lite remove end */ + unlink (filename) ; + + puts ("ok") ; +} /* pcm_test_[+ (get "name") +] */ + +[+ ENDFOR data_type ++] + +/*============================================================================== +*/ + +static void +pcm_test_float (const char *filename, int filetype, uint64_t hash, int replace_float) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k, items, frames ; + int sign ; + double *data, error ; + + print_test_name (replace_float ? "pcm_test_float (replace)" : "pcm_test_float", filename) ; + + items = BUFFER_SIZE ; + + data = data_out.d ; + for (sign = 1, k = 0 ; k < items ; k++) + { data [k] = ((double) (k * sign)) / 100.0 ; + sign = (sign > 0) ? -1 : 1 ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = items ; + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) + { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + test_write_double_or_die (file, 0, data, items, __LINE__) ; + + sf_close (file) ; + + check_file_hash_or_die (filename, hash, __LINE__) ; + + memset (data, 0, items * sizeof (double)) ; + + if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) + { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + if (sfinfo.format != filetype) + { printf ("\n\nError (%s:%d) Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nError (%s:%d) Mono : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_double_or_die (file, 0, data, items, __LINE__) ; + + for (sign = -1, k = 0 ; k < items ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to end of file. */ + test_seek_or_die (file, 0, SEEK_END, sfinfo.frames, sfinfo.channels, __LINE__) ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data, 4, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 6, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data + 20, 4, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + sf_close (file) ; + + /* Now test Stereo. */ + + if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_SVX) /* SVX is mono only */ + { printf ("ok\n") ; + return ; + } ; + + items = BUFFER_SIZE ; + + data = data_out.d ; + for (sign = -1, k = 0 ; k < items ; k++) + data [k] = ((double) k) / 100.0 * (sign *= -1) ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = items ; + sfinfo.channels = 2 ; + sfinfo.format = filetype ; + + frames = items / sfinfo.channels ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) + { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + test_writef_double_or_die (file, 0, data, frames, __LINE__) ; + + sf_close (file) ; + + check_file_hash_or_die (filename, hash, __LINE__) ; + + memset (data, 0, items * sizeof (double)) ; + + if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) + { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + if (sfinfo.format != filetype) + { printf ("\n\nError (%s:%d) Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != frames) + { printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, frames, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 2) + { printf ("\n\nError (%s:%d) Stereo : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_readf_double_or_die (file, 0, data, frames, __LINE__) ; + for (sign = -1, k = 0 ; k < items ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_readf_double_or_die (file, 0, data, 4, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + + test_readf_double_or_die (file, 0, data + 20, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; + + test_readf_double_or_die (file, 0, data + 40, 2, __LINE__) ; + for (k = 40 ; k < 44 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_readf_double_or_die (file, 0, data + 20, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + sf_close (file) ; + + printf ("ok\n") ; + unlink (filename) ; +} /* pcm_test_float */ + +static void +pcm_test_double (const char *filename, int filetype, uint64_t hash, int replace_float) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k, items, frames ; + int sign ; + double *data, error ; + + /* This is the best test routine. Other should be brought up to this standard. */ + + print_test_name (replace_float ? "pcm_test_double (replace)" : "pcm_test_double", filename) ; + + items = BUFFER_SIZE ; + + data = data_out.d ; + for (sign = 1, k = 0 ; k < items ; k++) + { data [k] = ((double) (k * sign)) / 100.0 ; + sign = (sign > 0) ? -1 : 1 ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = items ; + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) + { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + test_write_double_or_die (file, 0, data, items, __LINE__) ; + + sf_close (file) ; + + check_file_hash_or_die (filename, hash, __LINE__) ; + + memset (data, 0, items * sizeof (double)) ; + + if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) + { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + if (sfinfo.format != filetype) + { printf ("\n\nError (%s:%d) Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != items) + { printf ("\n\nError (%s:%d) Mono : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, items, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nError (%s:%d) Mono : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_double_or_die (file, 0, data, items, __LINE__) ; + + for (sign = -1, k = 0 ; k < items ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data, 4, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; + + test_seek_or_die (file, 0, SEEK_CUR, 14, sfinfo.channels, __LINE__) ; + + for (k = 10 ; k < 14 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 6, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data + 20, 4, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Mono : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + sf_close (file) ; + + /* Now test Stereo. */ + + if ((filetype & SF_FORMAT_TYPEMASK) == SF_FORMAT_SVX) /* SVX is mono only */ + { printf ("ok\n") ; + return ; + } ; + + items = BUFFER_SIZE ; + + data = data_out.d ; + for (sign = -1, k = 0 ; k < items ; k++) + data [k] = ((double) k) / 100.0 * (sign *= -1) ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = items ; + sfinfo.channels = 2 ; + sfinfo.format = filetype ; + + frames = items / sfinfo.channels ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) + { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + test_writef_double_or_die (file, 0, data, frames, __LINE__) ; + + sf_close (file) ; + + check_file_hash_or_die (filename, hash, __LINE__) ; + + memset (data, 0, items * sizeof (double)) ; + + if ((filetype & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_TEST_IEEE_FLOAT_REPLACE, NULL, replace_float) ; + if (replace_float && string_in_log_buffer (file, "Using IEEE replacement") == 0) + { printf ("\n\nLine %d : Float replacement code not working.\n\n", __LINE__) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + if (sfinfo.format != filetype) + { printf ("\n\nError (%s:%d) Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", __FILE__, __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != frames) + { printf ("\n\nError (%s:%d) Stereo : Incorrect number of frames in file. (%d => %" PRId64 ")\n", __FILE__, __LINE__, frames, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 2) + { printf ("\n\nError (%s:%d) Stereo : Incorrect number of channels in file.\n", __FILE__, __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_readf_double_or_die (file, 0, data, frames, __LINE__) ; + + for (sign = -1, k = 0 ; k < items ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data, 4, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, data + 10, 4, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; + + test_readf_double_or_die (file, 0, data + 40, 4, __LINE__) ; + for (k = 40 ; k < 44 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames -10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_readf_double_or_die (file, 0, data + 20, 4, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + { error = fabs (data [k] - ((double) k) / 100.0 * (sign *= -1)) ; + if (fabs (data [k]) > 1e-100 && fabs (error / data [k]) > 1e-5) + { printf ("\n\nError (%s:%d) Stereo : Incorrect sample (#%d : %f => %f).\n", __FILE__, __LINE__, k, ((double) k) / 100.0, data [k]) ; + exit (1) ; + } ; + } ; + + sf_close (file) ; + + printf ("ok\n") ; + unlink (filename) ; +} /* pcm_test_double */ + +/*============================================================================== +*/ diff --git a/libsndfile-1.0.31/tests/peak_chunk_test.c b/libsndfile-1.0.31/tests/peak_chunk_test.c new file mode 100644 index 0000000..3e1aa3d --- /dev/null +++ b/libsndfile-1.0.31/tests/peak_chunk_test.c @@ -0,0 +1,371 @@ +/* +** Copyright (C) 2001-2016 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "utils.h" + +#define BUFFER_LEN (1 << 15) +#define LOG_BUFFER_SIZE 1024 + + +static void test_float_peak (const char *filename, int filetype) ; +static void read_write_peak_test (const char *filename, int filetype) ; + +static void check_logged_peaks (char *buffer) ; + +/* Force the start of this buffer to be double aligned. Sparc-solaris will +** choke if its not. +*/ +static double data [BUFFER_LEN] ; +static char log_buffer [LOG_BUFFER_SIZE] ; + +int +main (int argc, char *argv []) +{ int do_all = 0 ; + int test_count = 0 ; + + if (argc != 2) + { printf ("Usage : %s \n", argv [0]) ; + printf (" Where is one of the following:\n") ; + printf (" aiff - test AIFF file PEAK chunk\n") ; + printf (" caf - test CAF file PEAK chunk\n") ; + printf (" wav - test WAV file peak chunk\n") ; + printf (" all - perform all tests\n") ; + exit (1) ; + } ; + + do_all = ! strcmp (argv [1], "all") ; + + if (do_all || ! strcmp (argv [1], "wav")) + { test_float_peak ("peak_float.wav", SF_FORMAT_WAV | SF_FORMAT_FLOAT) ; + test_float_peak ("peak_float.wavex", SF_FORMAT_WAVEX | SF_FORMAT_FLOAT) ; + test_float_peak ("peak_float.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_FLOAT) ; + + read_write_peak_test ("rw_peak.wav", SF_FORMAT_WAV | SF_FORMAT_FLOAT) ; + read_write_peak_test ("rw_peak.wavex", SF_FORMAT_WAVEX | SF_FORMAT_FLOAT) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "aiff")) + { test_float_peak ("peak_float.aiff", SF_FORMAT_AIFF | SF_FORMAT_FLOAT) ; + + read_write_peak_test ("rw_peak.aiff", SF_FORMAT_AIFF | SF_FORMAT_FLOAT) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "caf")) + { test_float_peak ("peak_float.caf", SF_FORMAT_CAF | SF_FORMAT_FLOAT) ; + + read_write_peak_test ("rw_peak.caf", SF_FORMAT_CAF | SF_FORMAT_FLOAT) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "rf64")) + { test_float_peak ("peak_float.rf64", SF_FORMAT_RF64 | SF_FORMAT_FLOAT) ; + + read_write_peak_test ("rw_peak.rf64", SF_FORMAT_RF64 | SF_FORMAT_FLOAT) ; + test_count++ ; + } ; + + if (test_count == 0) + { printf ("Mono : ************************************\n") ; + printf ("Mono : * No '%s' test defined.\n", argv [1]) ; + printf ("Mono : ************************************\n") ; + return 1 ; + } ; + + return 0 ; +} /* main */ + +/*============================================================================================ +** Here are the test functions. +*/ + +static void +test_float_peak (const char *filename, int filetype) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k, frames, count ; + + print_test_name ("test_float_peak", filename) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.format = filetype ; + sfinfo.channels = 4 ; + sfinfo.frames = 0 ; + + frames = BUFFER_LEN / sfinfo.channels ; + + /* Create some random data with a peak value of 0.66. */ + for (k = 0 ; k < BUFFER_LEN ; k++) + data [k] = (rand () % 2000) / 3000.0 ; + + /* Insert some larger peaks a know locations. */ + data [4 * (frames / 8) + 0] = (frames / 8) * 0.01 ; /* First channel */ + data [4 * (frames / 6) + 1] = (frames / 6) * 0.01 ; /* Second channel */ + data [4 * (frames / 4) + 2] = (frames / 4) * 0.01 ; /* Third channel */ + data [4 * (frames / 2) + 3] = (frames / 2) * 0.01 ; /* Fourth channel */ + + /* Write a file with PEAK chunks. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, 0, __LINE__) ; + + /* Try to confuse the header writer by adding a removing the PEAK chunk. */ + sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ; + sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; + sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ; + + /* Write the data in four passed. The data is designed so that peaks will + ** be written in the different calls to sf_write_double (). + */ + for (count = 0 ; count < 4 ; count ++) + test_write_double_or_die (file, 0, data + count * BUFFER_LEN / 4, BUFFER_LEN / 4, BUFFER_LEN / 4) ; + + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, 0, __LINE__) ; + + if (sfinfo.format != filetype) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != frames) + { printf ("\n\nLine %d: Incorrect number of frames in file. (%d => %ld)\n", __LINE__, frames, (long) sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 4) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + /* Check these two commands. */ + if (sf_command (file, SFC_GET_SIGNAL_MAX, data, sizeof (double)) == SF_FALSE) + { printf ("\n\nLine %d: Command should have returned SF_TRUE.\n", __LINE__) ; + exit (1) ; + } ; + + if (fabs (data [0] - (frames / 2) * 0.01) > 0.01) + { printf ("\n\nLine %d: Bad peak value (%f should be %f) for command SFC_GET_SIGNAL_MAX.\n", __LINE__, data [0], (frames / 2) * 0.01) ; + exit (1) ; + } ; + + if (sf_command (file, SFC_GET_MAX_ALL_CHANNELS, data, sizeof (double) * sfinfo.channels) == SF_FALSE) + { printf ("\n\nLine %d: Command should have returned SF_TRUE.\n", __LINE__) ; + exit (1) ; + } ; + + if (fabs (data [3] - (frames / 2) * 0.01) > 0.01) + { printf ("\n\nLine %d: Bad peak value (%f should be %f) for command SFC_GET_MAX_ALL_CHANNELS.\n", __LINE__, data [0], (frames / 2) * 0.01) ; + exit (1) ; + } ; + + /* Get the log buffer data. */ + log_buffer [0] = 0 ; + sf_command (file, SFC_GET_LOG_INFO, log_buffer, LOG_BUFFER_SIZE) ; + + if (strlen (log_buffer) == 0) + { printf ("\n\nLine %d: Empty log buffer,\n", __LINE__) ; + exit (1) ; + } ; + + check_logged_peaks (log_buffer) ; + + sf_close (file) ; + + /* Write a file ***without*** PEAK chunks. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, 0, __LINE__) ; + + /* Try to confuse the header writer by adding a removing the PEAK chunk. */ + sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; + sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ; + sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; + + /* Write the data in four passed. The data is designed so that peaks will + ** be written in the different calls to sf_write_double (). + */ + for (count = 0 ; count < 4 ; count ++) + test_write_double_or_die (file, 0, data + count * BUFFER_LEN / 4, BUFFER_LEN / 4, BUFFER_LEN / 4) ; + + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, 0, __LINE__) ; + + /* Check these two commands. */ + if (sf_command (file, SFC_GET_SIGNAL_MAX, data, sizeof (double))) + { printf ("\n\nLine %d: Command should have returned SF_FALSE.\n", __LINE__) ; + exit (1) ; + } ; + + if (sf_command (file, SFC_GET_MAX_ALL_CHANNELS, data, sizeof (double) * sfinfo.channels)) + { printf ("\n\nLine %d: Command should have returned SF_FALSE.\n", __LINE__) ; + exit (1) ; + } ; + + /* Get the log buffer data. */ + log_buffer [0] = 0 ; + sf_command (file, SFC_GET_LOG_INFO, log_buffer, LOG_BUFFER_SIZE) ; + + if (strlen (log_buffer) == 0) + { printf ("\n\nLine %d: Empty log buffer,\n", __LINE__) ; + exit (1) ; + } ; + + if (strstr (log_buffer, "PEAK :") != NULL) + { printf ("\n\nLine %d: Should not have a PEAK chunk in this file.\n\n", __LINE__) ; + puts (log_buffer) ; + exit (1) ; + } ; + + sf_close (file) ; + + unlink (filename) ; + printf ("ok\n") ; +} /* test_float_peak */ + +static void +check_logged_peaks (char *buffer) +{ char *cptr ; + int k, chan, channel_count, position ; + float value ; + + if (strstr (buffer, "should") || strstr (buffer, "*")) + { printf ("\n\nLine %d: Something wrong in buffer. Dumping.\n", __LINE__) ; + puts (buffer) ; + exit (1) ; + } ; + + channel_count = 0 ; + cptr = strstr (buffer, "Channels") ; + if (cptr && sscanf (cptr, "Channels : %d", &k) == 1) + channel_count = k ; + else if (cptr && sscanf (cptr, "Channels / frame : %d", &k) == 1) + channel_count = k ; + else + { printf ("\n\nLine %d: Couldn't find channel count.\n", __LINE__) ; + exit (1) ; + } ; + + if (channel_count != 4) + { printf ("\n\nLine %d: Wrong channel count (4 ->%d).\n", __LINE__, channel_count) ; + exit (1) ; + } ; + + if (! (cptr = strstr (buffer, "Ch Position Value"))) + { printf ("\n\nLine %d: Can't find PEAK data.\n", __LINE__) ; + exit (1) ; + } ; + + for (k = 0 ; k < channel_count ; k++) + { if (! (cptr = strchr (cptr, '\n'))) + { printf ("\n\nLine %d: Got lost.\n", __LINE__) ; + exit (1) ; + } ; + if (sscanf (cptr, "%d %d %f", &chan, &position, &value) != 3) + { printf ("\n\nLine %d: sscanf failed.\n", __LINE__) ; + exit (1) ; + } ; + if (position == 0) + { printf ("\n\nLine %d: peak position for channel %d should not be at offset 0.\n", __LINE__, chan) ; + printf ("%s", buffer) ; + exit (1) ; + } ; + if (chan != k || fabs ((position) * 0.01 - value) > 1e-6) + { printf ("\n\nLine %d: Error : peak value incorrect!\n", __LINE__) ; + printf ("%s", buffer) ; + printf ("\n\nLine %d: %d %f %f\n", __LINE__, chan, position * 0.01, value) ; + exit (1) ; + } ; + cptr ++ ; /* Move past current newline. */ + } ; + +} /* check_logged_peaks */ + +static void +read_write_peak_test (const char *filename, int filetype) +{ SNDFILE *file ; + SF_INFO sfinfo ; + + double small_data [10], max_peak = 0.0 ; + unsigned k ; + + print_test_name (__func__, filename) ; + + for (k = 0 ; k < ARRAY_LEN (small_data) ; k ++) + small_data [k] = 0.1 ; + + sfinfo.samplerate = 44100 ; + sfinfo.channels = 2 ; + sfinfo.format = filetype ; + sfinfo.frames = 0 ; + + /* Open the file, add peak chunk and write samples with value 0.1. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + + sf_command (file, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_TRUE) ; + + test_write_double_or_die (file, 0, small_data, ARRAY_LEN (small_data), __LINE__) ; + + sf_close (file) ; + + /* Open the fiel RDWR, write sample valied 1.25. */ + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ; + + for (k = 0 ; k < ARRAY_LEN (small_data) ; k ++) + small_data [k] = 1.0 ; + + test_write_double_or_die (file, 0, small_data, ARRAY_LEN (small_data), __LINE__) ; + + sf_command (file, SFC_GET_SIGNAL_MAX, &max_peak, sizeof (max_peak)) ; + + sf_close (file) ; + + exit_if_true (max_peak < 0.1, "\n\nLine %d : max peak (%5.3f) should not be 0.1.\n\n", __LINE__, max_peak) ; + + /* Open the file and test the values written to the PEAK chunk. */ + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + exit_if_true (sfinfo.channels * sfinfo.frames != 2 * ARRAY_LEN (small_data), + "Line %d : frame count is %" PRId64 ", should be %zd\n", __LINE__, sfinfo.frames, 2 * ARRAY_LEN (small_data)) ; + + sf_command (file, SFC_GET_SIGNAL_MAX, &max_peak, sizeof (double)) ; + + sf_close (file) ; + + exit_if_true (max_peak < 1.0, "\n\nLine %d : max peak (%5.3f) should be 1.0.\n\n", __LINE__, max_peak) ; + + unlink (filename) ; + puts ("ok") ; +} /* read_write_peak_test */ + diff --git a/libsndfile-1.0.31/tests/pedantic-header-test.sh.in b/libsndfile-1.0.31/tests/pedantic-header-test.sh.in new file mode 100644 index 0000000..283af64 --- /dev/null +++ b/libsndfile-1.0.31/tests/pedantic-header-test.sh.in @@ -0,0 +1,58 @@ +#!/bin/bash + +# Copyright (C) 2010-2017 Erik de Castro Lopo +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the author nor the names of any contributors may be used +# to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +if test ! -f @top_srcdir@/tests/sfversion.c ; then + exit 0 + fi + +echo -n " Pedantic header test : " + +# Only do this if the compiler is GCC. +if test -n "@GCC_MAJOR_VERSION@" ; then + + CC=`echo "@CC@" | sed "s/.*shave cc //"` + # Compile with -Werror and -pedantic. + $CC -std=c99 -Werror -pedantic -I@top_srcdir@/src -I@abs_top_builddir@/src -I@abs_top_builddir@/include -c @top_srcdir@/tests/sfversion.c -o /dev/null + + # Check compiler return status. + if test $? -ne 0 ; then + echo + exit 1 + fi + + echo "ok" +else + echo "n/a" + fi + +exit 0 diff --git a/libsndfile-1.0.31/tests/pipe_test.c b/libsndfile-1.0.31/tests/pipe_test.c new file mode 100644 index 0000000..e7a0b97 --- /dev/null +++ b/libsndfile-1.0.31/tests/pipe_test.c @@ -0,0 +1,513 @@ +/* +** Copyright (C) 2001-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +/*========================================================================== +** This is a test program which tests reading from and writing to pipes. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#if (OS_IS_WIN32 || defined __OS2__ || HAVE_PIPE == 0 || HAVE_WAITPID == 0) + +int +main (void) +{ + puts (" pipe_test : this test doesn't work on this OS.") ; + return 0 ; +} /* main */ + +#else + +#if HAVE_UNISTD_H +#include +#endif + +#include +#include +#include +#include + +#include + +#include "utils.h" + +typedef struct +{ int format ; + const char *ext ; +} FILETYPE ; + +static void useek_pipe_rw_test (int filetype, const char *ext) ; +static void pipe_read_test (int filetype, const char *ext) ; +static void pipe_write_test (const char *ext) ; +static void pipe_test_others (FILETYPE*, FILETYPE*) ; + +static FILETYPE read_write_types [] = +{ { SF_FORMAT_RAW , "raw" }, + { SF_FORMAT_AU , "au" }, + /* Lite remove start */ + { SF_FORMAT_PAF , "paf" }, + { SF_FORMAT_IRCAM , "ircam" }, + { SF_FORMAT_PVF , "pvf" }, + /* Lite remove end */ + { 0 , NULL } +} ; + +static FILETYPE read_only_types [] = +{ { SF_FORMAT_RAW , "raw" }, + { SF_FORMAT_AU , "au" }, + { SF_FORMAT_AIFF , "aiff" }, + { SF_FORMAT_WAV , "wav" }, + { SF_FORMAT_W64 , "w64" }, + /* Lite remove start */ + { SF_FORMAT_PAF , "paf" }, + { SF_FORMAT_NIST , "nist" }, + { SF_FORMAT_IRCAM , "ircam" }, + { SF_FORMAT_MAT4 , "mat4" }, + { SF_FORMAT_MAT5 , "mat5" }, + { SF_FORMAT_SVX , "svx" }, + { SF_FORMAT_PVF , "pvf" }, + /* Lite remove end */ + { 0 , NULL } +} ; + +int +main (void) +{ int k ; + + for (k = 0 ; read_only_types [k].format ; k++) + pipe_read_test (read_only_types [k].format, read_only_types [k].ext) ; + + for (k = 0 ; read_write_types [k].format ; k++) + pipe_write_test (read_write_types [k].ext) ; + + for (k = 0 ; read_write_types [k].format ; k++) + useek_pipe_rw_test (read_write_types [k].format, read_write_types [k].ext) ; + + if (0) + pipe_test_others (read_write_types, read_only_types) ; + + return 0 ; +} /* main */ + +/*============================================================================== +*/ + +static void +pipe_read_test (int filetype, const char *ext) +{ static short data [PIPE_TEST_LEN] ; + static char buffer [256] ; + static char filename [256] ; + + SNDFILE *outfile ; + SF_INFO sfinfo ; + int k, retval ; + + snprintf (filename, sizeof (filename), "pipe_in.%s", ext) ; + print_test_name ("pipe_read_test", filename) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.format = filetype | SF_FORMAT_PCM_16 ; + sfinfo.channels = 1 ; + sfinfo.samplerate = 44100 ; + + for (k = 0 ; k < PIPE_TEST_LEN ; k++) + data [k] = PIPE_INDEX (k) ; + + outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_writef_short_or_die (outfile, 0, data, PIPE_TEST_LEN, __LINE__) ; + sf_close (outfile) ; + + snprintf (buffer, sizeof (buffer), "cat %s | ./tests/stdin_test %s ", filename, ext) ; + if ((retval = system (buffer)) != 0) + { retval = WEXITSTATUS (retval) ; + printf ("\n\n Line %d : pipe test returned error for file type \"%s\".\n\n", __LINE__, ext) ; + exit (retval) ; + } ; + + unlink (filename) ; + puts ("ok") ; + + return ; +} /* pipe_read_test */ + +static void +pipe_write_test (const char *ext) +{ static char buffer [256] ; + + int retval ; + + print_test_name ("pipe_write_test", ext) ; + + snprintf (buffer, sizeof (buffer), "./tests/stdout_test %s | ./tests/stdin_test %s ", ext, ext) ; + if ((retval = system (buffer))) + { retval = WEXITSTATUS (retval) ; + printf ("\n\n Line %d : pipe test returned error file type \"%s\".\n\n", __LINE__, ext) ; + exit (retval) ; + } ; + + puts ("ok") ; + + return ; +} /* pipe_write_test */ + +/*============================================================================== +*/ + + +static void +useek_pipe_rw_short (const char * ext, SF_INFO * psfinfo_write, SF_INFO * psfinfo_read) +{ static short buffer [PIPE_TEST_LEN] ; + static short data [PIPE_TEST_LEN] ; + SNDFILE *outfile ; + SNDFILE *infile_piped ; + + int k, status = 0 ; + int pipefd [2] ; + pid_t pida ; + + for (k = 0 ; k < PIPE_TEST_LEN ; k++) + data [k] = PIPE_INDEX (k) ; + + /* + ** Create the pipe. + */ + exit_if_true (pipe (pipefd) != 0, "\n\n%s %d : pipe failed : %s\n", __func__, __LINE__, strerror (errno)) ; + + /* + ** Attach the write end of the pipe to be written to. + */ + if ((outfile = sf_open_fd (pipefd [1], SFM_WRITE, psfinfo_write, SF_TRUE)) == NULL) + { printf ("\n\n%s %d : unable to create unseekable pipe for write type \"%s\".\n", __func__, __LINE__, ext) ; + printf ("\t%s\n\n", sf_strerror (outfile)) ; + exit (1) ; + } ; + + if (sf_error (outfile) != SF_ERR_NO_ERROR) + { printf ("\n\n%s %d : unable to open unseekable pipe for write type \"%s\".\n\n", __func__, __LINE__, ext) ; + exit (1) ; + } ; + + /* + ** Attach the read end of the pipe to be read from. + */ + if ((infile_piped = sf_open_fd (pipefd [0], SFM_READ, psfinfo_read, SF_TRUE)) == NULL) + { printf ("\n\n%s %d : unable to create unseekable pipe for read type. \"%s\".\n\n", __func__, __LINE__, ext) ; + exit (1) ; + } ; + + if (sf_error (infile_piped) != SF_ERR_NO_ERROR) + { printf ("\n\n%s %d : unable to open unseekable pipe for read type \"%s\".\n\n", __func__, __LINE__, ext) ; + exit (1) ; + } ; + + /* Fork a child process that will write directly into the pipe. */ + if ((pida = fork ()) == 0) /* child process */ + { test_writef_short_or_die (outfile, 0, data, PIPE_TEST_LEN, __LINE__) ; + exit (0) ; + } ; + + /* In the parent process, read from the pipe and compare what is read + ** to what is written, if they match everything went as planned. + */ + test_readf_short_or_die (infile_piped, 0, buffer, PIPE_TEST_LEN, __LINE__) ; + if (memcmp (buffer, data, sizeof (buffer)) != 0) + { printf ("\n\n%s %d : unseekable pipe test failed for file type \"%s\".\n\n", __func__, __LINE__, ext) ; + exit (1) ; + } ; + + /* Wait for the child process to return. */ + waitpid (pida, &status, 0) ; + status = WEXITSTATUS (status) ; + sf_close (outfile) ; + sf_close (infile_piped) ; + + if (status != 0) + { printf ("\n\n%s %d : status of child process is %d for file type %s.\n\n", __func__, __LINE__, status, ext) ; + exit (1) ; + } ; + + return ; +} /* useek_pipe_rw_short */ + + +static void +useek_pipe_rw_float (const char * ext, SF_INFO * psfinfo_write, SF_INFO * psfinfo_read) +{ static float buffer [PIPE_TEST_LEN] ; + static float data [PIPE_TEST_LEN] ; + SNDFILE *outfile ; + SNDFILE *infile_piped ; + + int k, status = 0 ; + int pipefd [2] ; + pid_t pida ; + + for (k = 0 ; k < PIPE_TEST_LEN ; k++) + data [k] = PIPE_INDEX (k) ; + + /* + ** Create the pipe. + */ + exit_if_true (pipe (pipefd) != 0, "\n\n%s %d : pipe failed : %s\n", __func__, __LINE__, strerror (errno)) ; + + /* + ** Attach the write end of the pipe to be written to. + */ + if ((outfile = sf_open_fd (pipefd [1], SFM_WRITE, psfinfo_write, SF_TRUE)) == NULL) + { printf ("\n\n%s %d : unable to create unseekable pipe for write type \"%s\".\n", __func__, __LINE__, ext) ; + printf ("\t%s\n\n", sf_strerror (outfile)) ; + exit (1) ; + } ; + + if (sf_error (outfile) != SF_ERR_NO_ERROR) + { printf ("\n\n%s %d : unable to open unseekable pipe for write type \"%s\".\n\n", __func__, __LINE__, ext) ; + exit (1) ; + } ; + + /* + ** Attach the read end of the pipe to be read from. + */ + if ((infile_piped = sf_open_fd (pipefd [0], SFM_READ, psfinfo_read, SF_TRUE)) == NULL) + { printf ("\n\n%s %d : unable to create unseekable pipe for read type. \"%s\".\n\n", __func__, __LINE__, ext) ; + exit (1) ; + } ; + + if (sf_error (infile_piped) != SF_ERR_NO_ERROR) + { printf ("\n\n%s %d : unable to open unseekable pipe for read type \"%s\".\n\n", __func__, __LINE__, ext) ; + exit (1) ; + } ; + + /* Fork a child process that will write directly into the pipe. */ + if ((pida = fork ()) == 0) /* child process */ + { test_writef_float_or_die (outfile, 0, data, PIPE_TEST_LEN, __LINE__) ; + exit (0) ; + } ; + + /* In the parent process, read from the pipe and compare what is read + ** to what is written, if they match everything went as planned. + */ + test_readf_float_or_die (infile_piped, 0, buffer, PIPE_TEST_LEN, __LINE__) ; + if (memcmp (buffer, data, sizeof (buffer)) != 0) + { printf ("\n\n%s %d : unseekable pipe test failed for file type \"%s\".\n\n", __func__, __LINE__, ext) ; + exit (1) ; + } ; + + /* Wait for the child process to return. */ + waitpid (pida, &status, 0) ; + status = WEXITSTATUS (status) ; + sf_close (outfile) ; + sf_close (infile_piped) ; + + if (status != 0) + { printf ("\n\n%s %d : status of child process is %d for file type %s.\n\n", __func__, __LINE__, status, ext) ; + exit (1) ; + } ; + + return ; +} /* useek_pipe_rw_float */ + + +static void +useek_pipe_rw_double (const char * ext, SF_INFO * psfinfo_write, SF_INFO * psfinfo_read) +{ static double buffer [PIPE_TEST_LEN] ; + static double data [PIPE_TEST_LEN] ; + SNDFILE *outfile ; + SNDFILE *infile_piped ; + + int k, status = 0 ; + int pipefd [2] ; + pid_t pida ; + + for (k = 0 ; k < PIPE_TEST_LEN ; k++) + data [k] = PIPE_INDEX (k) ; + + /* + ** Create the pipe. + */ + exit_if_true (pipe (pipefd) != 0, "\n\n%s %d : pipe failed : %s\n", __func__, __LINE__, strerror (errno)) ; + + /* + ** Attach the write end of the pipe to be written to. + */ + if ((outfile = sf_open_fd (pipefd [1], SFM_WRITE, psfinfo_write, SF_TRUE)) == NULL) + { printf ("\n\n%s %d : unable to create unseekable pipe for write type \"%s\".\n", __func__, __LINE__, ext) ; + printf ("\t%s\n\n", sf_strerror (outfile)) ; + exit (1) ; + } ; + + if (sf_error (outfile) != SF_ERR_NO_ERROR) + { printf ("\n\n%s %d : unable to open unseekable pipe for write type \"%s\".\n\n", __func__, __LINE__, ext) ; + exit (1) ; + } ; + + /* + ** Attach the read end of the pipe to be read from. + */ + if ((infile_piped = sf_open_fd (pipefd [0], SFM_READ, psfinfo_read, SF_TRUE)) == NULL) + { printf ("\n\n%s %d : unable to create unseekable pipe for read type. \"%s\".\n\n", __func__, __LINE__, ext) ; + exit (1) ; + } ; + + if (sf_error (infile_piped) != SF_ERR_NO_ERROR) + { printf ("\n\n%s %d : unable to open unseekable pipe for read type \"%s\".\n\n", __func__, __LINE__, ext) ; + exit (1) ; + } ; + + /* Fork a child process that will write directly into the pipe. */ + if ((pida = fork ()) == 0) /* child process */ + { test_writef_double_or_die (outfile, 0, data, PIPE_TEST_LEN, __LINE__) ; + exit (0) ; + } ; + + /* In the parent process, read from the pipe and compare what is read + ** to what is written, if they match everything went as planned. + */ + test_readf_double_or_die (infile_piped, 0, buffer, PIPE_TEST_LEN, __LINE__) ; + if (memcmp (buffer, data, sizeof (buffer)) != 0) + { printf ("\n\n%s %d : unseekable pipe test failed for file type \"%s\".\n\n", __func__, __LINE__, ext) ; + exit (1) ; + } ; + + /* Wait for the child process to return. */ + waitpid (pida, &status, 0) ; + status = WEXITSTATUS (status) ; + sf_close (outfile) ; + sf_close (infile_piped) ; + + if (status != 0) + { printf ("\n\n%s %d : status of child process is %d for file type %s.\n\n", __func__, __LINE__, status, ext) ; + exit (1) ; + } ; + + return ; +} /* useek_pipe_rw_double */ + + + + +static void +useek_pipe_rw_test (int filetype, const char *ext) +{ SF_INFO sfinfo_write ; + SF_INFO sfinfo_read ; + + print_test_name ("useek_pipe_rw_test", ext) ; + + /* + ** Setup the INFO structures for the filetype we will be + ** working with. + */ + sfinfo_write.format = filetype | SF_FORMAT_PCM_16 ; + sfinfo_write.channels = 1 ; + sfinfo_write.samplerate = 44100 ; + + + sfinfo_read.format = 0 ; + if (filetype == SF_FORMAT_RAW) + { sfinfo_read.format = filetype | SF_FORMAT_PCM_16 ; + sfinfo_read.channels = 1 ; + sfinfo_read.samplerate = 44100 ; + } ; + + useek_pipe_rw_short (ext, &sfinfo_write, &sfinfo_read) ; + + sfinfo_read.format = sfinfo_write.format = filetype | SF_FORMAT_FLOAT ; + if (sf_format_check (&sfinfo_read) != 0) + useek_pipe_rw_float (ext, &sfinfo_write, &sfinfo_read) ; + + sfinfo_read.format = sfinfo_write.format = filetype | SF_FORMAT_DOUBLE ; + if (sf_format_check (&sfinfo_read) != 0) + useek_pipe_rw_double (ext, &sfinfo_write, &sfinfo_read) ; + + puts ("ok") ; + return ; +} /* useek_pipe_rw_test */ + + + +static void +pipe_test_others (FILETYPE* list1, FILETYPE* list2) +{ SF_FORMAT_INFO info ; + int k, m, major_count, in_list ; + + print_test_name ("pipe_test_others", "") ; + + sf_command (NULL, SFC_GET_FORMAT_MAJOR_COUNT, &major_count, sizeof (int)) ; + + for (k = 0 ; k < major_count ; k++) + { info.format = k ; + + sf_command (NULL, SFC_GET_FORMAT_MAJOR, &info, sizeof (info)) ; + + in_list = SF_FALSE ; + for (m = 0 ; list1 [m].format ; m++) + if (info.format == list1 [m].format) + in_list = SF_TRUE ; + + for (m = 0 ; list2 [m].format ; m++) + if (info.format == list2 [m].format) + in_list = SF_TRUE ; + + if (in_list) + continue ; + + printf ("%s %x\n", info.name, info.format) ; + + if (1) + { static short data [PIPE_TEST_LEN] ; + static char buffer [256] ; + static const char *filename = "pipe_in.dat" ; + + SNDFILE *outfile ; + SF_INFO sfinfo ; + int retval ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.format = info.format | SF_FORMAT_PCM_16 ; + sfinfo.channels = 1 ; + sfinfo.samplerate = 44100 ; + + outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_writef_short_or_die (outfile, 0, data, PIPE_TEST_LEN, __LINE__) ; + sf_close (outfile) ; + + snprintf (buffer, sizeof (buffer), "cat %s | ./tests/stdin_test %s %d ", filename, info.extension, PIPE_TEST_LEN) ; + if ((retval = system (buffer)) == 0) + { retval = WEXITSTATUS (retval) ; + printf ("\n\n Line %d : pipe test should have returned error file type \"%s\" but didn't.\n\n", __LINE__, info.name) ; + exit (1) ; + } ; + + unlink (filename) ; + } ; + } ; + + + puts ("ok") ; + + return ; +} /* pipe_test_others */ + + +/*============================================================================== +*/ + +#endif + diff --git a/libsndfile-1.0.31/tests/pipe_test.def b/libsndfile-1.0.31/tests/pipe_test.def new file mode 100644 index 0000000..6469cca --- /dev/null +++ b/libsndfile-1.0.31/tests/pipe_test.def @@ -0,0 +1,14 @@ +autogen definitions pipe_test.tpl; + +data_type = { + type_name = short ; + }; + +data_type = { + type_name = float ; + }; + +data_type = { + type_name = double ; + }; + diff --git a/libsndfile-1.0.31/tests/pipe_test.tpl b/libsndfile-1.0.31/tests/pipe_test.tpl new file mode 100644 index 0000000..9bb30cc --- /dev/null +++ b/libsndfile-1.0.31/tests/pipe_test.tpl @@ -0,0 +1,362 @@ +[+ AutoGen5 template c +] +/* +** Copyright (C) 2001-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +/*========================================================================== +** This is a test program which tests reading from and writing to pipes. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#if (OS_IS_WIN32 || defined __OS2__ || HAVE_PIPE == 0 || HAVE_WAITPID == 0) + +int +main (void) +{ + puts (" pipe_test : this test doesn't work on this OS.") ; + return 0 ; +} /* main */ + +#else + +#if HAVE_UNISTD_H +#include +#endif + +#include +#include +#include +#include + +#include + +#include "utils.h" + +typedef struct +{ int format ; + const char *ext ; +} FILETYPE ; + +static void useek_pipe_rw_test (int filetype, const char *ext) ; +static void pipe_read_test (int filetype, const char *ext) ; +static void pipe_write_test (const char *ext) ; +static void pipe_test_others (FILETYPE*, FILETYPE*) ; + +static FILETYPE read_write_types [] = +{ { SF_FORMAT_RAW , "raw" }, + { SF_FORMAT_AU , "au" }, + /* Lite remove start */ + { SF_FORMAT_PAF , "paf" }, + { SF_FORMAT_IRCAM , "ircam" }, + { SF_FORMAT_PVF , "pvf" }, + /* Lite remove end */ + { 0 , NULL } +} ; + +static FILETYPE read_only_types [] = +{ { SF_FORMAT_RAW , "raw" }, + { SF_FORMAT_AU , "au" }, + { SF_FORMAT_AIFF , "aiff" }, + { SF_FORMAT_WAV , "wav" }, + { SF_FORMAT_W64 , "w64" }, + /* Lite remove start */ + { SF_FORMAT_PAF , "paf" }, + { SF_FORMAT_NIST , "nist" }, + { SF_FORMAT_IRCAM , "ircam" }, + { SF_FORMAT_MAT4 , "mat4" }, + { SF_FORMAT_MAT5 , "mat5" }, + { SF_FORMAT_SVX , "svx" }, + { SF_FORMAT_PVF , "pvf" }, + /* Lite remove end */ + { 0 , NULL } +} ; + +int +main (void) +{ int k ; + + for (k = 0 ; read_only_types [k].format ; k++) + pipe_read_test (read_only_types [k].format, read_only_types [k].ext) ; + + for (k = 0 ; read_write_types [k].format ; k++) + pipe_write_test (read_write_types [k].ext) ; + + for (k = 0 ; read_write_types [k].format ; k++) + useek_pipe_rw_test (read_write_types [k].format, read_write_types [k].ext) ; + + if (0) + pipe_test_others (read_write_types, read_only_types) ; + + return 0 ; +} /* main */ + +/*============================================================================== +*/ + +static void +pipe_read_test (int filetype, const char *ext) +{ static short data [PIPE_TEST_LEN] ; + static char buffer [256] ; + static char filename [256] ; + + SNDFILE *outfile ; + SF_INFO sfinfo ; + int k, retval ; + + snprintf (filename, sizeof (filename), "pipe_in.%s", ext) ; + print_test_name ("pipe_read_test", filename) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.format = filetype | SF_FORMAT_PCM_16 ; + sfinfo.channels = 1 ; + sfinfo.samplerate = 44100 ; + + for (k = 0 ; k < PIPE_TEST_LEN ; k++) + data [k] = PIPE_INDEX (k) ; + + outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_writef_short_or_die (outfile, 0, data, PIPE_TEST_LEN, __LINE__) ; + sf_close (outfile) ; + + snprintf (buffer, sizeof (buffer), "cat %s | ./tests/stdin_test %s ", filename, ext) ; + if ((retval = system (buffer)) != 0) + { retval = WEXITSTATUS (retval) ; + printf ("\n\n Line %d : pipe test returned error for file type \"%s\".\n\n", __LINE__, ext) ; + exit (retval) ; + } ; + + unlink (filename) ; + puts ("ok") ; + + return ; +} /* pipe_read_test */ + +static void +pipe_write_test (const char *ext) +{ static char buffer [256] ; + + int retval ; + + print_test_name ("pipe_write_test", ext) ; + + snprintf (buffer, sizeof (buffer), "./tests/stdout_test %s | ./tests/stdin_test %s ", ext, ext) ; + if ((retval = system (buffer))) + { retval = WEXITSTATUS (retval) ; + printf ("\n\n Line %d : pipe test returned error file type \"%s\".\n\n", __LINE__, ext) ; + exit (retval) ; + } ; + + puts ("ok") ; + + return ; +} /* pipe_write_test */ + +/*============================================================================== +*/ + +[+ FOR data_type +] +static void +useek_pipe_rw_[+ (get "type_name") +] (const char * ext, SF_INFO * psfinfo_write, SF_INFO * psfinfo_read) +{ static [+ (get "type_name") +] buffer [PIPE_TEST_LEN] ; + static [+ (get "type_name") +] data [PIPE_TEST_LEN] ; + SNDFILE *outfile ; + SNDFILE *infile_piped ; + + int k, status = 0 ; + int pipefd [2] ; + pid_t pida ; + + for (k = 0 ; k < PIPE_TEST_LEN ; k++) + data [k] = PIPE_INDEX (k) ; + + /* + ** Create the pipe. + */ + exit_if_true (pipe (pipefd) != 0, "\n\n%s %d : pipe failed : %s\n", __func__, __LINE__, strerror (errno)) ; + + /* + ** Attach the write end of the pipe to be written to. + */ + if ((outfile = sf_open_fd (pipefd [1], SFM_WRITE, psfinfo_write, SF_TRUE)) == NULL) + { printf ("\n\n%s %d : unable to create unseekable pipe for write type \"%s\".\n", __func__, __LINE__, ext) ; + printf ("\t%s\n\n", sf_strerror (outfile)) ; + exit (1) ; + } ; + + if (sf_error (outfile) != SF_ERR_NO_ERROR) + { printf ("\n\n%s %d : unable to open unseekable pipe for write type \"%s\".\n\n", __func__, __LINE__, ext) ; + exit (1) ; + } ; + + /* + ** Attach the read end of the pipe to be read from. + */ + if ((infile_piped = sf_open_fd (pipefd [0], SFM_READ, psfinfo_read, SF_TRUE)) == NULL) + { printf ("\n\n%s %d : unable to create unseekable pipe for read type. \"%s\".\n\n", __func__, __LINE__, ext) ; + exit (1) ; + } ; + + if (sf_error (infile_piped) != SF_ERR_NO_ERROR) + { printf ("\n\n%s %d : unable to open unseekable pipe for read type \"%s\".\n\n", __func__, __LINE__, ext) ; + exit (1) ; + } ; + + /* Fork a child process that will write directly into the pipe. */ + if ((pida = fork ()) == 0) /* child process */ + { test_writef_[+ (get "type_name") +]_or_die (outfile, 0, data, PIPE_TEST_LEN, __LINE__) ; + exit (0) ; + } ; + + /* In the parent process, read from the pipe and compare what is read + ** to what is written, if they match everything went as planned. + */ + test_readf_[+ (get "type_name") +]_or_die (infile_piped, 0, buffer, PIPE_TEST_LEN, __LINE__) ; + if (memcmp (buffer, data, sizeof (buffer)) != 0) + { printf ("\n\n%s %d : unseekable pipe test failed for file type \"%s\".\n\n", __func__, __LINE__, ext) ; + exit (1) ; + } ; + + /* Wait for the child process to return. */ + waitpid (pida, &status, 0) ; + status = WEXITSTATUS (status) ; + sf_close (outfile) ; + sf_close (infile_piped) ; + + if (status != 0) + { printf ("\n\n%s %d : status of child process is %d for file type %s.\n\n", __func__, __LINE__, status, ext) ; + exit (1) ; + } ; + + return ; +} /* useek_pipe_rw_[+ (get "type_name") +] */ + +[+ ENDFOR data_type +] + + +static void +useek_pipe_rw_test (int filetype, const char *ext) +{ SF_INFO sfinfo_write ; + SF_INFO sfinfo_read ; + + print_test_name ("useek_pipe_rw_test", ext) ; + + /* + ** Setup the INFO structures for the filetype we will be + ** working with. + */ + sfinfo_write.format = filetype | SF_FORMAT_PCM_16 ; + sfinfo_write.channels = 1 ; + sfinfo_write.samplerate = 44100 ; + + + sfinfo_read.format = 0 ; + if (filetype == SF_FORMAT_RAW) + { sfinfo_read.format = filetype | SF_FORMAT_PCM_16 ; + sfinfo_read.channels = 1 ; + sfinfo_read.samplerate = 44100 ; + } ; + + useek_pipe_rw_short (ext, &sfinfo_write, &sfinfo_read) ; + + sfinfo_read.format = sfinfo_write.format = filetype | SF_FORMAT_FLOAT ; + if (sf_format_check (&sfinfo_read) != 0) + useek_pipe_rw_float (ext, &sfinfo_write, &sfinfo_read) ; + + sfinfo_read.format = sfinfo_write.format = filetype | SF_FORMAT_DOUBLE ; + if (sf_format_check (&sfinfo_read) != 0) + useek_pipe_rw_double (ext, &sfinfo_write, &sfinfo_read) ; + + puts ("ok") ; + return ; +} /* useek_pipe_rw_test */ + + + +static void +pipe_test_others (FILETYPE* list1, FILETYPE* list2) +{ SF_FORMAT_INFO info ; + int k, m, major_count, in_list ; + + print_test_name ("pipe_test_others", "") ; + + sf_command (NULL, SFC_GET_FORMAT_MAJOR_COUNT, &major_count, sizeof (int)) ; + + for (k = 0 ; k < major_count ; k++) + { info.format = k ; + + sf_command (NULL, SFC_GET_FORMAT_MAJOR, &info, sizeof (info)) ; + + in_list = SF_FALSE ; + for (m = 0 ; list1 [m].format ; m++) + if (info.format == list1 [m].format) + in_list = SF_TRUE ; + + for (m = 0 ; list2 [m].format ; m++) + if (info.format == list2 [m].format) + in_list = SF_TRUE ; + + if (in_list) + continue ; + + printf ("%s %x\n", info.name, info.format) ; + + if (1) + { static short data [PIPE_TEST_LEN] ; + static char buffer [256] ; + static const char *filename = "pipe_in.dat" ; + + SNDFILE *outfile ; + SF_INFO sfinfo ; + int retval ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.format = info.format | SF_FORMAT_PCM_16 ; + sfinfo.channels = 1 ; + sfinfo.samplerate = 44100 ; + + outfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_writef_short_or_die (outfile, 0, data, PIPE_TEST_LEN, __LINE__) ; + sf_close (outfile) ; + + snprintf (buffer, sizeof (buffer), "cat %s | ./tests/stdin_test %s %d ", filename, info.extension, PIPE_TEST_LEN) ; + if ((retval = system (buffer)) == 0) + { retval = WEXITSTATUS (retval) ; + printf ("\n\n Line %d : pipe test should have returned error file type \"%s\" but didn't.\n\n", __LINE__, info.name) ; + exit (1) ; + } ; + + unlink (filename) ; + } ; + } ; + + + puts ("ok") ; + + return ; +} /* pipe_test_others */ + + +/*============================================================================== +*/ + +#endif + diff --git a/libsndfile-1.0.31/tests/raw_test.c b/libsndfile-1.0.31/tests/raw_test.c new file mode 100644 index 0000000..be0f94d --- /dev/null +++ b/libsndfile-1.0.31/tests/raw_test.c @@ -0,0 +1,189 @@ +/* +** Copyright (C) 2002-2014 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "utils.h" + +#define BUFFER_LEN (1 << 10) +#define LOG_BUFFER_SIZE 1024 + +static void raw_offset_test (const char *filename, int typeminor) ; +static void bad_raw_test (void) ; + +/* Force the start of this buffer to be double aligned. Sparc-solaris will +** choke if its not. +*/ +static short data [BUFFER_LEN] ; + +int +main (void) +{ + raw_offset_test ("offset.raw", SF_FORMAT_PCM_16) ; + bad_raw_test () ; + + return 0 ; +} /* main */ + +/*============================================================================================ +** Here are the test functions. +*/ + +static void +raw_offset_test (const char *filename, int typeminor) +{ SNDFILE *sndfile ; + SF_INFO sfinfo ; + sf_count_t start ; + int k ; + + print_test_name ("raw_offset_test", filename) ; + + sfinfo.samplerate = 44100 ; + sfinfo.format = SF_FORMAT_RAW | typeminor ; + sfinfo.channels = 1 ; + sfinfo.frames = 0 ; + + sndfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; + + start = 0 ; + sf_command (sndfile, SFC_FILE_TRUNCATE, &start, sizeof (start)) ; + + for (k = 0 ; k < BUFFER_LEN ; k++) + data [k] = k ; + test_write_short_or_die (sndfile, 0, data, BUFFER_LEN, __LINE__) ; + + sf_close (sndfile) ; + + sndfile = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + check_log_buffer_or_die (sndfile, __LINE__) ; + + if (ABS (BUFFER_LEN - sfinfo.frames) > 1) + { printf ("\n\nLine %d : Incorrect sample count (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, BUFFER_LEN) ; + dump_log_buffer (sndfile) ; + exit (1) ; + } ; + + memset (data, 0 , sizeof (data)) ; + test_read_short_or_die (sndfile, 0, data, BUFFER_LEN, __LINE__) ; + for (k = 0 ; k < BUFFER_LEN ; k++) + if (data [k] != k) + printf ("Error : line %d\n", __LINE__) ; + + /* Set dataoffset to 2 bytes from beginning of file. */ + start = 2 ; + sf_command (sndfile, SFC_SET_RAW_START_OFFSET, &start, sizeof (start)) ; + + /* Seek to new start */ + test_seek_or_die (sndfile, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + memset (data, 0 , sizeof (data)) ; + test_read_short_or_die (sndfile, 0, data, BUFFER_LEN - 1, __LINE__) ; + for (k = 0 ; k < BUFFER_LEN - 1 ; k++) + if (data [k] != k + 1) + { printf ("Error : line %d\n", __LINE__) ; + exit (1) ; + } ; + + /* Set dataoffset to 4 bytes from beginning of file. */ + start = 4 ; + sf_command (sndfile, SFC_SET_RAW_START_OFFSET, &start, sizeof (start)) ; + + /* Seek to new start */ + test_seek_or_die (sndfile, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + memset (data, 0 , sizeof (data)) ; + test_read_short_or_die (sndfile, 0, data, BUFFER_LEN - 2, __LINE__) ; + for (k = 0 ; k < BUFFER_LEN - 2 ; k++) + if (data [k] != k + 2) + { printf ("Error : line %d\n", __LINE__) ; + exit (1) ; + } ; + + /* Set dataoffset back to 0 bytes from beginning of file. */ + start = 0 ; + sf_command (sndfile, SFC_SET_RAW_START_OFFSET, &start, sizeof (start)) ; + + /* Seek to new start */ + test_seek_or_die (sndfile, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + memset (data, 0 , sizeof (data)) ; + test_read_short_or_die (sndfile, 0, data, BUFFER_LEN, __LINE__) ; + for (k = 0 ; k < BUFFER_LEN ; k++) + if (data [k] != k) + { printf ("Error : line %d\n", __LINE__) ; + exit (1) ; + } ; + + sf_close (sndfile) ; + unlink (filename) ; + + puts ("ok") ; +} /* raw_offset_test */ + +static void +bad_raw_test (void) +{ FILE *textfile ; + SNDFILE *file ; + SF_INFO sfinfo ; + const char *errorstr, *filename = "bad.raw" ; + + print_test_name ("bad_raw_test", filename) ; + + if ((textfile = fopen (filename, "w")) == NULL) + { printf ("\n\nLine %d : not able to open text file for write.\n", __LINE__) ; + exit (1) ; + } ; + + fprintf (textfile, "This is not a valid file.\n") ; + fclose (textfile) ; + + sfinfo.samplerate = 44100 ; + sfinfo.format = SF_FORMAT_RAW | 0xABCD ; + sfinfo.channels = 1 ; + + if ((file = sf_open (filename, SFM_READ, &sfinfo)) != NULL) + { printf ("\n\nLine %d : Error, file should not have opened.\n", __LINE__ - 1) ; + exit (1) ; + } ; + + errorstr = sf_strerror (file) ; + + if (strstr (errorstr, "Bad format field in SF_INFO struct") == NULL) + { printf ("\n\nLine %d : Error bad error string : %s.\n", __LINE__ - 1, errorstr) ; + exit (1) ; + } ; + + unlink (filename) ; + + puts ("ok") ; +} /* bad_raw_test */ + diff --git a/libsndfile-1.0.31/tests/rdwr_test.c b/libsndfile-1.0.31/tests/rdwr_test.c new file mode 100644 index 0000000..def53e2 --- /dev/null +++ b/libsndfile-1.0.31/tests/rdwr_test.c @@ -0,0 +1,240 @@ +/* +** Copyright (C) 2010-2012 Erik de Castro Lopo +** +** This program is free software ; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation ; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY ; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#include +#include + +#if HAVE_UNISTD_H +#include +#endif + +#if (HAVE_DECL_S_IRGRP == 0) +#include +#endif + +#if (defined (WIN32) || defined (_WIN32)) +#include +#include +#endif + +#include + +#include "utils.h" + +static void rdwr_short_test (const char *filename) ; +static void rdwr_int_test (const char *filename) ; +static void rdwr_float_test (const char *filename) ; +static void rdwr_double_test (const char *filename) ; +static void rdwr_raw_test (const char *filename) ; + + +int +main (void) +{ + rdwr_short_test ("rdwr_short.wav") ; + rdwr_int_test ("rdwr_int.wav") ; + rdwr_float_test ("rdwr_float.wav") ; + rdwr_double_test ("rdwr_double.wav") ; + rdwr_raw_test ("rdwr_raw.wav") ; + + return 0 ; +} /* main */ + + +/*============================================================================================ +** Here are the test functions. +*/ + +static void +rdwr_short_test (const char *filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + sf_count_t frames ; + short buffer [160] ; + + print_test_name ("rdwr_short_test", filename) ; + + memset (buffer, 0, sizeof (buffer)) ; + + /* Create sound file with no data. */ + sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 ; + sfinfo.samplerate = 16000 ; + sfinfo.channels = 1 ; + + unlink (filename) ; + + frames = ARRAY_LEN (buffer) ; + + /* Open again for read/write. */ + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_short_or_die (file, 0, buffer, frames, __LINE__) ; + + test_read_short_or_die (file, 0, buffer, frames, __LINE__) ; + + sf_close (file) ; + unlink (filename) ; + + puts ("ok") ; + return ; +} /* rdwr_short_test */ + +static void +rdwr_int_test (const char *filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + sf_count_t frames ; + int buffer [160] ; + + print_test_name ("rdwr_int_test", filename) ; + + memset (buffer, 0, sizeof (buffer)) ; + + /* Create sound file with no data. */ + sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_32 ; + sfinfo.samplerate = 16000 ; + sfinfo.channels = 1 ; + + unlink (filename) ; + + frames = ARRAY_LEN (buffer) ; + + /* Open again for read/write. */ + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_int_or_die (file, 0, buffer, frames, __LINE__) ; + + test_read_int_or_die (file, 0, buffer, frames, __LINE__) ; + + sf_close (file) ; + unlink (filename) ; + + puts ("ok") ; + return ; +} /* rdwr_int_test */ + +static void +rdwr_float_test (const char *filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + sf_count_t frames ; + float buffer [160] ; + + print_test_name ("rdwr_float_test", filename) ; + + memset (buffer, 0, sizeof (buffer)) ; + + /* Create sound file with no data. */ + sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_FLOAT ; + sfinfo.samplerate = 16000 ; + sfinfo.channels = 1 ; + + unlink (filename) ; + + frames = ARRAY_LEN (buffer) ; + + /* Open again for read/write. */ + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_float_or_die (file, 0, buffer, frames, __LINE__) ; + + test_read_float_or_die (file, 0, buffer, frames, __LINE__) ; + + sf_close (file) ; + unlink (filename) ; + + puts ("ok") ; + return ; +} /* rdwr_float_test */ + +static void +rdwr_double_test (const char *filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + sf_count_t frames ; + double buffer [160] ; + + print_test_name ("rdwr_double_test", filename) ; + + memset (buffer, 0, sizeof (buffer)) ; + + /* Create sound file with no data. */ + sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_DOUBLE ; + sfinfo.samplerate = 16000 ; + sfinfo.channels = 1 ; + + unlink (filename) ; + + frames = ARRAY_LEN (buffer) ; + + /* Open again for read/write. */ + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_double_or_die (file, 0, buffer, frames, __LINE__) ; + + test_read_double_or_die (file, 0, buffer, frames, __LINE__) ; + + sf_close (file) ; + unlink (filename) ; + + puts ("ok") ; + return ; +} /* rdwr_double_test */ + +static void +rdwr_raw_test (const char *filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + sf_count_t frames ; + unsigned char buffer [160] ; + + print_test_name ("rdwr_raw_test", filename) ; + + memset (buffer, 0, sizeof (buffer)) ; + + /* Create sound file with no data. */ + sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_U8 ; + sfinfo.samplerate = 16000 ; + sfinfo.channels = 1 ; + + unlink (filename) ; + + frames = ARRAY_LEN (buffer) ; + + /* Open again for read/write. */ + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_raw_or_die (file, 0, buffer, frames, __LINE__) ; + + test_read_raw_or_die (file, 0, buffer, frames, __LINE__) ; + + sf_close (file) ; + unlink (filename) ; + + puts ("ok") ; + return ; +} /* rdwr_raw_test */ + + + diff --git a/libsndfile-1.0.31/tests/rdwr_test.def b/libsndfile-1.0.31/tests/rdwr_test.def new file mode 100644 index 0000000..43c1089 --- /dev/null +++ b/libsndfile-1.0.31/tests/rdwr_test.def @@ -0,0 +1,32 @@ +autogen definitions rdwr_test.tpl; + +data_type = { + name = "short" ; + type = "short" ; + format = "SF_FORMAT_PCM_16" ; + } ; + +data_type = { + name = "int" ; + type = "int" ; + format = "SF_FORMAT_PCM_32" ; + } ; + +data_type = { + name = "float" ; + type = "float" ; + format = "SF_FORMAT_FLOAT" ; + } ; + +data_type = { + name = "double" ; + type = "double" ; + format = "SF_FORMAT_DOUBLE" ; + } ; + +data_type = { + name = "raw" ; + type = "unsigned char" ; + format = "SF_FORMAT_PCM_U8" ; + } ; + diff --git a/libsndfile-1.0.31/tests/rdwr_test.tpl b/libsndfile-1.0.31/tests/rdwr_test.tpl new file mode 100644 index 0000000..8cfdd36 --- /dev/null +++ b/libsndfile-1.0.31/tests/rdwr_test.tpl @@ -0,0 +1,105 @@ +[+ AutoGen5 template c +] +/* +** Copyright (C) 2010-2012 Erik de Castro Lopo +** +** This program is free software ; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation ; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY ; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#include +#include + +#if HAVE_UNISTD_H +#include +#endif + +#if (HAVE_DECL_S_IRGRP == 0) +#include +#endif + +#if (defined (WIN32) || defined (_WIN32)) +#include +#include +#endif + +#include + +#include "utils.h" + +[+ FOR data_type ++]static void rdwr_[+ (get "name") +]_test (const char *filename) ; +[+ ENDFOR data_type ++] + +int +main (void) +{ + rdwr_short_test ("rdwr_short.wav") ; + rdwr_int_test ("rdwr_int.wav") ; + rdwr_float_test ("rdwr_float.wav") ; + rdwr_double_test ("rdwr_double.wav") ; + rdwr_raw_test ("rdwr_raw.wav") ; + + return 0 ; +} /* main */ + + +/*============================================================================================ +** Here are the test functions. +*/ + +[+ FOR data_type ++]static void +rdwr_[+ (get "name") +]_test (const char *filename) +{ SNDFILE *file ; + SF_INFO sfinfo ; + sf_count_t frames ; + [+ (get "type") +] buffer [160] ; + + print_test_name ("rdwr_[+ (get "name") +]_test", filename) ; + + memset (buffer, 0, sizeof (buffer)) ; + + /* Create sound file with no data. */ + sfinfo.format = SF_FORMAT_WAV | [+ (get "format") +] ; + sfinfo.samplerate = 16000 ; + sfinfo.channels = 1 ; + + unlink (filename) ; + + frames = ARRAY_LEN (buffer) ; + + /* Open again for read/write. */ + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; + + test_write_[+ (get "name") +]_or_die (file, 0, buffer, frames, __LINE__) ; + + test_read_[+ (get "name") +]_or_die (file, 0, buffer, frames, __LINE__) ; + + sf_close (file) ; + unlink (filename) ; + + puts ("ok") ; + return ; +} /* rdwr_[+ (get "name") +]_test */ + +[+ ENDFOR data_type ++] + diff --git a/libsndfile-1.0.31/tests/scale_clip_test.c b/libsndfile-1.0.31/tests/scale_clip_test.c new file mode 100644 index 0000000..bea6043 --- /dev/null +++ b/libsndfile-1.0.31/tests/scale_clip_test.c @@ -0,0 +1,1855 @@ +/* +** Copyright (C) 1999-2012 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "utils.h" + +#ifndef M_PI +#define M_PI 3.14159265358979323846264338 +#endif + +#define HALF_BUFFER_SIZE (1 << 12) +#define BUFFER_SIZE (2 * HALF_BUFFER_SIZE) + +#define SINE_AMP 1.1 +#define MAX_ERROR 0.0202 + + +static void flt_scale_clip_test_16 (const char *filename, int filetype, float maxval) ; +static void flt_scale_clip_test_24 (const char *filename, int filetype, float maxval) ; +static void flt_scale_clip_test_32 (const char *filename, int filetype, float maxval) ; +static void flt_scale_clip_test_08 (const char *filename, int filetype, float maxval) ; + +static void dbl_scale_clip_test_16 (const char *filename, int filetype, float maxval) ; +static void dbl_scale_clip_test_24 (const char *filename, int filetype, float maxval) ; +static void dbl_scale_clip_test_32 (const char *filename, int filetype, float maxval) ; +static void dbl_scale_clip_test_08 (const char *filename, int filetype, float maxval) ; + + + +static void flt_short_clip_read_test (const char *filename, int filetype) ; +static void flt_int_clip_read_test (const char *filename, int filetype) ; + +static void dbl_short_clip_read_test (const char *filename, int filetype) ; +static void dbl_int_clip_read_test (const char *filename, int filetype) ; + + + +static void short_flt_scale_write_test (const char *filename, int filetype) ; +static void short_dbl_scale_write_test (const char *filename, int filetype) ; + +static void int_flt_scale_write_test (const char *filename, int filetype) ; +static void int_dbl_scale_write_test (const char *filename, int filetype) ; + + +typedef union +{ double dbl [BUFFER_SIZE] ; + float flt [BUFFER_SIZE] ; + int i [BUFFER_SIZE] ; + short s [BUFFER_SIZE] ; +} BUFFER ; + +/* Data buffer. */ +static BUFFER buffer_out ; +static BUFFER buffer_in ; + +int +main (void) +{ + flt_scale_clip_test_08 ("scale_clip_s8.au", SF_FORMAT_AU | SF_FORMAT_PCM_S8, 1.0 * 0x80) ; + flt_scale_clip_test_08 ("scale_clip_u8.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8, 1.0 * 0x80) ; + + dbl_scale_clip_test_08 ("scale_clip_s8.au", SF_FORMAT_AU | SF_FORMAT_PCM_S8, 1.0 * 0x80) ; + dbl_scale_clip_test_08 ("scale_clip_u8.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8, 1.0 * 0x80) ; + + /* + ** Now use SF_FORMAT_AU where possible because it allows both + ** big and little endian files. + */ + + flt_scale_clip_test_16 ("scale_clip_be16.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_16, 1.0 * 0x8000) ; + flt_scale_clip_test_16 ("scale_clip_le16.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_16, 1.0 * 0x8000) ; + flt_scale_clip_test_24 ("scale_clip_be24.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_24, 1.0 * 0x800000) ; + flt_scale_clip_test_24 ("scale_clip_le24.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_24, 1.0 * 0x800000) ; + flt_scale_clip_test_32 ("scale_clip_be32.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_32, 1.0 * 0x80000000) ; + flt_scale_clip_test_32 ("scale_clip_le32.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_32, 1.0 * 0x80000000) ; + + dbl_scale_clip_test_16 ("scale_clip_be16.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_16, 1.0 * 0x8000) ; + dbl_scale_clip_test_16 ("scale_clip_le16.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_16, 1.0 * 0x8000) ; + dbl_scale_clip_test_24 ("scale_clip_be24.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_24, 1.0 * 0x800000) ; + dbl_scale_clip_test_24 ("scale_clip_le24.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_24, 1.0 * 0x800000) ; + dbl_scale_clip_test_32 ("scale_clip_be32.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_32, 1.0 * 0x80000000) ; + dbl_scale_clip_test_32 ("scale_clip_le32.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_32, 1.0 * 0x80000000) ; + + flt_short_clip_read_test ("flt_short.au" , SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_FLOAT) ; + flt_int_clip_read_test ("flt_int.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_FLOAT) ; + dbl_short_clip_read_test ("dbl_short.au" , SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_DOUBLE) ; + dbl_int_clip_read_test ("dbl_int.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_DOUBLE) ; + + short_flt_scale_write_test ("short_flt.au" , SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_FLOAT) ; + int_flt_scale_write_test ("int_flt.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_FLOAT) ; + short_dbl_scale_write_test ("short_dbl.au" , SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_DOUBLE) ; + int_dbl_scale_write_test ("int_dbl.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_DOUBLE) ; + + return 0 ; +} /* main */ + +/*============================================================================================ +** Here are the test functions. +*/ + + +static void +flt_scale_clip_test_16 (const char *filename, int filetype, float maxval) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k ; + float *data_out, *data_in ; + double diff, clip_max_diff ; + + print_test_name ("flt_scale_clip_test_16", filename) ; + + data_out = buffer_out.flt ; + data_in = buffer_in.flt ; + + for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) + { data_out [k] = 1.2 * sin (2 * M_PI * k / HALF_BUFFER_SIZE) ; + data_out [k + HALF_BUFFER_SIZE] = data_out [k] * maxval ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + /* + ** Write two versions of the data: + ** normalized and clipped + ** un-normalized and clipped. + */ + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; + test_write_float_or_die (file, 0, data_out, HALF_BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + test_write_float_or_die (file, 0, data_out + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + memset (&buffer_in, 0, sizeof (buffer_in)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != BUFFER_SIZE) + { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_float_or_die (file, 0, data_in, HALF_BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + test_read_float_or_die (file, 0, data_in + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + /* Check normalized version. */ + clip_max_diff = 0.0 ; + for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) + { if (fabs (data_in [k]) > 1.0) + { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; + exit (1) ; + } ; + + if (data_out [k] * data_in [k] < 0.0) + { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; + exit (1) ; + } ; + + if (fabs (data_out [k]) > 1.0) + continue ; + + diff = fabs (data_out [k] - data_in [k]) ; + if (diff > clip_max_diff) + clip_max_diff = diff ; + } ; + + if (clip_max_diff < 1e-20) + { printf ("\n\nLine %d: Clipping difference (%e) too small (normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + if (clip_max_diff > 1.0 / 0x8000) + { printf ("\n\nLine %d: Clipping difference (%e) too large (normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + /* Check the un-normalized data. */ + clip_max_diff = 0.0 ; + for (k = HALF_BUFFER_SIZE ; k < BUFFER_SIZE ; k++) + { if (fabs (data_in [k]) > maxval) + { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; + exit (1) ; + } ; + + if (data_out [k] * data_in [k] < 0.0) + { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; + exit (1) ; + } ; + + if (fabs (data_out [k]) > maxval) + continue ; + + diff = fabs (data_out [k] - data_in [k]) ; + if (diff > clip_max_diff) + clip_max_diff = diff ; + } ; + + if (clip_max_diff < 1e-20) + { printf ("\n\nLine %d: Clipping difference (%e) too small (un-normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + if (clip_max_diff > 1.0) + { printf ("\n\nLine %d: Clipping difference (%e) too large (un-normalised).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + printf ("ok\n") ; + unlink (filename) ; +} /* flt_scale_clip_test_16 */ + +static void +flt_scale_clip_test_24 (const char *filename, int filetype, float maxval) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k ; + float *data_out, *data_in ; + double diff, clip_max_diff ; + + print_test_name ("flt_scale_clip_test_24", filename) ; + + data_out = buffer_out.flt ; + data_in = buffer_in.flt ; + + for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) + { data_out [k] = 1.2 * sin (2 * M_PI * k / HALF_BUFFER_SIZE) ; + data_out [k + HALF_BUFFER_SIZE] = data_out [k] * maxval ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + /* + ** Write two versions of the data: + ** normalized and clipped + ** un-normalized and clipped. + */ + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; + test_write_float_or_die (file, 0, data_out, HALF_BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + test_write_float_or_die (file, 0, data_out + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + memset (&buffer_in, 0, sizeof (buffer_in)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != BUFFER_SIZE) + { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_float_or_die (file, 0, data_in, HALF_BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + test_read_float_or_die (file, 0, data_in + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + /* Check normalized version. */ + clip_max_diff = 0.0 ; + for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) + { if (fabs (data_in [k]) > 1.0) + { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; + exit (1) ; + } ; + + if (data_out [k] * data_in [k] < 0.0) + { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; + exit (1) ; + } ; + + if (fabs (data_out [k]) > 1.0) + continue ; + + diff = fabs (data_out [k] - data_in [k]) ; + if (diff > clip_max_diff) + clip_max_diff = diff ; + } ; + + if (clip_max_diff < 1e-20) + { printf ("\n\nLine %d: Clipping difference (%e) too small (normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + if (clip_max_diff > 1.0 / 0x800000) + { printf ("\n\nLine %d: Clipping difference (%e) too large (normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + /* Check the un-normalized data. */ + clip_max_diff = 0.0 ; + for (k = HALF_BUFFER_SIZE ; k < BUFFER_SIZE ; k++) + { if (fabs (data_in [k]) > maxval) + { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; + exit (1) ; + } ; + + if (data_out [k] * data_in [k] < 0.0) + { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; + exit (1) ; + } ; + + if (fabs (data_out [k]) > maxval) + continue ; + + diff = fabs (data_out [k] - data_in [k]) ; + if (diff > clip_max_diff) + clip_max_diff = diff ; + } ; + + if (clip_max_diff < 1e-20) + { printf ("\n\nLine %d: Clipping difference (%e) too small (un-normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + if (clip_max_diff > 1.0) + { printf ("\n\nLine %d: Clipping difference (%e) too large (un-normalised).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + printf ("ok\n") ; + unlink (filename) ; +} /* flt_scale_clip_test_24 */ + +static void +flt_scale_clip_test_32 (const char *filename, int filetype, float maxval) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k ; + float *data_out, *data_in ; + double diff, clip_max_diff ; + + print_test_name ("flt_scale_clip_test_32", filename) ; + + data_out = buffer_out.flt ; + data_in = buffer_in.flt ; + + for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) + { data_out [k] = 1.2 * sin (2 * M_PI * k / HALF_BUFFER_SIZE) ; + data_out [k + HALF_BUFFER_SIZE] = data_out [k] * maxval ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + /* + ** Write two versions of the data: + ** normalized and clipped + ** un-normalized and clipped. + */ + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; + test_write_float_or_die (file, 0, data_out, HALF_BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + test_write_float_or_die (file, 0, data_out + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + memset (&buffer_in, 0, sizeof (buffer_in)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != BUFFER_SIZE) + { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_float_or_die (file, 0, data_in, HALF_BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + test_read_float_or_die (file, 0, data_in + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + /* Check normalized version. */ + clip_max_diff = 0.0 ; + for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) + { if (fabs (data_in [k]) > 1.0) + { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; + exit (1) ; + } ; + + if (data_out [k] * data_in [k] < 0.0) + { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; + exit (1) ; + } ; + + if (fabs (data_out [k]) > 1.0) + continue ; + + diff = fabs (data_out [k] - data_in [k]) ; + if (diff > clip_max_diff) + clip_max_diff = diff ; + } ; + + if (clip_max_diff < 1e-20) + { printf ("\n\nLine %d: Clipping difference (%e) too small (normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + if (clip_max_diff > 1.0 / 0x80000000) + { printf ("\n\nLine %d: Clipping difference (%e) too large (normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + /* Check the un-normalized data. */ + clip_max_diff = 0.0 ; + for (k = HALF_BUFFER_SIZE ; k < BUFFER_SIZE ; k++) + { if (fabs (data_in [k]) > maxval) + { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; + exit (1) ; + } ; + + if (data_out [k] * data_in [k] < 0.0) + { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; + exit (1) ; + } ; + + if (fabs (data_out [k]) > maxval) + continue ; + + diff = fabs (data_out [k] - data_in [k]) ; + if (diff > clip_max_diff) + clip_max_diff = diff ; + } ; + + if (clip_max_diff < 1e-20) + { printf ("\n\nLine %d: Clipping difference (%e) too small (un-normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + if (clip_max_diff > 1.0) + { printf ("\n\nLine %d: Clipping difference (%e) too large (un-normalised).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + printf ("ok\n") ; + unlink (filename) ; +} /* flt_scale_clip_test_32 */ + +static void +flt_scale_clip_test_08 (const char *filename, int filetype, float maxval) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k ; + float *data_out, *data_in ; + double diff, clip_max_diff ; + + print_test_name ("flt_scale_clip_test_08", filename) ; + + data_out = buffer_out.flt ; + data_in = buffer_in.flt ; + + for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) + { data_out [k] = 1.2 * sin (2 * M_PI * k / HALF_BUFFER_SIZE) ; + data_out [k + HALF_BUFFER_SIZE] = data_out [k] * maxval ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + /* + ** Write two versions of the data: + ** normalized and clipped + ** un-normalized and clipped. + */ + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; + test_write_float_or_die (file, 0, data_out, HALF_BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + test_write_float_or_die (file, 0, data_out + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + memset (&buffer_in, 0, sizeof (buffer_in)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != BUFFER_SIZE) + { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_float_or_die (file, 0, data_in, HALF_BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; + test_read_float_or_die (file, 0, data_in + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + /* Check normalized version. */ + clip_max_diff = 0.0 ; + for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) + { if (fabs (data_in [k]) > 1.0) + { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; + exit (1) ; + } ; + + if (data_out [k] * data_in [k] < 0.0) + { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; + exit (1) ; + } ; + + if (fabs (data_out [k]) > 1.0) + continue ; + + diff = fabs (data_out [k] - data_in [k]) ; + if (diff > clip_max_diff) + clip_max_diff = diff ; + } ; + + if (clip_max_diff < 1e-20) + { printf ("\n\nLine %d: Clipping difference (%e) too small (normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + if (clip_max_diff > 1.0 / 0x80) + { printf ("\n\nLine %d: Clipping difference (%e) too large (normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + /* Check the un-normalized data. */ + clip_max_diff = 0.0 ; + for (k = HALF_BUFFER_SIZE ; k < BUFFER_SIZE ; k++) + { if (fabs (data_in [k]) > maxval) + { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; + exit (1) ; + } ; + + if (data_out [k] * data_in [k] < 0.0) + { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; + exit (1) ; + } ; + + if (fabs (data_out [k]) > maxval) + continue ; + + diff = fabs (data_out [k] - data_in [k]) ; + if (diff > clip_max_diff) + clip_max_diff = diff ; + } ; + + if (clip_max_diff < 1e-20) + { printf ("\n\nLine %d: Clipping difference (%e) too small (un-normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + if (clip_max_diff > 1.0) + { printf ("\n\nLine %d: Clipping difference (%e) too large (un-normalised).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + printf ("ok\n") ; + unlink (filename) ; +} /* flt_scale_clip_test_08 */ + + + +static void +dbl_scale_clip_test_16 (const char *filename, int filetype, float maxval) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k ; + double *data_out, *data_in ; + double diff, clip_max_diff ; + + print_test_name ("dbl_scale_clip_test_16", filename) ; + + data_out = buffer_out.dbl ; + data_in = buffer_in.dbl ; + + for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) + { data_out [k] = 1.2 * sin (2 * M_PI * k / HALF_BUFFER_SIZE) ; + data_out [k + HALF_BUFFER_SIZE] = data_out [k] * maxval ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + /* + ** Write two versions of the data: + ** normalized and clipped + ** un-normalized and clipped. + */ + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; + test_write_double_or_die (file, 0, data_out, HALF_BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + test_write_double_or_die (file, 0, data_out + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + memset (&buffer_in, 0, sizeof (buffer_in)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != BUFFER_SIZE) + { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_double_or_die (file, 0, data_in, HALF_BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + test_read_double_or_die (file, 0, data_in + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + /* Check normalized version. */ + clip_max_diff = 0.0 ; + for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) + { if (fabs (data_in [k]) > 1.0) + { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; + exit (1) ; + } ; + + if (data_out [k] * data_in [k] < 0.0) + { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; + exit (1) ; + } ; + + if (fabs (data_out [k]) > 1.0) + continue ; + + diff = fabs (data_out [k] - data_in [k]) ; + if (diff > clip_max_diff) + clip_max_diff = diff ; + } ; + + if (clip_max_diff < 1e-20) + { printf ("\n\nLine %d: Clipping difference (%e) too small (normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + if (clip_max_diff > 1.0 / 0x8000) + { printf ("\n\nLine %d: Clipping difference (%e) too large (normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + /* Check the un-normalized data. */ + clip_max_diff = 0.0 ; + for (k = HALF_BUFFER_SIZE ; k < BUFFER_SIZE ; k++) + { if (fabs (data_in [k]) > maxval) + { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; + exit (1) ; + } ; + + if (data_out [k] * data_in [k] < 0.0) + { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; + exit (1) ; + } ; + + if (fabs (data_out [k]) > maxval) + continue ; + + diff = fabs (data_out [k] - data_in [k]) ; + if (diff > clip_max_diff) + clip_max_diff = diff ; + } ; + + if (clip_max_diff < 1e-20) + { printf ("\n\nLine %d: Clipping difference (%e) too small (un-normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + if (clip_max_diff > 1.0) + { printf ("\n\nLine %d: Clipping difference (%e) too large (un-normalised).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + printf ("ok\n") ; + unlink (filename) ; +} /* dbl_scale_clip_test_16 */ + +static void +dbl_scale_clip_test_24 (const char *filename, int filetype, float maxval) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k ; + double *data_out, *data_in ; + double diff, clip_max_diff ; + + print_test_name ("dbl_scale_clip_test_24", filename) ; + + data_out = buffer_out.dbl ; + data_in = buffer_in.dbl ; + + for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) + { data_out [k] = 1.2 * sin (2 * M_PI * k / HALF_BUFFER_SIZE) ; + data_out [k + HALF_BUFFER_SIZE] = data_out [k] * maxval ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + /* + ** Write two versions of the data: + ** normalized and clipped + ** un-normalized and clipped. + */ + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; + test_write_double_or_die (file, 0, data_out, HALF_BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + test_write_double_or_die (file, 0, data_out + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + memset (&buffer_in, 0, sizeof (buffer_in)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != BUFFER_SIZE) + { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_double_or_die (file, 0, data_in, HALF_BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + test_read_double_or_die (file, 0, data_in + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + /* Check normalized version. */ + clip_max_diff = 0.0 ; + for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) + { if (fabs (data_in [k]) > 1.0) + { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; + exit (1) ; + } ; + + if (data_out [k] * data_in [k] < 0.0) + { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; + exit (1) ; + } ; + + if (fabs (data_out [k]) > 1.0) + continue ; + + diff = fabs (data_out [k] - data_in [k]) ; + if (diff > clip_max_diff) + clip_max_diff = diff ; + } ; + + if (clip_max_diff < 1e-20) + { printf ("\n\nLine %d: Clipping difference (%e) too small (normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + if (clip_max_diff > 1.0 / 0x800000) + { printf ("\n\nLine %d: Clipping difference (%e) too large (normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + /* Check the un-normalized data. */ + clip_max_diff = 0.0 ; + for (k = HALF_BUFFER_SIZE ; k < BUFFER_SIZE ; k++) + { if (fabs (data_in [k]) > maxval) + { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; + exit (1) ; + } ; + + if (data_out [k] * data_in [k] < 0.0) + { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; + exit (1) ; + } ; + + if (fabs (data_out [k]) > maxval) + continue ; + + diff = fabs (data_out [k] - data_in [k]) ; + if (diff > clip_max_diff) + clip_max_diff = diff ; + } ; + + if (clip_max_diff < 1e-20) + { printf ("\n\nLine %d: Clipping difference (%e) too small (un-normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + if (clip_max_diff > 1.0) + { printf ("\n\nLine %d: Clipping difference (%e) too large (un-normalised).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + printf ("ok\n") ; + unlink (filename) ; +} /* dbl_scale_clip_test_24 */ + +static void +dbl_scale_clip_test_32 (const char *filename, int filetype, float maxval) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k ; + double *data_out, *data_in ; + double diff, clip_max_diff ; + + print_test_name ("dbl_scale_clip_test_32", filename) ; + + data_out = buffer_out.dbl ; + data_in = buffer_in.dbl ; + + for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) + { data_out [k] = 1.2 * sin (2 * M_PI * k / HALF_BUFFER_SIZE) ; + data_out [k + HALF_BUFFER_SIZE] = data_out [k] * maxval ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + /* + ** Write two versions of the data: + ** normalized and clipped + ** un-normalized and clipped. + */ + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; + test_write_double_or_die (file, 0, data_out, HALF_BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + test_write_double_or_die (file, 0, data_out + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + memset (&buffer_in, 0, sizeof (buffer_in)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != BUFFER_SIZE) + { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_double_or_die (file, 0, data_in, HALF_BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + test_read_double_or_die (file, 0, data_in + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + /* Check normalized version. */ + clip_max_diff = 0.0 ; + for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) + { if (fabs (data_in [k]) > 1.0) + { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; + exit (1) ; + } ; + + if (data_out [k] * data_in [k] < 0.0) + { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; + exit (1) ; + } ; + + if (fabs (data_out [k]) > 1.0) + continue ; + + diff = fabs (data_out [k] - data_in [k]) ; + if (diff > clip_max_diff) + clip_max_diff = diff ; + } ; + + if (clip_max_diff < 1e-20) + { printf ("\n\nLine %d: Clipping difference (%e) too small (normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + if (clip_max_diff > 1.0 / 0x80000000) + { printf ("\n\nLine %d: Clipping difference (%e) too large (normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + /* Check the un-normalized data. */ + clip_max_diff = 0.0 ; + for (k = HALF_BUFFER_SIZE ; k < BUFFER_SIZE ; k++) + { if (fabs (data_in [k]) > maxval) + { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; + exit (1) ; + } ; + + if (data_out [k] * data_in [k] < 0.0) + { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; + exit (1) ; + } ; + + if (fabs (data_out [k]) > maxval) + continue ; + + diff = fabs (data_out [k] - data_in [k]) ; + if (diff > clip_max_diff) + clip_max_diff = diff ; + } ; + + if (clip_max_diff < 1e-20) + { printf ("\n\nLine %d: Clipping difference (%e) too small (un-normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + if (clip_max_diff > 1.0) + { printf ("\n\nLine %d: Clipping difference (%e) too large (un-normalised).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + printf ("ok\n") ; + unlink (filename) ; +} /* dbl_scale_clip_test_32 */ + +static void +dbl_scale_clip_test_08 (const char *filename, int filetype, float maxval) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k ; + double *data_out, *data_in ; + double diff, clip_max_diff ; + + print_test_name ("dbl_scale_clip_test_08", filename) ; + + data_out = buffer_out.dbl ; + data_in = buffer_in.dbl ; + + for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) + { data_out [k] = 1.2 * sin (2 * M_PI * k / HALF_BUFFER_SIZE) ; + data_out [k + HALF_BUFFER_SIZE] = data_out [k] * maxval ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + /* + ** Write two versions of the data: + ** normalized and clipped + ** un-normalized and clipped. + */ + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; + test_write_double_or_die (file, 0, data_out, HALF_BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + test_write_double_or_die (file, 0, data_out + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + memset (&buffer_in, 0, sizeof (buffer_in)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != BUFFER_SIZE) + { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_double_or_die (file, 0, data_in, HALF_BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ; + test_read_double_or_die (file, 0, data_in + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + /* Check normalized version. */ + clip_max_diff = 0.0 ; + for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) + { if (fabs (data_in [k]) > 1.0) + { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; + exit (1) ; + } ; + + if (data_out [k] * data_in [k] < 0.0) + { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; + exit (1) ; + } ; + + if (fabs (data_out [k]) > 1.0) + continue ; + + diff = fabs (data_out [k] - data_in [k]) ; + if (diff > clip_max_diff) + clip_max_diff = diff ; + } ; + + if (clip_max_diff < 1e-20) + { printf ("\n\nLine %d: Clipping difference (%e) too small (normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + if (clip_max_diff > 1.0 / 0x80) + { printf ("\n\nLine %d: Clipping difference (%e) too large (normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + /* Check the un-normalized data. */ + clip_max_diff = 0.0 ; + for (k = HALF_BUFFER_SIZE ; k < BUFFER_SIZE ; k++) + { if (fabs (data_in [k]) > maxval) + { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; + exit (1) ; + } ; + + if (data_out [k] * data_in [k] < 0.0) + { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; + exit (1) ; + } ; + + if (fabs (data_out [k]) > maxval) + continue ; + + diff = fabs (data_out [k] - data_in [k]) ; + if (diff > clip_max_diff) + clip_max_diff = diff ; + } ; + + if (clip_max_diff < 1e-20) + { printf ("\n\nLine %d: Clipping difference (%e) too small (un-normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + if (clip_max_diff > 1.0) + { printf ("\n\nLine %d: Clipping difference (%e) too large (un-normalised).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + printf ("ok\n") ; + unlink (filename) ; +} /* dbl_scale_clip_test_08 */ + + + + +/*============================================================================== +*/ + + +static void flt_short_clip_read_test (const char *filename, int filetype) +{ SNDFILE *file ; + SF_INFO sfinfo ; + float *data_out ; + short *data_in, max_value ; + int k ; + + print_test_name ("flt_short_clip_read_test", filename) ; + + data_out = buffer_out.flt ; + data_in = buffer_in.s ; + + for (k = 0 ; k < BUFFER_SIZE ; k++) + data_out [k] = 0.995 * sin (4 * M_PI * k / BUFFER_SIZE) ; + data_out [BUFFER_SIZE / 8] = 1.0 ; + data_out [3 * BUFFER_SIZE / 8] = -1.000000001 ; + data_out [5 * BUFFER_SIZE / 8] = 1.0 ; + data_out [7 * BUFFER_SIZE / 8] = -1.000000001 ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + /* Save unclipped data to the file. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_float_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; + + sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != BUFFER_SIZE) + { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; + test_read_short_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + /*-sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;-*/ + sf_close (file) ; + + /* Check the first half. */ + max_value = 0 ; + for (k = 0 ; k < sfinfo.frames ; k++) + { /* Check if data_out has different sign from data_in. */ + if ((data_out [k] < 0.0 && data_in [k] > 0) || (data_out [k] > 0.0 && data_in [k] < 0)) + { printf ("\n\nLine %d: Data wrap around at index %d/%d (%f -> %d).\n\n", __LINE__, k, BUFFER_SIZE, data_out [k], data_in [k]) ; + exit (1) ; + } ; + max_value = (max_value > abs (data_in [k])) ? max_value : abs (data_in [k]) ; + } ; + + unlink (filename) ; + puts ("ok") ; +} /* flt_short_clip_read_test */ +static void flt_int_clip_read_test (const char *filename, int filetype) +{ SNDFILE *file ; + SF_INFO sfinfo ; + float *data_out ; + int *data_in, max_value ; + int k ; + + print_test_name ("flt_int_clip_read_test", filename) ; + + data_out = buffer_out.flt ; + data_in = buffer_in.i ; + + for (k = 0 ; k < BUFFER_SIZE ; k++) + data_out [k] = 0.995 * sin (4 * M_PI * k / BUFFER_SIZE) ; + data_out [BUFFER_SIZE / 8] = 1.0 ; + data_out [3 * BUFFER_SIZE / 8] = -1.000000001 ; + data_out [5 * BUFFER_SIZE / 8] = 1.0 ; + data_out [7 * BUFFER_SIZE / 8] = -1.000000001 ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + /* Save unclipped data to the file. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_float_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; + + sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != BUFFER_SIZE) + { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; + test_read_int_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + /*-sf_command (file, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ;-*/ + sf_close (file) ; + + /* Check the first half. */ + max_value = 0 ; + for (k = 0 ; k < sfinfo.frames ; k++) + { /* Check if data_out has different sign from data_in. */ + if ((data_out [k] < 0.0 && data_in [k] > 0) || (data_out [k] > 0.0 && data_in [k] < 0)) + { printf ("\n\nLine %d: Data wrap around at index %d/%d (%f -> %d).\n\n", __LINE__, k, BUFFER_SIZE, data_out [k], data_in [k]) ; + exit (1) ; + } ; + max_value = (max_value > abs (data_in [k])) ? max_value : abs (data_in [k]) ; + } ; + + unlink (filename) ; + puts ("ok") ; +} /* flt_int_clip_read_test */ + +static void dbl_short_clip_read_test (const char *filename, int filetype) +{ SNDFILE *file ; + SF_INFO sfinfo ; + double *data_out ; + short *data_in, max_value ; + int k ; + + print_test_name ("dbl_short_clip_read_test", filename) ; + + data_out = buffer_out.dbl ; + data_in = buffer_in.s ; + + for (k = 0 ; k < BUFFER_SIZE ; k++) + data_out [k] = 0.995 * sin (4 * M_PI * k / BUFFER_SIZE) ; + data_out [BUFFER_SIZE / 8] = 1.0 ; + data_out [3 * BUFFER_SIZE / 8] = -1.000000001 ; + data_out [5 * BUFFER_SIZE / 8] = 1.0 ; + data_out [7 * BUFFER_SIZE / 8] = -1.000000001 ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + /* Save unclipped data to the file. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_double_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; + + sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != BUFFER_SIZE) + { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; + test_read_short_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + /*-sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;-*/ + sf_close (file) ; + + /* Check the first half. */ + max_value = 0 ; + for (k = 0 ; k < sfinfo.frames ; k++) + { /* Check if data_out has different sign from data_in. */ + if ((data_out [k] < 0.0 && data_in [k] > 0) || (data_out [k] > 0.0 && data_in [k] < 0)) + { printf ("\n\nLine %d: Data wrap around at index %d/%d (%f -> %d).\n\n", __LINE__, k, BUFFER_SIZE, data_out [k], data_in [k]) ; + exit (1) ; + } ; + max_value = (max_value > abs (data_in [k])) ? max_value : abs (data_in [k]) ; + } ; + + unlink (filename) ; + puts ("ok") ; +} /* dbl_short_clip_read_test */ +static void dbl_int_clip_read_test (const char *filename, int filetype) +{ SNDFILE *file ; + SF_INFO sfinfo ; + double *data_out ; + int *data_in, max_value ; + int k ; + + print_test_name ("dbl_int_clip_read_test", filename) ; + + data_out = buffer_out.dbl ; + data_in = buffer_in.i ; + + for (k = 0 ; k < BUFFER_SIZE ; k++) + data_out [k] = 0.995 * sin (4 * M_PI * k / BUFFER_SIZE) ; + data_out [BUFFER_SIZE / 8] = 1.0 ; + data_out [3 * BUFFER_SIZE / 8] = -1.000000001 ; + data_out [5 * BUFFER_SIZE / 8] = 1.0 ; + data_out [7 * BUFFER_SIZE / 8] = -1.000000001 ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + /* Save unclipped data to the file. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_double_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; + + sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != BUFFER_SIZE) + { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; + test_read_int_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + /*-sf_command (file, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;-*/ + sf_close (file) ; + + /* Check the first half. */ + max_value = 0 ; + for (k = 0 ; k < sfinfo.frames ; k++) + { /* Check if data_out has different sign from data_in. */ + if ((data_out [k] < 0.0 && data_in [k] > 0) || (data_out [k] > 0.0 && data_in [k] < 0)) + { printf ("\n\nLine %d: Data wrap around at index %d/%d (%f -> %d).\n\n", __LINE__, k, BUFFER_SIZE, data_out [k], data_in [k]) ; + exit (1) ; + } ; + max_value = (max_value > abs (data_in [k])) ? max_value : abs (data_in [k]) ; + } ; + + unlink (filename) ; + puts ("ok") ; +} /* dbl_int_clip_read_test */ + + +/*============================================================================== +*/ + + +static void short_flt_scale_write_test (const char *filename, int filetype) +{ SNDFILE *file ; + SF_INFO sfinfo ; + short *data_out ; + float *data_in, max_value ; + int k ; + + print_test_name ("short_flt_clip_write_test", filename) ; + + data_out = buffer_out.s ; + data_in = buffer_in.flt ; + + for (k = 0 ; k < BUFFER_SIZE ; k++) + data_out [k] = lrintf (0x7FFFF * 0.995 * sin (4 * M_PI * k / BUFFER_SIZE)) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_short_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_TRUE) ; + test_write_short_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_FALSE) ; + test_write_short_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != 3 * BUFFER_SIZE) + { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, 3 * BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + /* Check the first section. */ + test_read_float_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + + max_value = 0.0 ; + for (k = 0 ; k < BUFFER_SIZE ; k++) + max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; + + if (max_value < 1000.0) + { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; + exit (1) ; + } ; + + /* Check the second section. */ + test_read_float_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + + max_value = 0.0 ; + for (k = 0 ; k < BUFFER_SIZE ; k++) + max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; + + if (max_value > 1.0) + { printf ("\n\nLine %d: Max value (%f) > 1.0.\n\n", __LINE__, max_value) ; + exit (1) ; + } ; + + /* Check the third section. */ + test_read_float_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + + max_value = 0.0 ; + for (k = 0 ; k < BUFFER_SIZE ; k++) + max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; + + if (max_value < 1000.0) + { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; + exit (1) ; + } ; + + sf_close (file) ; + + unlink (filename) ; + puts ("ok") ; +} /* short_flt_scale_write_test */ +static void short_dbl_scale_write_test (const char *filename, int filetype) +{ SNDFILE *file ; + SF_INFO sfinfo ; + short *data_out ; + double *data_in, max_value ; + int k ; + + print_test_name ("short_dbl_clip_write_test", filename) ; + + data_out = buffer_out.s ; + data_in = buffer_in.dbl ; + + for (k = 0 ; k < BUFFER_SIZE ; k++) + data_out [k] = lrint (0x7FFFF * 0.995 * sin (4 * M_PI * k / BUFFER_SIZE)) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_short_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_TRUE) ; + test_write_short_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_FALSE) ; + test_write_short_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != 3 * BUFFER_SIZE) + { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, 3 * BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + /* Check the first section. */ + test_read_double_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + + max_value = 0.0 ; + for (k = 0 ; k < BUFFER_SIZE ; k++) + max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; + + if (max_value < 1000.0) + { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; + exit (1) ; + } ; + + /* Check the second section. */ + test_read_double_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + + max_value = 0.0 ; + for (k = 0 ; k < BUFFER_SIZE ; k++) + max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; + + if (max_value > 1.0) + { printf ("\n\nLine %d: Max value (%f) > 1.0.\n\n", __LINE__, max_value) ; + exit (1) ; + } ; + + /* Check the third section. */ + test_read_double_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + + max_value = 0.0 ; + for (k = 0 ; k < BUFFER_SIZE ; k++) + max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; + + if (max_value < 1000.0) + { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; + exit (1) ; + } ; + + sf_close (file) ; + + unlink (filename) ; + puts ("ok") ; +} /* short_dbl_scale_write_test */ + +static void int_flt_scale_write_test (const char *filename, int filetype) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int *data_out ; + float *data_in, max_value ; + int k ; + + print_test_name ("int_flt_clip_write_test", filename) ; + + data_out = buffer_out.i ; + data_in = buffer_in.flt ; + + for (k = 0 ; k < BUFFER_SIZE ; k++) + data_out [k] = lrintf (0x7FFFFFFF * 0.995 * sin (4 * M_PI * k / BUFFER_SIZE)) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_int_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_TRUE) ; + test_write_int_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_FALSE) ; + test_write_int_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != 3 * BUFFER_SIZE) + { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, 3 * BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + /* Check the first section. */ + test_read_float_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + + max_value = 0.0 ; + for (k = 0 ; k < BUFFER_SIZE ; k++) + max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; + + if (max_value < 1000.0) + { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; + exit (1) ; + } ; + + /* Check the second section. */ + test_read_float_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + + max_value = 0.0 ; + for (k = 0 ; k < BUFFER_SIZE ; k++) + max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; + + if (max_value > 1.0) + { printf ("\n\nLine %d: Max value (%f) > 1.0.\n\n", __LINE__, max_value) ; + exit (1) ; + } ; + + /* Check the third section. */ + test_read_float_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + + max_value = 0.0 ; + for (k = 0 ; k < BUFFER_SIZE ; k++) + max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; + + if (max_value < 1000.0) + { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; + exit (1) ; + } ; + + sf_close (file) ; + + unlink (filename) ; + puts ("ok") ; +} /* int_flt_scale_write_test */ +static void int_dbl_scale_write_test (const char *filename, int filetype) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int *data_out ; + double *data_in, max_value ; + int k ; + + print_test_name ("int_dbl_clip_write_test", filename) ; + + data_out = buffer_out.i ; + data_in = buffer_in.dbl ; + + for (k = 0 ; k < BUFFER_SIZE ; k++) + data_out [k] = lrint (0x7FFFFFFF * 0.995 * sin (4 * M_PI * k / BUFFER_SIZE)) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_int_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_TRUE) ; + test_write_int_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_FALSE) ; + test_write_int_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != 3 * BUFFER_SIZE) + { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, 3 * BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + /* Check the first section. */ + test_read_double_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + + max_value = 0.0 ; + for (k = 0 ; k < BUFFER_SIZE ; k++) + max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; + + if (max_value < 1000.0) + { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; + exit (1) ; + } ; + + /* Check the second section. */ + test_read_double_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + + max_value = 0.0 ; + for (k = 0 ; k < BUFFER_SIZE ; k++) + max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; + + if (max_value > 1.0) + { printf ("\n\nLine %d: Max value (%f) > 1.0.\n\n", __LINE__, max_value) ; + exit (1) ; + } ; + + /* Check the third section. */ + test_read_double_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + + max_value = 0.0 ; + for (k = 0 ; k < BUFFER_SIZE ; k++) + max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; + + if (max_value < 1000.0) + { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; + exit (1) ; + } ; + + sf_close (file) ; + + unlink (filename) ; + puts ("ok") ; +} /* int_dbl_scale_write_test */ + + + diff --git a/libsndfile-1.0.31/tests/scale_clip_test.def b/libsndfile-1.0.31/tests/scale_clip_test.def new file mode 100644 index 0000000..9974f11 --- /dev/null +++ b/libsndfile-1.0.31/tests/scale_clip_test.def @@ -0,0 +1,56 @@ +autogen definitions scale_clip_test.tpl; + +float_type = { + float_type_name = "float" ; + float_short_name = "flt" ; + float_upper_name = "FLOAT" ; + float_to_int = "lrintf" ; + } ; + +float_type = { + float_type_name = "double" ; + float_short_name = "dbl" ; + float_upper_name = "DOUBLE" ; + float_to_int = "lrint" ; + } ; + + + +int_type = { + int_type_name = "short" ; + int_short_name = "s" ; + int_max_value = "0x7FFFF" ; + } ; + +int_type = { + int_type_name = "int" ; + int_short_name = "i" ; + int_max_value = "0x7FFFFFFF" ; + } ; + + + +data_type = { + name = "16" ; + bit_count = 16 ; + error_val = "1.0 / 0x8000" ; + } ; + +data_type = { + name = "24" ; + bit_count = 24 ; + error_val = "1.0 / 0x800000" ; + } ; + +data_type = { + name = "32" ; + bit_count = 32 ; + error_val = "1.0 / 0x80000000" ; + } ; + +data_type = { + name = "08" ; + bit_count = 8 ; + error_val = "1.0 / 0x80" ; + } ; + diff --git a/libsndfile-1.0.31/tests/scale_clip_test.tpl b/libsndfile-1.0.31/tests/scale_clip_test.tpl new file mode 100644 index 0000000..ad59ce1 --- /dev/null +++ b/libsndfile-1.0.31/tests/scale_clip_test.tpl @@ -0,0 +1,440 @@ +[+ AutoGen5 template c +] +/* +** Copyright (C) 1999-2012 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "utils.h" + +#ifndef M_PI +#define M_PI 3.14159265358979323846264338 +#endif + +#define HALF_BUFFER_SIZE (1 << 12) +#define BUFFER_SIZE (2 * HALF_BUFFER_SIZE) + +#define SINE_AMP 1.1 +#define MAX_ERROR 0.0202 + +[+ FOR float_type +] +[+ FOR data_type ++]static void [+ (get "float_short_name") +]_scale_clip_test_[+ (get "name") +] (const char *filename, int filetype, float maxval) ; +[+ ENDFOR data_type ++][+ ENDFOR float_type +] + +[+ FOR float_type +] +[+ FOR int_type ++]static void [+ (get "float_short_name") +]_[+ (get "int_type_name") +]_clip_read_test (const char *filename, int filetype) ; +[+ ENDFOR int_type ++][+ ENDFOR float_type +] + +[+ FOR int_type +] +[+ FOR float_type ++]static void [+ (get "int_type_name") +]_[+ (get "float_short_name") +]_scale_write_test (const char *filename, int filetype) ; +[+ ENDFOR float_type ++][+ ENDFOR int_type +] + +typedef union +{ double dbl [BUFFER_SIZE] ; + float flt [BUFFER_SIZE] ; + int i [BUFFER_SIZE] ; + short s [BUFFER_SIZE] ; +} BUFFER ; + +/* Data buffer. */ +static BUFFER buffer_out ; +static BUFFER buffer_in ; + +int +main (void) +{ + flt_scale_clip_test_08 ("scale_clip_s8.au", SF_FORMAT_AU | SF_FORMAT_PCM_S8, 1.0 * 0x80) ; + flt_scale_clip_test_08 ("scale_clip_u8.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8, 1.0 * 0x80) ; + + dbl_scale_clip_test_08 ("scale_clip_s8.au", SF_FORMAT_AU | SF_FORMAT_PCM_S8, 1.0 * 0x80) ; + dbl_scale_clip_test_08 ("scale_clip_u8.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8, 1.0 * 0x80) ; + + /* + ** Now use SF_FORMAT_AU where possible because it allows both + ** big and little endian files. + */ + + flt_scale_clip_test_16 ("scale_clip_be16.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_16, 1.0 * 0x8000) ; + flt_scale_clip_test_16 ("scale_clip_le16.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_16, 1.0 * 0x8000) ; + flt_scale_clip_test_24 ("scale_clip_be24.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_24, 1.0 * 0x800000) ; + flt_scale_clip_test_24 ("scale_clip_le24.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_24, 1.0 * 0x800000) ; + flt_scale_clip_test_32 ("scale_clip_be32.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_32, 1.0 * 0x80000000) ; + flt_scale_clip_test_32 ("scale_clip_le32.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_32, 1.0 * 0x80000000) ; + + dbl_scale_clip_test_16 ("scale_clip_be16.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_16, 1.0 * 0x8000) ; + dbl_scale_clip_test_16 ("scale_clip_le16.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_16, 1.0 * 0x8000) ; + dbl_scale_clip_test_24 ("scale_clip_be24.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_24, 1.0 * 0x800000) ; + dbl_scale_clip_test_24 ("scale_clip_le24.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_24, 1.0 * 0x800000) ; + dbl_scale_clip_test_32 ("scale_clip_be32.au", SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_PCM_32, 1.0 * 0x80000000) ; + dbl_scale_clip_test_32 ("scale_clip_le32.au", SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_32, 1.0 * 0x80000000) ; + + flt_short_clip_read_test ("flt_short.au" , SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_FLOAT) ; + flt_int_clip_read_test ("flt_int.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_FLOAT) ; + dbl_short_clip_read_test ("dbl_short.au" , SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_DOUBLE) ; + dbl_int_clip_read_test ("dbl_int.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_DOUBLE) ; + + short_flt_scale_write_test ("short_flt.au" , SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_FLOAT) ; + int_flt_scale_write_test ("int_flt.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_FLOAT) ; + short_dbl_scale_write_test ("short_dbl.au" , SF_ENDIAN_BIG | SF_FORMAT_AU | SF_FORMAT_DOUBLE) ; + int_dbl_scale_write_test ("int_dbl.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_DOUBLE) ; + + return 0 ; +} /* main */ + +/*============================================================================================ +** Here are the test functions. +*/ + +[+ FOR float_type +] +[+ FOR data_type ++]static void +[+ (get "float_short_name") +]_scale_clip_test_[+ (get "name") +] (const char *filename, int filetype, float maxval) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int k ; + [+ (get "float_type_name") +] *data_out, *data_in ; + double diff, clip_max_diff ; + + print_test_name ("[+ (get "float_short_name") +]_scale_clip_test_[+ (get "name") +]", filename) ; + + data_out = buffer_out.[+ (get "float_short_name") +] ; + data_in = buffer_in.[+ (get "float_short_name") +] ; + + for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) + { data_out [k] = 1.2 * sin (2 * M_PI * k / HALF_BUFFER_SIZE) ; + data_out [k + HALF_BUFFER_SIZE] = data_out [k] * maxval ; + } ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + /* + ** Write two versions of the data: + ** normalized and clipped + ** un-normalized and clipped. + */ + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; + test_write_[+ (get "float_type_name") +]_or_die (file, 0, data_out, HALF_BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_NORM_[+ (get "float_upper_name") +], NULL, SF_FALSE) ; + test_write_[+ (get "float_type_name") +]_or_die (file, 0, data_out + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + memset (&buffer_in, 0, sizeof (buffer_in)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != BUFFER_SIZE) + { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_[+ (get "float_type_name") +]_or_die (file, 0, data_in, HALF_BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_NORM_[+ (get "float_upper_name") +], NULL, SF_FALSE) ; + test_read_[+ (get "float_type_name") +]_or_die (file, 0, data_in + HALF_BUFFER_SIZE, HALF_BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + /* Check normalized version. */ + clip_max_diff = 0.0 ; + for (k = 0 ; k < HALF_BUFFER_SIZE ; k++) + { if (fabs (data_in [k]) > 1.0) + { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; + exit (1) ; + } ; + + if (data_out [k] * data_in [k] < 0.0) + { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; + exit (1) ; + } ; + + if (fabs (data_out [k]) > 1.0) + continue ; + + diff = fabs (data_out [k] - data_in [k]) ; + if (diff > clip_max_diff) + clip_max_diff = diff ; + } ; + + if (clip_max_diff < 1e-20) + { printf ("\n\nLine %d: Clipping difference (%e) too small (normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + if (clip_max_diff > [+ (get "error_val") +]) + { printf ("\n\nLine %d: Clipping difference (%e) too large (normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + /* Check the un-normalized data. */ + clip_max_diff = 0.0 ; + for (k = HALF_BUFFER_SIZE ; k < BUFFER_SIZE ; k++) + { if (fabs (data_in [k]) > maxval) + { printf ("\n\nLine %d: Input sample %d/%d (%f) has not been clipped.\n\n", __LINE__, k, BUFFER_SIZE, data_in [k]) ; + exit (1) ; + } ; + + if (data_out [k] * data_in [k] < 0.0) + { printf ("\n\nLine %d: Data wrap around at index %d/%d.\n\n", __LINE__, k, BUFFER_SIZE) ; + exit (1) ; + } ; + + if (fabs (data_out [k]) > maxval) + continue ; + + diff = fabs (data_out [k] - data_in [k]) ; + if (diff > clip_max_diff) + clip_max_diff = diff ; + } ; + + if (clip_max_diff < 1e-20) + { printf ("\n\nLine %d: Clipping difference (%e) too small (un-normalized).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + if (clip_max_diff > 1.0) + { printf ("\n\nLine %d: Clipping difference (%e) too large (un-normalised).\n\n", __LINE__, clip_max_diff) ; + exit (1) ; + } ; + + printf ("ok\n") ; + unlink (filename) ; +} /* [+ (get "float_short_name") +]_scale_clip_test_[+ (get "name") +] */ + +[+ ENDFOR data_type ++] +[+ ENDFOR float_type +] + +/*============================================================================== +*/ + +[+ FOR float_type +] +[+ FOR int_type ++]static void [+ (get "float_short_name") +]_[+ (get "int_type_name") +]_clip_read_test (const char *filename, int filetype) +{ SNDFILE *file ; + SF_INFO sfinfo ; + [+ (get "float_type_name") +] *data_out ; + [+ (get "int_type_name") +] *data_in, max_value ; + int k ; + + print_test_name ("[+ (get "float_short_name") +]_[+ (get "int_type_name") +]_clip_read_test", filename) ; + + data_out = buffer_out.[+ (get "float_short_name") +] ; + data_in = buffer_in.[+ (get "int_short_name") +] ; + + for (k = 0 ; k < BUFFER_SIZE ; k++) + data_out [k] = 0.995 * sin (4 * M_PI * k / BUFFER_SIZE) ; + data_out [BUFFER_SIZE / 8] = 1.0 ; + data_out [3 * BUFFER_SIZE / 8] = -1.000000001 ; + data_out [5 * BUFFER_SIZE / 8] = 1.0 ; + data_out [7 * BUFFER_SIZE / 8] = -1.000000001 ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + /* Save unclipped data to the file. */ + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_[+ (get "float_type_name") +]_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE) ; + + sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != BUFFER_SIZE) + { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + sf_command (file, SFC_SET_CLIPPING, NULL, SF_TRUE) ; + test_read_[+ (get "int_type_name") +]_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + /*-sf_command (file, SFC_SET_NORM_[+ (get "float_upper_name") +], NULL, SF_FALSE) ;-*/ + sf_close (file) ; + + /* Check the first half. */ + max_value = 0 ; + for (k = 0 ; k < sfinfo.frames ; k++) + { /* Check if data_out has different sign from data_in. */ + if ((data_out [k] < 0.0 && data_in [k] > 0) || (data_out [k] > 0.0 && data_in [k] < 0)) + { printf ("\n\nLine %d: Data wrap around at index %d/%d (%f -> %d).\n\n", __LINE__, k, BUFFER_SIZE, data_out [k], data_in [k]) ; + exit (1) ; + } ; + max_value = (max_value > abs (data_in [k])) ? max_value : abs (data_in [k]) ; + } ; + + unlink (filename) ; + puts ("ok") ; +} /* [+ (get "float_short_name") +]_[+ (get "int_type_name") +]_clip_read_test */ +[+ ENDFOR int_type ++][+ ENDFOR float_type +] + +/*============================================================================== +*/ + +[+ FOR int_type +] +[+ FOR float_type ++]static void [+ (get "int_type_name") +]_[+ (get "float_short_name") +]_scale_write_test (const char *filename, int filetype) +{ SNDFILE *file ; + SF_INFO sfinfo ; + [+ (get "int_type_name") +] *data_out ; + [+ (get "float_type_name") +] *data_in, max_value ; + int k ; + + print_test_name ("[+ (get "int_type_name") +]_[+ (get "float_short_name") +]_clip_write_test", filename) ; + + data_out = buffer_out.[+ (get "int_short_name") +] ; + data_in = buffer_in.[+ (get "float_short_name") +] ; + + for (k = 0 ; k < BUFFER_SIZE ; k++) + data_out [k] = [+ (get "float_to_int") +] ([+ (get "int_max_value") +] * 0.995 * sin (4 * M_PI * k / BUFFER_SIZE)) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.frames = 123456789 ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = filetype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_[+ (get "int_type_name") +]_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_TRUE) ; + test_write_[+ (get "int_type_name") +]_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_command (file, SFC_SET_SCALE_INT_FLOAT_WRITE, NULL, SF_FALSE) ; + test_write_[+ (get "int_type_name") +]_or_die (file, 0, data_out, BUFFER_SIZE, __LINE__) ; + sf_close (file) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + sfinfo.format &= (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK) ; + + if (sfinfo.format != (filetype & (SF_FORMAT_TYPEMASK | SF_FORMAT_SUBMASK))) + { printf ("\n\nLine %d: Returned format incorrect (0x%08X => 0x%08X).\n\n", __LINE__, filetype, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames != 3 * BUFFER_SIZE) + { printf ("\n\nLine %d: Incorrect number of frames in file (%d => %" PRId64 ").\n\n", __LINE__, 3 * BUFFER_SIZE, sfinfo.frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d: Incorrect number of channels in file.\n\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + /* Check the first section. */ + test_read_[+ (get "float_type_name") +]_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + + max_value = 0.0 ; + for (k = 0 ; k < BUFFER_SIZE ; k++) + max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; + + if (max_value < 1000.0) + { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; + exit (1) ; + } ; + + /* Check the second section. */ + test_read_[+ (get "float_type_name") +]_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + + max_value = 0.0 ; + for (k = 0 ; k < BUFFER_SIZE ; k++) + max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; + + if (max_value > 1.0) + { printf ("\n\nLine %d: Max value (%f) > 1.0.\n\n", __LINE__, max_value) ; + exit (1) ; + } ; + + /* Check the third section. */ + test_read_[+ (get "float_type_name") +]_or_die (file, 0, data_in, BUFFER_SIZE, __LINE__) ; + + max_value = 0.0 ; + for (k = 0 ; k < BUFFER_SIZE ; k++) + max_value = (max_value > fabs (data_in [k])) ? max_value : fabs (data_in [k]) ; + + if (max_value < 1000.0) + { printf ("\n\nLine %d: Max value (%f) < 1000.0.\n\n", __LINE__, max_value) ; + exit (1) ; + } ; + + sf_close (file) ; + + unlink (filename) ; + puts ("ok") ; +} /* [+ (get "int_type_name") +]_[+ (get "float_short_name") +]_scale_write_test */ +[+ ENDFOR float_type ++][+ ENDFOR int_type +] + + diff --git a/libsndfile-1.0.31/tests/sfversion.c b/libsndfile-1.0.31/tests/sfversion.c new file mode 100644 index 0000000..6caa77a --- /dev/null +++ b/libsndfile-1.0.31/tests/sfversion.c @@ -0,0 +1,48 @@ +/* +** Copyright (C) 1999-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#include + +#define BUFFER_SIZE (256) + + +int +main (void) +{ static char strbuffer [BUFFER_SIZE] ; + const char * ver ; + + sf_command (NULL, SFC_GET_LIB_VERSION, strbuffer, sizeof (strbuffer)) ; + ver = sf_version_string () ; + + if (strcmp (ver, strbuffer) != 0) + { printf ("Version mismatch : '%s' != '%s'\n\n", ver, strbuffer) ; + exit (1) ; + } ; + + printf ("%s", strbuffer) ; + + return 0 ; +} /* main */ + diff --git a/libsndfile-1.0.31/tests/stdin_test.c b/libsndfile-1.0.31/tests/stdin_test.c new file mode 100644 index 0000000..651614a --- /dev/null +++ b/libsndfile-1.0.31/tests/stdin_test.c @@ -0,0 +1,206 @@ +/* +** Copyright (C) 2001-2012 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "utils.h" + +#define BUFFER_LEN (1 << 16) + +static void stdin_test (int typemajor, int count) ; + +int +main (int argc, char *argv []) +{ int do_all = 0, test_count = 0 ; + + if (BUFFER_LEN < PIPE_TEST_LEN) + { fprintf (stderr, "Error : BUFFER_LEN < PIPE_TEST_LEN.\n\n") ; + exit (1) ; + } ; + + if (argc != 2) + { fprintf (stderr, "This program cannot be run by itself. It needs\n") ; + fprintf (stderr, "to be run from the stdio_test program.\n") ; + exit (1) ; + } ; + + do_all = ! strcmp (argv [1], "all") ; + + if (do_all || ! strcmp (argv [1], "raw")) + { stdin_test (SF_FORMAT_RAW, PIPE_TEST_LEN) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "wav")) + { stdin_test (SF_FORMAT_WAV, PIPE_TEST_LEN) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "aiff")) + { stdin_test (SF_FORMAT_AIFF, PIPE_TEST_LEN) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "au")) + { stdin_test (SF_FORMAT_AU, PIPE_TEST_LEN) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "paf")) + { stdin_test (SF_FORMAT_PAF, PIPE_TEST_LEN) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "svx")) + { stdin_test (SF_FORMAT_SVX, PIPE_TEST_LEN) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "nist")) + { stdin_test (SF_FORMAT_NIST, PIPE_TEST_LEN) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "ircam")) + { stdin_test (SF_FORMAT_IRCAM, PIPE_TEST_LEN) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "voc")) + { stdin_test (SF_FORMAT_VOC, PIPE_TEST_LEN) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "w64")) + { stdin_test (SF_FORMAT_W64, PIPE_TEST_LEN) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mat4")) + { stdin_test (SF_FORMAT_MAT4, PIPE_TEST_LEN) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mat5")) + { stdin_test (SF_FORMAT_MAT5, PIPE_TEST_LEN) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "pvf")) + { stdin_test (SF_FORMAT_PVF, PIPE_TEST_LEN) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "htk")) + { stdin_test (SF_FORMAT_HTK, PIPE_TEST_LEN) ; + test_count++ ; + } ; + + if (test_count == 0) + { fprintf (stderr, "\n*****************************************\n") ; + fprintf (stderr, "* stdin_test : No '%s' test defined.\n", argv [1]) ; + fprintf (stderr, "*****************************************\n") ; + return 1 ; + } ; + + return 0 ; +} /* main */ + +static void +stdin_test (int typemajor, int count) +{ static short data [BUFFER_LEN] ; + + SNDFILE *file ; + SF_INFO sfinfo ; + int k, total, err ; + + if (typemajor == SF_FORMAT_RAW) + { sfinfo.samplerate = 44100 ; + sfinfo.format = SF_FORMAT_RAW | SF_FORMAT_PCM_16 ; + sfinfo.channels = 1 ; + sfinfo.frames = 0 ; + } + else + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + if ((file = sf_open_fd (fileno (stdin), SFM_READ, &sfinfo, SF_TRUE)) == NULL) + { fprintf (stderr, "sf_open_fd failed with error : ") ; + puts (sf_strerror (NULL)) ; + dump_log_buffer (NULL) ; + exit (1) ; + } ; + + err = sf_error (file) ; + if (err != SF_ERR_NO_ERROR) + { printf ("Line %d : unexpected error : %s\n", __LINE__, sf_error_number (err)) ; + exit (1) ; + } ; + + if ((sfinfo.format & SF_FORMAT_TYPEMASK) != typemajor) + { fprintf (stderr, "\n\nError : File type doesn't match.\n") ; + exit (1) ; + } ; + + if (sfinfo.samplerate != 44100) + { fprintf (stderr, "\n\nError : Sample rate (%d) should be 44100\n", sfinfo.samplerate) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { fprintf (stderr, "\n\nError : Channels (%d) should be 1\n", sfinfo.channels) ; + exit (1) ; + } ; + + if (sfinfo.frames < count) + { fprintf (stderr, "\n\nError : Sample count (%ld) should be %d\n", (long) sfinfo.frames, count) ; + exit (1) ; + } ; + + total = 0 ; + while ((k = sf_read_short (file, data + total, BUFFER_LEN - total)) > 0) + total += k ; + + if (total != count) + { fprintf (stderr, "\n\nError : Expected %d frames, read %d.\n", count, total) ; + exit (1) ; + } ; + + for (k = 0 ; k < total ; k++) + if (data [k] != PIPE_INDEX (k)) + { printf ("\n\nError : data [%d] == %d, should have been %d.\n\n", k, data [k], k) ; + exit (1) ; + } ; + + sf_close (file) ; + + return ; +} /* stdin_test */ + diff --git a/libsndfile-1.0.31/tests/stdio_test.c b/libsndfile-1.0.31/tests/stdio_test.c new file mode 100644 index 0000000..a065a04 --- /dev/null +++ b/libsndfile-1.0.31/tests/stdio_test.c @@ -0,0 +1,141 @@ +/* +** Copyright (C) 2001-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +/*========================================================================== +** This is a test program which tests reading from stdin and writing to +** stdout. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include +#include + +#if HAVE_SYS_WAIT_H +#include +#endif + +#include "utils.h" + +/* EMX is OS/2. */ +#if (OS_IS_WIN32) || defined (__EMX__) + +int +main (void) +{ + puts (" stdio_test : this test doesn't work on win32.") ; + return 0 ; +} /* main */ + +#else + +#ifndef WIFEXITED +#define WIFEXITED(s) (((s) & 0xff) == 0) +#endif +#ifndef WEXITSTATUS +#define WEXITSTATUS(s) (((s) & 0xff00) >> 8) +#endif + + +static size_t file_length (const char *filename) ; +static void stdio_test (const char *filetype) ; + +static const char *filetypes [] = +{ "raw", "wav", "aiff", "au", "paf", "svx", "nist", "ircam", + "voc", "w64", "mat4", "mat5", "pvf", + NULL +} ; + +int +main (void) +{ int k ; + + for (k = 0 ; filetypes [k] ; k++) + stdio_test (filetypes [k]) ; + + return 0 ; +} /* main */ + + +static void +stdio_test (const char *filetype) +{ static char buffer [256] ; + + int file_size, retval ; + + print_test_name ("stdio_test", filetype) ; + + snprintf (buffer, sizeof (buffer), "./tests/stdout_test %s > stdio.%s", filetype, filetype) ; + if ((retval = system (buffer))) + { retval = WIFEXITED (retval) ? WEXITSTATUS (retval) : 1 ; + printf ("%s : %s", buffer, (strerror (retval))) ; + exit (1) ; + } ; + + snprintf (buffer, sizeof (buffer), "stdio.%s", filetype) ; + if ((file_size = file_length (buffer)) < PIPE_TEST_LEN) + { printf ("\n Error : test file '%s' too small (%d).\n\n", buffer, file_size) ; + exit (1) ; + } ; + + snprintf (buffer, sizeof (buffer), "./tests/stdin_test %s < stdio.%s", filetype, filetype) ; + if ((retval = system (buffer))) + { retval = WIFEXITED (retval) ? WEXITSTATUS (retval) : 1 ; + printf ("%s : %s", buffer, (strerror (retval))) ; + exit (1) ; + } ; + + snprintf (buffer, sizeof (buffer), "rm stdio.%s", filetype) ; + if ((retval = system (buffer))) + { retval = WIFEXITED (retval) ? WEXITSTATUS (retval) : 1 ; + printf ("%s : %s", buffer, (strerror (retval))) ; + exit (1) ; + } ; + + puts ("ok") ; + + return ; +} /* stdio_test */ + + + + +static size_t +file_length (const char *filename) +{ struct stat buf ; + + if (stat (filename, &buf)) + { perror (filename) ; + exit (1) ; + } ; + + return buf.st_size ; +} /* file_length */ + +#endif + diff --git a/libsndfile-1.0.31/tests/stdout_test.c b/libsndfile-1.0.31/tests/stdout_test.c new file mode 100644 index 0000000..a71ed64 --- /dev/null +++ b/libsndfile-1.0.31/tests/stdout_test.c @@ -0,0 +1,169 @@ +/* +** Copyright (C) 2001-2014 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "utils.h" + +static void stdout_test (int typemajor, int count) ; + +int +main (int argc, char *argv []) +{ int do_all, test_count = 0 ; + + if (argc != 2) + { fprintf (stderr, "This program cannot be run by itself. It needs\n") ; + fprintf (stderr, "to be run from the stdio_test program.\n") ; + exit (1) ; + } ; + + do_all = ! strcmp (argv [1], "all") ; + + if (do_all || ! strcmp (argv [1], "raw")) + { stdout_test (SF_FORMAT_RAW, PIPE_TEST_LEN) ; + test_count ++ ; + } ; + + if (do_all || ! strcmp (argv [1], "wav")) + { stdout_test (SF_FORMAT_WAV, PIPE_TEST_LEN) ; + test_count ++ ; + } ; + + if (do_all || ! strcmp (argv [1], "aiff")) + { stdout_test (SF_FORMAT_AIFF, PIPE_TEST_LEN) ; + test_count ++ ; + } ; + + if (do_all || ! strcmp (argv [1], "au")) + { stdout_test (SF_FORMAT_AU, PIPE_TEST_LEN) ; + test_count ++ ; + } ; + + if (do_all || ! strcmp (argv [1], "paf")) + { stdout_test (SF_FORMAT_PAF, PIPE_TEST_LEN) ; + test_count ++ ; + } ; + + if (do_all || ! strcmp (argv [1], "svx")) + { stdout_test (SF_FORMAT_SVX, PIPE_TEST_LEN) ; + test_count ++ ; + } ; + + if (do_all || ! strcmp (argv [1], "nist")) + { stdout_test (SF_FORMAT_NIST, PIPE_TEST_LEN) ; + test_count ++ ; + } ; + + if (do_all || ! strcmp (argv [1], "ircam")) + { stdout_test (SF_FORMAT_IRCAM, PIPE_TEST_LEN) ; + test_count ++ ; + } ; + + if (do_all || ! strcmp (argv [1], "voc")) + { stdout_test (SF_FORMAT_VOC, PIPE_TEST_LEN) ; + test_count ++ ; + } ; + + if (do_all || ! strcmp (argv [1], "w64")) + { stdout_test (SF_FORMAT_W64, PIPE_TEST_LEN) ; + test_count ++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mat4")) + { stdout_test (SF_FORMAT_MAT4, PIPE_TEST_LEN) ; + test_count ++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mat5")) + { stdout_test (SF_FORMAT_MAT5, PIPE_TEST_LEN) ; + test_count ++ ; + } ; + + if (do_all || ! strcmp (argv [1], "pvf")) + { stdout_test (SF_FORMAT_PVF, PIPE_TEST_LEN) ; + test_count ++ ; + } ; + + if (test_count == 0) + { fprintf (stderr, "\n******************************************\n") ; + fprintf (stderr, "* stdout_test : No '%s' test defined.\n", argv [1]) ; + fprintf (stderr, "******************************************\n") ; + return 1 ; + } ; + + return 0 ; +} /* main */ + +static void +stdout_test (int typemajor, int count) +{ static short data [PIPE_TEST_LEN] ; + + SNDFILE *file ; + SF_INFO sfinfo ; + int k, total, this_write ; + + sfinfo.samplerate = 44100 ; + sfinfo.format = (typemajor | SF_FORMAT_PCM_16) ; + sfinfo.channels = 1 ; + sfinfo.frames = 0 ; + + /* Create some random data. */ + for (k = 0 ; k < PIPE_TEST_LEN ; k++) + data [k] = PIPE_INDEX (k) ; + + if ((file = sf_open ("-", SFM_WRITE, &sfinfo)) == NULL) + { fprintf (stderr, "%s % d: sf_open_write failed with error : %s\n", + __func__, __LINE__, sf_strerror (NULL)) ; + exit (1) ; + } ; + + if (sfinfo.frames != 0) + { fprintf (stderr, "%s % d: Frames is %d (should be 0).\n", + __func__, __LINE__, (int) sfinfo.frames) ; + exit (1) ; + } ; + + total = 0 ; + + while (total < count) + { this_write = (count - total > 1024) ? 1024 : count - total ; + if ((k = sf_write_short (file, data + total, this_write)) != this_write) + { fprintf (stderr, "sf_write_short # %d failed with short write (%d -> %d)\n", count, this_write, k) ; + exit (1) ; + } ; + total += k ; + } ; + + sf_close (file) ; + + return ; +} /* stdout_test */ + diff --git a/libsndfile-1.0.31/tests/string_test.c b/libsndfile-1.0.31/tests/string_test.c new file mode 100644 index 0000000..70a0dfb --- /dev/null +++ b/libsndfile-1.0.31/tests/string_test.c @@ -0,0 +1,843 @@ +/* +** Copyright (C) 2003-2016 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "utils.h" + +#define BUFFER_LEN (1 << 10) +#define LOG_BUFFER_SIZE 1024 + +static void string_start_test (const char *filename, int typemajor) ; +static void string_start_end_test (const char *filename, int typemajor) ; +static void string_multi_set_test (const char *filename, int typemajor) ; +static void string_rdwr_test (const char *filename, int typemajor) ; +static void string_short_rdwr_test (const char *filename, int typemajor) ; +static void string_rdwr_grow_test (const char *filename, int typemajor) ; +static void string_header_update (const char *filename, int typemajor) ; + +static void software_string_test (const char *filename) ; + +static int str_count (const char * haystack, const char * needle) ; + +int +main (int argc, char *argv []) +{ int do_all = 0 ; + int test_count = 0 ; + + if (argc != 2) + { printf ("Usage : %s \n", argv [0]) ; + printf (" Where is one of the following:\n") ; + printf (" wav - test adding strings to WAV files\n") ; + printf (" aiff - test adding strings to AIFF files\n") ; + printf (" flac - test adding strings to FLAC files\n") ; + printf (" ogg - test adding strings to OGG files\n") ; + printf (" opus - test adding strings to OPUS files\n") ; + printf (" all - perform all tests\n") ; + exit (1) ; + } ; + + do_all = ! strcmp (argv [1], "all") ; + + if (do_all || ! strcmp (argv [1], "wav")) + { string_start_end_test ("strings.wav", SF_FORMAT_WAV) ; + string_multi_set_test ("multi.wav", SF_FORMAT_WAV) ; + string_rdwr_test ("rdwr.wav", SF_FORMAT_WAV) ; + string_short_rdwr_test ("short_rdwr.wav", SF_FORMAT_WAV) ; + string_rdwr_grow_test ("rdwr_grow.wav", SF_FORMAT_WAV) ; + string_header_update ("header_update.wav", SF_FORMAT_WAV) ; + + string_start_end_test ("strings.wavex", SF_FORMAT_WAVEX) ; + string_multi_set_test ("multi.wavex", SF_FORMAT_WAVEX) ; + string_rdwr_test ("rdwr.wavex", SF_FORMAT_WAVEX) ; + string_short_rdwr_test ("short_rdwr.wavex", SF_FORMAT_WAVEX) ; + + string_start_end_test ("strings.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV) ; + string_multi_set_test ("multi.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV) ; + string_rdwr_test ("rdwr.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV) ; + string_short_rdwr_test ("short_rdwr.rifx", SF_ENDIAN_BIG | SF_FORMAT_WAV) ; + + software_string_test ("software_string.wav") ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "aiff")) + { string_start_test ("strings.aiff", SF_FORMAT_AIFF) ; + string_start_end_test ("strings.aiff", SF_FORMAT_AIFF) ; + /* + TODO : Fix src/aiff.c so these tests pass. + string_multi_set_test ("multi.aiff", SF_FORMAT_AIFF) ; + string_rdwr_test ("rdwr.aiff", SF_FORMAT_AIFF) ; + string_short_rdwr_test ("short_rdwr.aiff", SF_FORMAT_AIFF) ; + string_rdwr_grow_test ("rdwr_grow.aiff", SF_FORMAT_AIFF) ; + string_header_update ("header_update.aiff", SF_FORMAT_AIFF) ; + */ + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "flac")) + { if (HAVE_EXTERNAL_XIPH_LIBS) + string_start_test ("strings.flac", SF_FORMAT_FLAC) ; + else + puts (" No FLAC tests because FLAC support was not compiled in.") ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "ogg")) + { if (HAVE_EXTERNAL_XIPH_LIBS) + string_start_test ("vorbis.oga", SF_FORMAT_OGG | SF_FORMAT_VORBIS) ; + else + puts (" No Ogg/Vorbis tests because Ogg/Vorbis support was not compiled in.") ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "opus")) + { if (HAVE_EXTERNAL_XIPH_LIBS) + string_start_test ("opus.opus", SF_FORMAT_OGG | SF_FORMAT_OPUS) ; + else + puts (" No Ogg/Opus tests because Ogg/Opus support was not compiled in.") ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "caf")) + { string_start_test ("strings.caf", SF_FORMAT_CAF) ; + string_start_end_test ("strings.caf", SF_FORMAT_CAF) ; + string_multi_set_test ("multi.caf", SF_FORMAT_CAF) ; + /* + TODO : Fix src/caf.c so these tests pass. + string_rdwr_test ("rdwr.caf", SF_FORMAT_CAF) ; + string_short_rdwr_test ("short_rdwr.caf", SF_FORMAT_CAF) ; + string_header_update ("header_update.caf", SF_FORMAT_CAF) ; + */ + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "rf64")) + { string_start_test ("strings.rf64", SF_FORMAT_RF64) ; + string_start_end_test ("strings.rf64", SF_FORMAT_RF64) ; + string_multi_set_test ("multi.rf64", SF_FORMAT_RF64) ; + /* + TODO : Fix src/rf64.c so these tests pass. + string_rdwr_test ("rdwr.rf64", SF_FORMAT_RF64) ; + string_short_rdwr_test ("short_rdwr.rf64", SF_FORMAT_RF64) ; + string_header_update ("header_update.rf64", SF_FORMAT_RF64) ; + */ + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "w64")) + { puts ("\n\n **** String test not working yet for W64 format. ****\n") ; + /* + string_start_test ("strings.w64", SF_FORMAT_W64) ; + string_start_end_test ("strings.w64", SF_FORMAT_W64) ; + string_multi_set_test ("multi.w64", SF_FORMAT_W64) ; + string_rdwr_test ("rdwr.w64", SF_FORMAT_W64) ; + string_short_rdwr_test ("short_rdwr.w64", SF_FORMAT_W64) ; + string_header_update ("header_update.w64", SF_FORMAT_W64) ; + */ + test_count++ ; + } ; + + if (test_count == 0) + { printf ("Mono : ************************************\n") ; + printf ("Mono : * No '%s' test defined.\n", argv [1]) ; + printf ("Mono : ************************************\n") ; + return 1 ; + } ; + + return 0 ; +} /* main */ + + +/*============================================================================================ +** Here are the test functions. +*/ + +static const char + software [] = "software (libsndfile-X.Y.Z)", + artist [] = "The Artist", + copyright [] = "Copyright (c) 2001 Artist", + comment [] = "Comment goes here!!!", + date [] = "2001/01/27", + album [] = "The Album", + license [] = "The license", + title [] = "This is the title", + long_title [] = "This is a very long and very boring title for this file", + long_artist [] = "The artist who kept on changing its name", + genre [] = "The genre", + trackno [] = "Track three" ; + + +static short data_out [BUFFER_LEN] ; + +static void +string_start_end_test (const char *filename, int typemajor) +{ const char *cptr ; + SNDFILE *file ; + SF_INFO sfinfo ; + int errors = 0 ; + + print_test_name ("string_start_end_test", filename) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.channels = 1 ; + sfinfo.frames = 0 ; + sfinfo.format = typemajor | SF_FORMAT_PCM_16 ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + /* Write stuff at start of file. */ + sf_set_string (file, SF_STR_TITLE, filename) ; + sf_set_string (file, SF_STR_SOFTWARE, software) ; + sf_set_string (file, SF_STR_ARTIST, artist) ; + sf_set_string (file, SF_STR_GENRE, genre) ; + sf_set_string (file, SF_STR_TRACKNUMBER, trackno) ; + + /* Write data to file. */ + test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ; + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + /* Write more stuff at end of file. */ + sf_set_string (file, SF_STR_COPYRIGHT, copyright) ; + sf_set_string (file, SF_STR_COMMENT, comment) ; + sf_set_string (file, SF_STR_DATE, date) ; + sf_set_string (file, SF_STR_ALBUM, album) ; + sf_set_string (file, SF_STR_LICENSE, license) ; + + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + check_log_buffer_or_die (file, __LINE__) ; + + if (sfinfo.frames != BUFFER_LEN) + { printf ("***** Bad frame count %d (should be %d)\n\n", (int) sfinfo.frames, BUFFER_LEN) ; + errors ++ ; + } ; + + cptr = sf_get_string (file, SF_STR_TITLE) ; + if (cptr == NULL || strcmp (filename, cptr) != 0) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad filename : %s\n", cptr) ; + } ; + + cptr = sf_get_string (file, SF_STR_COPYRIGHT) ; + if (cptr == NULL || strcmp (copyright, cptr) != 0) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad copyright : %s\n", cptr) ; + } ; + + cptr = sf_get_string (file, SF_STR_SOFTWARE) ; + if (cptr == NULL || strstr (cptr, software) != cptr) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad software : %s\n", cptr) ; + } ; + + if (str_count (cptr, "libsndfile") != 1) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad software : %s\n", cptr) ; + } ; + + cptr = sf_get_string (file, SF_STR_ARTIST) ; + if (cptr == NULL || strcmp (artist, cptr) != 0) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad artist : %s\n", cptr) ; + } ; + + cptr = sf_get_string (file, SF_STR_COMMENT) ; + if (cptr == NULL || strcmp (comment, cptr) != 0) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad comment : %s\n", cptr) ; + } ; + + if (typemajor != SF_FORMAT_AIFF) + { cptr = sf_get_string (file, SF_STR_DATE) ; + if (cptr == NULL || strcmp (date, cptr) != 0) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad date : %s\n", cptr) ; + } ; + + cptr = sf_get_string (file, SF_STR_GENRE) ; + if (cptr == NULL || strcmp (genre, cptr) != 0) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad genre : %s\n", cptr) ; + } ; + } ; + + switch (typemajor) + { case SF_FORMAT_AIFF : + case SF_FORMAT_WAV : + case SF_FORMAT_WAVEX : + case SF_ENDIAN_BIG | SF_FORMAT_WAV : + case SF_FORMAT_RF64 : + /* These formats do not support the following. */ + break ; + + default : + cptr = sf_get_string (file, SF_STR_ALBUM) ; + if (cptr == NULL || strcmp (album, cptr) != 0) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad album : %s\n", cptr) ; + } ; + + cptr = sf_get_string (file, SF_STR_LICENSE) ; + if (cptr == NULL || strcmp (license, cptr) != 0) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad license : %s\n", cptr) ; + } ; + + cptr = sf_get_string (file, SF_STR_TRACKNUMBER) ; + if (cptr == NULL || strcmp (trackno, cptr) != 0) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad track no. : %s\n", cptr) ; + } ; + break ; + } ; + + if (errors > 0) + { printf ("\n*** Error count : %d ***\n\n", errors) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + sf_close (file) ; + unlink (filename) ; + + puts ("ok") ; +} /* string_start_end_test */ + +static void +string_start_test (const char *filename, int formattype) +{ const char *cptr ; + SNDFILE *file ; + SF_INFO sfinfo ; + int errors = 0 ; + int typemajor = SF_FORMAT_TYPEMASK & formattype ; + + print_test_name ("string_start_test", filename) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.channels = 1 ; + sfinfo.frames = 0 ; + + switch (formattype) + { case SF_FORMAT_OGG | SF_FORMAT_OPUS : + /* Opus only supports some discrete sample rates. */ + sfinfo.samplerate = 48000 ; + break ; + + case SF_FORMAT_OGG | SF_FORMAT_VORBIS : + break ; + + default : + formattype |= SF_FORMAT_PCM_16 ; + break ; + } ; + sfinfo.format = formattype ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + /* Write stuff at start of file. */ + sf_set_string (file, SF_STR_TITLE, filename) ; + sf_set_string (file, SF_STR_SOFTWARE, software) ; + sf_set_string (file, SF_STR_ARTIST, artist) ; + sf_set_string (file, SF_STR_COPYRIGHT, copyright) ; + sf_set_string (file, SF_STR_COMMENT, comment) ; + sf_set_string (file, SF_STR_DATE, date) ; + sf_set_string (file, SF_STR_ALBUM, album) ; + sf_set_string (file, SF_STR_LICENSE, license) ; + + /* Write data to file. */ + test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ; + + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + + check_log_buffer_or_die (file, __LINE__) ; + + if (sfinfo.frames != BUFFER_LEN) + { printf ("***** Bad frame count %d (should be %d)\n\n", (int) sfinfo.frames, BUFFER_LEN) ; + errors ++ ; + } ; + + cptr = sf_get_string (file, SF_STR_TITLE) ; + if (cptr == NULL || strcmp (filename, cptr) != 0) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad filename : %s\n", cptr) ; + } ; + + cptr = sf_get_string (file, SF_STR_COPYRIGHT) ; + if (cptr == NULL || strcmp (copyright, cptr) != 0) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad copyright : %s\n", cptr) ; + } ; + + cptr = sf_get_string (file, SF_STR_SOFTWARE) ; + if (cptr == NULL || strstr (cptr, software) != cptr) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad software : %s\n", cptr) ; + } ; + + if (cptr && str_count (cptr, "libsndfile") != 1) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad software : %s\n", cptr) ; + } ; + + cptr = sf_get_string (file, SF_STR_ARTIST) ; + if (cptr == NULL || strcmp (artist, cptr) != 0) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad artist : %s\n", cptr) ; + } ; + + cptr = sf_get_string (file, SF_STR_COMMENT) ; + if (cptr == NULL || strcmp (comment, cptr) != 0) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad comment : %s\n", cptr) ; + } ; + + if (typemajor != SF_FORMAT_AIFF) + { cptr = sf_get_string (file, SF_STR_DATE) ; + if (cptr == NULL || strcmp (date, cptr) != 0) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad date : %s\n", cptr) ; + } ; + } ; + + if (typemajor != SF_FORMAT_WAV && typemajor != SF_FORMAT_AIFF) + { cptr = sf_get_string (file, SF_STR_ALBUM) ; + if (cptr == NULL || strcmp (album, cptr) != 0) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad album : %s\n", cptr) ; + } ; + } ; + + if (typemajor != SF_FORMAT_WAV && typemajor != SF_FORMAT_AIFF && typemajor != SF_FORMAT_RF64) + { cptr = sf_get_string (file, SF_STR_LICENSE) ; + if (cptr == NULL || strcmp (license, cptr) != 0) + { if (errors++ == 0) + puts ("\n") ; + printf (" Bad license : %s\n", cptr) ; + } ; + } ; + + if (errors > 0) + { printf ("\n*** Error count : %d ***\n\n", errors) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + sf_close (file) ; + unlink (filename) ; + + puts ("ok") ; +} /* string_start_test */ + +static void +string_multi_set_test (const char *filename, int typemajor) +{ static const char + new_software [] = "new software (libsndfile-X.Y.Z)", + new_copyright [] = "Copyright (c) 2001 New Artist", + new_artist [] = "The New Artist", + new_title [] = "This is the new title" ; + + static char buffer [2048] ; + SNDFILE *file ; + SF_INFO sfinfo ; + int count ; + + print_test_name (__func__, filename) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.format = typemajor | SF_FORMAT_PCM_16 ; + sfinfo.samplerate = 44100 ; + sfinfo.channels = 1 ; + sfinfo.frames = 0 ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + + /* Write stuff at start of file. */ + sf_set_string (file, SF_STR_TITLE, title) ; + sf_set_string (file, SF_STR_SOFTWARE, software) ; + sf_set_string (file, SF_STR_ARTIST, artist) ; + + /* Write data to file. */ + test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ; + + /* Write it all again. */ + + sf_set_string (file, SF_STR_TITLE, new_title) ; + sf_set_string (file, SF_STR_SOFTWARE, new_software) ; + sf_set_string (file, SF_STR_ARTIST, new_artist) ; + + sf_set_string (file, SF_STR_COPYRIGHT, copyright) ; + sf_set_string (file, SF_STR_COMMENT, comment) ; + sf_set_string (file, SF_STR_DATE, date) ; + sf_set_string (file, SF_STR_ALBUM, album) ; + sf_set_string (file, SF_STR_LICENSE, license) ; + sf_set_string (file, SF_STR_COPYRIGHT, new_copyright) ; + sf_set_string (file, SF_STR_COMMENT, comment) ; + sf_set_string (file, SF_STR_DATE, date) ; + sf_set_string (file, SF_STR_ALBUM, album) ; + sf_set_string (file, SF_STR_LICENSE, license) ; + + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + sf_command (file, SFC_GET_LOG_INFO, buffer, sizeof (buffer)) ; + sf_close (file) ; + + count = str_count (buffer, new_title) ; + exit_if_true (count < 1, "\n\nLine %d : Could not find new_title in :\n%s\n", __LINE__, buffer) ; + exit_if_true (count > 1, "\n\nLine %d : new_title appears %d times in :\n\n%s\n", __LINE__, count, buffer) ; + + count = str_count (buffer, software) ; + exit_if_true (count < 1, "\n\nLine %d : Could not find new_software in :\n%s\n", __LINE__, buffer) ; + exit_if_true (count > 1, "\n\nLine %d : new_software appears %d times in :\n\n%s\n", __LINE__, count, buffer) ; + + count = str_count (buffer, new_artist) ; + exit_if_true (count < 1, "\n\nLine %d : Could not find new_artist in :\n%s\n", __LINE__, buffer) ; + exit_if_true (count > 1, "\n\nLine %d : new_artist appears %d times in :\n\n%s\n", __LINE__, count, buffer) ; + + count = str_count (buffer, new_copyright) ; + exit_if_true (count < 1, "\n\nLine %d : Could not find new_copyright in :\n%s\n", __LINE__, buffer) ; + exit_if_true (count > 1, "\n\nLine %d : new_copyright appears %d times in :\n\n%s\n", __LINE__, count, buffer) ; + + unlink (filename) ; + + puts ("ok") ; +} /* string_multi_set_test */ + +static void +string_rdwr_test (const char *filename, int typemajor) +{ SNDFILE *file ; + SF_INFO sfinfo ; + sf_count_t frames ; + const char * str ; + + print_test_name (__func__, filename) ; + create_short_sndfile (filename, typemajor | SF_FORMAT_PCM_16, 2) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ; + frames = sfinfo.frames ; + sf_set_string (file, SF_STR_TITLE, title) ; + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ; + str = sf_get_string (file, SF_STR_TITLE) ; + exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ; + exit_if_true (strcmp (str, title) != 0, "\n\nLine %d : SF_STR_TITLE doesn't match what was written.\n", __LINE__) ; + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ; + frames = sfinfo.frames ; + sf_set_string (file, SF_STR_TITLE, title) ; + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ; + str = sf_get_string (file, SF_STR_TITLE) ; + exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ; + sf_set_string (file, SF_STR_ARTIST, artist) ; + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + str = sf_get_string (file, SF_STR_ARTIST) ; + exit_if_true (str == NULL, "\n\nLine %d : SF_STR_ARTIST string is NULL.\n", __LINE__) ; + exit_if_true (strcmp (str, artist) != 0, "\n\nLine %d : SF_STR_ARTIST doesn't match what was written.\n", __LINE__) ; + + str = sf_get_string (file, SF_STR_TITLE) ; + exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ; + exit_if_true (strcmp (str, title) != 0, "\n\nLine %d : SF_STR_TITLE doesn't match what was written.\n", __LINE__) ; + + exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ; + + sf_close (file) ; + unlink (filename) ; + + puts ("ok") ; +} /* string_rdwr_test */ + +static void +string_short_rdwr_test (const char *filename, int typemajor) +{ SNDFILE *file ; + SF_INFO sfinfo ; + sf_count_t frames = BUFFER_LEN ; + const char * str ; + + print_test_name (__func__, filename) ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.format = typemajor | SF_FORMAT_PCM_16 ; + sfinfo.samplerate = 44100 ; + sfinfo.channels = 1 ; + sfinfo.frames = 0 ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ; + + /* Write data to file. */ + test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ; + + sf_set_string (file, SF_STR_TITLE, long_title) ; + sf_set_string (file, SF_STR_ARTIST, long_artist) ; + sf_close (file) ; + + /* Open the file RDWR. */ + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_FALSE, __LINE__) ; + exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ; + str = sf_get_string (file, SF_STR_TITLE) ; + exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ; + exit_if_true (strcmp (str, long_title) != 0, "\n\nLine %d : SF_STR_TITLE doesn't match what was written.\n", __LINE__) ; + str = sf_get_string (file, SF_STR_ARTIST) ; + exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ; + exit_if_true (strcmp (str, long_artist) != 0, "\n\nLine %d : SF_STR_ARTIST doesn't match what was written.\n", __LINE__) ; + + /* Change title and artist. */ + sf_set_string (file, SF_STR_TITLE, title) ; + sf_set_string (file, SF_STR_ARTIST, artist) ; + + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ; + + check_log_buffer_or_die (file, __LINE__) ; + + str = sf_get_string (file, SF_STR_TITLE) ; + exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ; + exit_if_true (strcmp (str, title) != 0, "\n\nLine %d : SF_STR_TITLE doesn't match what was written.\n", __LINE__) ; + + str = sf_get_string (file, SF_STR_ARTIST) ; + exit_if_true (str == NULL, "\n\nLine %d : SF_STR_ARTIST string is NULL.\n", __LINE__) ; + exit_if_true (strcmp (str, artist) != 0, "\n\nLine %d : SF_STR_ARTIST doesn't match what was written.\n", __LINE__) ; + + sf_close (file) ; + unlink (filename) ; + + puts ("ok") ; +} /* string_short_rdwr_test */ + +static int +str_count (const char * haystack, const char * needle) +{ int count = 0 ; + + while ((haystack = strstr (haystack, needle)) != NULL) + { count ++ ; + haystack ++ ; + } ; + + return count ; +} /* str_count */ + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + +static void +software_string_test (const char *filename) +{ size_t k ; + + print_test_name (__func__, filename) ; + + for (k = 0 ; k < 50 ; k++) + { const char *result ; + char sfname [64] = "" ; + SNDFILE *file ; + SF_INFO info ; + + sf_info_setup (&info, SF_FORMAT_WAV | SF_FORMAT_PCM_16, 44100, 1) ; + file = test_open_file_or_die (filename, SFM_WRITE, &info, SF_TRUE, __LINE__) ; + + snprintf (sfname, MIN (k, sizeof (sfname)), "%s", "abcdefghijklmnopqrestvwxyz0123456789abcdefghijklmnopqrestvwxyz") ; + + exit_if_true (sf_set_string (file, SF_STR_SOFTWARE, sfname), + "\n\nLine %d : sf_set_string (f, SF_STR_SOFTWARE, '%s') failed : %s\n", __LINE__, sfname, sf_strerror (file)) ; + + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &info, SF_TRUE, __LINE__) ; + result = sf_get_string (file, SF_STR_SOFTWARE) ; + + exit_if_true (result == NULL, "\n\nLine %d : sf_get_string (file, SF_STR_SOFTWARE) returned NULL.\n\n", __LINE__) ; + + exit_if_true (strstr (result, sfname) != result, + "\n\nLine %d : Can't fine string '%s' in '%s'\n\n", __LINE__, sfname, result) ; + sf_close (file) ; + } ; + + unlink (filename) ; + puts ("ok") ; +} /* software_string_test */ + + +static void +string_rdwr_grow_test (const char *filename, int typemajor) +{ SNDFILE *file ; + SF_INFO sfinfo ; + sf_count_t frames ; + const char * str ; + + print_test_name (__func__, filename) ; + + /* Create a file that contains some strings. Then open the file in RDWR mode and + grow the file by writing more audio data to it. Check that the audio data has + been added to the file, and that the strings are still there. */ + + /* Create a short file that contains a string. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.channels = 2 ; + sfinfo.frames = 0 ; + sfinfo.format = typemajor | SF_FORMAT_PCM_16 ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + /* Write data to file. */ + test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ; + + /* Write some strings at end of file. */ + sf_set_string (file, SF_STR_TITLE , title) ; + sf_set_string (file, SF_STR_COMMENT, comment) ; + sf_close (file) ; + + + /* Now open file again in SFM_RDWR mode and write more audio data to it. */ + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; + /* Write more data to file. */ + test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ; + sf_close (file) ; + + + /* Now open file again. It should now contain two BUFFER_LEN's worth of frames and the strings. */ + frames = 2 * BUFFER_LEN / sfinfo.channels ; + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ; + + /* Check the strings */ + str = sf_get_string (file, SF_STR_TITLE) ; + exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ; + exit_if_true (strcmp (str, title) != 0, "\n\nLine %d : SF_STR_TITLE doesn't match what was written.\n", __LINE__) ; + + str = sf_get_string (file, SF_STR_COMMENT) ; + exit_if_true (str == NULL, "\n\nLine %d : SF_STR_COMMENT string is NULL.\n", __LINE__) ; + exit_if_true (strcmp (str, comment) != 0, "\n\nLine %d : SF_STR_COMMENT doesn't match what was written.\n", __LINE__) ; + + sf_close (file) ; + unlink (filename) ; + + puts ("ok") ; +} /* string_rdwr_grow_test */ + +static void +string_header_update (const char *filename, int typemajor) +{ SNDFILE *file , *file1 ; + SF_INFO sfinfo , sfinfo1 ; + sf_count_t frames ; + const char * str ; + const int GROW_BUFFER_AMOUNT = 4 ; /* this should be less than half the size of the string header */ + + print_test_name (__func__, filename) ; + + /* Create a short file. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.channels = 2 ; + sfinfo.frames = 0 ; + sfinfo.format = typemajor | SF_FORMAT_PCM_16 ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ; + test_write_short_or_die (file, 0, data_out, BUFFER_LEN, __LINE__) ; + sf_set_string (file, SF_STR_TITLE, long_title) ; + sf_close (file) ; + + + /* Check that SFC_UPDATE_HEADER_NOW correctly calculates datalength. */ + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; + /* Write a very small amount of new audio data that doesn't completely overwrite the existing header. */ + test_write_short_or_die (file, 0, data_out, GROW_BUFFER_AMOUNT, __LINE__) ; + + /* Update the header without closing the file. */ + sf_command (file, SFC_UPDATE_HEADER_NOW, NULL, 0) ; + + /* The file should now contain BUFFER_LEN + GROW_BUFFER_AMOUNT frames. + Open a second handle to the file and check the reported length. */ + memset (&sfinfo1, 0, sizeof (sfinfo1)) ; + file1 = test_open_file_or_die (filename, SFM_READ, &sfinfo1, SF_TRUE, __LINE__) ; + + frames = (BUFFER_LEN + GROW_BUFFER_AMOUNT) / sfinfo.channels ; + exit_if_true (frames != sfinfo1.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo1.frames, frames) ; + + /* The strings are probably not readable by the second soundfile handle because write_tailer has not yet been called. + It's a design decision whether SFC_UPDATE_HEADER_NOW should write the tailer. I think it's fine that it doesn't. */ + + sf_close (file1) ; + sf_close (file) ; + + + /* Check that sf_close correctly calculates datalength. */ + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, SF_TRUE, __LINE__) ; + /* Write a very small amount of new audio data that doesn't completely overwrite the existing header. */ + test_write_short_or_die (file, 0, data_out, GROW_BUFFER_AMOUNT, __LINE__) ; + sf_close (file) ; + + + /* Open file again and verify data and string. */ + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_TRUE, __LINE__) ; + frames = (BUFFER_LEN + 2*GROW_BUFFER_AMOUNT) / sfinfo.channels ; + exit_if_true (frames != sfinfo.frames, "\n\nLine %d : Frame count %" PRId64 " should be %" PRId64 ".\n", __LINE__, sfinfo.frames, frames) ; + str = sf_get_string (file, SF_STR_TITLE) ; + exit_if_true (str == NULL, "\n\nLine %d : SF_STR_TITLE string is NULL.\n", __LINE__) ; + exit_if_true (strcmp (str, long_title) != 0, "\n\nLine %d : SF_STR_TITLE doesn't match what was written.\n", __LINE__) ; + sf_close (file) ; + unlink (filename) ; + puts ("ok") ; +} /* string_header_update */ diff --git a/libsndfile-1.0.31/tests/test_wrapper.sh.in b/libsndfile-1.0.31/tests/test_wrapper.sh.in new file mode 100644 index 0000000..b06a178 --- /dev/null +++ b/libsndfile-1.0.31/tests/test_wrapper.sh.in @@ -0,0 +1,371 @@ +#!/usr/bin/env sh + +# Copyright (C) 2008-2017 Erik de Castro Lopo +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the author nor the names of any contributors may be used +# to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +HOST_TRIPLET=@HOST_TRIPLET@ +PACKAGE_VERSION=@PACKAGE_VERSION@ +LIB_VERSION=$(echo $PACKAGE_VERSION | sed "s/[a-z].*//") +ABS_TOP_SRCDIR=@abs_top_srcdir@ +PYTHON=@PYTHON@ + +sfversion=$(./tests/sfversion@EXEEXT@ | grep libsndfile | sed "s/-exp$//") + +if test "$sfversion" != libsndfile-$PACKAGE_VERSION ; then + echo "Error : sfversion ($sfversion) and PACKAGE_VERSION ($PACKAGE_VERSION) don't match." + exit 1 + fi + +# Force exit on errors. +set -e + +# Check the header file. +/usr/bin/env sh tests/pedantic-header-test.sh + +# Need this for when we're running from files collected into the +# libsndfile-testsuite-@PACKAGE_VERSION@ tarball. +echo "Running unit tests from src/ directory of source code tree." +./src/test_main@EXEEXT@ + +echo +echo "Running end-to-end tests from tests/ directory." + +./tests/error_test@EXEEXT@ +./tests/pcm_test@EXEEXT@ +./tests/ulaw_test@EXEEXT@ +./tests/alaw_test@EXEEXT@ +./tests/dwvw_test@EXEEXT@ +./tests/command_test@EXEEXT@ ver +./tests/command_test@EXEEXT@ norm +./tests/command_test@EXEEXT@ format +./tests/command_test@EXEEXT@ peak +./tests/command_test@EXEEXT@ trunc +./tests/command_test@EXEEXT@ inst +./tests/command_test@EXEEXT@ cue +./tests/command_test@EXEEXT@ current_sf_info +./tests/command_test@EXEEXT@ bext +./tests/command_test@EXEEXT@ bextch +./tests/command_test@EXEEXT@ chanmap +./tests/command_test@EXEEXT@ cart +./tests/floating_point_test@EXEEXT@ +./tests/checksum_test@EXEEXT@ +./tests/scale_clip_test@EXEEXT@ +./tests/headerless_test@EXEEXT@ +./tests/rdwr_test@EXEEXT@ +./tests/locale_test@EXEEXT@ +./tests/win32_ordinal_test@EXEEXT@ +./tests/external_libs_test@EXEEXT@ +./tests/format_check_test@EXEEXT@ +./tests/channel_test@EXEEXT@ + +# The w64 G++ compiler requires an extra runtime DLL which we don't have, +# so skip this test. +case "$HOST_TRIPLET" in + x86_64-w64-mingw32) + ;; + i686-w64-mingw32) + ;; + *) + ./tests/cpp_test@EXEEXT@ + ;; + esac + +echo "----------------------------------------------------------------------" +echo " $sfversion passed common tests." +echo "----------------------------------------------------------------------" + +# aiff-tests +./tests/write_read_test@EXEEXT@ aiff +./tests/lossy_comp_test@EXEEXT@ aiff_ulaw +./tests/lossy_comp_test@EXEEXT@ aiff_alaw +./tests/lossy_comp_test@EXEEXT@ aiff_gsm610 +echo "----------------------------------------------------------------------" +echo " lossy_comp_test@EXEEXT@ aiff_ima" +echo "----------------------------------------------------------------------" + +./tests/peak_chunk_test@EXEEXT@ aiff +./tests/header_test@EXEEXT@ aiff +./tests/misc_test@EXEEXT@ aiff +./tests/string_test@EXEEXT@ aiff +./tests/multi_file_test@EXEEXT@ aiff +./tests/aiff_rw_test@EXEEXT@ +./tests/chunk_test@EXEEXT@ aiff +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on AIFF files." +echo "----------------------------------------------------------------------" + +# au-tests +./tests/write_read_test@EXEEXT@ au +./tests/lossy_comp_test@EXEEXT@ au_ulaw +./tests/lossy_comp_test@EXEEXT@ au_alaw +./tests/lossy_comp_test@EXEEXT@ au_g721 +./tests/lossy_comp_test@EXEEXT@ au_g723 +./tests/header_test@EXEEXT@ au +./tests/misc_test@EXEEXT@ au +./tests/multi_file_test@EXEEXT@ au +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on AU files." +echo "----------------------------------------------------------------------" + +# caf-tests +./tests/write_read_test@EXEEXT@ caf +./tests/lossy_comp_test@EXEEXT@ caf_ulaw +./tests/lossy_comp_test@EXEEXT@ caf_alaw +./tests/header_test@EXEEXT@ caf +./tests/peak_chunk_test@EXEEXT@ caf +./tests/misc_test@EXEEXT@ caf +./tests/chunk_test@EXEEXT@ caf +./tests/string_test@EXEEXT@ caf +./tests/long_read_write_test@EXEEXT@ alac +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on CAF files." +echo "----------------------------------------------------------------------" + +# wav-tests +./tests/write_read_test@EXEEXT@ wav +./tests/lossy_comp_test@EXEEXT@ wav_pcm +./tests/lossy_comp_test@EXEEXT@ wav_ima +./tests/lossy_comp_test@EXEEXT@ wav_msadpcm +./tests/lossy_comp_test@EXEEXT@ wav_ulaw +./tests/lossy_comp_test@EXEEXT@ wav_alaw +./tests/lossy_comp_test@EXEEXT@ wav_gsm610 +./tests/lossy_comp_test@EXEEXT@ wav_g721 +./tests/peak_chunk_test@EXEEXT@ wav +./tests/header_test@EXEEXT@ wav +./tests/misc_test@EXEEXT@ wav +./tests/string_test@EXEEXT@ wav +./tests/multi_file_test@EXEEXT@ wav +./tests/chunk_test@EXEEXT@ wav +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on WAV files." +echo "----------------------------------------------------------------------" + +# w64-tests +./tests/write_read_test@EXEEXT@ w64 +./tests/lossy_comp_test@EXEEXT@ w64_ima +./tests/lossy_comp_test@EXEEXT@ w64_msadpcm +./tests/lossy_comp_test@EXEEXT@ w64_ulaw +./tests/lossy_comp_test@EXEEXT@ w64_alaw +./tests/lossy_comp_test@EXEEXT@ w64_gsm610 +./tests/header_test@EXEEXT@ w64 +./tests/misc_test@EXEEXT@ w64 +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on W64 files." +echo "----------------------------------------------------------------------" + +# rf64-tests +./tests/write_read_test@EXEEXT@ rf64 +./tests/header_test@EXEEXT@ rf64 +./tests/misc_test@EXEEXT@ rf64 +./tests/string_test@EXEEXT@ rf64 +./tests/peak_chunk_test@EXEEXT@ rf64 +./tests/chunk_test@EXEEXT@ rf64 +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on RF64 files." +echo "----------------------------------------------------------------------" + +# raw-tests +./tests/write_read_test@EXEEXT@ raw +./tests/lossy_comp_test@EXEEXT@ raw_ulaw +./tests/lossy_comp_test@EXEEXT@ raw_alaw +./tests/lossy_comp_test@EXEEXT@ raw_gsm610 +./tests/lossy_comp_test@EXEEXT@ vox_adpcm +./tests/raw_test@EXEEXT@ +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on RAW (header-less) files." +echo "----------------------------------------------------------------------" + +# paf-tests +./tests/write_read_test@EXEEXT@ paf +./tests/header_test@EXEEXT@ paf +./tests/misc_test@EXEEXT@ paf +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on PAF files." +echo "----------------------------------------------------------------------" + +# svx-tests +./tests/write_read_test@EXEEXT@ svx +./tests/header_test@EXEEXT@ svx +./tests/misc_test@EXEEXT@ svx +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on SVX files." +echo "----------------------------------------------------------------------" + +# nist-tests +./tests/write_read_test@EXEEXT@ nist +./tests/lossy_comp_test@EXEEXT@ nist_ulaw +./tests/lossy_comp_test@EXEEXT@ nist_alaw +./tests/header_test@EXEEXT@ nist +./tests/misc_test@EXEEXT@ nist +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on NIST files." +echo "----------------------------------------------------------------------" + +# ircam-tests +./tests/write_read_test@EXEEXT@ ircam +./tests/lossy_comp_test@EXEEXT@ ircam_ulaw +./tests/lossy_comp_test@EXEEXT@ ircam_alaw +./tests/header_test@EXEEXT@ ircam +./tests/misc_test@EXEEXT@ ircam +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on IRCAM files." +echo "----------------------------------------------------------------------" + +# voc-tests +./tests/write_read_test@EXEEXT@ voc +./tests/lossy_comp_test@EXEEXT@ voc_ulaw +./tests/lossy_comp_test@EXEEXT@ voc_alaw +./tests/header_test@EXEEXT@ voc +./tests/misc_test@EXEEXT@ voc +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on VOC files." +echo "----------------------------------------------------------------------" + +# mat4-tests +./tests/write_read_test@EXEEXT@ mat4 +./tests/header_test@EXEEXT@ mat4 +./tests/misc_test@EXEEXT@ mat4 +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on MAT4 files." +echo "----------------------------------------------------------------------" + +# mat5-tests +./tests/write_read_test@EXEEXT@ mat5 +./tests/header_test@EXEEXT@ mat5 +./tests/misc_test@EXEEXT@ mat5 +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on MAT5 files." +echo "----------------------------------------------------------------------" + +# pvf-tests +./tests/write_read_test@EXEEXT@ pvf +./tests/header_test@EXEEXT@ pvf +./tests/misc_test@EXEEXT@ pvf +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on PVF files." +echo "----------------------------------------------------------------------" + +# xi-tests +./tests/lossy_comp_test@EXEEXT@ xi_dpcm +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on XI files." +echo "----------------------------------------------------------------------" + +# htk-tests +./tests/write_read_test@EXEEXT@ htk +./tests/header_test@EXEEXT@ htk +./tests/misc_test@EXEEXT@ htk +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on HTK files." +echo "----------------------------------------------------------------------" + +# avr-tests +./tests/write_read_test@EXEEXT@ avr +./tests/header_test@EXEEXT@ avr +./tests/misc_test@EXEEXT@ avr +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on AVR files." +echo "----------------------------------------------------------------------" + +# sds-tests +./tests/write_read_test@EXEEXT@ sds +./tests/header_test@EXEEXT@ sds +./tests/misc_test@EXEEXT@ sds +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on SDS files." +echo "----------------------------------------------------------------------" + +# sd2-tests +./tests/write_read_test@EXEEXT@ sd2 +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on SD2 files." +echo "----------------------------------------------------------------------" + +# wve-tests +./tests/lossy_comp_test@EXEEXT@ wve +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on WVE files." +echo "----------------------------------------------------------------------" + +# mpc2k-tests +./tests/write_read_test@EXEEXT@ mpc2k +./tests/header_test@EXEEXT@ mpc2k +./tests/misc_test@EXEEXT@ mpc2k +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on MPC 2000 files." +echo "----------------------------------------------------------------------" + +# flac-tests +./tests/write_read_test@EXEEXT@ flac +./tests/compression_size_test@EXEEXT@ flac +./tests/string_test@EXEEXT@ flac +./tests/header_test@EXEEXT@ flac +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on FLAC files." +echo "----------------------------------------------------------------------" + +# vorbis-tests +./tests/ogg_test@EXEEXT@ +./tests/compression_size_test@EXEEXT@ vorbis +./tests/lossy_comp_test@EXEEXT@ ogg_vorbis +./tests/string_test@EXEEXT@ ogg +./tests/misc_test@EXEEXT@ ogg +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on OGG/VORBIS files." +echo "----------------------------------------------------------------------" + +# opus-tests +./tests/ogg_opus_test@EXEEXT@ +./tests/compression_size_test@EXEEXT@ opus +./tests/lossy_comp_test@EXEEXT@ ogg_opus +./tests/string_test@EXEEXT@ opus + +echo "----------------------------------------------------------------------" +echo " $sfversion passed tests on OPUS files." +echo "----------------------------------------------------------------------" + +# io-tests +./tests/stdio_test@EXEEXT@ +./tests/pipe_test@EXEEXT@ +./tests/virtual_io_test@EXEEXT@ +echo "----------------------------------------------------------------------" +echo " $sfversion passed stdio/pipe/vio tests." +echo "----------------------------------------------------------------------" + +"${PYTHON}" "${ABS_TOP_SRCDIR}/src/binheader_writef_check.py" "${ABS_TOP_SRCDIR}/src"/*.c +echo "----------------------------------------------------------------------" +echo " $sfversion passed binary header tests." +echo "----------------------------------------------------------------------" + +"${PYTHON}" "${ABS_TOP_SRCDIR}/programs/test-sndfile-metadata-set.py" "${HOST_TRIPLET}" +echo "----------------------------------------------------------------------" +echo " $sfversion passed sndfile metadata tests." +echo "----------------------------------------------------------------------" diff --git a/libsndfile-1.0.31/tests/ulaw_test.c b/libsndfile-1.0.31/tests/ulaw_test.c new file mode 100644 index 0000000..9e0eba9 --- /dev/null +++ b/libsndfile-1.0.31/tests/ulaw_test.c @@ -0,0 +1,259 @@ +/* +** Copyright (C) 1999-2012 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "utils.h" + +#define BUFFER_SIZE (65536) + +static unsigned char ulaw_encode (int sample) ; +static int ulaw_decode (unsigned int ulawbyte) ; + +static short short_buffer [BUFFER_SIZE] ; +static unsigned char ulaw_buffer [BUFFER_SIZE] ; + +int +main (void) +{ SNDFILE *file ; + SF_INFO sfinfo ; + const char *filename ; + int k ; + + print_test_name ("ulaw_test", "encoder") ; + + filename = "test.raw" ; + + sf_info_setup (&sfinfo, SF_FORMAT_RAW | SF_FORMAT_ULAW, 44100, 1) ; + + if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) + { printf ("sf_open_write failed with error : ") ; + fflush (stdout) ; + puts (sf_strerror (NULL)) ; + exit (1) ; + } ; + + /* Generate a file containing all possible 16 bit sample values + ** and write it to disk as ulaw encoded.frames. + */ + + for (k = 0 ; k < 0x10000 ; k++) + short_buffer [k] = k & 0xFFFF ; + + sf_write_short (file, short_buffer, BUFFER_SIZE) ; + sf_close (file) ; + + /* Now open that file and compare the ulaw encoded sample values + ** with what they should be. + */ + + if ((file = sf_open (filename, SFM_READ, &sfinfo)) == NULL) + { printf ("sf_open_write failed with error : ") ; + puts (sf_strerror (NULL)) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + if (sf_read_raw (file, ulaw_buffer, BUFFER_SIZE) != BUFFER_SIZE) + { printf ("sf_read_raw : ") ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + for (k = 0 ; k < 0x10000 ; k++) + if (ulaw_encode (short_buffer [k]) != ulaw_buffer [k]) + { printf ("Encoder error : sample #%d (0x%02X should be 0x%02X)\n", k, ulaw_buffer [k], ulaw_encode (short_buffer [k])) ; + exit (1) ; + } ; + + sf_close (file) ; + + puts ("ok") ; + + print_test_name ("ulaw_test", "decoder") ; + + /* Now generate a file containing all possible 8 bit encoded + ** sample values and write it to disk as ulaw encoded.frames. + */ + + if (! (file = sf_open (filename, SFM_WRITE, &sfinfo))) + { printf ("sf_open_write failed with error : ") ; + puts (sf_strerror (NULL)) ; + exit (1) ; + } ; + + for (k = 0 ; k < 256 ; k++) + ulaw_buffer [k] = k & 0xFF ; + + sf_write_raw (file, ulaw_buffer, 256) ; + sf_close (file) ; + + /* Now open that file and compare the ulaw decoded sample values + ** with what they should be. + */ + + if (! (file = sf_open (filename, SFM_READ, &sfinfo))) + { printf ("sf_open_write failed with error : ") ; + puts (sf_strerror (NULL)) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + if (sf_read_short (file, short_buffer, 256) != 256) + { printf ("sf_read_short : ") ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + + for (k = 0 ; k < 256 ; k++) + if (short_buffer [k] != ulaw_decode (ulaw_buffer [k])) + { printf ("Decoder error : sample #%d (0x%04X should be 0x%04X)\n", k, short_buffer [k], ulaw_decode (ulaw_buffer [k])) ; + exit (1) ; + } ; + + sf_close (file) ; + + puts ("ok") ; + + unlink (filename) ; + + return 0 ; +} /* main */ + + +/*================================================================================= +** The following routines came from the sox-12.15 (Sound eXcahcnge) distribution. +** +** This code is not compiled into libsndfile. It is only used to test the +** libsndfile lookup tables for correctness. +** +** I have included the original authors comments. +*/ + +/* +** This routine converts from linear to ulaw. +** +** Craig Reese: IDA/Supercomputing Research Center +** Joe Campbell: Department of Defense +** 29 September 1989 +** +** References: +** 1) CCITT Recommendation G.711 (very difficult to follow) +** 2) "A New Digital Technique for Implementation of Any +** Continuous PCM Companding Law," Villeret, Michel, +** et al. 1973 IEEE Int. Conf. on Communications, Vol 1, +** 1973, pg. 11.12-11.17 +** 3) MIL-STD-188-113,"Interoperability and Performance Standards +** for Analog-to_Digital Conversion Techniques," +** 17 February 1987 +** +** Input: Signed 16 bit linear sample +** Output: 8 bit ulaw sample +*/ + +#define uBIAS 0x84 /* define the add-in bias for 16 bit.frames */ +#define uCLIP 32635 + +static +unsigned char ulaw_encode (int sample) +{ static int exp_lut [256] = + { 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 + } ; + + int sign, exponent, mantissa ; + unsigned char ulawbyte ; + + /* Get the sample into sign-magnitude. */ + sign = (sample >> 8) & 0x80 ; /* set aside the sign */ + if (sign != 0) + sample = -sample ; /* get magnitude */ + if (sample > uCLIP) + sample = uCLIP ; /* clip the magnitude */ + + /* Convert from 16 bit linear to ulaw. */ + sample = sample + uBIAS ; + exponent = exp_lut [(sample >> 7) & 0xFF] ; + mantissa = (sample >> (exponent + 3)) & 0x0F ; + ulawbyte = ~ (sign | (exponent << 4) | mantissa) ; + + return ulawbyte ; +} /* ulaw_encode */ + + +/* +** This routine converts from ulaw to 16 bit linear. +** +** Craig Reese: IDA/Supercomputing Research Center +** 29 September 1989 +** +** References: +** 1) CCITT Recommendation G.711 (very difficult to follow) +** 2) MIL-STD-188-113,"Interoperability and Performance Standards +** for Analog-to_Digital Conversion Techniques," +** 17 February 1987 +** +** Input: 8 bit ulaw sample +** Output: signed 16 bit linear sample +*/ + +static +int ulaw_decode (unsigned int ulawbyte) +{ static int exp_lut [8] = { 0, 132, 396, 924, 1980, 4092, 8316, 16764 } ; + int sign, exponent, mantissa, sample ; + + ulawbyte = ~ ulawbyte ; + sign = (ulawbyte & 0x80) ; + exponent = (ulawbyte >> 4) & 0x07 ; + mantissa = ulawbyte & 0x0F ; + sample = exp_lut [exponent] + (mantissa << (exponent + 3)) ; + if (sign != 0) + sample = -sample ; + + return sample ; +} /* ulaw_decode */ + diff --git a/libsndfile-1.0.31/tests/utils.c b/libsndfile-1.0.31/tests/utils.c new file mode 100644 index 0000000..b894bfe --- /dev/null +++ b/libsndfile-1.0.31/tests/utils.c @@ -0,0 +1,1174 @@ +/* +** Copyright (C) 2002-2018 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +/* +** Utility functions to make writing the test suite easier. +** +** The .c and .h files were generated automagically with Autogen from +** the files utils.def and utils.tpl. +*/ + + + +#include "sfconfig.h" + +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#endif + +#if (HAVE_DECL_S_IRGRP == 0) +#include +#endif + +#include +#include +#include +#include +#include +#include + +#include + +#include "utils.h" + +#ifndef M_PI +#define M_PI 3.14159265358979323846264338 +#endif + +#define LOG_BUFFER_SIZE 4096 + +/* +** Neat solution to the Win32/OS2 binary file flage requirement. +** If O_BINARY isn't already defined by the inclusion of the system +** headers, set it to zero. +*/ +#ifndef O_BINARY +#define O_BINARY 0 +#endif + + +void +gen_windowed_sine_float (float *data, int len, double maximum) +{ int k ; + + memset (data, 0, len * sizeof (float)) ; + + len = (5 * len) / 6 ; + + for (k = 0 ; k < len ; k++) + { data [k] = sin (2.0 * k * M_PI * 1.0 / 32.0 + 0.4) ; + + /* Apply Hanning Window. */ + data [k] *= maximum * (0.5 - 0.5 * cos (2.0 * M_PI * k / ((len) - 1))) ; + } + + return ; +} /* gen_windowed_sine_float */ + +void +gen_windowed_sine_double (double *data, int len, double maximum) +{ int k ; + + memset (data, 0, len * sizeof (double)) ; + + len = (5 * len) / 6 ; + + for (k = 0 ; k < len ; k++) + { data [k] = sin (2.0 * k * M_PI * 1.0 / 32.0 + 0.4) ; + + /* Apply Hanning Window. */ + data [k] *= maximum * (0.5 - 0.5 * cos (2.0 * M_PI * k / ((len) - 1))) ; + } + + return ; +} /* gen_windowed_sine_double */ + + +void +create_short_sndfile (const char *filename, int format, int channels) +{ short data [2 * 3 * 4 * 5 * 6 * 7] = { 0, } ; + SNDFILE *file ; + SF_INFO sfinfo ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.channels = channels ; + sfinfo.format = format ; + + if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) + { printf ("Error (%s, %d) : sf_open failed : %s\n", __FILE__, __LINE__, sf_strerror (file)) ; + exit (1) ; + } ; + + sf_write_short (file, data, ARRAY_LEN (data)) ; + + sf_close (file) ; +} /* create_short_sndfile */ + +void +check_file_hash_or_die (const char *filename, uint64_t target_hash, int line_num) +{ static unsigned char buf [4096] ; + uint64_t cksum ; + FILE *file ; + int k, read_count ; + + memset (buf, 0, sizeof (buf)) ; + + /* The 'b' in the mode string means binary for Win32. */ + if ((file = fopen (filename, "rb")) == NULL) + { printf ("\n\nLine %d: could not open file '%s'\n\n", line_num, filename) ; + exit (1) ; + } ; + + cksum = 0 ; + + while ((read_count = fread (buf, 1, sizeof (buf), file))) + for (k = 0 ; k < read_count ; k++) + cksum = (cksum * 511 + buf [k]) & 0xfffffffffffff ; + + fclose (file) ; + + if (target_hash == 0) + { printf (" 0x%" PRIx64 "\n", cksum) ; + return ; + } ; + + if (cksum != target_hash) + { printf ("\n\nLine %d: incorrect hash value 0x%" PRIx64 " should be 0x%" PRIx64 ".\n\n", line_num, cksum, target_hash) ; + exit (1) ; + } ; + + return ; +} /* check_file_hash_or_die */ + +void +print_test_name (const char *test, const char *filename) +{ int count ; + + if (test == NULL) + { printf (__FILE__ ": bad test of filename parameter.\n") ; + exit (1) ; + } ; + + if (filename == NULL || strlen (filename) == 0) + { printf (" %-30s : ", test) ; + count = 25 ; + } + else + { printf (" %-30s : %s ", test, filename) ; + count = 24 - strlen (filename) ; + } ; + + while (count -- > 0) + putchar ('.') ; + putchar (' ') ; + + fflush (stdout) ; +} /* print_test_name */ + +void +dump_data_to_file (const char *filename, const void *data, unsigned int datalen) +{ FILE *file ; + + if ((file = fopen (filename, "wb")) == NULL) + { printf ("\n\nLine %d : could not open file : %s\n\n", __LINE__, filename) ; + exit (1) ; + } ; + + if (fwrite (data, 1, datalen, file) != datalen) + { printf ("\n\nLine %d : fwrite failed.\n\n", __LINE__) ; + exit (1) ; + } ; + + fclose (file) ; + +} /* dump_data_to_file */ + +/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +*/ + +static char octfilename [] = "error.dat" ; + +int +oct_save_short (const short *a, const short *b, int len) +{ FILE *file ; + int k ; + + if (! (file = fopen (octfilename, "w"))) + return 1 ; + + fprintf (file, "# Not created by Octave\n") ; + + fprintf (file, "# name: a\n") ; + fprintf (file, "# type: matrix\n") ; + fprintf (file, "# rows: %d\n", len) ; + fprintf (file, "# columns: 1\n") ; + + for (k = 0 ; k < len ; k++) + fprintf (file, "% d" "\n", a [k]) ; + + fprintf (file, "# name: b\n") ; + fprintf (file, "# type: matrix\n") ; + fprintf (file, "# rows: %d\n", len) ; + fprintf (file, "# columns: 1\n") ; + + for (k = 0 ; k < len ; k++) + fprintf (file, "% d" "\n", b [k]) ; + + fclose (file) ; + return 0 ; +} /* oct_save_short */ +int +oct_save_int (const int *a, const int *b, int len) +{ FILE *file ; + int k ; + + if (! (file = fopen (octfilename, "w"))) + return 1 ; + + fprintf (file, "# Not created by Octave\n") ; + + fprintf (file, "# name: a\n") ; + fprintf (file, "# type: matrix\n") ; + fprintf (file, "# rows: %d\n", len) ; + fprintf (file, "# columns: 1\n") ; + + for (k = 0 ; k < len ; k++) + fprintf (file, "% d" "\n", a [k]) ; + + fprintf (file, "# name: b\n") ; + fprintf (file, "# type: matrix\n") ; + fprintf (file, "# rows: %d\n", len) ; + fprintf (file, "# columns: 1\n") ; + + for (k = 0 ; k < len ; k++) + fprintf (file, "% d" "\n", b [k]) ; + + fclose (file) ; + return 0 ; +} /* oct_save_int */ +int +oct_save_float (const float *a, const float *b, int len) +{ FILE *file ; + int k ; + + if (! (file = fopen (octfilename, "w"))) + return 1 ; + + fprintf (file, "# Not created by Octave\n") ; + + fprintf (file, "# name: a\n") ; + fprintf (file, "# type: matrix\n") ; + fprintf (file, "# rows: %d\n", len) ; + fprintf (file, "# columns: 1\n") ; + + for (k = 0 ; k < len ; k++) + fprintf (file, "% g" "\n", a [k]) ; + + fprintf (file, "# name: b\n") ; + fprintf (file, "# type: matrix\n") ; + fprintf (file, "# rows: %d\n", len) ; + fprintf (file, "# columns: 1\n") ; + + for (k = 0 ; k < len ; k++) + fprintf (file, "% g" "\n", b [k]) ; + + fclose (file) ; + return 0 ; +} /* oct_save_float */ +int +oct_save_double (const double *a, const double *b, int len) +{ FILE *file ; + int k ; + + if (! (file = fopen (octfilename, "w"))) + return 1 ; + + fprintf (file, "# Not created by Octave\n") ; + + fprintf (file, "# name: a\n") ; + fprintf (file, "# type: matrix\n") ; + fprintf (file, "# rows: %d\n", len) ; + fprintf (file, "# columns: 1\n") ; + + for (k = 0 ; k < len ; k++) + fprintf (file, "% g" "\n", a [k]) ; + + fprintf (file, "# name: b\n") ; + fprintf (file, "# type: matrix\n") ; + fprintf (file, "# rows: %d\n", len) ; + fprintf (file, "# columns: 1\n") ; + + for (k = 0 ; k < len ; k++) + fprintf (file, "% g" "\n", b [k]) ; + + fclose (file) ; + return 0 ; +} /* oct_save_double */ + + +void +check_log_buffer_or_die (SNDFILE *file, int line_num) +{ static char buffer [LOG_BUFFER_SIZE] ; + int count ; + + memset (buffer, 0, sizeof (buffer)) ; + + /* Get the log buffer data. */ + count = sf_command (file, SFC_GET_LOG_INFO, buffer, LOG_BUFFER_SIZE) ; + + if (LOG_BUFFER_SIZE - count < 2) + { printf ("\n\nLine %d : Possible long log buffer.\n", line_num) ; + exit (1) ; + } + + /* Look for "Should" */ + if (strstr (buffer, "ould")) + { printf ("\n\nLine %d : Log buffer contains `ould'. Dumping.\n", line_num) ; + puts (buffer) ; + exit (1) ; + } ; + + /* Look for "**" */ + if (strstr (buffer, "*")) + { printf ("\n\nLine %d : Log buffer contains `*'. Dumping.\n", line_num) ; + puts (buffer) ; + exit (1) ; + } ; + + /* Look for "Should" */ + if (strstr (buffer, "nknown marker")) + { printf ("\n\nLine %d : Log buffer contains `nknown marker'. Dumping.\n", line_num) ; + puts (buffer) ; + exit (1) ; + } ; + + return ; +} /* check_log_buffer_or_die */ + +int +string_in_log_buffer (SNDFILE *file, const char *s) +{ static char buffer [LOG_BUFFER_SIZE] ; + int count ; + + memset (buffer, 0, sizeof (buffer)) ; + + /* Get the log buffer data. */ + count = sf_command (file, SFC_GET_LOG_INFO, buffer, LOG_BUFFER_SIZE) ; + + if (LOG_BUFFER_SIZE - count < 2) + { printf ("Possible long log buffer.\n") ; + exit (1) ; + } + + /* Look for string */ + return strstr (buffer, s) ? SF_TRUE : SF_FALSE ; +} /* string_in_log_buffer */ + +void +hexdump_file (const char * filename, sf_count_t offset, sf_count_t length) +{ + FILE * file ; + char buffer [16] ; + int k, m, ch, readcount ; + + if (length > 1000000) + { printf ("\n\nError : length (%" PRId64 ") too long.\n\n", offset) ; + exit (1) ; + } ; + + if ((file = fopen (filename, "r")) == NULL) + { printf ("\n\nError : hexdump_file (%s) could not open file for read.\n\n", filename) ; + exit (1) ; + } ; + + if (fseek (file, offset, SEEK_SET) != 0) + { printf ("\n\nError : fseek(file, %" PRId64 ", SEEK_SET) failed : %s\n\n", offset, strerror (errno)) ; + exit (1) ; + } ; + + puts ("\n\n") ; + + for (k = 0 ; k < length ; k+= sizeof (buffer)) + { readcount = fread (buffer, 1, sizeof (buffer), file) ; + + printf ("%08" PRIx64 " : ", offset + k) ; + + for (m = 0 ; m < readcount ; m++) + printf ("%02x ", buffer [m] & 0xFF) ; + + for (m = readcount ; m < SIGNED_SIZEOF (buffer) ; m++) + printf (" ") ; + + printf (" ") ; + for (m = 0 ; m < readcount ; m++) + { ch = isprint (buffer [m]) ? buffer [m] : '.' ; + putchar (ch) ; + } ; + + if (readcount < SIGNED_SIZEOF (buffer)) + break ; + + putchar ('\n') ; + } ; + + puts ("\n") ; + + fclose (file) ; +} /* hexdump_file */ + +void +dump_log_buffer (SNDFILE *file) +{ static char buffer [LOG_BUFFER_SIZE] ; + + memset (buffer, 0, sizeof (buffer)) ; + + /* Get the log buffer data. */ + sf_command (file, SFC_GET_LOG_INFO, buffer, LOG_BUFFER_SIZE) ; + + if (strlen (buffer) < 1) + puts ("Log buffer empty.\n") ; + else + puts (buffer) ; + + return ; +} /* dump_log_buffer */ + +void +test_sf_format_or_die (const SF_INFO *info, int line_num) +{ int res ; + + if ((res = sf_format_check (info)) != 1) + { printf ("\n\nLine %d : sf_format_check returned error (%d)\n\n", line_num, res) ; + exit (1) ; + } ; + + return ; +} /* test_sf_format_or_die */ + +SNDFILE * +test_open_file_or_die (const char *filename, int mode, SF_INFO *sfinfo, int allow_fd, int line_num) +{ static int count = 0 ; + + SNDFILE *file ; + const char *modestr, *func_name ; + int oflags = 0, omode = 0, err ; + + /* + ** Need to test both sf_open() and sf_open_fd(). + ** Do so alternately. + */ + switch (mode) + { case SFM_READ : + modestr = "SFM_READ" ; + oflags = O_RDONLY | O_BINARY ; + omode = 0 ; + break ; + + case SFM_WRITE : + modestr = "SFM_WRITE" ; + oflags = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ; + omode = S_IRUSR | S_IWUSR | S_IRGRP ; + break ; + + case SFM_RDWR : + modestr = "SFM_RDWR" ; + oflags = O_RDWR | O_CREAT | O_BINARY ; + omode = S_IRUSR | S_IWUSR | S_IRGRP ; + break ; + default : + printf ("\n\nLine %d: Bad mode.\n", line_num) ; + fflush (stdout) ; + exit (1) ; + } ; + + if (OS_IS_WIN32) + { /* Windows does not understand and ignores the S_IRGRP flag, but Wine + ** gives a run time warning message, so just clear it. + */ + omode &= ~S_IRGRP ; + } ; + + if (allow_fd && ((++count) & 1) == 1) + { int fd ; + + /* Only use the three argument open() function if omode != 0. */ + fd = (omode == 0) ? open (filename, oflags) : open (filename, oflags, omode) ; + + if (fd < 0) + { printf ("\n\n%s : open failed : %s\n", __func__, strerror (errno)) ; + exit (1) ; + } ; + + func_name = "sf_open_fd" ; + file = sf_open_fd (fd, mode, sfinfo, SF_TRUE) ; + } + else + { func_name = "sf_open" ; + file = sf_open (filename, mode, sfinfo) ; + } ; + + if (file == NULL) + { printf ("\n\nLine %d: %s (%s) failed : %s\n\n", line_num, func_name, modestr, sf_strerror (NULL)) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + err = sf_error (file) ; + if (err != SF_ERR_NO_ERROR) + { printf ("\n\nLine %d : sf_error : %s\n\n", line_num, sf_error_number (err)) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + return file ; +} /* test_open_file_or_die */ + +void +test_read_write_position_or_die (SNDFILE *file, int line_num, int pass, sf_count_t read_pos, sf_count_t write_pos) +{ sf_count_t pos ; + + /* Check the current read position. */ + if (read_pos >= 0 && (pos = sf_seek (file, 0, SEEK_CUR | SFM_READ)) != read_pos) + { printf ("\n\nLine %d ", line_num) ; + if (pass > 0) + printf ("(pass %d): ", pass) ; + printf ("Read position (%" PRId64 ") should be %" PRId64 ".\n", pos, read_pos) ; + exit (1) ; + } ; + + /* Check the current write position. */ + if (write_pos >= 0 && (pos = sf_seek (file, 0, SEEK_CUR | SFM_WRITE)) != write_pos) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : Write position (%" PRId64 ") should be %" PRId64 ".\n", pos, write_pos) ; + exit (1) ; + } ; + + return ; +} /* test_read_write_position */ + +void +test_seek_or_die (SNDFILE *file, sf_count_t offset, int whence, sf_count_t new_pos, int channels, int line_num) +{ sf_count_t position ; + const char *channel_name, *whence_name ; + + switch (whence) + { case SEEK_SET : + whence_name = "SEEK_SET" ; + break ; + case SEEK_CUR : + whence_name = "SEEK_CUR" ; + break ; + case SEEK_END : + whence_name = "SEEK_END" ; + break ; + + /* SFM_READ */ + case SEEK_SET | SFM_READ : + whence_name = "SFM_READ | SEEK_SET" ; + break ; + case SEEK_CUR | SFM_READ : + whence_name = "SFM_READ | SEEK_CUR" ; + break ; + case SEEK_END | SFM_READ : + whence_name = "SFM_READ | SEEK_END" ; + break ; + + /* SFM_WRITE */ + case SEEK_SET | SFM_WRITE : + whence_name = "SFM_WRITE | SEEK_SET" ; + break ; + case SEEK_CUR | SFM_WRITE : + whence_name = "SFM_WRITE | SEEK_CUR" ; + break ; + case SEEK_END | SFM_WRITE : + whence_name = "SFM_WRITE | SEEK_END" ; + break ; + + default : + printf ("\n\nLine %d: bad whence parameter.\n", line_num) ; + exit (1) ; + } ; + + channel_name = (channels == 1) ? "Mono" : "Stereo" ; + + if ((position = sf_seek (file, offset, whence)) != new_pos) + { printf ("\n\nLine %d : %s : sf_seek (file, %" PRId64 ", %s) returned %" PRId64 " (should be %" PRId64 ").\n\n", + line_num, channel_name, offset, whence_name, position, new_pos) ; + exit (1) ; + } ; + +} /* test_seek_or_die */ + + + +void +test_read_short_or_die (SNDFILE *file, int pass, short *test, sf_count_t items, int line_num) +{ sf_count_t count ; + + if ((count = sf_read_short (file, test, items)) != items) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_read_short failed with short read (%" PRId64 " => %" PRId64 ").\n", + items, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_read_short_or_die */ + +void +test_read_int_or_die (SNDFILE *file, int pass, int *test, sf_count_t items, int line_num) +{ sf_count_t count ; + + if ((count = sf_read_int (file, test, items)) != items) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_read_int failed with short read (%" PRId64 " => %" PRId64 ").\n", + items, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_read_int_or_die */ + +void +test_read_float_or_die (SNDFILE *file, int pass, float *test, sf_count_t items, int line_num) +{ sf_count_t count ; + + if ((count = sf_read_float (file, test, items)) != items) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_read_float failed with short read (%" PRId64 " => %" PRId64 ").\n", + items, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_read_float_or_die */ + +void +test_read_double_or_die (SNDFILE *file, int pass, double *test, sf_count_t items, int line_num) +{ sf_count_t count ; + + if ((count = sf_read_double (file, test, items)) != items) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_read_double failed with short read (%" PRId64 " => %" PRId64 ").\n", + items, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_read_double_or_die */ + + +void +test_readf_short_or_die (SNDFILE *file, int pass, short *test, sf_count_t frames, int line_num) +{ sf_count_t count ; + + if ((count = sf_readf_short (file, test, frames)) != frames) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_readf_short failed with short readf (%" PRId64 " => %" PRId64 ").\n", + frames, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_readf_short_or_die */ + +void +test_readf_int_or_die (SNDFILE *file, int pass, int *test, sf_count_t frames, int line_num) +{ sf_count_t count ; + + if ((count = sf_readf_int (file, test, frames)) != frames) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_readf_int failed with short readf (%" PRId64 " => %" PRId64 ").\n", + frames, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_readf_int_or_die */ + +void +test_readf_float_or_die (SNDFILE *file, int pass, float *test, sf_count_t frames, int line_num) +{ sf_count_t count ; + + if ((count = sf_readf_float (file, test, frames)) != frames) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_readf_float failed with short readf (%" PRId64 " => %" PRId64 ").\n", + frames, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_readf_float_or_die */ + +void +test_readf_double_or_die (SNDFILE *file, int pass, double *test, sf_count_t frames, int line_num) +{ sf_count_t count ; + + if ((count = sf_readf_double (file, test, frames)) != frames) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_readf_double failed with short readf (%" PRId64 " => %" PRId64 ").\n", + frames, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_readf_double_or_die */ + + +void +test_read_raw_or_die (SNDFILE *file, int pass, void *test, sf_count_t items, int line_num) +{ sf_count_t count ; + + if ((count = sf_read_raw (file, test, items)) != items) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_read_raw failed with short read (%" PRId64 " => %" PRId64 ").\n", items, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_read_raw_or_die */ + + + +void +test_write_short_or_die (SNDFILE *file, int pass, const short *test, sf_count_t items, int line_num) +{ sf_count_t count ; + + if ((count = sf_write_short (file, test, items)) != items) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_write_short failed with short write (%" PRId64 " => %" PRId64 ").\n", + items, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_write_short_or_die */ + +void +test_write_int_or_die (SNDFILE *file, int pass, const int *test, sf_count_t items, int line_num) +{ sf_count_t count ; + + if ((count = sf_write_int (file, test, items)) != items) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_write_int failed with short write (%" PRId64 " => %" PRId64 ").\n", + items, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_write_int_or_die */ + +void +test_write_float_or_die (SNDFILE *file, int pass, const float *test, sf_count_t items, int line_num) +{ sf_count_t count ; + + if ((count = sf_write_float (file, test, items)) != items) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_write_float failed with short write (%" PRId64 " => %" PRId64 ").\n", + items, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_write_float_or_die */ + +void +test_write_double_or_die (SNDFILE *file, int pass, const double *test, sf_count_t items, int line_num) +{ sf_count_t count ; + + if ((count = sf_write_double (file, test, items)) != items) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_write_double failed with short write (%" PRId64 " => %" PRId64 ").\n", + items, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_write_double_or_die */ + + +void +test_writef_short_or_die (SNDFILE *file, int pass, const short *test, sf_count_t frames, int line_num) +{ sf_count_t count ; + + if ((count = sf_writef_short (file, test, frames)) != frames) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_writef_short failed with short writef (%" PRId64 " => %" PRId64 ").\n", + frames, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_writef_short_or_die */ + +void +test_writef_int_or_die (SNDFILE *file, int pass, const int *test, sf_count_t frames, int line_num) +{ sf_count_t count ; + + if ((count = sf_writef_int (file, test, frames)) != frames) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_writef_int failed with short writef (%" PRId64 " => %" PRId64 ").\n", + frames, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_writef_int_or_die */ + +void +test_writef_float_or_die (SNDFILE *file, int pass, const float *test, sf_count_t frames, int line_num) +{ sf_count_t count ; + + if ((count = sf_writef_float (file, test, frames)) != frames) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_writef_float failed with short writef (%" PRId64 " => %" PRId64 ").\n", + frames, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_writef_float_or_die */ + +void +test_writef_double_or_die (SNDFILE *file, int pass, const double *test, sf_count_t frames, int line_num) +{ sf_count_t count ; + + if ((count = sf_writef_double (file, test, frames)) != frames) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_writef_double failed with short writef (%" PRId64 " => %" PRId64 ").\n", + frames, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_writef_double_or_die */ + + +void +test_write_raw_or_die (SNDFILE *file, int pass, const void *test, sf_count_t items, int line_num) +{ sf_count_t count ; + + if ((count = sf_write_raw (file, test, items)) != items) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_write_raw failed with short write (%" PRId64 " => %" PRId64 ").\n", items, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_write_raw_or_die */ + + +void +compare_short_or_die (const short *expected, const short *actual, unsigned count, int line_num) +{ + unsigned k ; + + for (k = 0 ; k < count ; k++) + if (expected [k] != actual [k]) + { printf ("\n\nLine %d : Error at index %d, got " "% d" ", should be " "% d" ".\n\n", line_num, k, actual [k], expected [k]) ; + exit (1) ; + } ; + + return ; +} /* compare_short_or_die */ +void +compare_int_or_die (const int *expected, const int *actual, unsigned count, int line_num) +{ + unsigned k ; + + for (k = 0 ; k < count ; k++) + if (expected [k] != actual [k]) + { printf ("\n\nLine %d : Error at index %d, got " "% d" ", should be " "% d" ".\n\n", line_num, k, actual [k], expected [k]) ; + exit (1) ; + } ; + + return ; +} /* compare_int_or_die */ +void +compare_float_or_die (const float *expected, const float *actual, unsigned count, int line_num) +{ + unsigned k ; + + for (k = 0 ; k < count ; k++) + if (expected [k] != actual [k]) + { printf ("\n\nLine %d : Error at index %d, got " "% g" ", should be " "% g" ".\n\n", line_num, k, actual [k], expected [k]) ; + exit (1) ; + } ; + + return ; +} /* compare_float_or_die */ +void +compare_double_or_die (const double *expected, const double *actual, unsigned count, int line_num) +{ + unsigned k ; + + for (k = 0 ; k < count ; k++) + if (expected [k] != actual [k]) + { printf ("\n\nLine %d : Error at index %d, got " "% g" ", should be " "% g" ".\n\n", line_num, k, actual [k], expected [k]) ; + exit (1) ; + } ; + + return ; +} /* compare_double_or_die */ + + + +void +delete_file (int format, const char *filename) +{ char rsrc_name [512], *fname ; + + unlink (filename) ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_SD2) + return ; + + /* + ** Now try for a resource fork stored as a separate file. + ** Grab the un-adulterated filename again. + */ + snprintf (rsrc_name, sizeof (rsrc_name), "%s", filename) ; + + if ((fname = strrchr (rsrc_name, '/')) != NULL) + fname ++ ; + else if ((fname = strrchr (rsrc_name, '\\')) != NULL) + fname ++ ; + else + fname = rsrc_name ; + + memmove (fname + 2, fname, strlen (fname) + 1) ; + fname [0] = '.' ; + fname [1] = '_' ; + + unlink (rsrc_name) ; +} /* delete_file */ + +int +truncate_file_to_zero (const char * fname) +{ FILE * file ; + + if ((file = fopen (fname, "w")) == NULL) + return errno ; + fclose (file) ; + + return 0 ; +} /* truncate_file_to_zero */ + +static int allowed_open_files = -1 ; + +void +count_open_files (void) +{ +#if OS_IS_WIN32 + return ; +#else + int k, count = 0 ; + struct stat statbuf ; + + if (allowed_open_files > 0) + return ; + + for (k = 0 ; k < 1024 ; k++) + if (fstat (k, &statbuf) == 0) + count ++ ; + + allowed_open_files = count ; +#endif +} /* count_open_files */ + +void +increment_open_file_count (void) +{ allowed_open_files ++ ; +} /* increment_open_file_count */ + +void +check_open_file_count_or_die (int lineno) +{ +#if OS_IS_WIN32 + (void) lineno ; + return ; +#else + int k, count = 0 ; + struct stat statbuf ; + + if (allowed_open_files < 0) + count_open_files () ; + + for (k = 0 ; k < 1024 ; k++) + if (fstat (k, &statbuf) == 0) + count ++ ; + + if (count > allowed_open_files) + { printf ("\nLine %d : number of open files (%d) > allowed (%d).\n\n", lineno, count, allowed_open_files) ; + exit (1) ; + } ; +#endif +} /* check_open_file_count_or_die */ + +void +write_mono_file (const char * filename, int format, int srate, float * output, int len) +{ SNDFILE * file ; + SF_INFO sfinfo ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + sfinfo.samplerate = srate ; + sfinfo.channels = 1 ; + sfinfo.format = format ; + + if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) + { printf ("sf_open (%s) : %s\n", filename, sf_strerror (NULL)) ; + exit (1) ; + } ; + + sf_write_float (file, output, len) ; + + sf_close (file) ; +} /* write_mono_file */ + +void +gen_lowpass_signal_float (float *data, int len) +{ int64_t value = 0x1243456 ; + double sample, last_val = 0.0 ; + int k ; + + for (k = 0 ; k < len ; k++) + { /* Not a crypto quality RNG. */ + value = (11117 * value + 211231) & 0xffffffff ; + value = (11117 * value + 211231) & 0xffffffff ; + value = (11117 * value + 211231) & 0xffffffff ; + + sample = value / (0x7fffffff * 1.000001) ; + sample = 0.2 * sample - 0.9 * last_val ; + + last_val = sample ; + + data [k] = 0.5 * (sample + sin (2.0 * k * M_PI * 1.0 / 32.0)) ; + } ; + +} /* gen_lowpass_signal_float */ + + +/* +** Windows is fucked. +** If a file is opened R/W and data is written to it, then fstat will return +** the correct file length, but stat will return zero. +*/ + +sf_count_t +file_length (const char * fname) +{ struct stat data ; + + if (stat (fname, &data) != 0) + return 0 ; + + return (sf_count_t) data.st_size ; +} /* file_length */ + +sf_count_t +file_length_fd (int fd) +{ struct stat data ; + + memset (&data, 0, sizeof (data)) ; + if (fstat (fd, &data) != 0) + return 0 ; + + return (sf_count_t) data.st_size ; +} /* file_length_fd */ + + + + diff --git a/libsndfile-1.0.31/tests/utils.def b/libsndfile-1.0.31/tests/utils.def new file mode 100644 index 0000000..0d94183 --- /dev/null +++ b/libsndfile-1.0.31/tests/utils.def @@ -0,0 +1,52 @@ +autogen definitions utils.tpl; + +float_type = { + name = float ; + }; + +float_type = { + name = double ; + }; + +/*----------------------------------*/ + +io_type = { + io_element = short ; + format_str = "\"% d\"" ; + }; + +io_type = { + io_element = int ; + format_str = "\"% d\"" ; + }; + +io_type = { + io_element = float ; + format_str = "\"% g\"" ; + }; + +io_type = { + io_element = double ; + format_str = "\"% g\"" ; + }; + +read_op = { + op_element = read ; + count_name = items ; + }; + +read_op = { + op_element = readf ; + count_name = frames ; + }; + +write_op = { + op_element = write ; + count_name = items ; + }; + +write_op = { + op_element = writef ; + count_name = frames ; + }; + diff --git a/libsndfile-1.0.31/tests/utils.h b/libsndfile-1.0.31/tests/utils.h new file mode 100644 index 0000000..69fb799 --- /dev/null +++ b/libsndfile-1.0.31/tests/utils.h @@ -0,0 +1,203 @@ +/* +** Copyright (C) 2002-2018 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +/* +** Utility functions to make writing the test suite easier. +** +** The .c and .h files were generated automagically with Autogen from +** the files utils.def and utils.tpl. +*/ + + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "sfconfig.h" + +#include +#include + +#define ARRAY_LEN(x) ((int) (sizeof (x)) / (sizeof ((x) [0]))) +#define SIGNED_SIZEOF(x) ((int64_t) (sizeof (x))) +#define NOT(x) (! (x)) +#define ABS(x) ((x) >= 0 ? (x) : - (x)) + +#define PIPE_INDEX(x) ((x) + 500) +#define PIPE_TEST_LEN 12345 + + +void gen_windowed_sine_float (float *data, int len, double maximum) ; +void gen_windowed_sine_double (double *data, int len, double maximum) ; + + +void create_short_sndfile (const char *filename, int format, int channels) ; + +void check_file_hash_or_die (const char *filename, uint64_t target_hash, int line_num) ; + +void print_test_name (const char *test, const char *filename) ; + +void dump_data_to_file (const char *filename, const void *data, unsigned int datalen) ; + +void write_mono_file (const char * filename, int format, int srate, float * output, int len) ; + +#ifdef __GNUC__ +static inline void +exit_if_true (int test, const char *format, ...) +#if (defined (__USE_MINGW_ANSI_STDIO) && __USE_MINGW_ANSI_STDIO && !defined (__clang__)) + __attribute__ ((format (gnu_printf, 2, 3))) ; +#else + __attribute__ ((format (printf, 2, 3))) ; +#endif +#endif + +static inline void +exit_if_true (int test, const char *format, ...) +{ if (test) + { va_list argptr ; + va_start (argptr, format) ; + vprintf (format, argptr) ; + va_end (argptr) ; + exit (1) ; + } ; +} /* exit_if_true */ + +static inline int32_t +arith_shift_left (int32_t x, int shift) +{ return (int32_t) (((uint32_t) x) << shift) ; +} /* arith_shift_left */ + +/* +** Functions for saving two vectors of data in an ascii text file which +** can then be loaded into GNU octave for comparison. +*/ + +int oct_save_short (const short *a, const short *b, int len) ; +int oct_save_int (const int *a, const int *b, int len) ; +int oct_save_float (const float *a, const float *b, int len) ; +int oct_save_double (const double *a, const double *b, int len) ; + + +void delete_file (int format, const char *filename) ; + +int truncate_file_to_zero (const char *fname) ; + +void count_open_files (void) ; +void increment_open_file_count (void) ; +void check_open_file_count_or_die (int lineno) ; + +#ifdef SNDFILE_H + +static inline void +sf_info_clear (SF_INFO * info) +{ memset (info, 0, sizeof (SF_INFO)) ; +} /* sf_info_clear */ + +static inline void +sf_info_setup (SF_INFO * info, int format, int samplerate, int channels) +{ sf_info_clear (info) ; + + info->format = format ; + info->samplerate = samplerate ; + info->channels = channels ; +} /* sf_info_setup */ + + +void dump_log_buffer (SNDFILE *file) ; +void check_log_buffer_or_die (SNDFILE *file, int line_num) ; +int string_in_log_buffer (SNDFILE *file, const char *s) ; +void hexdump_file (const char * filename, sf_count_t offset, sf_count_t length) ; + +void test_sf_format_or_die (const SF_INFO *info, int line_num) ; + +SNDFILE *test_open_file_or_die + (const char *filename, int mode, SF_INFO *sfinfo, int allow_fd, int line_num) ; + +void test_read_write_position_or_die + (SNDFILE *file, int line_num, int pass, sf_count_t read_pos, sf_count_t write_pos) ; + +void test_seek_or_die + (SNDFILE *file, sf_count_t offset, int whence, sf_count_t new_pos, int channels, int line_num) ; + + +void test_read_short_or_die + (SNDFILE *file, int pass, short *test, sf_count_t items, int line_num) ; +void test_read_int_or_die + (SNDFILE *file, int pass, int *test, sf_count_t items, int line_num) ; +void test_read_float_or_die + (SNDFILE *file, int pass, float *test, sf_count_t items, int line_num) ; +void test_read_double_or_die + (SNDFILE *file, int pass, double *test, sf_count_t items, int line_num) ; + +void test_readf_short_or_die + (SNDFILE *file, int pass, short *test, sf_count_t frames, int line_num) ; +void test_readf_int_or_die + (SNDFILE *file, int pass, int *test, sf_count_t frames, int line_num) ; +void test_readf_float_or_die + (SNDFILE *file, int pass, float *test, sf_count_t frames, int line_num) ; +void test_readf_double_or_die + (SNDFILE *file, int pass, double *test, sf_count_t frames, int line_num) ; + + +void +test_read_raw_or_die (SNDFILE *file, int pass, void *test, sf_count_t items, int line_num) ; + + +void test_write_short_or_die + (SNDFILE *file, int pass, const short *test, sf_count_t items, int line_num) ; +void test_write_int_or_die + (SNDFILE *file, int pass, const int *test, sf_count_t items, int line_num) ; +void test_write_float_or_die + (SNDFILE *file, int pass, const float *test, sf_count_t items, int line_num) ; +void test_write_double_or_die + (SNDFILE *file, int pass, const double *test, sf_count_t items, int line_num) ; + +void test_writef_short_or_die + (SNDFILE *file, int pass, const short *test, sf_count_t frames, int line_num) ; +void test_writef_int_or_die + (SNDFILE *file, int pass, const int *test, sf_count_t frames, int line_num) ; +void test_writef_float_or_die + (SNDFILE *file, int pass, const float *test, sf_count_t frames, int line_num) ; +void test_writef_double_or_die + (SNDFILE *file, int pass, const double *test, sf_count_t frames, int line_num) ; + + +void +test_write_raw_or_die (SNDFILE *file, int pass, const void *test, sf_count_t items, int line_num) ; + +void compare_short_or_die (const short *expected, const short *actual, unsigned count, int line_num) ; +void compare_int_or_die (const int *expected, const int *actual, unsigned count, int line_num) ; +void compare_float_or_die (const float *expected, const float *actual, unsigned count, int line_num) ; +void compare_double_or_die (const double *expected, const double *actual, unsigned count, int line_num) ; + + + +void gen_lowpass_signal_float (float *data, int len) ; + +sf_count_t file_length (const char * fname) ; +sf_count_t file_length_fd (int fd) ; + +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + + + diff --git a/libsndfile-1.0.31/tests/utils.tpl b/libsndfile-1.0.31/tests/utils.tpl new file mode 100644 index 0000000..7be35fa --- /dev/null +++ b/libsndfile-1.0.31/tests/utils.tpl @@ -0,0 +1,927 @@ +[+ AutoGen5 template h c +] +/* +** Copyright (C) 2002-2018 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +/* +** Utility functions to make writing the test suite easier. +** +** The .c and .h files were generated automagically with Autogen from +** the files utils.def and utils.tpl. +*/ + +[+ CASE (suffix) +] +[+ == h +] + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "sfconfig.h" + +#include +#include + +#define ARRAY_LEN(x) ((int) (sizeof (x)) / (sizeof ((x) [0]))) +#define SIGNED_SIZEOF(x) ((int64_t) (sizeof (x))) +#define NOT(x) (! (x)) +#define ABS(x) ((x) >= 0 ? (x) : - (x)) + +#define PIPE_INDEX(x) ((x) + 500) +#define PIPE_TEST_LEN 12345 + + +[+ FOR float_type ++]void gen_windowed_sine_[+ (get "name") +] ([+ (get "name") +] *data, int len, double maximum) ; +[+ ENDFOR float_type ++] + +void create_short_sndfile (const char *filename, int format, int channels) ; + +void check_file_hash_or_die (const char *filename, uint64_t target_hash, int line_num) ; + +void print_test_name (const char *test, const char *filename) ; + +void dump_data_to_file (const char *filename, const void *data, unsigned int datalen) ; + +void write_mono_file (const char * filename, int format, int srate, float * output, int len) ; + +#ifdef __GNUC__ +static inline void +exit_if_true (int test, const char *format, ...) +#if (defined (__USE_MINGW_ANSI_STDIO) && __USE_MINGW_ANSI_STDIO && !defined (__clang__)) + __attribute__ ((format (gnu_printf, 2, 3))) ; +#else + __attribute__ ((format (printf, 2, 3))) ; +#endif +#endif + +static inline void +exit_if_true (int test, const char *format, ...) +{ if (test) + { va_list argptr ; + va_start (argptr, format) ; + vprintf (format, argptr) ; + va_end (argptr) ; + exit (1) ; + } ; +} /* exit_if_true */ + +static inline int32_t +arith_shift_left (int32_t x, int shift) +{ return (int32_t) (((uint32_t) x) << shift) ; +} /* arith_shift_left */ + +/* +** Functions for saving two vectors of data in an ascii text file which +** can then be loaded into GNU octave for comparison. +*/ + +[+ FOR io_type ++]int oct_save_[+ (get "io_element") +] (const [+ (get "io_element") +] *a, const [+ (get "io_element") +] *b, int len) ; +[+ ENDFOR io_type ++] + +void delete_file (int format, const char *filename) ; + +int truncate_file_to_zero (const char *fname) ; + +void count_open_files (void) ; +void increment_open_file_count (void) ; +void check_open_file_count_or_die (int lineno) ; + +#ifdef SNDFILE_H + +static inline void +sf_info_clear (SF_INFO * info) +{ memset (info, 0, sizeof (SF_INFO)) ; +} /* sf_info_clear */ + +static inline void +sf_info_setup (SF_INFO * info, int format, int samplerate, int channels) +{ sf_info_clear (info) ; + + info->format = format ; + info->samplerate = samplerate ; + info->channels = channels ; +} /* sf_info_setup */ + + +void dump_log_buffer (SNDFILE *file) ; +void check_log_buffer_or_die (SNDFILE *file, int line_num) ; +int string_in_log_buffer (SNDFILE *file, const char *s) ; +void hexdump_file (const char * filename, sf_count_t offset, sf_count_t length) ; + +void test_sf_format_or_die (const SF_INFO *info, int line_num) ; + +SNDFILE *test_open_file_or_die + (const char *filename, int mode, SF_INFO *sfinfo, int allow_fd, int line_num) ; + +void test_read_write_position_or_die + (SNDFILE *file, int line_num, int pass, sf_count_t read_pos, sf_count_t write_pos) ; + +void test_seek_or_die + (SNDFILE *file, sf_count_t offset, int whence, sf_count_t new_pos, int channels, int line_num) ; + +[+ FOR read_op +] +[+ FOR io_type ++]void test_[+ (get "op_element") +]_[+ (get "io_element") +]_or_die + (SNDFILE *file, int pass, [+ (get "io_element") +] *test, sf_count_t [+ (get "count_name") +], int line_num) ; +[+ ENDFOR io_type +][+ ENDFOR read_op +] + +void +test_read_raw_or_die (SNDFILE *file, int pass, void *test, sf_count_t items, int line_num) ; + +[+ FOR write_op +] +[+ FOR io_type ++]void test_[+ (get "op_element") +]_[+ (get "io_element") +]_or_die + (SNDFILE *file, int pass, const [+ (get "io_element") +] *test, sf_count_t [+ (get "count_name") +], int line_num) ; +[+ ENDFOR io_type +][+ ENDFOR write_op +] + +void +test_write_raw_or_die (SNDFILE *file, int pass, const void *test, sf_count_t items, int line_num) ; + +[+ FOR io_type ++]void compare_[+ (get "io_element") +]_or_die (const [+ (get "io_element") +] *expected, const [+ (get "io_element") +] *actual, unsigned count, int line_num) ; +[+ ENDFOR io_type +] + + +void gen_lowpass_signal_float (float *data, int len) ; + +sf_count_t file_length (const char * fname) ; +sf_count_t file_length_fd (int fd) ; + +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +[+ == c +] + +#include "sfconfig.h" + +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#endif + +#if (HAVE_DECL_S_IRGRP == 0) +#include +#endif + +#include +#include +#include +#include +#include +#include + +#include + +#include "utils.h" + +#ifndef M_PI +#define M_PI 3.14159265358979323846264338 +#endif + +#define LOG_BUFFER_SIZE 4096 + +/* +** Neat solution to the Win32/OS2 binary file flage requirement. +** If O_BINARY isn't already defined by the inclusion of the system +** headers, set it to zero. +*/ +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +[+ FOR float_type +] +void +gen_windowed_sine_[+ (get "name") +] ([+ (get "name") +] *data, int len, double maximum) +{ int k ; + + memset (data, 0, len * sizeof ([+ (get "name") +])) ; + + len = (5 * len) / 6 ; + + for (k = 0 ; k < len ; k++) + { data [k] = sin (2.0 * k * M_PI * 1.0 / 32.0 + 0.4) ; + + /* Apply Hanning Window. */ + data [k] *= maximum * (0.5 - 0.5 * cos (2.0 * M_PI * k / ((len) - 1))) ; + } + + return ; +} /* gen_windowed_sine_[+ (get "name") +] */ +[+ ENDFOR float_type +] + +void +create_short_sndfile (const char *filename, int format, int channels) +{ short data [2 * 3 * 4 * 5 * 6 * 7] = { 0, } ; + SNDFILE *file ; + SF_INFO sfinfo ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.samplerate = 44100 ; + sfinfo.channels = channels ; + sfinfo.format = format ; + + if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) + { printf ("Error (%s, %d) : sf_open failed : %s\n", __FILE__, __LINE__, sf_strerror (file)) ; + exit (1) ; + } ; + + sf_write_short (file, data, ARRAY_LEN (data)) ; + + sf_close (file) ; +} /* create_short_sndfile */ + +void +check_file_hash_or_die (const char *filename, uint64_t target_hash, int line_num) +{ static unsigned char buf [4096] ; + uint64_t cksum ; + FILE *file ; + int k, read_count ; + + memset (buf, 0, sizeof (buf)) ; + + /* The 'b' in the mode string means binary for Win32. */ + if ((file = fopen (filename, "rb")) == NULL) + { printf ("\n\nLine %d: could not open file '%s'\n\n", line_num, filename) ; + exit (1) ; + } ; + + cksum = 0 ; + + while ((read_count = fread (buf, 1, sizeof (buf), file))) + for (k = 0 ; k < read_count ; k++) + cksum = (cksum * 511 + buf [k]) & 0xfffffffffffff ; + + fclose (file) ; + + if (target_hash == 0) + { printf (" 0x%" PRIx64 "\n", cksum) ; + return ; + } ; + + if (cksum != target_hash) + { printf ("\n\nLine %d: incorrect hash value 0x%" PRIx64 " should be 0x%" PRIx64 ".\n\n", line_num, cksum, target_hash) ; + exit (1) ; + } ; + + return ; +} /* check_file_hash_or_die */ + +void +print_test_name (const char *test, const char *filename) +{ int count ; + + if (test == NULL) + { printf (__FILE__ ": bad test of filename parameter.\n") ; + exit (1) ; + } ; + + if (filename == NULL || strlen (filename) == 0) + { printf (" %-30s : ", test) ; + count = 25 ; + } + else + { printf (" %-30s : %s ", test, filename) ; + count = 24 - strlen (filename) ; + } ; + + while (count -- > 0) + putchar ('.') ; + putchar (' ') ; + + fflush (stdout) ; +} /* print_test_name */ + +void +dump_data_to_file (const char *filename, const void *data, unsigned int datalen) +{ FILE *file ; + + if ((file = fopen (filename, "wb")) == NULL) + { printf ("\n\nLine %d : could not open file : %s\n\n", __LINE__, filename) ; + exit (1) ; + } ; + + if (fwrite (data, 1, datalen, file) != datalen) + { printf ("\n\nLine %d : fwrite failed.\n\n", __LINE__) ; + exit (1) ; + } ; + + fclose (file) ; + +} /* dump_data_to_file */ + +/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +*/ + +static char octfilename [] = "error.dat" ; + +[+ FOR io_type ++]int +oct_save_[+ (get "io_element") +] (const [+ (get "io_element") +] *a, const [+ (get "io_element") +] *b, int len) +{ FILE *file ; + int k ; + + if (! (file = fopen (octfilename, "w"))) + return 1 ; + + fprintf (file, "# Not created by Octave\n") ; + + fprintf (file, "# name: a\n") ; + fprintf (file, "# type: matrix\n") ; + fprintf (file, "# rows: %d\n", len) ; + fprintf (file, "# columns: 1\n") ; + + for (k = 0 ; k < len ; k++) + fprintf (file, [+ (get "format_str") +] "\n", a [k]) ; + + fprintf (file, "# name: b\n") ; + fprintf (file, "# type: matrix\n") ; + fprintf (file, "# rows: %d\n", len) ; + fprintf (file, "# columns: 1\n") ; + + for (k = 0 ; k < len ; k++) + fprintf (file, [+ (get "format_str") +] "\n", b [k]) ; + + fclose (file) ; + return 0 ; +} /* oct_save_[+ (get "io_element") +] */ +[+ ENDFOR io_type ++] + +void +check_log_buffer_or_die (SNDFILE *file, int line_num) +{ static char buffer [LOG_BUFFER_SIZE] ; + int count ; + + memset (buffer, 0, sizeof (buffer)) ; + + /* Get the log buffer data. */ + count = sf_command (file, SFC_GET_LOG_INFO, buffer, LOG_BUFFER_SIZE) ; + + if (LOG_BUFFER_SIZE - count < 2) + { printf ("\n\nLine %d : Possible long log buffer.\n", line_num) ; + exit (1) ; + } + + /* Look for "Should" */ + if (strstr (buffer, "ould")) + { printf ("\n\nLine %d : Log buffer contains `ould'. Dumping.\n", line_num) ; + puts (buffer) ; + exit (1) ; + } ; + + /* Look for "**" */ + if (strstr (buffer, "*")) + { printf ("\n\nLine %d : Log buffer contains `*'. Dumping.\n", line_num) ; + puts (buffer) ; + exit (1) ; + } ; + + /* Look for "Should" */ + if (strstr (buffer, "nknown marker")) + { printf ("\n\nLine %d : Log buffer contains `nknown marker'. Dumping.\n", line_num) ; + puts (buffer) ; + exit (1) ; + } ; + + return ; +} /* check_log_buffer_or_die */ + +int +string_in_log_buffer (SNDFILE *file, const char *s) +{ static char buffer [LOG_BUFFER_SIZE] ; + int count ; + + memset (buffer, 0, sizeof (buffer)) ; + + /* Get the log buffer data. */ + count = sf_command (file, SFC_GET_LOG_INFO, buffer, LOG_BUFFER_SIZE) ; + + if (LOG_BUFFER_SIZE - count < 2) + { printf ("Possible long log buffer.\n") ; + exit (1) ; + } + + /* Look for string */ + return strstr (buffer, s) ? SF_TRUE : SF_FALSE ; +} /* string_in_log_buffer */ + +void +hexdump_file (const char * filename, sf_count_t offset, sf_count_t length) +{ + FILE * file ; + char buffer [16] ; + int k, m, ch, readcount ; + + if (length > 1000000) + { printf ("\n\nError : length (%" PRId64 ") too long.\n\n", offset) ; + exit (1) ; + } ; + + if ((file = fopen (filename, "r")) == NULL) + { printf ("\n\nError : hexdump_file (%s) could not open file for read.\n\n", filename) ; + exit (1) ; + } ; + + if (fseek (file, offset, SEEK_SET) != 0) + { printf ("\n\nError : fseek(file, %" PRId64 ", SEEK_SET) failed : %s\n\n", offset, strerror (errno)) ; + exit (1) ; + } ; + + puts ("\n\n") ; + + for (k = 0 ; k < length ; k+= sizeof (buffer)) + { readcount = fread (buffer, 1, sizeof (buffer), file) ; + + printf ("%08" PRIx64 " : ", offset + k) ; + + for (m = 0 ; m < readcount ; m++) + printf ("%02x ", buffer [m] & 0xFF) ; + + for (m = readcount ; m < SIGNED_SIZEOF (buffer) ; m++) + printf (" ") ; + + printf (" ") ; + for (m = 0 ; m < readcount ; m++) + { ch = isprint (buffer [m]) ? buffer [m] : '.' ; + putchar (ch) ; + } ; + + if (readcount < SIGNED_SIZEOF (buffer)) + break ; + + putchar ('\n') ; + } ; + + puts ("\n") ; + + fclose (file) ; +} /* hexdump_file */ + +void +dump_log_buffer (SNDFILE *file) +{ static char buffer [LOG_BUFFER_SIZE] ; + + memset (buffer, 0, sizeof (buffer)) ; + + /* Get the log buffer data. */ + sf_command (file, SFC_GET_LOG_INFO, buffer, LOG_BUFFER_SIZE) ; + + if (strlen (buffer) < 1) + puts ("Log buffer empty.\n") ; + else + puts (buffer) ; + + return ; +} /* dump_log_buffer */ + +void +test_sf_format_or_die (const SF_INFO *info, int line_num) +{ int res ; + + if ((res = sf_format_check (info)) != 1) + { printf ("\n\nLine %d : sf_format_check returned error (%d)\n\n", line_num, res) ; + exit (1) ; + } ; + + return ; +} /* test_sf_format_or_die */ + +SNDFILE * +test_open_file_or_die (const char *filename, int mode, SF_INFO *sfinfo, int allow_fd, int line_num) +{ static int count = 0 ; + + SNDFILE *file ; + const char *modestr, *func_name ; + int oflags = 0, omode = 0, err ; + + /* + ** Need to test both sf_open() and sf_open_fd(). + ** Do so alternately. + */ + switch (mode) + { case SFM_READ : + modestr = "SFM_READ" ; + oflags = O_RDONLY | O_BINARY ; + omode = 0 ; + break ; + + case SFM_WRITE : + modestr = "SFM_WRITE" ; + oflags = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ; + omode = S_IRUSR | S_IWUSR | S_IRGRP ; + break ; + + case SFM_RDWR : + modestr = "SFM_RDWR" ; + oflags = O_RDWR | O_CREAT | O_BINARY ; + omode = S_IRUSR | S_IWUSR | S_IRGRP ; + break ; + default : + printf ("\n\nLine %d: Bad mode.\n", line_num) ; + fflush (stdout) ; + exit (1) ; + } ; + + if (OS_IS_WIN32) + { /* Windows does not understand and ignores the S_IRGRP flag, but Wine + ** gives a run time warning message, so just clear it. + */ + omode &= ~S_IRGRP ; + } ; + + if (allow_fd && ((++count) & 1) == 1) + { int fd ; + + /* Only use the three argument open() function if omode != 0. */ + fd = (omode == 0) ? open (filename, oflags) : open (filename, oflags, omode) ; + + if (fd < 0) + { printf ("\n\n%s : open failed : %s\n", __func__, strerror (errno)) ; + exit (1) ; + } ; + + func_name = "sf_open_fd" ; + file = sf_open_fd (fd, mode, sfinfo, SF_TRUE) ; + } + else + { func_name = "sf_open" ; + file = sf_open (filename, mode, sfinfo) ; + } ; + + if (file == NULL) + { printf ("\n\nLine %d: %s (%s) failed : %s\n\n", line_num, func_name, modestr, sf_strerror (NULL)) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + err = sf_error (file) ; + if (err != SF_ERR_NO_ERROR) + { printf ("\n\nLine %d : sf_error : %s\n\n", line_num, sf_error_number (err)) ; + dump_log_buffer (file) ; + exit (1) ; + } ; + + return file ; +} /* test_open_file_or_die */ + +void +test_read_write_position_or_die (SNDFILE *file, int line_num, int pass, sf_count_t read_pos, sf_count_t write_pos) +{ sf_count_t pos ; + + /* Check the current read position. */ + if (read_pos >= 0 && (pos = sf_seek (file, 0, SEEK_CUR | SFM_READ)) != read_pos) + { printf ("\n\nLine %d ", line_num) ; + if (pass > 0) + printf ("(pass %d): ", pass) ; + printf ("Read position (%" PRId64 ") should be %" PRId64 ".\n", pos, read_pos) ; + exit (1) ; + } ; + + /* Check the current write position. */ + if (write_pos >= 0 && (pos = sf_seek (file, 0, SEEK_CUR | SFM_WRITE)) != write_pos) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : Write position (%" PRId64 ") should be %" PRId64 ".\n", pos, write_pos) ; + exit (1) ; + } ; + + return ; +} /* test_read_write_position */ + +void +test_seek_or_die (SNDFILE *file, sf_count_t offset, int whence, sf_count_t new_pos, int channels, int line_num) +{ sf_count_t position ; + const char *channel_name, *whence_name ; + + switch (whence) + { case SEEK_SET : + whence_name = "SEEK_SET" ; + break ; + case SEEK_CUR : + whence_name = "SEEK_CUR" ; + break ; + case SEEK_END : + whence_name = "SEEK_END" ; + break ; + + /* SFM_READ */ + case SEEK_SET | SFM_READ : + whence_name = "SFM_READ | SEEK_SET" ; + break ; + case SEEK_CUR | SFM_READ : + whence_name = "SFM_READ | SEEK_CUR" ; + break ; + case SEEK_END | SFM_READ : + whence_name = "SFM_READ | SEEK_END" ; + break ; + + /* SFM_WRITE */ + case SEEK_SET | SFM_WRITE : + whence_name = "SFM_WRITE | SEEK_SET" ; + break ; + case SEEK_CUR | SFM_WRITE : + whence_name = "SFM_WRITE | SEEK_CUR" ; + break ; + case SEEK_END | SFM_WRITE : + whence_name = "SFM_WRITE | SEEK_END" ; + break ; + + default : + printf ("\n\nLine %d: bad whence parameter.\n", line_num) ; + exit (1) ; + } ; + + channel_name = (channels == 1) ? "Mono" : "Stereo" ; + + if ((position = sf_seek (file, offset, whence)) != new_pos) + { printf ("\n\nLine %d : %s : sf_seek (file, %" PRId64 ", %s) returned %" PRId64 " (should be %" PRId64 ").\n\n", + line_num, channel_name, offset, whence_name, position, new_pos) ; + exit (1) ; + } ; + +} /* test_seek_or_die */ + +[+ FOR read_op +] +[+ FOR io_type +] +void +test_[+ (get "op_element") +]_[+ (get "io_element") +]_or_die (SNDFILE *file, int pass, [+ (get "io_element") +] *test, sf_count_t [+ (get "count_name") +], int line_num) +{ sf_count_t count ; + + if ((count = sf_[+ (get "op_element") +]_[+ (get "io_element") +] (file, test, [+ (get "count_name") +])) != [+ (get "count_name") +]) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_[+ (get "op_element") +]_[+ (get "io_element") +] failed with short [+ (get "op_element") +] (%" PRId64 " => %" PRId64 ").\n", + [+ (get "count_name") +], count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_[+ (get "op_element") +]_[+ (get "io_element") +]_or_die */ +[+ ENDFOR io_type +][+ ENDFOR read_op +] + +void +test_read_raw_or_die (SNDFILE *file, int pass, void *test, sf_count_t items, int line_num) +{ sf_count_t count ; + + if ((count = sf_read_raw (file, test, items)) != items) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_read_raw failed with short read (%" PRId64 " => %" PRId64 ").\n", items, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_read_raw_or_die */ + +[+ FOR write_op +] +[+ FOR io_type +] +void +test_[+ (get "op_element") +]_[+ (get "io_element") +]_or_die (SNDFILE *file, int pass, const [+ (get "io_element") +] *test, sf_count_t [+ (get "count_name") +], int line_num) +{ sf_count_t count ; + + if ((count = sf_[+ (get "op_element") +]_[+ (get "io_element") +] (file, test, [+ (get "count_name") +])) != [+ (get "count_name") +]) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_[+ (get "op_element") +]_[+ (get "io_element") +] failed with short [+ (get "op_element") +] (%" PRId64 " => %" PRId64 ").\n", + [+ (get "count_name") +], count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_[+ (get "op_element") +]_[+ (get "io_element") +]_or_die */ +[+ ENDFOR io_type +][+ ENDFOR write_op +] + +void +test_write_raw_or_die (SNDFILE *file, int pass, const void *test, sf_count_t items, int line_num) +{ sf_count_t count ; + + if ((count = sf_write_raw (file, test, items)) != items) + { printf ("\n\nLine %d", line_num) ; + if (pass > 0) + printf (" (pass %d)", pass) ; + printf (" : sf_write_raw failed with short write (%" PRId64 " => %" PRId64 ").\n", items, count) ; + fflush (stdout) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + return ; +} /* test_write_raw_or_die */ + + +[+ FOR io_type ++]void +compare_[+ (get "io_element") +]_or_die (const [+ (get "io_element") +] *expected, const [+ (get "io_element") +] *actual, unsigned count, int line_num) +{ + unsigned k ; + + for (k = 0 ; k < count ; k++) + if (expected [k] != actual [k]) + { printf ("\n\nLine %d : Error at index %d, got " [+ (get "format_str") +] ", should be " [+ (get "format_str") +] ".\n\n", line_num, k, actual [k], expected [k]) ; + exit (1) ; + } ; + + return ; +} /* compare_[+ (get "io_element") +]_or_die */ +[+ ENDFOR io_type +] + + +void +delete_file (int format, const char *filename) +{ char rsrc_name [512], *fname ; + + unlink (filename) ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_SD2) + return ; + + /* + ** Now try for a resource fork stored as a separate file. + ** Grab the un-adulterated filename again. + */ + snprintf (rsrc_name, sizeof (rsrc_name), "%s", filename) ; + + if ((fname = strrchr (rsrc_name, '/')) != NULL) + fname ++ ; + else if ((fname = strrchr (rsrc_name, '\\')) != NULL) + fname ++ ; + else + fname = rsrc_name ; + + memmove (fname + 2, fname, strlen (fname) + 1) ; + fname [0] = '.' ; + fname [1] = '_' ; + + unlink (rsrc_name) ; +} /* delete_file */ + +int +truncate_file_to_zero (const char * fname) +{ FILE * file ; + + if ((file = fopen (fname, "w")) == NULL) + return errno ; + fclose (file) ; + + return 0 ; +} /* truncate_file_to_zero */ + +static int allowed_open_files = -1 ; + +void +count_open_files (void) +{ +#if OS_IS_WIN32 + return ; +#else + int k, count = 0 ; + struct stat statbuf ; + + if (allowed_open_files > 0) + return ; + + for (k = 0 ; k < 1024 ; k++) + if (fstat (k, &statbuf) == 0) + count ++ ; + + allowed_open_files = count ; +#endif +} /* count_open_files */ + +void +increment_open_file_count (void) +{ allowed_open_files ++ ; +} /* increment_open_file_count */ + +void +check_open_file_count_or_die (int lineno) +{ +#if OS_IS_WIN32 + (void) lineno ; + return ; +#else + int k, count = 0 ; + struct stat statbuf ; + + if (allowed_open_files < 0) + count_open_files () ; + + for (k = 0 ; k < 1024 ; k++) + if (fstat (k, &statbuf) == 0) + count ++ ; + + if (count > allowed_open_files) + { printf ("\nLine %d : number of open files (%d) > allowed (%d).\n\n", lineno, count, allowed_open_files) ; + exit (1) ; + } ; +#endif +} /* check_open_file_count_or_die */ + +void +write_mono_file (const char * filename, int format, int srate, float * output, int len) +{ SNDFILE * file ; + SF_INFO sfinfo ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + sfinfo.samplerate = srate ; + sfinfo.channels = 1 ; + sfinfo.format = format ; + + if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL) + { printf ("sf_open (%s) : %s\n", filename, sf_strerror (NULL)) ; + exit (1) ; + } ; + + sf_write_float (file, output, len) ; + + sf_close (file) ; +} /* write_mono_file */ + +void +gen_lowpass_signal_float (float *data, int len) +{ int64_t value = 0x1243456 ; + double sample, last_val = 0.0 ; + int k ; + + for (k = 0 ; k < len ; k++) + { /* Not a crypto quality RNG. */ + value = (11117 * value + 211231) & 0xffffffff ; + value = (11117 * value + 211231) & 0xffffffff ; + value = (11117 * value + 211231) & 0xffffffff ; + + sample = value / (0x7fffffff * 1.000001) ; + sample = 0.2 * sample - 0.9 * last_val ; + + last_val = sample ; + + data [k] = 0.5 * (sample + sin (2.0 * k * M_PI * 1.0 / 32.0)) ; + } ; + +} /* gen_lowpass_signal_float */ + + +/* +** Windows is fucked. +** If a file is opened R/W and data is written to it, then fstat will return +** the correct file length, but stat will return zero. +*/ + +sf_count_t +file_length (const char * fname) +{ struct stat data ; + + if (stat (fname, &data) != 0) + return 0 ; + + return (sf_count_t) data.st_size ; +} /* file_length */ + +sf_count_t +file_length_fd (int fd) +{ struct stat data ; + + memset (&data, 0, sizeof (data)) ; + if (fstat (fd, &data) != 0) + return 0 ; + + return (sf_count_t) data.st_size ; +} /* file_length_fd */ + + +[+ ESAC +] + diff --git a/libsndfile-1.0.31/tests/virtual_io_test.c b/libsndfile-1.0.31/tests/virtual_io_test.c new file mode 100644 index 0000000..854bc30 --- /dev/null +++ b/libsndfile-1.0.31/tests/virtual_io_test.c @@ -0,0 +1,237 @@ +/* +** Copyright (C) 1999-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include "utils.h" + +static void vio_test (const char *fname, int format) ; + +int +main (void) +{ + vio_test ("vio_pcm16.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; + vio_test ("vio_pcm24.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_24) ; + vio_test ("vio_float.au", SF_FORMAT_AU | SF_FORMAT_FLOAT) ; + vio_test ("vio_pcm24.paf", SF_FORMAT_PAF | SF_FORMAT_PCM_24) ; + + return 0 ; +} /* main */ + +/*============================================================================== +*/ + +typedef struct +{ sf_count_t offset, length ; + unsigned char data [16 * 1024] ; +} VIO_DATA ; + +static sf_count_t +vfget_filelen (void *user_data) +{ VIO_DATA *vf = (VIO_DATA *) user_data ; + + return vf->length ; +} /* vfget_filelen */ + +static sf_count_t +vfseek (sf_count_t offset, int whence, void *user_data) +{ VIO_DATA *vf = (VIO_DATA *) user_data ; + + switch (whence) + { case SEEK_SET : + vf->offset = offset ; + break ; + + case SEEK_CUR : + vf->offset = vf->offset + offset ; + break ; + + case SEEK_END : + vf->offset = vf->length + offset ; + break ; + default : + break ; + } ; + + return vf->offset ; +} /* vfseek */ + +static sf_count_t +vfread (void *ptr, sf_count_t count, void *user_data) +{ VIO_DATA *vf = (VIO_DATA *) user_data ; + + /* + ** This will break badly for files over 2Gig in length, but + ** is sufficient for testing. + */ + if (vf->offset + count > vf->length) + count = vf->length - vf->offset ; + + memcpy (ptr, vf->data + vf->offset, count) ; + vf->offset += count ; + + return count ; +} /* vfread */ + +static sf_count_t +vfwrite (const void *ptr, sf_count_t count, void *user_data) +{ VIO_DATA *vf = (VIO_DATA *) user_data ; + + /* + ** This will break badly for files over 2Gig in length, but + ** is sufficient for testing. + */ + if (vf->offset >= SIGNED_SIZEOF (vf->data)) + return 0 ; + + if (vf->offset + count > SIGNED_SIZEOF (vf->data)) + count = sizeof (vf->data) - vf->offset ; + + memcpy (vf->data + vf->offset, ptr, (size_t) count) ; + vf->offset += count ; + + if (vf->offset > vf->length) + vf->length = vf->offset ; + + return count ; +} /* vfwrite */ + +static sf_count_t +vftell (void *user_data) +{ VIO_DATA *vf = (VIO_DATA *) user_data ; + + return vf->offset ; +} /* vftell */ + + +/*============================================================================== +*/ + +static void +gen_short_data (short * data, int len, int start) +{ int k ; + + for (k = 0 ; k < len ; k++) + data [k] = start + k ; +} /* gen_short_data */ + + +static void +check_short_data (short * data, int len, int start, int line) +{ int k ; + + for (k = 0 ; k < len ; k++) + if (data [k] != start + k) + { printf ("\n\nLine %d : data [%d] = %d (should be %d).\n\n", line, k, data [k], start + k) ; + exit (1) ; + } ; +} /* gen_short_data */ + +/*------------------------------------------------------------------------------ +*/ + +static void +vio_test (const char *fname, int format) +{ static VIO_DATA vio_data ; + static short data [256] ; + + SF_VIRTUAL_IO vio ; + SNDFILE * file ; + SF_INFO sfinfo ; + + print_test_name ("virtual i/o test", fname) ; + + /* Set up pointers to the locally defined functions. */ + vio.get_filelen = vfget_filelen ; + vio.seek = vfseek ; + vio.read = vfread ; + vio.write = vfwrite ; + vio.tell = vftell ; + + /* Set virtual file offset and length to zero. */ + vio_data.offset = 0 ; + vio_data.length = 0 ; + + memset (&sfinfo, 0, sizeof (sfinfo)) ; + sfinfo.format = format ; + sfinfo.channels = 2 ; + sfinfo.samplerate = 44100 ; + + if ((file = sf_open_virtual (&vio, SFM_WRITE, &sfinfo, &vio_data)) == NULL) + { printf ("\n\nLine %d : sf_open_write failed with error : ", __LINE__) ; + fflush (stdout) ; + puts (sf_strerror (NULL)) ; + exit (1) ; + } ; + + if (vfget_filelen (&vio_data) < 0) + { printf ("\n\nLine %d : vfget_filelen returned negative length.\n\n", __LINE__) ; + exit (1) ; + } ; + + gen_short_data (data, ARRAY_LEN (data), 0) ; + sf_write_short (file, data, ARRAY_LEN (data)) ; + + gen_short_data (data, ARRAY_LEN (data), 1) ; + sf_write_short (file, data, ARRAY_LEN (data)) ; + + gen_short_data (data, ARRAY_LEN (data), 2) ; + sf_write_short (file, data, ARRAY_LEN (data)) ; + + sf_close (file) ; + + /* Now test read. */ + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + vio_data.offset = 0 ; + + if ((file = sf_open_virtual (&vio, SFM_READ, &sfinfo, &vio_data)) == NULL) + { printf ("\n\nLine %d : sf_open_write failed with error : ", __LINE__) ; + fflush (stdout) ; + puts (sf_strerror (NULL)) ; + + dump_data_to_file (fname, vio_data.data, vio_data.length) ; + exit (1) ; + } ; + + + sf_read_short (file, data, ARRAY_LEN (data)) ; + check_short_data (data, ARRAY_LEN (data), 0, __LINE__) ; + + sf_read_short (file, data, ARRAY_LEN (data)) ; + check_short_data (data, ARRAY_LEN (data), 1, __LINE__) ; + + sf_read_short (file, data, ARRAY_LEN (data)) ; + check_short_data (data, ARRAY_LEN (data), 2, __LINE__) ; + + sf_close (file) ; + + puts ("ok") ; +} /* vio_test */ + diff --git a/libsndfile-1.0.31/tests/win32_ordinal_test.c b/libsndfile-1.0.31/tests/win32_ordinal_test.c new file mode 100644 index 0000000..7c9adb1 --- /dev/null +++ b/libsndfile-1.0.31/tests/win32_ordinal_test.c @@ -0,0 +1,148 @@ +/* +** Copyright (C) 2006-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include + +#if HAVE_UNISTD_H +#include +#endif + +#if (HAVE_DECL_S_IRGRP == 0) +#include +#endif + +#include +#include +#ifdef HAVE_DIRECT_H +#include +#endif +#include + +#include "utils.h" + +#if (defined (WIN32) || defined (_WIN32) || defined (__CYGWIN__)) +#define TEST_WIN32 1 +#else +#define TEST_WIN32 0 +#endif + +#if TEST_WIN32 +#include + + +static const char * locations [] = +{ ".", "../src/", "src/", "../src/.libs/", "src/.libs/", + NULL +} ; /* locations. */ + +static int +test_ordinal (HMODULE hmod, const char * func_name, int ordinal) +{ char *lpmsg ; + void *name, *ord ; + + print_test_name ("win32_ordinal_test", func_name) ; + +#if SIZEOF_VOIDP == 8 +#define LPCSTR_OF_ORDINAL(x) ((LPCSTR) ((int64_t) (x))) +#else +#define LPCSTR_OF_ORDINAL(x) ((LPCSTR) (x)) +#endif + + ord = GetProcAddress (hmod, LPCSTR_OF_ORDINAL (ordinal)) ; + if ((name = GetProcAddress (hmod, func_name)) == NULL) + { FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError (), + MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpmsg, 0, NULL) ; + /*-puts (lpmsg) ;-*/ + } ; + + if (name != NULL && ord != NULL && name == ord) + { puts ("ok") ; + return 0 ; + } ; + + puts ("fail") ; + return 1 ; +} /* test_ordinal */ + +static void +win32_ordinal_test (void) +{ static char buffer [1024] ; + static char func_name [1024] ; + HMODULE hmod = NULL ; + FILE * file = NULL ; + int k, ordinal, errors = 0 ; + + for (k = 0 ; locations [k] != NULL ; k++) + { snprintf (buffer, sizeof (buffer), "%s/libsndfile-1.def", locations [k]) ; + if ((file = fopen (buffer, "r")) != NULL) + break ; + } ; + + if (file == NULL) + { puts ("\n\nError : cannot open DEF file.\n") ; + exit (1) ; + } ; + + for (k = 0 ; locations [k] != NULL ; k++) + { snprintf (buffer, sizeof (buffer), "%s/libsndfile-1.dll", locations [k]) ; + if ((hmod = (HMODULE) LoadLibrary (buffer)) != NULL) + break ; + } ; + + if (hmod == NULL) + { printf ("\n\nError : cannot load DLL (cwd is %s).\n", getcwd (buffer, sizeof (buffer))) ; + exit (1) ; + } ; + + while (fgets (buffer, sizeof (buffer), file) != NULL) + { func_name [0] = 0 ; + ordinal = 0 ; + + if (sscanf (buffer, "%s @%d", func_name, &ordinal) != 2) + continue ; + + errors += test_ordinal (hmod, func_name, ordinal) ; + } ; + + FreeLibrary (hmod) ; + + fclose (file) ; + + if (errors > 0) + { printf ("\n\nErrors : %d\n\n", errors) ; + exit (1) ; + } ; + + return ; +} /* win32_ordinal_test */ + +#endif + +int +main (void) +{ +#if (TEST_WIN32 && WIN32_TARGET_DLL) + win32_ordinal_test () ; +#endif + + return 0 ; +} /* main */ + diff --git a/libsndfile-1.0.31/tests/win32_test.c b/libsndfile-1.0.31/tests/win32_test.c new file mode 100644 index 0000000..d0dc6d8 --- /dev/null +++ b/libsndfile-1.0.31/tests/win32_test.c @@ -0,0 +1,318 @@ +/* +** Copyright (C) 2001-2011 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" +#include "sndfile.h" + +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#endif + +#if (HAVE_DECL_S_IRGRP == 0) +#include +#endif + +#include +#include +#include +#include +#include + +#define SIGNED_SIZEOF(x) ((int) sizeof (x)) + +/* EMX is OS/2. */ +#if defined (__CYGWIN__) || defined (__EMX__) + + #define LSEEK lseek + #define FSTAT fstat + + typedef struct stat STATBUF ; + typedef off_t INT64 ; + + static char dir_cmd [] = "ls -l" ; + +#elif (defined (WIN32) || defined (_WIN32)) + + #define LSEEK _lseeki64 + #define FSTAT _fstati64 + + typedef struct _stati64 STATBUF ; + typedef __int64 INT64 ; + + static char dir_cmd [] = "dir" ; + +#else + + #define LSEEK lseek + #define FSTAT fstat + + typedef struct stat STATBUF ; + typedef sf_count_t INT64 ; + + #define O_BINARY 0 + static char dir_cmd [] = "ls -l" ; + +#endif + +static void show_fstat_error (void) ; +static void show_lseek_error (void) ; +static void show_stat_fstat_error (void) ; +static void write_to_closed_file (void) ; + +int +main (void) +{ + puts ("\n\n\n\n" + "This program shows up errors in the Win32 implementation of\n" + "a couple of POSIX API functions on some versions of windoze.\n" + "It can also be compiled on Linux (which works correctly) and\n" + "other OSes just to provide a sanity check.\n" + ) ; + + show_fstat_error () ; + show_lseek_error () ; + show_stat_fstat_error () ; + write_to_closed_file () ; + + puts ("\n\n") ; + + return 0 ; +} /* main */ + +static void +show_fstat_error (void) +{ static const char *filename = "fstat.dat" ; + static char data [256] ; + + STATBUF statbuf ; + int fd, mode, flags ; + + if (sizeof (statbuf.st_size) != sizeof (INT64)) + { printf ("\n\nLine %d: Error, sizeof (statbuf.st_size) != 8.\n\n", __LINE__) ; + return ; + } ; + + puts ("\n64 bit fstat() test.\n--------------------") ; + + printf ("0) Create a file, write %d bytes and close it.\n", SIGNED_SIZEOF (data)) ; + mode = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ; + flags = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ; + if ((fd = open (filename, mode, flags)) < 0) + { printf ("\n\nLine %d: open() failed : %s\n\n", __LINE__, strerror (errno)) ; + return ; + } ; + assert (write (fd, data, sizeof (data)) > 0) ; + close (fd) ; + + printf ("1) Re-open file in read/write mode and write another %d bytes at the end.\n", SIGNED_SIZEOF (data)) ; + mode = O_RDWR | O_BINARY ; + flags = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ; + if ((fd = open (filename, mode, flags)) < 0) + { printf ("\n\nLine %d: open() failed : %s\n\n", __LINE__, strerror (errno)) ; + return ; + } ; + LSEEK (fd, 0, SEEK_END) ; + assert (write (fd, data, sizeof (data)) > 0) ; + + printf ("2) Now use system (\"%s %s\") to show the file length.\n\n", dir_cmd, filename) ; + + /* Would use snprintf, but thats not really available on windows. */ + memset (data, 0, sizeof (data)) ; + strncpy (data, dir_cmd, sizeof (data) - 1) ; + strncat (data, " ", sizeof (data) - 1 - strlen (data)) ; + strncat (data, filename, sizeof (data) - 1 - strlen (data)) ; + + assert (system (data) >= 0) ; + puts ("") ; + + printf ("3) Now use fstat() to get the file length.\n") ; + if (FSTAT (fd, &statbuf) != 0) + { printf ("\n\nLine %d: fstat() returned error : %s\n", __LINE__, strerror (errno)) ; + return ; + } ; + + printf ("4) According to fstat(), the file length is %ld, ", (long) statbuf.st_size) ; + + close (fd) ; + + if (statbuf.st_size != 2 * sizeof (data)) + printf ("but thats just plain ***WRONG***.\n\n") ; + else + { printf ("which is correct.\n\n") ; + unlink (filename) ; + } ; + +} /* show_fstat_error */ + +static void +show_lseek_error (void) +{ static const char *filename = "fstat.dat" ; + static char data [256] ; + + INT64 retval ; + int fd, mode, flags ; + + puts ("\n64 bit lseek() test.\n--------------------") ; + + printf ("0) Create a file, write %d bytes and close it.\n", SIGNED_SIZEOF (data)) ; + mode = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ; + flags = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ; + if ((fd = open (filename, mode, flags)) < 0) + { printf ("\n\nLine %d: open() failed : %s\n\n", __LINE__, strerror (errno)) ; + return ; + } ; + assert (write (fd, data, sizeof (data)) > 0) ; + close (fd) ; + + printf ("1) Re-open file in read/write mode and write another %d bytes at the end.\n", SIGNED_SIZEOF (data)) ; + mode = O_RDWR | O_BINARY ; + flags = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ; + if ((fd = open (filename, mode, flags)) < 0) + { printf ("\n\nLine %d: open() failed : %s\n\n", __LINE__, strerror (errno)) ; + return ; + } ; + + LSEEK (fd, 0, SEEK_END) ; + assert (write (fd, data, sizeof (data)) > 0) ; + + printf ("2) Now use system (\"%s %s\") to show the file length.\n\n", dir_cmd, filename) ; + + /* Would use snprintf, but thats not really available on windows. */ + memset (data, 0, sizeof (data)) ; + strncpy (data, dir_cmd, sizeof (data) - 1) ; + strncat (data, " ", sizeof (data) - 1 - strlen (data)) ; + strncat (data, filename, sizeof (data) - 1 - strlen (data)) ; + + assert (system (data) >= 0) ; + puts ("") ; + + printf ("3) Now use lseek() to go to the end of the file.\n") ; + retval = LSEEK (fd, 0, SEEK_END) ; + + printf ("4) We are now at position %ld, ", (long) retval) ; + + close (fd) ; + + if (retval != 2 * sizeof (data)) + printf ("but thats just plain ***WRONG***.\n\n") ; + else + { printf ("which is correct.\n\n") ; + unlink (filename) ; + } ; + +} /* show_lseek_error */ + +static void +show_stat_fstat_error (void) +{ static const char *filename = "stat_fstat.dat" ; + static char data [256] ; + + int fd, mode, flags ; + int stat_size, fstat_size ; + struct stat buf ; + + /* Known to fail on WinXP. */ + puts ("\nstat/fstat test.\n----------------") ; + + printf ("0) Create a file and write %d bytes.\n", SIGNED_SIZEOF (data)) ; + + mode = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ; + flags = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ; + if ((fd = open (filename, mode, flags)) < 0) + { printf ("\n\nLine %d: open() failed : %s\n\n", __LINE__, strerror (errno)) ; + return ; + } ; + + assert (write (fd, data, sizeof (data)) > 0) ; + + printf ("1) Now call stat and fstat on the file and retreive the file lengths.\n") ; + + if (stat (filename, &buf) != 0) + { printf ("\n\nLine %d: stat() failed : %s\n\n", __LINE__, strerror (errno)) ; + goto error_exit ; + } ; + stat_size = buf.st_size ; + + if (fstat (fd, &buf) != 0) + { printf ("\n\nLine %d: fstat() failed : %s\n\n", __LINE__, strerror (errno)) ; + goto error_exit ; + } ; + fstat_size = buf.st_size ; + + printf ("2) Size returned by stat and fstat is %d and %d, ", stat_size, fstat_size) ; + + + if (stat_size == 0 || stat_size != fstat_size) + printf ("but thats just plain ***WRONG***.\n\n") ; + else + printf ("which is correct.\n\n") ; + +error_exit : + + close (fd) ; + unlink (filename) ; + + return ; +} /* show_stat_fstat_error */ + + +static void +write_to_closed_file (void) +{ const char * filename = "closed_write_test.txt" ; + struct stat buf ; + FILE * file ; + int fd ; + + puts ("\nWrite to closed file test.\n--------------------------") ; + + printf ("0) First we open file for write using fopen().\n") ; + if ((file = fopen (filename, "w")) == NULL) + { printf ("\n\nLine %d: fopen() failed : %s\n\n", __LINE__, strerror (errno)) ; + return ; + } ; + + printf ("1) Now we grab the file descriptor fileno().\n") ; + fd = fileno (file) ; + + printf ("2) Write some text via the file descriptor.\n") ; + assert (write (fd, "a\n", 2) > 0) ; + + printf ("3) Now we close the file using fclose().\n") ; + fclose (file) ; + + stat (filename, &buf) ; + printf (" File size is %d bytes.\n", (int) buf.st_size) ; + + printf ("4) Now write more data to the file descriptor which should fail.\n") ; + if (write (fd, "b\n", 2) < 0) + printf ("5) Good, write returned an error code as it should have.\n") ; + else + { printf ("5) Attempting to write to a closed file should have failed but didn't! *** WRONG ***\n") ; + + stat (filename, &buf) ; + printf (" File size is %d bytes.\n", (int) buf.st_size) ; + } ; + + unlink (filename) ; + + return ; +} /* write_to_closed_file */ diff --git a/libsndfile-1.0.31/tests/write_read_test.c b/libsndfile-1.0.31/tests/write_read_test.c new file mode 100644 index 0000000..1abe108 --- /dev/null +++ b/libsndfile-1.0.31/tests/write_read_test.c @@ -0,0 +1,4614 @@ +/* +** Copyright (C) 1999-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "utils.h" +#include "generate.h" + +#define SAMPLE_RATE 11025 +#define DATA_LENGTH (1 << 12) + +#define SILLY_WRITE_COUNT (234) + +static void pcm_test_char (const char *str, int format, int long_file_ok) ; +static void pcm_test_short (const char *str, int format, int long_file_ok) ; +static void pcm_test_20bit (const char *str, int format, int long_file_ok) ; +static void pcm_test_24bit (const char *str, int format, int long_file_ok) ; +static void pcm_test_int (const char *str, int format, int long_file_ok) ; +static void pcm_test_float (const char *str, int format, int long_file_ok) ; +static void pcm_test_double (const char *str, int format, int long_file_ok) ; + +static void empty_file_test (const char *filename, int format) ; + +typedef union +{ double d [DATA_LENGTH] ; + float f [DATA_LENGTH] ; + int i [DATA_LENGTH] ; + short s [DATA_LENGTH] ; + char c [DATA_LENGTH] ; +} BUFFER ; + +static BUFFER orig_data ; +static BUFFER test_data ; + +int +main (int argc, char **argv) +{ int do_all = 0 ; + int test_count = 0 ; + + count_open_files () ; + + if (argc != 2) + { printf ("Usage : %s \n", argv [0]) ; + printf (" Where is one of the following:\n") ; + printf (" wav - test WAV file functions (little endian)\n") ; + printf (" aiff - test AIFF file functions (big endian)\n") ; + printf (" au - test AU file functions\n") ; + printf (" avr - test AVR file functions\n") ; + printf (" caf - test CAF file functions\n") ; + printf (" raw - test RAW header-less PCM file functions\n") ; + printf (" paf - test PAF file functions\n") ; + printf (" svx - test 8SVX/16SV file functions\n") ; + printf (" nist - test NIST Sphere file functions\n") ; + printf (" ircam - test IRCAM file functions\n") ; + printf (" voc - Create Voice file functions\n") ; + printf (" w64 - Sonic Foundry's W64 file functions\n") ; + printf (" flac - test FLAC file functions\n") ; + printf (" mpc2k - test MPC 2000 file functions\n") ; + printf (" rf64 - test RF64 file functions\n") ; + printf (" all - perform all tests\n") ; + exit (1) ; + } ; + + do_all = !strcmp (argv [1], "all") ; + + if (do_all || ! strcmp (argv [1], "wav")) + { pcm_test_char ("char.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_U8, SF_FALSE) ; + pcm_test_short ("short.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_32, SF_FALSE) ; + + pcm_test_char ("char.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_U8, SF_FALSE) ; + pcm_test_short ("short.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_32, SF_FALSE) ; + + pcm_test_24bit ("24bit.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_PCM_32, SF_FALSE) ; + + /* Lite remove start */ + pcm_test_float ("float.wav" , SF_FORMAT_WAV | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double.wav" , SF_FORMAT_WAV | SF_FORMAT_DOUBLE, SF_FALSE) ; + + pcm_test_float ("float.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_DOUBLE, SF_FALSE) ; + + pcm_test_float ("float.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_DOUBLE, SF_FALSE) ; + /* Lite remove end */ + + empty_file_test ("empty_char.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8) ; + empty_file_test ("empty_short.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; + empty_file_test ("empty_float.wav", SF_FORMAT_WAV | SF_FORMAT_FLOAT) ; + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "aiff")) + { pcm_test_char ("char_u8.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_U8, SF_FALSE) ; + pcm_test_char ("char_s8.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_short ("short.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_32, SF_FALSE) ; + + pcm_test_short ("short_sowt.aifc" , SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit_sowt.aifc" , SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int_sowt.aifc" , SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | SF_FORMAT_PCM_32, SF_FALSE) ; + + pcm_test_short ("short_twos.aifc" , SF_ENDIAN_BIG | SF_FORMAT_AIFF | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit_twos.aifc" , SF_ENDIAN_BIG | SF_FORMAT_AIFF | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int_twos.aifc" , SF_ENDIAN_BIG | SF_FORMAT_AIFF | SF_FORMAT_PCM_32, SF_FALSE) ; + + /* Lite remove start */ + pcm_test_short ("dwvw16.aifc", SF_FORMAT_AIFF | SF_FORMAT_DWVW_16, SF_TRUE) ; + pcm_test_24bit ("dwvw24.aifc", SF_FORMAT_AIFF | SF_FORMAT_DWVW_24, SF_TRUE) ; + + pcm_test_float ("float.aifc" , SF_FORMAT_AIFF | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double.aifc" , SF_FORMAT_AIFF | SF_FORMAT_DOUBLE, SF_FALSE) ; + /* Lite remove end */ + + empty_file_test ("empty_char.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_U8) ; + empty_file_test ("empty_short.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ; + empty_file_test ("empty_float.aiff", SF_FORMAT_AIFF | SF_FORMAT_FLOAT) ; + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "au")) + { pcm_test_char ("char.au" , SF_FORMAT_AU | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_short ("short.au" , SF_FORMAT_AU | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit.au" , SF_FORMAT_AU | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int.au" , SF_FORMAT_AU | SF_FORMAT_PCM_32, SF_FALSE) ; + /* Lite remove start */ + pcm_test_float ("float.au" , SF_FORMAT_AU | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double.au", SF_FORMAT_AU | SF_FORMAT_DOUBLE, SF_FALSE) ; + /* Lite remove end */ + + pcm_test_char ("char_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_short ("short_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_32, SF_FALSE) ; + /* Lite remove start */ + pcm_test_float ("float_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_DOUBLE, SF_FALSE) ; + /* Lite remove end */ + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "caf")) + { pcm_test_char ("char.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_short ("short.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_32, SF_FALSE) ; + /* Lite remove start */ + pcm_test_float ("float.caf" , SF_FORMAT_CAF | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double.caf" , SF_FORMAT_CAF | SF_FORMAT_DOUBLE, SF_FALSE) ; + /* Lite remove end */ + + pcm_test_short ("short_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_PCM_32, SF_FALSE) ; + /* Lite remove start */ + pcm_test_float ("float_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double_le.caf", SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_DOUBLE, SF_FALSE) ; + + pcm_test_short ("alac16.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_16, SF_FALSE) ; + pcm_test_20bit ("alac20.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_20, SF_FALSE) ; + pcm_test_24bit ("alac24.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_24, SF_FALSE) ; + pcm_test_int ("alac32.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_32, SF_FALSE) ; + + /* Lite remove end */ + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "raw")) + { pcm_test_char ("char_s8.raw" , SF_FORMAT_RAW | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_char ("char_u8.raw" , SF_FORMAT_RAW | SF_FORMAT_PCM_U8, SF_FALSE) ; + + pcm_test_short ("short_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_short ("short_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_24bit ("24bit_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_32, SF_FALSE) ; + pcm_test_int ("int_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_32, SF_FALSE) ; + + /* Lite remove start */ + pcm_test_float ("float_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_float ("float_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT , SF_FALSE) ; + + pcm_test_double ("double_le.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, SF_FALSE) ; + pcm_test_double ("double_be.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, SF_FALSE) ; + /* Lite remove end */ + test_count++ ; + } ; + + /* Lite remove start */ + if (do_all || ! strcmp (argv [1], "paf")) + { pcm_test_char ("char_le.paf", SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_char ("char_be.paf", SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_short ("short_le.paf", SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_short ("short_be.paf", SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit_le.paf", SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_24, SF_TRUE) ; + pcm_test_24bit ("24bit_be.paf", SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_24, SF_TRUE) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "svx")) + { pcm_test_char ("char.svx" , SF_FORMAT_SVX | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_short ("short.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_16, SF_FALSE) ; + + empty_file_test ("empty_char.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_S8) ; + empty_file_test ("empty_short.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_16) ; + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "nist")) + { pcm_test_short ("short_le.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_short ("short_be.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit_le.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_24bit ("24bit_be.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int_le.nist" , SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_PCM_32, SF_FALSE) ; + pcm_test_int ("int_be.nist" , SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_PCM_32, SF_FALSE) ; + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "ircam")) + { pcm_test_short ("short_be.ircam" , SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_short ("short_le.ircam" , SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_int ("int_be.ircam" , SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_PCM_32, SF_FALSE) ; + pcm_test_int ("int_le.ircam" , SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_PCM_32, SF_FALSE) ; + pcm_test_float ("float_be.ircam" , SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_float ("float_le.ircam" , SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_FLOAT , SF_FALSE) ; + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "voc")) + { pcm_test_char ("char.voc" , SF_FORMAT_VOC | SF_FORMAT_PCM_U8, SF_FALSE) ; + pcm_test_short ("short.voc", SF_FORMAT_VOC | SF_FORMAT_PCM_16, SF_FALSE) ; + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mat4")) + { pcm_test_short ("short_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_short ("short_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_int ("int_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_PCM_32, SF_FALSE) ; + pcm_test_int ("int_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_PCM_32, SF_FALSE) ; + pcm_test_float ("float_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_float ("float_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_DOUBLE, SF_FALSE) ; + pcm_test_double ("double_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_DOUBLE, SF_FALSE) ; + + empty_file_test ("empty_short.mat4", SF_FORMAT_MAT4 | SF_FORMAT_PCM_16) ; + empty_file_test ("empty_float.mat4", SF_FORMAT_MAT4 | SF_FORMAT_FLOAT) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mat5")) + { pcm_test_char ("char_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_PCM_U8, SF_FALSE) ; + pcm_test_char ("char_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_PCM_U8, SF_FALSE) ; + pcm_test_short ("short_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_short ("short_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_int ("int_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_PCM_32, SF_FALSE) ; + pcm_test_int ("int_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_PCM_32, SF_FALSE) ; + pcm_test_float ("float_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_float ("float_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_DOUBLE, SF_FALSE) ; + pcm_test_double ("double_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_DOUBLE, SF_FALSE) ; + + increment_open_file_count () ; + + empty_file_test ("empty_char.mat5", SF_FORMAT_MAT5 | SF_FORMAT_PCM_U8) ; + empty_file_test ("empty_short.mat5", SF_FORMAT_MAT5 | SF_FORMAT_PCM_16) ; + empty_file_test ("empty_float.mat5", SF_FORMAT_MAT5 | SF_FORMAT_FLOAT) ; + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "pvf")) + { pcm_test_char ("char.pvf" , SF_FORMAT_PVF | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_short ("short.pvf", SF_FORMAT_PVF | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_int ("int.pvf" , SF_FORMAT_PVF | SF_FORMAT_PCM_32, SF_FALSE) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "htk")) + { pcm_test_short ("short.htk", SF_FORMAT_HTK | SF_FORMAT_PCM_16, SF_FALSE) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mpc2k")) + { pcm_test_short ("short.mpc", SF_FORMAT_MPC2K | SF_FORMAT_PCM_16, SF_FALSE) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "avr")) + { pcm_test_char ("char_u8.avr" , SF_FORMAT_AVR | SF_FORMAT_PCM_U8, SF_FALSE) ; + pcm_test_char ("char_s8.avr" , SF_FORMAT_AVR | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_short ("short.avr" , SF_FORMAT_AVR | SF_FORMAT_PCM_16, SF_FALSE) ; + test_count++ ; + } ; + /* Lite remove end */ + + if (do_all || ! strcmp (argv [1], "w64")) + { pcm_test_char ("char.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_U8, SF_FALSE) ; + pcm_test_short ("short.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_32, SF_FALSE) ; + /* Lite remove start */ + pcm_test_float ("float.w64" , SF_FORMAT_W64 | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double.w64" , SF_FORMAT_W64 | SF_FORMAT_DOUBLE, SF_FALSE) ; + /* Lite remove end */ + + empty_file_test ("empty_char.w64", SF_FORMAT_W64 | SF_FORMAT_PCM_U8) ; + empty_file_test ("empty_short.w64", SF_FORMAT_W64 | SF_FORMAT_PCM_16) ; + empty_file_test ("empty_float.w64", SF_FORMAT_W64 | SF_FORMAT_FLOAT) ; + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "sds")) + { pcm_test_char ("char.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_short ("short.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_24, SF_FALSE) ; + + empty_file_test ("empty_char.sds", SF_FORMAT_SDS | SF_FORMAT_PCM_S8) ; + empty_file_test ("empty_short.sds", SF_FORMAT_SDS | SF_FORMAT_PCM_16) ; + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "sd2")) + { pcm_test_char ("char.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_S8, SF_TRUE) ; + pcm_test_short ("short.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_16, SF_TRUE) ; + pcm_test_24bit ("24bit.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_24, SF_TRUE) ; + pcm_test_int ("32bit.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_32, SF_TRUE) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "flac")) + { if (HAVE_EXTERNAL_XIPH_LIBS) + { pcm_test_char ("char.flac" , SF_FORMAT_FLAC | SF_FORMAT_PCM_S8, SF_TRUE) ; + pcm_test_short ("short.flac" , SF_FORMAT_FLAC | SF_FORMAT_PCM_16, SF_TRUE) ; + pcm_test_24bit ("24bit.flac" , SF_FORMAT_FLAC | SF_FORMAT_PCM_24, SF_TRUE) ; + } + else + puts (" No FLAC tests because FLAC support was not compiled in.") ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "rf64")) + { pcm_test_char ("char.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_U8, SF_FALSE) ; + pcm_test_short ("short.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_32, SF_FALSE) ; + + /* Lite remove start */ + pcm_test_float ("float.rf64" , SF_FORMAT_RF64 | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double.rf64" , SF_FORMAT_RF64 | SF_FORMAT_DOUBLE, SF_FALSE) ; + empty_file_test ("empty_char.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_U8) ; + empty_file_test ("empty_short.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ; + empty_file_test ("empty_float.rf64", SF_FORMAT_RF64 | SF_FORMAT_FLOAT) ; + /* Lite remove end */ + + test_count++ ; + } ; + + if (test_count == 0) + { printf ("Mono : ************************************\n") ; + printf ("Mono : * No '%s' test defined.\n", argv [1]) ; + printf ("Mono : ************************************\n") ; + return 1 ; + } ; + + /* Only open file descriptors should be stdin, stdout and stderr. */ + check_open_file_count_or_die (__LINE__) ; + + return 0 ; +} /* main */ + +/*============================================================================================ +** Helper functions and macros. +*/ + +static void create_short_file (const char *filename) ; + +#define CHAR_ERROR(x, y) (abs ((x) - (y)) > 255) +#define INT_ERROR(x, y) (((x) - (y)) != 0) +#define BIT_20_ERROR(x, y) (abs ((x) - (y)) > 4095) +#define TRIBYTE_ERROR(x, y) (abs ((x) - (y)) > 255) +#define FLOAT_ERROR(x, y) (fabs ((x) - (y)) > 1e-5) + +#define CONVERT_DATA(k, len, new, orig) \ + { for ((k) = 0 ; (k) < (len) ; (k) ++) \ + (new) [k] = (orig) [k] ; \ + } + + +/*====================================================================================== +*/ + +static void mono_char_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void stereo_char_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void mono_rdwr_char_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void new_rdwr_char_test (const char *filename, int format, int allow_fd) ; +static void multi_seek_test (const char * filename, int format) ; +static void write_seek_extend_test (const char * filename, int format) ; + +static void +pcm_test_char (const char *filename, int format, int long_file_ok) +{ SF_INFO sfinfo ; + short *orig ; + int k, allow_fd ; + + /* Sd2 files cannot be opened from an existing file descriptor. */ + allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; + + print_test_name ("pcm_test_char", filename) ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = format ; + + test_sf_format_or_die (&sfinfo, __LINE__) ; + + gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 32000.0) ; + + orig = orig_data.s ; + + /* Make this a macro so gdb steps over it in one go. */ + CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; + + /* Some test broken out here. */ + + mono_char_test (filename, format, long_file_ok, allow_fd) ; + + /* Sub format DWVW does not allow seeking. */ + if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || + (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) + { unlink (filename) ; + printf ("no seek : ok\n") ; + return ; + } ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32 + ) + mono_rdwr_char_test (filename, format, long_file_ok, allow_fd) ; + + /* If the format doesn't support stereo we're done. */ + sfinfo.channels = 2 ; + if (sf_format_check (&sfinfo) == 0) + { unlink (filename) ; + puts ("no stereo : ok") ; + return ; + } ; + + stereo_char_test (filename, format, long_file_ok, allow_fd) ; + + /* New read/write test. Not sure if this is needed yet. */ + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF + && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC + && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32 + ) + new_rdwr_char_test (filename, format, allow_fd) ; + + delete_file (format, filename) ; + + puts ("ok") ; + return ; +} /* pcm_test_char */ + +static void +mono_char_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + short *orig, *test ; + sf_count_t count ; + int k, items, total ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = format ; + + orig = orig_data.s ; + test = test_data.s ; + + items = DATA_LENGTH ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.frames || sfinfo.sections || sfinfo.seekable) + { printf ("\n\nLine %d : Weird SF_INFO fields.\n", __LINE__) ; + exit (1) ; + } ; + + sf_set_string (file, SF_STR_ARTIST, "Your name here") ; + + test_write_short_or_die (file, 0, orig, items, __LINE__) ; + sf_write_sync (file) ; + test_write_short_or_die (file, 0, orig, items, __LINE__) ; + sf_write_sync (file) ; + + /* Add non-audio data after the audio. */ + sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; + + sf_close (file) ; + + memset (test, 0, items * sizeof (short)) ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < 2 * items) + { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ; + exit (1) ; + } ; + + if (! long_file_ok && sfinfo.frames > 2 * items) + { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + if (sfinfo.seekable != 1) + { printf ("\n\nLine %d : File should be seekable.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_short_or_die (file, 0, test, items, __LINE__) ; + for (k = 0 ; k < items ; k++) + if (CHAR_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + oct_save_short (orig, test, items) ; + exit (1) ; + } ; + + /* Test multiple short reads. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + total = 0 ; + for (k = 1 ; k <= 32 ; k++) + { int ik ; + + test_read_short_or_die (file, 0, test + total, k, __LINE__) ; + total += k ; + + for (ik = 0 ; ik < total ; ik++) + if (CHAR_ERROR (orig [ik], test [ik])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, ik, orig [ik], test [ik]) ; + exit (1) ; + } ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_read_short_or_die (file, 0, test, 4, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + if (CHAR_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* For some codecs we can't go past here. */ + if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || + (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) + { sf_close (file) ; + unlink (filename) ; + printf ("no seek : ") ; + return ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ; + + test_read_short_or_die (file, 0, test + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + if (CHAR_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ; + + test_read_short_or_die (file, 0, test + 20, 4, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (CHAR_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_read_short_or_die (file, 0, test + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + if (CHAR_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + count = 0 ; + while (count < sfinfo.frames) + count += sf_read_short (file, test, 311) ; + + /* Check that no error has occurred. */ + if (sf_error (file)) + { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + /* Check that we haven't read beyond EOF. */ + if (count > sfinfo.frames) + { printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ; + exit (1) ; + } ; + + test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ; + + sf_close (file) ; + + multi_seek_test (filename, format) ; + write_seek_extend_test (filename, format) ; + +} /* mono_char_test */ + +static void +stereo_char_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + short *orig, *test ; + int k, items, frames ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 2 ; + sfinfo.format = format ; + + gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 32000.0) ; + + orig = orig_data.s ; + test = test_data.s ; + + /* Make this a macro so gdb steps over it in one go. */ + CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; + + items = DATA_LENGTH ; + frames = items / sfinfo.channels ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + + sf_set_string (file, SF_STR_ARTIST, "Your name here") ; + + test_writef_short_or_die (file, 0, orig, frames, __LINE__) ; + + sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; + + sf_close (file) ; + + memset (test, 0, items * sizeof (short)) ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", + __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < frames) + { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", + __LINE__, sfinfo.frames, frames) ; + exit (1) ; + } ; + + if (! long_file_ok && sfinfo.frames > frames) + { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", + __LINE__, sfinfo.frames, frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 2) + { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_readf_short_or_die (file, 0, test, frames, __LINE__) ; + for (k = 0 ; k < items ; k++) + if (CHAR_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_readf_short_or_die (file, 0, test, 2, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + if (CHAR_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + + /* Check for errors here. */ + if (sf_error (file)) + { printf ("Line %d: Should NOT return an error.\n", __LINE__) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + if (sf_read_short (file, test, 1) > 0) + { printf ("Line %d: Should return 0.\n", __LINE__) ; + exit (1) ; + } ; + + if (! sf_error (file)) + { printf ("Line %d: Should return an error.\n", __LINE__) ; + exit (1) ; + } ; + /*-----------------------*/ + + test_readf_short_or_die (file, 0, test + 10, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (CHAR_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; + + test_readf_short_or_die (file, 0, test + 20, 2, __LINE__) ; + for (k = 40 ; k < 44 ; k++) + if (CHAR_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_readf_short_or_die (file, 0, test + 20, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (CHAR_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + sf_close (file) ; +} /* stereo_char_test */ + +static void +mono_rdwr_char_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + short *orig, *test ; + int k, pass ; + + switch (format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_ALAC_16 : + case SF_FORMAT_ALAC_20 : + case SF_FORMAT_ALAC_24 : + case SF_FORMAT_ALAC_32 : + allow_fd = 0 ; + break ; + + default : + break ; + } ; + + orig = orig_data.s ; + test = test_data.s ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = format ; + + if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW + || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU + || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) + unlink (filename) ; + else + { /* Create a short file. */ + create_short_file (filename) ; + + /* Opening a already existing short file (ie invalid header) RDWR is disallowed. + ** If this returns a valif pointer sf_open() screwed up. + */ + if ((file = sf_open (filename, SFM_RDWR, &sfinfo))) + { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ; + exit (1) ; + } ; + + /* Truncate the file to zero bytes. */ + if (truncate_file_to_zero (filename) < 0) + { printf ("\n\nLine %d: truncate_file_to_zero (%s) failed", __LINE__, filename) ; + perror (NULL) ; + exit (1) ; + } ; + } ; + + /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain + ** all the usual data required when opening the file in WRITE mode. + */ + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = format ; + + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + + /* Do 3 writes followed by reads. After each, check the data and the current + ** read and write offsets. + */ + for (pass = 1 ; pass <= 3 ; pass ++) + { orig [20] = pass * 2 ; + + /* Write some data. */ + test_write_short_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ; + + test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ; + + /* Read what we just wrote. */ + test_read_short_or_die (file, 0, test, DATA_LENGTH, __LINE__) ; + + /* Check the data. */ + for (k = 0 ; k < DATA_LENGTH ; k++) + if (CHAR_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d (pass %d) A : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ; + oct_save_short (orig, test, DATA_LENGTH) ; + exit (1) ; + } ; + + test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ; + } ; /* for (pass ...) */ + + sf_close (file) ; + + /* Open the file again to check the data. */ + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < 3 * DATA_LENGTH) + { printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ; + exit (1) ; + } + + if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH) + { printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + if (! long_file_ok) + test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ; + else + test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ; + + for (pass = 1 ; pass <= 3 ; pass ++) + { orig [20] = pass * 2 ; + + test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ; + + /* Read what we just wrote. */ + test_read_short_or_die (file, pass, test, DATA_LENGTH, __LINE__) ; + + /* Check the data. */ + for (k = 0 ; k < DATA_LENGTH ; k++) + if (CHAR_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d (pass %d) B : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ; + oct_save_short (orig, test, DATA_LENGTH) ; + exit (1) ; + } ; + + } ; /* for (pass ...) */ + + sf_close (file) ; +} /* mono_rdwr_short_test */ + +static void +new_rdwr_char_test (const char *filename, int format, int allow_fd) +{ SNDFILE *wfile, *rwfile ; + SF_INFO sfinfo ; + short *orig, *test ; + int items, frames ; + + orig = orig_data.s ; + test = test_data.s ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 2 ; + sfinfo.format = format ; + + items = DATA_LENGTH ; + frames = items / sfinfo.channels ; + + wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; + test_writef_short_or_die (wfile, 1, orig, frames, __LINE__) ; + sf_write_sync (wfile) ; + test_writef_short_or_die (wfile, 2, orig, frames, __LINE__) ; + sf_write_sync (wfile) ; + + rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + if (sfinfo.frames != 2 * frames) + { printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ; + exit (1) ; + } ; + + test_writef_short_or_die (wfile, 3, orig, frames, __LINE__) ; + + test_readf_short_or_die (rwfile, 1, test, frames, __LINE__) ; + test_readf_short_or_die (rwfile, 2, test, frames, __LINE__) ; + + sf_close (wfile) ; + sf_close (rwfile) ; +} /* new_rdwr_char_test */ + + +/*====================================================================================== +*/ + +static void mono_short_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void stereo_short_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void mono_rdwr_short_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void new_rdwr_short_test (const char *filename, int format, int allow_fd) ; +static void multi_seek_test (const char * filename, int format) ; +static void write_seek_extend_test (const char * filename, int format) ; + +static void +pcm_test_short (const char *filename, int format, int long_file_ok) +{ SF_INFO sfinfo ; + short *orig ; + int k, allow_fd ; + + /* Sd2 files cannot be opened from an existing file descriptor. */ + allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; + + print_test_name ("pcm_test_short", filename) ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = format ; + + test_sf_format_or_die (&sfinfo, __LINE__) ; + + gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 32000.0) ; + + orig = orig_data.s ; + + /* Make this a macro so gdb steps over it in one go. */ + CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; + + /* Some test broken out here. */ + + mono_short_test (filename, format, long_file_ok, allow_fd) ; + + /* Sub format DWVW does not allow seeking. */ + if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || + (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) + { unlink (filename) ; + printf ("no seek : ok\n") ; + return ; + } ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32 + ) + mono_rdwr_short_test (filename, format, long_file_ok, allow_fd) ; + + /* If the format doesn't support stereo we're done. */ + sfinfo.channels = 2 ; + if (sf_format_check (&sfinfo) == 0) + { unlink (filename) ; + puts ("no stereo : ok") ; + return ; + } ; + + stereo_short_test (filename, format, long_file_ok, allow_fd) ; + + /* New read/write test. Not sure if this is needed yet. */ + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF + && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC + && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32 + ) + new_rdwr_short_test (filename, format, allow_fd) ; + + delete_file (format, filename) ; + + puts ("ok") ; + return ; +} /* pcm_test_short */ + +static void +mono_short_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + short *orig, *test ; + sf_count_t count ; + int k, items, total ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = format ; + + orig = orig_data.s ; + test = test_data.s ; + + items = DATA_LENGTH ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.frames || sfinfo.sections || sfinfo.seekable) + { printf ("\n\nLine %d : Weird SF_INFO fields.\n", __LINE__) ; + exit (1) ; + } ; + + sf_set_string (file, SF_STR_ARTIST, "Your name here") ; + + test_write_short_or_die (file, 0, orig, items, __LINE__) ; + sf_write_sync (file) ; + test_write_short_or_die (file, 0, orig, items, __LINE__) ; + sf_write_sync (file) ; + + /* Add non-audio data after the audio. */ + sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; + + sf_close (file) ; + + memset (test, 0, items * sizeof (short)) ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < 2 * items) + { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ; + exit (1) ; + } ; + + if (! long_file_ok && sfinfo.frames > 2 * items) + { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + if (sfinfo.seekable != 1) + { printf ("\n\nLine %d : File should be seekable.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_short_or_die (file, 0, test, items, __LINE__) ; + for (k = 0 ; k < items ; k++) + if (INT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + oct_save_short (orig, test, items) ; + exit (1) ; + } ; + + /* Test multiple short reads. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + total = 0 ; + for (k = 1 ; k <= 32 ; k++) + { int ik ; + + test_read_short_or_die (file, 0, test + total, k, __LINE__) ; + total += k ; + + for (ik = 0 ; ik < total ; ik++) + if (INT_ERROR (orig [ik], test [ik])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, ik, orig [ik], test [ik]) ; + exit (1) ; + } ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_read_short_or_die (file, 0, test, 4, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + if (INT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* For some codecs we can't go past here. */ + if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || + (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) + { sf_close (file) ; + unlink (filename) ; + printf ("no seek : ") ; + return ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ; + + test_read_short_or_die (file, 0, test + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + if (INT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ; + + test_read_short_or_die (file, 0, test + 20, 4, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (INT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_read_short_or_die (file, 0, test + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + if (INT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + count = 0 ; + while (count < sfinfo.frames) + count += sf_read_short (file, test, 311) ; + + /* Check that no error has occurred. */ + if (sf_error (file)) + { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + /* Check that we haven't read beyond EOF. */ + if (count > sfinfo.frames) + { printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ; + exit (1) ; + } ; + + test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ; + + sf_close (file) ; + + multi_seek_test (filename, format) ; + write_seek_extend_test (filename, format) ; + +} /* mono_short_test */ + +static void +stereo_short_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + short *orig, *test ; + int k, items, frames ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 2 ; + sfinfo.format = format ; + + gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 32000.0) ; + + orig = orig_data.s ; + test = test_data.s ; + + /* Make this a macro so gdb steps over it in one go. */ + CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; + + items = DATA_LENGTH ; + frames = items / sfinfo.channels ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + + sf_set_string (file, SF_STR_ARTIST, "Your name here") ; + + test_writef_short_or_die (file, 0, orig, frames, __LINE__) ; + + sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; + + sf_close (file) ; + + memset (test, 0, items * sizeof (short)) ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", + __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < frames) + { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", + __LINE__, sfinfo.frames, frames) ; + exit (1) ; + } ; + + if (! long_file_ok && sfinfo.frames > frames) + { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", + __LINE__, sfinfo.frames, frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 2) + { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_readf_short_or_die (file, 0, test, frames, __LINE__) ; + for (k = 0 ; k < items ; k++) + if (INT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_readf_short_or_die (file, 0, test, 2, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + if (INT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + + /* Check for errors here. */ + if (sf_error (file)) + { printf ("Line %d: Should NOT return an error.\n", __LINE__) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + if (sf_read_short (file, test, 1) > 0) + { printf ("Line %d: Should return 0.\n", __LINE__) ; + exit (1) ; + } ; + + if (! sf_error (file)) + { printf ("Line %d: Should return an error.\n", __LINE__) ; + exit (1) ; + } ; + /*-----------------------*/ + + test_readf_short_or_die (file, 0, test + 10, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (INT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; + + test_readf_short_or_die (file, 0, test + 20, 2, __LINE__) ; + for (k = 40 ; k < 44 ; k++) + if (INT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_readf_short_or_die (file, 0, test + 20, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (INT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + sf_close (file) ; +} /* stereo_short_test */ + +static void +mono_rdwr_short_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + short *orig, *test ; + int k, pass ; + + switch (format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_ALAC_16 : + case SF_FORMAT_ALAC_20 : + case SF_FORMAT_ALAC_24 : + case SF_FORMAT_ALAC_32 : + allow_fd = 0 ; + break ; + + default : + break ; + } ; + + orig = orig_data.s ; + test = test_data.s ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = format ; + + if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW + || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU + || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) + unlink (filename) ; + else + { /* Create a short file. */ + create_short_file (filename) ; + + /* Opening a already existing short file (ie invalid header) RDWR is disallowed. + ** If this returns a valif pointer sf_open() screwed up. + */ + if ((file = sf_open (filename, SFM_RDWR, &sfinfo))) + { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ; + exit (1) ; + } ; + + /* Truncate the file to zero bytes. */ + if (truncate_file_to_zero (filename) < 0) + { printf ("\n\nLine %d: truncate_file_to_zero (%s) failed", __LINE__, filename) ; + perror (NULL) ; + exit (1) ; + } ; + } ; + + /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain + ** all the usual data required when opening the file in WRITE mode. + */ + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = format ; + + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + + /* Do 3 writes followed by reads. After each, check the data and the current + ** read and write offsets. + */ + for (pass = 1 ; pass <= 3 ; pass ++) + { orig [20] = pass * 2 ; + + /* Write some data. */ + test_write_short_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ; + + test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ; + + /* Read what we just wrote. */ + test_read_short_or_die (file, 0, test, DATA_LENGTH, __LINE__) ; + + /* Check the data. */ + for (k = 0 ; k < DATA_LENGTH ; k++) + if (INT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d (pass %d) A : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ; + oct_save_short (orig, test, DATA_LENGTH) ; + exit (1) ; + } ; + + test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ; + } ; /* for (pass ...) */ + + sf_close (file) ; + + /* Open the file again to check the data. */ + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < 3 * DATA_LENGTH) + { printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ; + exit (1) ; + } + + if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH) + { printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + if (! long_file_ok) + test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ; + else + test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ; + + for (pass = 1 ; pass <= 3 ; pass ++) + { orig [20] = pass * 2 ; + + test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ; + + /* Read what we just wrote. */ + test_read_short_or_die (file, pass, test, DATA_LENGTH, __LINE__) ; + + /* Check the data. */ + for (k = 0 ; k < DATA_LENGTH ; k++) + if (INT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d (pass %d) B : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ; + oct_save_short (orig, test, DATA_LENGTH) ; + exit (1) ; + } ; + + } ; /* for (pass ...) */ + + sf_close (file) ; +} /* mono_rdwr_short_test */ + +static void +new_rdwr_short_test (const char *filename, int format, int allow_fd) +{ SNDFILE *wfile, *rwfile ; + SF_INFO sfinfo ; + short *orig, *test ; + int items, frames ; + + orig = orig_data.s ; + test = test_data.s ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 2 ; + sfinfo.format = format ; + + items = DATA_LENGTH ; + frames = items / sfinfo.channels ; + + wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; + test_writef_short_or_die (wfile, 1, orig, frames, __LINE__) ; + sf_write_sync (wfile) ; + test_writef_short_or_die (wfile, 2, orig, frames, __LINE__) ; + sf_write_sync (wfile) ; + + rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + if (sfinfo.frames != 2 * frames) + { printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ; + exit (1) ; + } ; + + test_writef_short_or_die (wfile, 3, orig, frames, __LINE__) ; + + test_readf_short_or_die (rwfile, 1, test, frames, __LINE__) ; + test_readf_short_or_die (rwfile, 2, test, frames, __LINE__) ; + + sf_close (wfile) ; + sf_close (rwfile) ; +} /* new_rdwr_short_test */ + + +/*====================================================================================== +*/ + +static void mono_20bit_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void stereo_20bit_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void mono_rdwr_20bit_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void new_rdwr_20bit_test (const char *filename, int format, int allow_fd) ; +static void multi_seek_test (const char * filename, int format) ; +static void write_seek_extend_test (const char * filename, int format) ; + +static void +pcm_test_20bit (const char *filename, int format, int long_file_ok) +{ SF_INFO sfinfo ; + int *orig ; + int k, allow_fd ; + + /* Sd2 files cannot be opened from an existing file descriptor. */ + allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; + + print_test_name ("pcm_test_20bit", filename) ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = format ; + + test_sf_format_or_die (&sfinfo, __LINE__) ; + + gen_windowed_sine_double (orig_data.d, DATA_LENGTH, (1.0 * 0x7F00000)) ; + + orig = orig_data.i ; + + /* Make this a macro so gdb steps over it in one go. */ + CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; + + /* Some test broken out here. */ + + mono_20bit_test (filename, format, long_file_ok, allow_fd) ; + + /* Sub format DWVW does not allow seeking. */ + if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || + (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) + { unlink (filename) ; + printf ("no seek : ok\n") ; + return ; + } ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32 + ) + mono_rdwr_20bit_test (filename, format, long_file_ok, allow_fd) ; + + /* If the format doesn't support stereo we're done. */ + sfinfo.channels = 2 ; + if (sf_format_check (&sfinfo) == 0) + { unlink (filename) ; + puts ("no stereo : ok") ; + return ; + } ; + + stereo_20bit_test (filename, format, long_file_ok, allow_fd) ; + + /* New read/write test. Not sure if this is needed yet. */ + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF + && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC + && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32 + ) + new_rdwr_20bit_test (filename, format, allow_fd) ; + + delete_file (format, filename) ; + + puts ("ok") ; + return ; +} /* pcm_test_20bit */ + +static void +mono_20bit_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int *orig, *test ; + sf_count_t count ; + int k, items, total ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = format ; + + orig = orig_data.i ; + test = test_data.i ; + + items = DATA_LENGTH ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.frames || sfinfo.sections || sfinfo.seekable) + { printf ("\n\nLine %d : Weird SF_INFO fields.\n", __LINE__) ; + exit (1) ; + } ; + + sf_set_string (file, SF_STR_ARTIST, "Your name here") ; + + test_write_int_or_die (file, 0, orig, items, __LINE__) ; + sf_write_sync (file) ; + test_write_int_or_die (file, 0, orig, items, __LINE__) ; + sf_write_sync (file) ; + + /* Add non-audio data after the audio. */ + sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; + + sf_close (file) ; + + memset (test, 0, items * sizeof (int)) ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < 2 * items) + { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ; + exit (1) ; + } ; + + if (! long_file_ok && sfinfo.frames > 2 * items) + { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + if (sfinfo.seekable != 1) + { printf ("\n\nLine %d : File should be seekable.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_int_or_die (file, 0, test, items, __LINE__) ; + for (k = 0 ; k < items ; k++) + if (BIT_20_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + oct_save_int (orig, test, items) ; + exit (1) ; + } ; + + /* Test multiple short reads. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + total = 0 ; + for (k = 1 ; k <= 32 ; k++) + { int ik ; + + test_read_int_or_die (file, 0, test + total, k, __LINE__) ; + total += k ; + + for (ik = 0 ; ik < total ; ik++) + if (BIT_20_ERROR (orig [ik], test [ik])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, ik, orig [ik], test [ik]) ; + exit (1) ; + } ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_read_int_or_die (file, 0, test, 4, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + if (BIT_20_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* For some codecs we can't go past here. */ + if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || + (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) + { sf_close (file) ; + unlink (filename) ; + printf ("no seek : ") ; + return ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ; + + test_read_int_or_die (file, 0, test + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + if (BIT_20_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ; + + test_read_int_or_die (file, 0, test + 20, 4, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (BIT_20_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_read_int_or_die (file, 0, test + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + if (BIT_20_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + count = 0 ; + while (count < sfinfo.frames) + count += sf_read_int (file, test, 311) ; + + /* Check that no error has occurred. */ + if (sf_error (file)) + { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + /* Check that we haven't read beyond EOF. */ + if (count > sfinfo.frames) + { printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ; + exit (1) ; + } ; + + test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ; + + sf_close (file) ; + + multi_seek_test (filename, format) ; + write_seek_extend_test (filename, format) ; + +} /* mono_20bit_test */ + +static void +stereo_20bit_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int *orig, *test ; + int k, items, frames ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 2 ; + sfinfo.format = format ; + + gen_windowed_sine_double (orig_data.d, DATA_LENGTH, (1.0 * 0x7F00000)) ; + + orig = orig_data.i ; + test = test_data.i ; + + /* Make this a macro so gdb steps over it in one go. */ + CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; + + items = DATA_LENGTH ; + frames = items / sfinfo.channels ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + + sf_set_string (file, SF_STR_ARTIST, "Your name here") ; + + test_writef_int_or_die (file, 0, orig, frames, __LINE__) ; + + sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; + + sf_close (file) ; + + memset (test, 0, items * sizeof (int)) ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", + __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < frames) + { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", + __LINE__, sfinfo.frames, frames) ; + exit (1) ; + } ; + + if (! long_file_ok && sfinfo.frames > frames) + { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", + __LINE__, sfinfo.frames, frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 2) + { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_readf_int_or_die (file, 0, test, frames, __LINE__) ; + for (k = 0 ; k < items ; k++) + if (BIT_20_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_readf_int_or_die (file, 0, test, 2, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + if (BIT_20_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + + /* Check for errors here. */ + if (sf_error (file)) + { printf ("Line %d: Should NOT return an error.\n", __LINE__) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + if (sf_read_int (file, test, 1) > 0) + { printf ("Line %d: Should return 0.\n", __LINE__) ; + exit (1) ; + } ; + + if (! sf_error (file)) + { printf ("Line %d: Should return an error.\n", __LINE__) ; + exit (1) ; + } ; + /*-----------------------*/ + + test_readf_int_or_die (file, 0, test + 10, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (BIT_20_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; + + test_readf_int_or_die (file, 0, test + 20, 2, __LINE__) ; + for (k = 40 ; k < 44 ; k++) + if (BIT_20_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_readf_int_or_die (file, 0, test + 20, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (BIT_20_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + sf_close (file) ; +} /* stereo_20bit_test */ + +static void +mono_rdwr_20bit_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int *orig, *test ; + int k, pass ; + + switch (format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_ALAC_16 : + case SF_FORMAT_ALAC_20 : + case SF_FORMAT_ALAC_24 : + case SF_FORMAT_ALAC_32 : + allow_fd = 0 ; + break ; + + default : + break ; + } ; + + orig = orig_data.i ; + test = test_data.i ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = format ; + + if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW + || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU + || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) + unlink (filename) ; + else + { /* Create a short file. */ + create_short_file (filename) ; + + /* Opening a already existing short file (ie invalid header) RDWR is disallowed. + ** If this returns a valif pointer sf_open() screwed up. + */ + if ((file = sf_open (filename, SFM_RDWR, &sfinfo))) + { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ; + exit (1) ; + } ; + + /* Truncate the file to zero bytes. */ + if (truncate_file_to_zero (filename) < 0) + { printf ("\n\nLine %d: truncate_file_to_zero (%s) failed", __LINE__, filename) ; + perror (NULL) ; + exit (1) ; + } ; + } ; + + /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain + ** all the usual data required when opening the file in WRITE mode. + */ + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = format ; + + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + + /* Do 3 writes followed by reads. After each, check the data and the current + ** read and write offsets. + */ + for (pass = 1 ; pass <= 3 ; pass ++) + { orig [20] = pass * 2 ; + + /* Write some data. */ + test_write_int_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ; + + test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ; + + /* Read what we just wrote. */ + test_read_int_or_die (file, 0, test, DATA_LENGTH, __LINE__) ; + + /* Check the data. */ + for (k = 0 ; k < DATA_LENGTH ; k++) + if (BIT_20_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d (pass %d) A : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ; + oct_save_int (orig, test, DATA_LENGTH) ; + exit (1) ; + } ; + + test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ; + } ; /* for (pass ...) */ + + sf_close (file) ; + + /* Open the file again to check the data. */ + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < 3 * DATA_LENGTH) + { printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ; + exit (1) ; + } + + if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH) + { printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + if (! long_file_ok) + test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ; + else + test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ; + + for (pass = 1 ; pass <= 3 ; pass ++) + { orig [20] = pass * 2 ; + + test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ; + + /* Read what we just wrote. */ + test_read_int_or_die (file, pass, test, DATA_LENGTH, __LINE__) ; + + /* Check the data. */ + for (k = 0 ; k < DATA_LENGTH ; k++) + if (BIT_20_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d (pass %d) B : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ; + oct_save_int (orig, test, DATA_LENGTH) ; + exit (1) ; + } ; + + } ; /* for (pass ...) */ + + sf_close (file) ; +} /* mono_rdwr_int_test */ + +static void +new_rdwr_20bit_test (const char *filename, int format, int allow_fd) +{ SNDFILE *wfile, *rwfile ; + SF_INFO sfinfo ; + int *orig, *test ; + int items, frames ; + + orig = orig_data.i ; + test = test_data.i ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 2 ; + sfinfo.format = format ; + + items = DATA_LENGTH ; + frames = items / sfinfo.channels ; + + wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; + test_writef_int_or_die (wfile, 1, orig, frames, __LINE__) ; + sf_write_sync (wfile) ; + test_writef_int_or_die (wfile, 2, orig, frames, __LINE__) ; + sf_write_sync (wfile) ; + + rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + if (sfinfo.frames != 2 * frames) + { printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ; + exit (1) ; + } ; + + test_writef_int_or_die (wfile, 3, orig, frames, __LINE__) ; + + test_readf_int_or_die (rwfile, 1, test, frames, __LINE__) ; + test_readf_int_or_die (rwfile, 2, test, frames, __LINE__) ; + + sf_close (wfile) ; + sf_close (rwfile) ; +} /* new_rdwr_20bit_test */ + + +/*====================================================================================== +*/ + +static void mono_24bit_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void stereo_24bit_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void mono_rdwr_24bit_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void new_rdwr_24bit_test (const char *filename, int format, int allow_fd) ; +static void multi_seek_test (const char * filename, int format) ; +static void write_seek_extend_test (const char * filename, int format) ; + +static void +pcm_test_24bit (const char *filename, int format, int long_file_ok) +{ SF_INFO sfinfo ; + int *orig ; + int k, allow_fd ; + + /* Sd2 files cannot be opened from an existing file descriptor. */ + allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; + + print_test_name ("pcm_test_24bit", filename) ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = format ; + + test_sf_format_or_die (&sfinfo, __LINE__) ; + + gen_windowed_sine_double (orig_data.d, DATA_LENGTH, (1.0 * 0x7F000000)) ; + + orig = orig_data.i ; + + /* Make this a macro so gdb steps over it in one go. */ + CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; + + /* Some test broken out here. */ + + mono_24bit_test (filename, format, long_file_ok, allow_fd) ; + + /* Sub format DWVW does not allow seeking. */ + if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || + (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) + { unlink (filename) ; + printf ("no seek : ok\n") ; + return ; + } ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32 + ) + mono_rdwr_24bit_test (filename, format, long_file_ok, allow_fd) ; + + /* If the format doesn't support stereo we're done. */ + sfinfo.channels = 2 ; + if (sf_format_check (&sfinfo) == 0) + { unlink (filename) ; + puts ("no stereo : ok") ; + return ; + } ; + + stereo_24bit_test (filename, format, long_file_ok, allow_fd) ; + + /* New read/write test. Not sure if this is needed yet. */ + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF + && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC + && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32 + ) + new_rdwr_24bit_test (filename, format, allow_fd) ; + + delete_file (format, filename) ; + + puts ("ok") ; + return ; +} /* pcm_test_24bit */ + +static void +mono_24bit_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int *orig, *test ; + sf_count_t count ; + int k, items, total ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = format ; + + orig = orig_data.i ; + test = test_data.i ; + + items = DATA_LENGTH ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.frames || sfinfo.sections || sfinfo.seekable) + { printf ("\n\nLine %d : Weird SF_INFO fields.\n", __LINE__) ; + exit (1) ; + } ; + + sf_set_string (file, SF_STR_ARTIST, "Your name here") ; + + test_write_int_or_die (file, 0, orig, items, __LINE__) ; + sf_write_sync (file) ; + test_write_int_or_die (file, 0, orig, items, __LINE__) ; + sf_write_sync (file) ; + + /* Add non-audio data after the audio. */ + sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; + + sf_close (file) ; + + memset (test, 0, items * sizeof (int)) ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < 2 * items) + { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ; + exit (1) ; + } ; + + if (! long_file_ok && sfinfo.frames > 2 * items) + { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + if (sfinfo.seekable != 1) + { printf ("\n\nLine %d : File should be seekable.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_int_or_die (file, 0, test, items, __LINE__) ; + for (k = 0 ; k < items ; k++) + if (TRIBYTE_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + oct_save_int (orig, test, items) ; + exit (1) ; + } ; + + /* Test multiple short reads. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + total = 0 ; + for (k = 1 ; k <= 32 ; k++) + { int ik ; + + test_read_int_or_die (file, 0, test + total, k, __LINE__) ; + total += k ; + + for (ik = 0 ; ik < total ; ik++) + if (TRIBYTE_ERROR (orig [ik], test [ik])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, ik, orig [ik], test [ik]) ; + exit (1) ; + } ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_read_int_or_die (file, 0, test, 4, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + if (TRIBYTE_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* For some codecs we can't go past here. */ + if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || + (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) + { sf_close (file) ; + unlink (filename) ; + printf ("no seek : ") ; + return ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ; + + test_read_int_or_die (file, 0, test + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + if (TRIBYTE_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ; + + test_read_int_or_die (file, 0, test + 20, 4, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (TRIBYTE_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_read_int_or_die (file, 0, test + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + if (TRIBYTE_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + count = 0 ; + while (count < sfinfo.frames) + count += sf_read_int (file, test, 311) ; + + /* Check that no error has occurred. */ + if (sf_error (file)) + { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + /* Check that we haven't read beyond EOF. */ + if (count > sfinfo.frames) + { printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ; + exit (1) ; + } ; + + test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ; + + sf_close (file) ; + + multi_seek_test (filename, format) ; + write_seek_extend_test (filename, format) ; + +} /* mono_24bit_test */ + +static void +stereo_24bit_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int *orig, *test ; + int k, items, frames ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 2 ; + sfinfo.format = format ; + + gen_windowed_sine_double (orig_data.d, DATA_LENGTH, (1.0 * 0x7F000000)) ; + + orig = orig_data.i ; + test = test_data.i ; + + /* Make this a macro so gdb steps over it in one go. */ + CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; + + items = DATA_LENGTH ; + frames = items / sfinfo.channels ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + + sf_set_string (file, SF_STR_ARTIST, "Your name here") ; + + test_writef_int_or_die (file, 0, orig, frames, __LINE__) ; + + sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; + + sf_close (file) ; + + memset (test, 0, items * sizeof (int)) ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", + __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < frames) + { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", + __LINE__, sfinfo.frames, frames) ; + exit (1) ; + } ; + + if (! long_file_ok && sfinfo.frames > frames) + { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", + __LINE__, sfinfo.frames, frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 2) + { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_readf_int_or_die (file, 0, test, frames, __LINE__) ; + for (k = 0 ; k < items ; k++) + if (TRIBYTE_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_readf_int_or_die (file, 0, test, 2, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + if (TRIBYTE_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + + /* Check for errors here. */ + if (sf_error (file)) + { printf ("Line %d: Should NOT return an error.\n", __LINE__) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + if (sf_read_int (file, test, 1) > 0) + { printf ("Line %d: Should return 0.\n", __LINE__) ; + exit (1) ; + } ; + + if (! sf_error (file)) + { printf ("Line %d: Should return an error.\n", __LINE__) ; + exit (1) ; + } ; + /*-----------------------*/ + + test_readf_int_or_die (file, 0, test + 10, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (TRIBYTE_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; + + test_readf_int_or_die (file, 0, test + 20, 2, __LINE__) ; + for (k = 40 ; k < 44 ; k++) + if (TRIBYTE_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_readf_int_or_die (file, 0, test + 20, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (TRIBYTE_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + sf_close (file) ; +} /* stereo_24bit_test */ + +static void +mono_rdwr_24bit_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int *orig, *test ; + int k, pass ; + + switch (format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_ALAC_16 : + case SF_FORMAT_ALAC_20 : + case SF_FORMAT_ALAC_24 : + case SF_FORMAT_ALAC_32 : + allow_fd = 0 ; + break ; + + default : + break ; + } ; + + orig = orig_data.i ; + test = test_data.i ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = format ; + + if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW + || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU + || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) + unlink (filename) ; + else + { /* Create a short file. */ + create_short_file (filename) ; + + /* Opening a already existing short file (ie invalid header) RDWR is disallowed. + ** If this returns a valif pointer sf_open() screwed up. + */ + if ((file = sf_open (filename, SFM_RDWR, &sfinfo))) + { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ; + exit (1) ; + } ; + + /* Truncate the file to zero bytes. */ + if (truncate_file_to_zero (filename) < 0) + { printf ("\n\nLine %d: truncate_file_to_zero (%s) failed", __LINE__, filename) ; + perror (NULL) ; + exit (1) ; + } ; + } ; + + /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain + ** all the usual data required when opening the file in WRITE mode. + */ + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = format ; + + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + + /* Do 3 writes followed by reads. After each, check the data and the current + ** read and write offsets. + */ + for (pass = 1 ; pass <= 3 ; pass ++) + { orig [20] = pass * 2 ; + + /* Write some data. */ + test_write_int_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ; + + test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ; + + /* Read what we just wrote. */ + test_read_int_or_die (file, 0, test, DATA_LENGTH, __LINE__) ; + + /* Check the data. */ + for (k = 0 ; k < DATA_LENGTH ; k++) + if (TRIBYTE_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d (pass %d) A : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ; + oct_save_int (orig, test, DATA_LENGTH) ; + exit (1) ; + } ; + + test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ; + } ; /* for (pass ...) */ + + sf_close (file) ; + + /* Open the file again to check the data. */ + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < 3 * DATA_LENGTH) + { printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ; + exit (1) ; + } + + if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH) + { printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + if (! long_file_ok) + test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ; + else + test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ; + + for (pass = 1 ; pass <= 3 ; pass ++) + { orig [20] = pass * 2 ; + + test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ; + + /* Read what we just wrote. */ + test_read_int_or_die (file, pass, test, DATA_LENGTH, __LINE__) ; + + /* Check the data. */ + for (k = 0 ; k < DATA_LENGTH ; k++) + if (TRIBYTE_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d (pass %d) B : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ; + oct_save_int (orig, test, DATA_LENGTH) ; + exit (1) ; + } ; + + } ; /* for (pass ...) */ + + sf_close (file) ; +} /* mono_rdwr_int_test */ + +static void +new_rdwr_24bit_test (const char *filename, int format, int allow_fd) +{ SNDFILE *wfile, *rwfile ; + SF_INFO sfinfo ; + int *orig, *test ; + int items, frames ; + + orig = orig_data.i ; + test = test_data.i ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 2 ; + sfinfo.format = format ; + + items = DATA_LENGTH ; + frames = items / sfinfo.channels ; + + wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; + test_writef_int_or_die (wfile, 1, orig, frames, __LINE__) ; + sf_write_sync (wfile) ; + test_writef_int_or_die (wfile, 2, orig, frames, __LINE__) ; + sf_write_sync (wfile) ; + + rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + if (sfinfo.frames != 2 * frames) + { printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ; + exit (1) ; + } ; + + test_writef_int_or_die (wfile, 3, orig, frames, __LINE__) ; + + test_readf_int_or_die (rwfile, 1, test, frames, __LINE__) ; + test_readf_int_or_die (rwfile, 2, test, frames, __LINE__) ; + + sf_close (wfile) ; + sf_close (rwfile) ; +} /* new_rdwr_24bit_test */ + + +/*====================================================================================== +*/ + +static void mono_int_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void stereo_int_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void mono_rdwr_int_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void new_rdwr_int_test (const char *filename, int format, int allow_fd) ; +static void multi_seek_test (const char * filename, int format) ; +static void write_seek_extend_test (const char * filename, int format) ; + +static void +pcm_test_int (const char *filename, int format, int long_file_ok) +{ SF_INFO sfinfo ; + int *orig ; + int k, allow_fd ; + + /* Sd2 files cannot be opened from an existing file descriptor. */ + allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; + + print_test_name ("pcm_test_int", filename) ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = format ; + + test_sf_format_or_die (&sfinfo, __LINE__) ; + + gen_windowed_sine_double (orig_data.d, DATA_LENGTH, (1.0 * 0x7F000000)) ; + + orig = orig_data.i ; + + /* Make this a macro so gdb steps over it in one go. */ + CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; + + /* Some test broken out here. */ + + mono_int_test (filename, format, long_file_ok, allow_fd) ; + + /* Sub format DWVW does not allow seeking. */ + if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || + (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) + { unlink (filename) ; + printf ("no seek : ok\n") ; + return ; + } ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32 + ) + mono_rdwr_int_test (filename, format, long_file_ok, allow_fd) ; + + /* If the format doesn't support stereo we're done. */ + sfinfo.channels = 2 ; + if (sf_format_check (&sfinfo) == 0) + { unlink (filename) ; + puts ("no stereo : ok") ; + return ; + } ; + + stereo_int_test (filename, format, long_file_ok, allow_fd) ; + + /* New read/write test. Not sure if this is needed yet. */ + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF + && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC + && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32 + ) + new_rdwr_int_test (filename, format, allow_fd) ; + + delete_file (format, filename) ; + + puts ("ok") ; + return ; +} /* pcm_test_int */ + +static void +mono_int_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int *orig, *test ; + sf_count_t count ; + int k, items, total ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = format ; + + orig = orig_data.i ; + test = test_data.i ; + + items = DATA_LENGTH ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.frames || sfinfo.sections || sfinfo.seekable) + { printf ("\n\nLine %d : Weird SF_INFO fields.\n", __LINE__) ; + exit (1) ; + } ; + + sf_set_string (file, SF_STR_ARTIST, "Your name here") ; + + test_write_int_or_die (file, 0, orig, items, __LINE__) ; + sf_write_sync (file) ; + test_write_int_or_die (file, 0, orig, items, __LINE__) ; + sf_write_sync (file) ; + + /* Add non-audio data after the audio. */ + sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; + + sf_close (file) ; + + memset (test, 0, items * sizeof (int)) ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < 2 * items) + { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ; + exit (1) ; + } ; + + if (! long_file_ok && sfinfo.frames > 2 * items) + { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + if (sfinfo.seekable != 1) + { printf ("\n\nLine %d : File should be seekable.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_int_or_die (file, 0, test, items, __LINE__) ; + for (k = 0 ; k < items ; k++) + if (INT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + oct_save_int (orig, test, items) ; + exit (1) ; + } ; + + /* Test multiple short reads. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + total = 0 ; + for (k = 1 ; k <= 32 ; k++) + { int ik ; + + test_read_int_or_die (file, 0, test + total, k, __LINE__) ; + total += k ; + + for (ik = 0 ; ik < total ; ik++) + if (INT_ERROR (orig [ik], test [ik])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, ik, orig [ik], test [ik]) ; + exit (1) ; + } ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_read_int_or_die (file, 0, test, 4, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + if (INT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* For some codecs we can't go past here. */ + if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || + (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) + { sf_close (file) ; + unlink (filename) ; + printf ("no seek : ") ; + return ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ; + + test_read_int_or_die (file, 0, test + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + if (INT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ; + + test_read_int_or_die (file, 0, test + 20, 4, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (INT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_read_int_or_die (file, 0, test + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + if (INT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : 0x%X => 0x%X).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + count = 0 ; + while (count < sfinfo.frames) + count += sf_read_int (file, test, 311) ; + + /* Check that no error has occurred. */ + if (sf_error (file)) + { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + /* Check that we haven't read beyond EOF. */ + if (count > sfinfo.frames) + { printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ; + exit (1) ; + } ; + + test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ; + + sf_close (file) ; + + multi_seek_test (filename, format) ; + write_seek_extend_test (filename, format) ; + +} /* mono_int_test */ + +static void +stereo_int_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int *orig, *test ; + int k, items, frames ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 2 ; + sfinfo.format = format ; + + gen_windowed_sine_double (orig_data.d, DATA_LENGTH, (1.0 * 0x7F000000)) ; + + orig = orig_data.i ; + test = test_data.i ; + + /* Make this a macro so gdb steps over it in one go. */ + CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; + + items = DATA_LENGTH ; + frames = items / sfinfo.channels ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + + sf_set_string (file, SF_STR_ARTIST, "Your name here") ; + + test_writef_int_or_die (file, 0, orig, frames, __LINE__) ; + + sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; + + sf_close (file) ; + + memset (test, 0, items * sizeof (int)) ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", + __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < frames) + { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", + __LINE__, sfinfo.frames, frames) ; + exit (1) ; + } ; + + if (! long_file_ok && sfinfo.frames > frames) + { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", + __LINE__, sfinfo.frames, frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 2) + { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_readf_int_or_die (file, 0, test, frames, __LINE__) ; + for (k = 0 ; k < items ; k++) + if (INT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_readf_int_or_die (file, 0, test, 2, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + if (INT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + + /* Check for errors here. */ + if (sf_error (file)) + { printf ("Line %d: Should NOT return an error.\n", __LINE__) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + if (sf_read_int (file, test, 1) > 0) + { printf ("Line %d: Should return 0.\n", __LINE__) ; + exit (1) ; + } ; + + if (! sf_error (file)) + { printf ("Line %d: Should return an error.\n", __LINE__) ; + exit (1) ; + } ; + /*-----------------------*/ + + test_readf_int_or_die (file, 0, test + 10, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (INT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; + + test_readf_int_or_die (file, 0, test + 20, 2, __LINE__) ; + for (k = 40 ; k < 44 ; k++) + if (INT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_readf_int_or_die (file, 0, test + 20, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (INT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : 0x%X => 0x%X).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + sf_close (file) ; +} /* stereo_int_test */ + +static void +mono_rdwr_int_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + int *orig, *test ; + int k, pass ; + + switch (format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_ALAC_16 : + case SF_FORMAT_ALAC_20 : + case SF_FORMAT_ALAC_24 : + case SF_FORMAT_ALAC_32 : + allow_fd = 0 ; + break ; + + default : + break ; + } ; + + orig = orig_data.i ; + test = test_data.i ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = format ; + + if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW + || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU + || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) + unlink (filename) ; + else + { /* Create a short file. */ + create_short_file (filename) ; + + /* Opening a already existing short file (ie invalid header) RDWR is disallowed. + ** If this returns a valif pointer sf_open() screwed up. + */ + if ((file = sf_open (filename, SFM_RDWR, &sfinfo))) + { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ; + exit (1) ; + } ; + + /* Truncate the file to zero bytes. */ + if (truncate_file_to_zero (filename) < 0) + { printf ("\n\nLine %d: truncate_file_to_zero (%s) failed", __LINE__, filename) ; + perror (NULL) ; + exit (1) ; + } ; + } ; + + /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain + ** all the usual data required when opening the file in WRITE mode. + */ + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = format ; + + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + + /* Do 3 writes followed by reads. After each, check the data and the current + ** read and write offsets. + */ + for (pass = 1 ; pass <= 3 ; pass ++) + { orig [20] = pass * 2 ; + + /* Write some data. */ + test_write_int_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ; + + test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ; + + /* Read what we just wrote. */ + test_read_int_or_die (file, 0, test, DATA_LENGTH, __LINE__) ; + + /* Check the data. */ + for (k = 0 ; k < DATA_LENGTH ; k++) + if (INT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d (pass %d) A : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ; + oct_save_int (orig, test, DATA_LENGTH) ; + exit (1) ; + } ; + + test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ; + } ; /* for (pass ...) */ + + sf_close (file) ; + + /* Open the file again to check the data. */ + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < 3 * DATA_LENGTH) + { printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ; + exit (1) ; + } + + if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH) + { printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + if (! long_file_ok) + test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ; + else + test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ; + + for (pass = 1 ; pass <= 3 ; pass ++) + { orig [20] = pass * 2 ; + + test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ; + + /* Read what we just wrote. */ + test_read_int_or_die (file, pass, test, DATA_LENGTH, __LINE__) ; + + /* Check the data. */ + for (k = 0 ; k < DATA_LENGTH ; k++) + if (INT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d (pass %d) B : Error at sample %d (0x%X => 0x%X).\n", __LINE__, pass, k, orig [k], test [k]) ; + oct_save_int (orig, test, DATA_LENGTH) ; + exit (1) ; + } ; + + } ; /* for (pass ...) */ + + sf_close (file) ; +} /* mono_rdwr_int_test */ + +static void +new_rdwr_int_test (const char *filename, int format, int allow_fd) +{ SNDFILE *wfile, *rwfile ; + SF_INFO sfinfo ; + int *orig, *test ; + int items, frames ; + + orig = orig_data.i ; + test = test_data.i ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 2 ; + sfinfo.format = format ; + + items = DATA_LENGTH ; + frames = items / sfinfo.channels ; + + wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; + test_writef_int_or_die (wfile, 1, orig, frames, __LINE__) ; + sf_write_sync (wfile) ; + test_writef_int_or_die (wfile, 2, orig, frames, __LINE__) ; + sf_write_sync (wfile) ; + + rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + if (sfinfo.frames != 2 * frames) + { printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ; + exit (1) ; + } ; + + test_writef_int_or_die (wfile, 3, orig, frames, __LINE__) ; + + test_readf_int_or_die (rwfile, 1, test, frames, __LINE__) ; + test_readf_int_or_die (rwfile, 2, test, frames, __LINE__) ; + + sf_close (wfile) ; + sf_close (rwfile) ; +} /* new_rdwr_int_test */ + + +/*====================================================================================== +*/ + +static void mono_float_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void stereo_float_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void mono_rdwr_float_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void new_rdwr_float_test (const char *filename, int format, int allow_fd) ; +static void multi_seek_test (const char * filename, int format) ; +static void write_seek_extend_test (const char * filename, int format) ; + +static void +pcm_test_float (const char *filename, int format, int long_file_ok) +{ SF_INFO sfinfo ; + float *orig ; + int k, allow_fd ; + + /* Sd2 files cannot be opened from an existing file descriptor. */ + allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; + + print_test_name ("pcm_test_float", filename) ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = format ; + + test_sf_format_or_die (&sfinfo, __LINE__) ; + + gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 1.0) ; + + orig = orig_data.f ; + + /* Make this a macro so gdb steps over it in one go. */ + CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; + + /* Some test broken out here. */ + + mono_float_test (filename, format, long_file_ok, allow_fd) ; + + /* Sub format DWVW does not allow seeking. */ + if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || + (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) + { unlink (filename) ; + printf ("no seek : ok\n") ; + return ; + } ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32 + ) + mono_rdwr_float_test (filename, format, long_file_ok, allow_fd) ; + + /* If the format doesn't support stereo we're done. */ + sfinfo.channels = 2 ; + if (sf_format_check (&sfinfo) == 0) + { unlink (filename) ; + puts ("no stereo : ok") ; + return ; + } ; + + stereo_float_test (filename, format, long_file_ok, allow_fd) ; + + /* New read/write test. Not sure if this is needed yet. */ + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF + && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC + && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32 + ) + new_rdwr_float_test (filename, format, allow_fd) ; + + delete_file (format, filename) ; + + puts ("ok") ; + return ; +} /* pcm_test_float */ + +static void +mono_float_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + float *orig, *test ; + sf_count_t count ; + int k, items, total ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = format ; + + orig = orig_data.f ; + test = test_data.f ; + + items = DATA_LENGTH ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.frames || sfinfo.sections || sfinfo.seekable) + { printf ("\n\nLine %d : Weird SF_INFO fields.\n", __LINE__) ; + exit (1) ; + } ; + + sf_set_string (file, SF_STR_ARTIST, "Your name here") ; + + test_write_float_or_die (file, 0, orig, items, __LINE__) ; + sf_write_sync (file) ; + test_write_float_or_die (file, 0, orig, items, __LINE__) ; + sf_write_sync (file) ; + + /* Add non-audio data after the audio. */ + sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; + + sf_close (file) ; + + memset (test, 0, items * sizeof (float)) ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < 2 * items) + { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ; + exit (1) ; + } ; + + if (! long_file_ok && sfinfo.frames > 2 * items) + { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + if (sfinfo.seekable != 1) + { printf ("\n\nLine %d : File should be seekable.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_float_or_die (file, 0, test, items, __LINE__) ; + for (k = 0 ; k < items ; k++) + if (FLOAT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; + oct_save_float (orig, test, items) ; + exit (1) ; + } ; + + /* Test multiple short reads. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + total = 0 ; + for (k = 1 ; k <= 32 ; k++) + { int ik ; + + test_read_float_or_die (file, 0, test + total, k, __LINE__) ; + total += k ; + + for (ik = 0 ; ik < total ; ik++) + if (FLOAT_ERROR (orig [ik], test [ik])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, ik, orig [ik], test [ik]) ; + exit (1) ; + } ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_read_float_or_die (file, 0, test, 4, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + if (FLOAT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* For some codecs we can't go past here. */ + if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || + (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) + { sf_close (file) ; + unlink (filename) ; + printf ("no seek : ") ; + return ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ; + + test_read_float_or_die (file, 0, test + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + if (FLOAT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ; + + test_read_float_or_die (file, 0, test + 20, 4, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (FLOAT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_read_float_or_die (file, 0, test + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + if (FLOAT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : %g => %g).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + count = 0 ; + while (count < sfinfo.frames) + count += sf_read_float (file, test, 311) ; + + /* Check that no error has occurred. */ + if (sf_error (file)) + { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + /* Check that we haven't read beyond EOF. */ + if (count > sfinfo.frames) + { printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ; + exit (1) ; + } ; + + test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ; + + sf_close (file) ; + + multi_seek_test (filename, format) ; + write_seek_extend_test (filename, format) ; + +} /* mono_float_test */ + +static void +stereo_float_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + float *orig, *test ; + int k, items, frames ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 2 ; + sfinfo.format = format ; + + gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 1.0) ; + + orig = orig_data.f ; + test = test_data.f ; + + /* Make this a macro so gdb steps over it in one go. */ + CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; + + items = DATA_LENGTH ; + frames = items / sfinfo.channels ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + + sf_set_string (file, SF_STR_ARTIST, "Your name here") ; + + test_writef_float_or_die (file, 0, orig, frames, __LINE__) ; + + sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; + + sf_close (file) ; + + memset (test, 0, items * sizeof (float)) ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", + __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < frames) + { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", + __LINE__, sfinfo.frames, frames) ; + exit (1) ; + } ; + + if (! long_file_ok && sfinfo.frames > frames) + { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", + __LINE__, sfinfo.frames, frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 2) + { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_readf_float_or_die (file, 0, test, frames, __LINE__) ; + for (k = 0 ; k < items ; k++) + if (FLOAT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_readf_float_or_die (file, 0, test, 2, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + if (FLOAT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + + /* Check for errors here. */ + if (sf_error (file)) + { printf ("Line %d: Should NOT return an error.\n", __LINE__) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + if (sf_read_float (file, test, 1) > 0) + { printf ("Line %d: Should return 0.\n", __LINE__) ; + exit (1) ; + } ; + + if (! sf_error (file)) + { printf ("Line %d: Should return an error.\n", __LINE__) ; + exit (1) ; + } ; + /*-----------------------*/ + + test_readf_float_or_die (file, 0, test + 10, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (FLOAT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; + + test_readf_float_or_die (file, 0, test + 20, 2, __LINE__) ; + for (k = 40 ; k < 44 ; k++) + if (FLOAT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_readf_float_or_die (file, 0, test + 20, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (FLOAT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + sf_close (file) ; +} /* stereo_float_test */ + +static void +mono_rdwr_float_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + float *orig, *test ; + int k, pass ; + + switch (format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_ALAC_16 : + case SF_FORMAT_ALAC_20 : + case SF_FORMAT_ALAC_24 : + case SF_FORMAT_ALAC_32 : + allow_fd = 0 ; + break ; + + default : + break ; + } ; + + orig = orig_data.f ; + test = test_data.f ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = format ; + + if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW + || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU + || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) + unlink (filename) ; + else + { /* Create a short file. */ + create_short_file (filename) ; + + /* Opening a already existing short file (ie invalid header) RDWR is disallowed. + ** If this returns a valif pointer sf_open() screwed up. + */ + if ((file = sf_open (filename, SFM_RDWR, &sfinfo))) + { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ; + exit (1) ; + } ; + + /* Truncate the file to zero bytes. */ + if (truncate_file_to_zero (filename) < 0) + { printf ("\n\nLine %d: truncate_file_to_zero (%s) failed", __LINE__, filename) ; + perror (NULL) ; + exit (1) ; + } ; + } ; + + /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain + ** all the usual data required when opening the file in WRITE mode. + */ + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = format ; + + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + + /* Do 3 writes followed by reads. After each, check the data and the current + ** read and write offsets. + */ + for (pass = 1 ; pass <= 3 ; pass ++) + { orig [20] = pass * 2 ; + + /* Write some data. */ + test_write_float_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ; + + test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ; + + /* Read what we just wrote. */ + test_read_float_or_die (file, 0, test, DATA_LENGTH, __LINE__) ; + + /* Check the data. */ + for (k = 0 ; k < DATA_LENGTH ; k++) + if (FLOAT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d (pass %d) A : Error at sample %d (%g => %g).\n", __LINE__, pass, k, orig [k], test [k]) ; + oct_save_float (orig, test, DATA_LENGTH) ; + exit (1) ; + } ; + + test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ; + } ; /* for (pass ...) */ + + sf_close (file) ; + + /* Open the file again to check the data. */ + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < 3 * DATA_LENGTH) + { printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ; + exit (1) ; + } + + if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH) + { printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + if (! long_file_ok) + test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ; + else + test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ; + + for (pass = 1 ; pass <= 3 ; pass ++) + { orig [20] = pass * 2 ; + + test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ; + + /* Read what we just wrote. */ + test_read_float_or_die (file, pass, test, DATA_LENGTH, __LINE__) ; + + /* Check the data. */ + for (k = 0 ; k < DATA_LENGTH ; k++) + if (FLOAT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d (pass %d) B : Error at sample %d (%g => %g).\n", __LINE__, pass, k, orig [k], test [k]) ; + oct_save_float (orig, test, DATA_LENGTH) ; + exit (1) ; + } ; + + } ; /* for (pass ...) */ + + sf_close (file) ; +} /* mono_rdwr_float_test */ + +static void +new_rdwr_float_test (const char *filename, int format, int allow_fd) +{ SNDFILE *wfile, *rwfile ; + SF_INFO sfinfo ; + float *orig, *test ; + int items, frames ; + + orig = orig_data.f ; + test = test_data.f ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 2 ; + sfinfo.format = format ; + + items = DATA_LENGTH ; + frames = items / sfinfo.channels ; + + wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; + test_writef_float_or_die (wfile, 1, orig, frames, __LINE__) ; + sf_write_sync (wfile) ; + test_writef_float_or_die (wfile, 2, orig, frames, __LINE__) ; + sf_write_sync (wfile) ; + + rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + if (sfinfo.frames != 2 * frames) + { printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ; + exit (1) ; + } ; + + test_writef_float_or_die (wfile, 3, orig, frames, __LINE__) ; + + test_readf_float_or_die (rwfile, 1, test, frames, __LINE__) ; + test_readf_float_or_die (rwfile, 2, test, frames, __LINE__) ; + + sf_close (wfile) ; + sf_close (rwfile) ; +} /* new_rdwr_float_test */ + + +/*====================================================================================== +*/ + +static void mono_double_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void stereo_double_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void mono_rdwr_double_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void new_rdwr_double_test (const char *filename, int format, int allow_fd) ; +static void multi_seek_test (const char * filename, int format) ; +static void write_seek_extend_test (const char * filename, int format) ; + +static void +pcm_test_double (const char *filename, int format, int long_file_ok) +{ SF_INFO sfinfo ; + double *orig ; + int k, allow_fd ; + + /* Sd2 files cannot be opened from an existing file descriptor. */ + allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; + + print_test_name ("pcm_test_double", filename) ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = format ; + + test_sf_format_or_die (&sfinfo, __LINE__) ; + + gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 1.0) ; + + orig = orig_data.d ; + + /* Make this a macro so gdb steps over it in one go. */ + CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; + + /* Some test broken out here. */ + + mono_double_test (filename, format, long_file_ok, allow_fd) ; + + /* Sub format DWVW does not allow seeking. */ + if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || + (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) + { unlink (filename) ; + printf ("no seek : ok\n") ; + return ; + } ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32 + ) + mono_rdwr_double_test (filename, format, long_file_ok, allow_fd) ; + + /* If the format doesn't support stereo we're done. */ + sfinfo.channels = 2 ; + if (sf_format_check (&sfinfo) == 0) + { unlink (filename) ; + puts ("no stereo : ok") ; + return ; + } ; + + stereo_double_test (filename, format, long_file_ok, allow_fd) ; + + /* New read/write test. Not sure if this is needed yet. */ + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF + && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC + && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32 + ) + new_rdwr_double_test (filename, format, allow_fd) ; + + delete_file (format, filename) ; + + puts ("ok") ; + return ; +} /* pcm_test_double */ + +static void +mono_double_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + double *orig, *test ; + sf_count_t count ; + int k, items, total ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = format ; + + orig = orig_data.d ; + test = test_data.d ; + + items = DATA_LENGTH ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.frames || sfinfo.sections || sfinfo.seekable) + { printf ("\n\nLine %d : Weird SF_INFO fields.\n", __LINE__) ; + exit (1) ; + } ; + + sf_set_string (file, SF_STR_ARTIST, "Your name here") ; + + test_write_double_or_die (file, 0, orig, items, __LINE__) ; + sf_write_sync (file) ; + test_write_double_or_die (file, 0, orig, items, __LINE__) ; + sf_write_sync (file) ; + + /* Add non-audio data after the audio. */ + sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; + + sf_close (file) ; + + memset (test, 0, items * sizeof (double)) ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < 2 * items) + { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ; + exit (1) ; + } ; + + if (! long_file_ok && sfinfo.frames > 2 * items) + { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + if (sfinfo.seekable != 1) + { printf ("\n\nLine %d : File should be seekable.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_double_or_die (file, 0, test, items, __LINE__) ; + for (k = 0 ; k < items ; k++) + if (FLOAT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; + oct_save_double (orig, test, items) ; + exit (1) ; + } ; + + /* Test multiple short reads. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + total = 0 ; + for (k = 1 ; k <= 32 ; k++) + { int ik ; + + test_read_double_or_die (file, 0, test + total, k, __LINE__) ; + total += k ; + + for (ik = 0 ; ik < total ; ik++) + if (FLOAT_ERROR (orig [ik], test [ik])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, ik, orig [ik], test [ik]) ; + exit (1) ; + } ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, test, 4, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + if (FLOAT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* For some codecs we can't go past here. */ + if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || + (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) + { sf_close (file) ; + unlink (filename) ; + printf ("no seek : ") ; + return ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, test + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + if (FLOAT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, test + 20, 4, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (FLOAT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : %g => %g).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_read_double_or_die (file, 0, test + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + if (FLOAT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : %g => %g).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + count = 0 ; + while (count < sfinfo.frames) + count += sf_read_double (file, test, 311) ; + + /* Check that no error has occurred. */ + if (sf_error (file)) + { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + /* Check that we haven't read beyond EOF. */ + if (count > sfinfo.frames) + { printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ; + exit (1) ; + } ; + + test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ; + + sf_close (file) ; + + multi_seek_test (filename, format) ; + write_seek_extend_test (filename, format) ; + +} /* mono_double_test */ + +static void +stereo_double_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + double *orig, *test ; + int k, items, frames ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 2 ; + sfinfo.format = format ; + + gen_windowed_sine_double (orig_data.d, DATA_LENGTH, 1.0) ; + + orig = orig_data.d ; + test = test_data.d ; + + /* Make this a macro so gdb steps over it in one go. */ + CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; + + items = DATA_LENGTH ; + frames = items / sfinfo.channels ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + + sf_set_string (file, SF_STR_ARTIST, "Your name here") ; + + test_writef_double_or_die (file, 0, orig, frames, __LINE__) ; + + sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; + + sf_close (file) ; + + memset (test, 0, items * sizeof (double)) ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", + __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < frames) + { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", + __LINE__, sfinfo.frames, frames) ; + exit (1) ; + } ; + + if (! long_file_ok && sfinfo.frames > frames) + { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", + __LINE__, sfinfo.frames, frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 2) + { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_readf_double_or_die (file, 0, test, frames, __LINE__) ; + for (k = 0 ; k < items ; k++) + if (FLOAT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_readf_double_or_die (file, 0, test, 2, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + if (FLOAT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + + /* Check for errors here. */ + if (sf_error (file)) + { printf ("Line %d: Should NOT return an error.\n", __LINE__) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + if (sf_read_double (file, test, 1) > 0) + { printf ("Line %d: Should return 0.\n", __LINE__) ; + exit (1) ; + } ; + + if (! sf_error (file)) + { printf ("Line %d: Should return an error.\n", __LINE__) ; + exit (1) ; + } ; + /*-----------------------*/ + + test_readf_double_or_die (file, 0, test + 10, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (FLOAT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; + + test_readf_double_or_die (file, 0, test + 20, 2, __LINE__) ; + for (k = 40 ; k < 44 ; k++) + if (FLOAT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_readf_double_or_die (file, 0, test + 20, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if (FLOAT_ERROR (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : %g => %g).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + sf_close (file) ; +} /* stereo_double_test */ + +static void +mono_rdwr_double_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + double *orig, *test ; + int k, pass ; + + switch (format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_ALAC_16 : + case SF_FORMAT_ALAC_20 : + case SF_FORMAT_ALAC_24 : + case SF_FORMAT_ALAC_32 : + allow_fd = 0 ; + break ; + + default : + break ; + } ; + + orig = orig_data.d ; + test = test_data.d ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = format ; + + if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW + || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU + || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) + unlink (filename) ; + else + { /* Create a short file. */ + create_short_file (filename) ; + + /* Opening a already existing short file (ie invalid header) RDWR is disallowed. + ** If this returns a valif pointer sf_open() screwed up. + */ + if ((file = sf_open (filename, SFM_RDWR, &sfinfo))) + { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ; + exit (1) ; + } ; + + /* Truncate the file to zero bytes. */ + if (truncate_file_to_zero (filename) < 0) + { printf ("\n\nLine %d: truncate_file_to_zero (%s) failed", __LINE__, filename) ; + perror (NULL) ; + exit (1) ; + } ; + } ; + + /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain + ** all the usual data required when opening the file in WRITE mode. + */ + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = format ; + + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + + /* Do 3 writes followed by reads. After each, check the data and the current + ** read and write offsets. + */ + for (pass = 1 ; pass <= 3 ; pass ++) + { orig [20] = pass * 2 ; + + /* Write some data. */ + test_write_double_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ; + + test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ; + + /* Read what we just wrote. */ + test_read_double_or_die (file, 0, test, DATA_LENGTH, __LINE__) ; + + /* Check the data. */ + for (k = 0 ; k < DATA_LENGTH ; k++) + if (FLOAT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d (pass %d) A : Error at sample %d (%g => %g).\n", __LINE__, pass, k, orig [k], test [k]) ; + oct_save_double (orig, test, DATA_LENGTH) ; + exit (1) ; + } ; + + test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ; + } ; /* for (pass ...) */ + + sf_close (file) ; + + /* Open the file again to check the data. */ + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < 3 * DATA_LENGTH) + { printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ; + exit (1) ; + } + + if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH) + { printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + if (! long_file_ok) + test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ; + else + test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ; + + for (pass = 1 ; pass <= 3 ; pass ++) + { orig [20] = pass * 2 ; + + test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ; + + /* Read what we just wrote. */ + test_read_double_or_die (file, pass, test, DATA_LENGTH, __LINE__) ; + + /* Check the data. */ + for (k = 0 ; k < DATA_LENGTH ; k++) + if (FLOAT_ERROR (orig [k], test [k])) + { printf ("\n\nLine %d (pass %d) B : Error at sample %d (%g => %g).\n", __LINE__, pass, k, orig [k], test [k]) ; + oct_save_double (orig, test, DATA_LENGTH) ; + exit (1) ; + } ; + + } ; /* for (pass ...) */ + + sf_close (file) ; +} /* mono_rdwr_double_test */ + +static void +new_rdwr_double_test (const char *filename, int format, int allow_fd) +{ SNDFILE *wfile, *rwfile ; + SF_INFO sfinfo ; + double *orig, *test ; + int items, frames ; + + orig = orig_data.d ; + test = test_data.d ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 2 ; + sfinfo.format = format ; + + items = DATA_LENGTH ; + frames = items / sfinfo.channels ; + + wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; + test_writef_double_or_die (wfile, 1, orig, frames, __LINE__) ; + sf_write_sync (wfile) ; + test_writef_double_or_die (wfile, 2, orig, frames, __LINE__) ; + sf_write_sync (wfile) ; + + rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + if (sfinfo.frames != 2 * frames) + { printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ; + exit (1) ; + } ; + + test_writef_double_or_die (wfile, 3, orig, frames, __LINE__) ; + + test_readf_double_or_die (rwfile, 1, test, frames, __LINE__) ; + test_readf_double_or_die (rwfile, 2, test, frames, __LINE__) ; + + sf_close (wfile) ; + sf_close (rwfile) ; +} /* new_rdwr_double_test */ + + + +/*---------------------------------------------------------------------------------------- +*/ + +static void +empty_file_test (const char *filename, int format) +{ SNDFILE *file ; + SF_INFO info ; + int allow_fd ; + + /* Sd2 files cannot be opened from an existing file descriptor. */ + allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; + + print_test_name ("empty_file_test", filename) ; + + unlink (filename) ; + + info.samplerate = 48000 ; + info.channels = 2 ; + info.format = format ; + info.frames = 0 ; + + if (sf_format_check (&info) == SF_FALSE) + { info.channels = 1 ; + if (sf_format_check (&info) == SF_FALSE) + { puts ("invalid file format") ; + return ; + } ; + } ; + + /* Create an empty file. */ + file = test_open_file_or_die (filename, SFM_WRITE, &info, allow_fd, __LINE__) ; + sf_close (file) ; + + /* Open for read and check the length. */ + file = test_open_file_or_die (filename, SFM_READ, &info, allow_fd, __LINE__) ; + + if (info.frames != 0) + { printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ; + exit (1) ; + } ; + + sf_close (file) ; + + /* Open for read/write and check the length. */ + file = test_open_file_or_die (filename, SFM_RDWR, &info, allow_fd, __LINE__) ; + + if (info.frames != 0) + { printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ; + exit (1) ; + } ; + + sf_close (file) ; + + /* Open for read and check the length. */ + file = test_open_file_or_die (filename, SFM_READ, &info, allow_fd, __LINE__) ; + + if (info.frames != 0) + { printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ; + exit (1) ; + } ; + + sf_close (file) ; + + check_open_file_count_or_die (__LINE__) ; + + unlink (filename) ; + puts ("ok") ; + + return ; +} /* empty_file_test */ + + +/*---------------------------------------------------------------------------------------- +*/ + +static void +create_short_file (const char *filename) +{ FILE *file ; + + if (! (file = fopen (filename, "w"))) + { printf ("create_short_file : fopen (%s, \"w\") failed.", filename) ; + fflush (stdout) ; + perror (NULL) ; + exit (1) ; + } ; + + fprintf (file, "This is the file data.\n") ; + + fclose (file) ; +} /* create_short_file */ + + +static void +multi_seek_test (const char * filename, int format) +{ SNDFILE * file ; + SF_INFO info ; + sf_count_t pos ; + int k ; + + /* This test doesn't work on the following. */ + switch (format & SF_FORMAT_TYPEMASK) + { case SF_FORMAT_RAW : + return ; + + default : + break ; + } ; + + memset (&info, 0, sizeof (info)) ; + + generate_file (filename, format, 88200) ; + + file = test_open_file_or_die (filename, SFM_READ, &info, SF_FALSE, __LINE__) ; + + for (k = 0 ; k < 10 ; k++) + { pos = info.frames / (k + 2) ; + test_seek_or_die (file, pos, SEEK_SET, pos, info.channels, __LINE__) ; + } ; + + sf_close (file) ; +} /* multi_seek_test */ + +static void +write_seek_extend_test (const char * filename, int format) +{ SNDFILE * file ; + SF_INFO info ; + short *orig, *test ; + unsigned items, k ; + + /* This test doesn't work on the following container formats. */ + switch (format & SF_FORMAT_TYPEMASK) + { case SF_FORMAT_FLAC : + case SF_FORMAT_HTK : + case SF_FORMAT_PAF : + case SF_FORMAT_SDS : + case SF_FORMAT_SVX : + return ; + + default : + break ; + } ; + + /* This test doesn't work on the following codec formats. */ + switch (format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_ALAC_16 : + case SF_FORMAT_ALAC_20 : + case SF_FORMAT_ALAC_24 : + case SF_FORMAT_ALAC_32 : + return ; + + default : + break ; + } ; + + memset (&info, 0, sizeof (info)) ; + + info.samplerate = 48000 ; + info.channels = 1 ; + info.format = format ; + + items = 512 ; + exit_if_true (items > ARRAY_LEN (orig_data.s), "Line %d : Bad assumption.\n", __LINE__) ; + + orig = orig_data.s ; + test = test_data.s ; + + for (k = 0 ; k < ARRAY_LEN (orig_data.s) ; k++) + orig [k] = 0x3fff ; + + file = test_open_file_or_die (filename, SFM_WRITE, &info, SF_FALSE, __LINE__) ; + test_write_short_or_die (file, 0, orig, items, __LINE__) ; + + /* Extend the file using a seek. */ + test_seek_or_die (file, 2 * items, SEEK_SET, 2 * items, info.channels, __LINE__) ; + + test_writef_short_or_die (file, 0, orig, items, __LINE__) ; + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &info, SF_FALSE, __LINE__) ; + test_read_short_or_die (file, 0, test, 3 * items, __LINE__) ; + sf_close (file) ; + + if (info.frames < 3 * items) + { printf ("\n\nLine %d : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, info.frames, 3 * items) ; + exit (1) ; + } ; + + /* Can't do these formats due to scaling. */ + switch (format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_PCM_S8 : + case SF_FORMAT_PCM_U8 : + return ; + default : + break ; + } ; + + for (k = 0 ; k < items ; k++) + { exit_if_true (test [k] != 0x3fff, "Line %d : test [%d] == %d, should be 0x3fff.\n", __LINE__, k, test [k]) ; + exit_if_true (test [items + k] != 0, "Line %d : test [%d] == %d, should be 0.\n", __LINE__, items + k, test [items + k]) ; + exit_if_true (test [2 * items + k] != 0x3fff, "Line %d : test [%d] == %d, should be 0x3fff.\n", __LINE__, 2 * items + k, test [2 * items + k]) ; + } ; + + return ; +} /* write_seek_extend_test */ + + diff --git a/libsndfile-1.0.31/tests/write_read_test.def b/libsndfile-1.0.31/tests/write_read_test.def new file mode 100644 index 0000000..3316aec --- /dev/null +++ b/libsndfile-1.0.31/tests/write_read_test.def @@ -0,0 +1,75 @@ +autogen definitions write_read_test.tpl; + +data_type = { + type_name = char ; + data_type = short ; + data_field = s ; + error_func = CHAR_ERROR ; + format_char = "0x%X" ; + max_val = "32000.0" ; + max_error = "255" ; + } ; + +data_type = { + type_name = short ; + data_type = short ; + data_field = s ; + error_func = INT_ERROR ; + format_char = "0x%X" ; + max_val = "32000.0" ; + max_error = "0" ; + } ; + +data_type = { + type_name = "20bit" ; + data_type = int ; + data_field = i ; + error_func = BIT_20_ERROR ; + format_char = "0x%X" ; + max_val = "(1.0 * 0x7F00000)" ; + max_error = "4096" ; + } ; + +data_type = { + type_name = "24bit" ; + data_type = int ; + data_field = i ; + error_func = TRIBYTE_ERROR ; + format_char = "0x%X" ; + max_val = "(1.0 * 0x7F000000)" ; + max_error = "256" ; + } ; + +data_type = { + type_name = int ; + data_type = int ; + data_field = i ; + error_func = INT_ERROR ; + format_char = "0x%X" ; + max_val = "(1.0 * 0x7F000000)" ; + max_error = "0" ; + } ; + +/* Lite remove start */ + +data_type = { + type_name = float ; + data_type = float ; + data_field = f ; + error_func = FLOAT_ERROR ; + format_char = "%g" ; + max_val = "1.0" ; + max_error = "0" ; + } ; + +data_type = { + type_name = double ; + data_type = double ; + data_field = d ; + error_func = FLOAT_ERROR ; + format_char = "%g" ; + max_val = "1.0" ; + max_error = "0" ; + } ; + +/* Lite remove end */ diff --git a/libsndfile-1.0.31/tests/write_read_test.tpl b/libsndfile-1.0.31/tests/write_read_test.tpl new file mode 100644 index 0000000..af87e12 --- /dev/null +++ b/libsndfile-1.0.31/tests/write_read_test.tpl @@ -0,0 +1,1204 @@ +[+ AutoGen5 template c +] +/* +** Copyright (C) 1999-2017 Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** 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. +*/ + +#include "sfconfig.h" + +#include +#include +#include +#include +#include + + +#if HAVE_UNISTD_H +#include +#else +#include "sf_unistd.h" +#endif + +#include + +#include "utils.h" +#include "generate.h" + +#define SAMPLE_RATE 11025 +#define DATA_LENGTH (1 << 12) + +#define SILLY_WRITE_COUNT (234) + +[+ FOR data_type ++]static void pcm_test_[+ (get "type_name") +] (const char *str, int format, int long_file_ok) ; +[+ ENDFOR data_type ++] +static void empty_file_test (const char *filename, int format) ; + +typedef union +{ double d [DATA_LENGTH] ; + float f [DATA_LENGTH] ; + int i [DATA_LENGTH] ; + short s [DATA_LENGTH] ; + char c [DATA_LENGTH] ; +} BUFFER ; + +static BUFFER orig_data ; +static BUFFER test_data ; + +int +main (int argc, char **argv) +{ int do_all = 0 ; + int test_count = 0 ; + + count_open_files () ; + + if (argc != 2) + { printf ("Usage : %s \n", argv [0]) ; + printf (" Where is one of the following:\n") ; + printf (" wav - test WAV file functions (little endian)\n") ; + printf (" aiff - test AIFF file functions (big endian)\n") ; + printf (" au - test AU file functions\n") ; + printf (" avr - test AVR file functions\n") ; + printf (" caf - test CAF file functions\n") ; + printf (" raw - test RAW header-less PCM file functions\n") ; + printf (" paf - test PAF file functions\n") ; + printf (" svx - test 8SVX/16SV file functions\n") ; + printf (" nist - test NIST Sphere file functions\n") ; + printf (" ircam - test IRCAM file functions\n") ; + printf (" voc - Create Voice file functions\n") ; + printf (" w64 - Sonic Foundry's W64 file functions\n") ; + printf (" flac - test FLAC file functions\n") ; + printf (" mpc2k - test MPC 2000 file functions\n") ; + printf (" rf64 - test RF64 file functions\n") ; + printf (" all - perform all tests\n") ; + exit (1) ; + } ; + + do_all = !strcmp (argv [1], "all") ; + + if (do_all || ! strcmp (argv [1], "wav")) + { pcm_test_char ("char.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_U8, SF_FALSE) ; + pcm_test_short ("short.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int.wav" , SF_FORMAT_WAV | SF_FORMAT_PCM_32, SF_FALSE) ; + + pcm_test_char ("char.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_U8, SF_FALSE) ; + pcm_test_short ("short.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_PCM_32, SF_FALSE) ; + + pcm_test_24bit ("24bit.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_PCM_32, SF_FALSE) ; + + /* Lite remove start */ + pcm_test_float ("float.wav" , SF_FORMAT_WAV | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double.wav" , SF_FORMAT_WAV | SF_FORMAT_DOUBLE, SF_FALSE) ; + + pcm_test_float ("float.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double.rifx" , SF_ENDIAN_BIG | SF_FORMAT_WAV | SF_FORMAT_DOUBLE, SF_FALSE) ; + + pcm_test_float ("float.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double.wavex" , SF_FORMAT_WAVEX | SF_FORMAT_DOUBLE, SF_FALSE) ; + /* Lite remove end */ + + empty_file_test ("empty_char.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_U8) ; + empty_file_test ("empty_short.wav", SF_FORMAT_WAV | SF_FORMAT_PCM_16) ; + empty_file_test ("empty_float.wav", SF_FORMAT_WAV | SF_FORMAT_FLOAT) ; + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "aiff")) + { pcm_test_char ("char_u8.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_U8, SF_FALSE) ; + pcm_test_char ("char_s8.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_short ("short.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int.aiff" , SF_FORMAT_AIFF | SF_FORMAT_PCM_32, SF_FALSE) ; + + pcm_test_short ("short_sowt.aifc" , SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit_sowt.aifc" , SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int_sowt.aifc" , SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | SF_FORMAT_PCM_32, SF_FALSE) ; + + pcm_test_short ("short_twos.aifc" , SF_ENDIAN_BIG | SF_FORMAT_AIFF | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit_twos.aifc" , SF_ENDIAN_BIG | SF_FORMAT_AIFF | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int_twos.aifc" , SF_ENDIAN_BIG | SF_FORMAT_AIFF | SF_FORMAT_PCM_32, SF_FALSE) ; + + /* Lite remove start */ + pcm_test_short ("dwvw16.aifc", SF_FORMAT_AIFF | SF_FORMAT_DWVW_16, SF_TRUE) ; + pcm_test_24bit ("dwvw24.aifc", SF_FORMAT_AIFF | SF_FORMAT_DWVW_24, SF_TRUE) ; + + pcm_test_float ("float.aifc" , SF_FORMAT_AIFF | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double.aifc" , SF_FORMAT_AIFF | SF_FORMAT_DOUBLE, SF_FALSE) ; + /* Lite remove end */ + + empty_file_test ("empty_char.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_U8) ; + empty_file_test ("empty_short.aiff", SF_FORMAT_AIFF | SF_FORMAT_PCM_16) ; + empty_file_test ("empty_float.aiff", SF_FORMAT_AIFF | SF_FORMAT_FLOAT) ; + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "au")) + { pcm_test_char ("char.au" , SF_FORMAT_AU | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_short ("short.au" , SF_FORMAT_AU | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit.au" , SF_FORMAT_AU | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int.au" , SF_FORMAT_AU | SF_FORMAT_PCM_32, SF_FALSE) ; + /* Lite remove start */ + pcm_test_float ("float.au" , SF_FORMAT_AU | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double.au", SF_FORMAT_AU | SF_FORMAT_DOUBLE, SF_FALSE) ; + /* Lite remove end */ + + pcm_test_char ("char_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_short ("short_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_PCM_32, SF_FALSE) ; + /* Lite remove start */ + pcm_test_float ("float_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double_le.au" , SF_ENDIAN_LITTLE | SF_FORMAT_AU | SF_FORMAT_DOUBLE, SF_FALSE) ; + /* Lite remove end */ + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "caf")) + { pcm_test_char ("char.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_short ("short.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int.caf" , SF_FORMAT_CAF | SF_FORMAT_PCM_32, SF_FALSE) ; + /* Lite remove start */ + pcm_test_float ("float.caf" , SF_FORMAT_CAF | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double.caf" , SF_FORMAT_CAF | SF_FORMAT_DOUBLE, SF_FALSE) ; + /* Lite remove end */ + + pcm_test_short ("short_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_PCM_32, SF_FALSE) ; + /* Lite remove start */ + pcm_test_float ("float_le.caf" , SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double_le.caf", SF_ENDIAN_LITTLE | SF_FORMAT_CAF | SF_FORMAT_DOUBLE, SF_FALSE) ; + + pcm_test_short ("alac16.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_16, SF_FALSE) ; + pcm_test_20bit ("alac20.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_20, SF_FALSE) ; + pcm_test_24bit ("alac24.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_24, SF_FALSE) ; + pcm_test_int ("alac32.caf" , SF_FORMAT_CAF | SF_FORMAT_ALAC_32, SF_FALSE) ; + + /* Lite remove end */ + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "raw")) + { pcm_test_char ("char_s8.raw" , SF_FORMAT_RAW | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_char ("char_u8.raw" , SF_FORMAT_RAW | SF_FORMAT_PCM_U8, SF_FALSE) ; + + pcm_test_short ("short_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_short ("short_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_24bit ("24bit_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_PCM_32, SF_FALSE) ; + pcm_test_int ("int_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_PCM_32, SF_FALSE) ; + + /* Lite remove start */ + pcm_test_float ("float_le.raw" , SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_float ("float_be.raw" , SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_FLOAT , SF_FALSE) ; + + pcm_test_double ("double_le.raw", SF_ENDIAN_LITTLE | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, SF_FALSE) ; + pcm_test_double ("double_be.raw", SF_ENDIAN_BIG | SF_FORMAT_RAW | SF_FORMAT_DOUBLE, SF_FALSE) ; + /* Lite remove end */ + test_count++ ; + } ; + + /* Lite remove start */ + if (do_all || ! strcmp (argv [1], "paf")) + { pcm_test_char ("char_le.paf", SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_char ("char_be.paf", SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_short ("short_le.paf", SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_short ("short_be.paf", SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit_le.paf", SF_ENDIAN_LITTLE | SF_FORMAT_PAF | SF_FORMAT_PCM_24, SF_TRUE) ; + pcm_test_24bit ("24bit_be.paf", SF_ENDIAN_BIG | SF_FORMAT_PAF | SF_FORMAT_PCM_24, SF_TRUE) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "svx")) + { pcm_test_char ("char.svx" , SF_FORMAT_SVX | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_short ("short.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_16, SF_FALSE) ; + + empty_file_test ("empty_char.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_S8) ; + empty_file_test ("empty_short.svx", SF_FORMAT_SVX | SF_FORMAT_PCM_16) ; + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "nist")) + { pcm_test_short ("short_le.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_short ("short_be.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit_le.nist", SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_24bit ("24bit_be.nist", SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int_le.nist" , SF_ENDIAN_LITTLE | SF_FORMAT_NIST | SF_FORMAT_PCM_32, SF_FALSE) ; + pcm_test_int ("int_be.nist" , SF_ENDIAN_BIG | SF_FORMAT_NIST | SF_FORMAT_PCM_32, SF_FALSE) ; + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "ircam")) + { pcm_test_short ("short_be.ircam" , SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_short ("short_le.ircam" , SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_int ("int_be.ircam" , SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_PCM_32, SF_FALSE) ; + pcm_test_int ("int_le.ircam" , SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_PCM_32, SF_FALSE) ; + pcm_test_float ("float_be.ircam" , SF_ENDIAN_BIG | SF_FORMAT_IRCAM | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_float ("float_le.ircam" , SF_ENDIAN_LITTLE | SF_FORMAT_IRCAM | SF_FORMAT_FLOAT , SF_FALSE) ; + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "voc")) + { pcm_test_char ("char.voc" , SF_FORMAT_VOC | SF_FORMAT_PCM_U8, SF_FALSE) ; + pcm_test_short ("short.voc", SF_FORMAT_VOC | SF_FORMAT_PCM_16, SF_FALSE) ; + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mat4")) + { pcm_test_short ("short_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_short ("short_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_int ("int_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_PCM_32, SF_FALSE) ; + pcm_test_int ("int_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_PCM_32, SF_FALSE) ; + pcm_test_float ("float_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_float ("float_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double_be.mat4" , SF_ENDIAN_BIG | SF_FORMAT_MAT4 | SF_FORMAT_DOUBLE, SF_FALSE) ; + pcm_test_double ("double_le.mat4" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT4 | SF_FORMAT_DOUBLE, SF_FALSE) ; + + empty_file_test ("empty_short.mat4", SF_FORMAT_MAT4 | SF_FORMAT_PCM_16) ; + empty_file_test ("empty_float.mat4", SF_FORMAT_MAT4 | SF_FORMAT_FLOAT) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mat5")) + { pcm_test_char ("char_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_PCM_U8, SF_FALSE) ; + pcm_test_char ("char_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_PCM_U8, SF_FALSE) ; + pcm_test_short ("short_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_short ("short_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_int ("int_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_PCM_32, SF_FALSE) ; + pcm_test_int ("int_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_PCM_32, SF_FALSE) ; + pcm_test_float ("float_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_float ("float_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double_be.mat5" , SF_ENDIAN_BIG | SF_FORMAT_MAT5 | SF_FORMAT_DOUBLE, SF_FALSE) ; + pcm_test_double ("double_le.mat5" , SF_ENDIAN_LITTLE | SF_FORMAT_MAT5 | SF_FORMAT_DOUBLE, SF_FALSE) ; + + increment_open_file_count () ; + + empty_file_test ("empty_char.mat5", SF_FORMAT_MAT5 | SF_FORMAT_PCM_U8) ; + empty_file_test ("empty_short.mat5", SF_FORMAT_MAT5 | SF_FORMAT_PCM_16) ; + empty_file_test ("empty_float.mat5", SF_FORMAT_MAT5 | SF_FORMAT_FLOAT) ; + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "pvf")) + { pcm_test_char ("char.pvf" , SF_FORMAT_PVF | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_short ("short.pvf", SF_FORMAT_PVF | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_int ("int.pvf" , SF_FORMAT_PVF | SF_FORMAT_PCM_32, SF_FALSE) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "htk")) + { pcm_test_short ("short.htk", SF_FORMAT_HTK | SF_FORMAT_PCM_16, SF_FALSE) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "mpc2k")) + { pcm_test_short ("short.mpc", SF_FORMAT_MPC2K | SF_FORMAT_PCM_16, SF_FALSE) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "avr")) + { pcm_test_char ("char_u8.avr" , SF_FORMAT_AVR | SF_FORMAT_PCM_U8, SF_FALSE) ; + pcm_test_char ("char_s8.avr" , SF_FORMAT_AVR | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_short ("short.avr" , SF_FORMAT_AVR | SF_FORMAT_PCM_16, SF_FALSE) ; + test_count++ ; + } ; + /* Lite remove end */ + + if (do_all || ! strcmp (argv [1], "w64")) + { pcm_test_char ("char.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_U8, SF_FALSE) ; + pcm_test_short ("short.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int.w64" , SF_FORMAT_W64 | SF_FORMAT_PCM_32, SF_FALSE) ; + /* Lite remove start */ + pcm_test_float ("float.w64" , SF_FORMAT_W64 | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double.w64" , SF_FORMAT_W64 | SF_FORMAT_DOUBLE, SF_FALSE) ; + /* Lite remove end */ + + empty_file_test ("empty_char.w64", SF_FORMAT_W64 | SF_FORMAT_PCM_U8) ; + empty_file_test ("empty_short.w64", SF_FORMAT_W64 | SF_FORMAT_PCM_16) ; + empty_file_test ("empty_float.w64", SF_FORMAT_W64 | SF_FORMAT_FLOAT) ; + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "sds")) + { pcm_test_char ("char.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_S8, SF_FALSE) ; + pcm_test_short ("short.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit.sds" , SF_FORMAT_SDS | SF_FORMAT_PCM_24, SF_FALSE) ; + + empty_file_test ("empty_char.sds", SF_FORMAT_SDS | SF_FORMAT_PCM_S8) ; + empty_file_test ("empty_short.sds", SF_FORMAT_SDS | SF_FORMAT_PCM_16) ; + + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "sd2")) + { pcm_test_char ("char.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_S8, SF_TRUE) ; + pcm_test_short ("short.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_16, SF_TRUE) ; + pcm_test_24bit ("24bit.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_24, SF_TRUE) ; + pcm_test_int ("32bit.sd2" , SF_FORMAT_SD2 | SF_FORMAT_PCM_32, SF_TRUE) ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "flac")) + { if (HAVE_EXTERNAL_XIPH_LIBS) + { pcm_test_char ("char.flac" , SF_FORMAT_FLAC | SF_FORMAT_PCM_S8, SF_TRUE) ; + pcm_test_short ("short.flac" , SF_FORMAT_FLAC | SF_FORMAT_PCM_16, SF_TRUE) ; + pcm_test_24bit ("24bit.flac" , SF_FORMAT_FLAC | SF_FORMAT_PCM_24, SF_TRUE) ; + } + else + puts (" No FLAC tests because FLAC support was not compiled in.") ; + test_count++ ; + } ; + + if (do_all || ! strcmp (argv [1], "rf64")) + { pcm_test_char ("char.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_U8, SF_FALSE) ; + pcm_test_short ("short.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_16, SF_FALSE) ; + pcm_test_24bit ("24bit.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_24, SF_FALSE) ; + pcm_test_int ("int.rf64" , SF_FORMAT_RF64 | SF_FORMAT_PCM_32, SF_FALSE) ; + + /* Lite remove start */ + pcm_test_float ("float.rf64" , SF_FORMAT_RF64 | SF_FORMAT_FLOAT , SF_FALSE) ; + pcm_test_double ("double.rf64" , SF_FORMAT_RF64 | SF_FORMAT_DOUBLE, SF_FALSE) ; + empty_file_test ("empty_char.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_U8) ; + empty_file_test ("empty_short.rf64", SF_FORMAT_RF64 | SF_FORMAT_PCM_16) ; + empty_file_test ("empty_float.rf64", SF_FORMAT_RF64 | SF_FORMAT_FLOAT) ; + /* Lite remove end */ + + test_count++ ; + } ; + + if (test_count == 0) + { printf ("Mono : ************************************\n") ; + printf ("Mono : * No '%s' test defined.\n", argv [1]) ; + printf ("Mono : ************************************\n") ; + return 1 ; + } ; + + /* Only open file descriptors should be stdin, stdout and stderr. */ + check_open_file_count_or_die (__LINE__) ; + + return 0 ; +} /* main */ + +/*============================================================================================ +** Helper functions and macros. +*/ + +static void create_short_file (const char *filename) ; + +#define CHAR_ERROR(x, y) (abs ((x) - (y)) > 255) +#define INT_ERROR(x, y) (((x) - (y)) != 0) +#define BIT_20_ERROR(x, y) (abs ((x) - (y)) > 4095) +#define TRIBYTE_ERROR(x, y) (abs ((x) - (y)) > 255) +#define FLOAT_ERROR(x, y) (fabs ((x) - (y)) > 1e-5) + +#define CONVERT_DATA(k, len, new, orig) \ + { for ((k) = 0 ; (k) < (len) ; (k) ++) \ + (new) [k] = (orig) [k] ; \ + } + +[+ FOR data_type ++] +/*====================================================================================== +*/ + +static void mono_[+ (get "type_name") +]_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void stereo_[+ (get "type_name") +]_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void mono_rdwr_[+ (get "type_name") +]_test (const char *filename, int format, int long_file_ok, int allow_fd) ; +static void new_rdwr_[+ (get "type_name") +]_test (const char *filename, int format, int allow_fd) ; +static void multi_seek_test (const char * filename, int format) ; +static void write_seek_extend_test (const char * filename, int format) ; + +static void +pcm_test_[+ (get "type_name") +] (const char *filename, int format, int long_file_ok) +{ SF_INFO sfinfo ; + [+ (get "data_type") +] *orig ; + int k, allow_fd ; + + /* Sd2 files cannot be opened from an existing file descriptor. */ + allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; + + print_test_name ("pcm_test_[+ (get "type_name") +]", filename) ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = format ; + + test_sf_format_or_die (&sfinfo, __LINE__) ; + + gen_windowed_sine_double (orig_data.d, DATA_LENGTH, [+ (get "max_val") +]) ; + + orig = orig_data.[+ (get "data_field") +] ; + + /* Make this a macro so gdb steps over it in one go. */ + CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; + + /* Some test broken out here. */ + + mono_[+ (get "type_name") +]_test (filename, format, long_file_ok, allow_fd) ; + + /* Sub format DWVW does not allow seeking. */ + if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || + (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) + { unlink (filename) ; + printf ("no seek : ok\n") ; + return ; + } ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32 + ) + mono_rdwr_[+ (get "type_name") +]_test (filename, format, long_file_ok, allow_fd) ; + + /* If the format doesn't support stereo we're done. */ + sfinfo.channels = 2 ; + if (sf_format_check (&sfinfo) == 0) + { unlink (filename) ; + puts ("no stereo : ok") ; + return ; + } ; + + stereo_[+ (get "type_name") +]_test (filename, format, long_file_ok, allow_fd) ; + + /* New read/write test. Not sure if this is needed yet. */ + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF + && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC + && (format & SF_FORMAT_TYPEMASK) != SF_FORMAT_FLAC + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_16 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_20 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_24 + && (format & SF_FORMAT_SUBMASK) != SF_FORMAT_ALAC_32 + ) + new_rdwr_[+ (get "type_name") +]_test (filename, format, allow_fd) ; + + delete_file (format, filename) ; + + puts ("ok") ; + return ; +} /* pcm_test_[+ (get "type_name") +] */ + +static void +mono_[+ (get "type_name") +]_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + [+ (get "data_type") +] *orig, *test ; + sf_count_t count ; + int k, items, total ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 1 ; + sfinfo.format = format ; + + orig = orig_data.[+ (get "data_field") +] ; + test = test_data.[+ (get "data_field") +] ; + + items = DATA_LENGTH ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.frames || sfinfo.sections || sfinfo.seekable) + { printf ("\n\nLine %d : Weird SF_INFO fields.\n", __LINE__) ; + exit (1) ; + } ; + + sf_set_string (file, SF_STR_ARTIST, "Your name here") ; + + test_write_[+ (get "data_type") +]_or_die (file, 0, orig, items, __LINE__) ; + sf_write_sync (file) ; + test_write_[+ (get "data_type") +]_or_die (file, 0, orig, items, __LINE__) ; + sf_write_sync (file) ; + + /* Add non-audio data after the audio. */ + sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; + + sf_close (file) ; + + memset (test, 0, items * sizeof ([+ (get "data_type") +])) ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Mono : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < 2 * items) + { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ; + exit (1) ; + } ; + + if (! long_file_ok && sfinfo.frames > 2 * items) + { printf ("\n\nLine %d : Mono : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, items) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d : Mono : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + if (sfinfo.seekable != 1) + { printf ("\n\nLine %d : File should be seekable.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_read_[+ (get "data_type") +]_or_die (file, 0, test, items, __LINE__) ; + for (k = 0 ; k < items ; k++) + if ([+ (get "error_func") +] (orig [k], test [k])) + { printf ("\n\nLine %d: Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ; + oct_save_[+ (get "data_type") +] (orig, test, items) ; + exit (1) ; + } ; + + /* Test multiple short reads. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + total = 0 ; + for (k = 1 ; k <= 32 ; k++) + { int ik ; + + test_read_[+ (get "data_type") +]_or_die (file, 0, test + total, k, __LINE__) ; + total += k ; + + for (ik = 0 ; ik < total ; ik++) + if ([+ (get "error_func") +] (orig [ik], test [ik])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, ik, orig [ik], test [ik]) ; + exit (1) ; + } ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_read_[+ (get "data_type") +]_or_die (file, 0, test, 4, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + if ([+ (get "error_func") +] (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* For some codecs we can't go past here. */ + if ((format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_16 || + (format & SF_FORMAT_SUBMASK) == SF_FORMAT_DWVW_24) + { sf_close (file) ; + unlink (filename) ; + printf ("no seek : ") ; + return ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, items + 10, SEEK_SET, items + 10, sfinfo.channels, __LINE__) ; + + test_read_[+ (get "data_type") +]_or_die (file, 0, test + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + if ([+ (get "error_func") +] (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 6, SEEK_CUR, items + 20, sfinfo.channels, __LINE__) ; + + test_read_[+ (get "data_type") +]_or_die (file, 0, test + 20, 4, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if ([+ (get "error_func") +] (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample A (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_read_[+ (get "data_type") +]_or_die (file, 0, test + 10, 4, __LINE__) ; + for (k = 10 ; k < 14 ; k++) + if ([+ (get "error_func") +] (orig [k], test [k])) + { printf ("\n\nLine %d : Mono : Incorrect sample D (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, test [k], orig [k]) ; + exit (1) ; + } ; + + /* Check read past end of file followed by sf_seek (sndfile, 0, SEEK_CUR). */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + count = 0 ; + while (count < sfinfo.frames) + count += sf_read_[+ (get "data_type") +] (file, test, 311) ; + + /* Check that no error has occurred. */ + if (sf_error (file)) + { printf ("\n\nLine %d : Mono : error where there shouldn't have been one.\n", __LINE__) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + /* Check that we haven't read beyond EOF. */ + if (count > sfinfo.frames) + { printf ("\n\nLines %d : read past end of file (%" PRId64 " should be %" PRId64 ")\n", __LINE__, count, sfinfo.frames) ; + exit (1) ; + } ; + + test_seek_or_die (file, 0, SEEK_CUR, sfinfo.frames, sfinfo.channels, __LINE__) ; + + sf_close (file) ; + + multi_seek_test (filename, format) ; + write_seek_extend_test (filename, format) ; + +} /* mono_[+ (get "type_name") +]_test */ + +static void +stereo_[+ (get "type_name") +]_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + [+ (get "data_type") +] *orig, *test ; + int k, items, frames ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 2 ; + sfinfo.format = format ; + + gen_windowed_sine_double (orig_data.d, DATA_LENGTH, [+ (get "max_val") +]) ; + + orig = orig_data.[+ (get "data_field") +] ; + test = test_data.[+ (get "data_field") +] ; + + /* Make this a macro so gdb steps over it in one go. */ + CONVERT_DATA (k, DATA_LENGTH, orig, orig_data.d) ; + + items = DATA_LENGTH ; + frames = items / sfinfo.channels ; + + file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + + sf_set_string (file, SF_STR_ARTIST, "Your name here") ; + + test_writef_[+ (get "data_type") +]_or_die (file, 0, orig, frames, __LINE__) ; + + sf_set_string (file, SF_STR_COPYRIGHT, "Copyright (c) 2003") ; + + sf_close (file) ; + + memset (test, 0, items * sizeof ([+ (get "data_type") +])) ; + + if ((format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW) + memset (&sfinfo, 0, sizeof (sfinfo)) ; + + file = test_open_file_or_die (filename, SFM_READ, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Stereo : Returned format incorrect (0x%08X => 0x%08X).\n", + __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < frames) + { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", + __LINE__, sfinfo.frames, frames) ; + exit (1) ; + } ; + + if (! long_file_ok && sfinfo.frames > frames) + { printf ("\n\nLine %d : Stereo : Incorrect number of frames in file (too long). (%" PRId64 " should be %d)\n", + __LINE__, sfinfo.frames, frames) ; + exit (1) ; + } ; + + if (sfinfo.channels != 2) + { printf ("\n\nLine %d : Stereo : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + check_log_buffer_or_die (file, __LINE__) ; + + test_readf_[+ (get "data_type") +]_or_die (file, 0, test, frames, __LINE__) ; + for (k = 0 ; k < items ; k++) + if ([+ (get "error_func") +] (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to start of file. */ + test_seek_or_die (file, 0, SEEK_SET, 0, sfinfo.channels, __LINE__) ; + + test_readf_[+ (get "data_type") +]_or_die (file, 0, test, 2, __LINE__) ; + for (k = 0 ; k < 4 ; k++) + if ([+ (get "error_func") +] (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from start of file. */ + test_seek_or_die (file, 10, SEEK_SET, 10, sfinfo.channels, __LINE__) ; + + /* Check for errors here. */ + if (sf_error (file)) + { printf ("Line %d: Should NOT return an error.\n", __LINE__) ; + puts (sf_strerror (file)) ; + exit (1) ; + } ; + + if (sf_read_[+ (get "data_type") +] (file, test, 1) > 0) + { printf ("Line %d: Should return 0.\n", __LINE__) ; + exit (1) ; + } ; + + if (! sf_error (file)) + { printf ("Line %d: Should return an error.\n", __LINE__) ; + exit (1) ; + } ; + /*-----------------------*/ + + test_readf_[+ (get "data_type") +]_or_die (file, 0, test + 10, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if ([+ (get "error_func") +] (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from current position. */ + test_seek_or_die (file, 8, SEEK_CUR, 20, sfinfo.channels, __LINE__) ; + + test_readf_[+ (get "data_type") +]_or_die (file, 0, test + 20, 2, __LINE__) ; + for (k = 40 ; k < 44 ; k++) + if ([+ (get "error_func") +] (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + /* Seek to offset from end of file. */ + test_seek_or_die (file, -1 * (sfinfo.frames - 10), SEEK_END, 10, sfinfo.channels, __LINE__) ; + + test_readf_[+ (get "data_type") +]_or_die (file, 0, test + 20, 2, __LINE__) ; + for (k = 20 ; k < 24 ; k++) + if ([+ (get "error_func") +] (test [k], orig [k])) + { printf ("\n\nLine %d : Stereo : Incorrect sample (#%d : [+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, k, orig [k], test [k]) ; + exit (1) ; + } ; + + sf_close (file) ; +} /* stereo_[+ (get "type_name") +]_test */ + +static void +mono_rdwr_[+ (get "type_name") +]_test (const char *filename, int format, int long_file_ok, int allow_fd) +{ SNDFILE *file ; + SF_INFO sfinfo ; + [+ (get "data_type") +] *orig, *test ; + int k, pass ; + + switch (format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_ALAC_16 : + case SF_FORMAT_ALAC_20 : + case SF_FORMAT_ALAC_24 : + case SF_FORMAT_ALAC_32 : + allow_fd = 0 ; + break ; + + default : + break ; + } ; + + orig = orig_data.[+ (get "data_field") +] ; + test = test_data.[+ (get "data_field") +] ; + + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = format ; + + if ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW + || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_AU + || (format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) + unlink (filename) ; + else + { /* Create a short file. */ + create_short_file (filename) ; + + /* Opening a already existing short file (ie invalid header) RDWR is disallowed. + ** If this returns a valif pointer sf_open() screwed up. + */ + if ((file = sf_open (filename, SFM_RDWR, &sfinfo))) + { printf ("\n\nLine %d: sf_open should (SFM_RDWR) have failed but didn't.\n", __LINE__) ; + exit (1) ; + } ; + + /* Truncate the file to zero bytes. */ + if (truncate_file_to_zero (filename) < 0) + { printf ("\n\nLine %d: truncate_file_to_zero (%s) failed", __LINE__, filename) ; + perror (NULL) ; + exit (1) ; + } ; + } ; + + /* Opening a zero length file RDWR is allowed, but the SF_INFO struct must contain + ** all the usual data required when opening the file in WRITE mode. + */ + sfinfo.samplerate = SAMPLE_RATE ; + sfinfo.frames = DATA_LENGTH ; + sfinfo.channels = 1 ; + sfinfo.format = format ; + + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + + /* Do 3 writes followed by reads. After each, check the data and the current + ** read and write offsets. + */ + for (pass = 1 ; pass <= 3 ; pass ++) + { orig [20] = pass * 2 ; + + /* Write some data. */ + test_write_[+ (get "data_type") +]_or_die (file, pass, orig, DATA_LENGTH, __LINE__) ; + + test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, pass * DATA_LENGTH) ; + + /* Read what we just wrote. */ + test_read_[+ (get "data_type") +]_or_die (file, 0, test, DATA_LENGTH, __LINE__) ; + + /* Check the data. */ + for (k = 0 ; k < DATA_LENGTH ; k++) + if ([+ (get "error_func") +] (orig [k], test [k])) + { printf ("\n\nLine %d (pass %d) A : Error at sample %d ([+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, pass, k, orig [k], test [k]) ; + oct_save_[+ (get "data_type") +] (orig, test, DATA_LENGTH) ; + exit (1) ; + } ; + + test_read_write_position_or_die (file, __LINE__, pass, pass * DATA_LENGTH, pass * DATA_LENGTH) ; + } ; /* for (pass ...) */ + + sf_close (file) ; + + /* Open the file again to check the data. */ + file = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + + if (sfinfo.format != format) + { printf ("\n\nLine %d : Returned format incorrect (0x%08X => 0x%08X).\n", __LINE__, format, sfinfo.format) ; + exit (1) ; + } ; + + if (sfinfo.frames < 3 * DATA_LENGTH) + { printf ("\n\nLine %d : Not enough frames in file. (%" PRId64 " < %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ; + exit (1) ; + } + + if (! long_file_ok && sfinfo.frames != 3 * DATA_LENGTH) + { printf ("\n\nLine %d : Incorrect number of frames in file. (%" PRId64 " should be %d)\n", __LINE__, sfinfo.frames, 3 * DATA_LENGTH) ; + exit (1) ; + } ; + + if (sfinfo.channels != 1) + { printf ("\n\nLine %d : Incorrect number of channels in file.\n", __LINE__) ; + exit (1) ; + } ; + + if (! long_file_ok) + test_read_write_position_or_die (file, __LINE__, 0, 0, 3 * DATA_LENGTH) ; + else + test_seek_or_die (file, 3 * DATA_LENGTH, SFM_WRITE | SEEK_SET, 3 * DATA_LENGTH, sfinfo.channels, __LINE__) ; + + for (pass = 1 ; pass <= 3 ; pass ++) + { orig [20] = pass * 2 ; + + test_read_write_position_or_die (file, __LINE__, pass, (pass - 1) * DATA_LENGTH, 3 * DATA_LENGTH) ; + + /* Read what we just wrote. */ + test_read_[+ (get "data_type") +]_or_die (file, pass, test, DATA_LENGTH, __LINE__) ; + + /* Check the data. */ + for (k = 0 ; k < DATA_LENGTH ; k++) + if ([+ (get "error_func") +] (orig [k], test [k])) + { printf ("\n\nLine %d (pass %d) B : Error at sample %d ([+ (get "format_char") +] => [+ (get "format_char") +]).\n", __LINE__, pass, k, orig [k], test [k]) ; + oct_save_[+ (get "data_type") +] (orig, test, DATA_LENGTH) ; + exit (1) ; + } ; + + } ; /* for (pass ...) */ + + sf_close (file) ; +} /* mono_rdwr_[+ (get "data_type") +]_test */ + +static void +new_rdwr_[+ (get "type_name") +]_test (const char *filename, int format, int allow_fd) +{ SNDFILE *wfile, *rwfile ; + SF_INFO sfinfo ; + [+ (get "data_type") +] *orig, *test ; + int items, frames ; + + orig = orig_data.[+ (get "data_field") +] ; + test = test_data.[+ (get "data_field") +] ; + + sfinfo.samplerate = 44100 ; + sfinfo.frames = SILLY_WRITE_COUNT ; /* Wrong length. Library should correct this on sf_close. */ + sfinfo.channels = 2 ; + sfinfo.format = format ; + + items = DATA_LENGTH ; + frames = items / sfinfo.channels ; + + wfile = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, allow_fd, __LINE__) ; + sf_command (wfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; + test_writef_[+ (get "data_type") +]_or_die (wfile, 1, orig, frames, __LINE__) ; + sf_write_sync (wfile) ; + test_writef_[+ (get "data_type") +]_or_die (wfile, 2, orig, frames, __LINE__) ; + sf_write_sync (wfile) ; + + rwfile = test_open_file_or_die (filename, SFM_RDWR, &sfinfo, allow_fd, __LINE__) ; + if (sfinfo.frames != 2 * frames) + { printf ("\n\nLine %d : incorrect number of frames in file (%" PRId64 " should be %d)\n\n", __LINE__, sfinfo.frames, 2 * frames) ; + exit (1) ; + } ; + + test_writef_[+ (get "data_type") +]_or_die (wfile, 3, orig, frames, __LINE__) ; + + test_readf_[+ (get "data_type") +]_or_die (rwfile, 1, test, frames, __LINE__) ; + test_readf_[+ (get "data_type") +]_or_die (rwfile, 2, test, frames, __LINE__) ; + + sf_close (wfile) ; + sf_close (rwfile) ; +} /* new_rdwr_[+ (get "type_name") +]_test */ + +[+ ENDFOR data_type +] + +/*---------------------------------------------------------------------------------------- +*/ + +static void +empty_file_test (const char *filename, int format) +{ SNDFILE *file ; + SF_INFO info ; + int allow_fd ; + + /* Sd2 files cannot be opened from an existing file descriptor. */ + allow_fd = ((format & SF_FORMAT_TYPEMASK) == SF_FORMAT_SD2) ? SF_FALSE : SF_TRUE ; + + print_test_name ("empty_file_test", filename) ; + + unlink (filename) ; + + info.samplerate = 48000 ; + info.channels = 2 ; + info.format = format ; + info.frames = 0 ; + + if (sf_format_check (&info) == SF_FALSE) + { info.channels = 1 ; + if (sf_format_check (&info) == SF_FALSE) + { puts ("invalid file format") ; + return ; + } ; + } ; + + /* Create an empty file. */ + file = test_open_file_or_die (filename, SFM_WRITE, &info, allow_fd, __LINE__) ; + sf_close (file) ; + + /* Open for read and check the length. */ + file = test_open_file_or_die (filename, SFM_READ, &info, allow_fd, __LINE__) ; + + if (info.frames != 0) + { printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ; + exit (1) ; + } ; + + sf_close (file) ; + + /* Open for read/write and check the length. */ + file = test_open_file_or_die (filename, SFM_RDWR, &info, allow_fd, __LINE__) ; + + if (info.frames != 0) + { printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ; + exit (1) ; + } ; + + sf_close (file) ; + + /* Open for read and check the length. */ + file = test_open_file_or_die (filename, SFM_READ, &info, allow_fd, __LINE__) ; + + if (info.frames != 0) + { printf ("\n\nError : frame count (%" PRId64 ") should be zero.\n", info.frames) ; + exit (1) ; + } ; + + sf_close (file) ; + + check_open_file_count_or_die (__LINE__) ; + + unlink (filename) ; + puts ("ok") ; + + return ; +} /* empty_file_test */ + + +/*---------------------------------------------------------------------------------------- +*/ + +static void +create_short_file (const char *filename) +{ FILE *file ; + + if (! (file = fopen (filename, "w"))) + { printf ("create_short_file : fopen (%s, \"w\") failed.", filename) ; + fflush (stdout) ; + perror (NULL) ; + exit (1) ; + } ; + + fprintf (file, "This is the file data.\n") ; + + fclose (file) ; +} /* create_short_file */ + + +static void +multi_seek_test (const char * filename, int format) +{ SNDFILE * file ; + SF_INFO info ; + sf_count_t pos ; + int k ; + + /* This test doesn't work on the following. */ + switch (format & SF_FORMAT_TYPEMASK) + { case SF_FORMAT_RAW : + return ; + + default : + break ; + } ; + + memset (&info, 0, sizeof (info)) ; + + generate_file (filename, format, 88200) ; + + file = test_open_file_or_die (filename, SFM_READ, &info, SF_FALSE, __LINE__) ; + + for (k = 0 ; k < 10 ; k++) + { pos = info.frames / (k + 2) ; + test_seek_or_die (file, pos, SEEK_SET, pos, info.channels, __LINE__) ; + } ; + + sf_close (file) ; +} /* multi_seek_test */ + +static void +write_seek_extend_test (const char * filename, int format) +{ SNDFILE * file ; + SF_INFO info ; + short *orig, *test ; + unsigned items, k ; + + /* This test doesn't work on the following container formats. */ + switch (format & SF_FORMAT_TYPEMASK) + { case SF_FORMAT_FLAC : + case SF_FORMAT_HTK : + case SF_FORMAT_PAF : + case SF_FORMAT_SDS : + case SF_FORMAT_SVX : + return ; + + default : + break ; + } ; + + /* This test doesn't work on the following codec formats. */ + switch (format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_ALAC_16 : + case SF_FORMAT_ALAC_20 : + case SF_FORMAT_ALAC_24 : + case SF_FORMAT_ALAC_32 : + return ; + + default : + break ; + } ; + + memset (&info, 0, sizeof (info)) ; + + info.samplerate = 48000 ; + info.channels = 1 ; + info.format = format ; + + items = 512 ; + exit_if_true (items > ARRAY_LEN (orig_data.s), "Line %d : Bad assumption.\n", __LINE__) ; + + orig = orig_data.s ; + test = test_data.s ; + + for (k = 0 ; k < ARRAY_LEN (orig_data.s) ; k++) + orig [k] = 0x3fff ; + + file = test_open_file_or_die (filename, SFM_WRITE, &info, SF_FALSE, __LINE__) ; + test_write_short_or_die (file, 0, orig, items, __LINE__) ; + + /* Extend the file using a seek. */ + test_seek_or_die (file, 2 * items, SEEK_SET, 2 * items, info.channels, __LINE__) ; + + test_writef_short_or_die (file, 0, orig, items, __LINE__) ; + sf_close (file) ; + + file = test_open_file_or_die (filename, SFM_READ, &info, SF_FALSE, __LINE__) ; + test_read_short_or_die (file, 0, test, 3 * items, __LINE__) ; + sf_close (file) ; + + if (info.frames < 3 * items) + { printf ("\n\nLine %d : Incorrect number of frames in file (too short). (%" PRId64 " should be %d)\n", __LINE__, info.frames, 3 * items) ; + exit (1) ; + } ; + + /* Can't do these formats due to scaling. */ + switch (format & SF_FORMAT_SUBMASK) + { case SF_FORMAT_PCM_S8 : + case SF_FORMAT_PCM_U8 : + return ; + default : + break ; + } ; + + for (k = 0 ; k < items ; k++) + { exit_if_true (test [k] != 0x3fff, "Line %d : test [%d] == %d, should be 0x3fff.\n", __LINE__, k, test [k]) ; + exit_if_true (test [items + k] != 0, "Line %d : test [%d] == %d, should be 0.\n", __LINE__, items + k, test [items + k]) ; + exit_if_true (test [2 * items + k] != 0x3fff, "Line %d : test [%d] == %d, should be 0x3fff.\n", __LINE__, 2 * items + k, test [2 * items + k]) ; + } ; + + return ; +} /* write_seek_extend_test */ + + -- Gitee From 218c4fc50b75ab2b1df5a61d8d46c372de6fb2a5 Mon Sep 17 00:00:00 2001 From: ctl-ly Date: Wed, 28 Dec 2022 18:22:13 +0800 Subject: [PATCH 2/3] 003 --- libsndfile-1.0.31/include/sndfile.h.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libsndfile-1.0.31/include/sndfile.h.in b/libsndfile-1.0.31/include/sndfile.h.in index 917ff4b..970fb26 100644 --- a/libsndfile-1.0.31/include/sndfile.h.in +++ b/libsndfile-1.0.31/include/sndfile.h.in @@ -173,6 +173,7 @@ enum SFC_SET_RAW_START_OFFSET = 0x1090, + /* Commands reserved for dithering, which is not implemented. */ SFC_SET_DITHER_ON_WRITE = 0x10A0, SFC_SET_DITHER_ON_READ = 0x10A1, @@ -386,8 +387,7 @@ typedef struct /* ** Enums and typedefs for adding dither on read and write. -** See the html documentation for sf_command(), SFC_SET_DITHER_ON_WRITE -** and SFC_SET_DITHER_ON_READ. +** Reserved for future implementation. */ enum -- Gitee From 93e024174752e0bb38e025ae94d58375ad211795 Mon Sep 17 00:00:00 2001 From: ctl-ly Date: Wed, 28 Dec 2022 18:28:00 +0800 Subject: [PATCH 3/3] Marked unimplemented dither enums in the header file as such. --- 003-Marked-unimplemented-dither-enums.patch | 34 + libsndfile-1.0.31.tar.bz2 | Bin 875335 -> 877171 bytes libsndfile-1.0.31/AUTHORS | 235 - libsndfile-1.0.31/CMakeLists.txt | 1471 - libsndfile-1.0.31/COPYING | 503 - libsndfile-1.0.31/ChangeLog | 3 - libsndfile-1.0.31/Makefile.am | 535 - libsndfile-1.0.31/Makefile.in | 4199 --- libsndfile-1.0.31/NEWS | 303 - libsndfile-1.0.31/Octave/Makefile.am | 79 - libsndfile-1.0.31/Octave/Makefile.in | 645 - libsndfile-1.0.31/Octave/PKG_ADD | 3 - libsndfile-1.0.31/Octave/octave_test.m | 52 - libsndfile-1.0.31/Octave/octave_test.sh | 81 - libsndfile-1.0.31/Octave/sndfile.cc | 405 - libsndfile-1.0.31/Octave/sndfile_load.m | 52 - libsndfile-1.0.31/Octave/sndfile_play.m | 59 - libsndfile-1.0.31/Octave/sndfile_save.m | 53 - libsndfile-1.0.31/README | 76 - .../Scripts/android-configure.sh | 96 - .../Scripts/build-test-tarball.mk.in | 61 - .../Scripts/linux-to-win-cross-configure.sh | 22 - .../Win32/README-precompiled-dll.txt | 40 - libsndfile-1.0.31/Win32/testprog.c | 16 - libsndfile-1.0.31/aclocal.m4 | 1796 - libsndfile-1.0.31/build-aux/ar-lib | 271 - libsndfile-1.0.31/build-aux/compile | 348 - libsndfile-1.0.31/build-aux/config.guess | 1701 - libsndfile-1.0.31/build-aux/config.sub | 1876 -- libsndfile-1.0.31/build-aux/depcomp | 791 - libsndfile-1.0.31/build-aux/install-sh | 541 - libsndfile-1.0.31/build-aux/ltmain.sh | 11210 ------- libsndfile-1.0.31/build-aux/missing | 215 - libsndfile-1.0.31/cmake/CMakeAutoGen.cmake | 46 - .../cmake/CMakeAutoGenScript.cmake | 442 - libsndfile-1.0.31/cmake/CheckCPUArch.c.in | 7 - libsndfile-1.0.31/cmake/CheckCPUArch.cmake | 23 - libsndfile-1.0.31/cmake/ClipMode.cmake | 92 - libsndfile-1.0.31/cmake/FindFLAC.cmake | 67 - libsndfile-1.0.31/cmake/FindOgg.cmake | 61 - libsndfile-1.0.31/cmake/FindOpus.cmake | 67 - libsndfile-1.0.31/cmake/FindSndio.cmake | 61 - libsndfile-1.0.31/cmake/FindSpeex.cmake | 55 - libsndfile-1.0.31/cmake/FindVorbis.cmake | 210 - libsndfile-1.0.31/cmake/SndFileChecks.cmake | 276 - .../cmake/SndFileConfig.cmake.in | 32 - libsndfile-1.0.31/cmake/TestInline.c.in | 10 - libsndfile-1.0.31/cmake/TestInline.cmake | 54 - libsndfile-1.0.31/cmake/TestLargeFiles.cmake | 121 - .../cmake/sqlite/FindSQLite3.cmake | 56 - libsndfile-1.0.31/configure | 27027 ---------------- libsndfile-1.0.31/configure.ac | 743 - libsndfile-1.0.31/docs/FAQ.md | 480 - libsndfile-1.0.31/docs/api.md | 736 - libsndfile-1.0.31/docs/bugs.md | 47 - libsndfile-1.0.31/docs/command.md | 1929 -- libsndfile-1.0.31/docs/embedded_files.md | 21 - libsndfile-1.0.31/docs/formats.md | 52 - libsndfile-1.0.31/docs/index.md | 316 - libsndfile-1.0.31/docs/libsndfile.css | 101 - libsndfile-1.0.31/docs/libsndfile.jpg | Bin 22043 -> 0 bytes libsndfile-1.0.31/docs/lists.md | 27 - libsndfile-1.0.31/docs/new_file_type_howto.md | 134 - libsndfile-1.0.31/docs/octave.md | 71 - libsndfile-1.0.31/docs/print.css | 14 - libsndfile-1.0.31/docs/sndfile_info.md | 36 - libsndfile-1.0.31/docs/tutorial.md | 10 - libsndfile-1.0.31/docs/win32.md | 18 - libsndfile-1.0.31/examples/generate.c | 131 - libsndfile-1.0.31/examples/list_formats.c | 76 - libsndfile-1.0.31/examples/make_sine.c | 100 - libsndfile-1.0.31/examples/sfprocess.c | 142 - libsndfile-1.0.31/examples/sndfile-loopify.c | 180 - libsndfile-1.0.31/examples/sndfile-to-text.c | 156 - libsndfile-1.0.31/examples/sndfilehandle.cc | 84 - libsndfile-1.0.31/include/sndfile.h.in | 872 - libsndfile-1.0.31/include/sndfile.hh | 452 - libsndfile-1.0.31/libsndfile.spec.in | 69 - libsndfile-1.0.31/m4/ax_add_fortify_source.m4 | 53 - .../m4/ax_append_compile_flags.m4 | 67 - libsndfile-1.0.31/m4/ax_append_flag.m4 | 71 - libsndfile-1.0.31/m4/ax_append_link_flags.m4 | 65 - libsndfile-1.0.31/m4/ax_check_compile_flag.m4 | 74 - libsndfile-1.0.31/m4/ax_check_link_flag.m4 | 74 - libsndfile-1.0.31/m4/ax_compiler_vendor.m4 | 87 - libsndfile-1.0.31/m4/ax_compiler_version.m4 | 492 - libsndfile-1.0.31/m4/ax_recursive_eval.m4 | 56 - libsndfile-1.0.31/m4/ax_require_defined.m4 | 37 - libsndfile-1.0.31/m4/clip_mode.m4 | 124 - libsndfile-1.0.31/m4/extra_pkg.m4 | 105 - libsndfile-1.0.31/m4/libtool.m4 | 8387 ----- libsndfile-1.0.31/m4/ltoptions.m4 | 437 - libsndfile-1.0.31/m4/ltsugar.m4 | 124 - libsndfile-1.0.31/m4/ltversion.m4 | 23 - libsndfile-1.0.31/m4/lt~obsolete.m4 | 99 - libsndfile-1.0.31/m4/mkoctfile_version.m4 | 38 - libsndfile-1.0.31/m4/octave.m4 | 143 - libsndfile-1.0.31/m4/stack_protect.m4 | 73 - libsndfile-1.0.31/man/sndfile-cmp.1 | 29 - libsndfile-1.0.31/man/sndfile-concat.1 | 28 - libsndfile-1.0.31/man/sndfile-convert.1 | 160 - libsndfile-1.0.31/man/sndfile-deinterleave.1 | 62 - libsndfile-1.0.31/man/sndfile-info.1 | 34 - libsndfile-1.0.31/man/sndfile-interleave.1 | 62 - libsndfile-1.0.31/man/sndfile-metadata-get.1 | 116 - libsndfile-1.0.31/man/sndfile-metadata-set.1 | 116 - libsndfile-1.0.31/man/sndfile-play.1 | 34 - libsndfile-1.0.31/man/sndfile-salvage.1 | 25 - libsndfile-1.0.31/ossfuzz/sndfile_fuzzer.cc | 155 - libsndfile-1.0.31/ossfuzz/standaloneengine.cc | 86 - libsndfile-1.0.31/ossfuzz/testinput.h | 3 - libsndfile-1.0.31/programs/common.c | 497 - libsndfile-1.0.31/programs/common.h | 82 - libsndfile-1.0.31/programs/sndfile-cmp.c | 155 - libsndfile-1.0.31/programs/sndfile-concat.c | 170 - libsndfile-1.0.31/programs/sndfile-convert.c | 407 - .../programs/sndfile-deinterleave.c | 210 - libsndfile-1.0.31/programs/sndfile-info.c | 527 - .../programs/sndfile-interleave.c | 202 - .../programs/sndfile-metadata-get.c | 197 - .../programs/sndfile-metadata-set.c | 295 - libsndfile-1.0.31/programs/sndfile-play.c | 860 - libsndfile-1.0.31/programs/sndfile-salvage.c | 283 - .../programs/test-sndfile-metadata-set.py | 198 - libsndfile-1.0.31/regtest/checksum.c | 117 - libsndfile-1.0.31/regtest/database.c | 542 - libsndfile-1.0.31/regtest/regtest.h | 38 - libsndfile-1.0.31/regtest/sndfile-regtest.c | 121 - libsndfile-1.0.31/sndfile.pc.in | 12 - libsndfile-1.0.31/src/ALAC/ALACAudioTypes.h | 206 - libsndfile-1.0.31/src/ALAC/ALACBitUtilities.c | 262 - libsndfile-1.0.31/src/ALAC/ALACBitUtilities.h | 89 - libsndfile-1.0.31/src/ALAC/EndianPortable.h | 39 - libsndfile-1.0.31/src/ALAC/ag_dec.c | 356 - libsndfile-1.0.31/src/ALAC/ag_enc.c | 350 - libsndfile-1.0.31/src/ALAC/aglib.h | 81 - libsndfile-1.0.31/src/ALAC/alac_codec.h | 104 - libsndfile-1.0.31/src/ALAC/alac_decoder.c | 652 - libsndfile-1.0.31/src/ALAC/alac_encoder.c | 1333 - libsndfile-1.0.31/src/ALAC/dp_dec.c | 379 - libsndfile-1.0.31/src/ALAC/dp_enc.c | 385 - libsndfile-1.0.31/src/ALAC/dplib.h | 61 - libsndfile-1.0.31/src/ALAC/matrix_dec.c | 330 - libsndfile-1.0.31/src/ALAC/matrix_enc.c | 275 - libsndfile-1.0.31/src/ALAC/matrixlib.h | 81 - libsndfile-1.0.31/src/ALAC/shift.h | 29 - libsndfile-1.0.31/src/G72x/ChangeLog | 50 - libsndfile-1.0.31/src/G72x/README | 0 libsndfile-1.0.31/src/G72x/README.original | 94 - libsndfile-1.0.31/src/G72x/g721.c | 155 - libsndfile-1.0.31/src/G72x/g723_16.c | 162 - libsndfile-1.0.31/src/G72x/g723_24.c | 139 - libsndfile-1.0.31/src/G72x/g723_40.c | 153 - libsndfile-1.0.31/src/G72x/g72x.c | 645 - libsndfile-1.0.31/src/G72x/g72x.h | 91 - libsndfile-1.0.31/src/G72x/g72x_priv.h | 127 - libsndfile-1.0.31/src/G72x/g72x_test.c | 220 - libsndfile-1.0.31/src/GSM610/COPYRIGHT | 16 - libsndfile-1.0.31/src/GSM610/ChangeLog | 56 - libsndfile-1.0.31/src/GSM610/README | 36 - libsndfile-1.0.31/src/GSM610/add.c | 243 - libsndfile-1.0.31/src/GSM610/code.c | 87 - libsndfile-1.0.31/src/GSM610/config.h | 26 - libsndfile-1.0.31/src/GSM610/decode.c | 58 - libsndfile-1.0.31/src/GSM610/gsm.h | 52 - libsndfile-1.0.31/src/GSM610/gsm610_priv.h | 335 - libsndfile-1.0.31/src/GSM610/gsm_create.c | 37 - libsndfile-1.0.31/src/GSM610/gsm_decode.c | 357 - libsndfile-1.0.31/src/GSM610/gsm_destroy.c | 25 - libsndfile-1.0.31/src/GSM610/gsm_encode.c | 448 - libsndfile-1.0.31/src/GSM610/gsm_option.c | 66 - libsndfile-1.0.31/src/GSM610/long_term.c | 932 - libsndfile-1.0.31/src/GSM610/lpc.c | 333 - libsndfile-1.0.31/src/GSM610/preprocess.c | 101 - libsndfile-1.0.31/src/GSM610/rpe.c | 460 - libsndfile-1.0.31/src/GSM610/short_term.c | 412 - libsndfile-1.0.31/src/GSM610/table.c | 60 - libsndfile-1.0.31/src/Symbols.darwin | 43 - libsndfile-1.0.31/src/Symbols.gnu-binutils | 49 - libsndfile-1.0.31/src/Symbols.os2 | 49 - libsndfile-1.0.31/src/Symbols.static | 41 - libsndfile-1.0.31/src/aiff.c | 1834 -- libsndfile-1.0.31/src/alac.c | 997 - libsndfile-1.0.31/src/alaw.c | 553 - libsndfile-1.0.31/src/au.c | 454 - libsndfile-1.0.31/src/audio_detect.c | 107 - libsndfile-1.0.31/src/avr.c | 246 - .../src/binheader_writef_check.py | 114 - libsndfile-1.0.31/src/broadcast.c | 190 - libsndfile-1.0.31/src/caf.c | 1033 - libsndfile-1.0.31/src/cart.c | 101 - libsndfile-1.0.31/src/chanmap.c | 262 - libsndfile-1.0.31/src/chanmap.h | 32 - libsndfile-1.0.31/src/chunk.c | 256 - libsndfile-1.0.31/src/command.c | 400 - libsndfile-1.0.31/src/common.c | 1765 - libsndfile-1.0.31/src/common.h | 1144 - libsndfile-1.0.31/src/config.h.cmake | 314 - libsndfile-1.0.31/src/config.h.in | 326 - libsndfile-1.0.31/src/create_symbols_file.py | 181 - libsndfile-1.0.31/src/dither.c | 534 - libsndfile-1.0.31/src/double64.c | 1063 - libsndfile-1.0.31/src/dwd.c | 201 - libsndfile-1.0.31/src/dwvw.c | 674 - libsndfile-1.0.31/src/file_io.c | 1572 - libsndfile-1.0.31/src/flac.c | 1454 - libsndfile-1.0.31/src/float32.c | 1017 - libsndfile-1.0.31/src/g72x.c | 608 - libsndfile-1.0.31/src/gsm610.c | 629 - libsndfile-1.0.31/src/htk.c | 226 - libsndfile-1.0.31/src/id3.c | 59 - libsndfile-1.0.31/src/ima_adpcm.c | 1003 - libsndfile-1.0.31/src/ima_oki_adpcm.c | 297 - libsndfile-1.0.31/src/ima_oki_adpcm.h | 54 - libsndfile-1.0.31/src/interleave.c | 299 - libsndfile-1.0.31/src/ircam.c | 323 - libsndfile-1.0.31/src/libsndfile-1.def | 46 - libsndfile-1.0.31/src/macos.c | 51 - .../src/make-static-lib-hidden-privates.sh | 14 - libsndfile-1.0.31/src/mat4.c | 391 - libsndfile-1.0.31/src/mat5.c | 509 - libsndfile-1.0.31/src/mpc2k.c | 204 - libsndfile-1.0.31/src/ms_adpcm.c | 857 - libsndfile-1.0.31/src/nist.c | 372 - libsndfile-1.0.31/src/nms_adpcm.c | 1156 - libsndfile-1.0.31/src/ogg.c | 909 - libsndfile-1.0.31/src/ogg.h | 134 - libsndfile-1.0.31/src/ogg_opus.c | 1778 - libsndfile-1.0.31/src/ogg_pcm.c | 167 - libsndfile-1.0.31/src/ogg_speex.c | 428 - libsndfile-1.0.31/src/ogg_vcomment.c | 277 - libsndfile-1.0.31/src/ogg_vcomment.h | 45 - libsndfile-1.0.31/src/ogg_vorbis.c | 907 - libsndfile-1.0.31/src/paf.c | 818 - libsndfile-1.0.31/src/pcm.c | 2893 -- libsndfile-1.0.31/src/pvf.c | 188 - libsndfile-1.0.31/src/raw.c | 111 - libsndfile-1.0.31/src/rf64.c | 894 - libsndfile-1.0.31/src/rx2.c | 318 - libsndfile-1.0.31/src/sd2.c | 619 - libsndfile-1.0.31/src/sds.c | 1022 - libsndfile-1.0.31/src/sf_unistd.h | 112 - libsndfile-1.0.31/src/sfconfig.h | 139 - libsndfile-1.0.31/src/sfendian.h | 378 - libsndfile-1.0.31/src/sndfile.c | 3360 -- libsndfile-1.0.31/src/strings.c | 187 - libsndfile-1.0.31/src/svx.c | 401 - libsndfile-1.0.31/src/test_audio_detect.c | 113 - libsndfile-1.0.31/src/test_binheader_writef.c | 61 - libsndfile-1.0.31/src/test_broadcast_var.c | 119 - libsndfile-1.0.31/src/test_cart_var.c | 91 - libsndfile-1.0.31/src/test_conversions.c | 112 - libsndfile-1.0.31/src/test_endswap.c | 322 - libsndfile-1.0.31/src/test_endswap.def | 40 - libsndfile-1.0.31/src/test_endswap.tpl | 153 - libsndfile-1.0.31/src/test_file_io.c | 492 - libsndfile-1.0.31/src/test_float.c | 104 - libsndfile-1.0.31/src/test_ima_oki_adpcm.c | 157 - libsndfile-1.0.31/src/test_log_printf.c | 123 - libsndfile-1.0.31/src/test_main.c | 70 - libsndfile-1.0.31/src/test_main.h | 44 - libsndfile-1.0.31/src/test_nms_adpcm.c | 400 - libsndfile-1.0.31/src/test_strncpy_crlf.c | 59 - libsndfile-1.0.31/src/txw.c | 377 - libsndfile-1.0.31/src/ulaw.c | 1056 - libsndfile-1.0.31/src/version-metadata.rc | 31 - libsndfile-1.0.31/src/version-metadata.rc.in | 31 - libsndfile-1.0.31/src/voc.c | 883 - libsndfile-1.0.31/src/vox_adpcm.c | 400 - libsndfile-1.0.31/src/w64.c | 638 - libsndfile-1.0.31/src/wav.c | 1571 - libsndfile-1.0.31/src/wavlike.c | 1350 - libsndfile-1.0.31/src/wavlike.h | 358 - libsndfile-1.0.31/src/windows.c | 92 - libsndfile-1.0.31/src/wve.c | 209 - libsndfile-1.0.31/src/xi.c | 1230 - libsndfile-1.0.31/tests/aiff_rw_test.c | 169 - libsndfile-1.0.31/tests/alaw_test.c | 238 - libsndfile-1.0.31/tests/benchmark.c | 545 - libsndfile-1.0.31/tests/benchmark.def | 17 - libsndfile-1.0.31/tests/benchmark.tpl | 360 - libsndfile-1.0.31/tests/channel_test.c | 138 - libsndfile-1.0.31/tests/checksum_test.c | 129 - libsndfile-1.0.31/tests/chunk_test.c | 446 - libsndfile-1.0.31/tests/command_test.c | 1806 -- .../tests/compression_size_test.c | 211 - libsndfile-1.0.31/tests/cpp_test.cc | 315 - libsndfile-1.0.31/tests/dft_cmp.c | 151 - libsndfile-1.0.31/tests/dft_cmp.h | 25 - libsndfile-1.0.31/tests/dither_test.c | 184 - libsndfile-1.0.31/tests/dwvw_test.c | 111 - libsndfile-1.0.31/tests/error_test.c | 287 - libsndfile-1.0.31/tests/external_libs_test.c | 204 - libsndfile-1.0.31/tests/fix_this.c | 334 - libsndfile-1.0.31/tests/floating_point_test.c | 737 - .../tests/floating_point_test.def | 32 - .../tests/floating_point_test.tpl | 365 - libsndfile-1.0.31/tests/format_check_test.c | 156 - libsndfile-1.0.31/tests/generate.c | 75 - libsndfile-1.0.31/tests/generate.h | 19 - libsndfile-1.0.31/tests/header_test.c | 785 - libsndfile-1.0.31/tests/header_test.def | 22 - libsndfile-1.0.31/tests/header_test.tpl | 583 - libsndfile-1.0.31/tests/headerless_test.c | 187 - libsndfile-1.0.31/tests/largefile_test.c | 85 - libsndfile-1.0.31/tests/locale_test.c | 169 - .../tests/long_read_write_test.c | 272 - libsndfile-1.0.31/tests/lossy_comp_test.c | 2617 -- libsndfile-1.0.31/tests/misc_test.c | 533 - libsndfile-1.0.31/tests/multi_file_test.c | 238 - libsndfile-1.0.31/tests/ogg_opus_test.c | 424 - libsndfile-1.0.31/tests/ogg_test.c | 348 - libsndfile-1.0.31/tests/pcm_test.c | 1715 - libsndfile-1.0.31/tests/pcm_test.def | 34 - libsndfile-1.0.31/tests/pcm_test.tpl | 919 - libsndfile-1.0.31/tests/peak_chunk_test.c | 371 - .../tests/pedantic-header-test.sh.in | 58 - libsndfile-1.0.31/tests/pipe_test.c | 513 - libsndfile-1.0.31/tests/pipe_test.def | 14 - libsndfile-1.0.31/tests/pipe_test.tpl | 362 - libsndfile-1.0.31/tests/raw_test.c | 189 - libsndfile-1.0.31/tests/rdwr_test.c | 240 - libsndfile-1.0.31/tests/rdwr_test.def | 32 - libsndfile-1.0.31/tests/rdwr_test.tpl | 105 - libsndfile-1.0.31/tests/scale_clip_test.c | 1855 -- libsndfile-1.0.31/tests/scale_clip_test.def | 56 - libsndfile-1.0.31/tests/scale_clip_test.tpl | 440 - libsndfile-1.0.31/tests/sfversion.c | 48 - libsndfile-1.0.31/tests/stdin_test.c | 206 - libsndfile-1.0.31/tests/stdio_test.c | 141 - libsndfile-1.0.31/tests/stdout_test.c | 169 - libsndfile-1.0.31/tests/string_test.c | 843 - libsndfile-1.0.31/tests/test_wrapper.sh.in | 371 - libsndfile-1.0.31/tests/ulaw_test.c | 259 - libsndfile-1.0.31/tests/utils.c | 1174 - libsndfile-1.0.31/tests/utils.def | 52 - libsndfile-1.0.31/tests/utils.h | 203 - libsndfile-1.0.31/tests/utils.tpl | 927 - libsndfile-1.0.31/tests/virtual_io_test.c | 237 - libsndfile-1.0.31/tests/win32_ordinal_test.c | 148 - libsndfile-1.0.31/tests/win32_test.c | 318 - libsndfile-1.0.31/tests/write_read_test.c | 4614 --- libsndfile-1.0.31/tests/write_read_test.def | 75 - libsndfile-1.0.31/tests/write_read_test.tpl | 1204 - libsndfile.spec | 5 +- 345 files changed, 38 insertions(+), 172967 deletions(-) create mode 100644 003-Marked-unimplemented-dither-enums.patch delete mode 100644 libsndfile-1.0.31/AUTHORS delete mode 100644 libsndfile-1.0.31/CMakeLists.txt delete mode 100644 libsndfile-1.0.31/COPYING delete mode 100644 libsndfile-1.0.31/ChangeLog delete mode 100644 libsndfile-1.0.31/Makefile.am delete mode 100644 libsndfile-1.0.31/Makefile.in delete mode 100644 libsndfile-1.0.31/NEWS delete mode 100644 libsndfile-1.0.31/Octave/Makefile.am delete mode 100644 libsndfile-1.0.31/Octave/Makefile.in delete mode 100644 libsndfile-1.0.31/Octave/PKG_ADD delete mode 100644 libsndfile-1.0.31/Octave/octave_test.m delete mode 100755 libsndfile-1.0.31/Octave/octave_test.sh delete mode 100644 libsndfile-1.0.31/Octave/sndfile.cc delete mode 100644 libsndfile-1.0.31/Octave/sndfile_load.m delete mode 100644 libsndfile-1.0.31/Octave/sndfile_play.m delete mode 100644 libsndfile-1.0.31/Octave/sndfile_save.m delete mode 100644 libsndfile-1.0.31/README delete mode 100755 libsndfile-1.0.31/Scripts/android-configure.sh delete mode 100644 libsndfile-1.0.31/Scripts/build-test-tarball.mk.in delete mode 100755 libsndfile-1.0.31/Scripts/linux-to-win-cross-configure.sh delete mode 100644 libsndfile-1.0.31/Win32/README-precompiled-dll.txt delete mode 100644 libsndfile-1.0.31/Win32/testprog.c delete mode 100644 libsndfile-1.0.31/aclocal.m4 delete mode 100755 libsndfile-1.0.31/build-aux/ar-lib delete mode 100755 libsndfile-1.0.31/build-aux/compile delete mode 100755 libsndfile-1.0.31/build-aux/config.guess delete mode 100755 libsndfile-1.0.31/build-aux/config.sub delete mode 100755 libsndfile-1.0.31/build-aux/depcomp delete mode 100755 libsndfile-1.0.31/build-aux/install-sh delete mode 100644 libsndfile-1.0.31/build-aux/ltmain.sh delete mode 100755 libsndfile-1.0.31/build-aux/missing delete mode 100644 libsndfile-1.0.31/cmake/CMakeAutoGen.cmake delete mode 100644 libsndfile-1.0.31/cmake/CMakeAutoGenScript.cmake delete mode 100644 libsndfile-1.0.31/cmake/CheckCPUArch.c.in delete mode 100644 libsndfile-1.0.31/cmake/CheckCPUArch.cmake delete mode 100644 libsndfile-1.0.31/cmake/ClipMode.cmake delete mode 100644 libsndfile-1.0.31/cmake/FindFLAC.cmake delete mode 100644 libsndfile-1.0.31/cmake/FindOgg.cmake delete mode 100644 libsndfile-1.0.31/cmake/FindOpus.cmake delete mode 100644 libsndfile-1.0.31/cmake/FindSndio.cmake delete mode 100644 libsndfile-1.0.31/cmake/FindSpeex.cmake delete mode 100644 libsndfile-1.0.31/cmake/FindVorbis.cmake delete mode 100644 libsndfile-1.0.31/cmake/SndFileChecks.cmake delete mode 100644 libsndfile-1.0.31/cmake/SndFileConfig.cmake.in delete mode 100644 libsndfile-1.0.31/cmake/TestInline.c.in delete mode 100644 libsndfile-1.0.31/cmake/TestInline.cmake delete mode 100644 libsndfile-1.0.31/cmake/TestLargeFiles.cmake delete mode 100644 libsndfile-1.0.31/cmake/sqlite/FindSQLite3.cmake delete mode 100755 libsndfile-1.0.31/configure delete mode 100644 libsndfile-1.0.31/configure.ac delete mode 100644 libsndfile-1.0.31/docs/FAQ.md delete mode 100644 libsndfile-1.0.31/docs/api.md delete mode 100644 libsndfile-1.0.31/docs/bugs.md delete mode 100644 libsndfile-1.0.31/docs/command.md delete mode 100644 libsndfile-1.0.31/docs/embedded_files.md delete mode 100644 libsndfile-1.0.31/docs/formats.md delete mode 100644 libsndfile-1.0.31/docs/index.md delete mode 100644 libsndfile-1.0.31/docs/libsndfile.css delete mode 100644 libsndfile-1.0.31/docs/libsndfile.jpg delete mode 100644 libsndfile-1.0.31/docs/lists.md delete mode 100644 libsndfile-1.0.31/docs/new_file_type_howto.md delete mode 100644 libsndfile-1.0.31/docs/octave.md delete mode 100644 libsndfile-1.0.31/docs/print.css delete mode 100644 libsndfile-1.0.31/docs/sndfile_info.md delete mode 100644 libsndfile-1.0.31/docs/tutorial.md delete mode 100644 libsndfile-1.0.31/docs/win32.md delete mode 100644 libsndfile-1.0.31/examples/generate.c delete mode 100644 libsndfile-1.0.31/examples/list_formats.c delete mode 100644 libsndfile-1.0.31/examples/make_sine.c delete mode 100644 libsndfile-1.0.31/examples/sfprocess.c delete mode 100644 libsndfile-1.0.31/examples/sndfile-loopify.c delete mode 100644 libsndfile-1.0.31/examples/sndfile-to-text.c delete mode 100644 libsndfile-1.0.31/examples/sndfilehandle.cc delete mode 100644 libsndfile-1.0.31/include/sndfile.h.in delete mode 100644 libsndfile-1.0.31/include/sndfile.hh delete mode 100644 libsndfile-1.0.31/libsndfile.spec.in delete mode 100644 libsndfile-1.0.31/m4/ax_add_fortify_source.m4 delete mode 100644 libsndfile-1.0.31/m4/ax_append_compile_flags.m4 delete mode 100644 libsndfile-1.0.31/m4/ax_append_flag.m4 delete mode 100644 libsndfile-1.0.31/m4/ax_append_link_flags.m4 delete mode 100644 libsndfile-1.0.31/m4/ax_check_compile_flag.m4 delete mode 100644 libsndfile-1.0.31/m4/ax_check_link_flag.m4 delete mode 100644 libsndfile-1.0.31/m4/ax_compiler_vendor.m4 delete mode 100644 libsndfile-1.0.31/m4/ax_compiler_version.m4 delete mode 100644 libsndfile-1.0.31/m4/ax_recursive_eval.m4 delete mode 100644 libsndfile-1.0.31/m4/ax_require_defined.m4 delete mode 100644 libsndfile-1.0.31/m4/clip_mode.m4 delete mode 100644 libsndfile-1.0.31/m4/extra_pkg.m4 delete mode 100644 libsndfile-1.0.31/m4/libtool.m4 delete mode 100644 libsndfile-1.0.31/m4/ltoptions.m4 delete mode 100644 libsndfile-1.0.31/m4/ltsugar.m4 delete mode 100644 libsndfile-1.0.31/m4/ltversion.m4 delete mode 100644 libsndfile-1.0.31/m4/lt~obsolete.m4 delete mode 100644 libsndfile-1.0.31/m4/mkoctfile_version.m4 delete mode 100644 libsndfile-1.0.31/m4/octave.m4 delete mode 100644 libsndfile-1.0.31/m4/stack_protect.m4 delete mode 100644 libsndfile-1.0.31/man/sndfile-cmp.1 delete mode 100644 libsndfile-1.0.31/man/sndfile-concat.1 delete mode 100644 libsndfile-1.0.31/man/sndfile-convert.1 delete mode 100644 libsndfile-1.0.31/man/sndfile-deinterleave.1 delete mode 100644 libsndfile-1.0.31/man/sndfile-info.1 delete mode 100644 libsndfile-1.0.31/man/sndfile-interleave.1 delete mode 100644 libsndfile-1.0.31/man/sndfile-metadata-get.1 delete mode 100644 libsndfile-1.0.31/man/sndfile-metadata-set.1 delete mode 100644 libsndfile-1.0.31/man/sndfile-play.1 delete mode 100644 libsndfile-1.0.31/man/sndfile-salvage.1 delete mode 100644 libsndfile-1.0.31/ossfuzz/sndfile_fuzzer.cc delete mode 100644 libsndfile-1.0.31/ossfuzz/standaloneengine.cc delete mode 100644 libsndfile-1.0.31/ossfuzz/testinput.h delete mode 100644 libsndfile-1.0.31/programs/common.c delete mode 100644 libsndfile-1.0.31/programs/common.h delete mode 100644 libsndfile-1.0.31/programs/sndfile-cmp.c delete mode 100644 libsndfile-1.0.31/programs/sndfile-concat.c delete mode 100644 libsndfile-1.0.31/programs/sndfile-convert.c delete mode 100644 libsndfile-1.0.31/programs/sndfile-deinterleave.c delete mode 100644 libsndfile-1.0.31/programs/sndfile-info.c delete mode 100644 libsndfile-1.0.31/programs/sndfile-interleave.c delete mode 100644 libsndfile-1.0.31/programs/sndfile-metadata-get.c delete mode 100644 libsndfile-1.0.31/programs/sndfile-metadata-set.c delete mode 100644 libsndfile-1.0.31/programs/sndfile-play.c delete mode 100644 libsndfile-1.0.31/programs/sndfile-salvage.c delete mode 100755 libsndfile-1.0.31/programs/test-sndfile-metadata-set.py delete mode 100644 libsndfile-1.0.31/regtest/checksum.c delete mode 100644 libsndfile-1.0.31/regtest/database.c delete mode 100644 libsndfile-1.0.31/regtest/regtest.h delete mode 100644 libsndfile-1.0.31/regtest/sndfile-regtest.c delete mode 100644 libsndfile-1.0.31/sndfile.pc.in delete mode 100644 libsndfile-1.0.31/src/ALAC/ALACAudioTypes.h delete mode 100644 libsndfile-1.0.31/src/ALAC/ALACBitUtilities.c delete mode 100644 libsndfile-1.0.31/src/ALAC/ALACBitUtilities.h delete mode 100644 libsndfile-1.0.31/src/ALAC/EndianPortable.h delete mode 100644 libsndfile-1.0.31/src/ALAC/ag_dec.c delete mode 100644 libsndfile-1.0.31/src/ALAC/ag_enc.c delete mode 100644 libsndfile-1.0.31/src/ALAC/aglib.h delete mode 100644 libsndfile-1.0.31/src/ALAC/alac_codec.h delete mode 100644 libsndfile-1.0.31/src/ALAC/alac_decoder.c delete mode 100644 libsndfile-1.0.31/src/ALAC/alac_encoder.c delete mode 100644 libsndfile-1.0.31/src/ALAC/dp_dec.c delete mode 100644 libsndfile-1.0.31/src/ALAC/dp_enc.c delete mode 100644 libsndfile-1.0.31/src/ALAC/dplib.h delete mode 100644 libsndfile-1.0.31/src/ALAC/matrix_dec.c delete mode 100644 libsndfile-1.0.31/src/ALAC/matrix_enc.c delete mode 100644 libsndfile-1.0.31/src/ALAC/matrixlib.h delete mode 100644 libsndfile-1.0.31/src/ALAC/shift.h delete mode 100644 libsndfile-1.0.31/src/G72x/ChangeLog delete mode 100644 libsndfile-1.0.31/src/G72x/README delete mode 100644 libsndfile-1.0.31/src/G72x/README.original delete mode 100644 libsndfile-1.0.31/src/G72x/g721.c delete mode 100644 libsndfile-1.0.31/src/G72x/g723_16.c delete mode 100644 libsndfile-1.0.31/src/G72x/g723_24.c delete mode 100644 libsndfile-1.0.31/src/G72x/g723_40.c delete mode 100644 libsndfile-1.0.31/src/G72x/g72x.c delete mode 100644 libsndfile-1.0.31/src/G72x/g72x.h delete mode 100644 libsndfile-1.0.31/src/G72x/g72x_priv.h delete mode 100644 libsndfile-1.0.31/src/G72x/g72x_test.c delete mode 100644 libsndfile-1.0.31/src/GSM610/COPYRIGHT delete mode 100644 libsndfile-1.0.31/src/GSM610/ChangeLog delete mode 100644 libsndfile-1.0.31/src/GSM610/README delete mode 100644 libsndfile-1.0.31/src/GSM610/add.c delete mode 100644 libsndfile-1.0.31/src/GSM610/code.c delete mode 100644 libsndfile-1.0.31/src/GSM610/config.h delete mode 100644 libsndfile-1.0.31/src/GSM610/decode.c delete mode 100644 libsndfile-1.0.31/src/GSM610/gsm.h delete mode 100644 libsndfile-1.0.31/src/GSM610/gsm610_priv.h delete mode 100644 libsndfile-1.0.31/src/GSM610/gsm_create.c delete mode 100644 libsndfile-1.0.31/src/GSM610/gsm_decode.c delete mode 100644 libsndfile-1.0.31/src/GSM610/gsm_destroy.c delete mode 100644 libsndfile-1.0.31/src/GSM610/gsm_encode.c delete mode 100644 libsndfile-1.0.31/src/GSM610/gsm_option.c delete mode 100644 libsndfile-1.0.31/src/GSM610/long_term.c delete mode 100644 libsndfile-1.0.31/src/GSM610/lpc.c delete mode 100644 libsndfile-1.0.31/src/GSM610/preprocess.c delete mode 100644 libsndfile-1.0.31/src/GSM610/rpe.c delete mode 100644 libsndfile-1.0.31/src/GSM610/short_term.c delete mode 100644 libsndfile-1.0.31/src/GSM610/table.c delete mode 100644 libsndfile-1.0.31/src/Symbols.darwin delete mode 100644 libsndfile-1.0.31/src/Symbols.gnu-binutils delete mode 100644 libsndfile-1.0.31/src/Symbols.os2 delete mode 100644 libsndfile-1.0.31/src/Symbols.static delete mode 100644 libsndfile-1.0.31/src/aiff.c delete mode 100644 libsndfile-1.0.31/src/alac.c delete mode 100644 libsndfile-1.0.31/src/alaw.c delete mode 100644 libsndfile-1.0.31/src/au.c delete mode 100644 libsndfile-1.0.31/src/audio_detect.c delete mode 100644 libsndfile-1.0.31/src/avr.c delete mode 100755 libsndfile-1.0.31/src/binheader_writef_check.py delete mode 100644 libsndfile-1.0.31/src/broadcast.c delete mode 100644 libsndfile-1.0.31/src/caf.c delete mode 100644 libsndfile-1.0.31/src/cart.c delete mode 100644 libsndfile-1.0.31/src/chanmap.c delete mode 100644 libsndfile-1.0.31/src/chanmap.h delete mode 100644 libsndfile-1.0.31/src/chunk.c delete mode 100644 libsndfile-1.0.31/src/command.c delete mode 100644 libsndfile-1.0.31/src/common.c delete mode 100644 libsndfile-1.0.31/src/common.h delete mode 100644 libsndfile-1.0.31/src/config.h.cmake delete mode 100644 libsndfile-1.0.31/src/config.h.in delete mode 100644 libsndfile-1.0.31/src/create_symbols_file.py delete mode 100644 libsndfile-1.0.31/src/dither.c delete mode 100644 libsndfile-1.0.31/src/double64.c delete mode 100644 libsndfile-1.0.31/src/dwd.c delete mode 100644 libsndfile-1.0.31/src/dwvw.c delete mode 100644 libsndfile-1.0.31/src/file_io.c delete mode 100644 libsndfile-1.0.31/src/flac.c delete mode 100644 libsndfile-1.0.31/src/float32.c delete mode 100644 libsndfile-1.0.31/src/g72x.c delete mode 100644 libsndfile-1.0.31/src/gsm610.c delete mode 100644 libsndfile-1.0.31/src/htk.c delete mode 100644 libsndfile-1.0.31/src/id3.c delete mode 100644 libsndfile-1.0.31/src/ima_adpcm.c delete mode 100644 libsndfile-1.0.31/src/ima_oki_adpcm.c delete mode 100644 libsndfile-1.0.31/src/ima_oki_adpcm.h delete mode 100644 libsndfile-1.0.31/src/interleave.c delete mode 100644 libsndfile-1.0.31/src/ircam.c delete mode 100644 libsndfile-1.0.31/src/libsndfile-1.def delete mode 100644 libsndfile-1.0.31/src/macos.c delete mode 100755 libsndfile-1.0.31/src/make-static-lib-hidden-privates.sh delete mode 100644 libsndfile-1.0.31/src/mat4.c delete mode 100644 libsndfile-1.0.31/src/mat5.c delete mode 100644 libsndfile-1.0.31/src/mpc2k.c delete mode 100644 libsndfile-1.0.31/src/ms_adpcm.c delete mode 100644 libsndfile-1.0.31/src/nist.c delete mode 100644 libsndfile-1.0.31/src/nms_adpcm.c delete mode 100644 libsndfile-1.0.31/src/ogg.c delete mode 100644 libsndfile-1.0.31/src/ogg.h delete mode 100644 libsndfile-1.0.31/src/ogg_opus.c delete mode 100644 libsndfile-1.0.31/src/ogg_pcm.c delete mode 100644 libsndfile-1.0.31/src/ogg_speex.c delete mode 100644 libsndfile-1.0.31/src/ogg_vcomment.c delete mode 100644 libsndfile-1.0.31/src/ogg_vcomment.h delete mode 100644 libsndfile-1.0.31/src/ogg_vorbis.c delete mode 100644 libsndfile-1.0.31/src/paf.c delete mode 100644 libsndfile-1.0.31/src/pcm.c delete mode 100644 libsndfile-1.0.31/src/pvf.c delete mode 100644 libsndfile-1.0.31/src/raw.c delete mode 100644 libsndfile-1.0.31/src/rf64.c delete mode 100644 libsndfile-1.0.31/src/rx2.c delete mode 100644 libsndfile-1.0.31/src/sd2.c delete mode 100644 libsndfile-1.0.31/src/sds.c delete mode 100644 libsndfile-1.0.31/src/sf_unistd.h delete mode 100644 libsndfile-1.0.31/src/sfconfig.h delete mode 100644 libsndfile-1.0.31/src/sfendian.h delete mode 100644 libsndfile-1.0.31/src/sndfile.c delete mode 100644 libsndfile-1.0.31/src/strings.c delete mode 100644 libsndfile-1.0.31/src/svx.c delete mode 100644 libsndfile-1.0.31/src/test_audio_detect.c delete mode 100644 libsndfile-1.0.31/src/test_binheader_writef.c delete mode 100644 libsndfile-1.0.31/src/test_broadcast_var.c delete mode 100644 libsndfile-1.0.31/src/test_cart_var.c delete mode 100644 libsndfile-1.0.31/src/test_conversions.c delete mode 100644 libsndfile-1.0.31/src/test_endswap.c delete mode 100644 libsndfile-1.0.31/src/test_endswap.def delete mode 100644 libsndfile-1.0.31/src/test_endswap.tpl delete mode 100644 libsndfile-1.0.31/src/test_file_io.c delete mode 100644 libsndfile-1.0.31/src/test_float.c delete mode 100644 libsndfile-1.0.31/src/test_ima_oki_adpcm.c delete mode 100644 libsndfile-1.0.31/src/test_log_printf.c delete mode 100644 libsndfile-1.0.31/src/test_main.c delete mode 100644 libsndfile-1.0.31/src/test_main.h delete mode 100644 libsndfile-1.0.31/src/test_nms_adpcm.c delete mode 100644 libsndfile-1.0.31/src/test_strncpy_crlf.c delete mode 100644 libsndfile-1.0.31/src/txw.c delete mode 100644 libsndfile-1.0.31/src/ulaw.c delete mode 100644 libsndfile-1.0.31/src/version-metadata.rc delete mode 100644 libsndfile-1.0.31/src/version-metadata.rc.in delete mode 100644 libsndfile-1.0.31/src/voc.c delete mode 100644 libsndfile-1.0.31/src/vox_adpcm.c delete mode 100644 libsndfile-1.0.31/src/w64.c delete mode 100644 libsndfile-1.0.31/src/wav.c delete mode 100644 libsndfile-1.0.31/src/wavlike.c delete mode 100644 libsndfile-1.0.31/src/wavlike.h delete mode 100644 libsndfile-1.0.31/src/windows.c delete mode 100644 libsndfile-1.0.31/src/wve.c delete mode 100644 libsndfile-1.0.31/src/xi.c delete mode 100644 libsndfile-1.0.31/tests/aiff_rw_test.c delete mode 100644 libsndfile-1.0.31/tests/alaw_test.c delete mode 100644 libsndfile-1.0.31/tests/benchmark.c delete mode 100644 libsndfile-1.0.31/tests/benchmark.def delete mode 100644 libsndfile-1.0.31/tests/benchmark.tpl delete mode 100644 libsndfile-1.0.31/tests/channel_test.c delete mode 100644 libsndfile-1.0.31/tests/checksum_test.c delete mode 100644 libsndfile-1.0.31/tests/chunk_test.c delete mode 100644 libsndfile-1.0.31/tests/command_test.c delete mode 100644 libsndfile-1.0.31/tests/compression_size_test.c delete mode 100644 libsndfile-1.0.31/tests/cpp_test.cc delete mode 100644 libsndfile-1.0.31/tests/dft_cmp.c delete mode 100644 libsndfile-1.0.31/tests/dft_cmp.h delete mode 100644 libsndfile-1.0.31/tests/dither_test.c delete mode 100644 libsndfile-1.0.31/tests/dwvw_test.c delete mode 100644 libsndfile-1.0.31/tests/error_test.c delete mode 100644 libsndfile-1.0.31/tests/external_libs_test.c delete mode 100644 libsndfile-1.0.31/tests/fix_this.c delete mode 100644 libsndfile-1.0.31/tests/floating_point_test.c delete mode 100644 libsndfile-1.0.31/tests/floating_point_test.def delete mode 100644 libsndfile-1.0.31/tests/floating_point_test.tpl delete mode 100644 libsndfile-1.0.31/tests/format_check_test.c delete mode 100644 libsndfile-1.0.31/tests/generate.c delete mode 100644 libsndfile-1.0.31/tests/generate.h delete mode 100644 libsndfile-1.0.31/tests/header_test.c delete mode 100644 libsndfile-1.0.31/tests/header_test.def delete mode 100644 libsndfile-1.0.31/tests/header_test.tpl delete mode 100644 libsndfile-1.0.31/tests/headerless_test.c delete mode 100644 libsndfile-1.0.31/tests/largefile_test.c delete mode 100644 libsndfile-1.0.31/tests/locale_test.c delete mode 100644 libsndfile-1.0.31/tests/long_read_write_test.c delete mode 100644 libsndfile-1.0.31/tests/lossy_comp_test.c delete mode 100644 libsndfile-1.0.31/tests/misc_test.c delete mode 100644 libsndfile-1.0.31/tests/multi_file_test.c delete mode 100644 libsndfile-1.0.31/tests/ogg_opus_test.c delete mode 100644 libsndfile-1.0.31/tests/ogg_test.c delete mode 100644 libsndfile-1.0.31/tests/pcm_test.c delete mode 100644 libsndfile-1.0.31/tests/pcm_test.def delete mode 100644 libsndfile-1.0.31/tests/pcm_test.tpl delete mode 100644 libsndfile-1.0.31/tests/peak_chunk_test.c delete mode 100644 libsndfile-1.0.31/tests/pedantic-header-test.sh.in delete mode 100644 libsndfile-1.0.31/tests/pipe_test.c delete mode 100644 libsndfile-1.0.31/tests/pipe_test.def delete mode 100644 libsndfile-1.0.31/tests/pipe_test.tpl delete mode 100644 libsndfile-1.0.31/tests/raw_test.c delete mode 100644 libsndfile-1.0.31/tests/rdwr_test.c delete mode 100644 libsndfile-1.0.31/tests/rdwr_test.def delete mode 100644 libsndfile-1.0.31/tests/rdwr_test.tpl delete mode 100644 libsndfile-1.0.31/tests/scale_clip_test.c delete mode 100644 libsndfile-1.0.31/tests/scale_clip_test.def delete mode 100644 libsndfile-1.0.31/tests/scale_clip_test.tpl delete mode 100644 libsndfile-1.0.31/tests/sfversion.c delete mode 100644 libsndfile-1.0.31/tests/stdin_test.c delete mode 100644 libsndfile-1.0.31/tests/stdio_test.c delete mode 100644 libsndfile-1.0.31/tests/stdout_test.c delete mode 100644 libsndfile-1.0.31/tests/string_test.c delete mode 100644 libsndfile-1.0.31/tests/test_wrapper.sh.in delete mode 100644 libsndfile-1.0.31/tests/ulaw_test.c delete mode 100644 libsndfile-1.0.31/tests/utils.c delete mode 100644 libsndfile-1.0.31/tests/utils.def delete mode 100644 libsndfile-1.0.31/tests/utils.h delete mode 100644 libsndfile-1.0.31/tests/utils.tpl delete mode 100644 libsndfile-1.0.31/tests/virtual_io_test.c delete mode 100644 libsndfile-1.0.31/tests/win32_ordinal_test.c delete mode 100644 libsndfile-1.0.31/tests/win32_test.c delete mode 100644 libsndfile-1.0.31/tests/write_read_test.c delete mode 100644 libsndfile-1.0.31/tests/write_read_test.def delete mode 100644 libsndfile-1.0.31/tests/write_read_test.tpl diff --git a/003-Marked-unimplemented-dither-enums.patch b/003-Marked-unimplemented-dither-enums.patch new file mode 100644 index 0000000..4a839b3 --- /dev/null +++ b/003-Marked-unimplemented-dither-enums.patch @@ -0,0 +1,34 @@ +From 218c4fc50b75ab2b1df5a61d8d46c372de6fb2a5 Mon Sep 17 00:00:00 2001 +From: ctl-ly +Date: Wed, 28 Dec 2022 18:22:13 +0800 +Subject: [PATCH] 003 + +--- + libsndfile-1.0.31/include/sndfile.h.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/libsndfile-1.0.31/include/sndfile.h.in b/libsndfile-1.0.31/include/sndfile.h.in +index 917ff4b..970fb26 100644 +--- a/libsndfile-1.0.31/include/sndfile.h.in ++++ b/libsndfile-1.0.31/include/sndfile.h.in +@@ -173,6 +173,7 @@ enum + + SFC_SET_RAW_START_OFFSET = 0x1090, + ++ /* Commands reserved for dithering, which is not implemented. */ + SFC_SET_DITHER_ON_WRITE = 0x10A0, + SFC_SET_DITHER_ON_READ = 0x10A1, + +@@ -386,8 +387,7 @@ typedef struct + + /* + ** Enums and typedefs for adding dither on read and write. +-** See the html documentation for sf_command(), SFC_SET_DITHER_ON_WRITE +-** and SFC_SET_DITHER_ON_READ. ++** Reserved for future implementation. + */ + + enum +-- +2.27.0 + diff --git a/libsndfile-1.0.31.tar.bz2 b/libsndfile-1.0.31.tar.bz2 index 683f561161d31236fc7d49aeaf1f4bd412296171..83c83bb301763b49406e64e6221cd10093636ed1 100644 GIT binary patch literal 877171 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 z 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�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

1SyA;;aY@Nv#fg$m zizE0{P3%dv4%elsD~we-V-MUrcealN*c?)g~bI0|;U2I*gyo^m=KL;@tMD=r(TNZEc+7?QzI=o>FNY+?mY6opL$`n~~mB znazphc|ILP`|5d$A2+`e520SWyNAWPNRKh6^!TjT7Th|6Yl~JcEy1#9sVudb37Az5 zM)i=u0gxzH3?REAVo2-qw9a9JdtL>AU!b-8HW3kSq0y5d6-Rf-3n2anb*bD*O$)zf z=rqN*mN`iwGz?YgAVa+YvLo27a^_+liwd$M7PnyA^*A+T=wvQf{pK3I-$&sg6GUDWScx$(^U!ST!AHBUrrKEUYxl3tjXWsU;5-hqo z6J6X}wBk84D%H%HJG91@6S99r%L_%*l=6CcbbuFG(E4o0PpfaNFUlGMaGp^B%yt31 z8)Au|qxgV6I^1g0U>gG1=+tB?18c(B=K?^%b{>mpU9=m~U|q<_oyNVVmmHD8-yT}3 z2-SxskZdl%z{Q4RXO~Ac+PxU;dE8+w`G$bRafTd>Dg-Sy1B_P5BhAethCpd1A<%3C zOQHyN#sZl@=WR~u91|lJS@Ia4iw4@~nGNlVeg*ha9h89a!uZ`<8ls2HNBZz~84or?qQjTdX(4~rGBlD*U&>I~K_esEW+rb~vWr2< zmPXi!#9rxiiC1!6BnenJSxc8kTMbo8arzW8E58VC~F6?s@aTPQNXA!`<%Z$ zp^{BgB3HXTEA_0K$KMkX@1Bg>!gF<&Vkoel6(edl^YF*8-6^4!_3OB{d5cF2=LQ^k zjNB@}dQgaNgo$1b&B2n?$r!Q|4RFx3=k||<#K;xeG;Z+RW_Ts)Yio-I@Er`94BNTo zsb!{MV3ti7y;ui44eH&LveE;f0|9%T{HTn`(0g*$VnbFXyE{NlV40?%-iUq%pF50dJUE7~U-K#5S?ohBr;k0Ndu{HVjR?ogI_( zsmgF{g-hC48GrQ@O;dCgu2oD_~%`R4M7kh z=H(qKuY0?u{BE`#)?r|; z$D}T|u(o`B2@H>4g?hEzEPH&KbHX>~#5-gkHSou+%U$M2=kNlxtPXPtC*QGV=?wP?!-49Bcso& zsDy6?CYYZ@uaqAC-C4~6#?)vZfI#fQhCt$CzBtZpLA%&LvIV9h3Ok4@wjwe#AhLRP znvu$p+{=K2lO2|a)O&nz?f(OpVl;M`1^**mKL5+t@%wrk21+TNAE%|4bsI@H-s~a! zz7fX_hw^BAUmN_6uzp0ce##^3&x@b1EO$HmQLRb!x=si8H~8OgtT0YF;C-$ZA_5Y< zk_-H&Nj^_RU~Js*qBe`khlwB)bxfoi8W?1PMFc=Nw zZ}6ba1khj9TbLUO2aM|i<8L{f3*aOh@l})K`cGBT$c7CpIuDm5AxzCg5L285265TS zcs6(_XaN&)w11ke1`^fo@zjJMI;hy$pynjwz7md@EQT+_)ay!Q%O6jUI|9tPpJtA{ zKFjlKf+wC#Pcp}kF}su7xvJ0xFz@48;bAS^n7=lX>>O?(Fl-$nl$f71D0ld6>{F|A z9IC2|(=jtL1Q7?~i5>ffVsOM`U9liKe?aN^+GGdaw2?npb0WiikGH{b6lZg}5pXx; zK$0O%PCGC=UhL1E5#!tj&_)MkFT4ma9lTu;lt4~ET0+h&*lAjwOP)Ieoc!=xZP$Le z7>o;3BVH(S-J=Guh&W4ce^$AcsǹrP@{m`AkLFx0zR($@sTW-YF7>~6poyfrC< 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 z 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

3eWlFRkz+3ThX&6I#^Z)hNUAUNQ0jROyds6q{Q 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∨0I& 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

NJxxnEtlGeuJK;Q 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 z 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

&KAcy@hsQUgJ;g!cD|veB z!&xaN_So^Oi%VUI>C=_z!IsFUo?&{6WWKuVHl$YR8fBX6A9rQa>%&bK)Qm*ax1338 z>J#psf@-%!A6~r9`hSp=$a;>~u!pA9jGVk|vwXtBtE)${LQvQA4f557M=Ue0Udmb+ zJhy~wJA#V%C1GS*dYK7`4ma^U{edRTOCb#B0NmdgY?`B4hL_#u0!!U##}qQ{g0*va zH(rm3D0P~P>nj*MnnKjScFd?uLz%H7$C zRmmch;V6g8vZFlp(#f}{!*0er+S@KM)xC^Lt=TXxh(8c7IrUqO+L*Npbw0m#@{Ak3 zb5NKYX(gYPT&LFNjBlPDno#=bk-fBZWMDPu6M zma+Lul?x-{lewkINW@_$w&K>(IIfV2ae*J?%jlWCoNiDrD7;4DkU$A1gVpvoNF=LG z9~du~pvZO7TtKOBVfeC$FT1_7R)BW+VRZApxOGD_Wdm3l16J#NV^X*tC@KpNE{@&F zB$SkA4_=q4tBtlTh&Mw%=`dQFoH^jCc^Fm%K8HaU|{BE7y@z8fe z4*uDK4cztT3k-euAwK3Q=k^4d?V%f-v=0kf7Wn7Br@czQ zZ%IO)ZR*n;@1^dbR1146CqkpkiB6!d0LR28lqhSHWf7q=MBr8PabudLeNS|fq?MA_ zzfxeJOEZ5V?N&X7$8&_JCr!!*3g~U!rNxR+TqPIgky^{Nlljd*tFT&1oVlRbe7Kit zi38HYiN1;^IoEzgLFGVYE09(UPNyvv?t_)!T@=pyC|AUXDy2tbKFUX5!KS79&CuOO z(i<>O9vmRq2R#pOOqeAn%T8JDZ%D}z*QY}l44(-PpXqNO-Q|`ykNOZ1*I4juAf@so za~chuH+VY~F8OQx%j4$z?j>?qS4dvOKI&G~c5G(l`*2Ko^jq5@y`)f&U#Z2MPG{mN zlhBynmip$Whp&i)pEoQ)K@nR732EzCiNX&irW)K)=qJAyY#&z3_OAcMj?^#F zs3)eq1itu~TwFB!FsClr@nK50W9;*6oS{ID?Gre9^rF1dvEuW1*Ix}6sUl<^;^c!l z7VGk??4m><%RXEZ=Yok8iJyK)xP^V`QW#=UzPf4OByQ|24XC$ z#FFV6{s9|B^*cQ(;^i^|N{;1^G1kV)yI;`sn@_t3*n{#d?Eynz`+kFJ9c~5gw(iVm zS?t}KI3ZwJs^{E+YDCm1U(l@ff%$ouKolA*l;VN4pqEbxBG56NV%g&6WcVZdf;XzM zsJ%j%7Lpxs8WA=}%DkWO6`|2I3S-YMqmt+eWq&KtFmoqWGx1Pv?pAfogqVAd)ddBv z^3W&Abox4nk@Kv8nM#C8_tOV^`9VT);n_hd>6F(FXdF#sKTX7<1Q1T9o4bpQOteHy z{3i53Wi{Qb@ScOu>@m$<-=%N6$*Xml(pF0Ce4s%|&xP-9a{LT3n&eJJZ1br>3haQT zAw+S3F81cU^fBaF`<+wj1Q*ShQ5w&Gp&*rivHZHXx`x(Ps zS8zZ%@%X7}6ACj~U5TPP&p=716{TDz$`(8?FMAWMI9qUMqQa0{)S)@8ZPJ`(qz+BV zZ1-vwU6Y0Wt1MHeJ9D0DMk{tf0OwohLvcBPdnkBabXdwKk!uABH)s-`fVp_hWK8F~ zuBnD*Un%RN(z2T0uPpkgcxS5uYo9iE{pRJN1B6&p0}v#<5BLWbhFH)_uFX52ck&U=co&u?Wk0_f8YzKH60qUko%VBf$%GPwTA|Q``BKrTN3lOg z$=h5g>xnW6Dg5a`NMI%nczmr{DAA_(+T#5+!8~YOeX}K2PHA64>O7*!Jg@_kAt~mU zn_0mf6Vn_u=0QfO=|j9pRg{UPn+^vs!pp@OnS=<2$iM2X4BcqRtLme1ZJ49nkKghy z7FFEv5JWHEKx=c$R~meO;cYc%I(^x3wp(KO zU+E$e?AHHWRo`EFpwXmeZonnn@ERNr8PIqiVSP%uC5CX~eiJ~YZo-hA|GDRv*f4cn zW)rt*>lkjf9X-t>a@5w!lA2h#ct`r$u~b6*={YxjzC}O0RIbB047y{PU&<7+%@O)8 zwHj8VA;a9M@ggSV7RHO}H3h@Nr|Ust6`N5v@6~UeU;-Tj=oH??1}%9NCMAYa*caxrpnOIj@NKxuu8Fe4Ry$q0Cg`CdDY^Z^0^KAW|tVmD$BeP3I;n zm6~~7;Tw(j@R-uWyI3H4;=T0nFwc`a>#)t*o8(T;$lTdnO)XSSmVx5MA5g%i_dJTqS*}K=^!=hQ9ss&|@%H__^T=k!T{KE?*dK0jzvNG? zVsPF5{PBdHB||9oRu-oy)zmi#-M9#Lvi16o#z++mET7*S-aQvUOzB^&rdt^pBY67S zheIl7+0kry=_ocZ4A9Qcrgmc?Y98E_o7{EtcjF@dWdougcR`?sbfvul}?hiTn1;^8Y9TzXhdU*>f!O4Gzz zMzrKvYhq>+SZ4?IZH{W<-?(gO3l`DiFjg4LJc$x7E4}zZ!^Y@-XA$-74H`q{hUsq< zyXxz|P6S7)RgEvpgIBhElT(z#RLvVxHhr3mHq~JIGu7cq&Hf09DVJR*JtQc?9*XYGhZu@+K zszjCd9+zylKSXc1wLS{kRfmbChGg?qs}`9dlJ8wrSy8`tR&x+{A%1_MbC-s_W=s5%NKR1C)f>K?2BEC0dMlIG zxd(Ki!~o&5g@K2oVf<%NBmjBsQ*ZZ#Z&ruy*M zmrr~7;*bc!Ny_BHymBeWPQHv(yVB6DPwdGP!H};F{+aZ`^=VS~(BZJ*&}gEB3y=_S zwZ=-Sr4RaP@cNN~mIxO|nCQWW!|-ohMRyl(@x&G*9of*n;(tW($4$o;b_Nq52iS-lm|!e3kmVX%42 zSCRvQvn%K#feQG;>8Gq0Jxpm;ps0K!un>P2hif5*(}~7LM|X++LFsVs4G5)u z_T>`9Y9jyqH@+;PlBnUq9Tp~ZTe4qUN?wl z#CM;sXultkS}lqFZ{`9h)3|h1Z3q>4cpNpH0zQx&{a>gEx_F)KH5-=*dg7N(Y4T)a z1NzfXJmvEV;`T343jzORI{O>jCQ#zy5zyoR1^@3MPW9h!|NQ?9k}LvYX$JhF|IQj- znrGpCXF{$nAClhB(A|3~7-v_aHa-hJyt|6~Oc`*;el~g@r3yxLS2Y5H74))-3LXb2 z2;!lQQ#XL2V~7&T*r14{JWYd$)5_ z5on&@^WGI?umk?lz2VOi2-MhP)mdhQOvH`+ES_B^FFS1Dq~E7oWj%Vb%6En0e+}!_ z8^-B!zxn%QMfLsc*A$J;kn?Ol&?AfOZXd-JA*+rJ1dXNEE54D=-)NyT$hA7DG>9Yp z)jxf}!j??>OFHTkDHAdFn5C62&^uksEkW;@k=Kc8B(}T-g`Q&I&jD-MK6(Hox=e|j zoee%3KH3~Zsi^qi%6NPdoACH-U@EWocx8Lxv0?h(Mp4zBP#tVY^E<4ybk&lXjX$PtHXXrNb5gj;(nSe8Nlrny?9%7{OLWn-tF3W$fK0dGBv9SZ>shPN;Rs32K_wttojw^;W%k1PSjKU6{Ht-YXubWUY z;wOhGq*X*+U$CIRBBN0;qQI4(@F**4D6Y65qvz8!nY2}Zwm+F&W~I;jo(frb9X0p2 zuZuA0t0E$9eZb&{Q2>7Q$I-=Z{M@;^3{wb#p#nc9*W1fI6Nl~4q6+VYxd6Xk)h|Cc zcNNI>6*aGN1m1jLWVs`~K5n4;iS$QI?IKj6H==bVQ^FhI;MWQp#$zj^8=;*eAyVMZ zlnbKZ;^{nN<>q(!&`cFz3c?DUO;DfSZ3TS?2nD zw~@3doTVMONekGvZ%OM)jA&Mf(bDgiFCB=*AN$wZC3A~mmOC~=Um^v4OiG>lJD=_q zLBwoFCy|uP(RUwy?fF`VMn)E%;G2_?@*{HR~Tm-yT)g3MTPZTdpLf zq#~{{TOFy;u=$;wE$<#jU#b=q5j!vujdQPJyX4XP5nLE;TO|j=6A#PnS-VK$6XTGz znvt3it`oQ+c`XzwHE@@bqvrHv~vO zJnb;@PfLV&2|GEF=wh}=Z_Cx<`fEm6ADT!yfbokW>-gI$3GB_I%7AHzq9Mp9bFX;Y z>n=+<_1yJD>cC#rnkhf?@TzC7nxkXC{F+iJ3^|Dgk>IML3!1T!h2R_JNCa9-SEWxO7lj619vpnpP)23^V-_E`OS z0CYQfJJI+l16d&{JFGi?)R2948M2dVWm+UT(0JLFy4s1f$)l`8w zge56+9lD7AfP_Y)+198ZLhj!`FWVPram!g5aOd0m;7VF5wiI~Z3>Sv*TrCt}B53^A zgsc~tAUS1%n40X=ZYLM$z$xxA=wyG-e4VIdjSC=D4I9Z9^ixWV>@t7(c(h?LW7Xrx zwDqej+XPzb%bQ!bJy*M8MLu+>wSKIN_*cTgw|Y|Z3UFGXq>^R5UCFo@pq;9OpI?Bo`}!b z!y`lZgfbM8t-cCoVq78hKkef`yir8#SyvX{8Z%@erFr%z6U>m7gr;qr(jTqtLK&o? z-9k}z7DI{RW-7%epU3FemPtx=AYo0wku%sR*Rjp;HtY%0*=7jgOD4U zK44Um1V5&g*25s@aD9`G5F~IkuL*)Bof~o#Yzf}3w@vX;@?O&gx=C%fhx6F_$`V7& z{}D*#oo|NkvQM=Sv`SwEUyx>=3y!D>VLO5Aq(7TB6W$cp*lcs+obG0h?5lrJGk@w5 z4=A(S%dyM_nW8-y8YDtmqYR*CV37ZzO^wz7h3eMjoWNNpB)Bw}Vu-0bfMlV`)k&j_ zZJ?SX70XT`#XMfI0vEgAy7rOKL1-ldOZ5Vvsg+VT)+Tpo;sWxD`t3_a9+2v;rguL` zA=sXUj=WQ3ht!6HEIK%9W!Af2ppx^O8$o9J4XH5nY(1&#t0H}+`z@)==zd5yiRQ140BpO$7p+f8*tEMd4ykz6~&FQD|bb2W(|!ubr-4S-%tT zvq6Vg3CiqBK_hu|3ic%ZPiLCt*!vVhfZ7%M55%gSaEM@NQQ?G9GG@d^3MxcWFT@WS z)l#OAX-Vi_RA|KguV}jySX$91%Eg(%g?{NUPVV6jIEvfBhj@?f*GC)T+9@mxe=avk zE&{upgd3@_#i;b98(U(bz&GIHZqM1|pK%c%ATEEiSK9rqyq>{PL`hZj1j~y*P z9O8b|T=A0jAI(l%X8qbgWwVOP_Z}%lT2wKx{X6b~!yu{R6OPmD#n~=S%aTGYfUu}O zUhrc>x!mi?BrGy6^!*y`;;rTJ`SHXKmdLy3`r|K3r|Idz<<059T@A}J2`gm-kFIUN zx=c?Xc~S6;WmU{ST6A?qc=rC)dgVAAW-T^99dX~esTGDA)zryrVK5#A+DcgfIYm*= zU|xNJfO|VXm{fkv-MI}`fC3aSxOm;x&@-y`&0|w;`*N#6qwkk8XUg&(Bm}I0no)FP z;xq1>o0^l8=LaiQ&2aak^X$*iwXRKqoWy%i*|RyN!;0W7vvw+eYLp^e_xRZfH`sB- zl5y(M>hcVebv?JvsWXrJPqZZ)+{;^R!!-ytDv9&rJViC0*QOhS&EPL3vIW3s2&5KXKB*o=z}WAi1_=TKQrKB z4pg9Z18}%8XPb3q@7KgAOZS=4#^p)TD|LY+At_OY?**+L)42ep8ymz&x;-Dz7+$#` zqX2Y0Co-5LdD+0?cYE^7y-Lu59hV~{d(|iJ>_Yw(V1r{NPn#YjH-ekNUJl2O|p+-d>c z>@)qd_k){FMF`Jl49Q)tAJ_TCxH9PEt^e{Zoj${1NlZMbRk?Zf9Ap8SLzN-jf+Zad ziklHn8sz+)h#rp}oC}BckjC5R4gaz@JK!He&zC6x@*rR2L*LiCASgL)aX+*+b~Mk; zpZExOTw03?PDaO0NA7*yzChutqxMVu&fu2#b~zb(Z;YqfqGj()MNi!HG(gNI@52*3 z;eQhOpjn*+w|M!T^`}|K_Wk?!zrH|-&N*9>yW$+XnVj;1 zQKZjDMM&B6bDpL48)|V~uMK_%3@ORU;v|Rh`rDpm=<` z{V5&aHP{C7FcCt=i z@4g-ZX{zvv*WX}%xgMB}y3H~bb)$bD!&=yz?zwt;?`U?exg@_S1?mL6bC${{kOq5R zt$i`O{ac0gC=PaLg{Gb5d#O{?-Y4^+Md3-;(rX9|Pi^aV6>?H-Z(fRC{~?i`Vi%HI zhVr52j;h#&szfpo`?IAO#0{S-(l|5Vf>oTANEn$6NkZ4^9h}3ZH2ZT#EDny%FB?ut zZB*N2L#W|=`3|ZRmYMKl;@|B# zGL|N_Ahexfk-wh`C1==4G!0LFh!Z&YKyeMv{gaQ1I)l~i#w0>2JxkC{p7G&Hw9ZwZJu1X3kW;L-5p z$?b@{hp-K6e)qobJ|_k`I~!;M*$WG02i@JL#%^WsahT+1aR^r7F$0yw&-!BHaLs^il2&XK<-1o;;P%Z0UryLC_ciLf)9|Y+nz@pqCEDY% zhzF99Y6Lk|0N)?dgCj}9h$%30H{5y0YIA6Z(ix&}|C5qd z3Fy*5$B`ozuC7MF0%E$!!5tIF;e`3*G6b+CR6>-$-CUcD_5RJ2FxV)GJQn~+{FVGG zt5~NiXQzWKjYsR?ZEdYabzFAU3xxz31agtJ zP~p!zzi?$@0(N{(1K@eS7`|9j4XNmXuZ$Sq4_t8*b6bobRV4dQZMz7+e zT6g{(1gLtrOO}>CdGOr{EYe_YJ~y(T#qWoL;()GX1v`D+I=3KFnBnJR3Uq5gko^PN z4(N%vOQ-U_ZbNP0E1ETAJPnoRA{m1)2x&+HSwkEu`l?3=I2_}D?oJ(*0K1D4hbkO! zSz4j555G+y@GUX`IuPB99TAG15-RN30HSdfAufD5!o>cw2+-<(L7OHFTtP#JSFC5~&Jrn5aeqViL^7cAX6#Q_^2D(0CJI>iZb-Hs5t3T68MX#zpQde}{ z%`dVTwGRvDtvt?VtN9%?e8;ILN?5RWiwum8e(tFMjq3Z#$Qkoumj$Sr^_udEe?5t} z!vj93@ytm44nLIGpM0dK{vIknq2$+xIr$CyyFKM^vU0d-LW8dgIv*e9eg0Q*+CGlW zTwJ2N>e?SfOcsD9Kh{aaKovxFqD>%N6zct|byz<}1!xAOJDUl>375{TA7PIjaivo_ z(j-Aoz$B3Nnb4&%y?HpxP$K(qzHoOaZr;C8L3MU@Yx}3jR$lsyrM|ion-J|HcPe&W z5qoRVP@jG=x;>or_B?KgX+xsP0dg)7VD-0_Z?48yr`gMqy}a}EI6kQhL!}}VP=+^` z_vD^eu)%0X%9*$~FB3Bq2tRqv#4O?v>2BHgO(WKE?XBa{1Vqa}h{`4Zm;$HV8HmZI zZ^9oYvwa0yJhtHKO3&>7z?hpA*|mVYF-QDhq$ZWeM(1&qJSFgDZjX9fcSay4E1yjU z4~8l-&eyG-Rsv2us+L~rpa$0g204L5wXSocFXa)-k*aVw_WrwgZq9sqY^@)gbOh_( z=wQ^YxMF#msRYofin!GcI)_-I>-FE)Qzv5gKAa(xxAI}+_wBw7CIjFwSPI9)aaiw3c77lz=?}@IbB;N%u?{Lo{~6x^L1u|6uD3 zCsC-r961alF67Jz&m+!lyNu)F3Fi`p%>z5`s1g5qVPCeNj`UAs){dU zcaJ#dmP+=eH*F6AzmW(E@Ze~f*1HfrEXi}1T1e@g{FpVqC^pTfE$?t=sF;4{R~EnELpP5jvH(`n5I*J0S|yHA!K?f@jmxCR6$s04Zshq&Ioc zDD^V=Osh*LAXC#=k8JP>Z4u8aJv6euv8*~Gl^Es+G{sO;`9ZKg<(pwAhCX;0l(;i{ z_TuFmYxLKHra6eHj)?nX>2W%_{g?iZ_6iUE2TfO3Z;J4$FT_Qx|DqJa zT@Zeo`FQvdl%>=NC2v{u@7DjU^8a4lTfm?*KQ5B3MXmR=gBn)H*myW<&V!fr;P0g3 zddxsirrHeQObc~7d0_Zk?(C1{M*Xj$GBMfPcE+SaBtLj)pB^SZ;CO*+e1!x#)@n0Lv zKd%JLzsG+Ywo-mzBqAMM?!Ql!-jlm*TO_*{)Ns%4siFzb_t>KeQw%B1#KoeBWPpzg zwy2uO?b^&_!!e=jqf?NsEMN@$%4OTozun+aP4Cgf`P{(UB{B%`_ya}eh6o`h4Z#OZ zAdL8&HK=UW?c!X!z*Az>@MA>4WvBI;6ONHQbd^|*n8;=2gzoXVtpHW9<#xp+W!6T5 z_^T6(Dc4Na9O@!3mRnFc<{)p|A&{26O!(KfSQdANUN!Nm)od_bG_Qty0Hm5c*Fj{4 zruIM9B}!oG88ER8cligez3;nk=`PW^i3vOV2hXGtC!FnTtS|B2HE<~tMV`8{VXYYh zR_rYR5*i+-T*;vZT?8`pFUnA6zWh}*z{j3Nm5x}QhH>q3CX$oDf@W9h7Tto@FxXV0ee@P5Ef}=o3YHxeNe%Oq$5tu>1!d z7UzOw_{lekTtpkSvXNM(o!#u#4~8*wg?qyrD^_PnQ)Bv7jx3;4DKGX zMg4C$*)Ufce%S$3cp|H#H|euN{UUr+KDyCty`m<5iiu`>E!TGmU@yGs zOxW1Q%y>GsdL#}jHQnm8#oWC<#%jh=(X*SZYouG6ikegC2IF!l?u(>LT4o zixS(|J~eP12MTQt6EL?kLGma>$dJf8YvuO&<^JF$y~{u34yMsH^cdtBF zW`F+OXSV!qaNI(8V$zB?E=tFt&joze4j2uyVS~0`?Uqr7qDywJnyrTxz;10F@y`S?qz0l?I5m1LO~@`Bunb?l-lf42CZo4~ z3^WZvCdx;Aa;^8HbcP2^A?K&`oY7Dqa#Sh@Vo?-WP(Ofe3_92HZv_b*#CFZEiu&)z zbzMFuJ+v&9LYC7c;@Zv+3+0|4%r2O>9ViKg*i@rz_UI$2zVG%0((1d9=cnqZy4Us> z_03NwA0LEOOCsNU#EEz2h*hFEns@pjytW@-CNYo35;1aGlUM~XkD@Sd@10JV?Bf6Z zv1FhSDfe>+w9+8mk=K*Ag+@d}EwLHS`JAGJeXvVeF^(Y0 zbQ`U=B0N?~nqf3*SX3NtojvkqUm@%m;C26qwgPnY8H;AEaZzpljWuu)NsNauy8 z2$RbRp!24=GF_{0m__9ZS?%dAT;&BE?bF6!vTKYv2H+}Oge71Z(STIH5QknXE0!R3 z5v#i!$+@grxKVPqrr%=*%(gJakc5|aIa}UoAD^5JXAs}p>2;VPk_3Tr^gQg3?r$Yi z>v7MRX@AZk>}jw6aAuOk&2#*K_3@SACfK_CyIbB zog@)JmIt3CN@hTA5Jw)gc(~C81(nWU{sn=jYo)mu7O8Ga;lmgoyn#1p^y>U`_{DK; zv49mR>9eXv+sO;OT)5E?USnG(CEEbU*ly=tULP4RTdy}=v^TC@qL{qOVU@GzbP((F ze&43oVL6tso_dlYp$YjsEVFQL-Co8CSz1Ev$vmBPT)XySyL!E*XV3m;5Mx!)!IWWn zN*;mJTiVi*AqnAjoZdzGY(Y*;)g`I<%9sWcvD5i&+;XdG1=bt&n4+^_BgaNKQ~*xfRfU(LkXyrWV3DBFFjgt~l&zEpv8WX9gz$^Z~HMOL? z?@6wtxz92%Vva;&5;1?e9j1hnkW&v$H;4arL+M;SCQO;n$zW{toTvYMrtx`PNVj z-A-!D|3GMxvVJF7`ev4uB)k)J!yu6dpfb&|U7NpK0F-zcjiRI^>?aFVIFwIulzQ1s zdz*{~I7wQiVE7-f{EgYjaO>_|Sfd7Y+R*vEeEI{|{rpSrR#bTqvKU=vxdtXJ)s>Mx zMZ2@IP{at4VW%MgKyNBRof#xYy z2nAUt8>I~KujFO(Yu|*fM2e#_PJ6bR?lWXwNSVGnPm& zpn05gx^`AJ-HQ_9&PZKx&BJ`{SUHtfBRvo38g&eSzI zWPQ;BkCE__fG%mzJ;75O-%4>bet$Mi*S&5+twz`!6w_z^oWc95U}yLG2KemSIK0p7 zKK@a^dd435?ARYd-6n~CT9jZhXcn7#b0^zX%=%sxOW52M?uHq5oXL>xgiNNX6z(?= z96~OKNmKVHl0n#iXn>{v!aSGB$LKA}e#`UzCg%GAc9p%FVeELZ7xn zV^c%LqI6#hA%^~Vd4Nf|g|60GNPL=MUOd1#Qmj7S;K;<;DNa->#x{N-;Pu_q9b(rP z#RBBo}Fa0>nXhuw+D>mocW9sLo%!|STu3K>{+8j?PBl*lJA!{Sn@)gOS z!?lcncv@}p>;5-sECd+zLUUQj^e_4IX><1rRBX`XSeX47Fw_|IVwgQw$sCBH5z%@{ z6d#kWgsfpB2X1K+Dj=~0Kbd_V3%|u2znF_omz)}@Ox*ozF#Yqx#g~7e0%HSVrH_sm zyL2dU{6HAD9!9C+mLDzOUZooak<_2*X>*dPO=te_n74=V9Xba%3~>phH}a8rvzl9v zoSN}8C%z|pw?iV2PFycP#UC2of}0GH!8l?uPnc8m+Xc)_-j`5T3}xj~(JHz^4A@zM zEbHiU*Y~q87T|2J&T~+>Kq1j`ACZ+U z>N)~nR9oaJ#ZauE{`|9L!7NDVG+ee-IBrZ|CFE1_&1Pm)?kY1n!s&$qRC8E4NZDL! zcg*en;VS^}^y%5!sy-70mJXap1XAUtQBx#PN|Nw*DsKFs@$~gnd=y{zJxsd1&gC7X z8P>DIEb>{(z_Z#gCHJ8h-R4FQmLIBShBC(=UF9a#VetzVOESg^CT)i|MZpjd%qqUK z^s7udBP0{wPor9g#)6o=a77@81n%4sz5J&4_Vn)2p;CRI$k}=5z1w+s{n+}(`OXa{ z%{!ld@g{aWxHuJx!Lf?Cd~#Xxi;wj1)I6)pG&OboZfFkc-(yaHFTl^|J$n`;$l#p+J@^hO;m}0dJ-~D1`~n@UX`#$&&4@ zeT%3!%iME|u>_63H)z2J);)`F01s;29YIkjN2-&Ez0Ept4pv5<)9gY*0cyZt}!vqR3C+)}+NN_0lf_%TAsha))4-#aTMH3u3lR8K=Skt+V zQJsnNhletdn(Eem9+q&s}btX`ivY^*oH0J zG!lZJKej6}F`)ymv5HZ5;zkIpFV@79?uzN?C>SUp{o?`*WJzI8iQd%n-z{o3*^H91u_G?R##v$~_#xC9ME>-G499IPG$JTi(4B>j^IT0m3ieBpG-K9k$-ENP5Pv ze%K9KapK^bBni|n!S}X>KfgOQTUo`{vnf@KYAjD2G)F742uh(kC+IO_B$THs2cgQ+ z|7G4aPH8$@VczJPv2~G%^#hUn$h2KXzx}NIQ`SrcSCP$ZD6fclN7x_yh>YKDUvDOB z({PkFDH=&!DGJ&qpiRLRuKG$@#{NCD172yA1C%J69cghm%M$&76%cW_Gb2qi8IBOs z(PpUoH~iguQl8&Vk|9R7aZ}f-!Sxz6uPPpV1K33rI;a$s+2^>l^{zEe> ze(B0+h`bkkk$uv%=rp#5cv=FonEzbw>E_D(fvXxn%0~CsOx!%z2hElve%!Xy6jC(d zkZM)3ua=({9yNs68X!)(T zM6-NIP{U0|29F!&oTx5u=V-xc#Z;_%IGw$r>SAKCmw&qr9ki%fLQwHfv$a$&z`~rM za8Y@m8m*^3hI?x_f1MghO?B~2Fp^BW)ld~KcI4qL;E3aCER*3igGiCL&TCjOeiEgZ zo09kO>eu*SWl%j(Gd3@BN#Xe@<2B?Ykg@e(w>V3^PR1c0LLo&ng@&o#S`EHa`~)do zqugU`{#{O;ntLIsNMl05wbW!gzlN*+FD6`NzxCbjlG>~*gK6*Q2nZ66Sx9*88+_HWnG5^IKpM`Xwx_;yY~p*Kqqz!MJ(Byq?#AQH zio@G1^wIVDIX}RExQ&!~e6XGNwoKw&J+B8ACH1_S&r4)>Z_VqRk3H72&{q7O9>fzQ z!TK9sRy#Tz8MedL?|k2!e2BZN=yAnd7)KOvvfV@v>C(Z7F%RZIC6JC8do<>ZQmrDtWbKeOWW)QDyEr|bbR&b z-hv4+)Ue%U4xG|a6F}K(32s5Pc0|mFEu8utWqLvEb=0pBavXubM#W3hZ}VQa9Yo&Pnav zD)d)g8sGwkB41LeNQ^W?GVTvG{Ps~E!h{M?ND|%p3sA=tdDH{G6z}RDX--N_Ui;v# zlm#|Vi>~EbkWI2@)Jcz6`YBiX|3UFRMZj^VaBHBp(Ve>3sh1zK2ix&8R(}?CxP0UV z!LY|(^*=a#q8%UZV0%dy`b#cGD9nzl{~>3Q0x_~cJ%US0$M6l z#;SjV=Li~iV)yXG)VeYPUIVo^F`U}v&2aPwpFd;YYI_l%nH!KHQWdZ)A>+I2OYE?7 z?Y{U-NjF*4=B|! zCol8MSO0om{a#2(sa-&8M=oKGuxj1R3$)q@dtSe8O((dRRrfl=mP^;}=mGxLG|reDuKq(;{=LO};yAjw>sGGFyR z(4~(%6;XZOoEv@Uis;6W`?znkg{0YvX#N_|phwV!Bciw}5?k|nJ=C_E2NnIgSk7!9 z=HYN?=!*g*jAP}AJcE{-)8eLc-X`dYFW0xue)cR=j^r$>Lifp#Py(Bq}3D7Tnfn$iWipp6Y1 z30wmZVRY-)GjKkaOQ$?~Coph8L{2^{D3OUC3sKN(EqV?spRfmd6cA=EY6=r_;%7d& z+apfYDf0<1yi>k`gkUBP08YfGlFUl;!Z^ZUH6aIpzd5NvuwN=rKQe=hH0eYA7%0I| zfsHf^Nw_Ug6-h3f4;T9Zt~J>pPHuD^ zGb6ePlY{|fzsV)pf`9oqcuoik1u*wIyT2hpK|KRf)7`%@(3dqn9gSM>8^OC}5xIo82}G{Ghmk+qQe)du zq~2x6hiNt(zSo(v9b==KQ+R0D#eSTd(``F^5F!VK4%hy&{Mc&hJ0PmvXg)VJwmczc zS65ORc%$Fiwk$pDeSdlGUKLe2=OFgb&21HxOSaiqC${WpiQ3S%YkR5{h55LG)e+Mj zur%k*ynU-atKpd<8e5r3d-Tw0%YmUb^s;(l60H=l}pCj+`EV6rr-pky31(xuo zsAN&H$Y1_GEzv^OTKMN0dtH}5(JSjx$8c#pr0Uu3bISu=IZ38k*BXO)b(2$bC?l*K zA334H^@b9+Fjy6VrW}sRNF*Y#d(s9&12xSHb5+(>MjaWFPbwiy?Xn zI;s+Qoz#=q=*715pPc197Q8~yuW0|W3leAw5MJwLA_8mrKVCn^DH)>wB%Yt0 zE`!4>EKod5uYa&~6JK({h-;!46=>)T0=k$O-<<*`CnuGgN;${icR7yhkZKLGH`Y3Y zr)p|&H(ftQQ?Tcm7aiuWKSpikMTC(^n(N^4X8l{;iNZC91a-EdIQMu-+-GE96sQAf zp|N_@Ncd8y2F(o{V```LDv*e~%`=XFJ(!nnSjV%FM!_Og%M&&+uNJ3gHX60=?MKNp z>{ta(T@f;??6G8+NcSC}bmBDHZy$%2Z@ z-GU80%0am+yl`A%Y?hz&wIZKi43%iBKr}cE8 zQ$CmfTY}(a93xUV4j3ISJ1whcr~eA>Ko1>-tIO5=V_luh(9TI{=MoE`38g|yGxDwN z3tJq(c{F!=rlWIyCskOK<9|w0u1N1mVklE|!3oC1op?pS#YF6vO)s-m*Jo9cch=DK zo_|SaUTO_5w*UQ?SD}*L$bDZhJO7Cm44IAi+T2dIM~H*7^!FHhokCp z%|ZIGYbsAhtsRj_g45Y|fiS=n-?I_^$FSFe!AK(ZF!yVM*LqS#^u6Qq2p{KcHWnL> zvDvhinX?zdEIUpt3geod4$tcRqpVJbg`suks{bJ9cr$yJ2hDV|&rkC8s7jd&5$Y-egID$ysL|$5GKKt=jOVR^)y3*3|n5)vVC|xcC zve#K;l_ygxy3^ffJ?@8|k*jvkdQU%9HVxbF3dNb}wz2+95P78E=BJAd%stsP7Hye| zQ<18QJbPNe@tHq9Yy3r}S#6Ln!3V7FkHo4C{Des#Tz$GMb#w_iM&~uXJQ!_wlV$a; zsnfdExB;ny9Qa>bB>hMqA+<}}2rj*J0UdL5Vt4Og-`Oqag=$$=mtb50>J6-I= zt#8%$pF%eqT{>UnE?gAuVcCwpcX*u;joq8+N~m~yL+{;95VQ%l)-2iHkj7(HnsjFo zKgq5#UmtX5xeePX-I?eU)f;o~M`gOIms4Oy0G)uVuXp(k-g7T?MMO?VefkQ~t%gM2~|XGd3Pi^rh-+`4umgXhfycLbq*CRCwA)TkhZ51oafL z5_EZ-+A5?q@wn%jPRCNvGZs1r8Zd6EH_(bXEZJ8xR78HN56rjg6TGjlS3~MnyOMSX z^Yti9<*E-^>i6RLg|AQV`|UfD!zFL2x1TFf78O@$F3-M#XiK~(4$}@^f4^hLR)T%> zZSOe!>f##6FmFcC42n%ME~q;1@(2kJ2pL`Ujvw2^9fqAv=g@0fUtgCM`dJ8t)NhF5 z?so55XNEjZHty8!F1@q!^=>Mw&jO=uhX<@GR&USc+~rRaYTIoz!n zGwI-NSw|K6VeBz=mI-R>m0f@k%ZmIlGI=kMPpIa*JZN+bq-Ir6UStM!B3 zw?YOC^=+E|_Iv>?7yB(u-li46#iQuU->LIQxp9jyaO-_LXgkJGA{^g#&-#!^P zMWyYo;S6U$P0Q|S*qkQPYhDrrbxw0XQ7P8W9SfMG=yUJgZNbt0bQfy>md_~_r=$`VSVfzBr6`;s-A|sVeipRd zzJE*^O>&;Tt%eQ`)$6pM=1e$!7aepg*(qU9AIT8JXm|xD}Jod)YatsAU zm>`K@>`OqMO_r|nq@8l0)h=3{B$iFtYYTC2k8Vv@7IBJd>Miif962~YpT)Y(!IhiH z0J0D_&M)ZtH09~?%TuEpxRlk@3&XN|GE;rZCxzAq@7H3c^nUyxl$H6c+rGYi{q@eC zaNymdp`nD~r-G)!8EaQ~?h<&(GicpVk>2iNpBl+{pWYMc+jNw2QM!-b%20b(dPqXq z4G4_3mSe*|H9<{0fgdQOlr~mABOzRUqh^2qvRx|Q4hS>))0|zNMw?Pn5zGCqD0iU5 zgfl-S*^ClyR~RMsqZDeoN9F~6Cvk#@o^7-XUoIs;cKPZ1jHpJWh1<_{$-0@BU_g|t z$)RBLXOeD3F3}QqCSvniM=izZ-|vT1qWmO%3B>r{dvA>1N-Y564jvESw_hoOMoT7y zKOJI23Cksn3a<#LRX}<_MGSF53Tvrrw|s&33eq9G!C*Lz&RnMOT-VOpLZZH@;ER^) zwog3OOJi1Pz3>4t$iAkHMP=fl|3)$5FG=C@y!So#N{Fg=cf+t~+o zRXLOS2Lnf+tGFZh>hMZGb3e-d8u_`LTQ|Ceq*YdI2309eS6jCXf$NSO{WZ%r6TB~`rj4z(2T5C8wajxE zp_-`mYNYR$TM}^2R&yrSJ(4v)=c)*PH84r0rZT>}t-rkcyiNQ1QmtF>v%BPzzYIC~ z!wO>8?hAUZ#I%n2`dYXk+ij3;(Q=>Kz1OzVTkcd|y`~p?PpA8JT=_h#q_Q7$^P14~ zV_+^M;!~$4?~wVSG9x=|DORynbN#o2jp7ibqjB{QNdT(}-*SNl8=h+Y+`X>ZTt>;K%8~uYYa|BQ`sEoBsmH{l5bkCxzRa za%tyrP#aCX64vDnH&vh$B>`1xd}zD(R3&UOJVvny7I?iaI8~dF*av% zLkWU`H;N5ewGWcR$@Auo(re@TwUgf$&rmKuBSdAwRnoKmzE75B9jwOO*J#{*v;kM)N5yX~AZ$mR6qJTaER^^Kti%FQutJl~{ zz_TUU>2}fChld%Z_juWSGoz@!5ZCs_jaXDB#5I1z2j`D8PHas{p*&R`8Tb9AaFqA&HNs8mCleAC*8$;1?R`nG(*;C{s znBezPY@4gBW86==C*(|zkey&au({a^iA|GGE$^?g%QSJB|yAgD@?)H0`@%Hk2B?_eP4CxBbX3UsgMaPf*j8Q$gaKTP$y%!zrHGjb*3tsI_21zM>%<5bAx(a)N2CD6JK*I zIrKq>f{_`{`j7dysaj}{C+iUc2ztB*oHoVbQ7K6BG|uYp=6m-)sj7MDaw3cF-#$AV zBL#|_cDvgq$tTgGcq|ARSu>yAHD{LeT$io3!qpgBR8qt}8SBfO6bv(2;i1W~>ekj* zdRRgdQuwapK4-vMD#}xYCZDUK7!5p}8=;H3ugt0?_@sZQkw)+mv0u)WK%7TWbDLGg z98c=1>pM=({z35Q+}+yLnA&4$##(&=Cf^2A?L6$o(UWRFrvYgNjzsZ%{zi+rmmXSAFETi;{8rbjf`WC>guMjbnDJTGkLa@H|`<>B?= zZNn-~{5P=q|CydS6=g*DuES~}vQ?@9(11+tRf;DdwfidxX!j9rm4!jRQbA8rJ#~F#i3K=b^`S`mRsAZ_k?Fk zwW5B4;B8Mbhr@c&G4h^MZ71%L_B8q zunA_vDR98dBWa}1j*DSkqY=g4=iLk(Fo9a=LM z-MXLrlpqS)lyYwO^(kYRrQ)Elb-~l$U<7L6ttxwG_p$X94JZiMtgP5W7F(Ato;q`7 zsuf$${_e;A7NQGlnjC^F`#Du_{;GZ-PxqZmINO|cCGj`=7ty247Ydi9{dHeq+=f1+ z5PSU)6s*L}7ll-E(jV&A&EGarTwlz%wKT0U@~XL7VK<&n`aMiHA3bK6wb$1H_3(Ns zKNlxiEL&O-&_rBO;7gO`78Ka*n5}}5Cm>hxo%&|`@sQJHM;)OnMt8H!4R=lDjWT3X zz0B58|5}?HI^yj*;B>HPDdw8V_V@R<*pkHjBo^PZ)TpJ8qw-@xG(7_;V;05l3<{@q z=8x{Dnf+^)E>|*t=Gq?N9(Vl^yTvY4J*sv4Fl(s?r3rw&;58p5dtcKhLGa7?jr;;x zjMc~jnH;I7y7X2c5lI)LYrc;Jc}3>nUv6<6j8P8n{G@+t-1DY7(C^lHSP`P8@Zu$C z@AcM)@Kr=>I#9r4I85D|Ird)1%tH*Ce{psle&=s68%hN1AMTF(iJ4+N!Va6xs)8F7 zy(}lId1>glSa}DZ$p)k6j=A4o)McYQNu?}wb06;idMR}O=W&c5R(laX_=oRicTc|l z%|CmTisl+QyH)sgjXblR{Rgi$S?81zdjFZL>fH=}UcqPH!UFgY!IEoWBOi-HF7KxD zC*>t7Pm(Fm2&cvE*5g2=)18x((|CQK!!ppo@x&Q#(pV-QgD|rDXq>^eC?sGp_uQRh z#_W*n8Ni=loy7j44Y7^7w-&*QP4#(tX|2R}vBR{1Eldw3;Iqz2-e$|mW-Dm`3!P>; z=A(GMAu0GB?coW~FAT6BWrc+gZ(AdBc^>NEJe{t(pf+z0GYm%y==GI?c}K$V>pV^t zwOYF;tvk10ssZTRS0P9yyyTMO%{^K^`tiMF@rh4mLz_Qg>-#{^wkc&(B8=V$i$hP{ z(7s|qXfbzH}U3rv%5lwChm! zyzwPdo3UFAma3}JL#NEpDE0MX>sZv%C^V5vlfQTjU`tO0z2!$7BT(8hE3-~4MO3B= z$MqsQn8?vV?e7q+No976_uc%AMs4|}*I+ACRQ3hVMMo^dULm}*7l8vpz9c)_MfnU@ z4=Zco7U(cL45d+(G60?;Yu zq~uA%*v6polg(iD!HXrv1bd{mV2~y|w#{zNRf{0L(S%s%cpGBr--%(CxC(huw!M!x z@J%0Cl%0wl=t}@oPh@fO^@5pyd}!&j;Rk}js*f0mC5z!uFeZ*s+W)nuM?6CUMZjtY z0)do>|7Yv}zd`yFHY?CTWTqMJEpJ>gkZ_+{Kr7oQ%V$&GYDDCikYpVyVHPa|qd`j) zz}wsMR3F&JoHo^p9Ct9{up9O5RcSkA6adpRq)c>byDdhH!eIu7nkoC4O_&IkVd?q` zP+EEZ_<~cu|K=*)#HK5H!u6H|TS!KZQDtU-$+g(T@nZ}p`}0CL4R`%MC6o@=;9xim z1*dnikRBZ%Xs~w*c{mrjH=+<5I*t-qAQ7`2->}(pbOIFhf@(-wld)~kp9=e*_mgwEnp{r8|WKSW5n zS?WPF5UW*S`_INYiN?l8-^a#Dr6#gptbO#tbw)#LE(*#bM+ag}^Ym#_NEq%(#R@wJ z{8+Ip`c!(27mDXCoE?Xm536UNQA9xs%h3H}!VHyQ#Sm!oKrGHX&G-5#0C>CPmMhBU zTNYoHngzfB|M)e3gDqjb7k+e8>BY&)^!Q5kkv1<(@24M9`8kPGN5$-li0sVaN>6UD zwjGqx`$w6&aWpYK`Nt_JcH{diDx9@3@AFNLjIj6^a!!asp5h0xLRgs&YJV9RGPW>p zm|x(yZt<-VpL#oE)q+t9J3$H*xJo>#=l_#3dlSfIhd#NjzEKPc*jFGsgd>DGC9_oD zLCHD128R-ZjOd+O!Y-54!P7#?Eo?>i<7cn{E`EP+bIe^zQXsmKeOGV?c!!5YjY9TR zFOX*or@;|F3Jl%>*88-zh5k5Se~$`>-5pM@s5{mqcpEn`6c1Sm@8zS=mHG%l zu@g|jeShepv}xdU{I#hbD%H&PN2YFL>|7i~`=KY5?yF0VEp9_(8~)-~yW+EYY>hH- zUw~=?Z4^*VBFW>aDn?H|9-(kzng{dy!4=ujne&fi=za9)H`B?Px3ApgQ^mI}yLowc z_{jAEaj||Q$ZBQ=0+=zF-8)LdmiMR9&G|lnCitY}UE1j2CdrDUksS@xgGAv*nZ{{M zu*2Yydxw0S)$SN-Pp)IXQOFhmwU>h2SG=q;{gz0Ar8W_~ei)oZRu+V*H7iR3Y$-|m zSEaKyI=f`-VT$?p_^aBUcpcpw6<1Y-V|gTC&J46kbUMaj|9qp7rI4 zV2<3G?Bt@>b8VifThZWa#)H*nx5a&qrcH|5mYPot%$3t(PXLU##20t{cUYa`SyQ)qlW&=x^ zEG9EGGc{vPR>HT7_45pm5s(G%NuGsm zE1|>?td7f1Y2~K_g}QnDE}N;nRSXudG;8SxVeZ;86ekW@zboAzU#|Q1KfFG^T>c!T z{qr%8M3!VDj~|P3JBzcV=XGg|#dxU$L-I#LQD}U3=|ArL^JWJz0**3z9dHrC6Xb7Z znDx#Ywpa%`YoM_g2Fe(peZXnt`;i8utS)9*I3@yXa>$d=F_+-dTxIt;$^_H9Z4iwuH%!g|W7Ii_%>JE=7(Vuwg z58vE2L>0d-!1P{^q(Z^3LR2L}$P5{97#Uxda5ISMRI#5K1je+NjU2ymA|iv5vd?5? zIbGsW$wf^XQQ9|@ZFfBgBb6M+WSJYVaD(_)U0u%4(75{{GVVc)MxF7rt0kJ+dEUtU zwr_I(va7yz?snSZpx+(3<@?!;Ew8k{4lKf{H~ zJy~^KOgrgJjO;-p8E)v*x^DnU!9}9k73B^;&;Ael3usqcqt$jHeyM&dLTPAj^qjoUM**06JgFOND62$Z2w@8bW4lLY zN8^!&38@_73g0+isufF1X+CQUH&V4t1`V`gi|7fM1^l>U5rCIsB4uUTeF7hNX#3#T z-kMj6KfU@IuxByl_m(<%9N6P0(2O&@TVZH{~muD zYV~~CyhKlYmXY7V#HM)N#tfOl*&0}!end$90>kB#wt|E@~YUq zr%xxX$)&t|w*pankMg?mQOWv@nBB(2cU~rAH3Vv@cy=vIRaUb8i0c)y9RCgq_(#70 z>Kxn&1`t5J9;A}ILv1^PlI~v`fPr|rbFLXf2y=piK*Pz!Tnqdn6UKMH9JjTXhx+WsrsQy;Xg4JR7Q%Ns76XdM;Ku;&m6~8 z@2Y$7wTw_Ysw4$Oj?!5l>E^cf7RvVy7oWPJ?(^dVSA#?p=PXt8d=W<>fvTpNNj5xV zNk%ruC+E@!t1P3Dw>gwN-H{45bo&pfh;oOwtKQ80X}0q}Bb-7SN5CeWe&?12eYnJ4 za!`nDX?xpD3X1#*7=q{EI4O`|uXjec=nu?#eepm`T!`Z4ptcn07(v*MW;Ywf>*}ub z)wj;1z2w53kUQsQcW;-Wj{9flW(En1hVUHQN0@s=ueWtbaeBbVuGX_PlJDxgJV0Q| zPlL|IrB0e8ll-I3fozDKe;TpK-EPf?NkJ?3J_Not7_%enrL2*fCuOs9~7zo5s&{ZvsL zI8ti-7i}naGbYk=y9ak4gzb8Q!9QA@p43CnwA$t_-$!dkRqf>u$v{0R5h)Hf%%!jbYy=yST43` zxA8aEiI}xEvf4G?rAwDr&5ewDG2^XRXdfRkSV)P7vj)FPy#I6>6mq~@x5{l=Q~sJM z@HvDheVD&4lqhXSomF0(t5?6CszxDDzl@}r!psK&P9tjWA@{k>Y%NSdA`VLkQaPC7 zK6oYeJwS*xqOd_&b}gGZhQSDu6c!+>7{lvdYdYSINUT;1iH#}u6|!kKT?bfVK;z7j z6l$=T^K=%;Q0ow&Bhf!O21D^jIW53qXAwtbe)>I2-IEr%VwBdl1#hh)UA2Bx+X7)XQ?n_rW;U! z!M?CMZ6QM7AtI`xJ@AH8y)!EcATiI;!Lbsa^S1s#x=HTs5#{DUh3B)p9bsN9hG0p; zh9xW9#m%j!hQ&k|%0&$K)7|Mx|Kvn=8s>ETiQ$H{uT-hIC`i@>Vdsdj;X+0CnXZYnr{7z={9uL6@B4t zgmDu7rZCZj$8q_vk%zoiM(;Yk4^aM0P+}T6_;$Il`|mr&u4R3`Wj>Ct?I4ct_x1Jl zD@)Wf+Ydl_SNd8AA+E!Kbq;FG)Y4XkI0|_F%5!MocJH#T4!Ul#BuoSZ4y&OD_STG1 z`D|`j&ms^2=+D!dSPUgY73ATz!eII%jzSZz2k_n2mHa13H0G|7V41+K3ObL5(-3^J zafE{K6Q7@6pLXve!T3^D_%rQvUXwb|^KYO&+0&cDJfipB6V~reF7-6yup-FF;PeKq z_|;cs!3|9cg*8aTBd^>0(5%+bRwyQ6{<1DJS&>954Q~MqL{C368`!mrZyVX6CeUAc zqNLK!fh}51dCoL0=*MO{Foh3u9owC<97gm(hT0>WV++%O1`H|qcz-@xhrPzv*?-ue)Y<^&-rnkPq zzr}KN`0<5EM?c;!)RCX?RUK{tWz6W*1^TFQM(VM~_vqskEr%8r6}`ZU;;^XNBUD@Y zGBX=p#C?4g7w!0JV?7?HOIy+{;x-Zev@A+9BcK#)7{)Io7w#6u%*V&Qp{v}GKRj|7 zZBxYHQ(vTf=!`}HnPPwcsW9*Q^`>zVNQE7*Y>Vna-zS02DfyXU2^G@Fbix)LuiNxwMbv|9@s`FwXfK<36KDu zzVrJ(X!)&76X%KvFHxGCNl-~)J)LMOH5T&|+8s2Yba#v%?2FRr)W4}rgTdM8cHdX9 zsc9hs>Y25$+6aooEZCsK@xN-V)hDg zX$8FPIQQFtAb5?)ul=Ha32KWc`qyMtjjE6{Wbf$uX;@Ej}#`2V2q}K?*ptAP3(Mf-VTp+W3uAo>`bg$a^+Y5clrX&DYl$5(G-`MRB8Blvz-b)9~CHp#%P zWW!@({?}qR)H@Hdse!v)pP?BChWFf(* z>384b)5?owM=5g<*^K5@OW?{);Qf+vm5~nGwKy6FE7Hhi415V(4v=eKMIeRCI>w=R z0<1|U>6pV831(@xFoS>wcpG$k-Mzjns4d91N3GHAq@lhO1Z{cY)p}xFS)SbdiwwK7 zUIA?Y6+9THv9P&}Z5_@< zihTc8zQtBEVxDt$U)7J4hd{3FZ=*W*h9kB|K%>8^8!9v@j+4%q$l04%N0C1Ux6303 z^xj81-^BrT_PcH-T!$WcAW66%vV|TLt>CZM3no$F@)#%*l}}AzULZsE5mtdvrBo15qX7knE z3hXA}0CsR2aC<$H`5(6umMsc*_Dn)_!PfLFUy6LS37-=St$^T!fdqo2pc;V&jUf}Z z4UtNOjrB{X+Gj_l1)4SFKWp#HF>8<{h?4$;tX0%p&ZC!ifGXVd9_XO2GdDgb7{dPT z{OzGB;Q(9$XFdz7yK4U_E6)bo(R|V!7EJs0aZ9+>M(ov3K`O({F4rm1mk}gMoEA_R z0G0tOTAD~~sh$vtLmeocNFJ$DNE?JH9t1;UTBwTp%M`)G-R-P30V)$>Ok4B6k+_bEow)J5Sj|HdyezE5ssX0^-6sM{>j?^c`e7vNs22?}C(7-<`xpxsn$kvNB zNJb2uuJx4*ca@W0#Yid(<*BtHCw?WKlkO z5qEpHD7#d#rqf-E$7nf+=S59a6W?(l?5!uZrW~zh#CDC(A`lI#yP=%biu>cFy3@Di z7hFHEkxb@N&x#)8+Rt96TA{2wR;g3<=>%_;^2fxaqdqTo7&{(iijVL+i%Ur3!cG!$ z643E%vx#*I?0$XGI*wOG;!qv8VVq~%ThBwC_~c)5IKNrFI0yWytLT0R-?G6IAMDF2 z{uC%)`6ep<%KcO-mv=YkZvw|L;ZxA#r-9YvxpApMmLDx}ceQ-i%jjo>L1-2cA%N~e zQ9&bk+!R1b$ny4`ZB5824pO&iZ;#CKdu$zyQy#85ZCU^F?m_r%5j-AT)3=IxyY>T$ zop-7igYP@`2e~d3Vmf?lXUEO!@L`yM$-}x(+&a-=T}-tJRe&>5(K$zd({TPpQ<-aAMDnstX=`1SnnZLpsAwM zSGlg)^ut&vmw4?aVJ@4$>5jEA)uZf-g)Iz>F5AHX1M*E=qTn?SsQ@zl zfM~8EeDbiy!QoJ;IjKWX=pbYH&&OgG3Y9g?Be7`M#14K}w`KH{@Pj;B1W@Cx6}OIY z#QNn;Uylav)@mOLUkV|1fqP8-z3fC;Fg3hiH*Y>NAB>}jd|$7n5fQ+2{1Ps_E@sgw zln5v2r@01nVR{jBiDk*blwDs8ql4BrqF%%2 zV*?Y=IbV>_m&+n>MZ<72L?H@J@;2M58x#s(mWG<+dzbN#GSjp zcZrA56P|m8Q0}hbM?vv42t|GYo57r`1^aRQ*#?-UQA`1is?vM&Na(2g0d4UFaiOYB zNyv-^zkMr@7%0{nx9;i$7STJ)A_|7Liys^LyC@oH5JkMV;5v5+YRqy3EgeR{8}aW+ z&60U=gmUa;4|7m4^hjiJ_T<4*kp%QW)J$Xq1~>@>W$_Xi*%WkTcKQfZQIt^s6A@=r zx`mrsz>Pn@4^v_muVOp||1K=V1$Z#lSL=ug4#h|@zzTt^A}f;gGr{~i5BD;+{>@O6 zLb)JDYX%NZb=|{ZBtw#Z=woBY|MT;Jr;;=QHWKlSCs&O@`M4gOH2DtFjaN?2V&_U< z_}IDx`GZ9Tc)?jdzk}Q~b?wWna-wuE18#>KPg4uKz8y|C2BiL-lH`QmfMt-&un2 ziP1_30}-lnV0Ooma3XAQ&*^Yrab@c`rubaInMtTOR*F-RKe8XnjhMRKG!zKl`yv_! z^}&J*7MLVT3`MVb0d+_4*OG_WpTOED{>Dn;!BDg_lmW!2Us{!9k9ZIKhdgsCsu-y| z=qQ^%DAOx&hkP0dsgOwS>sNjYKX*4+gWYC%E_pKS_hk--vhMf^3J*?h59^mHXEys> z`L+yGI7jPeXpX?hX&jC$0@(e;K#$(pAi|0t54PAP;r}oc?f0P5NBK;ce)L*%> zN@dpJvPKC9K{c9KzZB-l6m=ML$I_Q~e7jNmK5D)R>pS_6e}w4u{x+c3Pf@NZXnfkg zQ`P8X)Q+urs8Rd(d2Ru4-O4#J_sb~yC8-i^7eh z!G$fP`CSo2VMUQzV2ny?Op7f8U3&GkqtvrUEl55IF$=Op{2dUudFIK|K%N8-(>nlf z&_T6@4em2o@|zXuCMQ?6A|n(9S&clD`LPHQc8s-fgSOm%-;au0ty!f+`gM)f)oYsd z1s^LQ#W2 zxN$UCvtSTWBe1o1K@Q}MNu7FBGU;EH8TOXw?s5o!{yikM!%VPL!J0)#c1Q^&43%S5 z^NJ}fDS;5QE8HM~3b{r^PHnI&II(Z;aa*4{f5C*ay=MxPg{4T?8bV3Vt97L|u`F1+ zrw@|S6I59P0yL6At9;moIMwyZ1>IL|=+cFIZTBezHL2K>e}v+XNui+b4|{v#ouyjJ zT%ujk???43c}$|Ugjt?HPMPtC1=+(Hs~KIJKMK#9cDYNi2Wf*V3Z+5ol!-Oaqj z#>G-HBjQMkZx4>RGC$MEP-K!!gIOrE10L|_ZKI|Fd-Zg5%KW50ee#^0JM)ZYh5smR zwc*_icd@p={o@N0KFJcs-|bAG{5ZG`|B%0YADqT*4;u?1QgJ{hu>p3+oXsAT1e+D3 z#1g>>QHJ^AbL3G|LyY{qQ@mYyI6I?AE!^}tVMBWDBUeoBHkHpIP5seix9kZanU*uk zGqRDb6$wgmvXz6r7(E0Q*42-^T^Be?pz;8bW;8%aR;Oj=FCf%n7kboAz=3yeaHprk z>-!tPAVeJX2F-=tQ^H4S0+Skx5;D%Q08XVnLnN;p7Ti@K0k*w!v77N1l>aHhP6!(Q|Uca&PF{e`ms;M zKMu(fH$FZlepnC|%zRWUL1)XTTq6rRlik+ zq@_^x@{OyI`wY6dSDD+v42;cksKY6`KZY?SWSt94k`*y zp=4&lL-7{Ndq}2LSV5y!j@QL^&4>eMe9u&JIg~Ez+YTZ-`vVcCmkg)Gc_O+V_!Wgn z40khGK-Ki1*v++tUlw2-K9NFB@(5Gc%p8^6x;*`ABwRL9Y=v^$OUeAxyWjL5>?V>V zpz~{!#tk!T3zGM{*}9?1ikA59)gGjbgU7M@J*I1XOW(^mQ?!cZ*|x7g?_&j`lg@;nvby{5-@;Z@6kC`jQ{#*k@^iaOp3qj) zmsa8r2DdfU4=P+)vHQ3rw;elFEdi;f%%;qkjkXl~W+O>DrqLZw{thaTu1@L!q zA&_LijqS^|eod8{ni@eq3+kF+0x1ca{zi(#sn5x~x*C9No8Lx4tz2^NV&4hC>IsPCmtaE}seD}j;*`&JG7hL1b7q;Ojf{{2M^|DX;h zI5YNb@w~St_ULb7HFQ`BgN*#0AR+o8TtGhRD)V)Qz>3QB+aTR+JR3kP;PzHAfkp?9Ng=ZeW02Ti(6FBK4t|FiRjzO2ErGNl$ zebM{I7b=c}(*t>`QK9NMh*~WT!Yi-Al6Fs6#)Lt*AIe8s(6M#Y!Bu5h1)(YUw<0wH za%vf&mjXP-EXLk}1_rm5nc%Wo5mvCIVk=Rmf+s(Kk{3{dJ+qeny?}z^BF(@z<#ngI zsoUb~r(~p5v$so={wQtzOL>rruyEvEA90XiB(Jbb;$8&lQMi9BAQRu9fL@be_+E!* zOrqZ^(0=(I8z)s^1*V8zMOl)HbcZIh?urPKP#a;Mn2s5aRx#1&vgkk8HA8oXX3&-1 zzJohjPFqKu{eywAWnL?H|7_%~W-p{8sgjzNjcJ1@jkQJ?aj}HeL-1Pfp=RBCl@0zM z0AxU$zrvDv!hiyVCW%DQ1NpfD>6D`&;yl7QXRClxN=SQv`V0ElL(VYx`wcFW>4U`B zxCTIM4gu4|R~9OPP$(FY5GWNwVF+eILSB5}h8G9!^78}J9wWFrLLvblck%mqjhrMT zkLhuyGB9uAB0d70>BhCt3O{n|V3t5QfPRWqH~hZ;Z^=7r!~tHk9?nMNe-MxhU>H-# zsCv=<9-!^wDhI{uWeBKjh^d%*LG0DuquE;Rg7#urB4!?pOGrs6Lk}!70VRR5W?F5m z8XTHlqI8`nbR;2ZgW_yHLisvz%F0!s)+tGUjoNo-`1@b&9LS=>$t^8Yk_~ouaCZT- zo)iJ30HF#AkOGAO{?8{gp6n6sS{&&d2NL=`S-_5g5TmvDYKNdanFD{%*qHz(f(BP2 zrydA#7?Ee20iv4v4@POk*QrLgiMr;QHn9mFK0`23{^8vrLD_;r9A zk3eu@_C8_hL=L{1^sA#l+r#EvygfWff|3IQ3?b%N>Z{z7=(ejj7d!-n_gUlgkcZ7fe)r;*g9yVhjOoqS$WK5@f6%Qru064`? zaRA@EgrHS?x}PU80V_e*uP&aB8mVR_C{7Uwf+shc7~YwVKr#d|v}YND98nm_0wGPB z5#{jn0p)<`TcLC+B4C!Ywsk|?pkFyBwd&Qy~j+;?|V z;xv3Ugnw43Dy8(+eNp>LP85eghC*wmH=}BOBo9kPA@eWk#ik|14@?E@g8t8k*~{-*#yvv7UQu{_ z`d}5IfDJ4j8d-=FzAy?q-lU4^4pATRJUtg|;=jEygV;t&CE#`v^d3SUj(3^)*NF9& zUiTk_fIol<%@6xNj&xfWg3uP7MAn5z2=>Q4>@L$`31c`{loF_j@__{FYsEiSpUul_=>P-v*ecKLv*JsQRd(R>-)M>kLzEYmsOmCyS zFX{;<`A!0&`(W2@{^>QMNeZgGWe$BW;%~^FM2NT+F6e=^5){6c=^S&-hJs)U0w_j4 zRPv47K-wPQmbeTOs=PZlyvW=;3;=wu{|?sXcOf>_GMU2vUKK zC@&ZXRS?3dNnQ3jZjU<+y>+=D-{BqPjnV*WQ1KWr9Kb0V83Fk$Im3rB<3!T7TYK@t zhdh{Um2rl5d!G0`Exq+-V0{`l`Ic8X6AT16e@bD1x}VpVTxaTBKv7AT%P|}G!NMeJ zYbHJZroOWjfw-t^ro^`sAM$)GKo10VKg(h8frsXlr_lhR|9Ooh!hG95e}3DI64Vgn zeI4vz5-Nt7{(DC6S=HFS8TL=CH0{_>3Pkx~d_e&?er_g(S033}iAuBrp@7mr0a|>T?T4mbR)d%)lRvGlIiWE{HGR z_zk@I$am2ArH5coMh)Y7duZX1xQ2J;NhI$SBPCiFj9)J(lccSvyfJ5K=e5S)dL zcKxst9CC3UGCTOeiQ3NU2O0f=wlsmr(n!+HrpZU_X1p02*kzqC70mhVo>#67p0v~s zOu<>WuL;HzCSEMLG2AV?OFHuJA!H^1Ia)@N*{&B|dNctALss*^&SISQb=>{{t9WzF zc{o|haP|m5I`V8qnI{a z2c_6QwR{MfSyMF$gD#^V@$mBXVrQ%_nXqr8GEUg#SGE;|0D=HPfW%OWfej~fXXTrO;He(hos<#j1UQylZwtZfCW0IF9RjsmZUutbk|qyL{owG|L^lz zUuW6m3aL3O#5%!{RQPsl%^$SB($TdPOa#!6clHomZEZdv2qoE|}j zDBZ%1avF$bpUuA2{+|-4|8%3R7cJ$=K! zpxk#IkR7WZnqI+&+&uKM%6s{^-1HLDf^0$uF2qmy!24hr5^iv4oBPbb(e{XT{m^`s z<~DJ!Q1o^73i=50Kw_bYDk+O9gcgDj1fUB7Ae}f^`vb+_XLbQQNP6NSyfq$MKr|i? zvs@EYg6)vid^lry{kn-xi3IWh9JdTH?Q>unBg&socs*~c#g+y~tw(UG_>WlQwQ~hL zK%#?~l(8`MU8A6KJE|^foyf@+dJ+%!GMLxg?9SU5f%uJG_)ni$`| z_&Y3nBl5#x5Onxjlnwkmm<(txb*MpZu+$i0Ax3^bBt!^>OsdN)NL57@MHB=h0|f*$ zq?1Zgs{kbxqfHIfcXf5|YXUL?n(7iSxp#EN1I^n#eaE+kt(>F>j3mlCqDq_SqTt=h zQFaKmt{I+VP~5Eou)W8v4FKM{Q8_#O00Jz{nmXpx((<9kV(P1u|F_>E zy55P`(zcm1N1xd+8`M0;OT2jqC@sS?$bNb}k?ar?q&#}Z3Gg9AfcK|k-mMlYPJ|KDkFf?}&HmXS1OG560Ft&xI`};Y`|8YqhWC@Gt zZ?N*@{(>NRau5`Md-^Iu5hk8#RAT}FVGs;s0#y~L`~X1HItT$^pk=_T7%Jl<6LAd; z=Bq%Lra&)hz-fvz7ZKD$yTVB~pxjrnN02G1chvM~x2z}?O@v0N6v-8J@&gq4LnlsP z70*=C$HYgJAfOZUL`19V-|^SXA^Hqz_Pu_XLJ;5O5i%lkTwxo~a2b273TlSryq0~<4Np?tjF*FZD8`iKBbrJ;edbF3C$`eo>5OhtV(;1 z*zt2;i1e3ifz6Ygrtv8vrx?pw%e5;5Qjvded55!p=Se*7FjgBH>E2`U$7ipQ;oBw> zWkxhPPdrDrd_dda!7QhBb!iqO%M!?Ln!@aGy(k-+{r z@mLZ7hhY*^O7Wk;f5q#-P78gAV0wVx`M|g#+hOl07+}&;keEnFK#+yA2pUS|CwKGv z17Yp^L)vT19(A8Yi&(@#9Wr9mLI{k?vr>EH91FXgGHou1#n#yDF)O0&#!9OaNSfZ_Af-7BvbMj^<7vFA6?SlplYdh%>_ zEA<+N7mpb-aRC3H-YPqewUe+u+jMO)U^GDk1{aaod5n@npog+iq}#a8uX%!Qd6a*$ z%0r*YDJQu9#QrOmyY$DbHFL%MG=A^7*2(+dvw>-@zC?Y|UZt?RCLJmSJ(fH|i zC_#I`v)kn)^J>{)qJSZ=F&+FnhN6dE-Mh^G!J~f~EAOJWfwBRB{9(S@Xs7m9;hg^l z{21%QSMkMjUg3fCSRIdIJIz_y*l;PK7LKLE6oNzwC{Q7xl@bG-kL0Jr&;gIK6k$8f zSFZmI@`NM>^0+we)WT?C+eyLSVpD1rC_4Wi+gG)alBODA_+=@>CdO;y0=e{0y#1%; zYbWrL0>~v9QJv`GbBQcpk1u@=PO|YjF|ti~>Hf_oQ(MVCa_%vP>FSX2a(t}ps_Flyd9W_M88xSS)S~`HgxUab&=lXix2PSqF%%$U>eFDMpDCk2ABN zCSj3xBnbfCC?Xz#1J6P}u6Rx2eYrkz9=IZ&tbqaJOTvtD#uc%Wcdo>8Ps-mr<)`C1n7pt-={YSgo4EF3kbdH28VY< zK_9Q@QvPXs>`@t!xI?CCn)ofQ;{|-G45{aDEmD#52z$%mq6|j zJ%sU;j+`&*;(^Y4CB`*&k2kQf6|w_{U__Lujf9}$7qheYB)wQ4Q|T- zga?oB2keOxOdWq1KA1sMniWUrJ>q_)-{KoX#s2EyQ!sAp0NZUuTQvE_O+*6_5W)&}om~XLCvg<}P*)nEyyAS= z`PY_*A%#&rGQd#jwH=2Np5cTD7$hUsVp2JBE}>)w3BZ0k`wq$4Nyc&ihy3SxtS#r` zygE>v+;cwL^&XKw9>B0MsX+-aQM4Tf>!3r1m97&G0Df)7Df`Law!@Mo0A>rc0K5W$ zN*2T{ju4P2X&~Kw5GjWwFNhkvbWI1D3PKu=+Gb)ntRGAP9YTVEf*`MQ)6!ek=1Y;r z=Kw1i2M{p9X#ln<2_Y#YmG9ZX!1z*Z^}*a|e&P>LU*PUQyOXaNOl)E$RwDrX{el2= zjBbbUO4-PG8~9aKaN__S-q;|;$R&^pvoL|6yq0PV5=MmN?f~mhT@M)iy$7*62j(CY z;Fe^N?nq#XNf=;4L@-v{t9&rELEsjY7Q#dvoq#AFS~_olnDFyGv&;HvH3tZ%;O2I_ z;9$eC9DObe!9n~sR{@z>7jr>hf@E!mwo)mha!Gs#BM5usPn1wudZ07wK;BC}xx-~EVKq)zf$`6~! zbo;#_KhC|Wg{q+|2_s}numVVcB_yi}m|YtIvHMJD@*)O9o-atIDw5)~5n2%~EIvi} z8utfxtH0y}!F?iif$$n11v0o^6!xJcIU%7o%LUNX+}wfJp`hmR2CUDbCHUBxcxO*a)e@lYG|Rm!@hYb z`(?x*tMOf^59CB4<$?d>2l%uqsR6})d>;JLmJmb3sV9`kmKV_Pl|Qzc4$M?M#6Xc# zzx%S9W@pFKGy$U8-RtXcf>|+w35JYTB+}Q_r$otfGS*ko!(eboA$U*9Lw6AL@#yto zur$XpK0e27$|z5eA;WGdwk1?LuAc-qA}2_w`z6{wlZ|Q*FS}*-QA0=63xU-mT{71f zD?)*1tKsq8yJ;&{sY;=!{bE@81E2?xM#FyjPSNCbCwN*4cy|YwoB^@|BN04;L37k> zkD>;N2k2!$RY_jJ`NC!l%)!P`MI<`_MbV=Ge;fo$KyFgFo&wnL9Zx~q(~0AX9%Vx9 z)+LrZKkUa`4^LaXw5Tu;T+lg2e#~r{KpFgqzTzivUSxIdiPyH$ftcwPZ=s zoQtu^IF?Bvt6Gc{1Lx{cu7kh~1WO(8@gJlBq0`fJXcP`9FbMK-M8YH>3?)%R1q7y+ zO(v0KMp{xU5c+T|-KG;RLwZ;^dWthWpw60z>kKd%xR4yjUZo zD0Og+hr%b|sb^C(4FUa~Igc$`=7xd!NO&jUUHrRNCTg=dQp^>BIRM`x2#CjlPNK5{ zs~U#1OjMry9)Y8hO>Q2d2_zU{*{*qNU=QzH$~){W#_TYA`v4B70Pqg5WM!&SCR;;7 zFedO2FuMqxP=N%e4uf!U-MvmBAFSf4XlqFv(3Apo(q@_3!O%>^A)S!oY#a!P}m9v6OqjbrJYQ5 zD^RFz5y}8*>J9`H5M5VUCa0WWaQNmy69mjejS0As+M!75m|?O(*`c5*Vx=YogpimfN}2*bVZrbe1@7mxelvI-LOlWM4mjexbOTk6 zlu&6D^5DBK&rpm*1WE&8+sDRBK;5`JX)U^d#5vF4=BR8yrS*xvC`k$94+BZD(JjBw z2Bo^cQDevg2ntQI4|jE45N^l1LZV>dWrPiT^daXOq=1$y%fZ}mH=A<(lh5pSes|Fa zBFVPi_oqaJ$8oJr+aQkzm5Ul1L~NG{zlvsXD;tER=SkprueZCd(0*z<$0%ShL2ZQPZVZ9tC87JX|s2~974@F2SZp$*K9v?W^QCyBp%GkY7c)gG)s|=_VAHW=BQTl!u zm8dq8yG(ZPLD10AIfmg;eEA$0NId03dVEQ^UmNOish+nVKqsnm^EV zQNd?FO+JWI83}{f1~6GIr2Mnnnx2|N(cW`kTXqyk?S|fvF^6ZL zqL+jr=SnDpOd=ko-5i~-Nwp9#LJ@}Z;P!kkXUh%y^!jjaTzRi;sM~gzwA<2=-XCOY zLPa@4(#nP4{9pD@)0e6Zn8g-`gcV}I@O(go5);js1u{@RfrZ8awjqP#r)%OPr~#p( zclHYS=kG&MUuUb$xdX$21HO`kBq1c*Uk)6Vrc7K)s-~!iswQG&nf(7lUbn7~F(8oY zSCU>(uQW@CvQ|u?>s<<10ApoPs0(oewFiUZVcEWrVKXh8j+CLj4L=`G-7X&n zuzYwMls93MpLyBRVG0$Mh=<3YCt!NGUWjr?2hXk&)f{4Uh}wz^zhvjxxi$^kO}2rP z0r+U3GLsTDTK1QE+g+_Y<4~{r4CGD8{oCFRqErdXD#>Fx$kf{FK<0RT;vw^=@gGs1^z#6kIt2#D zXM$5r7*r_SyTC02r6mM|?)BGie^7L0;M!7DC@kJsDjLKN05L;S1b-5}ox12RNlaIw zkzUQ`PkBO7#dY)mP<0{)MK=^7VbF*vZ&C*v!Q6UKN+_V;9}@2Qm7E^(1^V-p1xy!P z4^vuU3{sMGkYX}>6R1aV0qKww&a=oH$n|+acWc-bdD~LLgO6|lMLUZ$5L=|_NCzyO zHV`z3g|NdYAZh(G>4>Y!e|ePdrd*qFf9tvm{oyBXb3b>h>P0A!l7YQnQ5U6fn*WV0qul5WS~6~P*8-Q zqY?JfLoi7GkIj!nDol{pwT-JMoHd)WehlxUTmzy(A}l4*MAnZ?4UI?9pB;@Iojlnk zd0PJ+N2cZ0uQ+jv#efo-3HUCeBU;|k%Osq-Q^m?Z=)X5*f5~d9zQ@nMD%DkskBu~- z<(L!^QA0?r8JJa7QB_pcQB_q{6;)MLR0IVT={Oy**FHeJPptXQcnyz|^0 z^7Gq%r!qCjs2b`oW~S|N2UF6XjbQ=TngpcAlxxl~u6?jQ9)vg?yed=9`d%(fT+|wZ z<_9XJPt8MOXg(&dpu%Ke?%&(sU{_wcRoxv;2<_Y7j@wjTtl^r~UQEiWyb$y9L)qjT z<&PK6dee5J$wc@4*uSx7Q2l8f!ORoFC_K(O3T}Wo^7ErYVLQWu^{lROQ6xZ<3$$Ri zKXYn4aU}#GFSvT1ABYe(2#EYBca5fG`X|-AHn1Ou&B4LjT06t>nNw(^)G*|QkIG;$ zEk;0kaw&R)Q3B%oJ6DK!%J-E4K~y8^7zFBlAe7+A_1%|5Q=dLzga{UfS&k~P9HKJ?;@b68D0Bt@}b765t9C|stYC`HLqmFRmA#Du^@%gY0c$w+kUi^toiyb%v(BCr*(7>8j5p&W=}j&`4X+qo;g-eZhxHy|0qB?bf&hczt? zy7p9LeYhtSTsH3?HuT!F`F0zDorcwn+>D0ZjhSYgbDHO3Wr;T#O~p1Lsdj43 zaU!o)H=9=HcS?XrW2uL%G99E5Ks~r5~54EZj=`e1v#=!4D-gT&Xl%oJp z!2qL|6BGgp4hIJUq6$OX$Z??bklsm4lJo;)Utf8%*f?M+jqbfOusS4$x@= z3Ooiqpafb+CxwR-f1cu-MZg6i8UP^x*ywZ`->avk9ln&D5PF5cc|7c9Kn`g1Rs>bl z)^qx$(v(0@DZ9CJ0)bP(>hrHz_1bl*+ZFKbIRkvw)S!L$?H+Xa9frccZcZFv5Z`I* z*@`iC|8L>ce6Bz5P~2| ztTtaduIN2u?!on7P4*Oqu-DmjPKEC z$pk2J6z>4qmtfc1B)5bED*)M04h>$Agp{zdet@CbFqst@bo@zmH71VKm76u9DlYR# z8vvKFW3^#N84irsaazY+Rzf>iU;_@Rk-`GbKw(2j5d(xLd(Y>L1^VA$L2p@JVij#8>9%EY-SKX=synwxnH!h zR0;x`1cbvd^JcG|u!q(Sf%0&lqR%KEK!7RbgSMM5&>2t=^8`@z#01Eo2M{F7YWvmT zBnMy4I#9F|WkVt-v`=^ekmj9_Ku$4aWKJT1tb!*!%IVx%0Gxf34SDuAhZAl9YmXrl zugxkaw>?YURZ~G0v-_%bZ6QG*!;I1XbAe};5GAbP$+$;rV=ngCEQlUJ4n4{rZe#ae z5uYdo9Tm_z8<-C7DU+A4-@9ct9UnNw5oe%652buUs5L}gd_)IQ?N-b8#J8D<8RPsCpagORzMv(XHO9ES{RBD zh^rVQVbpvFsZM9kJ!ZO{xG{kpaOj!m<;N6~Nz3HJU}NA+L9Y{PW*187^0RzW|8CIo zAVR1g!H!KxAn||E^kALVN$K)^U6EG3Vm=oF&o49}=m$8^-gy#QTzCM40issdVeR-K z^1vdOkoCm^fcYRFBCW*@C{ig{;gHbS?$F|X)9M3DVY`FqhA_SU_kFny>!pN5i1m)~ zDEI@X1M5xGe zF&)sOF#mq4C*#`)Yrx$t^jS!LEObuq+Kqq{vHi4ui$Enx&6{ef4YZI)ZU~4 zIBFr1qX=X}2yW%xQUUuJ!y>jQ(h7*B5+ zPEI9(=JNrO2;(xc#Fh>f&^r%a^M^o@|A|c}*lYPJp|L4v=Jl+Lb})GjddC0-8?-*# z#MKAkyPv{E^)p?=mUA{Hg~35c9-NZm0-hTS0otP!3(|#nW91cP;~X z0#QNOA6#Vc7$E?I?T4d2%+n9GJF|X%12ASX4`g5&9;Oa1VWFX|-tS2Ik2Bf5{RYIyAwv{p9ZaHiiG}A6}o# zfgt@zNDryL3%uv@S_%KE{`&vN_A9&x?|3u$?GN+bQ0PtYzPdxuLvii?94w5IJ3sGm z+w73}`nt4NJezThDrCp__w;&|w(fT@B`W^VPL*L%WGj&&2E@Y4Q-ktutO4 zypI4vi6$&;+{ci&{9+B^KG&j)KRLv52>xaLx)-CW-;_<6(Z}xZkos=r8$aqCZ^u&Bo(Hb>81nVE^&jIMH=cpAe^MU~zwBOJ@!D!0c$(9Ia3^Pk-md z;nVR!N>BTuZX@5q&yb#o{GJu4ZUFs#rCaq%&w|(gO`v@cp!+SVjQveHYI-PPTeBpE z!UH&)kC3O;|31(?Oph5*2<)s44hA@qAR+$df)ol+6fq=!5TX$%MwDqtgrj^5sR!`G zlCH{-A`iEpzxejNQ$b6x5^wi1WYHV7G+U--AMxfro`*T-HV%=`SM>kW?S;R>hBg}B zrrGW+*b|5%^l@vmRO;Y2b5lP2T@xkZ4)TaMDqTC_=EBVolMRn9lEPq3X z`FP_c`z!Khxi{%P@7cN(GOWdPFVT(6QT`O-Zq5Zn)PJNVMJbL>qo2poyL5G&k3O*6 zzI8J7Mg+1_NB71IuqK`EmNj?rLdg&@(VjVyd`e}W`4mp3%E63n9lIuv59>oU{`(~; zh9p^m=IafcwkKj86FaZ`+= z{gE?txrIxuXY){%f^Ow@e3U$5+U+SglS}j;&|j)$Zp^By+75<(k8Brc=N0t6A6 zy@KPo)N&uYwA!Gi~Fn{T_HL&URs4Cm-g|6RI3 z8Y^)QkMNI|I?(|pa7dB&pXhdf$lUNK<76`w@^KVL3wt$FBr+=05F!L=!&?P>)Jso* zBt;f5+#m{5J7ha^nHh@z1WlaxcIrN5oT7=(^%tp=?&*Nye!pM$2KQJV6;JW^ zEfIh7&Zly>^Zy??S$EM-6ueLADgLwlYt`hUzxbam6R{ACg%W+=o(v>Xz3_6R{7(g% z%l+^9aL4NUy`1&7#E_c&Kal6zG0e(#JD69P!M{^}mivFsLN%#ng&s}k?sng`6)Rmr zMty1_qy&EVi^I9~3QKo&OZ$<&T*?d@RxICpYa>leN{nQc^809czhHHH!-2^Vk0txT zhTKwu1#_~ph-Q7fHj@5t!NYUF$M*jDe?R#-zm)%H;%fAlRbhvi`TGBF$bY2EyeBv4 zckyQgY<3~^`kyE}FEeb03UW_0nM;#8gNv3nOKWn}u_hnK&+9IzA+h|G;MLhE6ze}t z6i5qFmHcz4H`Y8c(wpl34Y2#Xjp_V4B_#`a+kyoC_`!VJK9kC`JcK_nv}juX+cDyk zrV5Vl_&h&*`na{#4i)}J?D?ticsx|@AFsy>+KqF6S`QqZlK*;VEO$(O3wKiKbqRQW ze^$NoGQVYTj?=?0OH!?^Y)fE^PX@|$?C5!_WFqZT*Rk-r~JG1|6#L? zT^Vqy2B=*wJ^m?2;O!ipwnO(B?ANi!Z}R>}kFfZo+hXm0e_wkra++(_brkPS;%%PN zpDSK@zbT}2+=+=VOI`VlH`5FD^Je*DefXFm_O3X_40Smkx0I$PgInFv13o^lj8ND; zcyf3CH(NzqpSt_htGkzdZ{V7smcQ)ZkAr@R@6lz{ zc|p7V0rR)YXb}%u51?lBR6-5+0zzTDEZ%BfQFIQ35c_z$$$B~;`JukXL5e--mnD}G zAN}M8rWzYAQ!n@OwuL`1lKS^ode+WfO2~Vh&6*02yjdD2GiRSSIbrG(>aGzKSdXWh z;nsTnzbDXYw%Q05KZ@^u(*(Y(UR)?tM!7e>%#^#il_$kVr{c@aKZJL47WRB2y0_6E zTl&80ecs=SyC_e_s5YuJf5H+`pwdPXsj8B@m-0j2a2QKVj{e8^dz`Brdq_i_Z|F}& zn)$qRPvhnt9arOKq_CsmQNd}(a@xp!St;`T#{N4BRZNO2(*RltQEJ;5POpoizG-;4 zw*Eij_0NwEZW8P5;?LKzqmY~NZm$l^M7M7(?KtY23yk`_=Qv66u+b)?qp+)&XRcnm z{MZC-H+1=Hn)-hwHu@(Ey`S92oAezV++4tF08d`;A$G)ra787tawdf15+Kn-8aqFK zL8roaIsJ#sUGSJ+sT`+BVrgGHG03@9dgrTeCgQyeX-0*}Oz?H?Zxu{2N*S8t%H}g)5ZPYkJrV@!OC83`l8L}Yo?}lADpSU|JUQN z{KT7xQ{Ka27k!w!9#r5VFmaEv+s&nn(&Xomx+b8BlnVfJcy_RrxGdQqV9~+L3isA@4<^M4dWQwx9Wj1Am<$*Y0#)M*0Dc6(#Ebji)PBR=i& zP%n{|8JUv3YOh*-VdL&3J-#CSDT6EyLER&~p8)g_@2QQu9mM>&K4m(8zmfI6L&fZZ zenY%DIEaW%iQY!x3@;`Jf%7^R!paPgvEph?oUD{K`m(48Ts0LonTMN_WQ)d-LyL_A zBsUKnS=>lT$T7&Bj7>r94eP`E9^w3+Z>RCdP!%CY3$l-bR}vSn#bt=x$(UkOY;w(e zA93kR_CqvB@~09%LKw6#VK8I3$JdKWYB$FcPYKI+w1aMNhBSrmdm5eJ>MZh`!Lhgs_HK zGhT9za&5pK!qP=$MeR^q0$}Viakx?-R&4W(468|l+;;ni((;KHh;%G_DBMxku-Lo^ zbbkSX06W2m0S6Zn=#5=DJ()B8j#2RcWXLQs=ekibZhIDW?IncRF@L;loA=uG7qfws?Q}r`hlah zd>6`kw^@SI1^=Xl{wL0l2$;-bPg&Zr}fSCiQZHFfGF^`LeyvtZ9}|6%eTKi0w$NPo;d<{Y|wUI3tVuj1#K z1GQE%8N-Zd(fynMjR4)g-g1i=hMIDn+_P$R>l&Z?FJEt!=Oj_( zcC(Dn3xuv?+uzJEI(Q_P)*n47)BtZg!G4Q!_CT5@uNo*6ZukE(Nt}wW%mp(0^r~?ff92$9~W968-ypp4zIHMNBOd6gzeY{TdQN5)>c2V={q;u;4x9nPRfM zQR8Imm_vD&&FuBG{pxg!nXtTS&Ka>LG^SDzl1vms#SlBSL6$zw-{ACm?9G-KD60BC zpQy4kFxNaj_p@Dxf-w^WvKS5yEIjC7`8OXeM`|RdR5o7kI(?iyFKSnL%V8T}ccghs z0sve%hd)>WN!G7n!1_oK;(kDOXg9Io?$wcbBtj9#j`wG%apl@<@tBH;sbZp{FOQ$F zUIVmy#4)@qxTs~3aDpuJZh2NPUN9?Kc&fx_WB4^}OK%8x<>QGT8gg#(5^8w)V!+OZ ztpU12IIk3)q%a|vz=oL>BxI6jjtK}j5aFRlmPcZR*nkG}8>EMU`61T5JjDmpH|{a+ zS>39>fes_{9;8FmE&3S(0B9m|4TE>Mk0~UHBm6MNu1`I$vjm2z_7$l;uASOB7M!LM zYv$1@r=y|}dTA@5MnN&#N#J#*fDb|t07Xd+&$g# z-lU(Z&Ao@w8Lru{R_{IQzq9$Q^>O)jl7-6^U%2=CG}s`0f2KZsfW(ppU@!+Lm{4Ve zA(G*s)U*IeA*nbcPs$6sVK|{m?27f&mDR%AU|;>{a`IA=-Kaq~}9NiQE0v z`I>pQHrU%^TC1%#*w)=gQ*Dg4iE*7xj9|qxjJjh6E!LM+S5oM_lq1K9Ay3YPko=D$ z@jM^l56?UQj{lbx{FIrJ694l3nCm^C&kOq4*?Vm4a0!#enTgKLB0T({--k& z0&MdENDQAaQ4%)%KiA|NyH8XoT`I+8^KZsa*MkYxTkCrDYc+3udfe}Lb$lLk_Clzt zp#P%o1DdInqytfZAb@mChXb!c)x*vS83;l{u<$YlQ~CL_cA>F24;~>x(?t~otMYa$ zZy!=N*(XIrGKY9~2c_c*EBy`taJNzM6UV}AGkS!LrYISbIkE#F&@>C_6F!MeD~7?d z1EH}&g>@Hh=WuXNNcpIDr!zfKH>U_8IN|X_2g3@y z!0L{TN#8!LsChZ=d#A3MJA~^9Y3F=f*K|ar$Q(zMJqMLH5AGs103E}}4c06}0W?IC z5D_3mLrDq69Ex|CM|lEACj-GP-X_D=5nD%lw?*VQH!xNqfuwQ@v=514!Qb9haEf`H zdh9*9-$ZqXQLvQNVW^Kth)6DL*lX)b^3k&y!q7laNHZ>AxS2@vNIOImV~U30!lBp> zy|PK>JPkn9#$d=px_p2!404mZySuxv>>+~;^$zM)N+lItW7IvN$ved5uoSU*9;%fpxkY0~2ycTJ4m=R@LLh$8r%SvsC86i@lQn=KnLPoOu>%UKb ze_dT)^-Fj4!`|I{@3j^c)H;SKl)UTx-2W!GwGDmG_+i_c=zwIpqMOWPqtHyKOlmZ8 z^-8!(xWRsGyRM|&qQ-;Y z6g%|Tts55sX=knxhtwGt&=(NxbN`3~{A@#e9+1(x-y0e@MMf(QHgk)H+HBXKoE2BG zBlW5KwEZQ*08z&UQb2;jyv4!E9zy=osWT98~kPtv*rX&#i zrCw5rUe?^nn3s_KkgOU5% zGcv8NEdN*p(bOR#UiocaBN@-89n*mHHFv6m6jh3AX7JwLFhj#=FAl_x%``~*5_8j% zTWPi=iQSn;Gm125`BOWdO^hkK?%@^L{)2XurwMGeHU^~&8KaUh!4=Y|Bfv%yExO}Z zD@M_Rn%a+plG_l{w*#Owv;q^_wqtYx2FS3_9lI2$D7YT<_>;GGh?}gA7{WI^k#OOOHT0_|9|^!`u~4m@y0Xz}Ng|Bvep>$)#fc zqFp+={YU^=@d?w)OS3)se+iqM;1o^TbC?!L1kc-Pw@bci!k`s2^T3NmCLpf^t($ zXbhV`m0h!|ZuSPPaEGpqoD7`t_S!G_MksxwN*%?c)QT2_2%AjjYn36Q29S@vxhD?t zftroAiBbx==1TG?^>LpGH}Zr)?P97~c7r}(N6gBwm=mD+>m+SljjyScuumWd@ zIGdOJs|fz1`}o5Ghd0cBB)ToG!mOl9I4~fSsbJ&&6;V;;T2yXdNG^zsZoi#Dm-m~W zSb639gDh`)lzVA5NR~nWT&lLTv4JmR|wI4iN1Q;Sb#8Yv^} zA&V@ET(r5!<6e+H{1G8b#Or*>fOCKB$Ii(JNdQLcG*)KQXn$Ws5EW$G#+)!{GA?Jw zhn}2BwojS9wo-^1#0;;X(!%(|{=Hbs*ymnsGl0|O%Fn&3HS(m@A?j9M1P-V$>CZG3 zn(3G9+_-+$eVQK=Ru2!=a`w~`MKQVOhB}JRJ(#XQVgW~r%5xGp%&0h|*pN@x)=bQYJyf zb*^OLh%@&8{otl`9~|@d!9NDs^aLQ6u_U-ZC1qQ=5e;5AIvYzPQ^il3^m+jH$W`)Y zhA*B@Hm4*=@2@INdXiL9ll3#{POL3(4vh9+O1Vc#DYiHLnR;Sg_qhda@3bechLV!S zsV}i>S*8Mb<V?WoJIQUC#{hY#IN; zPZz?opS#HUqPQa3@x;ks%I)L8#213as;X=;=BRycm$A0^o8X1+XJ-FMsZ31VPPJGz zWTvEeeXVryv?;YIXxZ7BwLDDj=f)=Kxhb6&!i{f;v0(cwCYG`lb*(DDGj+kY0FW)lX&;U`bi$7cgVVrV_<$HY4QC)L#X>&5` z?AqhK-=4osj3Ojb0Eh#egOACzkjaGag+=gV<{Epfa{w+Tt(TNAk4N)R`3`hNA@i7anLQF z@)o5s$xBRCd7gnID%irOIr7{p|1KFZFC}|B75$4}E8Grxh&nzDoe>2u`t2Ee0)4fS z2IBrRJB!ez6fufwwwma*AslgCg1o$Mo>Q84^UW=*!V7Y{=f6woalBiYe6%6DuajwF z!=&neKW!7DJ*lZ_37@sLit##RO#Hn|cf5Y+;A}bHrf)pGn!n;5cYC}li)w2z+UYQx zkhpzo+)0djIjDSl%#d_B_?&UPC#1c3R_Pq^3+0Cae34gw?9qPUYKflV;MMYQQnHglmDhYRU(em|et%I$mdV1k(Ms~- zv|#Dfy_5cNYR*wBy(c^u8<9U8H~!lBDMW?w^6-MGs;B$_jOKh%B8y9Y@&v5TeCdRY z{&`J{7bK1X_VWwoZdS)`bK@+TZ!O2;F1>1Z8;Ew}{Zj094l?jSnc8?`1@r-0xnS{h zERtS}cqu7+Y7*j9{RZeE{{LsHKCBhBk_68G_5a$hk4YZ)Py+rwKF1?9HHOmP)voRe z-E+AY0)>eZSfcrY&LwvlV`@4+*x9nQ<2#BKB*pybQi7k>eAU#HPdQh<+WO)ssT#?U z0Z-ie@VWVtjhsW9Ff<%1|0w(jt_RMyz3y6)P4?xABZ!==ob2kSGD^7Gc3j$>whEE%I)izC5&?+}iMO++RsZU|0B7 zD)RToD>aP>wSdkerDlpY{+#jJIWX*=jHl*a0j0wB@Lv)|X@%|Rv%lXB_5)X5i;L!l z)UBBuP>5)=R}w;a9d@>(fODl!#`zlDVF29EoXSeOyPxS8j?4EVm5Jq+XapAZ}4vbHfWqj#jMjY$6 z-vPH1Lq1=<*TDTthk73PFCB^9!Hb~Hm*k@xVe08rc+-=$rIT}TL$Qz`jY!+fNP@%M-s$=t>9E=P33X}_PMX$hgMd6;PbeMHhGSWSB7zY!CcbSHlA+!@>jack45LFQJ9zZ;T$V^n(065hF~Kn$1(`OrS5Ez7 zc6=o-vZwo^4uAL3McN*R*JUtjqCg<7@tW|pD%^t%l;XL7goYA&oys2`sgQHwoq_(+ z`kb6>J-#Tuf412eadZ!pLP9I=-VxvkcB`*aW`BRcl$FQ@dNbf^22JN^3~~GE^?g}% zp}TR?pvM+ zr5>gZr*toHLH5(rn?mLQ)uWxx4t-jfKjJ`Hhue2sTA;@NWZ7=?XBNFNb35sAr|_zk z_g@v*M+(?yvt-$PxzLU401xCz>yCqIuT3ohmhjv0_b2;3+b;txR2P!A(zc0F|<3K=r6 zn>iI0S#wAj=NoRK@3@u^IOj?RY?B}1Q!`nLjFk^xYy%T8;C&`E{ZO>AtElcp{RB;n=VjCg1Y%8{G_FGt#S9Af;~@R^L}L*}vWYQ6 z7+gbSzM1JCe%Q2viQ2?of$^M+Dt0(Yq5H9HLQm@(7lFS2gCheB9gYmGJ=!yJBDV+D zFHmLs9BCYjAF)cO7m|y^Qr@V*T$xOO=Q-v{^%i856(*O~E zHKz>(9K~f+vC}B@Z3P!z*2Bg%+R+=X3ud$8)J0Nd&G>d=y32~qM-PZx^NV&QDg2o4 z$sc{rzKQ*KiRSswUM`WG%4M%nfL0t?*O| zLaNG;WlPP58}H@_jSJ#tC6?RqO|97*ZRQa_|EySM7m=}OSMD9%uTE)*i<<;}#_$xM zL?$fPGJbqxbA%}1l6z{DrkS~0!WR$HD#Ke5TJzLREJ8ec5$)l`vR?+dbGA-T$bOqW zNXwv#;y`ei1fAQM__7@?IBs?NHMtXJ{Wr86z)FCZ1Fi&E=AB$(+ePh|)CMB@W59MtRo1KCi;z~4y28DaPSAmQ-N*e$<=(^* zuqN}mp}S{;f8U+qVhi3+-A#aT1pL2ZJvTd1T1vtG8HW5r`uWfvd0b}yXWC+}RXXoame!bB20JIKx6vr-qo^xRhCa+LiDPo# z2rD0C(@)X3IADeK^*{5}iR#OqaBzyU?#>--g(rP#YC6L8A8z;m+J9}v$54%SzE(Xl zZOQlQd%EyjSBKa*+AVaxBmgE>Df)CYE(ohI!7TarI}g1nGGx9Q-xmW3Zi#__{L2zU z3k4;vo}S384;`It1q~L)>tc{LImm7e+E;ooAa^)F7;T_#uR=>sAS?tCp9kpWaVVs^ zX`~+oDKn<glRY4o&& z6E~nE6EdHVs#DuV)F9?(fFE%d%OQs-)1AIVR-?E48ML6=eR^m!3DqA-g($3LQH)p3 z0Txs>bs|!fL=4*8H|F3#8Zas)xqna%_zUf)b zFmKvH9(PeGR`nUCnGl1FggZrWjH&!yt68%{2+;}rq)1F0VLnRKph$kAnG6=fm45Px zDG+l^KiTpxN2x}@@tBOti$b`-Qzh)aO!;$w0a#SS8*>Y{91Kn|#BSu!ni zD}P2M1vtg&E9Jj~RvpkTJ4|c!+N-@K)&}|eIm7_iM$T#eLB;~Z zpnmcWzMY=|if`#p4lQ`|wO)sYks5TZV~5yMKh7d%ExhuxOFwUNhvBoc>@AQ^3#^-Vku&F$Ua#;nu~lbgA5x1TiSg{j)!KcGW} z-WR@>)vN?x2@WHB%KN)YAQK2IEo+huih+Typ`)_yDE`Qu+`kaj7s#AVxSL1PE{OH3el*$sjLW^$W83^z<9 zmH^B1mIlhBj?jbtVHfoW>@ZOTI@+_CDAyxKK|i8F!FHOt^4{@?BXY9z8^E$Wp2UG? zqL8vw;p-Ahz=t-#exJggx(C{&WXvFSMz>hKI`$AMx96aqD83AKL0p!diqkL_SwN+2 zk>ub&Z(1-X(NGmy_Rm$%Cr@erhbGJ~y*K5KdJ#YWCR=Fd9NlOYYYzZ38BT(Ot>ks`j=q5$u?qA{Y00 zEq$$h{za|3F1+<6fGBo~jGMQ2OfLn>C`v{eGEE;F15Yap@jd3j58sLwS<;E%pA{EG z*CLF?gOpi_7vMKgg7Zwxy63x?v^a8;;zBE^Lroa$!agwoecIDFFzV+`x=ayI3dCf{7X%s!dJ4MRmVMD4gbswlD~yH;mJ*!Bl6HA5&t$ z0uVP&Ncf8_OmTet3mN}yRRZUAOz=fB104|f)>&mf`WY;I!1v&;w2 zX8i8MV)YTSqJ`$jj=)w8J1mYx)yfn%e2UU!HS7))kUMk@3L((5DE@FmWVgkfF6xq> zoLDcjING5G_?6kUHO>ISt~@>QnIR^2oiT+TgpTJ4NlQj|Io zQUwHh&|LC_@Wk?*zHiBc-J=)xFf6!1+!cr*3^Jtjx$oM$e(Tsf5wvsVf^G+r?s8X^ zV}nbCbHs&}bEqUlozpV|%9g@U>Smt{koe5GMXow#GXCnkvi0;Is(7l-7&SJ3@{@f)RMT(?V_>wx1tv|C5N%6G{pyG^6tf zK<@Xw-I#~=$Uhou7Zx^KER-BBS^9Qs5o2qE(~nss!-OV6reobRI3*+%)K##sKt}S0J`@N*7%(>GG>O<7 ziA3Z# z$BYv}4i9gucuMCc@Mfy&7AE*vkDgE!@6D!U2gW}RN|5w@MyC7dDoiej4Rg>;Rviom z(F_$KjaDIlS58Wmg>)0L!BWB!vEkgLhlvKzbNGgBF7aR@h{^cV&=U4g6tIVW28yEs zul#|Hzhh-pk@>*IcDb19l8s$M?IlO zsm|16^}j?AmN3;#JjgT-0%b43XG#Wh3mdBUaxkn!1D8~#SKP)8f8HgG?)Up>FtI>U z?cmd%(jY4!)SvG6 z{>*e1E6nIus$ZVE=O4~LxC8iH^{BN+O8KJyiq)YaJpl*LjTg+5U7Hsx6=5_JpGen} z!NVgscyKX_hTNBqTfNF7$4*qByDg7w|wj?C18K8(mRZ^r2ojn^u_Iqn$P`7=^Q z>`-EsTN8BWkx-;zKKf81zD|K1|7#&7J06uZC>$}LqBtL$+>JH3UkWQ47p1*1=R*R= zFD4xQZp-IL80IcuTQ2kH^K4uW`MqO0)@GbMI?3vqSx)G3sbl9L=_JplBhSQ>4hcvn zR5-%WCb?q0LE>rg4S#C)XvBI4vO@8~h)g);L#euG z6XCr~nM)2;bO^WKF-dC#;XH-1Dj!$k(fg@{N(|R;_LQ_TM0PLihy_Z5s{94Tq|;`J z)3Eg0f^>ah+fJJ9E^bKn9ztmsY5=VE%V{d6qm4`2xT&G{Tx~A9;Sx)!J(ta-=ozXN z)xCUVJ|v~EUcwOH^>Qx_?e2qe^u~690D#Fg+nb{%pt0F;vBD^{jPJ1WCb`3+t~#x_e3#e}Y}fX9o44a5O({$@EsS>93*cc_ zk=H3_MK&!w;N_yjpAz3wh_iVCPrDpoD#i-D64V&1I>3Gn#2Tickn1BU3R|D0sstO5 zs!$r;n%l{o^@QxCf9*+QxCzFTz;UtBv9ra&Ua%H;*mH8a%qU`skv}$cp67Do7#}-3 zNFC6raKwesp8{~C?k){b*iod6@$pGe!Cj3(XH8dzx1SX3r}(?Vdw5I|+56Vk)=iS? zzf#OlpZR@umj1aqMcv++KM~qOkvovR89v4Gz+4sxo$@kKI8BjkQ+YCf0DrBHhZSkN zg^Dg%J9yR-+A8)9nq(_7w7|;ev>JG=kzEL3lScLLL`H^QTIDHI(+Ls-m}~+Iu6?Dc z{Go_z3PsC8_&@vT_e6=wUgFV_Z&Pdwl==>XOHCyD)MCl0@t^R?#X>0Rm|$dcCFGA! zM5+EDx|!%<=J=s8`f;ZP1M%z;Hc0{7xx{`VB<*@q*VIlPImhH?p;`5R;d)zhT@LtHC&o-Q??(2ECG+E5D1-h z4}HUQua&-7tlS+c{PqvJpV7&4RG9$HEZ4>RSCp=#@3zD!|56TU^dCc*`;O8E^wYbl zBMZLp)F=n-^u$O6U)sNBy(KL~h~ts%7TR&9<|LH88@_}lVai*GwGC#y5$|rc%@olz zgvMK2S>0YR6j5egV0_^ySyI@EN>@t^4PY_+<6=#!mrDx3{GI499_sPA6={T)!Y0fw zw@|@?E%*!P+&>h0R{pLshEgod##&qRG}BTffI;cS2dFha*q-8qz+)Kh_>BB;sdHWQ zHkbJ0z+(xd=??QkSY-K@9lD@|UBjJcKz92frrO5JbYW-7RKD|}T z$0}Doyqz}KLnIBs*|WD8CE*=Mjn@D^ej5S7s%uYD-7mjq^e?B%wGV4K)EtRtwAJMo zJ47D@XC?={xD#+tB~@d@yN$@<0W{(SQ6dzczc$t_;!eTEY_LvnpJs%YLG`cmC#H=1 zvKGF^3uyH|tUHz9Bxz?cuwMpanE;*o_ds6B+kQ0Mg&B^a@npV3kB?|ZFTmNU zTP4nzQjq~lPe>DLA5AM+4Nz7*S09OaSW|@HY(_M7vlOtO-Sz6MFx0#>hCk=F3p5g| z3lvL{c=%3}PwIp;_!^hn&T1!{u;jyrpp)7y>(V8yf2Csy?Np}Jbl_0bG8v@I5JOjK z?TT~O!7w7!dB`X=!Vv$XItp3%xlD%|Gk&cgOm31;Y#Sgit_TMXA^=c}zQ=dFk!%07>#cDBr7OqRSL=4{kj;>HJ$ zXbK%F$kL(|CB4^0pL74{ql)0L+5@e=C?w)cV_>J8M>9f{26-e#s>M~`hafaG2Ez2} zCa!c#9h@7J@E7^%w^l1Z%3585tlH(vAtM)-Y5+`6hqTOi^`zwuQM|0 zKLUZ$?b-W6IFX0aBqHm7Jm@#6uj3c>8W?fwp>IEHkLUYp4yGA9e-ewyJg5^~ht92W z(^slPS^Et}Zpt2$T~S3IO)XeKfJDHhuvF<)BWtlKxwC z0KaLX(f;|_wyRHj#Z@jJw#~={%PIG7{1;i0R!U|)mw%*qhRp*a@3Yj>!=g8A)|@xp zQ&WdqnSHJKxXRs4OVq~t`N+iQ{aA<+HmeEw(Z8}=hI^Y0d?O%{iFP)3NHBeq@3rlD z)A(Dae1c1{Z9+pH-!Yuw8}PMK{RTzm>Sh|1!}(%hO{cSoVu3 z3EBkI=HtOvmJLx0c#<5g`@lNMJ+D&Fvx?64=^}Bzn4`Lhu`P#0B&{zo|ishj{ z=nYy5`B4k1ydUcFU~5%ld~FX3h-!3#F2te$YkM)7Tt(E$Y?BiF7*tt zlKe~hTOS;aI|#YwD$?ok3ByVG2WRlmU}m9 zq>jDEY!$kYd7v(2da1Url0@Xd?=iRODT!-k{?MVID~@qp9!5;3lgu{Os_r~AM@O{J z3cv^+f#+!t@ru`wlQwgb6{ou&Sry4OsR5%E9(7&|KTBgkMZ0;qk<%CITPCxCjK5-H zY?`2oXVna?h<$f5PztO5Mp^ysn}Rf%{OTY^ezW}phngDim}oO9E{n4jJ6T`U*?V5( z#qdjwKt;8Fe$DPiRd-CQtcH@(02`u6OOYT0cRZ9ZUP0;LIpRq|pLJ<_gneBEbt zLp4Z4&Q{|$mF<5aInA_f0b>98%54?OLD)dl3wK8r05IjUId255f^Za9)w zc1mCAG-5h2>DBOXE?jneU7uuN=AaFJAI^iurlg7ouj=1=0V8C#1&O1lHPQ~qNU#^z zEsz<`&x?)D{qMyN-Rlb+Nm%Cj>^3rtD7HjsI21)D88RDjos4A@k0g1ZPUG7dZOjDj>(N~{3zo#HWh5Kxu;0n+&2U(d+$C|E(s)2IEWH602QwC zA5W-DZ0YD^3cqi7TE;3a>FKfX87frt25c^Nvy=qh-_PY=aws(vl1gNB;z{@v(}0F> zoh&MHA{eH)ynSD)$60X+YH}S9Onz!SB z5p+SF6b{hU87_Ub|t0U0oehp_U^gj#?z3o55sOx?vUr_4rh3oNsF$58*{f3;Gz%|AgD*Y|2t{^yC7FE5A8vEH8usx12Mw|XDRs9 zg%yK5j<|0*MIw&TTf2mkvM_EQx|aq@fG6Izx<-V7QEz}?^lUp}zvc_qe5J&Us&zfrijK6!T z%|O6*6Sc;6hThwenjRafoSUu#py^tsVG@DKjSAx?(C|T?sQSsV2h0~uvhvyOnAFDI z3A_A{1~Fp!P6!JRgsFgAwbYTvwf-QThtwd2WpT^A12HqoEg~H#1E(5dKN1kc6A>E^ zldT`anP2tH)>s7EpwA=2&akHcD$;@#p_e|T72Y2NtL#s>kKp*(sdJf#SKd*NuBsiL z#z24&G>{~-ViWCn&h4BeIb#qrG}B@qm*9-GXHSe{P6$H{LYB%e@u)>&XV3WbW)Pnm@D{Hcqq3vT>%{V%X#v4IQ242SxB zg8yrs%nb5grUu8^y{ofz1xE-O@z<9asXBdPEw^I&?&ECHD z@2Q#4052oQZif#waFeYEiz64Z5QVM75Q;GvCpi-Z-?c?qY_3*C{|J9hVu&O%JHnT% z3vI^zYlUxt^kc09&4#@lcz^sr!tQ$ciu0NhScv&MD!r?v;5&CF%#v0{9opbkLE`%d z<8Q{sKW$u5AAfBB(ZW%5KbG<8Age-u?7f|{EIEx0l5|aF{K!aJfSpQVD~F{j9Q-D2 zeN{tKt3ywPCmmo7oUC?!NfRI+Iuvw^bL}H$?3uQu!tEOgiYnlzC`inyneM1B6Qg12 zmyF|AqWdW%$_GrX*^`;cel;H3tKGnosI3k_=j z%Tj05b}B({r_=B6&j5HB1Wm!(0#1KWb2Tnjb!njMX&`j(0tm=~veHTHSVz|oe`7y6 z5RVQlv~xoj+9zmUUWyP8J9ua~+JtAQx@#Ez~K=ot+<0zo?9sO?Muh+OTu#1RKu&2=^7PfTLcQxCs2NljPLhH zhc`Zq3DWVo=7oeO&sH4tO8W&aQ3p`b`M&xR-O*M8j}j)ny?&vcU1=(VUbeh&IgpfP z9?QeWr*qNw3%soQnuMTWuESpfgt<5ha;U^vqzK!aPB+6EVDQGq6-BvffV~j3NDkVw6x%k472g*;F9!`3f%U6-tsAmEVN}m zVj${G<9FwlXsAzPs-Ic2&u+ixh;FBFge)=xtSZ(b-H(}?x8Mm?aS1{FN7%!6A*;wj z(xO><3|1jJz*h5P`}ug^H@8fq^aE+j2dPcTm2wewv=mQ^*EIxhJ~Vu4NS zRJh+Jv4RaP)#f3F=4nr%*fiGZaWxlw`ycJt24-R(jw4vfrbRU;om?!RE9&1-gAZ37 zL$FSV#RMWafx8(XvG+VOh6(eC`wZjJD93S@9(i;Hj0My5Jz*%wz*3EjFW_71ifGLt+*fY22yW8qPf7wgI8pv3jxa z5^!O;EE=u3i9rZmsyqtpdqXGS-H;N`w3NTr-)6gez=Qi-J?XK%ms(3xI>;cOmR*7B zqa)W}y@~l$NK3!UURd^h+WF*R>m6_Stt}5pGy$IFt3}+2GF><>Q`oj7q5v~(;~ccF zI3f>F34W-7(3=;8s^i+58sD>o^(Lu#hDT_Tr8SGm3^z4{a~bLysInDK_ zKml$2bBTF$f~n}UOqUMH;@_*DFdaG(lJH722lefKeMs4uXL0BjPAikeRQ-HffX2+ z!SoqtZ%l#kA-RZlqmEmjU|g_Q-`Ue`ehGh{s179`S;8-sY-gfDsPeA?*7`^b%TKfA zB7^EX-URI~TP%XdKZn8OPk?)|bc@X;*r={`nSL^+gnz`bL5&+rE2{1B{!6bkzh0#~ zD-C&j8?@CYU&s@qB`_BnD%51*zs@wUEMHJ(errqJMQIllLM47}v*IIk{q=Z*e^uPo zE+tj@^#GYFa<9pEPzHecvatP7Hr@Koct-U#WhH;oH=QxV%g>=5ofB=A3nO zZzTPege631?fI#4Aq;1M_%_=Zok~mS{Bb;hwQVTD8gIf;?0NgI96~m0!!=b|LX_M> z>Sh(V+0l3|kgF}uHXU?uUviTlZ4Td1yb>}AKv~U1OC1O5pkR4Zk1s&Dj!w@E!i$9; z-ttv8oNh$K;dX3GDS4S~OcN2>6I9N#F4C`WNdf*Syo4VL=KI3!{-_+8&_Bw6vIo#@ zCpEIOor$n0Z)-{+_}S0wz`4Tsr6OY-BbZjkpt%%ebwg*BB**h0VfZNzXJ~`sF~UH! zaB-WvE19L_0 zS7zr=<`=#$agMGlY`=s_!^S6fq{1_oar;VFw5RFM5wCF)ik8)TGadW|Fa;wXhUTqt zu3G+P1uAyH6sFi}GLlydhWy;ps2OpAcOv>eg-u!U?bOAgNdM=&s@3bjjczb{C~Eu` zQXH0QC|o;RYnBIe4WgW^P5g!L6nnPI7o>;64C_@BR;cREb`S1in5J z_m$Jzi;IP0x?xEX-3QOQhj(Pxau>|&P9KYR=E=!hUiX-BWxu!%Scxn}dN;yGB=>~W2s!1h4t}>!q?k$4gCoV8B6<(8! z!Ri;2AJa(T2f40M{!It@51X+np#iNArCbT?cVwtAT3XPXhdd zfc+w)_*;gHhH#xSUB|p&ybU;{c$+oR}9zFjXxnmS^43= z)?^jvh=1Lf9@?)F3}3bfggm)482~XUVm4K!viOIgJg?u{L|i_>9W-MJU#xY^|9pKm zieSc}OQ;5+&?BSB@=TDw_=LwWJ^>HKrMnaZ8;WhbVx15x;E?!8zfY{cVtMONu%vT7 zPmdqU1Wc!`tu2K!H-t80VOK-weD7f{vk-#o+c&~{m&xT~zRQFKGb(Y}owkt?4U zHy&C*N8-l*kb+nE)s2+DSXSFHhCLxAI@KYuITT-m6b32bkB z7FL4i@`Zza_UQ13LJS}kyLh5+3h|xx`*V}2T`-!r58HzS|1AT$LMZoI;E)78ye`?9 zOm)&N{0|SVTK&!K1jahIg+Mso_B~-DrQ%U(E-(461B|u-sr1Vnzh{09)<}Tebzm3J zJaz;jwDh^*bYPI(oh=YqAp28-8;l4Oo}Ax5BPog}$H!3v{3^v-+>qa@^@NGA2V+DY zb48w(x~QKn5@Wc#M?l2gTh9ikm7{VkuG|Y(w-a!$-*z`tHw&r#3whATPu2KqGD#Cw z0?6yT=?OGNrl#5XnRSCh6s1}qM+U>)H_73sCH>DY0!@1HYy>M?EhDD6XB$@AM+o9M ze0-mZ<&)b2i;B`JPrkhOJ$sU6&fe2_{kwZn?$|#(KF;6p;vC6C zR4v#7GE&JX`P0H&ZB%|TCVs&34Je%gat_2}aEl9-mO)Aza7_Z!9Q^enbm(eWTz(iv zM^9<{WE;4m)TkEo9p8_g1~@qqK5=>LIajGmZmLWBU=6!AEHex0BL0fH(hz8qP|wuGbSsWEVA0uZ6GLn=Dro5@1SHdAJ8froG+}M1kY1FzW9pQr+KEGagnYalp4K^OAUWep zjwzR0S)GS79rf50c+(akiqc_50`PBAIKN*1sEn{o+T5x~w18f-lJEHmh7n#7HsyrO zlCx&4GM-VRNpqWnW8s);|Be#Ri|M!(Y~DUT5AEXrHnu@*FhM#c!XU6lt4NKnO6%Os zh{|0465EZ3LB(MZ0?!63dOCfz*(k=+yDde#%B>cR^sNGY@B(!kfz<~gHZ>)tX+n8s zr$Z^EINvT%!AM4ely221q)(`_cDAuww_%A(Lp|GyP7G@F!ojNgKfU6_PsSpJbFrFD^*p7FK(xRwFQ_H}$ia zjC>ND0h_!)o-LDqVAP`lA0r6hBq~U!8;qlr$Xi+jH_(y~U zqHoy%dlJVtmC$gMZ$uX+z*YrZvAXZ_oZ{KcguSFL3Hm-$h)B_IXFxG<;ff&TnmtkM z-cv4$v0J8J| z@p+hB)cB*%=(x1iF{_HQFH0nqFVD9NjLFEY`L+nm{VX%xA1W*3vxdkeXN81v=rkV2 zGLBYA*CGKy`<_a59y4h<{+|m)0%Xr}R(L`5ELF1M6b=-h*M<}7l9ZApiMH_$zQHA0 z>mudzKa1U(%r|8oLqu5Lp`SJqTz49m<{t+#(9`CwV%!2w?@0vXuKFxV{|9hDkH5Yo zOldOd2 zArGX4pm{fk8cxnN3&XRamrbpFYYCF;ZQF*=vNefuXTEvswU=3OM{aHoC4#Ztnb)J? zGCMikLwDPYD0@TU!UV1TBhuqp>}<}vcX;rbj1h3K@7QrDP=ZrCzHFb8=C$TYb=efs zj0%{J>@+h!gNQG-!?qt=!}cD%x!jBnxZN{2-kvzN$DPI$l;a&F??9#ym{dWlc^PA>G|O8`dZtG#+$8>kK)U9hPD^Q3I%f z5ICb1FD>7UQ24)|0pK3s;yW*?Pn^6SIv*(YZZqc)25*!ensYdRA`1eKiBMDU=D$2J z&O98VvWzWzJc>9xR_EK(0%g$V2;Q7#Nt-ab*A%ql0oxRX%ja$4{^4-lV^FFEhageFzOiOV$u`QxLO zW+a2HH>oUoIwlWUm}JLKX((}SWw}OL?Lfj@+mQ;pkqu_nBDlKo+hLf zTZ!)R;ZGjk(&~Is19VPjw2Vq-?3R4;9t`=^PO6u3;@S zM;&wt0jp!!-&7cSW63@GXk9?hcx`rFlQbt%d+~r$ zeJz5WYP03^o*~H*@2YPv#688#&tlVb+mq57I^kv`$C|9ZbBxzS*p4m7BC*9ylYCR4?x6-2 zHYao;Hd79#Zblurj?iG)U6?kQQMtJn70i1sf1kC5$b8a+z|Pd>i^yM|4A4zQ6qh>9 zKWGz3k zXp4qjEJ1Sl?skUvT3T=)vUX-ou{SkPYK8}&7%6dEUA#GHZmYXVv=!7vF*>RvQL`08 z0zt|M>)UGe!Nxmjyd%#}&Bd{kZ6Q57499glr-Yd)L#8`pP+xf59>qi)R2w^SUAPX| z$*{_EPTAP<(%nHkc<+O|q}2}(W__P%?R{~*S)uVx{_Has;Z(gY%Q+DVAT@_D?$Y?Q z62+wE$Eo5fq7 z?YB}p2M9)`o!vw((B+%4qb}8W)=(xLP8UaWYkN;Z!{s$FGZDBVyC(&ma|EGiSh-z?XYTCKiI;rz?F+q< z%u89uxL}pn5I+O9oWybB`wiQH;9S}Vm4bZ=X_*G-fafM{rS;w5IZd>P(u1;PT%y{& zfYgoEDq#nG)OW*4oGH5{4;Wbbgdp^ep|XPn>r=`$xOWV%6303-d&i)5O&w2_;TWl> z+`lsRaYFGg;#tuMPVC4{3KQa5xUT)Z3+Hd+u6(`R?eUS%9m7bCHzJ46VA>0QjdR+gl zZ0=y{9E8VwDqdZ@Lp3tbFjCLS(&-Ub-)WbYPlVpx$K0F;DQum@zOpwV;}06HbgPnw zZJcILUO6>E_q`apHvH*Rv~S2c1=1xyN5>(~TT%TC`e<|BocMkB&hnv&ZH5u#zbOpM zx;W_Z3}rTjj_wc2aCQ+w%cR5a|2?+`UyhE@Is0omnjX?Oq;!H+B%hbcYr3=xWMLUZ zQe&L?XGz#izH`3uORpznW}J*cl+(7j1jmCNXuC>amr(@g7ps97)I%uMyk+`eyYZ8? z%x2yQ%UDqn8kWV5C1+=Bkt-AE?Bjfx`JtJ4l+%Z!930;7Cm=#(3@5gu{;va_uYX>m zJMoX6PfRA=K<}QN-TpYw9?e?x{{JTBa5~PNlG+^`X>^(Fc^e6b3HYO>f<_!-{v4nz zW5##4A6uTRwe;b>&fWMYwk{pKVc}FWaFZ@LsCCQrZ(^7%>lbqltZ8O7BUid_$a>V?a)59CBEp zP?&e>ZVLhKoSsv%WD4Hi;i9T#*>8n50WGCr9TAk#Tx7vXxKQr(5h&xVP6byPaz|*4 zlK|9eEPX^oj@y%jbC=;-A_i^_L1#bwSPw*WnVFGS2d6J;(7<$tIOW=TBsWkP1mqD+ z!ziLfO*D8G3zi6gqPkKu%;;tbEkxwEmSgSV{H8gsxEsfs+~bKe4I&^_FFANjD07>6 zc5@VAc9`ra#T(5UoV2*FQ#y#l;@%8w-*}C9JQ7^701FY0bCXXGUDQ9ua zG`44*-tOfVJI4siiAB#j-WK=7<0-fwQ`KgNIjuu+&p6|=*@x$g+HNrGd3NCz?l^G$ zAtNYs_W!h8obBM^c-+C7qN<6iwjqjnw#(~F8ZBp+FwhK%)Q|lRn9Ij^kEpN zEP6GnK&q&!qN<9jK-D#ug%IxymUM6ggywEm9n-k(^GgtGP}|Kmaj2PgamO`M?2{F{ z4d_q;3X$S^pkawsv5|qQ0U2h|uczB+7 zoxFa&YTY{_J>Q`{r~*`*Vq!+4akXFJI;LYN3$ZC3pKvB@N86F?NIsCdS|0L;anv&jT0?qa=rnMZR)zWt1g8-i6kmuQZH3dmY z-dn@k2cw>}fe1VdqiAViogx~N|8a$FJNseb?Egw4+N%I?`hRo?OIbY<*_<_DITTlM?BS^E!Vg{p`=Mu2hLb9JOg#rAFB!t9Yr z5*jTEZ~XO~F|+vZ^M2j?lg)K90vknvx*3|bW&@YQkB{99eJXx!wiW-l>Blbi@&Ho6 z%p2A`340XyiR6qi2#g4aS(bY+6Y=Lxauft7Qi3lG0(b=>h7pkqpt(>+0P3GWA9PVI zQ-r{dh}*-p$FrxK&0T3>W!+mlF?b*0{V9w|2^SEV4qwz_KubVcurl{=ZtvU1aDR`q z=l64m^k(#Z-{#+EU`}@wOsI1L#Jh=x7;}gvr>Rd{l6T5^=(8cy)Nch3FJtE0XEs{u zRTm8|rnffSHdVG-bqUDuWkczHgNZz}wP1&N zH~<~5yLA%Xy#^{Gt54}J4{G}cX*E<4CP-l+IXE>CDN3;;KpNSg-tew4GTxOw6hq!h z1KbJrsw=12EWn%gC)*G}dQV#X$Ol8Wz!wvXy+3m5UvxQbz4Fmfu=5;v&ajfQO!W?8 z+c#WsS=tQC(~mi+9e9wL5dct9R2ypojD<@FypXI6z_M`yLkA@8>2xF4+6O5@vGUfl zwD1r-K%d?5i3&hM@gSr#OULOejGoT(SMFH5jdJpU(du}cs~Bs^nmj?r<^Q@xD9wpg%^kRda4Z}WyHyug9Rb*0p&3$?3#L$I^L{QcWtc6 zfVerLNa3rZ$y9RJ0`13(yg_lHHlbzAYXsXF=P{9P+IZl1S=)`ZU(oG~z}naAi=Ib^ zht%VTjdu7%;Ns);w!H=ifxT3$CT`h_mZu+28RVFw%8aAHo;mR3ruBYwOdPqG1PlHOT9`(h$%+tti%c zx2t%Ak{G(KB%ZOQCy0zbsE)VQ%l7_@uSYMg7-QBSg@$!b2;vk{Z!^ga^W)pp>*1We znQSnEmqeHoP0`zFprkUM$o5`~fG-!$dtmM3(Cs`f4e8C+jxhGEM;w`|dF>d&%5{<_ zFIht{`(k5@9horscv!CxPm6(3lCh^bKzxH8;hiAE^NP&K-gud`;v%9M&Jk7a_g&uc zk}@nV%OaF%I-?{*do5JDBa~%QXj)8q-N0)u(v+deXm-_lNiAmSpR=7y%D5Uj*OL9$ zu)G5r%dbt98t&vf$ounMe{Nfp67aM%|31U zT&GPHMk)}@!>CET5LAXp^SL_ouWsD6yq*+#^w-*qcbJGyyE#X0(AeT2dUorbkV)m? z-97o5opNR3Ymwo>p*Kl~m8~Z=hs-*0$Zt%IGnKh~dUw?=;|FVbyNifmJ>z}*7QZr~U+v>OK^ z!tj*P!GW|0Fe=J7kNV0x0)WBQBu0bHzOeCIQ>L0}-Wd(|oc81}F#(y8v`&H^^Udh& zPaiW5cd}DQ@SnB$4IX^r9{dvo5-=)rGcn4cs})Q`1twrJ4qNnVvjpmZJsu|!{8IM7 zxd};1o_5WKDA045Cop?`CnE0fkbVQMG(OLYG6NW>!!?9Na8Y^}{-dZVj7&E4o^Eta z{wd-I3JeH;900}+ArfqqeUL4SabWn2uhVw)X+EML`w5P@gK%c_->XmrMTEd z$*o&NHSxv>T2l%N>zyeOh zH1nP4z5n;*`LrO!4R7f5n1wJTkgG@6zc|213=_K{#+b2VI8sF3-v4jqV3VZC_x6$# z!ZC=27!h=4TMZd&Emg!e1iSoh*79GYkf)tQ1+SQ7dIa3|iq zfR94x52H*2!lV4Mqe2iPBcP4J0qW?7>JGbl$uQ6#ulMUA?6Zl%j3mH@u16#yDH=-9 zr6!(DZRQ4-Am1bGoL%M{3DMA*%?L;~5(sQ%%)}E^+Zw<>jxLu#!`+bazPe*lPjIr% zcFDxzt>uG8)<;Lt;=O)@J9jwt*U#ZhaZ@j9j*kuiZ#GMY~u?EL@ZH!Q2l<6$Iu;L3;Y_8`k z3{2pIn8i87vSGT9<6s==>BKPkXSfxfjpi($kZ6hufC!RZ@rQRDXd#>&+u{bA&j0m& zSCN$L{e*FjmTGMmyG5H^6IZ5{{m4^J=O-l}jzOF&Yc2MO%N_<{i; zq2(FQ3BX7s@lBse3VaX)A_#yOWExcFBPI2_WBA_2if*wfo5;-b|0jyLA?a~%%2 z5af8Mr%h}erh;GN^@jW4JNQnKzNV?FC0D+I%pAh20j3&R(=~7==AKhrCXL{#n(K7I zFgRD=Tg$bNSj8HMhj}hqi5x`>#`hXqw;^Cm2{SUJ^q#hVQ6w$}O5N87N-5*2F=huj zji^wJu}zavAjKquEC^=UNJdg~oi;te*gUDrB@X!{4v@~m1G#J!CzRKHtu_LY(|Kms zgpg@5-GDS*?laE7N_w732>!~6ISmK z10KYgAn`e!RMSQ-S$%TG9L?9^$VbD{&43r3u)ywuY)2xWuk zKT(^tXD;0^!Z@@!sNsOvmYfbQkx!?!i8BJ+S%r<(3^m|LDllbH6`8hqZCNpx8X_Vw ziP1U5^NSE;BiQ=L5v4Z5K1(?g605@;iTk3ABn0CbsGGCjlNh35*q@7?)D(smTInX)(Op zC2Z`S-ME1Zy5}xb?}*jKx|X+QrDU_XshAU{QJFCVm8q`PQ#EuxU5`CuE2AVF&f(eI z29bjqf#VA#^00@HqF+8afw7z}+M|}1=$Y(1x?S77lfuwVzX2R^cvN+=+1?u9JVUI! z%0w|ibq<~eBnrc`9Ce8r-%mQ0VN-L4hglTpk@aV5MsWDDCH)lNyc z!f42wXJ!~jJvU>PF~^OEdNJN`%cMczXD_>(<=e*_filL~-sgR#ojpT$9;iYRA(_yM z#f1Q&D#02;hp1rl$JOV5Y9bpu-elkGpx+I9Tj&r35>kusy) zz?f?;O)x4<#9J&j>k{W(`w8=h<@+rAzcaD;iMU1Z@ft>Cl-Nxv{^D8T_CBrM#Nno8 z=UXlHO69LSF0juX$;e0v1P_csm{x_DDHeey00JNYz&fdjCl_%D6bc97Sst;=8zZ^( zm_q`u%MA{SCZYE6g*~u)VsGEu{T(AWtGLeiM9&C{-=s+LK?sR|S#bzMc2<*R=Pxxa z0qgr~ng=Pz%rpnKVWF#({CZ=WF?)|I2qpS2n&LQl$7>$56(%FRLruqKC4f!LFwIGT zNb{M1G>BblU{*F8QqBDHmz~ad#!=m^nVQzY0>wa`B<3lRYKmqb3{@>xt`P1a=KHKu?Z0g#Jl<5 zdfF>_9w#mcThuo-;+KwE>m!j-2#(wFO>092kliL`@7=qzTT*sS7oHUI%L`FKo?+XD z>zvWrc_+0xGWdaI@2WU%?$w8AP}oP9L;vZj-zJDj1_$M_5X%*Nw%Po-tp$X8oc(<=iKrgXC`^H zIDP#NEY<}GLG1q;$4!)B(swY%97(Mg-P+p;ssa9?VRvfeu`FkZGjE0C0NL06v{u{t z^?te5LZ{PGdE9l)dseR4^kcjWnuKrQvn}N}e;6Sw>)G>Dj6q%>DB8p~v<9QRW+SmN z4!4-`yHM!#IdZ&1g<=k44XZ4YYsxfPx(K{ZNKvf240+^+2nKI&xb42&Sd#`6uL;C> z$6T>mo(di^@`q49+tBYiKtz^@X+%!`a|29wth2_N*eJ668PgI?r%eO_ZqE9YUKh=3 zXMhzVNwpAY5#T$@6nDRW(LnlgGY9rAKt=oYifEvNYX8GK0)}0JMoz5}5)l5GoZv%$2=L!G^>&#FwWTa5g2l5y?2|(O-M{djjL!v}rapD+8L6VUYJp>s1j|U+RA+<0o)*_Lh`AuA$fWhkqPZ zRaI0)L`x*Vk}T{X5DDk#b^sf|#PS@JG(QUN2bgb)oq#7(5!T9>gI$;I%pjPHpOONG zATS-tyWXTg(I%BS^am{_{=ndx!zYH9j{4WQ#mN~Mebv_+;*Tl`0M_ZuI7yEp5CWAc zSb?QxXdsbL+f|>6`R;WWoP9@A`*W&z^Q1_q52SydDIs93RVMT3K4AIFKL^@b^`r*? zgit#S={m9iLyP|p_cK;jfBLb6PLxIHb1KuK0JlG;)~LY9W}{N6m^+1qMJv8PbDTp4APs5ro;Cw5X7h<8g#1F+j8FxJ>@nc3| zSR+}^Oxl>w$@U^-ysRoLp)?`j1Ov79jGxS(u1EH>{|akMX>BdG(%J!-E6Q_MQ)=rf z+HAWUF2>c?{(oy)Qli^hQli^hQli^hQli^hQli^hQli^hQm4NRFc1A;XX98wbcrB@ zPOz~1E%sLodkoeF5i4hg(=ycuNAu$TL+&M}mx5}Pl>NB=?H#&92l%Y3`ZEW^6fqA! z>cscqh3MnX-#(}Klc&kY&-^~^dt#5*#tY#zg)81i6WU&K(gz?S5&A@E`uy!+gWGga zQ*WigyBHxhPFjDLfKgyhfd}U>z24f!LFiIrAylcQGayYUJ_6qBa?I6-U(ZH=eQhL` zw4l(%Q6d~dwCup99~$TXw@e2-$Jd+y9}#{HGF#xgZ1}M0~O1DhhDEVpE8q zliCvu_ndl94F=$#h~^=Vw{tQY{@_XJ9sh(EOLt9#@<1*vSNNX}aJwF_zS!d{=WJ#(f0Pckg|GCURu1Eyq5VGW@gQj|Ab-@-mZF7^xE~{=$&97 z%4XA!s}7NS;CYB21Tu|W%v>1AHV;{)U_xCLMfg#7RpQK%-oG*NkJkWtMt>nVlb46b z=`-hL^shW^R{5NE=9|N8o?sO+X{I%-K^^gl|0?I!(x!T@B;bc$GLW z@4Rj!f8T})nStxE1_I*m(UXk(PJoFC4n{~{eqkBCZ1$82!&RukWE@*;dUI}AeVgGp z8Vuuv0Jzd7!A3xISjmhxQ$QLt#0*40m86Fe{ahN0_BUxjD5@=nak(>@1-bxuhoaEe&9Q=u= zqs$#XBS>~4pgsD@klz8*5Cbhv|w_G z>oVY+NP)Hi%($QHo!!u3Kob;~F~`ZqpGDwwQ?^JY%1=mR77y0?408nn)T?P=$jDfD zloP^yw8`luO-f2h#D(0$yGgoocP6E+Du(1}N>I9DZ)Mwt*yh>@iNFKQfy5;gRSB?n z0YCxNEQFyfvmz!emW4?@CDz*(0>ZILL==h&W>RJZRye{;rdNLTwCRo$*Djd7Ac>%% z=L{o^0|p8jLa28WKG(Mz5&>HIV)up|pOIV5Duz`yH8O>AjArJcWZ%k=*klmJ7dGcN z6K`b;R=?|OEWDf17Ik{nexrE##B!=)7*rJB?vEp z`6jVLW7UI%sOD%u3nH|UL%35=p$srigFz7SIWF-pxls1ufqvWcYvv9xBElNN0trq% zro%^+#1Ffi$@v+0Aci!J0MJRnKF?rcd#otxnc37tQy*f|6cI%+^WRc}ZS-xg^*!Ks zqIo#UvX}^7A-ke6Gk^E^E9ZxH@#)g7#GIi-mB5kPIs_|k1o{N%8^FUF%e(x6vMU(KVL@M9J#KTkxu#W+M21-|=ONC4%ze;+eno+p z0QbOR`d=K(VJyQLvT(9un+!$rD644{Nf$LF_tku~cTVdoags*gRF6_U4*n8^&rAmb zv?(Vg*rde3X$k8!y;l)5vPvMb58@b4(_(Ez=stcUX zxpGgH(+0wKoT?tTM+1p#%c20;WR6hoH;uVwF zbiI8&v?R%Gu*MUQG9e**j_GaL+Z1{Y zk&4`4NY%a}FvEaxDWVihCoofI=K;pv)v{ z4=!V>#ne6?Pi7ee{rBXErc99PJBVpH%WQIKK-Z2r0M3QMj`_f@R>?4u$ea1`*M8CI z(em(Pnos+1jp2i?{@K#QgcVA3^bV$y7<%jYcIB=ZnSu%c#|^Z^D1%CNgmii%_8lxCLzQYjb5Z@j1ShWW+=f60>3sDU0jOia$=nz=> zh?w^LD31MMzrhCn%n1G=PvzFx{RWzJ*OFV$eq#l)BE}YZJM`=KR+sx{(pmSCwr&&d zO{p>|=Li&Idd#&EGLYa(%~swB_6RPLLg@q7QL)x7!&B8;F0|tdZ0oPhf1N(m0ndk$~eZRLIYu zx}P>3*!eHQ$8ZoNN)K@WQm?W>(5gH(837ym^wCZ zyA(cDI|r5fKdK6dq$p2#fbQYhse#m04jvi?ua*zG0%RN;k8Pe0RJPB6Kk>8j{y)#< z%CyK|-=XkYS%0|TUNeU_hb^hhYcwm3a~nhZW~Ub3B3HKp@sqrJSJ$1MGqoJI1E?k{ zf~XX5YBMe=cE@3N`Z`#t(JReqokQ26|FDmp{(YvjN;IjD^T${;#V>Wn^9}Xa_uO6l zVnk~)PMCdQ!h@U4n5X^djf&9po?v}Jpcy7}PXc-=>Gws8?P&cjInCiUY0QT%24hnT zA70i@B8m}z`x=TZ{PfuF^z1bEZ%;c_28 z1;DUS_l-)sxaxgCcq(<`a0KU`#;-YHk!n}a?RW;WCo*lrZM*iHh@$%*woyTBx6S35 zH^a-1WSp-)?_Q!X<+IQ9@{c(d8G&irlX2>wXF^1k3Rdc+Fq3#b3BffyC-=To0deR=rw{(rxYG=vc5VovaSpUuPYcr&9Vfu)^t zNTmEzskt{z=NfW%*20$Af=V0fi4G4Z4JLx3UnqUZ3j-%_H&_N|wv-M=4J5RiR482| zp&r<~Ls)@=2BXIB^W!&BoQWul)s7<%E2(K#@roN(q^raAl6&LE9?{P-Cxd&+~$**>ze9sTa7{2F|EN%xIa8;FT)A0tCL@} zYYRYL)k=~8XYZN}jDwWncy@Povo?@TbM|47hKVbRvvj|H!PYafaoUSq<|VQhnHO0ATpWXbq7aX z`0>kH)MzN)SOugA27#)m*J5xOE?ZW{gtes0fMJ4!rNf;-z~HmARkT|X0t!I{aP&pk zC*Rs|I*6*Os;a1ps-h{4i;8a(NG1m@9wO52e0-lgvOvWSQyh<>r8&Ew=u(3nc4itq zCVf6yaa58{ShpU``t1{3ottdwk84%Bdi!|*ogvvogaZ>n0obA22=-xtkxFDz5Y(Vd zjuHrAkYIr#L%3l?DN7W$J+q3COXRM$X(L_`hpq`J@w!3&CY3}R2OI( z)$We7qpuFDX=sPy>jKEhA#us1NRtE*OiZL4;UuzgMpzgF*gP~8e?YvB;wR7u!bu4- zgKP|LfpDRJR6#?}gbxAQtWwAZ`aUZa2H_&7sC|xsu@qs^IBUh(77v>WF1;`{pi8WG z4g<(R0WN(94+sV$fCtN*LeW5gL@rEGtoG1KPR!fJWrdY|8r(Kn_yZkOD<7<}^9pVP zk^rS*g2iA-KYj?7&tvW1@0=pn(dNE`N{}1tH2J)I1n)zA#gw7&(;ND1DEXw#kBRHS z*zQ9sS%+_%iI^PjKPT$f0_gGWRtN|ff)@T{_K17b`pt+cy8Ns;LV22;sqlQ~;k=PM z;MZl@CXhZ;t>Ii@SiDOYlX8*cS+4J?m`4PgLxX}&G6I?clD%Zv_nnq(qTFonB;0At z5?U2pQrJ@tYa&rbm4rcICS;*yfkO%+iYyRll7|aen)Ca^%s+uF2-3vuEe8O>)yRg2 zPy$#08Gu{uSqRDEg_+=>oWua<`~c9PZ9#oVp`KfH#fX@N>);%{yPSGYxX0L0AdvJ> zm4>&lxx|HBFc}uGtwP(ive)zCAIO0X&foW>Bd9HR>8y$xQ8dWpIaz@VB!w8ZjV@Y| zW>5L8GSHmKwo?Fz2}GbWj9DbWgsj2}h@vu7LlD|XBNagR8jmWO#6lp^@oRC!@t59tv7zGkS#Dbh)YGW$FD;MtX4st}Nk*=1WYNDNhCoF{|+h7(D zxJoSlyX5YV9=zn|EDx$mB+ay(w?>lKKw(D8lu7Gh(s0bp15L|01fDa9bOv<{&n%oU ztZM+bn5lWOlZwhEb0K>Eu(t*Y2^^a^=m}$B_do(tlpzH3 zD)3PIl7&f-z6BNm3AF(>VZpqZ8VwwhRRahMC<+#kvoaKnzzl$&&y`LPJ7OY2BvZTpBT&T?txhA>Oo7T3C_to%Adm_G zC`v$DXedUQfTgC9qJU@$0BJ^nX{r*0q%si6X;y(~1g0Srsz`<QfTSoWCTJ3h27oAO1R{w7gkl1K3Q#BvhagG zN~&6Dh$4{T)I>l{1R=tml2K?4U%%MVA-}uaXeQ{P*X1~?k}qi#^LKL)e0J07>=Xiy zhssR&FAc~ibVQNpFFJX)h@qw>nxcp)2YJZU=aA{BP`t^#+QSVIsES9s$X zowaOSfGO(Ul57VsrBJLO(m-7g={IeV(KG--Y^8SRfYIQoQjDMu>Uit{6r?1APp+u+ z7lo!Iq&Rycqhb#u4nRN;u#p0e9|Ddzq&3R~Qj&tkz0) zHzCCU4p2?@0GYNZpXrPQW;v1KcAcRi8%_Dj7Vq|3Xvv|<2%Cl5#S?+98IWU+18Ykn z*oCcaDo+Y~pP4v^f%PPw@gNV^0rSISjyYdmgyIA}=!=2SePBi7)xeTf6Lp5n`a!hrG(Ny z@qink3KW85f+i3EG_Una2SR&X7ZxJ{(;@{c2HIRZw5C92n@^ zA$m=m;he8V%^hd@zu1B4J|`sm8{cCR9w@%BA2Wlj4-YR`^)=`e13&Py;^2<> zq)C(*n6Sjum^w$*G!Noiia@L+$*cnGyvxcepW_4p0+J>|0kQ67Gw9K%qM9Zsf+jSQ z`V-i|M^CF1I*wrg4iJR`1t16wD?-x}i$JwPOj0Tv#TRn*`C2<6Cm0xq!l?I#GVFi~ zayzhQTq!VQK?$h>XC19wyD$@F6_myg8%t>zQcd1>rZ-D$2|4X#sIjywP8Lb+?M%W@ zXm+C5ISV4hiDj5Dj;gDWM1Z14W|yh-bv*aRiyWZ2WNA*zvQ75(dP$0!X0r*3Aqa&$ z$A{8=^EaGyb843}5xLP(!~v2a``P9o{!jPs6Q-!5q$%tlt>poo0mu3FMep=pbEK6+h`zGS6!+nD1O+Gar3k=HAGMPP87UO! zC@vg7S3TPAXu$kA7I8ml5gwC*2(5qIz6Re$7FYq^0-#dp09L6f2Yg9G() zAMd}xo?9QF(QBS+w z-W1Fm)1DWeR-s5NkESK?p+}qQQ9Bb*i-Q)?qA~{(S!}E-2!k2v3Nt4(qKZR%XK+jN zU~xK?B9p~rm02qUxjlI~PS&D1; zcwS6w6{e!t&aISyu>X~kjB#n*=Req3cSFVqm>4;3O=XbBWN0NUX?XvUG21xNxoCBe zC?+icP_GjpPEfE|DG>yC*npPHv&5K-K8MEh-}7%jr*OhB=+u+wYov#y5mqo*p?xPR zH@{`yD|_gnYcg=$#~bB1;uD>+0NNeC*t{ypuzO|Rt_LqX#V0B29r=v)yf>_qZR54feIcKB{ra!Xh4_iChqG_&6Nx^(VP$o z6AnUXDeh+J%5ln>Dv@#ElN6FIrY&tRnDOA*N?vSi##vVCE!ef^Id)!dW0see(*3Dk z+Pu<@?;bLkiD!F~V5x!Whcz<{zuOlhio{ZRBWJ^JIe1z$=C-=BNU{=NUx0lG`}5jj1_D2f+;@Sb2tdh0p%1J? zpidP~Zew2828>8k*Pl2v1SJpT9&?mZbB7{P-T(yas0R90hoVvB#Y1bXYsafdD{mOJCqNU9yjH)X8`T$>r@Z>$jG4nVQl;xyK&+Egckf4 zxEHN|erQsV1H%u%_5ss%oHGawVUk8jVFwu(U>lLg#RGI9$^dc|S`a!&@zh!(rC6OD zVCpGKP=ElaB#4p4%uFC+Sqg!ef=rYy!&vHwVJaaAn1(7%PDt2csYEnFt_cB1$dQI% zw4_c*fk2@`g(3tLNbG?H$WnkPP(mbXlpV6nfsz3rkcdEp1QLLwBLG7H1TrT?41^5) zAW%Gr5)Q=^@<<7cEQkj(jRH9+h2N)*s|8bkF`zq%i9Mvc>PegEUbOrN#` z$-9?X_3q{nJ7DmH4-!=<`?4x>v!+rDB~l^CIFt<#De9oRgW^FWDe=XvKJ12}6pzwqgYoYw}^K!LCncNMxQ70`Ms~k%qG{IlH)v zR_z4^^k8qF$C_i@U_8jb9GmNlZvugIGO0?vwyjFt_Kg`hK;;o5fOq{IVnleuAsra{ z@nr$v0ojIp6osqahAouc-n}n=*rd)noBHwD*+Fwiodl*$;g5s3a3OFc1`FtMKsxNX zEgT=T?=X218Q2Nk&H?-VarWEs6ySM1{ZNJlK6*hLs2H=iU;2D{0&awpRd?&8N*n_q zc?T8Yo`Cnw3qfQBw0#HW0DIv*ev1Qyghed?6!u~2{J4+N8|$+HI--gBdpRQMV{G67 zN~$>W(+LTW!ZA5#zeNwzS#^#h;4p0PE9?KZ^C3awMeNoM6dI#3v3&-Ec=e9@_IP6K zUfeUd?a~|00)}oY=!htYg(Tyd*W&3uSihDh=RRj;1GV0K)?G3lHhvUB*&t(<8gJa; z@=8%TFH#L@8;yTXoJ|FrZUsD-LV0+Zgeq3Eg`cn}B5DH2UhV(^(~y?*fOG)B;b8~c z)W%FOqMAVu&9ktObVnfUSqN(bSll|iL+CqDh0sbX=BPXXP-F;qA~EVbH*vOJX=GV= z)XuAsRixDL9I+m&u40xDBCIWxEJ(o#FxH?Kho_*j#TnWjq;IgP{E2^>Gw*a0h^nlKn84S zw9g!mCkg8!NHAxVF|-jT@-{OH8}=qJDo=0LXP2!zwverIX+I{*A+e_%P?;yk4ZXEp z)@CHajZ9Vy>x#VA2TySOHeCI=A+As-U&S8&DXXf~<_?^qOL4hjK@E759XU+(l!eJL>GR_}@jo+YhPbwVQzAMb9qV z>~WK=@hxk%Sm6MKKzqOEoR3k)BOP#LwX-6`5eF7=6w7bbH04p+8}q8h`b0ZtwZw$K zPlX(J)@#d;-yN45NO2rF2_b2z@XRbsXT~6dNyE-&5~t^SzS_@;qxGIHGGkqpLU*R; zxdzSSrtg9Lbh566Ibl~MZ1k6tr3JfLzO+Ya($9YliJ7W*AuNY?(!{(wsE4n=U3bPr z_@{7qPN_#Nx_;g64Qo@+1wOBs?~N$Bw_6~|br05O3aoo+%s`2@8Ft75hH602tqKcd z#DR`rWo&3^VCsW_$U#hiN&u^!XS>ljCfvo<{I-u$yerm17-VL{atn`;RSyMzvORa6 zIc^_vdmv>TErF0>wUpE1{##r0`M{fsDN_hfrWMO4ES6&+Q8G#>71X%_M93?tUHso5 zdm`;b*889`e=#M%?LMo%h?}CwvG!A9V5NIsb61a0JCVH_<4DJ$&ZbrG_#Tk5B!_np zh&bsn2WLfNjRbz_x$z;UA-d6x40e>BGP5wEn`zuI1!9dSxX>;iHa?VQ#?yF9is9Tk#?UrF(!AS~a%lF88dJ*ptlW}O*&GOh zp!=LAbCp#^1yw&InTalORaI3{6%(6sN2&lPTva_X8w*ar$J~0w0O}LuKLCEJsA5!M z27ArTM8s_v6JL+j^7#6;`FZ;O$HXHMGLEtr7FCF|K~%6y zNkF9yQWT_6N8c)#`o8hn1YEmkKzdFC5`ldG9}+*wLe%&|h^N~^r4nvPJ2M?%TgMC~ zFmVPK$U7wic3vI`a0h%Mypd2+1RVof?Kb-c%v4+uQ)%4-^+A3)5ef$Kn5)lkk1VluoC8O-mG2G(*lJ85L0gRVY-GRLvye(^{Pr`=>MohoIocdlTykhDA7GLe2F^_8;ti zv+?fbvL=D&-VulrA4%r-zRtd$jx?SS$foK@4|7XgB_Y_oaM*{_C)SS-ejPA@o+h)L z(DmpF17w6DJ$z2T6y4K^91DJ6(J~kL^NV%z=vd^w9DimH-OuFUF(nD+dxs84eNdyx zexrKrg>PO4FupNJhN@Sl0WwF(#c)tWk)SU$NnDi|fXxQQ*bG*NfS{q>i&3y5Am13nTK-B>X=PzwRvJ1ZU-h~& z0HiZJN?`(}`^+|`2&;txgFy{PhBY0cy5)pnlp@@b-a>^Sr*?I8H{Q2hGiLdrFtsqd zvc%6k#ukssSYt7D#mF;~Pd?p^0%I2UEY8b`eN;4O>VsVK4|h1bq%E2rGJ=EiN$u!5 zbmQ;ak4%9q=;KL%h!6@L8v(#DR~1^*A#%rTVuK&F)kE0|iWm$-OLVh*%OGUPA*m3@ z1Ys(q3PZqES2h|H6LIjjhW#|3KY$0GC(?F#iv-;S9-ie&0ra^l{-2`W*pYuk9g+SB z6(5E|loaxXewmON6bz@WKXUZIIDx$Lh?~nnI-&@AGKP>OL4~LFyt!_LzvmerAZH&9+;lX0Uex_8B;{HAC?GFBC9=&j$3J8RFK;xSZ&68{E z|IgR91Hcx}AS3y7G8Y&?{UnwJlYw80e!BvnkqQ9AaI>cz%7OH63v9ED;x2lZa;D3y zMsYqgIGGWO3a3-uhu)H2T2fgS3&Q6gC$Ib;cGJ=1Z{)kDGaRv9Hwl>cqYSV+GuNk( z;gXi?5040vBf}N$rMpPi8&`J&`G1tZj(cAW4e&wnT_Lls@o0F;m8`2{Fjrq!LzFBi z99=JaG>93P4)PfiWK95&J?_q>Msyc`{Ze8zrwvU5o95eXw(@PQx4OF9ZRXC`YEqkh zMr9`)amROecY2|B{*H-W@;e9q7TZmC^YYtzIrV^g_UK(D6cx*}6-|=l3LX0S05pnp z;{n-Hhqk1N@DptHdlR6Kq%;Z{M1iqJgOLm(MYJ57z%V6{FnC}Im5UWc6j4PKRh1G` z6HG+y*!1BYfSf%O*YOMEzd#(q$xKxW9nS=Hz`&$}m`pIlAb~1^l9D2WEP+a5s3IUN z!GGI2fFWsR0vQ$vU?o|C2aG#9b4{@A){-P7iHk620h$A%{vweNpUb>-S*EV?LS*X}KF5G;A=yn2Dg+PrlI1+KhU92h6A`1B?Tf=kGTlAH2KqKso$LABKPogqoR^ z7wFGN=6X#V`jXw)&ZPVEK_@n+CAJwZw*|*Aa!jWwnT&Z&s&dLAq8YKqNq@QM;fWMU z0t)6L=!WB~s5=1PqCW_ZLw8j8%dCg;e$PKIyVk;+k=etwaT7@Ihf^q_r8J1gHkA|U zwu}nRrdrBP2^LHwkopOdCcbGv>ni*+NPQFkosfn|#wMZ37NlX@z{5}zK_XCc2%hI? z2N?z@o_9&q?0m8XJ>M~4_70Qe-eU8TS}EU1ZEHeeBa+wPW-Ime03($jNUWRKA^{luvb+7K9?lhhe~aK}=XjIB+|bCjYYUQ1kxF-Tk9SZ+m1T*C3E_iu1h&tAHBq|B~N_yrKYC*M=@ zEzBlg7c&TPA<{uUq5@!Kl@GOnMZs!H{g=)o^_p0~b=^6Xhr$QflZhvVz3&;`m7Y*e z+B$UtiU^fuu=3kBG^o90n3jN?2&Dza8) zD4tNMD|x)!igAFgFw7#hkoC@SiMinL;J$6k+y_jO<^k+5zS~T~-`9v2hkW!>`7aH43XgdG843agB2!I8{K!C&r zw+#^$RU)dYs;a1ph~ts~XyQH;pwsbzz+Xac!X2~H7B$UYhN3+jsikuhzhxnuKEgLR z@tcK#N9fRy7rr)3P9|nRNJdK#prA`ugtbJVH)3&KFD}|<2v-=fOjSSa;vuaFshI|3 z0uPkbN?3P*`4AGo#?A!jo)$zx5h)S?K!GtF5}KNy+)n~{VL;?P2?O%%I0M_snH&Q2 zLIN3bND%K|1{25RtxWKZ-7M0ALC7=PhM?5MFv}8uTxC?m8nSXzk_|wJMe8Gaz$qBH z>4I~-T|neX1hu@QA)1ONGZE%vJ5pG{K__h@u^{>>weo&!Z6R7$evgb!9>pa^eXKnq z!emhQEdP&lv@bcQM@PTCupp|>qEB2NVG%q&-&yvd)cV;$lL-r+ML|p(km1P}dvdYtfZr9_W8jYVBx?9qZCpIa!&))-8M5~8+P6(tZd z6helT8;n3c56^*{M8e-XMc*G6L*Ciq*;Yd^1WP6?lOn(}q)xu;h0+*?BY}dh>voCDlI^C;JO-s+zAR9mx}WgxtaUAiKhhmo89ALGtP!$&B$Oa`;tD$%owm z>`-D)2?(O`J+Oob4$bYE!gNSe4%Z_}8H%-t6`yz-+iMyW_xJOh0X_qL6hKoDrw_S3q29BBBW3=>HM~R>1b@u;UJrMnz^T{>= zI>rY0kb&BSU_k>&P!%Th>GyT>?jJzz;&>~+Z{|NV?&*9h;$!amFROlC6x4xR@LRqH zVlqMvL#R(UUvuA`A;Z3~`}1(HRaxmI&{aFTUWg%S3lvY;P@_lbw~*SA4j~{iB^uOG z2iL~Jyf}P$*ma1A&l+^?c|qJ%NOU?*C#br=F$CVmpqQ9Rg!juj<9UIkzv8{S;UTcN zFJc+>Mr_2HZv~ljgSSmntu9(FB(CCYd2G?57k=Yw&2f0YKdqXMTG^a$(rPDXGmlLH z^6eQYDuB|NCURT3XG{x+#$Wx>a}eb7^$506fq{C#?y zFSFc2%lmdQ ztfZuhLXuiZC}>=RiF9(M65k|DqC{sbsd{^C&M6Q-CvSJ<-Bf37VF7^qvKjjFnLf^~ zI6Q_JSz|>lLlQ6Bh~h5Jv;TkN|Lgzv{y+EY{~Uf#{OVG%aKknGP>fpAEUmjO&9h9rRk?iao3We^T@zJV|_=y@vLLM75a3t&jlA*2o1FRcjgeJe@&%|Tc zyl1{@Kl4)q7ldM-QF7~0zO~?$Uy;P|Q1tEn{UuMEx6PKjn$h)Fc{U-MG3m~x(dvu2 z10$np>s!Gtxxh;-fkDBcl&3~HKY|aBc~~>P#*I!A(QP;~{=3%(nJbRtCkaHM473f> zWTvd|QjsVa2Q#I(4|d_miQIqk(_x2_cq5|L;vdzvN81#G-TVJ9Ly+f~MSd^a{NAVy zpV5_uxoa}F0u%n~K%l`E4ut~CKqUqwI8Z1uGK1P@6O=5B77{5|Cw4`LE#kGI%MLSU zu}-arO(sJ{IcdVtNX}V^g}^1w0XWJRvqzknjKjOqW2Y*AF=q3XR~-{MIokt>b&5&4 zSVx6Q7oEo7AgcEnjO3FHB(wFi!Quy%>7vzPNf3~C{U)QtaYu!ba3vkU837PFm6=C~Q(u>I;2IZ%WMO7TMq`qs zge1ly5H-}S)y2CI!RrflifI%oDwHJ&OhHO~52LF8O6<}33(wnczJWhtR4pi#D6vE( zE%#xxY?OyS(`Wgz6bc$fppXI_lmp@|A_Nmaz#>EwGzd|w#Q>zpO41(1`?#jfqM`fw zQB3kaYqEC`ju3_Vgh$>B{qYh9thu@q(}zI0I`>ok@e6^jrm3Wmdyt6r{AAZV*oJwP zMIA>Eo7psHWJ)IPWi8MXjHM5~tULw)VBzwg)*Q7y%E&tifq?S+PwSrB$4XIn8p%h# zq%cA{4!-m`BM!%&5Zwnc2t*+kiOac7QK0mS2CpUNq2bXN?vyz6A;lbYV1JZ28;L(= z7|79(Y_dVQrV0qH#ShWj)uv7%NBVa5ws`MRJ5C}1cb#KEQXe!xI49r8@DUv!6G0j@ zMz@q$U;CRZ@+84jAt8gC2lC?pz91mJK95~8hU#mAhz?-UdQ9tuWeNarBrr9FX44`z zkSfEC2%8`iRREDP4oP{R6~{r~7<`UFGEpc{rAiVc8VUx6fuJZ#Dj+DNk|-z{fg&1K zNCto;k%$I`XksWK?_R+POdXOwQB5IG$2Wc(Rdk;*7oJ33*aNO&B!VVn9ec1xC0U-3 zDE@*F*q{&_IPqif_yyBSamb}nNPtm6uyA~p;#|+vzuKb_#u91}(_Y6)mQdq&3Ulq5 zox2;=1x_K{hjz)vWSl#)EkVQox|xnfgMylpbnqQDOzu^<40@rEF{s_Km>hVZ;9?zn z{6k0RAw*1~NSv%Am_4=q_T&k0aCf}{`cY92t^*JaNToC}Dt?sp9-bY&Xzd569tJyv z4`k861`$1a4L+$8=GbhT=_AJf1*3MYd4*}rFdIy1=sti zjC~I%vnH}pqxZ-r#4_q_dYIP;9$i3kG>P0tRj!3Q8`XW`zGp zh;-%druVmNoKkLpW*LEs8Y|EKBH1G0K~pSLsa)OkU%cRG^Mivll^j(CZ>jX=knRnm zQEC=d;^f9eRA#urOlJR$IAG=c{0+`uFFDV>!ko9}!Us^t5so8q3X4bnA?FG;yoat? zXKe26xQ*Kap$@VejmuOn2?48S+n4|STTEKpSPl>fG#u~`%ri_gv|8NyaUXp*$l5d$(R!C)+lQn+9h zf-n!zoyH7Gz(j`zREk9?g+#(ZFHq%-8rGHP({4}OH1-J55(FteUY8yh+V|B}RaI40 zRaI1yaA6;jQRs2e*!FgjAf$mXpQwl43-YOX!c2MWEX>0FxaRRvCYB(HjP7pDbUQ~K zqKA;?bTPys0_8}Cg$Y{OVPsx3RpL>9l7?m#20nEExyW!O^_Egv{m$NEwKPm|ZbUsxF22!Ol|1lS7)uwo+&!w$w11{WR!5$NW@)3G=)1|YG} z=t0#HBPjfwkyTYuO;uG@R7FH$p!rAAx@zKq&112Rzm|u1# z)7o#=m)^4aeLDd-j3%!}DCY%U{CrltjOZ{~1ugbq{ zP6u5j=t5O7aFX`r)+h!JER3?^3C7ARSFwP!W;lBFz{3R4O8H+Co(LrmUl9|MGA@jD zIQ*1%%s}9TKZs+ftLyK{(=Pr-waoX$z^b8OfMTHjJ|DtiyuT0#oP6(7eoU^@Se%E@ zh(9DHAj<@S4nm|d2?r?c(5fA~{6v9~>x43`WrCnm519y#qa`;7ZMk~Po8y`qD6xkU zOA-?#T8u>(Cm|?IvT})WXu~m)ikg(LOflApL^2GBh@=CeL3xnbBD_Fi5QpW%1X+i6 z0+1&Oag|L<#7<@%W&j(AYWd6sG8D*r))9)Nk(`ch5)J$njum^z|MI+-B+t~yKf{qzN( z8Xm44*xR@~J)r)$cRiV65=;#u@Feh@p=EXgeTNs}AUp12z0m}Y~@pTJP*K7R^wn5Krjn^%yd_@;x=UlY`W=iS#o z*Tq0XcZ*5}vAs2`KvnmkB_4mZXU>h0PJg(C{N2^oU6`t@5htBp2v6V<7;ilkui)D% zF!kv6y~Q@CI*z2S9@rwqcuurk5g5p^5rs_J$DTRXUq%7Qvh;x2EEXJV+c*kH0jX4@ z4zg1Qnz0EUi#Y(eq8`pKTaFVt#gIO%5(W0m<;2Nnt4xWMH0yVKOdB6(7DPatcjp3v zKMTJIe35-{54e>gPQI=-{hd#SW!)jE^0ytnh2O$>WVWp%5-|u6MN$o;vpD?^+eV^) zOoZ3&_B+l}qfgkK(CO7F&30>BFt%i_5M+Jn$T~d7P4a*tDg>e@5TulRyEKWh*@r0u zu2iU+WCQ5WJE)ol;)02@vlt{>4frG!0ia1mz%d?0G#VW2kX`tXV#~;&@<@ak-*L*Q zFIyntG%^=bq$nvAkt7jqDGD%+t4Ig_LwwAbd*2|9$Cw0{ z3kcj9B8lI)+0J!UR25!Wsv@Y2h={7TC#+*|fFE)_2LBE``NY@^b6QA=md`WCApE6p z=HzsQpoe;)^4|O4oOja78gVlK7q|_N0Q5K;J?DP&W4tv8S8^Ot*t9!~pb*K8!Ko`tCuxH=U@%gcrI2pZTyPDA^tz5JeU+R25PWn=xnzAt;d5#%WyyG(5_g2g@7~jkq`qMovUf zu>zFR5mg}q$_&Fobe%z{r8B0CjVvHWCME$yK%`9!qf((`D++3K;~*9nc#)J2!%5No_=pC{MIywm+NHFo1K3 zi$e^Z+8qB^;U(+Q>h5zsMpXoVCzyPsrvg=sDgPTolbs$F(B-jCFybN~4=-Vet2I>M zibi7L{l{`iXJ`zFg9QK%*f*CeW8a%b6Yuc$Z*ma{1SF3bl>`~jT$7le1)P18o>^Ln zZ#CSrD4Ldx_%TpH5P5iXOlAV2T{NgAD80D^gS}(=YG_CSU{5lCmPrzri|>6Khqo%X z+G~Zs>hhfO5lK$wlOb_XhXWRGaRYbOyRA!#Lxml@4q@VVSvv;B5``k_R_X1?@UIh= zZ@s~-p2e3`JVV&^D@j6CyfiwLj6;Q<4$yd(qFU0}BLq|aNP z?2C0d+0(te*I7I2#AS$ald|VqWIVODKq3S5ou{p;{CJr*^kjB%Be_B7GVDyzB~Eh3k5~O2+83tbJ3je6R^Tdw2Dj!mZDi8wd#_4EO=1IIVTt|Ac6wN z%Yz+^!30RToX55dmCtTfx4+$RVtxn5sXYiD9gre{;%MZumdj*RW#fIR!N)e37a^2p zER^(f+%@`l&T+|@7&}3u7-Ys6D9TG{lnAUS#GFtfOhPgVal)RZl{?8dv(-;LxEY?0 zIV|S3ku{=tISOhNK;juQ#6*)vQmhmdgh7gAK6N3^Q1mmF@sKjPkgCN2Aix$Tq$>JK zR4of&{z$L;fAIgq@#(yY4czy`0Set>VhENbLBYcVbFesBU&&3awxk6r(X#6nfiR{p0@xe$%kuR8@2BEjdBBZF(}qEXqU%aOvpo42zH%Mds_p}_g;0j%kW28}plLT60c zKg(HCU~3_zNp57+wW3-Hk~%?3kZni1hlLeH8rD(KZmL27-a)8#Z0c#PgGPZCzE~&2 zMKoN=1y1Vs<7cvP*FSpL_f;~8ks*qq6uDnOtme;b2| zKInYyDa7#%>eF0xhyjaV=iMF*6q zB0&pb5JRZ}jFHX@HYUxD#*ObeHSOs%5{#lqP$O`Io(M{8Gyp`Q0mt_c?{3EfMu!Q5 z0$d;@Az?@fMYLipAeJNqWVk<8p&)`(zzr&{<%nQ(1t8Eqj1>B{3ZiPTRY9zX?F@mc zQX+1Qg|J&0>r6bQiVGx4(kLToP^gg$5P6Ue4vq<$sou%Eib`Jvf28XL#} z?!QJbQfSHTz&rTF;BE%g4-g}=+cii>QD55?H$_iZxqdL5r5IPpf0ZGj(G}0c$9;~E zAi$zx5`mCJ!8S-yO2|Dsx!%R#q?73|G4ViC)GT`8H1ka?K@&%-yO`bhhC#&XPoGP! zDn6|8`?*{f^Yh1+169O&;c5R>`6HU|cs!niA!uDu1_?Z;{ApV;%+BIbk~d%Mx_`nl zSBck2=%AC)MdjEcKP<6^&9(%h>@Dgm5iOMi`0X=uKVFt$>V0}#>?_)4y9kcD7YK$c z8(Zj4FcDFcWrxY>OhpiY8DSw{69`dgQ+mM?+wwPEB97u|D0q+zl|-RJfg*rmDv_jE zgmPSf0whL-9F)l@pg}5#n1mQYR45unp&W!$7(|62hD0UAO~Z^DJJeVLq$6+@Ef5Q6 zRpMlz6+Qu=W+9DOfvSn`)b%mrru+5#sv^jxMXF&}+Ls`L{OmXdXUNfD@|-%tB?Xj& z!9+F*#v=Qp$=rjaHG0R=1izc7k&#Vga07AKm@jNJF97S=fN91*BhRe7{T2;ELqRQ1 zcP1*y9j^r+0BDFdb|6_FknqG!1u)A1oa8wKO4FHuWEeoR5LL4T%9tuvmPJWGB_L7& zR!})gnp9k-m@U+%L^l`aQ5*F4Ty zCa;7P&&#`ucBi=zK8wwiZiNVjkE^*PlSg)rLpccx`bY;{E+dvMsvRiXYN;_pDzJmg zLJ2`ELZ|z?n?KvH$9^wT@&Bu57ghhs0g(ZL1%WL-@W}ymMB88$MXegjcMuvu!^T?S9 z_vQ+6Bhz?8o&bJ%q0j;OQj$8$s&UV>I6KFv@ZIbws-|KIR8E7@x4&;UloP@~1aGnN z`-q5Gs9gYkvC?qk-Pt#7307lbj8kc{=syTd0;LRi%kwDTqKjWg1bE z02Y7(gg6tB&~#&9ND)xZ#L@a{DJbjLu3O>i5IgS5wQQ8OUt?gQSYp8v)MC>S4CFaLgh*7fO**iEm5j^OoMWuR6-z}Xh|X<)dr$*Gp)qbT^DEY@KnsAO-zgx8 zjTX#O7Ge;3WqKGe^|=i|ed%Fx9sGdjF5NlnWe_py=Li`i)rw-B^O1#+6q`f5U~yE5 zAcR%Wr=BSrQxSw7H}viO*^9bEvrHNpAM zx%T`dWG9}3;k)wXF-I)fF`;Nx6pax=6c{GB-nKwcnk)Gc?3AE|Sr`Fih)6qt$gKW0 zou!^6LL2!T_f0JM}HlIJ*vL}B|!N^7L&K?!Lv%K}#{v9Xeg=d%?+ z&_q2a8lmzqKi?WJ^+$04=Q;G$^T}U=8JW8?Fcn#`7i7PjpPI8)?ZK35SS$@}P2$px z>O+Jq>vthTshcXMVm3pBCMlP zB*Ef+=mHN@$L??0a)Jr}J@Zq-Epn%46r6V!cLS-NASZ;=#*t4Lx~pUN_{esCAn_I}BEav3-n! z6nf7~Y%^F-pNl~#NS^OR9fj5nXH9aAoN?-_Ty^I!9(_H_R5K1BLuxCtRG{9RsU979 zza!Q(JLF;44u;x}aJ=zanE=g+FxHa_cv06ah}_Z)CDC~p^oK%F9RdO3d}E2=x|X2L z7kSh%dMOi#tGMn4L^uS2Ajl0A6a^F%QAGs>1qB5K6f`tYP|(m(MFFr5z>4cP#Njw^ z12W2inYQ3;IAVc_i0JZ?985qwddv-%V5naSG0DX}F0lFK1*3rnbvyv!NM5c3pbqju zZzB-0V&$6&gn=LuYHvtbbKJivMQUUcNhWAX=~$E{$K4JI zxI+|vXbfbQZ)HkD%SPQc+YXwahd^G{Ix%V5N!D+-miDqDgd6Tde$G9a<;S27C1F-Z z7KMRNlcDo|ACTd?ZMf$a=WgyZ^qGAF1h$0Ii!xTM_^i5#e%VnmvEC(@XS5$%nwNx3kHHjR2&BJIX^2>+CGF zD%?ttQtpK0IWYWSx~j%co`!iB=*zcl(Ih8szmv3fhsOIAldRUbdwhFi!gzq0DhO#I zN>G9rg{2~6yLzUnB&$G121-91Dfz9(+=m8`t`m^|0CPKAMK8Z za6ZC+axyQY2Qe^z=FBoHv9fpw2&sa42MTfso_|=GM_4Kt^C&u75C}S*;r)kMk$+J8 zrWyLW&1eh*9Y(W3$4S7Rk`$VR3J8WKB#1w|EEg$?nxUpf>f)(KzOhtqgW--I1x&dX8DT z9e#}lxw~D#$}{c|NTHHNeSE^C`thKc1_neS5G6j?K=cU*);`oEWtKydI5@I0%OQy1 z;1L+HbPNEzK`M|?50g=@>Fxvq1V(7}lmSdi5d%m}1Lr5DWDs<$JQeT_pwgTS8?>H^ z<6uaY338OWuh&>T7~)vM0drwr?y3N9?U=v6;R)Q&R5|{deh;1~`=_%x!t;( z@)WHqJhP5IVdjKAU1QL8Vg3F?z&@ut+ln6_&O*{5hJ`r>=i+mUdE_aeA_OQ(RtOWP zFgcEd1na@)01wlDWU0yne1LF)4Gs_tjjoo7Wr|^-MBZV>`hibm))SFa2J%dTpf!)t z_6BH4Hw|)YsURn$kX5A-UWV5xH4aK4EF+RlO$Z|rf{`mpN`XilkjNF*WFIM>|2=+9 z^WEBSnV={Vp7;t>$gfnU2P7js_oG z;}LKyt~idNbWBkp##GfThZ3fzaJzvu3Q`7$gD_lrV&%MXX>u|qOvJ?~N=izPng>>b zkQs!?42O8-ABs?RD-WUh*faYEv26;nwultA1rdP@=Kv0H1e>b6YpLbF)l4B2PJ3~` zG5thjLdqJ;$oG=(UKdPs}h^LpT1nn;*|DOcni!1f0OIGSYE90Q+aFVaN+tSY+aBLY{RFN@mq~y?HXb6Mo7iIi%OMaZ2?+!xa0&-VKm*TUcM%a1^dlq_ z-OxBtN)>%6cpKoB8VITaG7M5DqcTW-x7UW4XaJ!Qq~5>pIk9>}7r`kIsf@%E z1i=VIQ$k50bc~lE!is?XlJ%Hk=|JBnv4l;adC~gFMu8B31i&&AaUT|-NT_u&$LjT? ztG#g%dDTGp*>%8X?9Mt+$PGh4A9Ol}BnY)MC3a>(UDi8r%mToL#f5^&?kCH|6Ofa? zPcw0X9q7`Mz=%X(RslwFpSgxX5K%>kFUEwf8Zl%gVeXro05mK(ARP5aHGr5xcM40A zJjsJc%ZaN{ho|KXAjJDEL<8Ct?Dq$pN$5-9+F6k%B3cXa;e;Io&eaWb02;g}Bgk;x zmE`Qr$Xy2V*2z;u%arRdqZIJ4IA~O2rA{V(l=`?Qq-4c3Q&jYn@`Thh;K1ZKG$1iO zJCH4ibP0_=I5onMLSKWh&lR_ow#p26%he%)LBAZf*zL2A8+LJb4$dL0Yl|=+p?UaZ zhDioO*BO#!hDZy2+*Qe!L_5S&3MrsN1Wbx{Brqp{1qMGdKjRjZ+>hdr7QW76p9mcS zk zgU})*&`db}@KXjul0lM0Ar^3aA6Pzx8xTO;z;5YTv;d>wpW>+;L2^H63YP>R$ZdZw z0{T83et=K&LMM_0pbVUWl^-Djc8H(0XmC~fYD7aIckMQ-6Kf&PwXh$%jDGUcG2$%89SR--{J1i(eaOfd5ER_=tG&+zm0s>`$ zBm{>+f^iT~GdRFFgfMiu<)9({Zwvw98dh*qaHD|Gpt(vUI1<4=+uS|l_Ct!L>W z`THr9mvreb55M|%ZQGGHoaX}4%WQX!NYbpLR7FR2yK@s(1EpeS^q5L2(lN2dc|`QeE3=whJvW zlNjj|aH=5W0}>B7Ll~7AlrBo407d(*Kliuehh^*}%*<2k4Nc4+yX>-gwFo%}Tf2??l6LFD)np#6e2D2E`G-4_yNDJU3 zfbmu}DblH(P(c#pxIoO56(V>rUb_C}{&2svMoHdMqqB#P6F*syuRi$MWrR~#YpC1(XWMq)F&V)Sv zz?rsR8g+se$K*kVHeG4Zu5}pBVI*;Lr7Z&KwUr!->de zY*fZlAlGb?!P@6wvK5Lp!4WipER*F3e@xSmW%yc*S+#_UTg|aSV@d^c5GQOQsrfaO z5mM430Y9A_ir#WgM@W;!I*|00p}4*J_w-p zy${KAN+ZjZ|Lej;n&Ym5lF8Ui;8Mnl4oM7|Y(S92Spg<8GDvD+G$1GNIU4y$(lqdA zPJ-MAR{SGJY;t3mwDmbTIcEsMfthmzg!qypVUhZ`7yCF48KD?MAU5G{v75PX(#JE7 zJAS1OVjmRpCD_Yta)q?QQuPe5;ywS8tI9gVEI!%`BCABXCv`JNff0|55>(imrX`4t zyDXP*;7z2#!G~s_Xkr6d-xI)(_4BmQey&onq(cd;kpMwt9jxHAy;WG< zT+}U$Y}__lbi>A-jXT9%Hd?&6ySux)yGx-Irv-{jad(H}?oisp`+Yb6#eZ>bPLi3G zwVs(gNp7+-=a^$qUjB|K_KW(+mn=INtNuMs6L}{i)f02`M9_OF@soQE9UutY|Igqx zo&yP)vXh&~VYkQ@R4gCVTYj#%W8&UKWQf7)j=+wlZP`mT_Di^YmKLMWvQs2Gq zNmj(jR&t!?dNC%;dtHQ=Okay?d-SXRY&Q^gq_}Ib&tGB|qP+)e4&t+?*>vZZhf%%n zH}EgxUK!1I2{S?Rf^FjP4@EmSRH`2~y+9Fxp=Lxu4Gqjx@}t`N!t`fmAdNpEQttcj z+ufVkT|(diR1=Y`I7$PA3cHK6lwaPuxVUCByS&P?W?x=w-(jH>L1>;OO*YUi*RYy; zKXnpjICvRIBzmlI9q9OF!MW=@dAa#p{tt;Ee~1{%)mqu|ox8 zoZfPmd(x!uKr}%3?l08mSllEya-}`2%N@!1P$#TfdrhSqyGiplbKV`x>(E-rzt zmr9^z<3;_zskS@#b>O3lJz;*zw~OU1!m$Z;Gv(I2xN_2)CuTEWizA zNQAj$aI5J!r5oD8|VL0AScF`EzU%!52mW~A_aLVvZX zV^h~w;d1-`LdeT~!;$Eny;M@4ZcvV63O~09B{mz3F#cm{U8&1hX`Nkr8HQA=9Dk&G zs5}yz6MjzEW-!P?t2<|>ui`J9cTO9)K+`3XM8#!y3N?h?4U;(&{SNVm^Q@%S_=qCP z;6ERaPJ)@jP+YFEHYn(ZB<|)QKu~9eaRd80T0SD4))!MTgdMG~4Y*#Q;0pRi z4@jz31ajenVMc*)c;S3G!Si51L46++SG2|e)<;oNE6PuHc+)jv6Ua_Vb|LUzn>kbh z6E}S(vFhBp$HT%3(O`LtdvIdNtX9x2u4A|Gk`{{dX%U0UP-u&+q0kHrdp~Sjv|7`#B_1d%Iue5PP?<~I0E#mez0{62 z3caV~I37dOza5&m^t~2=n(s%y|LY{Pp*2IEg#Pu5GI1zM6?tA%IC?6D9XonNvMyQA?{C@a^dZ<} z3uA#5oboC4U(sq_294np|NOD-lf%O4s>bc?T?!y;_C_h^9PHAFHkH%u>5DSskA1~` zPZO&}RZTsXy+9uF1@u)`z5A?3|3D+sewz+I{d6RsK>CqdrU8<)cc`>xNJ-@^@{l`Q z`ur32HR8iB88=Uy+dQxOpn&cWE0o*5oO>z<=*8CWylwHEn>^+19td^x@}L%uLUBcfvUD)??GjFbZQr(*B;VfavMLmB5gIlRvVKR zlL4&BIZ1x}{p+;65;k#^tWLuI@!rA+yhP>BJdiGrAdnIFL6iAKbei6Ok2j_N{H3np zBxy&bnz??gYn3YFVX;n_UvR9Poks4yr_R096Z1n+{ko{>ea3r$RCv+^bi0Wdi@|h| zpTa*HTy&fPD_)#ZEP4>Nb3^A<8OQeZd>5%Rbm)Yo^}Wpfe>Yh(4r&`&J&hJ?n-!bo z8r|k{U9~!v8r{}SpO$h)mj4Tb<^>CPqr?R`lb7B12W3oj2VaZ5h``D$ncJpZzE`b6 z%BdL(fN&0Jl@mNm8Vh6j56!g~lZye=va8fG-g9e3`>tK1lljZvt03qUvA7Uybp}Em z9a&d&1FH_)TcXgKef zqh(#mc(tf1P1MD zf~kHbGGiSI4>*t!v_Wl!zB~f~XM|zWS8HW9B{*IT5m80=*Y^W?&0OZP@h_uEBMi{+ z+dB(pbzm+O|o1gkLC#0^GL+xtSHn9Z$l z2#k`7Fh)p+>R%fML)yZGN=RBTJ~=ZUtm3ibe*J7|;9_G(;f$rBC8au~O25ASr=j2K zE~*>VuP?W-I3gsDf_?l0F=|STd{k7qOOy+x4CTF!)qprHb%<15C=A=rtxG?d&{97# zSOX`z1zOhU2K^r&6F+3^+1qlk4&S+}awr`0VI`ZNDF4~RiUhvyQdU(Ji?CG|9Ki!4 zNR#C&Pa-9d(rIxoxBObY)+@SoMPgqcKpPvX;ZaED6%C^Z+!5pG7hi%Nq%qJ)O9-rp z=XpPdUx_UZ-n!38@$TFy5{B_AytQJz(dls^<2&E>8ygTZ)-oltu_OZ)0$Z7R6Yu>= z{UMLH6+gqOTd{1m8xFUNQz#^gXy|8+8()*}{YT1jR1koSIy;H+64{56dtM+R5@wDP<+;^X_zhrpB@}Yc^+|MA^`{ z@8x;gz4RzTYp)$ecn86fc*tfthbW`y$eRT~8amQ#iXj+M=Eq2d>0@7Iow|KeR|Az) zdUHHjJOLfGH9Qb*^HSvc^Y(`+^Z_B_Ub7G+mhHt}0uHL6-nx}wH;9>me9T}lVF*Ch zm$QELV3P=&4M6inbjf}T`Ihyh7?m)TC4>FcDBAYAzH?13LR?*B0>N!@z9z4Xzh=M` zgQmolm?R1cnTbKc<|mTYb3}JdL%&X0%b<`1im-hw*@P8xiW?!Iq9*W46E&M}xBZ1v zrNMX9Ytlc*nY3>)t5)vwOV5NiSC2k!1OcD6cyNUBTUrAS1v71|c5|-Du>UZ>Wk{m6E#FOJGq6I+s>)NkG@5l|6y!9jp}X>^SsCB0Uz(dLMIR_K2Cxb=Mg`1mMPa!u1Jqc)_cr5I(9rX$TzN}Yv+PmN(mpDg-PxqN@t z)fbLG5-q71t_e>!hqnz$0|bl-Aoo%<6*}aWHlhFhLnc-g%k)LaP|X-|I|8}2=iH&4 z3u@Rvli~xqDnez(<6q$kf9|9_V8qW*!y&CyE44s6uqs3xo?&_Iw!E7OV1~EHHmT5i|X>M3aUIbEl1(fY@09 z1{lI~V|!0U##@1c?Q+N_TKb;8ILdxj+jH?f#l$$(_b+$6GzwbF%ZpJO0`%d|3fL*3 z@VXjeVLI&QDH{DuDB1edQqVubI#C|*0;9pr)!2js*vKD%jM$QcDTty9FCKy{qw@SM ziJb88asaNryheM1Xmd1c`e^KMm{HW8fITZ?qR#f`gU6#unGrG&yu z|4mmN(YOVqQmQG2iW?(}4lw>?*msiKUO~z$0LV$YWkRWCdl8GRa4yEPgU{mV($j=T z22LQ9$*LhX=7Y-CELP$pKA44H3b&J!g9piZ+4qm&TcAa*q%IPOa9*JU>M60ufri6h zMxroPYqgE!2~A=ccg>7zs(}U}P7mK?o$#P)u!CLaAp$;E3D+<$&We~a#4HXwLqZoP>bsuJZXI!F^sZ~G_B`3f{D-JY zL&|!^>;@uVBaP7^gu#UQj)R37d^RE)W@shi{(Kw4AdLa{O4>?`jUHx^`zfa3nz1zU zAf7D*gMZw)p>t8gAf+X=s`dHxD|y3TU8LA{Jna_-P5*2o3ta`>=uvAL zTkzi$oUj@ztEwbQ13)TlH9XYDa^0T%6D&KfHX< z20bSD6mB*=`HvZocG!VWGtO+~2w*bv4h`EP>YPExu7~@_Be(rh9i{zKfurYJOo|eu z_&3uu(L+@ck>vr!fLlC9_wUKP4>@7{1VCQ>9S9#}z^2K>h( zpz0rd;QdkStc9&qsNO!!M>Jb`jjfMaA`u@O=MIvVq1W`!wWJW9j1MBTq^4se-@gi} z=%3HOf2dn+-x7vhgG`@3{8B)n_q0kBe`n;U4&ZcLA_srq3vwuFyBNp};-D6IbDLB` zAtV)UPnGGX44e(*Qa48q;|+(*(y>x^6Nzwqw(KA;2?%@TqAf;_`CZh9QWhght5)5I z?o&lBh?5L0Q^0v6$};hsLm2LDKB8b3h|ga9LcX>j_wUOz@617ngBn{OmL2)a+q%*u z{aSkHmwq^zsbwV3Z~Fe8-BwAXlOM;7s}rLxXPuWb1vt)dSFqXP{Nor#<~BcSd5RT_ ze@2zX_`07J6?U2~_yFTCj72;XQ>7+`3Jilv2DNAu%i)v^-|bB0I4)iJhRQmzT#Do( z3v%u~w-PCo63Lux|(b=Is^giw)+~kXo9?p`R(uDx=iJU@6zr_<~3ghbOSy zJAqfN-N-y@ia-EYb+T)s3C+?1!(o0jVN#Vzk3%}%36cEU>w`9bT39wI5(jv=PA@?X z*&xae4}$S}HG`wUmfs<(0MGBo*B`o<@Xg*W@zY>HKIUIe_#09DHQ-(n07tP3%)0o~1=0fPC{Jb@Oq2bcqxx8{Aoy?4r40f)KX3l~S>l*!Rc8iUH9 z($$rVzLI92--vP!Yq^YsYE<7tnv#(Q_YlfZjZ{kxGIlRZF_EKRIBJ%~m%_E7cN{Nr zEAtKOgO(>5$cBm2P+TVW$*jRp8lxh=sQGxo&etFQrvIB|B5GxgcP{imaq*_>_&Jd4 zkMx;;*Y{sc{hJ7MA;lvYf1#iMIeq?uq$uNo3& z==99I7Xnhm_fdroH;=~QDIP7s7ZuMpHT#8b@AL^P=%3@lZWaj=2W6PRV76w|_5nlw z;+bnDn_x4*$2tz--%>&7SMZ2+@vMGH`VlXEi2!ltDmJF-AjF7wbtdhh+vhZ9s3R)< zW-Xy9`l`AwQoHc$NAyOTX~KRslPDp7oD(xNRjnPiiUTG|ie0r82t);=@H#z21ggOC}a6e35CmJZ305OYA0F2^TnCxJj(xFh& z%t8q(0E96{CVX)69L0>Zh#b2K%t*gOsg2W8;N-gLefv|B^i|WfdufWz4rd-;4D*oK zaq$s>E{JN6ye^Y+M4KG2|i$bD~22hKw5#QxM|)62dYB zjuYWh{T9zkdKQU+N6TMmlL_<>zT)u@bmtSr+FwWOV7`7&c^F^K*7j$;!o)5e%$Ja) zZz|yfXWLq+;Bj0M#RwmVCNAd1SgQH0AVjFN+~er`u!!ZBhh7dei_~gsGaM(qV$#^H zE-N%2ZpBkQ@+H;WGF25==IEuwV!VPhfJXc&F%)0$&4iM}jgxBdt59PP$~0y7cx(w8 zQi+`U@tp_xpeXEI(bgq?N=*4UH6i~j=th48&U~L+lo)%dc6|P9_gQAM(!Rx?yqMcY z8P{yAA??fdRN+h9)uxIfC}v<|u-zj>|5fTFx-xw8>-`k_$4V|0O1BjL%JZCYxjsJU z2hs#*pk&k#|006FdmdQ=RW~8|>RXgxg-PrM{V-Bx*ueSP264gh7+DE<7>;Bp zt6YDMvMxTP^llTrxA@n~Dk{o!rIPYZDqX4$bIvfSghK92ILqyY^b9h3{!)eA303;} zUaO47gDa#ru0>0QsH1uLQ-1%4otErH`Xc&4yzmxv(eJkBN;=NF4DE53(C&t9z% zjUUwev+XJU+xEtH&TrK=!)+)MIULpThvd&XEQiTwd$Jf2s*Ye6?p_ZA$-elOMhxtq z=w#PAc6<5KhLpAqee; zW}>P)BM9LDGnlEoz%AMbS>Hf^e;8b zO@4_1x0yWzwO1~Qg)|q{^$P?X!S8$#K@2J`NXZgMrM%>vBoZMiY{?5Ga8-HME5c7! zvL%7tLN&OBZ<1TU6wjWQS1=Um+!ryh+Q^0~h7FNcKlb@F)lXeS`+LlZe@D9% z;rN^8QL4$3?K-!uu6U7vd~P@XqOzns?$V^PmicKMQ8GQ_{8rM|pU14CSbQd7dZ^u7 z`a|AP@RO&6YL0!IgKI=`!z6!r6b@|B5$j=-b^rHsl1&DQX6iHxWbR#&QT8p?i1n^- zSP&2J1gr5%_Fz~KP8OTxlEJm`*SUJZ6E7sH5>p_Sh|T`==nNBzrax1T@4ru(1Ai!I z^~d_Vm66niaVd@?Oxf>|dkMXqxrFGi5zTTRT~S)%hgu9)KcVB4maCqh(g{I7mp-nw z)o`M9kIK?`4kitE=<1W*cKgI`O~sR*bTSg!*D-TAY{t3d2INM3^Pviltj%)ZOxQ3l zSpBeG2TU-DfKGOdyHb^hX?WfIR^46l^QckIIrzppn+KLeVQ6z}-ZEI8&yEWp_9iKV zMcdfO$#m;4s>n2^m8r=0T=*5|%HnO2@#xH8qb7mwG6#IZysa_Q3pJ)0YWtmM+~8&= ztrI=ic|5kD{8^}pDab=kJpw2|Lf;af9o?HH*%VQ|QmJBFZ%|x90sSW!;7^Hz)pD0~ z-}5}M`b~{KS*@I41y!R2o`uQ($|yi2E$qB^^Z{C(@fVG^pYM)2CeUsi{jWbFGDen9 zfMlv*16vspSB{5@U+2CVE!oa<@!6rm~um_s7&9du$&YG-AN{nkDu1VG&{kY@?VR7;pI#%(nrCuq(@++udiynSY_ z`?&*U*=8VL9p|=RpTvhjZTsY5iS?J4*jl*zO?54QF~G#pzusJsYrs86;{CrQ;?BUR zn>Rbs;EUk|O2X(UL52RxSzg6ki^B2fo;wFNHbcLJZk;j?G0(gyw6+AQJvJoe z(a%_b1~$}#8HGh8acprv`S^t2wee;>RQwj{Qh3bSuUTQ{y|ZIzfk!@PK)BWYggSQ#U1&V zR<1J=yFax#7QDw8lkRc6`5lG*IL!Q6*O{C76s?;kt_Vh+p5vf=5%wt)wJFE1#6MUq zcm@(`fz(UKyfiQ1*PS)SK`^t2qx3a;8>`Jy=f~0$uRI^Q)+zl3b95Hhn*kfbGY@C* zG*<-Kj0f5{>pX!jiD!;jv5ed5@8$r6`dB6aT1gOVlfl5t6(-GmZ4j<@0J1)q7ANZ|2~-?FGRU*uo* zlxO)a&B(^wanyI6-psvyCXW*tR(2fernMlS1q-k**r4Kr*gPd-33jMevaQg3w3TeB zci~j!^jh?6u$J1&z-!oPG-)7Qdv}R{TgTWdVMMAhPH&o^1fB)Yv!}iRFTKggfivjE zfWVKKOT7KUY%O_BC-e1YsWIS|td9X}QxrhGP)w-e7Oyo#%_hnu>|?2h-r^9y=maMl zXVj0|ubEj(+PgKig!1n;#2#l#I1>K}m-BrQ+Q4Op{Cv)~?09=wQ=^L$Cf^Uw zi9n0rSA&Cs4A!OtKq$<64dFxeGH`8ZElhT^`XLuLvvJIq61Mr5w%{aSy7wm`RYdEGw1Zlej^9xNT44z zI83N!y8KBuW!BI#c0egp@p0BM%s6H#`|qxd zr*Xu+r;Y0+i?=B_Wwq6QsPFtXKENCL$yn{Oc5S-;CPY(MQ-y@o34;8z+pVSZ%5fXtYK=?olF zQfN9{l*@%T+>Q6O;u&q-QyjVX_AYH^M_C`K|ArW;p_`C~XL9B}A{S4xv9a+cs2yi= zaTf+g^7QnB^uaUtqYERI!7e8Z$y8HOA>a0iCvWr9OEb$P1AJu@lwsu~Vn}{rFS~Z~ z#)jD|W%_{-_g$(aePgh<@6)J!Qj`dCv3CdjqKF|fo-*KFv78C0TV)_&b0&rop9Rgn zanWP5gESR(H&v$wBo1IA_mGdQl9iA3h5!D6MYs9CJmx#z9 zltUvyAT#ggWw?ndL=AF-Ay<)az4gF;<%SKix&$@B2D)ZTKoH*9e5It~DJ0@>s3Q`Z ze{3o{;kpPARJ|#NQjI(X+>;L(xfm+0g+Ki*L*p{ew(eIDcKv+xl!1ijj!Mo}>gA?S zHIG2|`tMPsiOifyDiSDy_h56s)f!h$HroEiZ|=+Vzq`N$1{jEfSa+20Ffp0+s9gQMe>*e=L^iBL)1s za`sc>Q;M^V!_sIKGKI@;u|@2m3_8J_nY3qnP<#<(zHp_^Us$$Bpq)z{uVu0rYVrK5LVCQXo=WsyvLpnsJdr_GNmh^!0!NrF zw_IV)FoguS*zM8cs?G?7SuC<$sB~Bqa6Sf#216N4*#nt8Zt*dS#koyg>kktc6^~3w zz^!8f=TOM3Ev8ckx65kdYu}cqb5J&MF8UStJWzNJPd9aY2?GSmqDkWPsD&MZE z*s}@kz{0x})Y;#_wB@L97_J>Zm{s{42%b*5y3Y4p3k_kbx>7E<~ zcWNzz^(LxJ9(6I1A)zNaS$T7SkJ3o_C)Fj1DfvmFAMoPn(9y=gWUya{P`T=jX~l`7hv>ARRd`@xxK8vX*)F3UT$kDt7)}Xa5BJx@#eBY9y(ydiX;?0;(k5hYgr!t&rV4x5XKi1$YHQ(-6#4J&-djLJf^QHk@GhE;#|YamyWA-}94uOY=QwoCij+Zw&+invc zysq@w7+r)MMmFmo`hx1b_3^Yb0=VeI_}x)1j+p!w-ud8b;_J--n-3Bc4Oe;TN7J1< z%bt2S`{QH>`yWzM88?)50~1Ttx9r@w4K zq%#@c(1=c<>lN6KsIanXf}w>S0TN9WFJUij1`^%%jvhS4YM#-!G|wx=-xB`@9xhT( zmSQe_eyOUdnn=k>%2*CQQp>k>y`;frM}ij%2}o6^VPClqSR|h)-LO=ydcG7li%25N zjR5p#KZ%g^jQ(jiiwu{|M#ssAH{GbZ|J&uG(J?PT3i~9AN1pR6d#1sb=KM5nlwYS= zU8P!xKo`@9Yp=Tdw}7 zs~*_q?nW7D=PgMl_DuOPb`kivl)R)QjmzT zDOW=0s-r(rGtj`pKsob1ypSBpqrL?WQ*3G#Q&yyu@Y}jD3<*SGR5B>Ly~@(fL|`We z8?%xMQt>)OgwR_@GNauB{YgR9w~HVPLeriKlypr^&=W3WO-;%Blhr;I$jI8uJdnOBP#4D`ZfAIJla2}8^-N3yrSJ9;!L(xRJJq@gNUg7X0rWH&4 z0k6p{AiD*6!p62mTm2mr^dYNtqTm6?I9OJqBGoIf-MRlpdorzsqKt_E^tl9U1ja{7 zeTpK>Xm|N zP*O}L0+V3GnIgvIa)2GSkvgcIzG?)QXTyRoloq~+!J5* zcjeFgJzX{MVHul$mRP<*m>d z)npe_-yJTxSsEh+AmNnw{K5Anp=0~%xQT=`_RiwYKW#mmkmfJEiCE&_JiFPLHKP5l z_w=3ZZ_?aOEPBCPm(xz66r3*BmkBZ}0kY4^RpIsZQA=#71vrVhp;ahHBBn|hxBJn7 zoR@hPt4e|t4KQzMKX0I|;ms_?_Gngm;;RJH|4%x0|BHia*0XP2eTPNCM40_TXw$QL zAAKKcrj?*+wzXAjov|+}l}?Ev$X<-KCs>sLC)=fi_cE{&)9!HfK(du_aTe_AN$X((GJ?&WM{xbulrwX^lsLz z5M7;j``>=?|6HtMdCtx?k)I?}LF>QUZ~DRd-_3huGMU%@x0-&kcKM&D({0slbv2(| zXk5y%PX9*duCAap?4(+{QiL>EH8iMKNNX^cgqDMvhT&N|t>17Ai>DdGKCMB6X7qc(?2w-%g+W7)ty zEdjxU;(g;vn*M^Nw8&xABbN;B$Cvr5CNr}}SD9*;A_c&aP1Tfl4MwNX2E`Mpil={T z4u-;};6^3J zkxkA^$Rz+a&BF-=gLGiXur)tnOE43274d}D$vc)=N2dOQT^Y!D@@%T(BnfFG zI{C%p7EJryOQ)q{ntju=06n!mu9W+O8{D^gmRK(-^6TPn?&8p06)N`TejC;^iDqdx zKsOnxxj_TwAc0~$JLax;PjGM8^zZ%MvSjLMCG$$%V&xOk^{}`DutsWzSvP}#F!B~( zAYCe*WzHeZ-K7Te-C0v~UbbN0=ujDoNI^*San;(Dugkdl7D-;&jM)ZWAK{knN^$y7 z#wuVbz#<*?6QV+gr7SytHF{vsnNb9i=*Ui~5VTjFPq=;7Pyv3;IZx^tsrkmk#a(>a z?U3hFDbu7JvU*I-G7Lc-!5WLMct%fnRT`XbR86gs%Fos$WmS06s9f>MRkWpv7(H2oP#Cg3UHHIs z4wT)90v;X_HbTNS1`)G6Qv7Tshy*tTnOYi}Cn3fVbf$?bh8KA3Ys2@QbM9CA~RM1pi^o*PN<8X z?$rBXWBh<=Gu8d@)W|ykAZlq)bj4jEK<1c9Y@{%YK5W_8o>(Q|UHWK?X~Yz$+3>}+ zf)Oq%4gMekY_wgH7Jw~-QX8X2tXZ<`8qD8x=!=O1Gpj9@f!-@^WYn?lDIzMQ;ZOIJ zqX740nh3+Ub%<5_i<05&16DHixx_cJW$~*4u0&BXf3NH$X>6b|A0-Y^8W8~jj~KW= z;9dYV5Z%ZLF0-W@*-7Re3$$-Z?_<(mGwD_9Wmf2qz^+o*`+dR0luW{cOueWA7M771 zHi)6TC>fvJA|tKgfeH2^)Z%FL++&3nx<;0TA$lqv>90s8YyACVEZ}0LPfqSZpYGZ} z(9`0rGo^(RCtji1F>s!2)WhR`>%HRUtS|5r0{urPgAwe@lgS3EEKUIgnaqr(2V23@ zTxyD3b!S_f8v1*xxYlWr@!kIUaH=fHO&+B2cxDN-5K-o51Dv7&(%|$bIxUMD|EbMK zi|G$dnW>4Hn4QjxLKYb@geM>Qx(doydhuDln5gf=2O=nzslqR76c=mah>F4Qg4248 zCF=Zx2iB&UNimJjR6Gz~>t-?=Hb6e11_OnVa>9=u|$zZl8UwJ9=9GWrGFdd2VTF|<{XFmd z*!AN&@gUX!D`4LDPjJwQ1Pp7;gGz}kg6J)*Y0v3z8JU_lZR=EgK#V>G9cmrGa<4Q} zvBNFkG3>a(|95I(4rz^CLtJT^cIaGA0#Hqy92Gg3{g6#o;~2l)=aij~Dy~eh-55c@ zAi=@E;wFrv0J*k;vH&ohRSdRt)6c2HyOXr_GPTy5r=wYM2XHX4Is7rW9n{QUlzdsS z(K-3^S#(OI`)~c)9JxK@2qn{#WeA4`_lltAsofu1=)0N4K}%pzEkrFxwcv`Lo;0cU z+gDu{j8NfWyRQ?TadwC|=sIak(a!=Om+vTT94$MnVa_GpD)$XeX^w@5I!)mqp|Sq< z^WlEp)z#fClX)~cEf|(amH~1)ZCSupGFl(4hQ=X*vB5PAMVNywW^KmS8_;{&%VF^e zsz&~}m(Z2!@+{^SgUj7-Zp<=G!5}omk2xw+n;}ifH4(3 zvr-P@ax^?Q=;^I&n~stLc_8f_)A`MPwDT_!1L6-?|pzS3(fxW6{~p zmTmlKO}1FPUr4aa=trgvWQT9xA#PKC5G zx~Imw<3f=kpi^?_@xy%QSfz5hN(IWuq=J1*v(1{#nzv76Pp5hCFI6wdTZLv?&!QGM z#lkoRHmDen3yMlxrSpT<_}888OewuZgeV^GMV&=2gRRq8d7beOZf== zip4P#JXY>5Jkpdrr0gM@hO7jKjfGBaoHArFuXgQ^_q;_SL{hs#Czqp}D_eG6is)=u z|2EO&J)#_s)uxMEB%aPza2tVX^_wVoB{&!GosvxZP`G-lXt!~6Xa${im~)V4NwIct zShvodI;wch(%OOFM|{;n_A-=tF}ht6T+%8mZ}w*V4Rs}LCf|;n>IY%OL=#_ebEA>- z`Quh-`v^vbovl-jlG71y47=3V4C#aH9Gb>kYomnX*Xk8P&N@jWc9RtZgOi67sBY0I3Md04OO)*a<$kTAj)_e}{VWJs@d zcNPs71e=NJ6fmcl@J;N9noqHLH*tI$zl-5#YwmX`B~4MrO<*S@GA>77 zktho`-=lt~G$?E}Aoa>y*SwU!-puXB?iu5wt88T4#b>bRG_IlE)t|r|FQvLLvDDzx zs;JPi9T(gO!9htGF_sh@)Rk&g@|+WJp@2-Jx=!BEk^WBGyn_b2MBwmW+S9U?3K!J=nCMv6Pk4Becek@hh77oat zB1?l*eL-CXhPaYOKF$>Y@cB|>N5u~)W6)ALQPt`j09+v9l|=siRVd*$qs+uWOM|3< zwZS#KqqCgh+?-)XQ@X%Md z7NC&usGDYQ=ALd}o6RTXS!zTC>w|K7Vv9n`{xn1;7VRHQEZftIl#s^_t=|+OXJgJ5 zHD~Cw6)NpS%VB2mUXqrvu{$J}TM@jek+VDToOlk(ZVM3#`JEBYK;i>9t%Cd%!i;5W zuJ650QGB6t@%&7|rz9)E$8EtY_-ZD_7CXPus*C1Tr}wIrvN{zsI*Th%C?JfaE-?(n z%GD(;?rORyzlPQs%jSQv9>?P$f7N*qQ%?_+^oFS@_tyE$$AycFsQ=%V1lN<&x>*rEe z*y*X2vr#DdR4F&fo2TeZjfNn5=3JTc&Yw2zS-Ru&m2cG&B+61{!0{`K>*I?S!$1Wc zjS@it+6NTMkX>&!+np7@U219R)-|%>T|Xzexi;`zUN=#W#+PPy;f?`ya`%Y4P}7lR z>e(D*R(`y6$3=Pzd4dja$uANIqC`X^krt_SCKQ#Hk?JhL1x|Dn+PgOS6RjC$GczTC z?22`8cWem8wXll@zSG$$RNTabrpm_R5Pvk8W|e)U{k#?H_0AoUz8l* zjL*1vL`xsq;wWX?wwRdqvwl4w{~LnR^xdVuBvph-RYJuLaU$?Z zScsJN+4GRgu3HeRHPNih0;U7SVBM;}xLk-i;px)Jg9*TA)0hM=OWQjz)8yTS5h**w zddE>-Kx!wV5It&_RFsa+}j5+lC<^QR{3rOL*)@d5OKHV|g4aXTS3y_g#= z_0FL?W?qC)?^@U5GN<2hVVs~gFT$YP;~tIEy#vpw-(YA1WqF>H19@1(ex(Xqt#aRw znjA=P^<);Gg#?IH0FkhUhf21edIgzJafeX`qml2Z9lp{MmuiMyo3Pa0zr4Kdw&Hnj ztFZ1+Sx3Y8;VC-J6|cm`&^wM5q+o7~xH6%LYE}E?i%H3$1>hFHp4Byic;)IPI*dWr zDt-c2OT+2-uG)gAIsDTQo#?@tM=MhS3e?^hI{gKaDG?-@)TYY)IWDEG<5ARa2X=3tf4Lc-~CD!gLt{qRSB<8>3sCw=>kIil3>P% z@I1fnp)^lsWE#{W7l3HN&?2vSC}vJ}uG})6o0iW8@79Yc#y6)ndVBBY4v`wTKFMCHvUtvg}NwBoHBjvsvWy8 z4j3h^1H&wMzsj% z6peOBgOsix!`Nb*oF1uCZYCJBA=(Ow+1u+KU*adA@q%mNi8G+MhgCOoYJ5J*Y)rDG zI2Yw8@h!OVBDY}bmhZyF&Xt%u6@N3{WU%zFo$T0tA>u%atmKc>qLqH4BV*_gdnht3 zdmNz{hdbVes>^sU8;1h=z=K-#QH6DOicSPdcB&QaL@p1Bq|&7?PYDT+-Lf5Qs&lqB zICrlmn>r&FxYzGt@y?D@Z2!I-LqNs%P^eBZ+PebP`F>ZcmJ`a}q2#tpvnyXZE5LA` z>`qlm6E(vbqc^C>1#cvhx;NDOhinoTPBL5&RS=8l0=z|@A{GwJ7L9687NKd7 zJOp+DS@cTatEIiBoqBbUJ4T`wTz*pc6%!nDsp!KFHgC=Zjkfeix|ZHg=(IbRC`bz> zehs=HFC+1dE1MMDr_fX!>_Uq|`HPOh6NuvHS&ijlHyi;*UX3uSOmCe!NBs6hl}WPs>H z5BRSOOqo!?uDD478gY^9EdiR$8paJ7mUBuXtA%r(=4ezKfCJVdegqYJS5aWc4d9v~NNQ*UuLJ(*>o{w)#O!yN4c}jfc@(6& z{X`HFYz4~uB}2DR2FzsN5V?&FmEL}-Ay^JOe&V0ggeIjMNQJ-MDH5S8e_ZGDbuqx!RTV4@10Kzp`fSd z)!t>VQ1$4A%*QY-Iq?-~)7tzW>dx`GlBnI{C$>*)I}=ZA+xBE)+xEoHL?@WooY=OV zOl;dX?|Z-9|KN62Kh?FndVkxkXZ_aNt48?5)=Za^jo1O#NF=1uFo{kM!!em1W;pL( zbdX`bINgMH!UIgsW|`sI$X6C)fZO5K&Rmixa|5fc8)7nB24Stj39E%$sEIrcAp&GP5zXY@{BF!q zbD`^xymPyGS5$ef2f4Q!GI?k!+MWDA`2rY(ia3K)6pdZ82*8}{g1levy z6b1!s58=eaHj!w_5Z~U6?I>$S%k1L#_N;YtaX;j+Qv$s%$Gv67)W}a9RaNDX?Nzxf zE)%>}E^tC~Wc;&dn;H~7>M}k7oLQ89p-)}Fcp@!5PcO-Rpl39poNxll>1VUGyiw;c z3Z&W5nOUTc?i({3($D=;B4fvpH>h_Ck#e|k#4QRc5$rIqS@?huS9n}-mxz?NL}(G- z=&W&>_4oKz@?Wt81igX%qzyIV&UfKAO+Fw`-1*mOrsU@si}0nC216G%dd5_+cs7#3 zrNF?Z6>8k?gQqTFqZk*#(Z#T&?0H$Dmc)b8hw#GC+ucj-qRvNW-boI$v$9+11QFPt zR0L99vzW7@t(qB#ivVY8_ky)6Kr*-z+_4AWUgwsU z1IU>YkSR-oK`HURS8*vgzA=Mx&lEN!E*ZlfwGjKxKkRK(59BiNX@*=y}6t`^C zxcJtnZlHh*`>Niw&e(pn8=BTE{#(BeY_a~A)c#LL;(rJKQ}frvzfRRqu;NuR>gZ}{ zsLNUnXqDqlt2ZTR(4{WKSX#}lHmWSH{cJS;!n(isZX0WpQd_MuT@8Axm~wuss3M64 z#&QH}tI-N|#;;MjG<;-RC`gk;W;!tV6s^SpmDN9feaqbMr(dX#?*D^*`&n@bPOyAy z{w&w!56CEd>yBvd7)t4p2OL}}3oB<0odNJ6!T5}gwdEdzTO4<4Xu3VsWpL6^%a6($AW1%%HffTh*~&|>oR z`VNb2NKvDI`R9_N67zvh@^qB`0BKa>Rnvjr0S$y9`Bu20gfgUc>bzAB7m+7_Ll;Y< zf5;f^D-*6GB#H&HHH9m{Vvd2`E4hI;M|UP?mKIl~ z3ibIX+^cjF?06h9Nz~_Oq+w>wN;L<9ya-g>3B+iH2UFCgMU;l-ZtP!IO@o&`<)PB?pYtqS6B7k_@JCuD{1lQVs8Pm$-y>GIxm z1v}suhk~4e_bf(O2xA&RJ~o&e6(B@&f)FHYnfnoB2gt({j#x*d{T|+HUU7gQR6^cT z_hHz2;juL+%o`&g^3Of9+0u}Nm&{Sf-y;eUngrnJ)f`??qdL~6GtZ1gg%d3*#-1oF z6yFK!m&aNyP2Vek4VFGQr3XOJL@4N+*}-vw!Gh+glBS!GCOSYkAdA%CiqHYM41m|z zrGBZ>%&@;l9CHSQM+c=~f@j6J9z!B3@LLeM*ns^bZnmf5545FIC==^8+`_0yb*3jh zqHTyIvriF+86!R>UkeTdc{`z0cgfs&dzwYZ555|5vn5od1gM;1QGP*dM7@Y*gOuo^ zRNlX*)&vn7GQ2(d@+JFs6{sGLGuGS@M%J7)*Y9i3qVEh%M^NyH`tjtB*D+8Vg`PLN zgw}j7Sf@B=C16r~7)_`gF7D1=23dFp2{@=iAjZYy1y;uw<0-CmcV)^d99P7mlLUZ8 zqb_f^#h&(h1bsD;LZS}wGUTEnxDh0Hzpbl+ljP@QrQ=udg)m1@A!wTpC;4O)2;Qq@ zF7QEjIgKmd_BeL3`A{%Ard@;Bkm0pIxVv$tF~!9fO^Q5-HhH{B)=kZ{4ot`TMcV~ek^@5jrR2lF@N)x0KY9$_u zu7H8%>SS-&>I8Krx>~Q8k(#t6ldzJof8TS(v~2k}|J`VN*#3z_prH56{%w7;)lFLS zj{zzY6G#B_J#a)~0?0F|r`SNhy*)(wZ~vf<9djF6ErlgXPs;i`a=@FGS1?dKTA`qB zNIyD(uGCP5nwg zL)Z>Tfk&kPAaN9Xe9k&DQ;$7{SNe8#As!&@Mo`h#^ubMN$8(9RivK~X zR>6mBf|KlKVlI+_*#@kiPQnTv1mK~yHNpc&$i#eGeQ@WEkOSgZ!fH^6uW9=2e6G%3 z+@T+%pZQU!$SFvK|G5R_KgCdmGCnQT4Pr3vD`mRg2LNS&Z3md)~Rig+KJvvjMh`9m~ZB)k10~xll(XC6ww<3A7ow1&vUlN(dY-U5ZhNN&=ZNb1FHQ z-aI(AmNA1K?% z;>e?U7yS31Nl^H9`0`VLZtrKfBeQRg8Df*-0Q{qH`;?HM zPTs234qg+G4N<0B^Uln_zXEjmQ6Gw~N^;9XhfOe%e$n6gDPq>i{YJzJ5bz0=jv@O1 z?~jh?&D~MZsf5X!LYP{qK3MtttoI3oVm27ENld#{{+oye^lGYcTq7E(=&sjMga1yF zA|k-cextm7f*&#)PY;iF3XPv(zN8B8RPTwh)>C)lA|YRymg~>r`1o+uMBv?92HmU$ z+HnZ9aJnpHB6A6B5}_a(K~7gp20KB@i@Kc_-h*k8?W%JZvZAK@LyEc2 zAqYzl_f5eZ#jSc3k}LPdJNNvPIkd+HEP`F;yDijWe12kC7p)5-i;PA*({bD`)WJ(! z$^E1^3PESc?ddahu9A01MbJ26ofOL$3>k@2g^r!<)1k1vC@?T$F%m(^frb;QyJRKq|*4@)>1U?-@!^@db*H#)|Y6xD6Pz<2_(%{y8 z51@jU8E=H8#gCj?DcdaMg!FFao4(@CJM60^r85$@Gbma(+sdch}P^Clqn*u&B%~$>0cW1wcolGSi*6ktB#|flQt6k=K3HS#|XFuli<4? zq_+8+0~ubF-`y=ZPfpGH)8fJ5%yqj2y`srd!cK$RB+MUop-M3Box^oK`C4l_RW_;K z@ODp=ayoy%wMX;GQD3+Ho968VXJPjEd{)BcM|5hZUe*HGde}&?6;@Ywaa&cH2r>z) z9!&O`$S55Y@zV?;c*yftQ~zjc+_3ity<%>jSIIr9F(5<*71<1X2A@Zz1F7$kT9S3Ve=M-AxVxWib`Rp*k{Hj=M>kHDx`#18 zU%fEn%Mc1e4I&95gR`{2VP1nMRo(}SFU73s$vZ>;P>|U0ikrs8)^uCHHq=o_;JQbn zh|4YOUdq+ZPea!My49oBd_ZyyJ4Ox0nBy{L)%7Q=FB;qE^xI%T*#b3W)Qm`Nf6@ht z!*cGL->?5O?#2nTF^!g|weS?FTLzPkE|dQ)Dv_^6H)^=0uCk!6q>iSHsjg&nLSPvr zOvZ&CTF3~#I1SGL_6I^(1Uj5N*>#Q#FS$3Yl*7ab5E@P50u#X=dCoGerb+>YE)##J zAimD!N{~+$mKv5yML`iz2m)DsG{5)L;gK<$s!*3gBvukvfq}hL3Ex zL-vKfRq~nWeW=sMG^i@H*64mKQ3Su=gqU`&(0ple@Q+@D2a#TR%Y5S(QH}8F3wacK zyW`mlb5bP6fBL*CWtL9tY;BtkgynFr+E(Yk;tMR_g}YJbC{969GgK^V2q@YH@1Hw^ zTz3#5Emv3vSZwU)LV&VWT%FuVhKugGzdQ~vB%Eldz~D}hneyYbZ1yof3W^(#pZ?u3 zbkI3&Ru=`~!NyC!q1Ndu2?IaI@beOCIYJY{0A$?IlQr@(ziQCDvj_x4^}8S;&qFLI z4Z&-3uyxXZ8>!xc68kp-!_)2G}5ay(rJ9v8cVfO zv3x%z7%GuS30*6-N^8SgXZ^P935P6^vJg3dY#WFU)1*m|RW$uM^;>MtH}V#)Y|8^? zB0VOOeiah!H6wX4j7i5R<*zwQby8P!ekogN{ISAXov#!xX{1RGsv}1vu-{bY6OL&ov^m=SArM6}WY^X&J40X@)Vpep;jrUm?b{)lFKKlrN}a4eYW z1PiPBMr{cW6OjosUH8TbRM$Mxr7QWJAMu;cBr&Lnq+=xzUHRc}I|_;HQd|fdU1`bJ z@Aa-3kC9|KLx)BYTTTlP>V1q2Vj7A+#P-#rBt+TqVh`Ptvs5Xr3${z@&r@}^b!{N8 z_#q!&5RTpmWC#F6iIFjLHoyt*Ow(Wod>2MjA}>{3STzq;JPDW};xo2fRX0mA^~o3< zV;q!uMzkhQ=6H$Vhugk8P|CmzNv{zzX0|weFd=(4zD_y`pe+r`E3we4D-B;^f}T{k z<(=c>t8kT5Xeq-hK#e#fxgf^iqt`i%3UmrDA@0IHJ922x2Ep9$U~EH?cP+5jezD@z zh1f!IA>hw@K<+_Bq0f0IkIFO5Nzm#f>CCm@T(tI^%Ah4HSmC6@yXQuo39|1jhA(M1fUa$VZ3q|H|2Z zbIVO-Uf@>Qp|EfkGNYkGwOJZW9S&ddbfV-Ma#4G0o|grvk`k`=BPV(P3cjYIDQ;TK zqAAv_7ujaPkS_N#FMpZT_mW{zxccb@RPEdb8TcTRf>wpz?3+LX+v*&7VE0QT46 zf1gSP_I*NS|O$0mwrWFlibUE?6-u?MA*Ip$V zR<0=<>Q7{f;bKq6#1D4jn*x7FLG}9kgA3hnn%bv*yVF_o@uEu#x9I#Czc5jeX(82r zv`IE_)J%R^Ln$E%A=?&5lrbcH5Dz*(k*R)s|Hj-#dx>`CRLW!#1iipb{9_0IFwK0- zl{D(kc5wY%6Ta0`6OOTDQ0kN(PnD^pEF;wEg<&JlAlwjvhbXh&^S74{++hx3E}|Dd z6z1GRCIOc?Gv%5K{u-hgMc&&C<&Akd!nV zU>eGqp5S)Z?fBES-SCM=$^I09y%92^!*tAM97Pd*_p-m-% zfo8>21O4r1kiJ`c>A^9l1NqhCjx#0<3zy7vxA7Ecks8IAoV1SC#D|WM(m{&|Lb)O;ri~t3! zI3kW?+a8H9XT|QA%DoVbMIB96G6~*ulmhQh*|zT?TYE^Sb9lp6f+ho1{d@DjhL0uH zQrzhxfc;U^PA-DsHN2XG`s=m1oqvZM4>1D5aij|7aW{rwbNtNdl{iC!N-Vune{~;w zoR$SH^pmP#s%hHX;D7onIJ^Y!(R#lgBNvLgC~E_}Cr3pIYDJYQ;whQsq2PgFr>~+5 z`SB(Us}hVjC!qDNmCoJXiGPkb*F?My?%$M&J`CGy&mJvieHnpMjH5-r@<$xA-z+ET zd{w$q(PL+co6$9_NOihNQa@!pIJb)|*C*HzbTb9V;+dflm)=s8LuLrr&{#tHAtU6D zd(eL9nnhg(>F?HSr43cHW&qOR$?E)r?aNXaH`f-FO3JE@) zo2K99{czMHC^sl>mLDoR2Ltl2Y+DyMjHay=cav)ys|>I zjBn{DiHM6D1!|xS5o(^O5SbVaHTx+VM(%Yiq9(YjFdF_}y~BhaMd3LJ<|?OJ5QnoV zR~g?wHY9J&$uL0Y*gdpSQLq@aSoqU0t3^DGyK+!6$+=M_e!Y_6LO>P@j>(L6WGAzr z&BMa0(Wq!ZP`+MajzZSpFC|k-IGJQI7Bn<~JcgJ!Whs{h6`80R@&3n0`fspV+TmgL7BCVs<#wi#i1VmhPr+-$L=a2X;`pG%)m z?jO$sg#LyY1>tG%-~1;k3tsULa-r` zDq3Xp9@{EHB`(PxrSMV-cfDuHIHcNSQDQsW$#>@DYGMuA83O5bMGe4=6fm?#7c{vl zQ8k7N25n0QDSc@WxU`NmAV$PUjD?P8h$1+24>f6#?j_EEczbY_VPEjSq_Q|Ay3 ztZ|p?0Ry8ITf4v0M>h2GxWD#YJfU)ae6RWAri{R>!~691wmy4sh&}p-&_H}Lu#|qr zd0H$E{3+J_UjODc+{qd&I zuG@DO;1}tH0te8`WI>Y62z)Su%`64`&YkO=bGbdU(w>33F13R2f#NU_-sd0uO(SnY z0IrdY)|~@EwNfq#=Je_#JDly?cc${AY0oI1oBm&D1mYKtTQ?qiXa+6|5Jmj)NFcFK z*;W(mCwgHi0ph)MM#SvFP2=7ATPBqIw(k~GQ4bku<7fyoH~+ep2tTW1V3;>tq*DAT zY$In>im1-uW<=nWNQWf!d{N5bWuT?MzSYV)zbOnGEqn#b*y}0ec8|tL#~LU_lHZ>M zX$K?fsmfY&MI)>P$tZ|YGa`bZ6U0_&$y6JL-a6NiaCUHo9j0@t-`VYW=ttyFtLk>Z z2J0k#x4ZSdrC}>x->}TQk~ki|zJ(i(I@ju}**!Q+e@F4_g4%>$yT$hR!!fkOP0b0! zZU(BtFwk}E_~!n2$8t+uZ*7Z{UQ!k=2!k1!SUFxHKpqm!dgXe$<&C41pG5b`nAP zyai$={^Ur8<8BE68(w<-{6E_j2|xr46*dqy06+o&gnf&+J>qYavW@c1SabtDJx(++ zhEEyqOUc%-z(WSOZOO|ZN7Jw5L6N}=)3Eo@C<}oLl?hQQ@=sLk*>_Ayu2e1STd1-B z)Nxl2=GCm2+Lh?2O9Vf^IBnb*nJ-!V z<)+W`6&>uX_BFn_dPVrPzCPrN{MylTb|JTKxv|!|#%Q-zvKU~qrd1W_ILUk2cF^fS z?7QhqD>y>UcOuDFY7$7sBk!VS0tw z+u1yKcegt!-GDfCC31JDcy+gxwPCHUYUM;K{YoVB?l5n;RDWD67NCO%0IK#=Qkw}| zY73ffQ~Ay>ntCz;Ul0(OaL4xogJ5A5dqqv}sq`p#L{nRSrq9cw;!~p^>DyrX8>H92u|IcY)~Fb|=vJ;|4$5 z+Q$B+y9~44#bz4_{Zt?Ne$9b5yIbi94**1Ru59vo3~m$~TbTt(Zfxw2nq0bXZck<3 znvHed`@CMp89{wfJ^GJrj^2T1y+9~kW&nzN&G+y&!c2L0cK$O08YMRMCD%6Jf6GAsV#&(8aZTUdH(TFr-oV#w3)$ec^$6@%dvi0mEb(#S zsEL2${4uk6a=e+LBjE1t+Q;pi?zGhdM4K1DmU$lpSVK>>VQOGlKCd!T`rGZc66rA2 z(X%wi|Hyj~!M#!Um%v=FbPb8}1_7sdJQQKyvx1lXY32)0-;O6uF^*nR{bRCL9wZ;U@mVM5n z@A|F>)uX#z+m`pjWvtbRuf02~zE^=OI-&a}UkB7Fd0Qp^xP5VN+hNO;<4XNEg9D*b z{f*O(_F{?P_6OeP%`H+f4PTA3)%{jQXW#m%PKYgUx(<7V1M0!qY-ae*iE8(a)=l4& zdz-uS4TS()onwOo?Wva5dI9o7=<248p|vp(V=&XaYje}?*HugHzWiqhETAPFAP@is z0sxR8iuJ+IAUn_Qt5_aKtrR=^^3UC!JFKUKC6e_HSjsy2w+x~>(>n&nnSw99%)Q(s zmu5@6JK`!04BAe+5d$tHH|-E#V>_Tao#h`+Eo@H?-COHhn>W{eihMgSf{$K{B^fW4 zoVPsid^sMBHQk&usd6?l>s)n~>UquFAoC&#vtF(rn-@4h9h zPw_V2a@b$=bu*tLCTX%lG^Uj9u{qZ~fY>!01Oh;v0RXtZK(M9a+THMi^$DWa zGvr1?TVe?N>hf}LyZVduM<(y)6nl5cy2hrdmXkQ67kAYx=kfw!^@mx{wNd^IN&r+1 z0012@Z7IIdlg_&mo~P(`rD$_-aX3)Ta$(z+K0cC4cL?y^zI$EisLNG8d#t;e`=vt{ zqmIcm#RRXdE4z^2vf+C=MWhmk=VHnIFgE3NSm!!dXxTJ}vH8ttfj@`C-fqkW;S#3v z>VEv`LZE6Jcz)k24GRzgUQ+No<2ug6j@x9Q2IN(a8BYk5<37~9w-ePnIz+}!1+6esu)B?VijKU&OSfEnnZmZ zWfG@4>R0F`qbTtUK?o6jt%R@D z01ixm1h;_fw*ZjK#UMcl{bpsi$dnG{XSYn@jLZ{M8=l4y0;ox&lArA(<#wJp_c5P{BGF>CJt%OvsMlj8qCzu+ZBnC zq#=pWwOFBAio@xqQjC#SNFo8Nm>%8J6++-PLV;3Kto`uN;eqLY=#a?7>}#C-Nn6H( z5c(06;6~x0LkdOm9ikISaf$PcVpkIpa~ngbdh-*<`^9Sg`}?3iMudiONM=4o0SA)v!oOavhuu*?<&{vPpM}sjOJyC=>%3oU)}T zD2YUaL?Sc@Xl9B1{uL5n0i8&Roqt4uIA;VD(nii>gU^UpA(#kbjLVml6Z3~d?JxC~ zeHMMrZV-bBXsIAjw;|)zZJS~n-?S-5Uqi?DH+*}Gd6b3Iz{>l{v(H^xlvtCTHTKId z$|;(`%@nwv$V>x%IbCM>R!=MUueT1NC$XMaR?`! zH!dgLi^)tCpqR-5M_~bove=OzNzj6rn!!q-XR9GG4=vWh|?j#z`~XRymM zQ1p>V3;TB5wI;#^e0IIxe~ukYo!y@Zp*lw(_&*BDy-K{-9tD}7XQF(%e@NWXPt;O3 z*{Gx3CW`Hzbtd}{Y%~pCh&lV^DmdTSCQ3MeNjwN^6#B7iHPL+9|rA1ds%V<%H79CeBGwDg#A$Aa|Vo~7S9X1 z{n6faXH)~p+my|64&s>NZfCFe}9z2d=+1ucpfG{T&VxjcWpMiUMB7Xk&4W8TfKC* z@zT^g!Le~wD(gXw;&@QTP&aNPOSJqjB8N?3?suFi@A)4(^YT%BtvRWz1A6UL)%vIr zb-X&)SW`cIv0ZyE9t!sA(uT}-!NZu3-D>%@+f^jP4_?%_O`Z!y=ks9)@#4Q2T{dIx ztlkBRFcrPAIhU?q-h&3$k<*o?yyY$F=4J$Or2x-E+4o`ay+_NYHJM%eY{4f1ms^x~ z6)QrGi!zG=yTU(wIwyuOr*wsX#MM0nsy*?25s^yw`6Nh40|G)rd9P8>ymPh?Z|&0> zoeq9-QA>EkOda=oTPw3|oro9CjJISY5*51;rLLqHWVG$EGNLvTeyU^O%f-7Qc#E`j zUL8hHHS^kUJfHg8j~mPr#`3uEFupKuRQy+Fdr>ow0d(ic4ZX`}_4aj}ZqS#qQgrJo z$J%7M_aa!EE9&{Iq{Gmrs2E@VJTRRR|GVcdww-RxAI5U{QJ=J$xAyl!OPq5btD?^y z8)%SGPy7~`31erPayQB!e*)%gDsMX|^z+nlR@%472S~GOon_JxLka5ppr}=`KzI*hU*h4$^;U?AUN&1WgQMKFr!6`u7xfs{ri7%9mD+8e4(HA0M6&Rtj2#x- zH@8Rml3o2hxWia^2wpjLe>UCh_^bZQR>R8k(H>SP7K?f1>e0*nYFBtLWp1(T@r`E0 z?|QA>?RCRiYj&ApA+#ETALGT4Ubx&5sZZ%M=`YF9?#aK~vgrdtAAzkc$RBw5W)Di$f`r2M)+-+ypT9sQ4Hy9?(7!Ou|m%MGa| zkEQJ4Jtt27%3T;2pDmpPFL}e)B>~B6c)b=T8tFq&4>Xg;Mv)ffNIRrVK)uOC>l*ee z^JA!cysVQb^2XBo6xdXToZ{1K_nf=^5AehWTKB3ZUYw9L$>K*A3M$6dnfWrU}JQ=te)e=@d{ z`&}R5ysqD{!Ov0aGlb30yTPZsJgA~!XsU=wj2$>~4J%CF!z#uH#^r=x&TP()WZp%y zwfuQ!m$}ydy=Qt%@{wiS+b<V*i?pjuvNw0mT$*nvAX0PQb1e+=JhEfKHy0TIDmRsPZShIQ{*<7< z=hRwOx;38A#!hS+l$AHbNY?J^tZehor){?V&%Ws@nLJz0)!NP1 z{?KG{JA#j=VEiP1mMgEQ5FW&$~l@KC2v>f(pLgR>HRzTAPGoPa4)3L-uuwoD;B~ zo0gk%tA*)dN*4nH7-ZNi=k~bY=5jvj*6u&b9W#et1#Gy29ozA?7JeA1`HUS4OrH9} zT)s#PZ_Ei-eML~IG%sk~We7vR#@rHrM(Veo_|OZp5uHwel};){a8EnSU6^R$L6~xQ zr)a&PC`9l%#daA7+Gq+m(5B`^k-{*Nl93_3FR}$FEsQ-T5Yvk;uQ5fXRok`dJnZBv z*gSj*Ddl>K;x^Vj)`WIidj3go2_z9rv?;I>xNu10vw*Gl4_+#Wl16687-yhGrgOVI z=Tu402qyf~RjeGtJe{A#C$FN77s8@~oHoUtu&%?gNbOT>UQ`eA;DWp4xZq=R-8#yR zzs_5OS0|hxjj1J*&2Vf8NuV4tc&4(EA>8@S)nfyRV8%~`43lqIJk5Y%&|yyLwB}6^ zQS&{@ziZ#WV5-Z_yi1T!@q>`}b~oC<@osgY#~i-cc<)S`@v69D&u866!tW` zQ$eIGd9T~7GZgO~GBWa>Bo4HGq0Oy}+kwgk$$G+X)>gh_A*K6^%`AHrX$LDw!I9sKa6S~!=vEge!B9(EkR&$(c z?M(cBwvw>cJZ3|queKND^AvOMSCe#+tRt_Gczwqm%s6gN^IwbFjfjYd^^5k)Rf`jr zjr=)$s9HuNBFSqdWh)`DS#p*(%JFrd;jc@d{hsXQSvu@yB<;e1vP^Ut*V^!n3-8fkepCDW4QAt! zOL>;TY{r=b-|noU@x6T$f)^K>g0}unU3qZ`(z9T_Gf-I2YoHRoXUgU(us?Wx3fuJPzoOFik74N^%nw>XXlZ#0{Xea>!kF&iBm-Ce(Xql^ zP6JEK{IV?S3OP#6(qGQAhn#t%w+_O*q@ENR@myJ~bN+o09;-R#@f#s(Cyc0EItSlv zS(}DZBE&HtJGsrtEAhnS%o_gb5S_sX;o<9}Y;8N-=OiMlN&6LMLs8|M8a<%9y_i$q z-;s2N=5_AL#p=hENf(MNc~8V`xAgZSVt?eI{;OYZDMW+#kSZQ#}Zq&-eysdlx-L1*jJRh%8gfYEA8s(Ffhwnzo@M)A$+;FQ@&R!VdpsKA@LfH4>*!F?KhCdt=9rq~OcFh!7?_!jOQcK? zp|hdLs>$M*Xh;O!%mYPHa;POFY(H{C7qng_oir%?d$84SdJC|$5}HQv?GNW}PRmBU zMM4I^iZUmg3=GU4hAIzUD$NX9djyV1(!(zMCr^>&nsW?BX-5B6hPbuk3p)qzp*Ov@ zjX>1%og+nv3(dCP@cY-!wh0lxg*j345uJHeeLKLNKfntIs}+yn@S_ftB=pFF?mTC~ z$KQj+k)Me+>;C&xJNf{g5E%y7`wzTQ96Yc71`fVdYZH!t!+FPGqi48wct-0gVlF*l zxNe}*9coO+FB9v6!RcTeH;8z2eb7yCT}yMjj4HXJOemra1ZQq%Qe|Ko>aVk45+h?l zz|G|>tjB3GPA5+553Ft}Qcdqw@JUS6jxIn%i{`4rBd68H#+{m@7igJ$u@#Vp!Q(k1 zdXZs~h$g3oU}{`2IB0O{hw^OkPggdSL_$Q*O-CGZOP!&v-(d?CfAsp?`u&OFqoe$9O1i z`4x5^BjJw-!&is-3}ARC%cl3(FR<=>O&sX`!r9Pn_=JS)4~8zy)1xEytiG3Fns-Pi z9E5SwwP4eaghPRO)RdOoiAM3DZ*YH8O_NtR;}D3J&cgVX{h_ho*k{ha%sWp?cJ^3G zf7m09>}oxrZTEZeWDu($8&lLlodbz}5&hs!NBUdA7$!8>GWxeLS6=EXK>l=@32P=a z28s7*`o)pj(Rp6+04=zPJ7iV+n486*h}{z(^GIW4vrEn(F6Hdhef&t_5TEy(-yd(J z@f=FrQRV^M*HHfiQ+J|(g0{XPgO6o_2~D!MaqpP@wk!RZ^TU&tQYX}zq@fIQHSS`3 z%j_RqNr0!Ba6DuZIJ~52lf;Z?QzR-q5hAkQqk)>vHkF8+Jh$J>YpuT`aE)-;^OWeT zKu!8F(1;M(cq)I&3sb~xlpXu!n*+of2a~TkFwsiKqGmJ#M<1lNV(vE(i=5Xb<0+Iu z$ymWOO4ge3R9VS#2A&Ouo67$v#i7yq>$e^DZXGXftKBIF+iP&0olNl|Lhn&6JWx~Y z^fWkXBsS}RC|qFZM+r#s9ye3YT>Ny$jS_TKrFUMwlNT|DpS_fruAO zvn45swX;8#J$Q)I?-h=Yo*s!{Zk_lmdfoeR$Rs(1`)s23Ed(ki)3zw*>_v9}n{DJ3 zgX_FmOM6#^rN_dXMj=P}E;-+?W0V6FS<2;QeIlv0DQ%JyWxgkJb{lOaZ8fwvHTl-I zS7J(M!}N!qDZ@}Lcc_i$%w}gbF2WLj(r%Y%QzmV`&`X@vWd|JTh~4GkU$KsD)6W_A zOR+u_VJ)wOZ?ayB%1h+Q9_#_2E=TK>MK1dVYuPS+*rA=r-L5P0_zwZi{j||5xqhlP zjZhl7e$&XGstD7p6EY1MX9`U7a3bhA~T!djvELi!<7I z9;WsC_$mhL2TPVmSYW_Kr-NH9q$_nW|CL{jW(s=%=_M+6#gSGbcqIbWx>Jb=S z=dWL|Jw(zyyG>hMhSk)awK`E6*ixdDuj|=z6fOOVcqPteQZ^Au!Nq~{4jMMU^wlI` z1%%)4B6M7Jf}WRZS9#pexUP;1`<4XJ_X*|Hi=&G zAZB@@6UK!coqIDvCy&%_EyD{R!eiaea?Kv*&6sgAF+$5L8ev|(S)Y_Z1$<}Kc(sDe zw0+mg*?3?7GQn~CP3)H4>GK*kVSTg*kHh;$rW1O!kkju7?|0@8*Q-ii2vcwU!4kT3A+f zec*>gYC_8pk7VW&yOgg)Q&SGan!N;jwf?$|&eGa5`z&t`d4TTr=Rf1!A!H^LC_>HP zA(mfRlj=AY?ctC2rnX(*xc&K6jSHjyI-s#^uB(d1qM=(09 zZ%|gOci=KQA6W!P4qqMWyg{&+6g%_NUI_`3#=B8dSQ?(qsdDwuzAZ^kibss&u^}#posL&NAv}hMX6-!o;x9mKZzq^b-PNEZQ>7DTsbsEURy=`nD5)#Mq*Zl8GnC<=5$ED#?7a`6%`hO` z{Ndq*01O;gP}V<*OfA8e5P6^(O5N-pc!4uGvu%U$Y-u)wg`9Pa1#U}&Ws*81`%(gv z)Dvi@@y>f2-xaRkhCKZ)+2Lp_vgk$Eb#eC)g8#8N^w?g8#GrAI_ZIqYai!y+u!ka#uG*|Uh2r;^E{|aA!IphQayRUz4PgCejD99@IygSV$B!oL zcI;=^7vi&flsX_xW78mMwbi7R2BZqXf#AqYG7`Kwl@0_aeG{V01vau z-~dlIuR5x#s*tc^t@i1VU7n13gwaB?1qViyj-V9ioAeb;wa!9d6SfXgZa;lH1}_ z*fOjolH9Kr!o`ud$HL4Qe}V&x&6Vmk8iLB!7PhsaxGPfYB1Ce&C$TyC{bIuHtBZy0UPJB`Tfaki*d>=~i+ikQmoIWGzbI~)9GEW$< z&pY>)JfO%)OO7?EnVFfHnVSdYlj<6dx}TE`pHu!nrU33P{*PI^_ie8El0>N-=Hv%l z2AJR#NJCXYMLrQ}_`b8l_s$-@Q`88mm%j`RvyLuW0}i<9wwvNq4;U1CC^Er>sPOcU zXF5#G%*_1aE8uaZHmqp`HwS%e{tfMXSq4x^BmR%vK_d@gz(FCuC?*(O@j|z}O9Qaq zrTQ54lavUiN7~eqy~04O&N0?bi}=DC$yq^67n_C(9vk~cY?Pp}$1OU^WxdbX%oXyP zd{)fsP(c>&H7~{&sFNHICk1C&Gd^)=^ZdmX`H3-g$(w&0D0^0R{P0_#g2#kaEPO5l z6;Vey{>!9Pw4o_W45Hc z$~Z{ZDBfawrM%MwR!td*h^TQhi3_UjYlPc0bX$UZ3a2PaN*<|pO_)gzm!_5mnIYx& zo7}VY=3(~f^znTD+x|nu=YOZB)Nft1nEK+PZCFffdqRg9yoTVl7PZ)MCj6sXi%{an zjA^iV`(r+`Y2e}UjyiL~EDyvaDD~oO1*{p?mgD0wzscm1BG9zyyjW|N@q6UnnCUXr zpCvBIpeZSjo=q0SZ!RX>;&uuxlMlUu49#(@Yy8FjtOhHtsFbie35slSCL!hff`H^~ zQACVPba@jmn~R$)ZyFQ?{KhjCsB}Y@#GpT9ms`k2qWihPq)@u zTgkkF-^vXMHhbszf9}+XgCi0k<#Ufy=PmHkKnYn6WRN$R@y zX4GDF?)8_VN{zpKap=A4#OzG(ut|Oo5M;D|f#=e{8#U|dh=IRxQRGSAPw2tS_>A`u zK%iq7cb*4vMFq>86LV$z&tXN(`#A^8hTorT2UXqB`)^*F1!PM&WMNYvmNu`*<2D%x zK?&~&biqhpmQo7^j(*(Q)D9&n-L*DDpxSXA=Dwivv?x6Ra=J4fA>eLc86*Mv#$=GJ z?JFb_j9^`0!GzOf#iGYiXnYHCxv@BfR!jiok&P&ciO3O|2?riJCya}fe$n3Q%q~d? z_zxX2nuaGIbf0h>L@jm5=ZaQlV3K0jfgJKepAQ~fky|6DB`YD#l0Ci0+&RQ4Lm>gc z!wAqYyvmP4x;yzf7}?yZ;wWR>_5IF!JiawUsR#@c6%Msf)tH!!VnW@jOYpfnn~a-e z)ptTk1taXR$V#3ijUWncU6zZ*+&3vyl(Zqm87oM^N$e^y0;FI=3@nBzB^kwX3ZpS} zv&Tkw22>pl&SwOTpW}RmnmPDJ`1u}(ziJ+kyOQHtUWO=?W!{#6{CK0c6X3@}hN}zE8m1vC@{Ubh#Nl z7sv&GH?oEw;|;+jIU{r~$C|SG5n)wAdjzmdb-PpC&vM#r(UFw=uhM+YG5rlR_g!OS z*}(wc~NRu3-vq0vB#-{^PS3v}Nd>$>qxr{bNg6A^*0o4z z-#7k0`DL~LegFHjO*yvZBR><5{^JiaY!Boh<*vv{#nx@!F+nBHYjB$11nXVN`eW?3 zI4YaFx@F5hEfG{pyz8_=<%5XTH(&~KW85=?2OWHcKhjU{cb>R*ov$V?NJl|vg25C@ zqATr`@5vhDnTH}C^jdZM92sW$>mYWEg$k?JVTV1^S#cTYoBQ<=k21;>k+E#0);+{Z z#$bWZ1->P7#%=%BPyU`qUZ-sPIo#B0`>732Q>UB60-yEVr=4Z^cN5q3eE*f`(w~Rj zG~Ggmk^bM5X}l{Y*g+9YNPJy=7vCK~5v9nm)v6lZDi35HcMgev@XN#fewp>Z-$(hAjwY$DaE^Gv(X`--(~vWG*$+rUWZKrj zwjsEj$<6;SAN1h;wg2bKvoG`i7rOX=`Ss%eq`Lh#d3dd1Sl5qF5ow7Io|{_Tv~jHi zeaHCaBR|-a;rH%u@A~sw?ijI(yf--GB$QE+`nku&%l=Q#2YJ|unKEQE34zZw+lw~O zr!`b(DGFIP^qI%fAM@Dhl%JjMb;v#Yld~dbOId{W2eECv%_R?bz2-MSwhEmyK&4g%Vk;I%D$Zq+;FK{Oncncb3%(~c0bEm7C< z9WMX>Pb80{NV7NY+~?cq>GodtzK6D~Yf*2WEjWWZbTtJ#R`@@_U*z<)=E9{wQYQXiSBEX7~Lm_w{H3IHn4~T70;Ee zyf*RSx_`yFZ*W!pKHI~lGiY+0xuAoYoeR#zp(i73OqJ;D(yOBURR6p(5Q8GdL#2Ke z&8n{rsiP+3<$bE{Nhi`?_u|@;|2*DXMt?NotBy|AEpK<9pDE<#w?VV?pXI+d#~egK zmB%TjEtkaJhP2VoBj}QccrDGWv&`aP%{=>4^cNM&BcgeqtxTtrW9xE?DAj(bN9B?9 zS2MG)6n)E+-1BaU*qGHL(h+Sw5M=%Tz{9SV}+HrH^&#eVf zi(U6t-K;??P}9h~GznN;);VSZKoP<8bntO4A12n{s^>hWL*s?oog`c>>~`Z?WbaOA zsND!MIWER1rSZT1AL`@2Iy`>|Lvhg}sstMoTf?Y*jSmN^he5$<(;~=!b&u0bsr0gK zp(=)&VtGG@$#_~DXYz9Cp~T)kmk$`XyNTaoCbpc*!>eC(mqC#5f4!@RBtF;Bn#|sBz0^Hv&6j^4b$s~E9A)S=&XEP_TH*=jR9yW5y!L+xx zl1Xb{J5I4%-^9s5f)*K>kH|r;nAgi$@AUDv2WZ?#>PDMleEbmy@^HTfuN|Tsre*WT zLH;Os7;jf|_-x#t+flGH%==t-?#8XVxz1%PI!-NkLkpbEE`ME5k)}6e9?%R}la*rV9tk^FuNu`<*pu5p_N z=@P^r@X9`@r-TfR6izL(*vXy4O73iKBbR+|r-RLU2=>nfx7S;;cRQ7nGczV;@H+e4 z$QHoH41s~4PVv(8pLpjslsmgwCvy87q&WVpAGyH%U!-SWxxVz=nyT4vZCx#Ozh50k zyKH;$I1I#@ZPK;Q3$ItGW_0dnRlfL75t^f%vPHvJeA){x$c?2_Bsr5r^o7FPyEd_3 zlOyVw9rg4eN&v!|B6+k+hK|G+G5Z~_5yM$T*HCQ4oPkVf&f0UCo}A`p z#(~d$dwcMnMqTV6XYJ4WZh0~B=*OH{rlt>M!6x3S`na}{i{DyT>OH=EzPzH^z}jBb zyCsj62Nw;77NPTykqL<w_3Je4m?RV;XIT(X0a2oEA{&39K5+eQH2f7Upns z+jui0Vs|rMqEZFxnG(PESsiSOsWV`}1_A(7;B)F63;|1u*t?>ee|bp-npYY=8H6JZ z*Lidv-#~r$;Rnx=fojEJG!W85>2gkoUj}>#_7&+1u+5Dfbb=5ar@$8*(TLO@L$FQR z$(s~?MONvhpv*u*B4F+`k_SL!T>?rjNsE<3ITN8u!;gmrc5&_?*|D0(k|Ie6<~opE z%R+1A17RKGgsjf*@$G1&dOlEyA9M2P9#OwO|EIlkhTq*9)lAIKnKLp>>+(DbWr#2& z;^m{(UjDxP@Yf^qhyk8;XK^yOd>y|4c_GHGNM0jHc3-;(vZa^Q``fZM^j7=O8zy8w8`qCmRVkQb)9+ zaNjAXx@>x1k8#DVMv_R}A?2MVy2v!3refBYS4>Iv$W7&i`W9H-0+0l)`O1*cztRqA4@v?J?bx?`ZrQQ3fP_*XLpCvskiZ+DoKXe@e_+-CE9GpP(3z$hHy`QEqyEZeO#)qmcQG#%WbT;<-PZs zs`~cZZI@eZRac(BQ}#XsobSCZIokWrGi3oIUMVMv$sH7}%5vznI+5DWb2Y9zkcHPd zs59KdqTG8Vvce41j~A<&J5jJ^lDMFvbR6d0CPpU9b2gZM4KvmJImXuvN2(#YQ4O~W zA-4Y{5cxRgY0}egvYCy3gAnJd&C+hWDmEsc`C^Q&y8)h(#*;I2+q=Kx<(lz`Zq~I` zq8s#^Ou~q5x+ZzlsgFcMdTFIrVjrewDxtU6)$2J_dG&3!+ikYnZB>5=hZp=+_sFv4 zcYWC6qSQ`vHI~!gdCqG9&LOYUCSk|hQrMX!Aao8l`TZoMBwElr4i(jF;QrjCGqW|b z7N;{bMk<=eG-s!hp1um{DV5J>;Lk0Xc|>9IdHB%8g>%&rtjy^CA74Ks@>}Q($6cmq z{zuEJFJkTDIj{qN^ZnNbMU;5Vq*~L+I)>7 zorYx6&}r5jEtkXB&%A3xc8c26en>#tXxlZt=gPq&b8s5mJ263#XnQ$LoO2O>G3GN~ zo|n&kzW@LOw*%bZ00003jsOGVarXXQ*XloY^}RhAfweQ2f0rOUwU3vufwIKeqjRmD zvlB}kaxmkr4o`F(=9t08uf>##RMJ7tb40N0*f3j6C5j6ZB1EEV=-T$d%olN+)1z zODU;^N=Z>fQALm@G>J57nr&HoIms(8j%vRPsbr<4vXr4z^4CUv zdJR2wzM!Wlaw%6tC!Pe;Y(N<(dxRu2)9!?^ueHr)7e)v&#c%0^F9C{%k)VB;1FDcc zq8?tOp1o0!9^^eyK+()2IJgz>LcI(pWEji20QCV56}Jq~a6Z|Fq<>_ms#As7MnZ?E zfzltH$U5v6mcaU9Sh5)|SdIyC2$UX@T)@L5<2Yss?Anqg_VLDmcRg9C5)K7|@xvlT zw==*JnybO>^aj05gTiEELoEv;iY7lqR*QRs_CpzwuIWE*tZuHS<1ySD!w*E4>x>2y~0hBuFB5l0~r>SC6OhjNF^0GDfWKz)L3rSgQpY3erdvkuWgR zd*Cvo7$(8Cttu2KQZ5i91rg%bfHl(~W`V>(AZ23t^qMp#REvamhOsn2^UWF(A_^## zB%qLFn?=gy%1voGXLAc2V#Aebh=hXVwMAaqB+ z3Y!omKuP$SOh|?e;2-|7XI?}P|6TC#d9gCatEGVAsD`4%L+wJOOi{d;UOYfE0|GV; zgd&F>0zaYY>dxQmv|t!{v8DDiNAXYjX{+^PZ|Sv-ozAZ@(Ii|tXTt|4J;*OI>xgj7 zFePyQe&cW;3yCNm!p-JKXAcsd?&vB|I8Kq=91bEL_V^qn!2(602?|0svbH7>F)0yj zR0rCiJXSir(0|F6F*Hpm5{ZTx2X1ud43>i-Nf8Lik{)N~BP0JYoG~NJ7VD)YicHBceAV1{$5YxWV__q&*5cY@N587y!sX+E}&EzYQ%dlzuHaNeP2#Mt$PE`DZIsrLib<02TkvrM`uep{0H5Z!y6_o42$d< zGpH!o{{bW=d-5^fe_7}~1;ayA5Z2J#&5WoYP|3vqfci>fr-QAv6;)*7u&Ti=pbnuy zRM#;+f#EnG0l?nr_rTI%JoGCSR8?c`A0O{_^;Aw;QI%Cy82@nG8R_`%mgVic-15AS z2IlK)jfWIAW374nSqyfV#rXC;#r(HC@k~9^R;46x`4U*`o;L@E%(U2`WHg^U54@zc zJ4Osa128_PD{}KLP1s>{C17IYajuxuqd>vB0fgBK8cCIA+oFu5P!Mdticn0D20|{? zupqEeHnLi=I2u!0hut{OFQ>?c)ObNsIiQfhv7I9hcWYqvtGp+kloF`nXevseFl-VL zKv)HYac=rC;RF3g+t?jdApwG;nknm9H5~9IBQKQmkhN{EG5bq12PcW1fu;#U$io0C zh>K%^$HBrIrwN}6z3#rB7gMuyk%~_Ro_Mb`GcP1MG#-m4b+x2D1F}3#1a>0&e0md7&0-19)2Yydl8p-d*bh9I35 zi4~Sqh8K=RM=+j4>2Q3<(4Nn4ACtu1ca(m+)JSE;USP9Z4doO)!L2J zI8Q;DAvehzS?5wlX@YREHYn9Z{jyA%BlMa^H>lXL!n?^URBdDNy7D$S;OY5tN!4c6 zJC)9){`xxku#TJLos!!lV|>c0NB@KWAN+Irzxj58>yPr2|9MG2?C<{5(IpYQz%rgk zM?Ux(Z5PDJgu@a-q|K(bS#6SvnQ2Wd5HymW4_7Z7d%5qP!G{f)ZKLDW5PyhZy;=w} zct0CY=Mh3E_#aqsO^X9J&?Sy|^Kl1Qh6w*6LO|m5l$_8y7`|9aKR*cpgt=m%jOZDT z@f3s+J0ZeRh2q(GB0wQhcCkeykQ@Cu*`N`2(t3n9nXA~>Qp6>wj>5ZzBf>$(PAeGDjsAt(#O%MmAQQ+9BLTE<~KVTo8K(%IK0@jnSc7i?C>w6mVWR z9XK^3?Jg9j=(xyNKRIGf!8}GC=LJ{3LxLRlr>Rc~D0c^1DwCK<7tql8zLkaIS;;oy z0({lWWGr)1VFwNz4#E#l0p=2%!q&-8+UYV`5M6ObhHI{_e^uc~4_B9=6QiDP=3@i| zR<(lr-T7P9N7;V*tKh2$s`qTWxO3LC3tsnuGhO}#R|Cv(Aq;46dZteNow%z!kh_+m z|8es;EL>hAB<3naW;|PGtQqm%Kk^qt0d86sJqbtTCqNGIId<~nAsahkBN4-?{5!fj z;b zF|9A-kop$K7us-cRNLaQF@?wHxn!14Get=ge9SHtO*|EfueT2r8q zeD5^rhUnJ`qkG3| z^}16Bv3mnqD!_4Mnt9zPbH$fv%rF!f==SN1B%&(2jyZVi! zol2cucdw$;-Zz+Hp42+ug~;<+Cpxy*y;1m3ZY9|yaD)6B8w9VZ<zqs;Z4$GKZeEtc%(Ck;ZW0W3jE@&nFuG@gD_5f#~Z_5<#1tR~Yf`$n1UgN&L` zY78vn1~K+30&kNts}1<$mZ6zegQb?V=_iX0t}f|<2&6|rn6zjM>jD`6dgK{fNXlLBe&OE_aC@vLV6=_D4`%70RF!NvF8Rkq;}I69q}MmOEPQd~YWG|EnYz zXd&0xB_J?W{YL*7e$bcLC+)W z5TZcpOOHl7nT3P;1Wzqd{0*U@Gov%R@QK3~+~+vDgd9w>!&okX&I#aKz9%H1d?hUP zb=w`dY)zx+D%;^E40MFWD3EoF%Nt0oA7?)I_v8EiSj z%T6yfDL9`~lA9?)jRUyRf@eknYYsl)X}?o&!f<$uJ6paux_zg_v8T#-&nJ!~dR~tA zjffyg0qkNkJ(>PXC;# zH$6R`Kga(M9C61SarkBbw9`#A(@iwfO*GR@G}BEq(^8ewNivh1bUjcg(*cC`b+om<-0B)uX?)+wJzQ;R9`pfeA8($CLg$F3x&BXCR8(_+;tSeV=MLhG)iCCOsG^&Hr#xjN?>x>=j+}1TH&}7gehAlKFU~_8(^SF7y#qCu%fdEG_m+;F84L za%cE(y4fs+wG>$+wj);i)^nS2;z&eB_$H%)KUuf^&tSwpbC5&F$>rS?;(r`cgW6go z)WZnNq&3M$f{3?ugPoDGkv=(N zjyc`VQE*5$_6il3li3_^OY8cMg%qit%%Z) zg(3k8Q`2hl-BnEo=6W2$jm`LACe%%K-+DMV~Y_R6D&Yu&+{eyyn`o}6cp^g$&AbtGhJFr%Qx^De9YNMcx;O` z2`2-cC#-n!6{N#3%*?ifor5mhO^D0aeBae{!=vl#nwU=IA)<1FQ03`o3~=~34PzYG zhy2KEkP~giutRcE-noplOh9<^jJzDf2I(;n^KEG_n1>OAjuR|6GY zu~;}K72$9HpC_oA;uMBBOLAGm+XLHUb5}ycQ&m5HcDAKrRbK zpgCd)T2Ll6pAn0W!&FOwg@m4*J=oHxJ~%i&6U$uhdYmaetZ``XZW1%Y^-~5b{^;-TF3LTapqO}GVH?T$x6Pq zXD8obqWcycR&jkf(ct5uH%kesc1qg7jL8T_Sg{<&#K!g8tv`5O;E-_{vQ``iprcr6 zR-Q)&wt51i+HO-B*6{V>YGM?A}M-QJIQdkf#iWphs2NMNK2B}1E6sx33Bd7|GQ>z9|-Z_%K z(`3~0c^?yzda*vI(T!gL!MT9h2bNna85OhuyPd(y(~nGqVeTdlaf~3qM7=k+ViIB@ z^=z0@6c$ngh3DHO-UuXAfs%Tari?N?)i>m>=_kOkBhgXlS*?VR5{$eM%sjQQ49vrh z9b=zPzKtEkq~4}+s{mkI$TJ&A$|iwm#EbtXGNeXiBFA3gC1C;;LKotS-6MBAX!V&1 zB;t8|Y-7{G_YRQpy^g~6y(W@l>FybrZHGEqi?PGxZ$JvS{cku*+?SJmqa!?_zDjsO zB>L!`hA{U_+I5og@tRAEu;h8(GI>*(?p2y03bK4vtKQMT*B?=I zo|q4KhY$T9+HrPB8BrkkuaCUM9heoMPvU>vdq^bit-g}pn!m_|Y*5H*1-AQQ~+z(=sl77V5IK|3Cz(INLX7cFYjhn8#L!bWS6 z^w_}_=SANoBt;BOHsa**lnO^^W+3;x7-(|bW;&C@@Hg{8b z&J>_nAno=A1&k2Cux+B?9t^LJZC13OtZL=Uj{;K+$l_EE4Sm~P4AO=vK)7h=6@`b?u*&RFO)Z|Uw5zN|m#sg;nsZJ^ zbFTlkbo~So2}x4~L_-m&z$EYw(&-HmM1&zIiNM4J$f6=p7s`YwAt>l!6~+4;iPT?o zH)c=9u#Z~DLsE68NoN$wkvTn7o-1oOztu7cuYjO3m!8?~jcyWLuc<59Le=|-BVzzq zCmktbj%G;TELQ*U93S9#<#c@^dVk|x-?|s9!3Ia?f@+$F3Saq*37$ZNNEAxzNO{gf z5_worfhQ~`7h7QY(xYr%7d45=fR>b@r>qMOzsP{G(johOm_26P;MJ1Cc|r-25^X1l zhyLrm5QJqYVg4V-)6#6Z!F$`8$c?!U_BnnNom?%?6NBt4eGtuwA_fz;pHtKn5Olc= z9pIGCqq)e}ILf);ybr(9bL+l0;Qn)&;%(2g1^niyMJbE545jDv4n21}`*26(AFQ97 zNvFKLvFXM;Ajrg+$~0^?cOd)NfW?k+bV&A>w~_2NFqWo}U8HQa8o0|K*k%wj7&Btt zUq7yFgK_Cnshlv$`1WcipKfnG^(GR|1K@FUrc0vA4`QDO;1*!Ad7jP2WNWDmKNkR! zT4C=Sdh3z5E8_UI59kC-r4#fNVYFD^pZBif|C84#CXQP9&s4Lq=luD zN4R7q5}q=7?NJ^FOhj)gamhZ*?%lRWCD&VxBDQ^5T{QA_Z|!dooV(i*^sy+2?nI(a z>mEm}_WS%!`{eW`c}Yr0INDZQV{AfAlLqZru;2)VJ0S$P>m#NXEWk{lBt+rK39qtT zNdB8QR)^E_wV_cVVD{dN8ceVl^&9O{Y7%Peu0d}3CDo2 z3cmY2iU}BK(P4;4TDx$foYjz%<4SF97D_gfLk$}lt%U&}8g1AU<5iV*RRuc9H89L1 zeeC=!2Kl0WI)0Ls14R9?eqw$XV`nAmCey$Jz^A;0?3GkSQAAD3Q5}cMB^nI`SlMoq1`w+nNOS!-e;Pz);&Y-qXK*bU*k7iEG! z=^gTyd5GVZjaCMW>*kv z7{)pvkraHfW`Ce{n%W}M{S22Xiv|P5tg>mnRDi5?r%yvR0g}Evt>W1j_ond5YNis5 zY+Z1TH4%f+X!-e!C!`cIP7AD=vjuAsXpr!6jkt`@#E8hhK*1Jrcf>x^Nep4qO(Uh5 z?h9g|F8?8YKEC5|bvA@(7#Y`MY$xXU!bsy}T=OcaG(lX)0@`Z7Y|mUh&IOd3B5se zaa)l=BK5!!DO8^XkY71U53AO%T+APs+5s`4`dmM3LsYVe5i+1jS3eul+iC%jf}@es zwMV>LLktUS(ww3~wws-GP<S&P*l6nlk7z9{4hByd zE>;z>i{~kA_oPO!!^ano6Xv(T*5uxPZkmyLF9$e6gB4)sjpX44HqaNho!$0%-PF4ju zKzJ}}PaJ2;V0+tb(+L@p3n~6y#?ISfNfDvE7Yqen0kc?<^Y=Jf?_t4)g~LBX>9UrM zDN~vWb2LAM`j(@N2kJ6;Q2Go``9Tq1)V{?i4`n!xy43J48MdIPg7rmFkzOG z4G0)QXof8ksEK%o946OKf+)7{mvA9ytRZqi`0WpR;KhsVcc-gd2gbo$PB%zmWk- zJsCE#dG~=>Y1Aq|)?_vxkpZb>Tx(3|Y$M3HiDl>`x@qWbiwSXpBaUYxaIUT&d&T&< zcO5B6%Vro~1IRd}aO;iUP~(RAkrN1UK@?=^X^?X@wri#INxNi6b~&s- zsw<8V3?rIWWf|N)$kuquBGlL-JOab;mpHA-PdU7Ho!FmEZ0^W=a>G=mm-AP9m&fFN zR#?tMh~ZeV&3(wfN%wE6u75jLza7#eA-P~Yywu@031}rYC(c@Pm2{)6kyy%OY;sRv zsWRJ`!OWGn#~TeGz~ro~iUc6MY%B)yH4?s4RBp_R2#Cr^&Te*QYTh(+1H%CU4kZ}Q zjP5$|(iTb&b?3z?NTabP<2(p__*gZx|M`}YaK&lsM{efyG>oY)ual&^9&ifh*#tEQ zq=4#@U{52;QFZn1Z_P|yV`rUL;m>XawNH>zxOsJieFqA`!h5t`#yW~@yu|> zEE3wo9)Y?k%)1>nhKiKIJ?Lhll0ka(QueL71w$Y{ja z9*@gy|98aX7+GLI&K?;m7(s66OOx%%-iy~Jcd}K&)`0_dy!Y7QEj@yAj&J~DP z41~f>izvcoOMePza2Roxn&SdnRuN!~IE5H79cu$RkZkRLj>XK~Mn<@mB%u4*xAz<# zqPSwn&{yrx1K*)(crybqPUi=KO}9g#LU3;o_5;EutarzAC8bF=+lH3M=`wg9g&w2ACy7KI?euxv72e;J+~xWKjGDxX&QD z<@}O-e~>!MY_`JEl9tQ%cpNae52N{E?tHkXlU_^FwdTG(u&aU+IHO7W zDD?lRn(X3#2^DJ#-gExxMjG(Hv9=lo2hv#ovhci!FEOqXUN6QX{af(39c;bHCLBLJ z^JJs55%F_OoFKX6HU-J7vmbwH>&!UTTpt2J71LYYf}@5iCTBLo_kGb=U(-98UdDdM zo{=Wj`;D~E1)KaM;N%-$L#CH+KbbPzD2RxNh=^}$<^2cX9xEveum|x^oszuVhx9KJ zK=axq65C2D0%JKVJti{fdwibdOKknFYNnsD`8M15y!vBCeUB`=v(@GQo0sBm&*iV( z`gCRQJw`Uz_4W4PjziMTEiG!gsF}`lolxgk=RwYm&UJg3t!uBdG+kU6+>#FaXmrCa}an|Q+ z95aMrZ0tZ~x-a196bpc0WUIUxhudQ7*Ip*>nAJS;jxrop{dhj>?v7X_kTbz`79dD) za7A{ZL;(CT;|c}YEC|It#XO1H;#ZYb_mkl`k1}qb@QzGQaET*!am9)x@L+lSp~Bf+ z$_mLyg_r{W0fGIY`~%H%kp`9JalUv0g94~6J$W;c+;kYWk%-Dnxp;~v&hkkN2LisT z*>Fy4j({Y9%;CcYcA6JF83Z@wTYo2yhPzn&FUD9OL-cKBvF*w!X(|29VV0_;RkC%f zazx%F%Tklvmxc!_lCfTv5ci?624*l=}-#OfA4>%=cbLD zYKSuyE;f1@Ah3Rt#n0e9TkDm}Rx`#xHkdp0k;%@)l5?@ew6~yMi@}lNN#aq&B~_UT6L1jjk#)TqoSqiDr(u4E4Ruv7h2y8S0crsYi1s4nsa2UE*g9I0WUh7w_^JP*p z`cVdIWbnZOXp5PR!pMP|-#@W#YzZwjFy`(Hm5R}BHH~!>P`(`&>Ju=sh64vw&yZZyaY!(dINQI6O8vjcsuL#LbRn z$?GqCyYY%+W5CDlHh)#r5};^25Yg%!>KODyMRpSwzW85z0d(R7QJa|J-m!tX%J_8} z-L*ggYhIGQFBd8Y1P3g{rG!L`Fj7e<2Q=U$<=miShzLA_ArOfYM5z$OD${I~l#cav znw9n}uSs=A^T04Ar2MDsp69{D^G{O!gA4rsyREj{EV7*QGO%E@lVSY;&xQa#uJRzXP@WNtjCE z2GJTWK8&oWG_1dy?vyRO7MRlcDwWIzwuU~sncMSzqv-C-{A!o z`JJm7&+a$5Wyl6K*SHj~Dj{pX_UE5S>yH3}Sf-9h9HbTE>?1LLfCWCGA24#;b1FUYE}!0M(N-sINci8+;&!umYbB(X zRpgpU`3##UePN!}dMLf}^esylUkz0Ti`I9aPv6VXIf{HkrYBHFV%*B$^VWQ zFe~h~Tfn}# zXR}pwYqWfBki5)5rnZ0&A|-#JdlP`SOr(~y=+=a$=<1t*giy7KC@$0X@a(DLypx=C z-5uUFH*m>%A=zA%ks0*#H1xB(VEGfwAmUlCB%2s?vHF#G2583wT$`Vsbv`O+*dGzt zlij~Gj?H}*6szFlZ&(^5A3o}H9zpeKgPqsdQL8pPqRYL8T%^+ik4Ov2q*A!l9%nNP zl&?YExd+69qp#*$OJhSI-r7TFYI$03Z?aWW~8Yapi>dY$fZzIl55=yh2v zfq#}j_!w+d>{6-GW!~kJ=#Clci1H}J>d$LW$jutvb=%_4cChSPSc!ZL^t~+x_UY&r^QMA7 zp`m}9A)!Osj=ne~X>r&*6j1sy0!(E3X!Jk&|3qr`HQ&0dSBD#=*zgn{Q9B6=1q@W% znI2N}OQGDk*C6bVv6O>Mfp z0RE$^ZzYFF5$QUQ$)l9+*TtRkfk4*h{9#FDjSNAe z``{rBay=2d#Dv6-AqO0i)o<42{o?XyTBXY5sUU(jKa83aLHim@jo>$k)7nq%9 zP*kUTDLrHRjro_O{Y=6Hrn`d@9PfEMyP-@n*4R1iRDTv=7tmZq(Ueg?g-qQ-CA;#G zW9vu6l)rxVT(vvyJU#zJ6d3qy5xjvRg9u0Z6cN(sj9|P8fIAr^Zn6?M*!(_d;y`>G z_m8&-vkz~a*tozmzQi$zh6&$2gmywuB@9a5V-@myU59`(UPH93aTDXQ#5XWtja(q+ z20som5wVcvE6HpOBMJbBic6U+v91MHl&qmWWn|Z9jV41F#t8G9?7(yFSoE)|Sk__eKTTaAv5YO)%Jx@i#|ZX?u6 z?v{|zp7>ND>;}PT2)w@?NV|N-N=a~kD1RVQUBx5hbtLqJjyMJ# z7-*ipEKq%cV&F@t4J@e)7C4?+B!D*zGk=v=-7p>kElDMvz_z>n(Ga&TGpBFW<+YL* zQv@LkWiONHDHGB?^CBYA`RkAsVuDuLTAkxMR5ez;Pj#`{zX`<5|{hY;r-6)Yya;XCZXxrgFXZx;4Hot zBIU8e8P5UM$B=V|WU!tg&4HgymY5k@c#a$vlmW)A+tDc$0yOJrNf!Xr9Ak;WDpnWn zBYh|gJi0NoF}9>uYuYO9Bs|P*N#{Nel)&P%KQ^F<`akLR7$iMmqFvZM3aOMq+zw(P zSm`s=9WO69&~`-n{RhaeFyyla47(q<-V4Ku$AJOf2^wtZ1{cM69(`3>v%9>ISj;X~ z8$sAp7(|#L4OQQn<7)$H#-{Hlr>qn6elx$Si4R&J{OwtilZYkxld4+x8RmVlw{&Nl z70jG;?=*l?7+;))qI`QYbh1wGW<=(_%c;?0Dy#T9HQia94R9DoGKoOS82*LjCt~PG2}275V-E*hu1_JSOyc7cGAuTvva>Q|!22E) z*_OU)S%dIrGgjg*S5pwZ2USS1rvcdVx_t0xrF|=!+_!zAz8n#;R(mkug&T~sW3!GR zqXkJt9cG>|Nx8|0IQN;;l`5Tv({g*0+%JFSs?D35lIoTg$m0TbFg2Ic2Fjw8!< z^9Om3pM;kJJ)W28R}w5RF_6Mw5p978#9~oB5;*h40q1;kR$V!xSBp7*{8$;17RITF zWOF+~Czrir*Yqr7mXg^dK(+E1EE+I#f=Q0au_w8Vp8vP1glAOZVbu`F)V6ZT89O zB=t5n!Lj*sx2CK%s$`ourS$qv7DG$|C>|UBcU|kqkcD~*V)1ggM9EgGHXc4kXsiZ< z8LiV5ds(%}=qI3ejj1+TvwIl!#jhj2!D36UcuNVb1((Okb?`kd_E91 zB>pZ*B<3SOGTlWcy*C|l6KEI=ERZ&nY=Fc79zfJRE5pzZ5fVWDm?RmAu{FlyE48|u zT||etkn|Fy$MG9&vSO=mujy@5(U9>Iwhns2Jf=G%x%b~qdp$6XEEJiyQ=s><)S(x- zA8nqhOC37MGuTlX%S4g=pPTn1=_BpM_hax5<9`WETEhvG2SvF{aEQ(lT`0YG9v2KT zzeAN(NIWqkx1#@Pg&dbeZ;2VmIc#se&`+fpP`D(@TW(lTe<`Ul#Y2T-TSm86H`+@1 zf5_xm{aSdMR=Y{lmc?*3Hbn~4~`dcxj*e;EP=MqU9l?sZ) z;B%+!punsz6{B)ltfwt{&MtMF||O^v0_3~!T%5DpP}Q& zw3+w89p=|Y8B4*D_GHOTc!jV_FzkL8?f94`{^MNQZ9GEM2R=T0*{zHRBXyzgEPA-c z|FLu8#*KODgdA|J`|3+x32qe61eA~S+7VhBQSz6YFIIVT7|Z%TmwkVu z{CMko?0n`QN227``Ouk9!Jl8~sp+dB17O+eBfOFW%OnwhX4~fa2&Mc1veWqBK1Spu zg~pMunlkXVUTh)(gq$+p+P_Lri-@P{v<7^sX`q5s>@`t`U%;Or3fsr+v;S zG9Yjw^la>9N|5}lxX+zIQ~h2V9)1UeW$R(bxcd4Aj^J}_KB?Ao500Wq#BlJ^aca($ ztA3~O^ETVuJE0ueO)iZN+P|TnxG&-kO$Et{Gz^;;UqI!XM|snHnhVcjbTnm=aiSy2 zY{nM`1Z*PcxtSt{CZ)?(UHqrYayfNQR!>1#*oY@K!hvZ_Vu2RIi^+J_8{<^69H_qS*O6R8$rnJMt-d1I9oj zATAAQk>^m0z+y-Tn?)Tl6+eAzu-1S!EV2D3IpRKA|1JHWr1&uU_G_ydC3uUavjLf( z9yZ2GMi>CEK7?Bzcz;2^2ZS1$QNb+8%^-L6c*HmOmC*dcLWFs>u+OEUbxYl?%Y7CC z2>u;J#xOTUZW@F?My9o|-g%ylXzm^}QJN|gE2&ri4ILtmB~BYTt#@>UubHE_ zP5&c{m}Np$7VcpRlRT*QUyApc1G3-v(&tBG;@UjHDgKOg+qBp&eM2qh->UFq8ZpPI z`JhluGQjg(p+_8QnDE(Y5~*BEzWBxrZ90@V_;oB}U7v0^wFk(%EMu|t2bn_V8k>?E zgDim*jCHV;;pxa6DH95+$%(~Ys1SvN+nn@Aw7uPk zAh&tU9yo)f^vOX1h{ppH-{N_GOj2eH!gej%Yn2gXi)l{-PTz`S15P-EjSLY3NoBZ1 zyv!Z%n2N}Z^MqBE#2hqfez^LzE_VV&`RQFfeD7Sj8iG9*46Xpijg%7@YRAxCnyVGd ziE`!%1u`XY!1U>uRsL3u2X<^);>TR?*z;Gl$M$(2wY!&{Fsi5_esUqAMC0|__8&I3 z_j9%CPOncuBl41=?|X!WpTejuP_M>8bVvc8FN?|K}-c`LH4*5wl+1 zR$~QGUKbEIhejVsdnMRqyPWS6?0yHiq#0vp#dYP}pha|`xyDhn7l}*mVgnn_BrY~F z;W#vfLzXBHeBAvnEHw862A(}XE&YlyQ|WckyN|A{_DHe*8PKr3SG&<`yz_S0G%bJE zaMN5h5UmUyLSq?oSqn0mrH}QP4?SqXyU20E;Mii7=kP@BgeSCgZ<`BHS`csK?;Tx-G$jBLE&mlx%*_3taRfvSiU(E#l{IB97bC%814~8NpOC^tW4-pmO|q8e@h`wSVNq zT)cSn9f@lcLAI1PwJXGn)9byp?=QKX@G?zoG$=dMQy=7GLHQOA%`G+aHztv{n|Pim zm1^UE-I7wWn1WhWY^E+mP!$kJ=wX;nc8UVsr`_^4^NFRETb&Sm_CTd#2nD$$BT@o| zl1%d!#IVtS%w4Z3gI3cHk=Lio#oNcRkH)$-s9mHDzJ!taIr7)c&R<(SJC3(}=&T-( z<@tQ9TH3xJemil#oAmv0>gm*aSBI4ZrH+eD62z^JL~_YlpW77+NWnCL9>apsTAosv z9Q#|t@=l#QvqyJ_MD3%oa`? zQs-BVlcIRHF3O4apGS8=5lrETsIaAmxsaY#-Oj-%% z!40C4UK&h9s@Ak=L=4z$zpUqsVu{CoW^dXBwL7p3t0$SslgbtfVj!hu^}KoR5s@EL zm_9y}sAC60AnBnT9iqH3Z?Y-{LCMf-| zCHayXW`3gsqMQJU}6`Q0){v|#dONB%3#S_5-T8uF0^TfwMW>!X5 zhxVSML_u-*IAX6wZCzD4l^fpWhuVGA;(e#eu8neX!EFen&J=~oZ{Ace%sfg>vbl$? zRJHep%4W3Me5u$en&|S}3J2#DMVst6eRa%46G8;!=0I_5fINW276xpjL(f52bq+6- zTp}(LSJ5xu#eZo&Nk&kv#e~tsHn7hd=1fQ|D$q=1QV&ij*jDvbmLT;F64kw=3oT@3 zZ3lqSj~58EC`$*a1O&cALbOM@d^3`@J#ezkFMEoQpoki1k*~X&-*Vw^rLLSWMpwGQ zgl!NFzmiCD&T#_VWtvxNAYl;T;svuukc2{|;9#;;H(bkU#mq*tvdFcxC-^sr`aS-= zrxWTqo}$MG2TIuSy^WU4@VLzvUfkl=Bh~iORXL-#K&a23ep4O9_ zN8}$STU?yzgA_|#xt@t6JP#X6!G#A3ZeywIFOrU-;(N~Z(QKDR24XnS8aNdFazWgo zeSE?N@YL$H?P4R4dbZ)*+hM`my5&+fYf@u=kfTHT4h=i*HDV5?5J0jChNYlmFsXM6 ziV7J@R4=$Cb1q=BUM2Tn&h4?Dt4Mksy9Yq8Qv4CfM4OEw?gVUndV6lR#~tT*Gq9-U zY<1C5@E9|?ub^1wS-odB4(wAVGtS3>5J)a-OIONGQF#Zj%v>rp%P!fnE1Jd3RnK-@ z4nvvxcW(pDxyZ}sq}4q|gqY*DYiVq#aj_PLac8Vg>)-Tf*o&>>q_Y8Xh%)h6+GEk` zG&|~M&l$-UIHDqhjK#qx_~SUBXe0^)eD#q%8nev$SH}KZOw7q}?>+6bOG9esw9qz9 zsThx6*Ix?9(n358kOY_ElzKxviJ#*SN6-+v&N>_!A}4R4lv?MSHo0blAGe-r`y2< z9og~vv?4c?Zv;yg;o@Yq^sUsLR;GcpPi+zbY^HT4yh|N{XgJePY@93@qhxEP_Lw+G z%@VC&SR}79oMKWxjAZnIS)Ux4SjD$xkkT=vZJ6DlXVD35$}~9v$uq<#rjr`kjV2DPTLKM+WMV;8(XE)+7a%-(88N@C?=-D64<1JHCCUtFVxHXYtH{;1 zxoA7JwxRGI=M%2`Y9z63UHQi9T^+huI8M{s$(9I!XQ5%NI}WMxd*58)rFY)_WfqZaC>n26WU{go9B}j4ulx* z>XF6ETP8ut9!Gwx307P{xqK4yL5e@TdX)x32y8PB_n)j6tDcLH=VQE+sK#FH>Vx=^=8JX0aPASK8Ias(w~8o^fs0coEGdUif%cOv z;K*CDK+sG`e*|~Ed5uMcg&vy)A*(ozpn0~i=p{*LGriB$X`7lQohj1y6LuwgtyLHK zRF|a5%*lKPw=7tQP`B<~Y^hl^87Ewk1y-;Z(iO~V>Xjq$HdBE5U|Qd4+eng1KQ$ok zD@#!B${#jWsZU}`2cR(Q^xZpSbqI&0;$F&G6{XJAc_Hv}u~QJrw80HH23(K3PD0D>zY@MsK_5v38Hj20(~kntW6DL3?>~rg zd`r`jo8O3{p~i@w^ZTd%iw0kuMR5?rB@q$mIrT1EapSerdEY`s>$Wm~w1bDc4uYK= zj{?ax#@x7m{zc4tPt0*e7C9bdXjC_`;6Wd{1fa`h?S}ZY$_QlCLmOKI4pSSXi zgNW%?Vr)TT$e9@C9B0O2;N)8AK zG!Ers(sWB;ha&W9UgI!ap_nFlayy{@+t5ME>L*@ za*9tw2DCnLr4#*kKh+^UhA+Co@lIiCNQXc&y~P-whI<(%x~^?P4p1 zzr6;+vFX;w!IX8ru6DPS8Bic}aV`-6b$~Dc@VgwT%XRxtE`F=7GX2w61*ftE9XN;rCs{zA%FA9(g<09dXgbnNa z?l=w8B(u7hodUARM<0hAgeQoQbFTgu-E4J4jyO9YP3^OmEa(`>q7c)tRaqaZpAHDAm!_5yMOh<$^_eHe9B<)XA;;#Ne{TFDcbCetc*(I90p%}FIpX!r(e6v{Ns4^1@*u8`wEd9YH!P(sS@JdiEPSu6-sp$)mp=|E zh2#8f@i#fmkx&=};se87qM;kWmlVYcSl|{YU?03)ou_qI)x&()vysgmxF8nWTsfbV z*zCH)-+!c|NNx*r<$YSBbn$`<4Aa;4WgR=rD{}Ad!RRF1#TL>x9kAhqse*t*}m`wW{L;@{FUPGu8ii5S{& z;z=O`fjO5ML!WBp^PC%|@Z^w(q{mYwDpCOl89jF|)S?yRU=!bx(9?5N+FX#jGfIIc zqe$j0IPl*5gs=5_DR0vTky_;5gQv)`k`EIlUI+}3T+)JL<6W3s)Z6%t584+ubMKu~ z9|EV1+TiY;eJ0B5Z{T84VOEnUW7hXOS9!9-{$`d!(S&Qbx7BDDzB>G{BB=f4d^+!; z??6kso@+RZ_(O# zgTdp$D4?Jo@PpP%sUHU2u06PNg%F4SgA#aJ$MnEFS$JV;*FrxoB5UAuVsZ zsr$*Mr#ytg3I}7s!?oxXk<`ad(Oea`QS3dBLSYG{Zf{*7+8)*s}SY!X6$dgU5o$hLo4+I~j1c@z&IZ zxS~tbg~<@bMXVRoy@MyXxvmH~qtrHHmxT!?Fa?}hk1?i{Q!_PIPTb-4 zV0?>``^g5j5gQ?Pa_WGu1Jsr~t$eal@9_2(Dw4OK8D>2l%SOA^t&~QK+>RR>{m;O; z6ux*P^S4~r6&5F-?6&i?_>+!VpcNd)`;%$3*MkYnQhYOS0Jg!QXX@=MK(tOaL==#S z$;T$)i)4|9o3OPLI_?d2$+Z+!XTb|z*z)lUG_u5U6F`*z*vM~~{cI1rLms-50pMeV zI{{u-lAASz9i;clFoz|z*bl`$2PZg3xXJ48H0N-9we(TnZf10_Sw;nWsP{7amPaFt zeM7!aaoF<^816V>j;w(kbMWt-i>16B^7^F&$+q@9OW^6LtLAn(nB$pVpSR{+PVK{d zpdc7W3|r@$ALKl_`=3L-cjR;72?#t1gc$UDn+F~Fv(}rdVmFnh9h4^M{eB z8a!FU?* zd!VmFWu(0=^(r-wKr_&2jVQ_8>cYXM4u%7~_5On77xNrjP7>|8FjKhamCgIg|AiMj zj+X0Zhq2Sd&e$oYDW7zWGpw{P!!d2CEWA`oXSrQ@UVBWXApGS=^DYO7957}i7{*^F zafc~A^$XapEs0G_;Xn^7l70}UA#{~WO3ERaYed0m0bx$^ElbQfELE$@KO?KbqvCHk z>Db`)^pDo2_OZ(bGwSgqUK!s-wlWcNuP1<}$Z4VOCe42b-#DDUY1?LZ`)l~y96OyE zBvo~>$yG*#YZk7W#U}gi`T6);uDW-XujyvexeO))5=p9peLkrMX!bEh;xNR0-mw&< zeaCj4kDc+M-Out{{#td$k8>sngH)1;Tt~b&l1rSRneAvAiae2Gt(NS6Fx9B3kl1fS zm9KyG>F`M8(QsXax*M7d@Zx_?rser~)(;=irZ`>qCH)j@S`!Swx`c)Txs!n33(0jy ze+E8m;#3Cx1>=SHjUTNnW$>{$m(N>NHd!%No2bf~2t>kI#~g%QsU9Z-4M@bJz--oN zifBO8B&rjgMk;tN{zm7A5J)6`H4%r$B|3Mv3Hfe7%}Vgv`Gs3tYe`~?ja$`T8C{`v zAT$zYWV8f~lu5{yW=BIQjBjZ`BzDY8fNN7VRjkUYs-fySury1sa>t{Om_vJH@|{ft z`)o&gR<##ES^pN~E)Ag&!L)KReI6dW1u-v=>SJ}atKzmjdX)hUT>w(rr;j(4T4 z`f;6V{S9Y}`+Euss=sGB%l)S25|Bx=0|6G6+j!)5eMWS*tp`SphAH)_;_-KztWjR5 z=LYYG6L_wPa36n%aiK#rGPg=KSV zX*Gjk#04@NC+Z~|nJAlu4s>LAQiH#1b?%KdC^)05wdB?*$1^JjqU$RfNuhA88f1}W znrK4P6QLoeDqIz|hJw;GGg4f{kjEjRXeX1wvfW-y!(D*B%UR+1>|njYIVMTgZWpj; zxX6CY9Lm-=HR9>#Rbn;ikeflHvt+*e+KZXInMv84%?L zi=Y^SiC9=&Dc^h)t$P!$O|7Z_nKI1GGl@$=LIA;9A3nzF{G%8*;_#HSM7fVWrcL!M zYE?qna*euC6nWrCSm4=dHe{a?4ns6l7n78RmN@In8C>#F$tum!ZLuVYj#Yr0R!dkg zb1-csv@14%=JgV|=W?_kOE{t~U<*}kL|!NolB+rquuKx|o0&?4VZl{=g%Vqm2&Zfj z1GH$!FdQ;h1~DOUvHDI$mYed|8T_o}eU0*M7y21A3uTUpSmtEj+Sx%D?jaf$EOR}^ znjUQH!5W$n6B7}uJ(H~Rz6sRu?vokm;7(sdK-#Qv*whkGVzn}3iqyQ6rAS~ewZN8X599~s|-dfhc(NlZ*knoi73;tM>4@I!Ja2t9uWrJ^nabX>4}od zA^J;(`UfJ%eu&+2_}DaU?VVob8ff(AU3!#j)6<}q3N*J4UpWXYx(6L7ZZ$FG*?AYsh+@4?W3 zhbJdIQ0O!%AmTzSKkDR07%Im>k@%sY(4Z&scadkue3Wzo(Lqu5g*VuMFF{xswGu=@ zOyZL0d0;_8Jk&}L$!$w=?0W-MLokXnlxjn8ikeZ+I@~3Z10XX56ZOIGE-N+(;g^BC zRRQAQk@hdCUe0|1tOXc!r(Ea~3?<;k0>#u=nrx!?I!W>_cr}|wnsFqSakQFVY*5R3 zh>MhNa!peAyZnEnp`ayg*9NPEtXp-uhHM|lHv0;NdfGeBF5HXZ*!CEk1T74;T=FHT zsRkE_XBC0t0rG_<$}tr3zJl^-bzQ5*pfFy^oyt*yZuUk9Fj3TZIUC-La&ojS)YOCJ zduGP7)yHx40EFPN6I zh5UlhT{IU_c?&s$V`O34+07bgyZ6j`>G)5{CFY~ruZl_K;`hA_e3QLpxzp|C^X>w> zzSHa?L63PS?fWSD2XNzP9FsBC^^YtgprMV?^ryrXJTWbjGOPe}oAFg_ zy;*@Wzcmw#7&C}JIic=nfu}7L>=lMHgyIzHXW$%)rem?an@VthrR)mWU0qc~>jnS7-MrWd^8E7uXLDUw87u5lJV zHi{j2njU}Qu1#O0!69-89jptb3nMllgK%WA;+<+LC2A~@YYM2fg;bpC_@uxiwKGj~Jou&uK z$IP%sdCqZ;^z6u92B!Waf$TajlOtzVqwJN#q{<=$Y2{1gGzT!m9mY`{5i{K+QJ430 zyt^L9I&$u{a%z8qsi)`w&*1tdwr! zOlWVkThe0%l?JJmVq#2?HjCd|8CHSrw=~?k&Mm1jIKJiRwn=IlGFFFxbDZ#qOzHi` z-r6jG6b8sFC?MrL(xyI^Hi`OZo8ezfe=D|xMP0S*rO5Oe-O=jPCgC0d#@IFi>%7hx zHG;qy_8}+>FbkoGo0$m|hmA;;#zrtj_yWMMIt9mLQUeVOh7dFs(i54PW!lhYj^+JG zToqR_?k6u{nGvqGZiX8Z9>S#QUSWN;$1wQZKUtJm(12mq4SB|SS9Kc(PC+#M<&0W2 zwj?Vlmj&D9C56G`usXtpEORSlL`lTyg0%eh-J4xsa~-fj7Qt_!@BAlNGuz*0!CNPE-&p1k)A98h9d=eaEZLDYMkP9d?p zt3tF`^8J>%j`DHkqLGMWNgPqP=lg<0SRiANAlNM@oaqGLa~06yQ903}B*r)y3#JPO zrSb0a5(^-En_&e}Y5FrAjnZ=OY;M|Zs;MO)qQ?aU zUN&bjjA&eqEK~vjzG-NR8I|LdhsXFnUzG3B#}NBP^M_~WH2TZcj_>>M&K8_dm%-WuNd_%Gi}04h~N#>fwrV1D+$v5 zo=97VFreIh)1kciXVh+SJI-;|drzUHiRiqq_1~h~kGa!te^hAyOWFFl$H>+!+c>uU zs?!{sd^YraqSMuWzwmqG?mj*%UuL;k@b&lm*RNlj)AQA~=big_sGA$kyA(EE_%{D8 z`c98$qi&x^XL2I%$oXBnb~xbp-xJdF&o3jVPKUYixb$GWUAK4K^6c!}=A${zlC?&eidJ>@#DpOdhz;|^m%-9+uXT$bnOUqY&R~E9#h{ zo89H?^4rzf^m;vv#$H={xP9+uyKXCeoS7uqT@CK|d>lqzjlCa(+46AmVldl-_@moe z{{}6-U^slO{((5X8J|j@8l?R1m6CiGPl5SgL*{CD?|H%{Fd>WMgb|Dz*nLa0HA1P=$W2d$$$RFqCbUMaZyrOT?`_Wi0Ydo@3uCcMk=Y zRK%wdNo?^&6@rlj$Fl|J1^bFaqK zjkIIrbIIa-|LAc06T*NsA;j3bwbj3Zi@sk#RG4au(Jf`Q9!TlK!YUe-E#=~YlT?kkCtRxGl1bzP0l!bUv1 zzr`*fQ9cvi9NbjfC;cVqN>we^mHi{!Jm^1$j*Jw>`$9R9 zP)c?f=D|~fF04H~OKMH1W0>9<0ht2y{MbBahfz2>vwdjUq-(Gj@@nkd4d#I~i2gaZji$?Z0e z1G3Gbi;WXPL+!A*RB}n`X(4&0ZH5KaB*eL~p&&E_(5Gp$U_n$km!Q;8axdnAJ17 zc}d?qur~6Ugm1RXACc05$RXzB9+P>;d-b=P{$|p6IBeFrvCvIHe*HZp`Y~-~CG~zf zcoed;q>4jK9X8Mf>h?B>HCGXy^SD_c3QhwMJlro;Q^&pgyhEQEJGG`<8PZQ5b=gI? zU(e~_-O<2LO`Wz9iY%>$k_U`Z{6|5T1QcG*0DpGi5$#G z=yxc{zJ6!YF#bTd?egM#c(;g|C-e6FNF&^J&738>^y4rcV*?!aJXl5-ta0)`1I$iN zX(c2ksM*~zEJf^k!_`Y;LEvD*3=*S%2-Y)*N)z&zPLiNvbC{BXbvCvt_G6KxQb!bW zP)r2{M^!Z4i+gIl8}-hA3{ERbjW3+$`O}Cx^zX>d$Ef^^+H7udzj{vqw!i|l*VXQ_prS>cwOA>&=w9Z7ep7Csn zl!Rr5?ven$Zi>x9VQY;fFTj+*VV9wAzFZI>e&P3hy4vZ4jO&@wg!PcQ>+AMBnsPcO zdkGFgKw5m~Cp3HDLBc|j-MsO%Qw%ai43a_M<0tX$hVJ8MT!zuY+;HJJ7<7_E;lueQ zemAtBDB`%^-)K4r7nQ?fG7>-v&a!BXOuLn`2^zhXpfWgk$%TY&WNRm)YYj(z2 ztXtXI+kIqiwMg5jeOx4*JRB`22plpg!(&}UkETz*k;(*+7od*oH*CosSS|HKD>k3T zocoYPMvyDG2!oX)aTz? zb0EYVYx!$U_RrlK0aoID9i@(V>-u@=uK3fPPO|Ef*2lk#T8IXFb&};KSj%eio>^j3 zym3o8q$aW{2$M0*q|;A9YUW5krS>M$VsY<}QvEM(q<){%dNCGQc(EA8=+7geo!yL7aQ#B$dzUGo3RK4jq?8k3CSK$+;UwqkT3sS zmanD$G@0{(Kp6Qv0h$1MHTCR~15qOV(jLwl8M0SYR!$_*c zM1GCo)mu3JTwd<4uKfAizZvHdh>c<*{k!+Q;v?bs^XI+qreu+5&pGhhy(W@Sod<;jEtfNk|l_S1l%kHp)eqErH*;Y zTb$L&H5yH%n9Wp{#xaaythA=fR<x6;#1wq)Ne&!5|DF9F#ba zfs!W*aj}yoyAWF3pMq-LRW{eTcG)zR!L}^2(s5gjvYN2OsB&GJaceG|3{5E^N~J3{ z(Mj;;sICN$e>eg`2^&65bB3DI@0(oI)oL|~rE}X!%sl29SFma|8V$B)S0~JF?UK(P z-!0ZJvu*n@>Wbn)!gn_vvjM1M% zNn;v0TA2r8XA^1dOtGGWBK7_+@HAi8?GHFOJc0WM5s*Kb5imH$ZBeU1!|z-_aL>pX z5cCGkPd1_)3&ISTZwoUsGfNyroD-nnjw4d|m<@T-?2r@2k6u*Qswh2CW9g$O)uq$Z zLgtp!N;KCS?fCA=o>yHC!u9ue>*_VLh19Mdj{W!Z){qX){RV<~DL z_c)$dL%NEojPT%)@W&pu^>Fsp?cvB?xP&faWcI37qAIYat&6%My^I57Bn>x+=DigJ zV;Mjv$ncQK0qnL(rk+NO?rE~RXXK1|Maku$qQd@?D6?eIX|UVV6ICr%$JRim(gD<& zSnXw~mDU@vT}{G<1DK2z__8k+xg2H0C1A4A`ZM#mGz zv~Y1I_gm`|%1-&^fvJ|zS8oVUt2Z$eLRqN7)k~*c6|TGXrLDx96$Bz4ZApyBmN14D zkji3gRvB20_XlN?ToguDR`ZP(H;uAJ+UAYBy}oCMEq(R#a6EtCAm>JX{HLXI8497zWoF_RtBl1{3(Nbyn?XStCW-cY*$^00}r8=FU>L9i}TELT>rt+hr z7?e2spVcGxT5Ga<82RDlhdmT?CP8E|FtTi16qKLbLZ*&Evzj6999=&_I62Qf!wO>{ z@#KJAA!u5hu?^df{Y-Pl_LD;#&Dm+!4>W1!^Ff^S;hEeIcKMb314f2>5NGh}y-_`0 zw316I6U3ws^<6(R{QhOXdeWiO3}HTrAo%*6Xj(;oZw5$i9S$&>$vr=~OR=l%bW2O1IJj$r`@6~JKE_Gwq! zKll|~!!QT@Lp@Gd9O|mA13%^;VFWONP8Ezb!KXCbs;a26Dy1mbSC`h@DQ|2$!i)y_ z_6L)MXTu6G@MykGF5cKUFRpfRF_Xt}hg*vcj{K(%2W=ClaC`0pLX{LcM7_lW2%FaI z^QJuSd0Zz5kq5qWhY7KyP19U3mZ$%2zv=(C{(55>AZ$tkb{@0}6%K$}9WnDx2p>Ll z=LuRGiEKycyW4o1Lv1FYc$^HXR8~R?t2VOc^pql1tN~yaGqQ&aa3wFXJ^Rz9JUPz; z+a9ziaUoWB-<%V?x^(5|C~_?YwBFka{Ms@dqCIbUCWE}xJHYt*pFMf!vF+?Trp(>A zr6>t^BShvNL2WqrbC#RDzIi&&i+kwDl5q%5Tq+EqpkuR})+yeeubfV7nDf{EoE_(e zHmjH>JQ+7JjwIz^%2YNv^6oopQEbY)G^J)D>b0Rlv?wcgww6|4#Z0@N;Cs(o&k8VT zp7!MRsdfwtA?8}@XE23IBuChVrZ{=1BAh`>?SrM^pXr+(E=)&_H^S8DJ_Oh_D zaJ>-Y4n}jv%M*-4o<6H;i5~%s;a80s;a8SJij9oj^}@9 z@29>U8a_15Z#l<2timE9A|i}II4VzW@xXAVdk5}z?v{ztYrxITr>T5Ph4#sfHtWyx)`M5U6HIgJqZ;9%6f-p!|P zrTHEnn0XV{$$aG!(zxS^3@L=GAd_;9+mqFpP8`95*vAe$JUMaZpwaWbKOV9VN70KZ zs9wC~+aR3Y{SNY-U!gby?w7Ap&S|A`Bc-Xr*eQf4o~?pD;nSTvL7h=oawah~=Qvhy zUP%0llo6P>sJ+m*_2JFVrJH!XI8$9U=3v3a4=xbza66_`6sb^&L}|3+3(@uH@4tq| zLY%Wihb^-%Y7VFR&;QL)Akd4ZzyvxORaiy)jt^I>dwc&_}ROQ7+q=mco%^#-f!?Hs5KoEM-ije9b>|NE`0oNk6D< zpcc?dO3!2OW9*!0a7Z%(3ac1i?IB=XoU%jxyYIdxI@uHta5y)oWa=ix44&i3x=5~M%)pzCL?tJ@}EDO3q3pW zQmi~|MscjM<>1zq^JKEg1ER%9$yPr+=nVh!*=H0nERd1^yRMQerE}^D;Mx$CPU6;p z{B(qop>SsNf$3s>y6B|cnK@YOu^jfqYVA%(REJQhVmr1p%~C94M6oPN@u)gOQ3fmo zMP`UzeTM!hK@kHUq=o9uUA^-#@}@%^vn1E|aAtb= zjsQ(SvcD)kxjy{PYDh|n)xk(n1{JkD*kFK`34AbYbNAmT991V@ghfG9qhGu&V`-Lm}DB~1+pRnAvPbD?d0!{Iv)K)zeTGS95v|h@b~JL z!klA>)Un6gIW*dO84<&wfd{uZ%0dHngtyEBHQ~O&DGfBDK!qxzR6Vr$jnplRH_4V-%S-vk8n+XKONTW_GhXS)HuHV-%U%%oAY2IfT*8bMN=erLRE%g3(;BKC8H?yhAZymb9qL#3QZqm73JR zvc()++V?k`p-T5G+PdMMk#D{Fb{k?C6!M8ll zmlXC`=Fmngi4{q0eot#hkGIdo#UFmi>{1+KbdASK(=mRyH=H2a41;(tif@`Md5YOk95nI~d6>0B$o z>T6coUwDNb6}sG!BR+EUV%*$@%?f=dX$v(363{D%%As;7OewxpQ*1$6_^ zcn~lkyFzlP^phAXWP$_C#VArDL#M zG7!U!h>typ**G#ChB_qdF(O9Dknvmx1o4@2A~!(Nu?IQz_V(&>6jy=}G{_Jt3n*y& zG(3oU2>ykBhtE8YN1eRsg`KiM(XotHNS-AiQ-U98=nu?%R9B>bbG$fnfD>$T2v95LD{3AUP!pRECN)j~_d2(rYY^15b{3DOipwH*{2Gl_TPF(nynj zo1lt{)s*OC6s9H&RK(CanpD`MM5LtS!!~Xs>>iOtB4JjAM6CwWm7}#jSBEUZUKLi9 z;G!kQz@v$#X)bDS?zpzvtK$`Ra-&m(P_5gJce1i{-Jgg#3-hG0h>Ylo6W#_8_TjWK z4wGryX9sFGMjFhSnKIfShydJ0aS#W^bFW1@sNQ;Wb>X$QUh`n#WZX8R5=lx);Y?gI zvpF3nNNMnK!iw&AlSX=vAwKhYwe4n7s>vbLi!MzXL^N@VDJ1qWJNQm^eJlLV{r(HN zouW5}F4vP=8a0y*k>@MJr_$+0$nh#wMJXjjilp+e7^x*O*%}!VH2TVEqHvQ*p%J*T zRM+$)4qB?f7(?BI$F@U2+hQ3&P8ee;_5WUSO(!R0q?Q4J5UjSA+iI58Eh%YjqKX#K zQrb{P3uvOmK@hgvR8d6~p=E_FqgWq_(9o+XX-i_1`^FI{l&~l5WuS-w&)XSCSt42? z@rqm#pPI~8(Pk?P7MN98WJWNoa6;lnwOLc!p~FN`2~~Op?;w3`-DZ=-Z}X*rP7)39Qmi4^ImMeYgMg)Z-+=HFLK zUQCELkLmm2)K0DSHKh}5H0WIbN|3trXcWo_s7X|S*Fwe)nXEC^j{5xOcq8?ZT*t#Vj;4sp-Mg{1`y%eoo=p9 zy&7egPLo)!-Y%f%B}_sOAaK%=iG`5lWLYP*F>H*arzETuH?-Y zTe`crW!$Q^m|`$LGElyhcI+)S)C;5-g~-8XBg7M z50ti_l-u5OB7{6|gFTE+0dYsJ--#i64j)j3A?HMdvuM#w`KXHl3usm+p80-0UQlDD zXpLKVYPxUMQr+SyA?~V47;$Ol(6F&*EDxw4f6VQcxUANVdy_=Dn-9FGQYroLrZOrI91p;G zm$FYZ`_f;tZUQHvN%X~@)X; z0$pPzvgEND3Cn{N9D$(XF=eWb5RPVZaymE?#^RCgC?`En&N0YBnfKMcS>u=+m4aD_ z5f$vbRooVEN&V-dO9z<)a6?P*bL!$WUo(1EqUt3LlEV3vzb^1N-zzNtQofyQOKfXq z13^5wG+%}ZHK0Qjv)N?@HwkLM<$$ECS;PoN@WlhqK494(9xc{jKa~R{ZZhTTHw#xn z(8sj1{Ua?F%SNs{&@M)37@(x6+ZbYc2ZRsnR?vUG8%*4XCWSGapa}<#7-0-=4jcl2 z%l=$L>dSlVNlM~w)#i#14kk*bM*A085%@~`S`z~Wkq-HI(o2jJUUtKY$Q8*PK4&2u&T>`OQ;dO;l%sO7FZ(%6Ft@LQtjbrWalhxvNEuJy z>Uv2pVb(A)!Dy(IVAxJ!AMK2_I6+QhE)U|@^1exrvuS_)jq-tsb`ITQDhzjS34!7~ z=HY;>f~epz&D(_WwzZpZajzw*2_X>_S6aIZn~x?p59W-nzubHVEf>v=uNJd^&A;f& z{!Z43v7R-6a#+vj@{TQ9Sd8^@`IcoNru{-O>*CRLO0D*j3<(q>3RKm^wpWdebAN{K#Qt{t z3U{)3S|Dk4YE|Y;GQ>F4b`&O}q5f1m>N>wzIG_?vVUAe^{qh0%d?$lKKkf`NVay7Y z$P)IFpnt^KE%hHmNg9zU4Y>FqC-I-uc~jFOQH!X>y}PE|L9NUjq=4$(9F7j#M>DoO zy-qV|gbGEFfG9+el?=lnkTAkSForjFd|so3*tb`d6$O^F^6_3Q-=oq_UIWE1xVdUy zlFiSgV`U+3g<>{nnEA63ZDoqD)%N_Ki)6w`H#>|P15F=+EjsKJlZWy##*e+j$_N{6 z(yNqDOfw7=pWs7;Pv4Uu35FCPW<1=Jx(j83jtdZ92}1Zn1Wiydpclx9fpMFA?GuSd zQ~d8{zGHOfQ~l20es-b76Mh)?1}N5^@RSmXOr!NR@zMaJ$)7jHe>r*mrseDwf+|9; zPwFVNkP-ML1s-_4Q4#)s#s4{;$(qW#`5xJ!oP>~*5o{hzElC@N#HbhS4(Cx5Kz`gD zD3Oc(0}r{SX$%-G3u}U5lJvtISjeeQ@Ov0&WHIGVLy%7!#52MqzO0WM!)wKwEqE3e zJ!g1Ecz5I5Vs?@;goloBP0sG9iJ!dpwSkCY=*i5F6u7{V3zXv+1`>o3Bny(MV%SwD z)FNQYD#Wq&qRg;tU%>D-t6R93l&X9T6<^5x^li%{n#mba8dS9j=}{Re{WZgwd^woq zAiXcO<|xQO5mPS!z+OAYEs>P~tXkx>{RT-Upr`)x+gEp$u=1w{R>yuceBw;aPv~LpXNH~GQ%!y47D9Bg*ZT|!> z>?}rq5jAr27C+t!1qA>2K|k(4+6?_@!_dsiCJ54D8|Ec5dPo=X{GmRS<1n7MVCs77lU)xQ4I;dqBaim8s1{n13%xr}>>^eU*sim+&vBQYTt%yeISmuu*fv_?&lwq%JA|yF%v9f*8HGAWO$*WT^P;bFlD~sy^y=J?4Yv zC2QTzveGQtiX^#M38ipQ6*!isSj7SXqeBO386FeeVIq2ddlUO0J=>uVQd~0r|I4$m z8%iy<>GSMFWCW{Yb>o(hl1KPnJ|qQ0B$<+5qOE)OL)G@v@xAo(5AR8#!fvPNq~THa zO8j5hivM(N(~dy)Uh(&Y)`0OV=aX6l;$)oI7)xb|!Gi}u=y2HLC(of;XQeX5@KNf; z#$R5kk}@(_MoJl94(PwT0=B}Dj&=%}0RBcTn`|3H3(d9E^lglhtcEbIY`w6psbi_V zZM(rv%^JVOw{6FAP2%5Nkn<3gsPtTe{cg3ha8P7!v5hq?8xLcxl6yzKI2WX39M|nv z1ubq`nkEB@xnyz-Lp_a=gm~-i+2+0V#j~%*+3R{)-*;4-(C&CK9*>2M@4a%z>!*_G zN87Izf&YqkIi_;4I^Kf^{qOT`iMV)F2wt%ufOrwChCf<}{K25xI$Ejya?rM-ttn7fb2X9oqtS=vNEaT5coED8HA8^Nww#$RsLX`f znc=eoG8RgG!J*O|Xp&5r4*VmF^cnsm3Q-xr^Eg_IREQZf`xA?0)C`k^Ea5J!5=LB@ zz#d-te7W=16O1UCg9CuP2aScfJuY*u5J=9fzvDB;JaLR*#xaci8Rzc#b^S-r^*eqw zIGV5E{usV3u47$rV+|DWe2;`Dozck`JqQ*|%-409oJ2}Rv|;bh&(NIpBe<*Ka{i*{ zv)3UXb|fYI&xe0TFIvPPfM?uAhaqi(`GgH{E~}e263^i$E9DVT^3#qJT=O0!))5gB zU|a?Z!E{Rf@UB)cTN~_Sa=;2H&FC60nxoe{AFFOBw5OVuzQ^UyhishLkH2^CV2?Yt zO5PYsa19ti5wK9k8bml;Nnc9<@(k6KZVL2qM$aE&v~)$1MrMhb&U1~Sv+-hjFQmkc z$xJXFA1gJ@A)4L0Ypyctt-~DG$D!gZ8HN+Aq2Z1}#>RS71glFl|OWz{UGz(*_;lG4WC|>n_Q&=y3Mhq@4}W!;RpHhBH7SVM*zMzyMonL3bEZB{t!;@-K4q;$( zIh@Y*5q&N3VJ(}*$DK!M{zb7qfeQA;+0nK^ha$35P*O;99=zam%B_O!HwcC6Hpz{? zHP|p-YvtJql;NH`WMg!xP*zxA9%Vd))F9=)_>3jkv*I_2Qt|d@@J-Be*XM>Uw-z;x zaqT4R{s++fI&05vCq0P^k}71xlH%m~#tQsNz{1u!Tp=`*RFjr43u2Zgs9`9Y@tT3L zdYy7To3AsSMz}_eOe_(x|5IDjKZ|pc^w#HbLQf;p9NWZlgr+@De*~ROW|!ZR#6AS( z_GHtz)?ojxyxL>ojVr7IsQes};QoCGC$>0tGUGE0%}cO_eKNtCgBK$htpW;3MiMod zC^AOQWf~3Q1-T#=ghd$g4gv>C?S~K0@x868*#n4BL?%$Y-4!7mw_<(oFq@!s2NNR47W5h6gepFgeZ=-ytK{G|n&u|LTqdTFm-8 zZ9^4j zV`f$Bd-%nnXc%FTFss=!#4CQDXr~W|Jst?g!fznTD?XH)R|}w?qu%81b8Cp`>EGgRId(9a%76<~mJYh*EePRc`&5?+(S(oc`$v z{Snq+jtpWbx0U4JWn1J%Cyx5{KXu)OnTfEu!ZVf+DF_9 zJ1p|FD7fm0SZsS^g7l}*vR)Q9>C3yZt3C-$d>A6(iqmlg(=LozB-xekD*n6nj5Etf5}GMu-E0q9W-nZ;^p#w*Fesbd8A?e!1p*Qt}QA~g0F>sW7&**PC* z&zy4laX~#4VlM?{K*WTD%cP_UNk|t8OFzyS7M-1!JfE%<8IDs0y)b?wOUs{2dM#WM z??_$kdF4muK+-inM=uv*Sam*;kaVLEWp)^Shj||ha&-&zOe&25-hjdq4+^Ut2Hwa( zff*6jHB4Hpr_1N$>c25DbYwP;tl3S>W=R@x#?|~Z;~%Bs*`)ao>D`d`OTW45b;OV4 zCc>l@|Cj#S(^}Mc8_M1OwSKVV#-ydNDRF}um`r3*M#De$^yFr6G#id2mnYF0Nishw zq<*%(bHyvyn$GY0DGt{9j1=5T|eJzhJ<0bQqrg zCXzUA(EDm1hr3M`!zBBKk*g!iWNxAqDx3FvI(JCl=iGI}bbZJ+NC+k8yyTPAdP~Mc zeZo&3Pj>wYH z#Q^4JuWan=-r$qzDLG9*~2%2)DhL#LE<^UDJ0*^JL?t$q3Yx(h~T$jmgkiD=W7iA?Wra!ZWq0D;$PPaIk|QB7oA}8`?rrE zYpTFt|L^`=FyEzSLc`(FSBf)+*C!|ZGR?s$QWPy+Ber&KJINy6+Pl~OehR|C*P8Cd z{}Xoc>E6A0Qf9Ko{)M6xmX2PS5dn{F%6WG=u5!fo=r-B<>^lwjPSFfY2vwS<=d_<} zBnPdTIbA;qK6lE z(edPMqU&3C6QXE6+3KN!?%49-y@+{t+I>B-QQAbj3yaOa4;7p9=tliQ&(FHaS(|<@ zjlQmdKtm}uV760Bu!#!0MY<`B+O^3cRwi;$ml$-;fWsOGKLFM=cCF>60`m&_(pdt$2yUF__jQ9DGZYO{ul0DK0pLO&q~Gf*9*{%vJufKWF@B4Ah9V6;!fR zL35$w#z*rUJI0uD5q*p(41vTNe*GN%d8DBEg#`%!B&(vL{+W0PwjNSUj+PLH{Uly*d!C!|9n$&4M~u#@`vNlcYlGIa5<6B#5bx`u|WIB{d*JKVYldD+8+d{7xp#(Wc9oz*t5-YZ1qxfQk5{#ly z2M!b{c!bO$5?}RgD8##jy`4H;@Q>O1f12Mc;o4wviOpXaf7zU84-ZE=7+POT>7r$? zlG#xX2&Uk9KZ~N^VUurpJ$1N?2w$To4d*-tX zma&{=m7#*OSI$$8HcR$>Ha>ioU`EEAUh@^k{HTR#4?|?ABJSlFQ{u z$yyjEQ>#TE5|u=;%Dt>ddAnWpN~R-q3h)+*#&lhe7toLg9S> z@2(X0q_Ng;F-rY(`yFhbY1@|0?+1HllaqsoNOeyP8#}gld0l(IU4GxRuwoqV(5~h& z!Uw=XwG<=XVC+L0Fzk&C>Pf*vOB$zCepQ1B@^*OdkDl)*if+$m2z^jw|ESCz?8-DQ z&)xWbnZ_shD)yh9r`MSqgB~X2wmQV>u>Gp=Y_RQVKZEfmw~*#l4&}tXCsL9A<#W>_ zf$V zR_^On{Xx$i_#I~hV^t1SvDCWx;o?ZA`UJ2NqCo~8X7Zf2B?n#}jfKofypwwEirrYLGPo!S8xuAe)tPUb9r`M54^kV>Y}V;ImD^EdzN$ISfjvh?$b0E- zLX?yh)PGI~gpH-W;DdH*+Z49=vz2ORV1VQh4$o*Qu~AV~W9=+GD}(Dlg~!w8*2+&6 z#z_?v3|g`6G!(;<{ExqS{4EmheLsANP`7eu#xVHNDfU?8_hrYAJRU3E8{1M=-GahU zB7(ue?L2*^lxSvfp(t&DHr`7U!O6gRLE|Du8}AcXJZI<jEFOOHxP4Q^8~6S9GUj-7u%381y>f-tC(-$bENKMYgJ> z?U>!yCM0^`uC+o*OCO_V4m7?y$Ks~y9V%~Ez=L%0YLj$5AU}Bb2asN)m-8dya?y{JFT)-xkkcU zw>CuTzj`D^bxsq7hNrGz=4|ab;f*DB-jIO=cf<4+3P`5kZeqcc#KIu06N|0aQj?vh z3pPn7Vx)1_4H;;D&e-9WNmY^y7|`LSkA985>G#8?)5%!6X3R`TK7<+@D|n&o8d3;mDtaze0P=BHqzmT^X*wFhV@%Z4N>2Ncxs$3llnW^s%Je zJ!4XDf>r-24GzA3QJIkaaW>KT6`vTaCznj1Y<{Oz9Xu$1%UH<+D~IXw-r6awore?uark=j9jfzR04Z_7$7~XZoF4*#km~% zS*=}xaj-TmPVlgc%p#_HM#D8vLEZZbfxLK3uK!tj=yR#>#4Tf^8S5bH>aM%*dV~6z z*JFDk=ZQkd$r~{AA_Yhi%S2m<%Y3)S0~g7ks*YjiJOABUc<|ny{C8JO@;vYU)9c+{ zs6K`IqFu$ZTef2;k&{Ij=jl4|mFcfs%S6>_rl_+xm~TX-h7wsTde)wIN{U;|!7+4W zC9EaO6*r`HE|HaW`c2L`;{=j>h}%1NrFEcvUhL&7tAu_MD$i&FkhWX7H4*(Hrym?k zW?lE>7`W9i`JG!2iN(7gxjaUOlRYH6Dx-_RH%E3NYx*Djc#8yWCEtedQ~sCv-9D^3 zeQ=kKx1Am+uIibKbi7{nC;Txkb-E$fw;AX54-Apt*QSW#T4{J=59SpQ7$-GXHm2BQ z@Y*!V4)O4IsVp17->sjn!5in1Bak%<(+;Y&vAtvF7o@-;TZ$wvR zPE)GqE#)4sFEYG!t@Ve$jKciR65XgxiG`vQ>Y!4LRHTLNad*!Z@MQGf(sTa|oU)59 z%gTKqs{SZQfYAEYzN)SP-UlgAgYtG~Vr*xKur^si%Tnu#IgoXZ;;WlXn6XeZ)2Cw- zuXeXPWoxByYw-&*i2b&lodmmR>le)$l<~;i&1%3BX zT#d~MCquqW8ujA(iqxBrC$j!z0GFT0fA2*l(5|bjt`)h?l7i?hy2wT~4ANg2x#39? zuma&3A+07E203BisNd0KS=~M3Va0tmh_A5x#RQN)A>Vk=y}=yx)39L5Vlss02aps) z^SpOHX)A8%^W2TJ+o^=H+a!0b&UpEa)XW>w)RW;SUf)NHe#clUgLnx3GQq~Jk2y&a zpWl27OQbzYcB)Q4e_5n!BxgBdzbm4S?Cp(QxT z^f1gKY6m3X|6p*IGC5PkMNZ4l*8v&#Ze-9-YFx*_bAE2{Ob<3VN`e=S$Kr?gz7jDH zu<9t3;~3>)F?A6?baW7q^t&S1QI_>}NR$eiCi9FOOf6g-dxA;YE;3I+Wj`{c;WQzC zDb)1od#V_ISEBV6g8!$H%3FG756^~ku{vR%i+wr=afDkL?89-rf^iq;qI=TQ63Af) z9OJi{eRm382`{Ed_gon+36GKTV?H58m_)>+SS>a3CU=yhg+Z$aF}cys{{tO_9`{JZ zQHlgX;v5XbOwg8ef$V^c42DT3f@FL=)5+q?2q&xNi+@)UBLU;ms>PSt5EOfX`!_bu=@G_jn zDCA8NMWo2)3MN`q$n`}sim50noZ}-QT`yPf`a|segUvv-(!0gwzOs8LXuvShEhUfxz~|fF*eG7$8mTP9)C~9%egy^W5*5tu z6vdXCTsKdqG8nn=J(~N6F>8B}`~-bNbdN-~cg7rLDCj_7b6O1mIK}?8p?##4KZCLJ z`gY=?!jYEy4`OGtid{&Ce00pp=M7u?b1EpVXgRHL*UHtL()H`zo_ur1F8uYM37^Yf zpYFWl2VHnC-Os-k?#xeV>sxQBq0_UcIlG;)76U0!B08vd@=6yZD-9zjve$=zb(8H-jhjZSH0 z0~q)5E`fte>3h*7vuh-w@*j4+&|k&zp+YAKU8FVu3Z6Zr9&&DCqVY6)y*I%2*Betb z*I!4_d6o?{FsQ8=Fg;^TYO`G88#*6ZGFL67q#-uwWG`Vh9dA1lNsKpdY$K)*Y@?n- zkmS|EtFKnIb-jr9xh!3lqcMPGBSTS{8t1*^;diGTb$Gr1gLSH~RXpxh3oLGh-3>sJ z-@Nn(tD-VV^^x>7>h6IFZ$64CR+hH%55!kD_}P8}bRXBL(I63_&s0K;PY36IOc`<( z|A?M(gsn0kQ08NW^#Bq`L5o}&3!boNCR*JRpG4o*#gHr)PX9y#^#^-BO&;^RvOcpL zdtrYIC8CyzSO}P4sg6+sgHSjP^es>8j3ezc>9~!I$654fTGk+lZi_o?zd9x}i;UL| zP&o>nuwO8ZoMuVG1mc`l#-YKp#I4-ea!t`Nb;|XpgmzBgvWA3tgdrYHPd`lg9*PSp z6Vd=`27@xaXXyKHoVr#Uj!)8kZeCYY=z+$V#EP*2dZ#b1|I+?ld$9-+@s}6$rl`{E z)tJ|5y~7cVU}9l|i0nbXP7T(@__&UW9-PPAkAkd3MvRRM_r)=>8>RmbFGrQ@&d|Ai1BZvOQdK$V6QD72N|dL1&`%j^g4yP}!`PoxY7ERY zL-h@$pCGI3;i}xl$fA(pZ6>!z0q71wVa)jqPe@MwX;XL+XUAZQ{oy1Ch=GYxJbfAo z54gZE+G!o0a|w&d>*9hoc4iomMZ+zEBnXdtgz&Z~mU0e2!N7GD$ZX}P*DQg0I=}3* z8o>bF+o2tUAG3s*WD3q+#>88jc}`@BBW>}|v0d9jTw{0yDmkCDNtsdDG{z<2D6 zOPKB#TD1_M_+*Bld_{PBC|JAuD@~YLNQS zLawcYRYo_7yyMs5h(C)ACAC-lZOnp>;_QM+eY&{cknsmU=j_<_e-|+0T}P|+N%3Yd z1?=&DP&+V3-^_UIr4naF{QgX)qhQ$X%|;2D=O?cDNQ2Nf$?HDF`|aWvb=*K+ZFZAS z(?2F0;ykQ?^^CoS0o=_>M}$sMGD;?1lt{k1ntj-0Kb964l{Gh3L}THbK=PWJR!Yca z-TKBm8{B3G2azEIipiHB|q}8Zhm{LG|rl zfMoDt5;$-$#b~KaeHHKyNY%aQ4#v!1+>Q+BJ(-;MutaW#$;7cpO}6$Jf3vs$WkoC- zKbqx#kR^0pAKUr;r|&cF!Sl&dh3y$L7PJ9D{`FNvMawbOdQ}1g56Oxxae(sUJ#r8v zBB&Sg(HR~#Z$q5VaPXty<<|Es+Yt;y!L3t%i3ef9nfUr526wB2g|cb*^Hnmkb|inN zST<3!WIR#0qL!F>kicJ3n`wJQ$%HZLU`Fs!S)JFsFM#Ne@&l}wqCgA#~yE^WYk16OGJ_s(g_mqD1_H~Uq6e747NdufA94R;XQ^~ z_nW?lVj(YgrC$$3E3Ocb)DonJPrXxW*WnVL5;8NPqlQJB(&F2S}$`K)w= z034uGskK!7nMoP9HlJL=gW^0^chmd*|L2GAmfgm%q*WWiXgxMGg~zohjzNCG%dnWiu56kvNrz~UudSaO-VDdo zAY3_hYoh!Cn*$-4CScYoAFT`oauu=k(a!tdStg-|V9Ils0xihwwW2Q&xqr$|KqTb4 z%*T8D$M?W;!Hbx>7R6jfq%Pe<(I zt^bB8|Bvwdf5XV9;N`}qxG$0BECX*r>xPxlnFJvsc=x<>oDdj8-?U)o`+XV#>&w4cn;IB(0tXf9B{WTVsgWW_-rcju9|M zN6waSQ}+EZ707aY+`+M7p)6L*$JICfjic0#v;t59^2I+Z8yq zAMy{M>(cB=$1oTt#AYWRfp24b;KG4H6+8U+D2uC>D(XPcv8nykt&C<|4sdhRLh792 zm)G5sgg)xiGbFnz%oFYB>@6v3J9#(7B;os#*s(! zMbL1yFiL`p^ZvP+nUnI^SEQkU+CyO2nV=IXWO2m5`OC6+`>8_ak(zq zD@4-5vS%%QuD-Tj`MfcVg&5lTy(@$nAP5dgL&7)<4lm1#>-CfT@Bg0X7rLOK0%Z`x zh8U*TX>1mTL2yoRBhEd^AoDNspYi+>S&Yzlp7Y(BWEuCIgMeVd8U^PqjyDpCVHsd@ zB@Ug9YcdLZZqtFpAEVX7a!uHVCLeHnjzt|$gbss`+U@2#N@`emsb@hL3@XYAiXZQ~ zP3-l}Gbzx_n(yzL3Jg>*4q#v%x<23izV_S>3|!K{sKkz5GhQBz_(fGOe80}m97JOb znUY~r3CXEO&yxw%k=gFnx&@4q1;8|87{Frd0FeaU>)d3|<#myJ{dn%LW?$;W-WKpz z_jdcQdmlA-FKuyj{s%V2pHIi(kB)x_7bWk{hh9&<-Pt+wYkBJEy>F1^wbq5f#yA#$ zTu6C1ahr6&s@8q)FP8+I8#un&xFxSw@@F?B`hB0o-^TR(*QLpD*QUSA`CvR%Z3}zQ z2FKw&uZKsTFh9&>!zEW7n9RcpRX?doIg*p|^;H1VAP=0s%%M={5-pXIqvIr7s z9{S~t`y3Dn7${4DFcGiaY6G5;(9-3 zFk_U^K1Wc1_@(M`LpRf^U+MmdP|h_!HnAC69>>h&5NDqUMmAm)H|<(h3iLP-k4XKE zAKPu1i^`_`AI@f%qY|&HMB&S19dhhSaH$;bobOkt*782->F*?RcmAqr|0!d$sKnVd zuO|`gjOo#%<$aj6n`)%Z)UutwnDCo+qZemZpjr$_!@@?piI(zcKgiB?S^MMN2az zDGJ_P@jyF2Sh%I)3JOA^VbqXwGGQ=aU{gsBXStNni7&3UUTzJ|pZcn1G47S`%|8#} z__}lFa;7nPo0)S+guVZ?I~@7v$NhM8beAy3bQf8V_3J;|@Wi|+Ehp(LPkaZDkbU!w z0|;gdox%IBV-E?H?59ZlHik zoAMEk|2ruQ?eVDn6c+Nf>Hgf1ui|kwPP+x<7{kYF2P#^aH6!kHctPY{Lb*~SCF8PF zMGKyL!^=?bKg`)9S3%xMrmO6tNSg(Iveg84;eUq9&HTlut67;OpQ}#B+UID&+GR6M}X)$$n>5Az95KbD4ASj<>Ez25i-9W*V{x%AAiUq zMzoQcfr0EVFCqY(LX=AoI6pBE4W+}0gk78ab0?Uiovrum9KBh=?>Ui#6!7KgQ`K3P zHe?o!pwRnEZ%IB_ou7+X1(Y-sS4nl_?XuZc}_1MMfq8zm5tHV|{(Kyt*1 zM0vt)xg|tku_Q|A{pU^E=9u;*h`=V;Ee}w-3VIj|9T?;0PQ1jw@xDlxrvv7ygjnYl zw7&}?^-VKKiG%$5J0`M8=DbZWY-B`n6F8V9!6Atfx`RMSduhwI8zTtF7f!ZZ<3ONd z>WKiLz#$qAW8g#%l0_m(0IhVF&5XaxqgR*9mqtH>zCL_@y+2Ru_xE9bzP{wweD%@0 z1JV0>Jr>}W&$cfIM0kBu?`+z|>c!~=wbk&G(eA0lekMw@B9E|ugF=oAo@!d~(Jy9mYg4<(@I$=#ceyEPoI+3&^7QXMI zsr++yc={&X^4a#cYVKW>f)V&M2uI)F=G?t%@Eju?4c(o$q7|-@={wX{ zgWcP7n}6*t$$!&+*+BuTBNBqRm;qGIDDeJ`xyee>M!PhP*@-|#;0gOdg`?ZIIEJ_9X* zlYEjW8u^k-$(a7pk`J^*LJ26xvyyuK!c`!0)H z+-v1j_-_fzq%6kbAWX$uke}Im=@g-X6bC>jBKk)as=-GZMoB_pk9UH|x|QaQZKTCl z`U=T6lIKXoc|IRJRro6C$&cASzv0!Iya(eJ4^N8Ut=BEr=DkOsj~738mdllb#lRk4 z7k1=JWD_6_lMgnr?iU`b{%<#@cLV;PFUR5L_kI?xY*|Hp9tY9u@A&vEwO-!l<+*#| z_V{1(KQ6Rg9n^R>TK9wx5O`T05xhe%%7z@0%`%l?tS7(b{U4ISZ>%0ze+z+FfDeuc zUwlH#Lx!=k&Q7DIlC_V=E9772il3=uaD9wNVWQ&VKUuK|>8~h!oDN{a@MJi+ep%l z4H-55W_8fi^95Aw`7$2+4mr12$_ae61^;QbW+s zJbx|dwOIagKMev=6h}BF+|(D~*QT)*q)~a^+EOmRZqC0=u@MU21vnKBJXUXBb26A@ zjpKx2-YyvIx#P8F<$rz5x3CVoPm6K7`usPw@6F36hA(Dr%RR1^e6~%h%g>^`^zOP1 zx+|LL=*-9$0Y@e1CFugaZkaqjecvwcukFL_-97$~e!bP<#gCKEvrRf%)m<7b+V#aR zLbv4T!)09i(CWX}aXh(^YcIq=_6A}?JP-?&4Fw`nfb3=}1m;YILM@RJNA_W>A@b}@ zZ?o0NGBb>#KDQ4Cbf=ud)qcDkrd$`VxgVC7-07f7)ebnD(}7>i zko*)_OlBAvimgaaW*C%*gT*mj4jc+eN0K(f7{XXrm+KY%Bif5&*+4@Bj;~I&&5xgsc9u?EUGg3MUdiNxjUXINy^p#r|4kis>+|h*@a6B(?Z;;BEz9t2UhJN; zmR|0yAJ!+#**)Jk*kQ5gEKQn8vBVMVjrxs*mR70 zF*3y49vU?l<;f-X^`UsL>wEg?jUtqF0l#Y4dky{~Fc<{P!rGfA2L&yb!b-Z-Kaeg-=`_cCU5kyjh=Gg-}syi!VqGR)$51syI!m=~XJ%X36ZI%@#6a1=p# z(czR}wE3fdt8v0RT`_i=k~=MWXOH`QB1iksp7*h_bQDhjZZAIvnDgV)!gUwK!4nQL zxP32p;%-R86KJ)5efhe%j~-sE`uI3v?drGlwRf*$51tWO;^EDL(R%MMZ~i(PZ)X3eua^GR8N6`Cy_$V{+%)>`+UeP~;=zBvu(jlclk6P~HSKSP!M?zN z+8HYXTX^QZqX$kZxw36%*7D1_+0o4u`uJ3r4$l71Cntl!&kNg}TUZJ@{s@`JVe}gN z#j(o%L-Csmm=j45o@wO@Z?*^r#ik~Ik)jd=cAGc|5M4LPs34Fjsc^*xv~yBDjhrX< zt76pt+{LcCOq7WggR4xh3pS*Mq#iuNa&_cJs!j}7{G+2fHEWP$$VSv^HBAIX8IScH zkH5g~K7*~`;`!m}ye-w{ciFbQH0n*u6i=1j;; z$N-bA=0-yRwIDDQ7_vvu&>2hjrT&RZL&rVW`>TeVFJ66a)30Ec84oTbk8T=D!w}#} zYp;W$bs=gLbDG(Y#C~$u(G($sFpPGGr=}ADlQ=>n=PbTOyD2>EF)`}nUyL9fr>btQ z{^IqnJ6-RkeBdMkKmY&$3Y7o?Ndko-N#W*QfZ0RZ5>-!Y{0|A?<{9G@niNj|S@kOG zSl}{cP56>d0VFSONV{#5_jQu`V+9|8;kMt}IATZ!B!KX6g^r=3C`eW0{6ml=fU-#G z?(#E+_59)2e9{3Iymy`Zbnz{_C&q`WK#E8MepXv5}c#GtQ(`re4iU*TXkuvuyOESc4J-1md1A31shR5GAh9(H| zf3N#>p3(byU&vnbyhXAzaM%rDf&gQ9;o^vd2oM#5>m7`wV)>CIzcib$UkRk`+l`vB z!wJIt(BmldY^1-Wa_xgwZ65+l*gFsI+YFuDd55jRZRH-cKzPE>@1NR=5Bmw_0-8^V znDH38N4u|W3C;!N$>oIdlCLcvF_wi58pa@tsy4Yu6o3ei+w^1nZPxpvl)@b^r zU^=pg=xG??Tm4iCbfj8Dm(d~96olHA3&&CcFXKC752Tet*&%l!d?a8%^v7u{IVt2( z9UPk)aVaOJoEA^XNo(x!Km@()LXF@wWR{4js*3UAk^0z@OTUX{!c3!65O~^*QbG%V zNrFFU@{_0aeWxS{4&_-G;>pXYEG4N# zTRY~v;Q)AN^NAp1F%}bJ^?Hk*2(!aur2Tu4^Yk;?U*Y>Tqa;0D)6PqfmRVq0BR@-f z7H{nrDn9blgX*_p zB*%Tu9g|*CH9!ez^!W_FI!Me$L}CgBb2E&_BsdI(pwbt@G*l2<4IslCV92P9uK@xx zY~n=-S2tFT1M#Vfr4fL06_X!}Uz>R2-Zig89G@)qn{J1$88C66kjcmI}8VDae6BNCs9hbg{oC~EB*fiQyc4D~{fC;~>1 zT`C%eYL@a+V9z*8`WDR>$q@9){j!VYA{!XR_jkdjg`GcU9;vfVVER$zAgD<{7?Y{c ze>LG+v!vs3Yq=^Jvj=U(x7ty~P)0CVG1kUg?pE(OB}}XZP@_*OI^7#1BN^LvZghk( zp=Kb5%{~1#LCpiK41~;7FBWZNM;sy%iS4k89v72dW4B_1MCB8`sT0R2K6wx1zNtR5 zmm{NK<)f@4N>E7_Xz`*dp#+;1CLFbgZU8$K?y#?Xai^k^O{&-@d?}V3O4Z?e={YEp za#C=1tE)w>d-Fm@Ij+%dq=vy*;9(V^c~f){g_VFr0-)nEep>t4jIL5sg2~m&9W_0j zQ}wicC!V8$`_62Ssy9@YpyfwxjMOlbYMWM|iIBiy@W*@_Bk{?+f$1mTgHn4LT^Y}1 z*pLI21Sts!LL(?d5eT8Q0P!bj!d{-l*h!5cNWhLfp3_=v^V82_DxY>1WH*#oJw%~m z;{~n#J^{q6L9{qE8w226l%Upe>`ebL{Vx7mTeZoXQGfBz$^74~_JZRT8E7Df`<$hq8H>^#rn7u z7J17*X#E(%cv(CK3I+<#p_A6DtE@4TCqxFzl|GnAo9s`ENO%dm?npk^??2Q-R zK!eB6HuCME)b^X;q384c9zBjFQ!vbybAH<@AAA<@ zC`wqGTc3!a7n5Js-JlP;SCFc>VQaiAXS~SObX}B9GcjY==;ZamvvnDfWE{Bk4iX?= z8OTxVxd{t8FCrz4$guj3JZOI=^u6Hi;k3EK8{>h? z`ihW!!Grmn*ByH+n0FcS)@YzW_RS2?C2-?0BvZ#U(M4m4Lsms%Apemvv};MV>)}6$ zEM67OvGze1{UDamp|z@xa+ryrb1BV!$sD#|JN2m zu&KX%vMYP+;-Rt5=dk?lCK@@(2@A6D_;_@4-@~c@%%4sfGBF}TNmP`S=}c5&je}&` zGHW!dSSrHCWKm@dVL$YvMUzWhT(H#DBvTP)Z7F4z7Lq?@hrez3U-qkzCkG9TQv?kw z59ziFEaH&p>3|jxg~1=*Mi@PuPenRHAHE<;dU}jt*|tz65-D&Hh)j}tqvm!G6R~Xn zBK9BmlzX4t;}~ItT1=eB=y-qY$?Eg@8bCav;<`OhFp60LNqoV88W~MZP?$)%8P!En zh|q!NlW9UAS{RXlf+awS3TS-im*DqLd*0jSHa}=ed`13##8@82t|MhWTHpHFukGPF z>9QXB!fUf3_$H!p;^iLlrsjzO=#t1vL=gJRH}75f><(L$1A>vk5P*y{bE#Lg91cL^ z2`wf2iq+>{uyyOQ!560_B+ZOv#HxWUwM7#9f+oP!yUcpZmui z=^`~yU}&KoWZIvrBZ%z`&d&Y47^0xS7v+?_PI+7=L z^4SRaERR{^dpMpRMqfQL#8HGaFRRFkf|Q@^_Aghbq3$!)_297t?^~OppkyE@fx-_0 z5)Mgg7H?IqN{Q*Ub;YP_?gc;~)qvQ&3RI(s%$MIO-S}WpACs5(z9Tpr>w7zfTG5YN^BD}_M&uSty-Q1MNcV_Q#+@Wbo0vs?S=csZ1@&H z-ML#HfZ#8-{;7r=!~rf-L^4sS=O{WYQOrJ}=EYXrDhiMhi&GUU$&FH&rr1|WO|m-} zs5np-z(95Q1s*3sNTjj|)v^_I4F%X+1#iklmYZpVYn`+~qWf3LWm!_sHM*&KM(T={ zF0}?0$2q4OdUPR+OmEXRnV}YCP_ERRt*c57K*qP9oW^_iyGyO+>%p279ugiegi>JC zerfc17F;S=lecvGQ@0v-aoGf`C9J4O<0JwmpG%6AuJz1ka+}bRJyrD6SHGr+_1en| zU3o5VyH0mL=5LWDpO41HhG}sO-?x;c$rko3b^9=Acx%*y=w@w}BVsaUl9tE(w9i}% z?#SS9OhvD3B9it@$PE*GL)woJzrVorTg7-b*vNy#{~e;##@D;75?sG{uYmKOZX-kZnScA znQf;18T&fp&*V;g{R0F6)-h@eG{(?nAtsmAzg2UjPQ8aZg!4FqB@kHIZAJcmuFhy} zCjqmTC&+d0&>hbmS=e@V8yon;#Aw%aRf&m6QAL3cAr&DL9SqXFbA|gEECL(V~b*(WU zY(`=vzpLug;aX=lnVl+Tq9SH(?zS|&@e!DhR7Nc`yhk{Rh{e>;5gE2i+S+s1KAYZg z@Z)Y~-E`B4h={~S3#}@mBT1}g_vd+-h=_$yHwha3*WLjXjl~I^EYfpEj%_UI;5q z_wBpWZL)2CHF&+phXty&xiex8bBZrpX?xt!{B+dDob)%ZVI)~@(4tQ3t9*kB|s<-vPK65BE!!YoN3t(CCMJA`8N@(6n!uE=zT zLy&w2=uLrG4q=!27YRPuHsdjlXKuN~I2q7;u&kp6_N-xPEYAV1{uxBNe6bxEZ=y?U^8Z&sr zr;LTXk2vL&B~nY6Ln3PQgLQH~@dLe+&b8Q4GxPQZxJ5lrF2>4*&7U zAqR*3&^ST3BrY@2Un}`74R`zxFKZZwp&3+8B%F2XkbB;NEO-nHCN2sA^9Us=2o&2O zJ%XCXxO{%WDwN+#Ys6UneGn>(ArZE{tCp2e^^cxdvRXfiT9{#m#Yr0j_#)P(_G% z`t79g-3Ck)Mn}BQ9 zF4dmxYbz3}@D6duNq)oJYp#u0Jr55C?Dg}i;SkXB_6`rS)LIyzg8bhVI5sp3VhdQY zYt#xJ?HY`OSbVP&?9|va8Eu1yt2C`1PJFFs9C8*8J3*3Q5n2$65=`$BVOaIS%>e@XWb4?Bz;)}3(Q@jbzp`pe9E$7@;$&Yo3Q7;O(_>KOg%C$# zd}4R-I(ZkZX|>#&A)bkP!LS9kHV$WYm3VfNY^0g;!)1e|){9Mf;!K?tDebSEwwXCtE}gO_`0SqltWn7xI8iJA~d z?#WzZYzv++NXAY;xyt9b)Z}2yoivYkYwlV0=hA>QNtWk})EV%-0B&!Rd6XMF^2J7T zwwp3|mh&_uGu*t;J5Jg?beyC4D`%}ws#C{!J=+ty1a~5jk`q_@{vYHmSL$M66%{If zs+gpug`yB-mHGEAy|Y?M>S)*1TOpunDPBNy$y}WWNgI%CpLhckL?HrEFE8(kQ3Kvh z0*ev~V>reHGXM;z5P~BCDuhUYr{O#t&!%-9c?RbWQXlwc3#5R7AMHE=i=+}6VPPUd zAVN?c62IXk2%*J|!0ZDPvXw=EaYaiK$i;WcX!ZI3$Nql2mi&~77ql3y%A(gDrLsn+ zk}0J?Ayy1A_CtguI>zukw7?XPwl-tVd4`viUq z(b(a81N0?`tU7zA6%3Z}GBwy#9;rgn9DbtG!Y}5?YSYFWeuuF{K^HjdewcCmefQ|wK-u{1WA?D4f-tl`q8m)W3&pt2@2Nnze zroQLv)$-Xh%~$#{<>&Kq;F?_5?eXuMfrDpgR}qj(_$Lg6Fj?THM1eoayeEXz_CXL& zAd}ij9*FCFKl#{J zqs{K<{o&x1UT2h1eT-DU;(mCHLtc-LpvD>pcKO}lm8ALprIn@6btd-Oz|bWdW7KvhDfiMW>RZz5G`>mxr^z6l6MQ8 z(@4Mu#!%Q#0i($fu>~nfA>q+gZ zXBg5nKAQ$4jX^wqNvB!$7CjB)ZUO=PQl~u>|B2)n7RId9A4|Mm-P|ZA45N_jmN+1j zWb{REV^e+bs-;y`imKE-)f#&;8yn9J91pei_;DOBwyNr4^Ssh~%7>Nr1W!zRQ9T^z zQlsQ}`sEW*{Ax|l)7F#MBi-mnII>7AdNA#c;EsNXzEr+nli~XBK3-SB&;T{X^v?LY zxi56_5*iFSC!JkB{}hMtpCIR$X*M#hoXEMBW=yMcu3+H%{T^rFB=RSf9)9iXhjut3 z3Ala-oJ8S1g=~cRaO?L7`F_7gi`jf(a?H%n5vjHk&r{=c+>5_D8bezy*%)<>2+7g1ELhJlIez*rNR~4XARC)& z1{$}nVIsKUc)Of8w`a`+gjm^H&22v=uViK)$$LxoyKuYLl6^hiPgYN6Gmm?~`@jsq zv)JJtr#T*xwV3j>?e$?9?Ap_Ch*sNEBZJdp&gK!Rk1w)sUb)TgpqDEgFB}5&b~s(J zZR}s;kEXtG>G@=N?E3E`WSLaU9-Xot_8EnS(!L*uQBoF-er;-9&%q3P|A$<<{>x|% zyw^OXJ_OPEP%V?FJq8gtW5{`T%-d1mr`L_!0qIPcTpMQ}EZqAz6>`sZNnSiXO4n%K zvlogHqK~_i**8{^e0n!svS;Tmi{AU%j*4*H$f*Ugs~!(+uA zDA!kcE>rT3+b)h6wzhU7>f3N`{OB)nNq*d*yqvP241OJtf{}aK2ZJWo4*T2xbfwQ; zecT@(-TMMr!G-~WhCfjUVw4O(mya;f2ILN>_)bIbe7KtB@#xf3!|?_tqOWH${B|D! z@?d`$6P>*ui&|)em{IIm=!#UH?8eJKKKa0bFFr+Q1jxgXKVSOc`{4Bi8_2N}msiz} zV`lpP-{;h9H&uyqf1QTg7IA0#c5Y}dNMPgLSP$|HJ2B6h#dvJ!ha##hM8|!~!4u}$D_aOxgU}OnVcAPK*10;DsnH4bIIHR>;=KS2e zqtM;UF3CN`I=*&rIONE-owbYgY=_&#Vcy#Jc{wjr z=lespO=q`9;qm^jVD@i{t98ySQWy zVKWVq1YM&f!-@r0L%Oqiq=J-7ybr2(iJURTKVamX*8SZqbM7VQDj1CV5`TtFWHzDo z)Fq^duJ^{;bv{;gy7?zNv!}?WIb^0mr1&wUVUI@-zRCNL;o%K?`yYZH z;fQ7M2!Qf&1U=r9#VJV)SBhv8C<;1c#}g4B7+MI13|VZCJk)QxJqp(9s|O5ZvM8~c zCnxib_9*4cgnxJA&FRH*H-(a99S;g2hQfMw;oTwDy#mS7@*9L6kW3@MiBRxilIW%$ z&K%y2;#+9JQ|w?7dY{5N=VZL>35)pN_=4q$lR|u%Fb^*G?P@I;zd4P>$Vm}6wDax7lk~FRr`w+S@8G9?$?nYW7rVFa;>-84?n;tE>Qd1XqczfZ+^zrz(x9CK?2PxM$&S!ME z>Sv4@WA)5&KU1B{zDqSJQgy~oh`>?U*( z^M^?{sXGo@Bw`cKAkl$?DwG3LyvKP5u!e& zNd7JF17mIvLx13qi?heUb99|g%_(e<{Ur4!aV@D{{)>gXyLh2JMrNKvT)OI5LhEr!p)lWpsbUz@+4*kNx%%#CGJ-_%aTbXi6phuufrt)!w((6 z44ja_$Cwylj{Z#>Ky+E#r$AgpV;1NNo?zDW@@&(rf`Wm3Y{7PqFDBHH;Yp zourJ+%BrfVHF~1kBi4HTA2%Q4VFPY}e2Czi&s? z=%}Tvy`D?;&?yDG+leKu*ZR6Q*GO*!Eu5`0DjyZ+`yv z&#HU8A6l}@XzAweoY`6(5IpR4ALJe%&3nbDnrVB6RK|EXi|E^pB0YNMsixx^l3LK! zzpHyvwEfDjn9D}HS<#^|X9f_z4Ce`Agt##k$qiVD0gLgB<|@huuLdOI!I}OoLo`ui zBLjzhtXg(_i}9Fq)r>Y_Z0wQCB_V8PN)}o791yT=eq`yk zF|MuXk;>^vSWA4c@7FjGcKtoMWA5OG-9p>(MTjV4`SAPRgd9im>Wkm87jI@?x)`0s zOnKtSNc<7)67m8Zw@sD4v#sW&q?}-=MfMUhFp(gIQZhYr zSU55vHasnf1DpexZ>ZxN1O`M(ga@~>rM}x+e@{6j9G(pVq%#0o5%-=yGHakMkPesxu$qqUd`H1KB=yLR&pJuXr=KJ-Vpl|nG>)WfqC-#1oqHw2?s)8@f4acTk#NF8 z^z_Gx;iY7qOmY_$7>{x^>WFCWNf{3X@Ntfn>ExJ`f$5VoG8{TWz7* z2VS2@cY|%477^k%ZCXh%!Z@42=o`SD{dN@a6R3XKp~(gHTWv{O!THEGK33aljAX_w zw&rIQ3nGRm)5p)l@S^U<4ju20AI`5;cCvHo$A#9vE-E-D`=5I*Yp=OS%m1G5G-uCi zHP2j0d5zXQrtRJQJ94jv_u=vTqCx9Si_AGP^{|kr;g(81`nJ9ieP?LDM&8HXegstd z7z91o` z3hUsw8a1x>N3b>;Xy*F!eqEF1fn9uykzbxP(MsK#~b+pmP{UH_oo&CovMw+TjoI+lI2GlbwOdV`?@W z(muX%iRF@&uvE_{=KDS0=KSAhCH`=qxhH3c^%@}8`!D4GhB!EIHNvxZ*3^G9&0&hR zVfpM@z{H=m8);JAbgoGaY=zFmY@jmOS#D&80RkW}paK(4MkKOhLdcPjvy)9JY0eu= zlap9kc)$ipFme8g86iYCuWxz7f*iICwiA*_@&_p&-7nx0o?}CkTNA?@Q3fHc&}N!* zocpQ7nYO7BB%Le^F$MvB7OJZx<9G#yV9Q};=8!pnvy3>%Qes&HBr!2)=L4J!oS>N{ zDp4eSJb1b0=J4uB*}tsFpwwJ&z8=3MV(#Vgez4r(5Z=SAWg`*1G5OmAGlY~GAual5QhrHj6gBGq7zLS$I>fkH--irI9>dp%0{nAR<~9 z^K}pAKPsFzG)b_D>JIvAQ}}Q{7^_0|g$GErv1Q++1ZaJmE_*ZF?Y9UFVj_f>n&~CH zz+IbmHZ8W+w`{uGZu{8PylVWZOj~WX`EBRl2-|J*Gcz+YGd=`#`d`cKs-hmx?$&`7 zeBDApH(VkRa03Y3rFT3)O;Dl@l^GBlTwuIeq!4&K*u<&)n&;h4*Cq;lUvzf{HLoyh zg675q5U7yZ=#j*mBg!}@0XZB~c?R|+6hg=*O-2S3#Zag$!f-nzC4gvnA-s1temlA1 z@JQJSQVq>cW>Hz-)9Bfc&){-7GxuQKiv5;&A+fFJd5P9%rr)DpR48gUzS?5+`u+VK zdpN1T51y^AfH@fm2#HVS_`XAL45%OQjve`kOZmb9$x?{|H->ypNn`W+J-97%Qs(&c za!<8$+p%enGwr_?)i4AY6?xBJu{Mc+Ts|M^ygx_f$x3G1etR)Yy5B!$pWNZT=Geskf;o1(-TD&9<|vaoZU9_$?by&<>B=ni=B+SV~O z29Q39z&Kdh3N}b!5S}t&CKmPK9tKBF4Qe|+9(Y)t?Cd!``;kvaqFturv@Z{4^}dkz z$Zb#T$42m(mnb*_-&H++v+hx?v%4JL9v(T%On8A3lqhsOU$EuH@6@LsRG(cMk{FQcXO7h2$!aM%*P!XW$IssZNu`2unf z*hNQux<^EDg=kdx@8bJ>)0>O&qnP=JzKFvjVUVw%fsKg`YYek4GA&~`;Kal&!^vV6Lnx>b>>rXh4`#vb(CAYZg z9SI<_Dh21iXK~@r>ipi5zw!S!Ydq=}q`#sO+LAlH)I?xPEFN1(jE!BrGA{tg@nqr# z4}|Mog}Rooz~KXvDXxHU9Xm`#7ik!o@2Y~PwWSE;`>@e<_-aS;XQfmNN5~=cfuFaL z*aNU*fDQ=-#qac}Y8(0o?Eicp=Qg^Ch=_yUv5Ij>0L{%%1PfQv4S2Y8U_w#}kO*ZK z%N1b}#(bP0`~BV9k{JA{4|keuj@0}M5_l=37QH=xzr_4K(m;4fx5*Q@`F4l0p*yzs zrFJnS;L-dFoQHYeCphnQYw6(VN+~I2aQSRU6;&r}^fHi!yi}k&3gWnn9`tG$U&0y- zug`UqQWy!}4$p1O1Z+qiUw@NTuqjz4aub*thIr(K>>`v&c~}W?LXD73MF5yT50S!1 z^6dG~e@P&%5*EB)UVmSc*R->Cxf_EZONgIV8zMbcc({F^O`IE1-=h1p_$D?B`qrt_ za5;gHmTPVi#+e&$93vwDemRFPykKTs6K{O|ueU!$s4%h+_B1y~pSIr?=hsgq$}rvW z^=8=j@cMQBba3wW{q{Eg?*Gl)*Zfd+!0!p-WP~2p5o>B)yb=p)@6#3z{I-MG>s#i3 zCTm5V{`&NIw&9z9zO9DwZD~qtoPKWZF9)AzF0_6;|BRbGX7{6C>qK1*v9+d|<)^pH zdYJgNb!4~E@AyyX>GAq=;$K!dy6t&gv4*)AGW@>5h-5c4h#bq& zzdcaw^NvC2Z$!Z{cc%3G{5$?kTOC+^92mPexZ6xYrFn`M_92P!*RQ<##lIeCotwB6WG62 zzZQ(&*w4Fhw=l5Y3O`Q!E3|BozY!mUf=5IpF$UAC?fp@oydS`vjBONsqJ?HD51-4x z!c-PT6tOL#Ql&v=W;{Cf;A>{|w6wIfv)kSbExqX}Px-s^3)8Vo8(+VR;9udS2+Lf2 zeC_)DexAUyZ`Iu(_+ID3`@27PqIdOpIy}_0w6$q!U1E}@N`jVlT$}0oY{>C1d+9sg z#&jI_|3@gIl#!B9fC^PXeV%95EC}uibC*W}kqnPYAd-hdAuw)VcoqP7yj-npJ+Ypt z6_Rk+SYi3i0~4OW(Kw0Z86*xMOC~WzoVYp7Nt!ZSHbF z4|m<;nGi2ca*#btVA4rX;id9&9OU7r^mx#~C&M{E@KHv7GR&@QCaQ|1q1wQFgoAWp zI3y6HibjbaM1IZ*=AXhb<&!1!#@^WM>LMdy!xw45WTf|>x(VO|^lkCTfbk)DuW--x zdqmoGZC*636SFcb6xxk6b&p5Qk?X1ZUeLM~M1fJ!5Dnt9t0;0Lv!+NKF(@(>;IP&& z=zNYJpd=zi3JD)kOfT3X9F&6y7?p62U_ekj$i$VU)PaJ9OGrr|8d!DhxK4u#Rvlm& zCbC0TbuCnFr2CB17~o^!@w*d+iRydLYmv}Zj!Iz>C4XxXEs!Lhz#HoC&mTpn`XRjZ z^%kP4s>83`N0}Wd@Gie9iExVRPtWfAr|$7#?F_;hD}ol<1^6r3 zNBf`N?j}kiwgBD3-~&p5ln`i~QxHx_fIV-YTx;KK!H7)2X%+W`4+q60vMrcTsJSqp zoF(BAxtO{N@7+fxEN?fCdvixO*h?SIB3vH4PfldJV=gKZE^t z{lbBil&oiT1B*UX{ClFi(XjwfyUay_atFhxY?{l|O3Y@@Y0@??ygHY)- z{6Xg-L9`fS2a&1}WQW~@3IKvZFklr;7q^A!ASOe4tlRJ9vudxb-(IBcOn^7Rh=v@@ zO7Bx0TE18{_wmu6@bLVqRS6uHzUuXoIlKzgr{DCy==f&RYybB|t&sX*tZuic)unhCstSJ8p8`+xxhD z`7T}4;_~cx?mxHKR6gIY`1`z5%KJXf6xo>>(E0y2;C{%6grH{ZRv=^iU_YIdd)>&S zhk-Bpt#@D9G8!IVYQEiW{avnC7X|b%E`%J*yfCn1h0iTaWu z(DPgTs{AUAPK30$a4h21c>`0uUppP*!6LDV8Bp7sL&&~NcF>kvt!R&Q@Hw(z40NXdcO=eSE!SJ&Vu!ZgFEVbicS2QvwANZKgEdA1%w{fOp;J8>4G@zYA;bcu<{NHn0NgH-aAo71ldubM`1|@Ee=nnwb+vQi&m_1l_erhrt=)TEev8%b$J=**b#@$#nYIDUgWWS6|2&?n2to^uAd=?(RCfav()@!l zC@?;w(W~+Faodj-R3b$N9Av;j#28^J$c(WbKZit8hPSG;hkJKCy4v*20@h-%q+;0x zW;rL+^hiIex^K)!--81%!XhH7tyNV=y06HkY{h8)oZk%LC+w70ewmE`Kvx5u#1&Ju zEDXqI52HC)R-%Cg1tkXh)0w?&Bb}z<`L+4felYJ4{7=O#mO}#rB#FxCfN!vp#j<_A znknG~0$Fx#*;D3{U$539A_d&E>;d7S8Sp2>C(WuVf@!CIrwr+4WRe(6iGz=|+N0a1 zgu?FjasU|E8Isu``YJ?j^kGM?q{i~BN5`U_VT0?CLFoJ)fbAhw5Wx&o9T{#^k&I?m zmYYRVnvEX52V9geGa)0n^y$-4nEJW@bQnam|886 z&}bgR;$;F52f>GEE1$>h-?jzw_u&WZc~i>Qjf^U6-%=;MNjN)?z3rqPy*Ww1SqCx* z36e{Sb2&H$bzqGV8@^D?hl*y`*{vU}kM7)faPao0lZauYWjrEjPKH*H1HdmKOP<_& z4BGmQgz6dN&4J?tWQ)zau6$SRcCUx4+KwOsjw6T#Ny_PqY>3sUwUOE7^ZL3ozykXN z=?6fhX1*Q*lkjHqXYlP(k+tr`0<1-$d0uv2T8U=$V4v;Xdbe1w&4>xG$QA6M1?u_M=yI`6i*lzX&sb%ry@jZSl z9&v(_AnuW=IR$vguv~)U86Un% zG4l0x2%3yX z$@D8B>7(XRvbd=xDZx%)ewIIxt+dbL)~5qkrfIQnENZwalE(9S6}yh%zwk#<`VS1) zI#&qpvIVDl!Jpi{j@k7bOkEni7!MEHF(B*KUbgTt&y>)5=m7|?#mB;DHxfeSB&7sG z4R;H$2d;2GsTM7)&o;yYN2RL+gJ3H}K_8frR!cGug9aX13avmSkiWP8pgs zMpTEkAg3eq_I&~S{&(e!`@S!`FJ7%` zz%~BN9!SuFLsQ_A;&U|z6NGHqN_sy8i1*^bYETLr3Jvi-mJ$1Kcz(Q9Hi+!Wo__K^kA2^EwLfm&OS^b7 z_C{|ZBf;}+;HR=^MNYHLf{XjzMxa)>{b>c6Jy-Q|b$NO4PcMq)_r%^?TYS4c+gm*| zRo!|xx&HoXjazoKPoGE05%XR18yJ0lj5}JkJ+knq^mX+b^m+UFJ*`GY*3$4(AglQ8 z#LG-0C4uf)MtD6g z9XD(4^X|I_oqqW`IQs%G25vKhR8w9uI7STs;en7tBb+lPjh05NFj!O5sULWU?EaGe z@6~2TS#SXa*WP~hJL2o`SGxFC+EuNtDuUW63jrl)L12~sTEPWOm8P-o0lo$Z7+Xb9 zgH`*8@W+NXgE-=Yqx+iuNfojgfgqTz7j|TjQv?G>JRUzCK~ag7PACR=!e-hkxXIoc zIU}?dkh$O?T|~^4|C`AJG5|zi$O}&d_8?h9UAI@JKF6!k$bQHqe9{PSqorSTU`Cbzq2r7C#k|LG*iQ9z92^ zWF5$xw(}=ul0q6padYXuibWD*j)3R1AUw4>BMgoQunYx4g-C;${EfOY?6Qr=eLha8 zz*@%O!vhXNJ$5)Q_V-RCgIhRz#z;9%JDA*i$?50$K8=p+0sMZ6B-24&aYImJC2ENb zMRW4U>(|Tge*e+G1RljIr>pDg_U`*P?b6qF`lI*RPX&v!tIdmw{+zphzfC=r`Eym> zZF1-Ck6W+N)2)-QS}d4P?Yvst@?2a@%nOtj8Zw=;i)x9IC)LUi|2kl%LV!@u=~w}C(e{a`Pzt&7#PMg=f;I>S`SAODY)%;1ns2V zj2a2$$cziA2pN(BA|Qx}pGVow3vgf-O82+*Hk)Ixi;W2H)!X=TN{w!VOz+JTpCgsU z;G7Qp4BlAp#p57SrPv{xq>~lY=zGyJU~!F+CWkv5m?Pt8Id7pxkzpjipXEI*0d+gz zB&mm?Q*NI~c=on?&newha58r|EMQV=$2_-^Qez7nC^4QfwgI+#n#!uGs-==VJ=~sA zr^CNIFg+ri@C5Ux3{zZWf#c$;s;co9kklL%00o){#V;E&1}0O}n#IRxnIL>J@c}eI zp~30C;&hR@f1~lC9PhIv^6xn#z_L5!n~*T)=t(tcUE1bDPZAZx(mhb^=(CzQS~i&Z z&%@L1dQlSRIx#{KLk^K75L%k}!0&fs+crIxS|Ugz2{YQnUm3{{V?yqv85LDkdL;o1 zN+*IsflT*q$Z|v|-bsQOWNKcGHk+y-7>7Q5^d~EY$~cO4W~!>Hs#(oOuB*+@FFpJG z*E`!>00mxla14RL8{L>nG}^S1Nww&TGyy+@@)pE0%x_oKw!L6PQm%lnh>C$L$t4hM zIn26S$i|CER09OKK2t)vI-kKlMO93(3RZ?0=_xeK2VzONkcs9u-K|H#>P`zJN6K+3 zLuz2Iv;j-|yyvX@4j0?jToMTcm=~H7>U9RF0FXd$zxsu~=JA!{T$mD(q@ZL8g@`q3 zTBXE6G``#;`-WR4kk=*}ejEb+)W(%|3%4@w4~0k2NC~*eB5a;ja3u}}7!82sEQxFg@IXarE_QEY_tpt}K!M_?yCy&}^!G7y;5A-clwKnTd{dg-MSm z@YIKDr;{YO#Z^^RRaI4gx{fOO6s_2;W3qit&aCa*1*lXzgplkx@&)+*=T6%wa3OvI z6+fO*=So4EZZ9nM?DMy`WdwlARcdjV5yFHSLZnRA!5YyRJ>OrAIXT1_L4>sr4z z3|O4tuOls_!Qu4wv;GW@Hdo#1^8K&wa_X;Ifg5N@20&6Ws~F%Ga7@XBvi;M%K0^n| zg;r0K&8vHuu<*s^`f%~~;~hvMuf%ddWMDFXo0qd&((s!1Cw2dKkF#T!uWeEmnjwp9 zmzN)z;$MnnnI=l*{`a=ia($_mG_#05pjHnI&@yXniEJT(m}Cqk)rp&vx!>}pC#1}K z{4bAp<{D&{8^9b77qNK4IwO5m98;*~DDv zG74;Mbq5UR5M$id=tK@p1Z0{Lz()+y9PtE?a8By}9Nf08&)3}PcX0k0uSL$=y}8{? z`+c|LVYB8kVhn>kLp;voDEBA^cTDh81@w_^9_G>HVb9>rhvUuU90exY_}|kmhdACq z6C{#6G-tu&x`7f(0omQt1cPA>=*;6jAO&(aDgncWNE(acPWY0;Dqr6aoCrKZ#1-u` zoArL6(w@l3|0hpmR2UGRzU{r082KR-Hzh~QEBK*9`Jg#~zO#UP+aj+=N@B3?h-o^Y z;5cv`66z<;KTkdDN7dE&_~v(3I|LZTG8XsN|=q*X;HMcmLq9xEv2-zwJoKzwwBV@7`m2(3R_EQZ7o_B(%M@~n9R)0Yg)Lv zkL7sYWE0S-PNepKb{$dt(tjc@EWQk=xFFKNkXsPOQE7SuXtBT_F@QvtYkRVq6)Xcd zap`hS2h&iXDVl9m2r+<^sx5~OUVQ~VC<4DoI9Ezr=wIMH-(S3VcsvIU^Yh*E`ETW4 zUGrR(>*V;pU7l*2mPV>xC#Y>fu?Vk=ZNEpeO*B}{HE;&Z7giV!3X0lmL7-${&Ktr` zcH2`)v~6Nv$LdFgiocg991{D(@B7oxU%;G?#(Q?9h!C|fv$9Fs7{B615_H15z?!Hk zgb!H#Sf{}Tt;V&zj~CWLhD!afbHX8)rHfu4hmgg+$@7&9-oRLy0hrATcsoFw}0XHe7n0jjtttp9`KAi@Etojd>xSw z1gX*P_Q(2}gekmWrp)4`D#s2Djsf0B5WJP@_lRdPt5`4D2z!ENF0J75@8xRFJ4GFe^~`* zgTu!I+@tTINh9ZEm%4agnmuQK0!F1c-V?$zw10*OT(>;epCij=l$pqAf$OCfd@NA$LmN4(GP#@*w+T5Mqy;mR8 z!$()5e;;lzipnPN#0&K{oC}v$EV***$i6waruSjR;N9CNNeswlJ}Hj_#Jy{?%Eo>@ z%DC-g#o(ja_Z?iVK{?91m_x&=`A!*gtHP%eYR$XN6b5HbxwG6w`oPc#w~0eZ-lIePFUy8Re0eenm2 zV}pN#nq}b`Bl9UC;vVorl90Q|{+T?mc^P#AR!R1eQ2V=Le`O?28{m`m%H-;hiZTF3 z_p_#|{rvsjk5=quuWzTt?W^C$P3p&ij7&3~Nt7S*WmHg2GC$ZwtWZswl1gOLBFFh# z`PhHa;6IWDzv&WkM3||hPcdMHs-ST9s#JYSv*+1$9~t&&t6SOfX zAV9(yBSyB&SSa3oR{Jz1w#~!EEheRz1SoH1G)V!!^wg$mur{5<+Vnrgy`J^o+`fL?|?9=B|y74y9Sm*dL)X~6po2}&-_ ze>7%hob$Yy*H$9W3;t2uwWj*hA>+bvK@cEyh4444+4V6C{s=2h5hPeT}T{_0%1MfbL33M8Wd^ z6|y}^DFf{Me2Q$6fXXP5+&T>q3kiZ`GXX5$4`Xd_`5ilq9+ts-mx4_;TSXc}dG|!uX)>| z>kHYZ)NMh`>v;vtK?I=!Y)6dzM9(Xy~he+k#qL z0OXQgLg(;uRO)`7OSt2GsZ^c~ICeq$xbK{Nk@RhLY3j$>o72ctGvq? zKJI?~qxelncezG{@rBIc8obVCK))IzI=&HGVL6wcrfbx>N{OW$5=t?b&+9<`=851u z9w#P5SPmy;HU-WW`gQDWufzKvk$8API>Uh`Wd#Jo_96koWHM%rf2#~>k*MPSy@|=Y z>RnZ^vd77pWeZ&J%lR`uK`cf`oZBb&I@9WD{+qISKRD9aX$0pu)G<30Ug_raYmK#8 zD;ruk3J^gm2MdII9ZAAQ%Ma|0Ch6MUFpmCTfWM!o2yuVpT;bL3oSQX!2PeF0Y^z`J z^>Arcf8FbfVGVTSSQtatOp^mLkJ*wI@(->!_r9)Oa5TPGYlZ) zb9$JZE#SMQWSEK^4B-45xiK9 z-^7_U3lHA?B{4V@IXXIP>())u^yjd3d|MCwhf+YDVPpveVj39^hB1 zF$)Yc?zo3}l$ybE49qi- z4hh{w5()q0XcV1F;b@%la1kXr;8+$i36U&tD`UiA5ArBG7 zc%Ymo&HlX@5&12-2aJDfO}_T>BlEUn;+8k%dFmLuxbyxLwdnn=-a~jCO&H^vcyFNrAg{iUqi&Xa?7~T>=Jl?uT4gRm}EHv1MQps5KCQ2An;H~Bry5Q66|D> z5J)-LkPMDiqG3GERL2z<3?ynqINg8va@i1JXH_0r_<h1O$259(WkfX&B158~fx=LroZ+Fg6&Fr|F zqD%+xH)r)WksyqOvb9jO_N*s^gItKAD+PrNenTC@!`J=B@&7j^tnJZ9m)aROBuoBI zOO7HD3wqE9Yyv@1A_3i35Jin9KUOUC3GRr!x9h*N~m0H^a;*%>_nNZdoFx6=L ze%IXf_Wp?fO^e|B-)rw|^!wY%>v{2IozA(U26r>IAEk1(h6Z7o7`64Ga?APY*VlE9 zcVlXRKxSDz8xGD})a^L%(}wGd!8n&NIS#P7NX?TWp7jhU5HTs!L2C=dVlf)Jm1YBQ+LzIEHfcbkq z;Y0%7NHdH$KwmvSsNv|r6pV`58@Ej^mQM9D5ZRI)$-^edU!btBOd%1ax+FAmHpTYT zPw6`G2kMjY3=8)f*ua%C2B-DXOb6TpbI?jN4PLT85Oq{_Lv#Gb6UFVT+TGXwOa`=8ix2WN#rYTIp|KMKA+ zI@f!=JUcm_G368_{FCyhZ$BNEIjm9OJV{4faov#P{P1Z{pi#$~=wFA$I7S`4+SYE8ZRi90PaW;Qqv2Dc*4C?AT;`3E%;!FrQ;bmbcv4)F z27hsQmWXznVk?qaH_c}G%}dl{oZz_>Sg0cyzAA9G-V`MCwr`x&>#|s^TNsMqWz7i1 zv5KDSN(B~4*$$USK1IjY$LtSySFLQSYFNg7N) zv+ua;7)<0k0rmkb=@7mbNSe@f5$u3Rwe)S>P+?7SpIfhG&eDCwuO5zeuzzdc@=-6r z=ueS5)dV#oH<&kiUM|^DrRe8Gu?~4{Yf@%YF*0vN(BOh$O*nk_){1*Q@dY=RJfi&F z@b=Q?^h*%ulg8EzwOT>UD|#alQ&SEtoMTm>L?`__gzQL_Jwj5?711YF-)}vZFyBu2PfnOal;8bAc@&Z=d zGoN1<%T7>vc%#A=x{&0Y(LFpP!Qh8mRzshQ)z_nQUk*0D`Ay+FCvvKarBzi_&yH2~ z`nwcBXs9Cmt@2#@EuT`_=m*5FK{P}}2Uid{^a^#7v2H7H@9H(6q|iG`BuDpqVEOC5 z+ghW((KDN4HSlq`&)Ia zjLl=IBa69Ses1$Y>;#Pt_L}e^9w=;x2{#4fkSe?hPi--jA`*bDlAuJvLP-L%0ZD01 zjW9_3_N+`sMk;`wlqN9@eGVfq3`7;FMJO8}D-cCEPkfXZkj-~6hGeuS?lcNd#nRgu z`F_Yqvk&xXBM@<~Jte>Aa*#jlvFmy6Z!Q*73R65eqU5>ZfNIlgLgWO}61(%HUqQ=n>= zD;CBgx5Gpd@lr|1zKU5dZr}|0t zgXm7LN#i7lJ>$Ld2XW%4D5|XZeeK-!nNafb3iStWJt+BRA@uQnC9bL4jx>`a=lAHh_PisTi&dnGK@(1|@ra zJDMF@n(Wi`t4xwd;V%A^wM^S2;K;^ zJ+UQJI-XNRv>Z-phPcxPjM?O1>|-;(7oA@#@irxyVvZ_ihT{`0>eg{rFz)e)DZQNS z7unwreJ*cAu?+g6#1{i_E~Gl)tgr>-7lcZLt$?3)OKBvw03@IUCr7d*6AQ3YOprp1 zk48XHnFqAAY>g$ZpJY*58OolF`B}8veu%oDLn}Cq&WL7G>ubRiDs-c2pA<*RJhD=h zr=q=nA9_tiHbKMO_WmSr`)YiIv#xwxFk6-39$>8jjmUOM~C5!MJmNx7{#hHlPbn< zoaWUTi5nVba-hv;IkV293r*8>O_N&qJEo`x`^a=Cy$R0CB3mHT@LaeOOveh81gOS z!VC;^yGp>4pkqOR%sdNYCHXMpQ-bipqtG4_i3R0_c`2mnRV^<2+6&8h)s`^_}d_de@)_bcxtz!$xG|!+DWa=R zLz0aT_q1tRHgHxL`P^GJDr0qGd+bLPoK+-5Vox3e$ARP`TK~JDXq<6TVdcgw$a<8- zmus48Cd1a5h+8I=GN?ym9dx+!gBgrIta!0Cr#7C^bK3^Iqk)MJZ zC*J;!59`dCnRRi^KAP3X?5H9;B=0A!^rPQcj1+6qFhZ1}~*TDoq>aiyl(I|7FFV&fYcW_WL0A_Nyttv zO~~Sj#UWB8^8f)jiV*MznD97M6+=Nlsko8HEtZY8PI6S~sP&=v|9=#EpmnE7I^oK5 zPds(D`*wRyL!pY2Wk%qY#n3^bC^{xs_SV>oLbGqU2@rqH4Fvi?Wch<@Z5st>C8twi z7KO5iN=cGNh=nL1m9Pk(Zq@16djG=J!>hDp#72T+R*T*(5gE28Bb_dwc8uQlzFg(m z@*Uypo^|Ev-jq*y=Rw9M!ZDo=>6z2P;PGkZ^WbqIEm)LH(o#eN8UeBv0`e5uVPr(j ziJ5bothb!mlpw+`I2nvYimVG4z42G6t0BZgile+!y|umR-jl2t&fMlB7FJ5cWJE?m zL2xBT+TQf;_26}#d|K4EzIU6QD@VP(=|=Z=yyMH;Th1Nih~aJH6j)BL4LLkR^Tvwv z@K#8Y)ySM>rA4tKq^Q_44Ha15Wu~nwZ;!mnDk=&9+OAvTsk_#;-pa20GC`OC8m6cK z00000000000000002ZaF000Dl07zRcfB*mh1b_e%NB{sSy0+V`wz}#G000000000r zi2wiq000009bT8acX&FZ6P3IwLxcSjwG$j0L)+sP>NK9JmXmUWhhS-ZK=!M+9i*$s z#5(u@mCYr)!sTXGT*nC!<9Yl_=-ebfx#La3i7@1Z(4^WVj~YoTVq`F2R}@nKWJm=e z7*{~zh9rt2p(<1m#Ij)#WTArrVQ>OOSx}T@P=R6Sh&BOdq63VZ%puv9%V%V+q~!vY z$Z26Cwy@(kX^Wa&crr*?h;0hQd=El(4CiOD{X&s9}bTcPIVP@VoE8*QUFx*dmf z>^kPWM}|lmr3zXW3?LODL_`>oMJ;JXDYi>i%a+7NIc^lHm{q^~tjg73b0jew6L2AmX>Xfk#1olUu zcAZD8<4y$XH+f$)*pb1qNJ4s+N$i58Wnv0SgNYL)BusD5mzkO6aeGr|MOT?|c}I=v z9zIsBrH+%;5R=xoxyVma9pjG?RXhnQyj25%&q)viLNY|n1qBh+u&|sR(I>Hd1La+j z-9Zli6-7-U%mD*&CM8lCRha|`5egIt31I_eSH>{B2-slZ4hy)r3*M?78_mBfD8++vy5g3Y;mD9is zde(b^q#!w=-kyE-B<{_EH{j8f5j8|W%QK6CRt8n2*>pV@bn@FtU7t_k}MC!4f31q_G$k3cO6bT&|aMZxf{$#baX2 z1r{h9--}YUmNvH8WdvDE21+PPEhJlQDO+o8s#`@$Mumln5{w4gHr2M#xQq)44Ver@ zh8T?=lWRIJN0eBJ$RsQxN5bB9so>`!yGOx3`K2;a%yZe)9lkKZJc%~!fljn!qhK@5 zRZUfL4ripC7AZOIsA2#v$6RQLh;2g+djPq=*IM~Y6;j4WB~ z@Hzci6S+9!MM@7bIVu`df+116Fyd1JLjnN1_imysGANQsR1lyKXHWNc z<5n>*4K*6YDQP7flZ=0hhsQey9;2lZ5IyBx9G#a&ogpxktEn+$$+%gBnG6zgPatj{ z^OC+6F`ibErJoA3n$@c)w4BpKqCJl-u!v%s8nX?}&d?3Vad;gj{}Gx*HZigoWU(X? zO~<-R2e9_Ey~;?&zU5qDV-&R&cCyWhkHxpdonmFJezFN5Cf41&Jr)Zfffr0bQsA7{ z1n}e6^3RT0X95B{WRu_$bc2x&hhwaWVZadW9!C}I4hx~dJ}z~|8iI-{CLE5z=u=}) z17I{JDtZu5dB9NmF!ZdU`CMOl$q&1}GN0gdL#Up5%Iygv}j@J(vDt?Y+ zVmdc-InInEXy~d_pA}M7i4j^O4up~7N=V>__7x~Xf{H?r^rwTOBC1E!E)^CV$;{wS zZaWFpI+CSMnB8hNn(%jZIj0FA?o+N=rso+Lrebxxs}^5Iz4dt;M$%PA#*1PAE%hq- zeRXwLbJqD5-wRzx31nD!2yk{5+hmeeD`l9k4i7Q`!Gpn#nL0y(vI!)UB$S&6B$APf zhiL&^X(kqTptHde7qCcT z@rod|i%bl=FM@;$acD*aB?0&zJ&|OW(l*i)sLzL_*g6BCaaBBsh@C1lBu#8>QK=(Q zYL=$0OJ%ak1}}gKMMJS)0vnsEX_H8J$FMv4B~fUqsnej)d`B=1j!7H`KD-VbLj$5X z1Q%Y@V|2C*Bp6+iIW5~OY0RerCYdFxN!g4taz@BHMK?o|Sv;{h4vQij#Nd&r?T%;R z5F>tK!ZM9?OlgdKIdd^CQwT@{EP-W^D;o1hiJ2LpvU#e7tc6W|x(oQL%!bD(`#$`OBap4{=>!cVo9U)QVRTc!|Z3j|x3nrA4%5$Dk*VUo( zl$fd3ba=jZu#<-*N$B}ML2l@drrXVnArTPlO*y78w9LB`*K!f*LX?4MA`5p8oq!oo z?6I4g^OLlcG14GG2t-ICK?0H;WGRA#I1_alW z|3=90UwB?z|!B-=zg#OqjlIROxdZQ@K{9tCBrY zw-RVhNzpq;VK~T6kcL!RLyID0I*TWcNdlENsjq!rmz_HJP$NgjZvLN}LvnHkHxiN5 zyJKyQwl>(>l4RRsYtB=grcJH8GPOou^+O zrQ^PD9E)$`rX6X@{OoDA_Re&}+gwcDUzAT8;MXay0!y={4Nk-f$@Bf!g*TbY&Z<_N~5r~t;MKu8d4 zS}7_vhzkLGYU+FGa`+VfGyRO^Lmg_@G0CZHo2MjApZ+pnj5*5wO? zv~3t6F_cIWW3y~y8PvFQNf$@31oR#xpBPwVsMw7>4iy+~R+m~;^_ug_R_roZaJp4d zq@j>8Fks41VnG>kjQ|Egh-mGP8OWMAE#OZq+i5%&rB-GrVrR4%2K5IvfYly~FkOv~ z^Q{!I0FkZt__3TgUJTI_05msZaCqG5-@R=MJP)b`h3m&86@jGWp3>yP9PR57jNbr;6mdWSAKC{VkSnZr6k^vHgLZbyj z0StzX5fP^bR54|3!4%2=3nsWSLwHm-&yieFws1aWNfLeiy>RY^9j1*u;KYLwB95zE z@eFS#t(_+8T%GMkrA4bQ+;lmgkxlp5t=e@lH6P1g@zOWq+N6SwCNmxhV1KQg&ynq_ zt5M0s$#OFl)sAY?N3y5wH*dMk$gJRFGRYRUY{|UUmTc3LSkh9sG79~O(+)3*gA6@% zjL~@^h5%ALPafnqH~Q`2fVq>T30GXoFoH*dlaJ!D_mmBnKB5xc=u?>y?ij4ZrI0*+ zY}vTB=%jcsG$fsbn?Riero_Cl!8DL$2GSw4Iv{CPH3?}G6%DS+lXY)l#r+I^va!|v^{N3X>6y)x305Iz(j2LfR) zy&pjS7)}%>L2}UK^mpvkpJ}+Ra{K(3BuDd}lY~e3-r;~Pvc0a&|JJ`3<>{6QAfn8> ztvq){dhfCwS-g3}2I0Q*KbKCo8*#|)Hgu9Wl#(nTZd$eVj}V8S@MiXH`lz+$DU0{{ zZfDJB+n-)pzklA(zuUbF-GD{Iwfomi?TPn48&P{WyuY>nsyB4^V>6ra5IfwWYsg$j zC`b?oA|aF!y3Za#2cTT)2#}x5Jn=Ao;PY0}Cn7dj*9SkOa6JzpM3Dp~2UseGGL_X8 zRrrjeR31*%1Pr`CxhM?9iNT3@vda&=rW;G7+~w@L`McMx)~`=A!3HTX1_(lmNP@R_ zQth`hCgob0P}yLbl1Wf3Aw-Rhva7sJOn0^2B*L3EF=mL6qLt8&Y1i|b!yF{(`g#O@ zb07N2O(9wa^SOYh;OGTG>QnsFHKPu8AFdP9niFj&i*6^`&Hg`Aug*pAyKl}5TKh?G`w%Hn%D^j&++5|!% zStM&4f7Y1QPFromRUeT_5@Q=AX4r9I5@Q+GMs18C5@Q=AX4%$8ZL&sfvPNyPMs18C z5@Q=ARU|$Cr(ZVIPl=`ED3pnn1inu{tNvK zG;7BG&Z|yw!0G)#+z-n!LhJxY#SQ}#>U3R#?x)4+fBA6 zF^w}Fmrb^tY)oSq#xb_o#xb_o#xb_rZMNHOw%Eoovh2HUw%EooiLpSmve{*_+F5C3 zl)lJsqU1KY4Ai)}Hn}#Z1mKY2!sIr&Hn}#rHmAS8i;tf9+>Z8l7a5=w=OAu9(;+F9oe3OuBP zB#aa#Bx<&w0fSW$>@Qq^JdY3;UQ zT5Yom(`__lmNJt~G+ZS^kcQwU_q9}@2m%m>AuARrRw~>==*Z2@0uUP2ARVrfVjU5|TdU{eLfxu0~-`t4w1TT1=rTHIWjL6l6;Tvlk)y56BO<>pqP5q!at3NF6DNh8TGNy*6|wql9c z(Lq&3Bf5V{;}!Y$*aOuM&};1;UpX5780tID_ZLcJWrTRy(w)(c(Se39*=?|X%d=-D z0pJiW1dxP1d;kng1^&OpcwHof4N+g?h-2D$9(;#T;;c%bb0Xqlm93?!eVxoL=M2q4gMP_sX@ z>*^vqx{kt=x)M${6=aJ-7-WH%5Wl(f^nYW6-Dr`DE!VF1CR)aHxJ;(l4=Sf11w* zgP`W}zrsL_aO3sHb_}8jM=E3ZASM{MKt~h@IyD(3G6!HVN&^A`$e>_62jWmsWY5Xd zgSb^6l@uSBwb$z;PB*ek=_6w^L`_08AA1bf+B7->mSQ3*cZ`;+Vo|`%0l}nf`~3!J zszJ|iIQn+9k(rbGzP)kU7RduFiSa06lKiLJlH)?64rLZ7Wk8^@7DAdTgqlbPOr378 zkytAxQc7=UCd4f&G_WhqkR>E&ZKV#@PMQo2lVqn&OHvVsIf;{4QanJLBrItn%RpJ3 z3qW0)!4}o*FyB$>4l#n$H&{t6&`4bfS81^Us9b=kjifY9l)FBy96tY!(yK$<4FpMKPh+s;Z?`0NBl-2FPY+{TS)6tjLwUaE|!ea#2;a zrx3%Av>T-fw!4nch4u{~tMy1OAM>&yDFwp}L;7XODMSbG5CWQoLEaJ60KE!GigWD_ zv-Rz>@GnNfC7y{PKR|TfrC0W^w!}!lHWcCr)4TiQ!gX1JLafWk8bQ_?3iSADD2#6uNN7t;{?GgGbZ8$;b z(i=2}&Tk@4ovE}D-uCyM9F9XFz>*>MueVU@dBUdYDr!#nU7-Vb6KFu-Kx!QkNodNR zTQzpDF-e6XwUE>-ABK#sMj0j<7cw}>G#*Y1Xx7JQ={L}`_|i%#R;lqmKZy6wq~c1G z2#tXS!52RZ(Wn^gKva@mvS4@?#}-t*Dn~)Yd7je`S=F*Q1n^<@JSVU~6=6KC4_MP? z(Z$yDQaF-7ADQ7Fm$tY!fkQIVAZc|Lmk@3Fz|IU7E{mmzJGh*(Vy%JoLe@EfTc ztIYIX!GEvXF2nC0lkFlQBSMCRz24$N)U41*G<;Jilp(ZWkff;$i*vXJazYVZ@Nfnn zzA?+hbm-9z@P`spGosRn(5G_utc(Wuk~pM^+>hbiaSlifNf-e6Yf6(71|zQPst%(B zZbZmpn;L{Bk6N0)GZ>La@!Mf+WVNtH3=8l(;wW(+qBCUy`~hlYD7UQrRV*yk8)+z` zMui%8S<{}q2eEBe*D01xW-5tQ4yQJ+)k@8h=R&3-V8!c8J6w58`?ah`W>oZ7mLs{{ z?ayAkeD?Ldj<|?K*)ht=iGb43Xrn_FC9f*_Uqm@pPe{z>Vdc~jcXH0tXIZ{n041=n z1Wimf#Js$|kAO+uQXw?hAVT)}-9=zn5@Jel#Fb!ay{}_Cz{Va!( zlckiTW?c-6fkY@`OiIk;u1gZ)5@uj3{GFA_gz)!Uc#o@Yj|;UCAWYl`5LH#gHl@N|1byg{09_=4{C%NKF;GV8+FSgsdvDifLh_ z{ObJix|ujtQ%Oe3`NItJ)VKEe)1XNzc146NLcIn&EZmf5DS7KmCq;x$>j~tD5@913 zE0t9#ZC@S+D%-lT(z6*M`N0ucUPglg2qXJv>SSt~JB zmPn$cBN)aP1fw$hNaNg+pKJ~OF z-;PxG4~R^37Zl{!9JuID`oaIUPMACQTI`>OwV$}S`?TDfv11!D7^?i*6J*m8I**z5 z{2li~!NY6$ij2#CJ z5l<;aeCFY%JP4bSinvtH2J8>=6O}@WEDFWY6s|RBAb}0$2x*1QAPlu-rNt&56d;z8 zQ*0odC1!=2Ng*?Nnkb1{c7Z9@5<3(mk<*-vhNzy^gz9RoT1~r}*5gHO7MW^|7BvB_ z2?14`GF^MEdd=g9U?SDHV7jTYfoo!1UbrnnB!R?Pk^5ko3Wz4;T^6}`qU!Sk{T8(n zV#N_>rN-_;RwQ?aW=rThtPS2{0ewUFm(k#am*;%zL5%CUyOrSf%IO4%!{yI%S@lW0R88{!e{(i@s+pwG?4=jGE%?1fS&A8|^G|9AvwsAvb z(*SIN59XZ{A}gXnB3wdtSy6@|kx$XlySL>?OR07R?(g=vp5S|RD-=ho461@7*y`s0 z6*Jt=hvCN1_U!eJpXI~icX@`PeE-?0IRN}9bs?Y=6Y^?$^k%;l{!$XZF{Mn|;Dyvn zQzT6_afoi@q===E05XyJ`gp%pZ?zN-=*AsQ;r4N z;DE^Ka2~4?7orq>@$wu^aGIqL@(Z#Ln`~Xngt@~W5e1`0Y#0x|K~qU&8D83RPYtw> zP2pShLP2(tLTvQjE{4C~ycGs`xE4x`kZi*aNvTOCkAJpG&@}M>T{6uAn3fYTk>g|D z_jvj{^?ubDPaFR~-+yPii*=nJqmo)$3=UzO&Ka~kPETVyhAw)0BHHj-p$#27EywrW zkj?$4sxKdd1)$cQ9(RZ|e{U1~{n1^!=!-5%GHZIjEBv3^_S1UZ?kiv0jvOWIAaibI z^of8FNC7~S%*2o?o@pvSTl3GbvF>U}1BmBt|DI|FvkC1rkJR>x`lsj_LhDf?fw z$XDo8$sk0`!!RaD?e1O>dQM#m)B~o0`febtfnK&g(E0r4=#S%-G!m#%A`;8!?qUH) zra(2+Vd~#*)!9_|k^xUo|JNtUO3dn=tsFz(_$SUr-O_8l!thmr9-P( zKSv|-XwRn&-quWy=lic0o@Vqi=r=wlMmA5qCpRLd|kG=O+5BF^8cECVpYd z0iu;);@d-nI@s?dl7FR^TSzSkhvNKykF(zXW0TPA^eZyb7MA78GMtAXVg?BuEU=WJ zag!jz0;3#iOsa9fB*{tyG8D4Jj8)5n8FTbzNg!CT4yYbHkdwgJjFjU0RrvOYG_q6o z(s^g@iu*gZBuVvIAa%phzNS=Y%si}{ZW7Ref&Eo`(y0=W9Z}p`8X{Yt5<~tvw zv>m@^2#;oAh5yBlM<`Dl`fj7j-OfNg-)r^zn_D+3M2Tbk{wzb)KhtORHWzh-K0tuV z6mAmm%pb}UaH!hP2em$ji`wzHpwM=^tO-05_Su4#MBS7Zpdc0*A!l>N_8#c{3-Opk zALP1BH^58?Pal!d)bqY1=@196{i`?m-q`on5^Xso1&a|uxnJGk{eR2&cSH~2-{n6K z+VCIOmJY`5AheSSN&luVt4c?%hCfgKiha5PplVM^B8nxK<{SWM5NszH|xWR|} zDj3ga`|nMSDr^R`O`vH*^wgVn62bPYI;kSfgrm|t7V2RM%#bVM4NScs(=Q}wNM6bZ zBAgFDHxAcP*!UuUV6xp@vKn|~&0syHkvIJ)rLDI8zrA?Q7xppx9QU1QuqA#He~B`1 zBu8?3NHFALZzGbKP!6`kcz6~uLRBXF<2mAVk}1;2YixqT%pc6fk)|-S6-A^qAf{C# zg7!2>g2p1olx9*z3=9lV5<(U%FRp1y|DyrRW=YRmoC9UEnyT<%#jPI<>Tt6za_9uE z5-gE$A)!J#Ms$r{q7-8gDs8R80^?Xj9xg>|80K=a*{%aHwM;jX7q2OX2fX2C2jTd` z1K`IQB66c346!Ev*il6mH7-U=ssvnS3t($QL5d`>ff0fdO`rlNo?B9jJ_!^7TEVe# z+X1iW$1Yhj13#{`2UUD#FrK0^dQxyYZA`X$lKup2_?A-Le(%$cT{dWHy5W;-1 z%EtE_{wzfsm^0c8xA_ut5d5O}$G^)WN6TQ>&Rqu#8PIGAJJeK1_z%(UcppjL!{DT| z?^V@lOH_qL9*zM@n$w4Suw$5D1uL|O1QLcq#JOVEYF`A9H^N z%XQxeGaL|ultkWa-`pB7r8RJp<7}~eP1=b1kDufJS^l4JzuC8{mDwcxT;I!k_WR`C z$se-*oZH-ukDf5Ei|6n>{d4}FUTR(M&o_1RXyE(59*R$!Ht9p<+}fk%!p9h(%A*XT zmlbj*;^wTD#MLOvX)!8Q5wa{2|7U^tAZ{t!3MES{jH1IpoCZ|rH*p6QAGjlkVG@SO z(hNm6dh~{Y!V?6Hf~r+4g2;hlCh(#}ff9)EFu;KrP*WvP3P5F62uOigWkx}9gId-0gu}>F^u4)}s#q?`3NW=yTWWq=K zmtGuJHU4oXQJF+ou?|z1Le78NKcMN;sGY~5tTL#Mw1ov16(X3XB&3lApsJElcs=h? zm!sKxCjW1c+>)aPOA+wITWESw3AAG4z0pw#*Zl5Qy2RnIWDLf<=NNO`DUK5G<>5tZ z!*gSXno43(g-4ziN4ea>e*;E0O6=qRgx5!I-}(NdbCl7y_8eV}rrK`8%UOas7)(Bn3ybl zR!<|@?3Q}}vrkC2q44d#svNS_CF9wE&2Do+OiqC(8oS!I;FErGI z(@Oul9?vO0(jRc95iltj13q7yUNCQ0uDS4ZXSERH7@uf}lkop(f5ZFVbSLnW^LgdB z642IJZ3u%VFu*1UAQL1Cb1_O>$c#eC!NwRfJwL1ddv_lA6tN^viDUhNKKv6l33Cnz z@t2E8Rh5j2^2{J%M3p8=Zb0V@&J2aIWW5FeI=L0eDyA&k^0o~&l5L7L8gS`9 zbKph89uiM$>&ZABCt4WbjzyBFQdmvrKCUISFUrqtI3}Ezl-gE#50D}t#tKX^GDvff zlYs;@TAOvAM`2B&E=1a_c9f{yPyZcoESs!jh z`+nxZRaSxg3d;9%V)q(FI-nNN&}*-hhQvn~feiS;qb(LJ#zx}gDge7k3h$nW(as4Z z(?Bh(wy**~0ze>%05bq200{{I00000kN^M)DL|54^5K91AOrvefJvsAfB_+x000hi z%;oZ2o0rNv9kLQEwNuG80u4I*hbi^R?LJ0=B!EdEV&E6b`p6{T&RIwwUhKomf?&aW zcG{^nUeP@z?vguf*+*$2S!H2Vct`HuJ^3N*eBfY3615=A4I+de zP$(aQEhA?BCycq0aIguj1+Fm(8sc-?IMv+^HIdBw&6|Yl$e)e&7~ao3>o0CHRYqMT z_uSbYn;pu7w36ass~ij>S_$32@i3dQZmI1t=Re3ai_9Kr9>*R)c&rM?H)_<=jUv7S zqX$OX#M0=*zR~rYDjNinpX2A%hf4OY_+>C))$(IJUq6;!ecT8fC=v751Q$bY5! zdtoPMfmur%=C#dBAsEO>WB@RS>{ibTkx3bDte#ZlPaDWr_&k)l>}4_G=6vE0p_i zS4d)?8YmLzBB)6UI2{~|3FvFWVt8=G$T6BS2TB}X5C<49 z8jHuz^H&yX9uRV+^G{E90Dd;`j0@KtFoOv2G-!Rtw*VcML{3U03k)i}NSLWeO)3`0 z2ASv-(KyUlsY;UzB`FrNI1CFkSxkj964ezbvQ?7{1t|%W3S_EB8Iwk#OAJ_(ib?k| z-CI=HPHc(7oykqrH;GY_pJh!F?^7O@?S|7DWYgprdyO0##OH|{Dt%R!CtVKuA?2^b zToyL6c}2^;GNk5Id7?YiikVS@jEbq{Oj8|?L5(_sW(&;z1a>rvo?tRCQB%8)AorlK zb=c=0XWD8>chhZ8zWpSt=y2xyq{hkj1|1+iV3pqa%el_1_YHJ0Nh5?X{vhi;5 zv`7vDI2zt$kNFSvG82M_7s+s)yxkh%ce7;7F5H;=lf3093RQd);~A~DqmS)>P( z={~7J`z0AoxE_>KsR49yfC+1|R4}ywjOJ~3P525ho``Z*#ztD0p2)-A`3*jDNJvjN z;>V#AzpuM~T+ffrKf&}LPLm|oStJ;Mj4LsV8L@;CR2f>ap;J{U*Kq@_AgcnCX4!4E zBvNdavuk%U^p@}ZrI?n25Q0|(+TmhF5vV^_Hm!%POBSmtmn}|s)sc~6j2KJ`zfx+K zoG3aUU^HamQW)N%V!vx7j8Ou~6*`@h1NL=zIr_~iZbjqjG3G3Z^dKwIM{7iDb6R3L=!11}YnOiWx)yZMlc|d*}V{ z`^IG7co_Jqa?lN=f3e*@p5s!`@8JCEr7aK;L~8xUNozx!6Ht=K(#SH$wWf_kab%vR zP`E7_CQn8zk|`n|SbG*>=L9-N(X*Qzm8CSywF<=DT7Z-?2L)WvRDu;mG3rpDRFxvw z$sx-UlbC}+njXwD4@_ugD~6BHt<#qOv(b$O$Mg0)8(lfB zvBMLLloU?)L5^w&hr(A%WNdVzVe}s?L*QU>ipI&=zg-Vz9U#sivPz9Moli-|b&FU+ zvQBuK(VzIJV#tj#nG|xKh|N)S1+lgZ(qJg#UBS~A9+#4=7orGN6C{vHMG|pRY=fo( zc)@&>mv|K9jK$FRHYYi4NKy6+3B!jC`phv_WvO9sO;~7zqRP;&y2Qq)Vy70(H;T&}IJfgd*;Br+ z6Eo203M`dI1BLKF!y&_@gyfZA%|wZ95L3e5l(4BNltxl451=XEM|UShA|PAmV~sM23i4CI0XR+FhTeOlZ@JXV_vbFTlsp`i`BZ=!0&=l6$EJD z2WJ!716n7Ply$LJBMH-4wLCeF&O^dNW9nqwJfr6|<}{3mfz+r*S%9(K_$ibs8e=ka z(j1g#42L{pV`mVPLin(@TO#sp=4@FwX(&Dp5@PWz2_Pgjpzaz0WaHWVSGANNq+oQ0 zI%Ve`Aa^4rh=|OLCOdl zATTOcC0OF=;EAAjfa0?cEXtCR4XR&buTGQ?`5FzDtsqcRG1k&JnX(~;fXXHWmJkTf zKk*V%5mt0ZXb0MGH}6BjFW%?v{X72ryBu|PH{P;uEQ9p+9nGDu3Mp!Vwksj%T>&yG&pI7Dh@ZzVF z$~fY8J|F4+c>LeiOnr8F=B_N(^YI1T4i;|b$& zjuAa3WSI~I9>7AWia6lyfI4(b3POs-62D2Hz$Qe9N;Q!1+a(&+vKnyj<&@GpVscK)&xZoDj!GD!a14-oc%QCGp|-BeFs zM9EUj!1*S4N%1|fqIqOdOqb@TZ!6%B(e5RZPdI+A3a(GhxyP$vx_Ioi%PmJ=`x!Ye ztJ?Sb8Wkvhd>)wkJ^~>7pdZOQEBFAb3~?nOqB?v!$k@zHz1hhtGU@Utc5H|0o*b2M zag{gyDZ+{gBL+Yt?bQ z0SwEB5&_S0r;*sbA@`m^1j~KJS7H*b0^(#5VjD%mF2J}lsg|TmEL4(_>0x52LPD|B zH~&2iEO$Nd#gerP83#=*tzm47E2iv682I~^yxK_^PnAiDJ{)}etS~>}y}mMyN0{n= z);2Aql(AyG#y+M$tp9^(-6W-oq5iiEEk(1t=;}`(-pk)#^|?ozW;44crBa-fg9w3E zPgC>p&~c9Q_8u%X>_n;|;W+5?gfC<}oLP-M^pPjOYVp+NUhD6Sdz_*(y#IU;T85PZ zmG;-)?LI*d9123E6HGz`AV7=ZSI6>v_qtxltdcM+hly(;dgZzqPx5^&XuX0sbP5R- zu?WvS4vI094McTGFUp$t{6q2__H%Or3}OM`KiF~Q-Sv`v^&2v!3%#I#m~Gf-i3cNv zu*+K-CZv)$He_zy&}u}{K5df9lEo~Na1iOv9ZulWQ6xAp$sR~VJf=rE%<>K|_G9o= zp63Y?2&Bk?g>foThI>nP#(|^Nh@PAHH|VZ9vBdINoo<&^tH`R`Ywe}>+R|pxuF+Pl zkHF{oyZiMIKx!l{mcyXX$aH)$o)cwN!^kivfL+78!uYcj(zv7B*Nw*>5qdDe>4;$4 zG~tFhEGj%u5*8d4g=BSDE= z9__Iiox^cFoo$ z_XjLbM%!)jeC>j&s%B=Vqt};K?Q2_15;r^~mSjVuPPjVj{A_{L)F-u4dFXLcCh71h zeFIqwTlUyW^2#KJ0P{0B2aLJJ21Z1AQd#SbhnD!hIxrk9@@c6shS*ej>^0eYw-&`W;h$ncXEr3`Z?XVqFCz z=1Iu%rs=5T6jb7u-`ftq@;pz#?LDc$o5$aVRCMsN06#w za&So#C6=X9ZNGT^2H&K=tf}k(WUF9xuuaZ3P-2ZTywPM&UiI$?<%5$rb4lWa zjLj7x{*&Dum!eTl086I$;7=`wD;<}xGYp9^+Nb=a#CbPH(r*n|k)W|qDq5wfn3EdY zJ|2vMtaOnd0?9fwbskT#$7?(nJ}Tbo8J;IOf=EBV1Xd2-K(Q;t=eTs%M0NJTFsSr#JN2bLfXVpf^sWo!Y0g}ED z%y=qpf5#2BDLHyf;kt%0fV;@`Kp^1CBnj0DY(9UV*~Bv~^x$yrp2PNc#GNeVC=`-% zKO^-DaZ;EVA_U=(kn@WEAwzZ}VTG%HC!26`mWOL&0nQ5#=_Te%+yH3WK6!{0nIu98iXh?Js4Ibl)J$?V>^#8BN@xoi;cl+k1(5o?G z*TN91^51%L1891u{#O&`&&9_&IC=CVkeu#U1*DvABaR~}Els}!_Pg=Vy>DdVafIfR zXjbb4)wgS6_pzmn(fKS9f$KTUA|F1IN``<^jHYA}JQglZc7imWc zF=Z5Bp+@~k$(USNAm}tg>9K97p0ODs&UJk#G~$)ii%yM2k^rR4)dS>2CS0^636tA> zw&`mBc5)hnT(S^mGEH>W9A?h(3gZWUAsPczmjuZ?uuH7UB{Q0xXk{A2;mJ9)Rr9uR zg+Nrzj%@-^jWlJCKow|&2i-y`Gju)@X_r8q!c36$@XEVdmkq{XcR`!owBea9#DH)} z*qD@Hg(hXPPJ+n}GZP6hWZPP41jQH{vSd22taNFGNlmPZOo)=0#vzPkrE>;@3Rs*M zGPEqBVI*cr2hIqh8UP`H!&QaLLM~9?lb+g{y59%(N`aTqxxS!I$Akt}(2~{@u0iY9X&bnxL=kB>=>s`g zVzi>hXk3|r#;AjWexrB;YO#u8nVu4VsH3arp_}CK8KH&JZq0+bMk3cPESYB&iQKTp zxS^;iVvd9oBMiFlgd!c{!1V@7oad$_Wd@Fz^feM`ggiPWH`6+MI2k4+>4L@?0PGUv ze27FY=!L1bqD_pPXor&=mo7QKXO?l@4dxgcoZI(AgLa)$r6Ukc147Fdz_x=>4rPkv z+VeYxwlY=I8YT-)gP=(~MU1AhP0Q6V+ZRQlDeXa=ZHM({)0{J;t9mR*Pa-&4$n$6p zM)ReK=v>f~p4F8#v=(BluzMFNGnDii;yI;^Yq3SiHc1`5VBIT|I} z;i0?{%+R46&0WnJPS;)=yUyIyY`HAxR#G{_$%-7p1=Ja>C}`&w=SzL~jS6vr3=oFe z-EU`+^ek|Oos0pYy%@KVkR=$RVGt-IoSO{SCdKVm1U8a&5bZ>gn_Y-Ii7sIPgH1z+ zWOgYQ$Xp$f$n6j&iIb5N*nH_|mD#EqW_e~b*&JpJfh{$d8`Q@8q|GzHVA=zqa>}zy zrg>vxb-1fHlF~;jV$+$eG%yv+lY@*Jp@tJsC`*>x=Uh@F90O}ANgLR;WOGDZn;TP! zRTh=K)U*j|+k zUscM|MFz}lPeR%kb_v`eF_2qD7)>pt%=a$WP~5gTV;L@Ejs{3%YeUqu65}BqNgySl z8iE&egq>GvE3g)WYaH1HU9)h?e2r8&T5@c4o7g%A)RglJ>1l$*kXdAVA%^6^RW>Ap zrI1D7qm>-1ZMPQX0U~E9FI-JklVFJ}sQAwS-zylwe*EH5gFsV04_NTUernGP*Xd$P(;4 z4Crz+)2l7B4VDL$bSxK3tXUm%frp6Ijvj1=!_4o4k%OV#1r3xzysU<#DjL+_h0)VU zyvhR!9UB-7V!^m>8;46+!bvdfLmVY`C2sBv+&D~AJovCg8<1g&JCcQhORo{Lq;-(c z!~<6?ng}YgQH07cw>6FvA>oGQ$Q}YUM;seN<<9rtjtYY&bjH+2Q0LZmdR+k8V8cp^ zZ%%3rmB(gaY6D{~0@r~Ofy!(p@;On0h_)EXsuKpGjgbvAIKH^Su+fxU<+TSZmz8j8 zhJ!i~C^0WWl&Xui(=2&~l@dV$%h13^ETLH4T;y#s@GF`Dep|rSqp$(g*f%7jCWOew zPNqwoiyg2cGR!B9ptEdfC25$OR~(tPri5xMysLI3)M}1#16hO`5v(T2TRdB4U=4;9 zCM;lB@B(wf83x9s8}{j`xE8!$s@z<>GuGPYr!1Q~H48F15ko32?Q#@y3$RCnHs{c| zwqdJM*5@WmHYshqRTd`Uvz(QF|C9QC=uW)Q=>){NEJW@VKEBJF=FdzcZkvr>c#bA1d~>z zI2m1u3l%`iaII=Ha^>x1sP`UdFs?5Nj%hVgC>a5nTxu@z@K%f<#mT2h^qt)ASU0{4 zjC9r(#<;&tBSS3Z)ZDZhmn(BNgFEJn&kHqdKy#|1!ilu@Gd=4^M*}pxc*w^nW3IVU zq=unosNiOGfg7^BqVpDTJc!pe0s<9Ypo{Nm;Nfz^DK3Tj%Gp?oIXaH*>bH!98Mg_H zG=adz#y(M_Tk>3qEtrmGN51POk}%RbnB~n@tY(~nB{zyBCYbu;TWT{!w<+YwN;5p< zBYo(k6>&g|3sQ#7{PQ(cuv%Hm$wloC37d1+(>YrPO-1Qk#nl>uXMw3!7|hW{B{q^RRQ#O1tZRzV-q7=EDj2(q ziUNm|LrKYgF|N3WWa=VBiVQu7!1#TyW4b>&7?pX_QkG$vX9E?$sMZpuv<@@>j%#Sv)nE3+J_?JR8eLXX zE>v(dUzp7fb`2{0+VqSMGM0nQXi27anNeh{5v-CkXtpmzlLgwjjyBTc&EF8AyTOAx zpkkE_z(VqulEiYdENdfGrHFFzF**(@l5b9tfZ+?QE@xSr5JS*Jq~iyOk+8zU1g>%<{1;*jX$~DB{}cYbJ57h021&!ZXIq zmgtM+Z95A4Jxw6Qa;|!2-A-`y=HW9a-qy6)Z_<}0kw!{`kma29Tws!}X9NtxE7uh% zj4L`w6}f{+zPjfx(GoSYEwd4aJI1FB*2Ng-eD9nYE-gT@Qt^q5XlYWk#f@<}V=tf+ zsuBwW5rGNeJ?0H2~EiR}v(`dCw5hiCSe?W(P!! zv2>e1>-OBYy^01NTLMsN|17#a(uc_YD$MAy;#Ft7XEKh$!26IRf&>gR;4xm0e|8{_ zTViUuD4Y}|N#31Y8dE|!L{ram-$vz_ap}J+y9Ehq8u)Ag3uUE)H?zbLP4dd~tUQIo zk+n_8Rvebxiqh-BG||3urbmW%ocm4Zs{kHCYj3Ks$EN2^o^K`Q8rr^HGJ}CSfujM` zgM!OjNgeGS)w*@1lRNQ|!A?yusPAc{!%>ixts+U|tVM2ELt)g!7Yh&sg_GIf=;U*z zVj-t_AW>BHJ;{F+YRw{yzLB@k`HY=Y{UJs_?bhm#`dc`wyf5)CI=|AtzRR{R_i=QR7>HIWdikv^kCBXH6Tl!<%dM`|yAR8iN43ITI8lrgHF5Z6Q`QqjInta;p z-O*07c*`kLtWu)h0>hNBMAsfW?2U^BC}FK>w#}1tPO@%rB%NWxe9j1D8z&AE64Eqi zF_~JTj8H{^rK)O$NWqRF2x$oINin5?~*9N0oNfxOS#G9JWdF!JC864L$*o5&87<^9ArvyAxUJh8!SyKmJqJA-N7)1 zyclpv>;_b+p-7-yvHSi|FHh+O2H>AJk(s1G5H&U=awK1(Xc|Ra-UuaLP>LO2gxC!x zDF#UBbl~x3m)elR5$E%*#XDt26_=rt$aD{YPeiJY+jg1#ya%Mwv>`(>f;cj!VghQa z$qykuUZKK7>UQn*a?c;Zc_Sba%iRDfqCl$PvLK6+l+uB*rTST(TW{p%JbEPmnVuvPN$+F}?XC?^>L_$GZ3svFP;P)f*lcPhGRqQI66qF}u4(yO@csa8N44O z2!3E7PW&G4F_63SW6mbDCW{{ryhWAETthxY64&HT&d~*bCB2lwR zYBVHHa8+v~EZxhCfxGC;97?u@_ ztfv|0-Wljv*kRo`7UW#A&V|~hX33q6ph)K(6qd+o*O?V%tTdiVfng0)bR9g6xh(9Q z$tt30QHmUElB2%JH)4^pNFcf_NRfdz4`U_f!GSqt;TYJ$!$^mVm%CTrA>BpwvZ}6- z$oXtna-e{FLKxE&C{UTO&_oKk(M6th-lZI;zT^y#LiJ5ODe z7Ea(Xh*m(Nlou|*6!Q=yNvz(eiK$-t2{2D_)wmSPYnoie$k;a zDF~7sLy_UmtBr@|oEOL{227I_&Sqd4fjKbQf{u6t?|Lu}aylSl28Sh3WtcZ4#)R(7 zQSCUdb<-o}2Pp9kG-S4!ILYSX{TT|mVwJ`{zW%jMFR+Nd9>hmbtV$h(t~mnaNIyM^ z^=Sv8=YF;~Y@LUpOKpo~MV%)o1qhH3Hc?dZ0Z1^yNe=kW96Pp+PyFzQ&7^n2k19_& zBEHJ5#s^h^oPezcV_VZ9WdR_7^xYNe5MJ|kd+Rl)yiYvn%E$`RHo%w7jEYNWHX9=W zNL6>%tA6+>|CNguM_q-~Wg!VKaJx}S zF*H>uXb)Ju{JKpCB=*R|zw=@EaK$z*#YPNoWtIB8=|$aleodvyY)H_C(ov7@F#{f; z{9j&(|7lPwff{6)$SEj zg3J-}LGbo#eUU)%$Z%97_0WzKL}h|T_iL)l;Zz||Pw^NmNSZ=I3NLx2Kb;mtlrf$m zP7L-jbQKD~IF9ZLdsBh>PrQl4okN{0loE~y(-NGR68Qwi9xz4-!+?>Aj@iIMULMKe z$(4f<2{Eta$_bquHzx{7cuFCE8#KFGp+Cckp*i&PIYQ8ora{BxuubGg{J+D-e7UPd zSE+yDDwu!7kB8b1P+u?2zdjqBER3=xLjKq0@!@!sYBV|xN)Psqqj>SXJk(L&sWPCFF<8mK!PHu4*wj1@zl!sBX2Jcylx=|hA z#9%Q0Y+sbqYz9h+qtbfZqDZIS_I+I-ZVvcReZ*JH5|L0v={=L#IBg^exhGN`=kR19 zg$&#ynrFOe>BM4+P>Pyq15d!duhk-Q1$h1cHvdYBASDv@>5$CEKxNJgQzOFJ(gZ#U zOoCEN8Xb}G)(aLE^Q7WPS5J^wmC+PYMFU1UYI1wV8y>w`Ga2(JU}FY($w+yU1^8qL z7|k(>i;-a30`0Xyk}QgdNr5d1w37eSY6bGcd!N4rT%-2xmaTbt3@xtU#%wryz@;ii zDNLpwI4c3EJ>rrS%m-s1#UZ2w30!JoM<51OJ)sYpDdLhN=M%zyE+%ta zh)!~>HRF}Wu#bb8gR>WZZgXNimpyYfEQ@D@1N^1bl_^t!m}S~xH)>7yaCJ9uaOk9A zVbRA9a@P%*;7=>+j5NGDaKvJxNe?8$W@17DPn3!%jPP87!9Z-lVv|l1AxxSk9wi%^s#e>)Ege zW5!~m99&#H(^5Kwbc4+y!94JXI|5a!BQht6dc+iuLF(mTVTuUy4V(b_U$wwEZCGZS z(n%raZLOJ@u^$}M-UP0glmN9{ZNo|-9SMf}&XTCE>(i0A6J!jTnW&5uQ9^~Tu@ZO>D5vHeQiCV~KboVG_NS{fD}>zTa3Q&ipxV13&DV99reG&ZIrc7Puzfr*IXd?Soaz8?cHo0~f?^fsCB^&pkmqPRJ>)q@E(fJi zbl_?C5{So3LfXiQTTdlQF3M9EqhQX~E<6zlFdK6as2n*Gjx>QB%os0g%fEKKI}gF{r}7B zWlyJLeQj-!6fv+EJ8pix*Kf>YgGkU}Bb*0>=t>3y2&9HJI2>$h%#mNEuhX32&fTOn zV~TQAGc1;iX=u2p=EG7NRaK#k*;C!XYQb zAP<>D5VjGjN&HrP>V_01rTrsnPz~5{s6}vO5jK=S41rYKg#itjRUHhkKz(V!?*Q28 z3#>dtm}t^qzYDN%LxGC)B#Nn}QAs_~eiM~Kd}M}B@Puw7haK#0uV4HeqG-KN*3oDU`&`sAz^=(9GmGPzS-ACxJ@)Lj4(AjYwG!UBjtN80YoRT!q!6Jxwi9oeiuDI zn2IQfkk-U~bLtjj&4I!6(?$VppSvG#Ty?#^``X&4`_c?;2`G)TVT>B8h;BZD1Q1wp z3Mj~uNX%pWD{S0ST^|@Co)1^|qfq@RrpAY9P2xC+C_DK~TI}lHB#U9ICrr5Rd>bd5 zlE}$h=o%&}IinfdaP6=uVp!*n8{j<;z+31JhonyweT+<{sBk)dD|`+~-DA2-^7m^} zSkXB5Duc(n00Xbu?{fphldadO@bIA)_U)k zJ-zgE!;f!P1(W)^6W}t%5T#jXrRtMqlar$zEK;Q73%P}k@Wc@%A9FsMPmcw_@Ov6o zhsSTD2YFJIjHWS>i?u>bu-0OwKvZOrfesW)FscRuhc%E!DB#{z-1Wx1>zC_Bbp{y~_HL`!9h1wMNV860BcPlX}`+>$g&BV33P zw|;C~GF+CVXlO!MRbVU+Y7!Dy^rY-e(e;2_>F2q#yB6wpeEE4_YL4ZNsvFoot#AsRR@!N9fSVJRM9Ql|k6oib}-ZKS#O5 zH{S{lgPr1!qx*FXa@yh4=5gG#w6zdt7nG@ocnxYJjwpzq2$anzK4Io>_qX)ZX!`2$ z;zF=M$QV5?^0EfkAS3SJ==^tY=Iz%pCKq5XN;Zmf{SBgvTlp*{cDeVPw)He*;Hm9Mw-36)8i68{M(xm{)Z1=$3D#e*{%Lk ze=T1R1p0>E-DG3{c_MIx@qkQjfei~Nefu2 z%B`#R-SEi?fiXWaweHpQ*OeRV>g`itf+NnulOYbHccfm0<~1}vvDq;)QzH$riqj$} z!beX6B!gktNZ2;q(4y&B{EBRB9UJ@~kJ0_p{K0xa`q)2*M$(#`H~rvCsi#ZAH5*Hi zJ1mStR3nh4OOlDaQc~4By1~d(fxyAokz;&B3?`A`13{@1L?gzf3<*%r1dui)IQoK1 zJw(S+N#GulDw~`_)BPs^H{bZmauV2>B}jzBLF0{f)RR+5<;lwZ&+z@+o^ar@%ORf<_O(z!&U-dG zd|Uq+Py8W76=UP|*nyPChUUYpq8ONF*^7l2ey0*vMj4nzivcDONl7*$?uRrzhE0~1 zuow|yJhlkIXDC^ji53gz{2=*cS$d(ijZHX~a?lHRkq(9)7qbj=i~>bntdQ>=Y3OZjVnGQxQnkd((m( zf$Ey2z59S1jeNb^o)zCUNY~=5{LzyHam;44H4YV5gAw&wkcJR7M##}pl1$0e13+gf z)(nQydHj404}X{s;2Rjsn zodQCx7+|gfm|}~He?E;XC-l4NSYZxF4)?^Fv=UdamPg$)hgRRi2OXVeQ8Z?Ku=?Zt z`1Dfi>%=%bg+z~?9vo2E@;7wTiaza$YDN>L|30zX8QfW-a6t}a9;B6DY6?US5S>bT%CfkMK8zNp<}h%jD1w4Dnq((G z_M%Ww+DFNswqdgOB!Qme^dYiz8Ju;aiZnw8=jd%DjjP2nabA+1t1_FMTqc@L8Ca2P z1(Rt8a@tp|;Ui$3(uQ1QH!v}w1C4}~~$t9fQp(S_jo&Kv6Qqno#sjiIHHTpT;M=84L; zM;@a{aVxbiV1A*x zK3W&cQXU_JOd2teo3(;8rMi084hGVc+XMipYlAeBB=neQ5MjiOKhnQD_7*C{y;>C%!5usq%deRU#v}y#y1_+LPKyFUM8TM!($A5GF4Hf zi!7QGgb_A4CJ*}JZf#W&N%8YTU_3q_$<0IRcV`2M^J{&Jj7h)K+U|!X**ryh>9tHy zUtY#amfIc$`Wo^YFvr}a(W;Y6A*eol zadDB_5ZC+MfHg*>eNHmpwdr=`yun~pSn>@n&?**$^t{V0sW`8k{{g z_d-pFl>m?yrb~h<^RUoxBbvmG$dVt`whx)4p~M0(3YQkQwGcfDw}U#g>Pz;tKp;b z`4WI*{YwFfLm_GlXnF)PseFK?*!a7>TIz+Hv^pLnlor}TSe+FA&u8%ECi`Da$dkvd5r#+Py) zk?Cc))!K1bAGPNIDt(yJ1EU%+mJ%#Mf@bSv-zO$!84XH}5NWabNuz0jggp!GN$vI^;q9am_Mqo@Fp~FPL}*CYZh?}BL$kuQLF|?g+>F-MT(9TN;&}6QjK7i*+deC5YP?+3^_n#Yzh<-ma|fk z2r&faEZ}mc;dIJM6cPqZkO$NT1Ic(iVo)e`xPs^Wznj-uYwsZg$!79DXS&AbezM3kotx2~iP7448yI z(o{rkvKX3}|8M5|Uq|JV%ueag^uPFc-7ftgzgd8N;^w#>b6pcKykBsVVWcT}BLV$d z*bfN5gLPgqlmkNU!W{Sk{UZQe4vX+&IU;95@g;K!0oag)h>+dlK z{&KKcj4@%EqO$FbSf((b$c7;9m?-}9Nu{Vvx29p$DH~$YhzY)Qh#idN#v@vaf)%Y1 z4k{{djKnx`Vim`N5oxvJ*ojxg7`7b{nt*D{4QN?d&9iG3s5K-rMp95%tjS{7n_O^` zIfw=3(g8HYA`ax#g1Y8;577%E#XnVuTL`e^fRUJqgfXEPW#(t|R)@o&hwJ?QufzI{ zyH3}CXRte=erQ_AVj>(OA;2L?fgqffp&CReB36;ZFcO9(X+j1Dh6zb#B|;%mlp-cT zag|(xW+8H1CkZfsXi{WJmKmi=DR7qwr39E%h=>*-Vge)@5eio$Ary%bFbT6VQ`^UB ztwPg>PvH4B1U5ej9l-b$gE9QDVr8u$C+-;c+;PxbSu>7dO}#4nQ)RT0NnlEoR+>y| zlWMl2+vKJyRO=4e;t}B7C|VFW?5)blCcwumB&NjN0rLb2N<=E5KqE>iLX9YhQ$BMP zQ4C~DT8I@H>`f~|O@)8XLU1F2D$!YOD2eM3=~ODKVYRCN%= z%E%y$Gf!fM0Q955jkHlj5|y|ja$qI`LI9Ws8DzNqq7e*`%)H$H*Q0xcFZcF(Zey@`U(GbF`+odm3;t2HV}sacy5hDy;a z)izk7v9QY`X6vxYD4-v=?DTv7|F`$~tNHnuA_3dv<+2@QA-S>Dvii3bL|(#56o~=x zzzraL@CvTztO?@WR5jlw3Hlh436EL`!Wgh`bTj}_sWDLPK74-V^mWoqnn0LwgI4Xp z`y2YZ zr0MMI97?V|@auto+<^Gr_qX86>J(6jXL@bYP3?FdMn&Lc3#8KI@eAm}QZd*tjf5pF z4X4eYopn79NpVC;1P5<*r1y8)SFEPFFQlJV`8@H!bPaZLWY)Rv0SsURk%fdGUyjf0 zc>Cjr+kmI(Qc=3{-bo}N^00v`V*(IpU>B`~OeH}6xkV3R6?K1%f{u?cU=TdzS@(+q zzCu(+9X+m~W~IRQ6o<}xCMcriK`Ie{`wjL?V>qeq7cGBh5U$~*H03@&t`r?D>F$b$ z4Cb^*MlGT;nfCl6?Xc@*v$%+Om^_>g3W&xmygw2keUIv=R)YCpdyc=?^tacw*SmKW z_iO7-gYw+k?T_=({Pkhwy@&UA;VEHtZ5v|-;OC}rCJo#TZI;^tgBF=@J0zy=xMq{= z+rNA5{B?5uk0(!$H{YtYwjUlDq}cFn;L+Q?$=_eb-sj=h`Tn)BcaC>&{vVTN@WT