|
- // 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 <cassert>
-
- 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);
- }
|