diff --git a/vst/SfizzFileScan.cpp b/vst/SfizzFileScan.cpp index 441f9e80..1dd313f6 100644 --- a/vst/SfizzFileScan.cpp +++ b/vst/SfizzFileScan.cpp @@ -199,6 +199,9 @@ std::vector getSfzSearchPaths() addPath(*configDefaultPath); addPath(fallbackDefaultPath); + for (const fs::path& path : getEnvironmentSfzPaths()) + addPath(path); + for (const fs::path& foreign : { getAriaPathSetting("user_files_dir"), getAriaPathSetting("Converted_path") }) @@ -231,4 +234,50 @@ fs::path getSfzFallbackDefaultPath() return getUserDocumentsDirectory() / "SFZ instruments"; } +std::vector getEnvironmentSfzPaths() +{ + std::vector paths; + +#if defined(_WIN32) + std::unique_ptr buf; + + DWORD bufsize = GetEnvironmentVariableW(L"SFZ_PATH", nullptr, 0); + if (bufsize == 0) + return {}; + + buf.reset(new WCHAR[bufsize]); + if (GetEnvironmentVariableW(L"SFZ_PATH", buf.get(), bufsize) != bufsize - 1) + return {}; + + paths.reserve(8); + + const WCHAR* env = buf.get(); + while (*env) { + const WCHAR* endp; + for (endp = env; *endp && *endp != L';'; ++endp); + fs::path path = fs::path(env, endp); + if (!path.empty() && path.is_absolute()) + paths.push_back(std::move(path)); + env = *endp ? (endp + 1) : endp; + } +#else + const char* env = getenv("SFZ_PATH"); + if (!env) + return {}; + + paths.reserve(8); + + while (*env) { + const char* endp; + for (endp = env; *endp != ':' && *endp != '\0'; ++endp); + fs::path path = fs::u8path(env, endp); + if (!path.empty() && path.is_absolute()) + paths.push_back(std::move(path)); + env = *endp ? (endp + 1) : endp; + } +#endif + + return paths; +} + } // namespace SfizzPaths diff --git a/vst/SfizzFileScan.h b/vst/SfizzFileScan.h index 19dabf56..9a6b0a08 100644 --- a/vst/SfizzFileScan.h +++ b/vst/SfizzFileScan.h @@ -40,4 +40,5 @@ std::vector getSfzSearchPaths(); absl::optional getSfzConfigDefaultPath(); void setSfzConfigDefaultPath(const fs::path& path); fs::path getSfzFallbackDefaultPath(); +std::vector getEnvironmentSfzPaths(); } // namespace SfizzPaths