diff --git a/.appveyor.yml b/.appveyor.yml index dcb4e9b6..b60ec401 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -3,8 +3,8 @@ configuration: Release environment: matrix: - - job_name: macOS Mojave - appveyor_build_worker_image: macos-mojave + - job_name: macOS + appveyor_build_worker_image: macos INSTALL_DIR: sfizz-$(APPVEYOR_REPO_TAG_NAME)-macos - job_name: Windows x86 @@ -31,11 +31,12 @@ environment: for: - matrix: only: - - job_name: macOS Mojave + - job_name: macOS init: - system_profiler SPSoftwareDataType - cmake --version - gcc -v + - xcodebuild -version install: - chmod +x ${APPVEYOR_BUILD_FOLDER}/scripts/appveyor/install.sh - ${APPVEYOR_BUILD_FOLDER}/scripts/appveyor/install.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 55fdb1a1..8b501e6c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,7 +32,7 @@ option_ex (SFIZZ_TESTS "Enable tests build" OFF) option_ex (SFIZZ_DEMOS "Enable feature demos build" OFF) option_ex (SFIZZ_DEVTOOLS "Enable developer tools build" OFF) option_ex (SFIZZ_SHARED "Enable shared library build" ON) -option_ex (SFIZZ_USE_SNDFILE "Enable use of the sndfile library" ON) +option_ex (SFIZZ_USE_SNDFILE "Enable use of the sndfile library" OFF) option_ex (SFIZZ_USE_VCPKG "Assume that sfizz is build using vcpkg" OFF) option_ex (SFIZZ_USE_SYSTEM_ABSEIL "Use Abseil libraries preinstalled on system" OFF) option_ex (SFIZZ_USE_SYSTEM_SIMDE "Use SIMDe libraries preinstalled on system" OFF) diff --git a/clients/CMakeLists.txt b/clients/CMakeLists.txt index 367acc04..37e6ed77 100644 --- a/clients/CMakeLists.txt +++ b/clients/CMakeLists.txt @@ -8,7 +8,7 @@ endif() if(SFIZZ_RENDER) add_executable(sfizz_render MidiHelpers.h sfizz_render.cpp) - target_link_libraries(sfizz_render PRIVATE sfizz::internal sfizz::fmidi sfizz::sndfile sfizz::cxxopts) + target_link_libraries(sfizz_render PRIVATE sfizz::internal sfizz::fmidi sfizz::cxxopts st_audiofile_formats) sfizz_enable_lto_if_needed(sfizz_render) install(TARGETS sfizz_render DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT "render" OPTIONAL) endif() diff --git a/clients/sfizz_render.cpp b/clients/sfizz_render.cpp index bd03ea20..6b646b4c 100644 --- a/clients/sfizz_render.cpp +++ b/clients/sfizz_render.cpp @@ -1,11 +1,11 @@ -#include #include "sfizz/Synth.h" #include "sfizz/MathHelpers.h" #include "sfizz/SfzHelpers.h" #include "sfizz/SIMDHelpers.h" #include "MidiHelpers.h" -#include "cxxopts.hpp" +#include +#include #include #include @@ -158,14 +158,27 @@ int main(int argc, char** argv) LOG_INFO("-- Cutting the rendering at the last MIDI End of Track message"); } - SndfileHandle outputFile (outputPath.u8string(), SFM_WRITE, SF_FORMAT_WAV | SF_FORMAT_PCM_16, 2, sampleRate); - ERROR_IF(outputFile.error() != 0, "Error writing out the wav file: " << outputFile.strError()); + drwav outputFile; + drwav_data_format outputFormat {}; + outputFormat.container = drwav_container_riff; + outputFormat.format = DR_WAVE_FORMAT_PCM; + outputFormat.channels = 2; + outputFormat.sampleRate = sampleRate; + outputFormat.bitsPerSample = 16; + +#if !defined(_WIN32) + drwav_bool32 outputFileOk = drwav_init_file_write(&outputFile, outputPath.c_str(), &outputFormat, nullptr); +#else + drwav_bool32 outputFileOk = drwav_init_file_write_w(&outputFile, outputPath.c_str(), &outputFormat, nullptr); +#endif + ERROR_IF(!outputFileOk, "Error opening the wav file for writing"); auto sampleRateDouble = static_cast(sampleRate); const double increment { 1.0 / sampleRateDouble }; - int numFramesWritten { 0 }; + uint64_t numFramesWritten { 0 }; sfz::AudioBuffer audioBuffer { 2, blockSize }; sfz::Buffer interleavedBuffer { 2 * blockSize }; + sfz::Buffer interleavedPcm { 2 * blockSize }; fmidi_player_u midiPlayer { fmidi_player_new(midiFile.get()) }; CallbackData callbackData { synth, 0, false }; @@ -178,7 +191,8 @@ int main(int argc, char** argv) fmidi_player_tick(midiPlayer.get(), increment); synth.renderBlock(audioBuffer); sfz::writeInterleaved(audioBuffer.getConstSpan(0), audioBuffer.getConstSpan(1), absl::MakeSpan(interleavedBuffer)); - numFramesWritten += outputFile.writef(interleavedBuffer.data(), blockSize); + drwav_f32_to_s16(interleavedPcm.data(), interleavedBuffer.data(), 2 * blockSize); + numFramesWritten += drwav_write_pcm_frames(&outputFile, blockSize, interleavedPcm.data()); } if (!useEOT) { @@ -186,12 +200,13 @@ int main(int argc, char** argv) while (averagePower > 1e-12f) { synth.renderBlock(audioBuffer); sfz::writeInterleaved(audioBuffer.getConstSpan(0), audioBuffer.getConstSpan(1), absl::MakeSpan(interleavedBuffer)); - numFramesWritten += outputFile.writef(interleavedBuffer.data(), blockSize); + drwav_f32_to_s16(interleavedPcm.data(), interleavedBuffer.data(), 2 * blockSize); + numFramesWritten += drwav_write_pcm_frames(&outputFile, blockSize, interleavedPcm.data()); averagePower = sfz::meanSquared(interleavedBuffer); } } - outputFile.writeSync(); + drwav_uninit(&outputFile); LOG_INFO("Wrote " << numFramesWritten << " frames of sound data in" << outputPath.string()); return 0; diff --git a/cmake/SfizzDeps.cmake b/cmake/SfizzDeps.cmake index 9f30e111..e6f07c1c 100644 --- a/cmake/SfizzDeps.cmake +++ b/cmake/SfizzDeps.cmake @@ -57,7 +57,7 @@ add_library(sfizz::cxxopts ALIAS sfizz_cxxopts) target_include_directories(sfizz_cxxopts INTERFACE "external/cxxopts") # The sndfile library -if(SFIZZ_USE_SNDFILE OR SFIZZ_DEMOS OR SFIZZ_DEVTOOLS OR SFIZZ_BENCHMARKS OR SFIZZ_RENDER) +if(SFIZZ_USE_SNDFILE OR SFIZZ_DEMOS OR SFIZZ_DEVTOOLS OR SFIZZ_BENCHMARKS) add_library(sfizz_sndfile INTERFACE) add_library(sfizz::sndfile ALIAS sfizz_sndfile) if(SFIZZ_USE_VCPKG OR CMAKE_CXX_COMPILER_ID MATCHES "MSVC") diff --git a/common.mk b/common.mk index d27836e8..a8b9bfa4 100644 --- a/common.mk +++ b/common.mk @@ -6,7 +6,7 @@ endif ### Options -SFIZZ_USE_SNDFILE ?= 1 +SFIZZ_USE_SNDFILE ?= 0 ### @@ -154,6 +154,11 @@ SFIZZ_SOURCES += \ external/st_audiofile/src/st_audiofile_libs.c \ external/st_audiofile/src/st_audiofile_sndfile.c +ifneq ($(SFIZZ_USE_SNDFILE),1) +SFIZZ_SOURCES += \ + external/st_audiofile/src/st_audiofile_libs.c +endif + SFIZZ_C_FLAGS += \ -I$(SFIZZ_DIR)/external/st_audiofile/src \ -I$(SFIZZ_DIR)/external/st_audiofile/thirdparty/dr_libs diff --git a/external/st_audiofile/CMakeLists.txt b/external/st_audiofile/CMakeLists.txt index 643c0992..06b5251b 100644 --- a/external/st_audiofile/CMakeLists.txt +++ b/external/st_audiofile/CMakeLists.txt @@ -4,24 +4,27 @@ project(st_audiofile) option(ST_AUDIO_FILE_USE_SNDFILE "Use sndfile" OFF) set(ST_AUDIO_FILE_EXTERNAL_SNDFILE "" CACHE STRING "Name of external sndfile target") -add_library(st_audiofile STATIC +add_library(st_audiofile STATIC EXCLUDE_FROM_ALL "src/st_audiofile.c" "src/st_audiofile_common.c" - "src/st_audiofile_libs.c" "src/st_audiofile_sndfile.c") target_include_directories(st_audiofile + PUBLIC "src") + +### +add_library(st_audiofile_formats STATIC EXCLUDE_FROM_ALL + "src/st_audiofile_libs.c") +target_include_directories(st_audiofile_formats PUBLIC "src" PUBLIC "thirdparty/dr_libs" PUBLIC "thirdparty/stb_vorbis") -add_executable(st_info - "src/st_info.c") -target_link_libraries(st_info - PRIVATE st_audiofile) +add_subdirectory("thirdparty/libaiff" EXCLUDE_FROM_ALL) +target_link_libraries(st_audiofile_formats PUBLIC aiff::aiff) +### if(NOT ST_AUDIO_FILE_USE_SNDFILE) - add_subdirectory("thirdparty/libaiff" EXCLUDE_FROM_ALL) - target_link_libraries(st_audiofile PRIVATE aiff::aiff) + target_link_libraries(st_audiofile PRIVATE st_audiofile_formats) else() target_compile_definitions(st_audiofile PUBLIC "ST_AUDIO_FILE_USE_SNDFILE=1") @@ -31,11 +34,12 @@ else() else() find_package(PkgConfig REQUIRED) pkg_check_modules(Sndfile "sndfile" REQUIRED) - target_include_directories(st_audiofile - PUBLIC ${Sndfile_INCLUDE_DIRS}) - target_link_libraries(st_audiofile - PUBLIC ${Sndfile_LIBRARIES}) - link_directories( - ${Sndfile_LIBRARY_DIRS}) + target_include_directories(st_audiofile PUBLIC ${Sndfile_INCLUDE_DIRS}) + target_link_libraries(st_audiofile PUBLIC ${Sndfile_LIBRARIES}) + link_directories(${Sndfile_LIBRARY_DIRS}) endif() endif() + +### +add_executable(st_info "src/st_info.c") +target_link_libraries(st_info PRIVATE st_audiofile) diff --git a/external/st_audiofile/src/st_audiofile_libs.c b/external/st_audiofile/src/st_audiofile_libs.c index 635c19d4..0bbcccca 100644 --- a/external/st_audiofile/src/st_audiofile_libs.c +++ b/external/st_audiofile/src/st_audiofile_libs.c @@ -4,7 +4,6 @@ // license. You should have receive a LICENSE.md file along with the code. // If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz -#if !defined(ST_AUDIO_FILE_USE_SNDFILE) #define DR_WAV_IMPLEMENTATION #define DR_FLAC_IMPLEMENTATION #define DR_MP3_IMPLEMENTATION @@ -28,5 +27,3 @@ stb_vorbis* stb_vorbis_open_filename_w(const wchar_t* filename, int* error, cons return NULL; } #endif - -#endif // !defined(ST_AUDIO_FILE_USE_SNDFILE) diff --git a/scripts/appveyor/before_build.sh b/scripts/appveyor/before_build.sh index 213ab8a3..5989ba14 100644 --- a/scripts/appveyor/before_build.sh +++ b/scripts/appveyor/before_build.sh @@ -4,6 +4,7 @@ set -ex git submodule update --init --recursive mkdir -p build/${INSTALL_DIR} && cd build cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" \ -DSFIZZ_VST=ON \ -DSFIZZ_AU=ON \ -DSFIZZ_RENDER=OFF \ diff --git a/scripts/appveyor/install.cmd b/scripts/appveyor/install.cmd index 4b7b8c28..3f7b2cc0 100644 --- a/scripts/appveyor/install.cmd +++ b/scripts/appveyor/install.cmd @@ -1,7 +1,9 @@ choco install -y innosetup + REM Uncomment the next 4 lines to force vcpkg update REM cd c:\tools\vcpkg\ REM git pull REM .\bootstrap-vcpkg.bat REM cd %APPVEYOR_BUILD_FOLDER% -vcpkg install libsndfile:%VCPKG_TRIPLET% + +REM vcpkg install libsndfile:%VCPKG_TRIPLET% diff --git a/scripts/appveyor/install.sh b/scripts/appveyor/install.sh index 1372da19..d597d464 100644 --- a/scripts/appveyor/install.sh +++ b/scripts/appveyor/install.sh @@ -40,7 +40,7 @@ fi set -x -brew install libsndfile dylibbundler +brew install dylibbundler cd ~; npm install appdmg; cd - ~/node_modules/appdmg/bin/appdmg.js --version