// Copyright 2021 Jean Pierre Cimalando // // 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. // // SPDX-License-Identifier: Apache-2.0 // #include "ysfx_config.hpp" #include "ysfx_utils.hpp" #include "ysfx_audio_wav.hpp" #include "ysfx_audio_flac.hpp" #include ysfx_config_t *ysfx_config_new() { return new ysfx_config_t; } void ysfx_config_free(ysfx_config_t *config) { if (!config) return; if (config->ref_count.fetch_sub(1, std::memory_order_acq_rel) == 1) delete config; } void ysfx_config_add_ref(ysfx_config_t *config) { config->ref_count.fetch_add(1, std::memory_order_relaxed); } void ysfx_set_import_root(ysfx_config_t *config, const char *root) { config->import_root = ysfx::path_ensure_final_separator(root ? root : ""); } void ysfx_set_data_root(ysfx_config_t *config, const char *root) { config->data_root = ysfx::path_ensure_final_separator(root ? root : ""); } const char *ysfx_get_import_root(ysfx_config_t *config) { return config->import_root.c_str(); } const char *ysfx_get_data_root(ysfx_config_t *config) { return config->data_root.c_str(); } void ysfx_guess_file_roots(ysfx_config_t *config, const char *sourcepath) { if (config->import_root.empty()) { bool stop = false; const std::string sourcedir = ysfx::path_directory(sourcepath); std::string cur_dir = sourcedir + "../"; ysfx::file_uid cur_uid; if (!ysfx::get_file_uid(cur_dir.c_str(), cur_uid)) stop = true; while (!stop) { bool match = ysfx::exists((cur_dir + "Effects/").c_str()) && ysfx::exists((cur_dir + "Data/").c_str()); if (match) { stop = true; config->import_root = cur_dir + "Effects/"; } else { cur_dir += "../"; ysfx::file_uid old_uid = cur_uid; if (!ysfx::get_file_uid(cur_dir.c_str(), cur_uid) || old_uid == cur_uid) stop = true; } } } if (config->data_root.empty() && !config->import_root.empty()) { const std::string datadir = config->import_root + "../Data/"; bool match = ysfx::exists(datadir.c_str()); if (match) config->data_root = datadir; } } void ysfx_register_audio_format(ysfx_config_t *config, ysfx_audio_format_t *afmt) { config->audio_formats.push_back(*afmt); } void ysfx_register_builtin_audio_formats(ysfx_config_t *config) { config->audio_formats.push_back(ysfx_audio_format_wav); config->audio_formats.push_back(ysfx_audio_format_flac); } void ysfx_set_log_reporter(ysfx_config_t *config, ysfx_log_reporter_t *reporter) { config->log_reporter = reporter; } void ysfx_set_user_data(ysfx_config_t *config, intptr_t userdata) { config->userdata = userdata; } //------------------------------------------------------------------------------ const char *ysfx_log_level_string(ysfx_log_level level) { switch (level) { case ysfx_log_info: return "info"; case ysfx_log_warning: return "warning"; case ysfx_log_error: return "error"; default: assert(false); return "?"; } } void ysfx_log(ysfx_config_t &conf, ysfx_log_level level, const char *message) { if (conf.log_reporter) conf.log_reporter(conf.userdata, level, message); else fprintf(stderr, "[ysfx] %s: %s\n", ysfx_log_level_string(level), message); } void ysfx_logfv(ysfx_config_t &conf, ysfx_log_level level, const char *format, va_list ap) { char buf[256]; vsnprintf(buf, sizeof(buf), format, ap); buf[sizeof(buf)-1] = '\0'; ysfx_log(conf, level, buf); } void ysfx_logf(ysfx_config_t &conf, ysfx_log_level level, const char *format, ...) { va_list ap; va_start(ap, format); ysfx_logfv(conf, level, format, ap); va_end(ap); }