| 
							- // 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
 - //
 - 
 - #pragma once
 - #include "ysfx.h"
 - #include "ysfx_midi.hpp"
 - #include "ysfx_parse.hpp"
 - #include "ysfx_api_eel.hpp"
 - #include "ysfx_api_reaper.hpp"
 - #include "ysfx_api_file.hpp"
 - #include "ysfx_api_gfx.hpp"
 - #include "ysfx_utils.hpp"
 - #include "utility/sync_bitset.hpp"
 - #include "WDL/eel2/ns-eel.h"
 - #include "WDL/eel2/ns-eel-int.h"
 - #include <unordered_map>
 - #include <atomic>
 - 
 - YSFX_DEFINE_AUTO_PTR(NSEEL_VMCTX_u, void, NSEEL_VM_free); // NOTE: `NSEEL_VMCTX` is `void *`
 - YSFX_DEFINE_AUTO_PTR(NSEEL_CODEHANDLE_u, void, NSEEL_code_free); // NOTE: `NSEEL_CODEHANDLE` is `void *`
 - 
 - struct ysfx_source_unit_t {
 -     ysfx_toplevel_t toplevel;
 -     ysfx_header_t header;
 - };
 - using ysfx_source_unit_u = std::unique_ptr< ysfx_source_unit_t>;
 - 
 - enum ysfx_file_type_t {
 -     ysfx_file_type_none,
 -     ysfx_file_type_txt,
 -     ysfx_file_type_raw,
 -     ysfx_file_type_audio,
 - };
 - 
 - enum ysfx_thread_id_t {
 -     ysfx_thread_id_none,
 -     ysfx_thread_id_dsp,
 -     ysfx_thread_id_gfx,
 - };
 - 
 - struct ysfx_s {
 -     ysfx_config_u config;
 -     eel_string_context_state_u string_ctx;
 -     ysfx::mutex string_mutex;
 -     ysfx::mutex atomic_mutex;
 -     NSEEL_VMCTX_u vm;
 - 
 -     // some default values, these are not standard, just arbitrary
 -     uint32_t block_size = 128;
 -     ysfx_real sample_rate = 44100;
 -     uint32_t valid_input_channels = 2;
 - 
 -     bool is_freshly_compiled = false;
 -     bool must_compute_init = false;
 -     bool must_compute_slider = false;
 - 
 -     std::unordered_map<ysfx_real *, uint32_t> slider_of_var;
 - 
 -     // source
 -     struct {
 -         std::string main_file_path;
 -         std::string bank_path;
 -         ysfx_source_unit_u main;
 -         std::vector<ysfx_source_unit_u> imports;
 -         std::unordered_map<std::string, uint32_t> slider_alias;
 -     } source;
 - 
 -     // compilation
 -     struct {
 -         bool compiled = false;
 -         std::vector<NSEEL_CODEHANDLE_u> init;
 -         NSEEL_CODEHANDLE_u slider;
 -         NSEEL_CODEHANDLE_u block;
 -         NSEEL_CODEHANDLE_u sample;
 -         NSEEL_CODEHANDLE_u gfx;
 -         NSEEL_CODEHANDLE_u serialize;
 -     } code;
 - 
 -     // VM variables
 -     struct {
 -         EEL_F *spl[ysfx_max_channels] = {};
 -         EEL_F *slider[ysfx_max_sliders] = {};
 -         EEL_F *srate = nullptr;
 -         EEL_F *num_ch = nullptr;
 -         EEL_F *samplesblock = nullptr;
 -         EEL_F *trigger = nullptr;
 -         EEL_F *tempo = nullptr;
 -         EEL_F *play_state = nullptr;
 -         EEL_F *play_position = nullptr;
 -         EEL_F *beat_position = nullptr;
 -         EEL_F *ts_num = nullptr;
 -         EEL_F *ts_denom = nullptr;
 -         EEL_F *ext_noinit = nullptr;
 -         EEL_F *ext_nodenorm = nullptr;
 -         EEL_F *ext_midi_bus = nullptr;
 -         EEL_F *midi_bus = nullptr;
 -         EEL_F *pdc_delay = nullptr;
 -         EEL_F *pdc_bot_ch = nullptr;
 -         EEL_F *pdc_top_ch = nullptr;
 -         EEL_F *pdc_midi = nullptr;
 -         // gfx variables
 -         EEL_F *gfx_r = nullptr;
 -         EEL_F *gfx_g = nullptr;
 -         EEL_F *gfx_b = nullptr;
 -         EEL_F *gfx_a = nullptr;
 -         EEL_F *gfx_a2 = nullptr;
 -         EEL_F *gfx_w = nullptr;
 -         EEL_F *gfx_h = nullptr;
 -         EEL_F *gfx_x = nullptr;
 -         EEL_F *gfx_y = nullptr;
 -         EEL_F *gfx_mode = nullptr;
 -         EEL_F *gfx_clear = nullptr;
 -         EEL_F *gfx_texth = nullptr;
 -         EEL_F *gfx_dest = nullptr;
 -         EEL_F *gfx_ext_retina = nullptr;
 -         EEL_F *mouse_x = nullptr;
 -         EEL_F *mouse_y = nullptr;
 -         EEL_F *mouse_cap = nullptr;
 -         EEL_F *mouse_wheel = nullptr;
 -         EEL_F *mouse_hwheel = nullptr;
 -         // other
 -         EEL_F ret_temp = 0;
 -     } var;
 - 
 -     // MIDI
 -     struct {
 -         ysfx_midi_buffer_u in;
 -         ysfx_midi_buffer_u out;
 -     } midi;
 - 
 -     // Slider
 -     struct {
 -         ysfx::sync_bitset64 automate_mask;
 -         ysfx::sync_bitset64 change_mask;
 -         ysfx::sync_bitset64 visible_mask;
 -     } slider;
 - 
 -     // Triggers
 -     uint32_t triggers = 0;
 - 
 -     // Files
 -     struct {
 -         std::vector<ysfx_file_u> list;
 -         ysfx::mutex list_mutex;
 -     } file;
 - 
 - #if !defined(YSFX_NO_GFX)
 -     // Graphics
 -     struct {
 -         ysfx_gfx_state_u state;
 -         ysfx::mutex mutex;
 -         volatile bool ready = false;
 -         volatile bool wants_retina = false;
 -         std::atomic<bool> must_init{false};
 -     } gfx;
 - #endif
 - 
 -     std::atomic<uint32_t> ref_count{1};
 - };
 - 
 - ysfx_thread_id_t ysfx_get_thread_id();
 - void ysfx_set_thread_id(ysfx_thread_id_t id);
 - void ysfx_unload_source(ysfx_t *fx);
 - void ysfx_unload_code(ysfx_t *fx);
 - void ysfx_first_init(ysfx_t *fx);
 - void ysfx_update_slider_visibility_mask(ysfx_t *fx);
 - void ysfx_fill_file_enums(ysfx_t *fx);
 - void ysfx_fix_invalid_enums(ysfx_t *fx);
 - ysfx_section_t *ysfx_search_section(ysfx_t *fx, uint32_t type, ysfx_toplevel_t **origin = nullptr);
 - std::string ysfx_resolve_import_path(ysfx_t *fx, const std::string &name, const std::string &origin);
 - uint32_t ysfx_current_midi_bus(ysfx_t *fx);
 - void ysfx_clear_files(ysfx_t *fx);
 - ysfx_file_t *ysfx_get_file(ysfx_t *fx, uint32_t handle, std::unique_lock<ysfx::mutex> &lock, std::unique_lock<ysfx::mutex> *list_lock = nullptr);
 - int32_t ysfx_insert_file(ysfx_t *fx, ysfx_file_t *file);
 - void ysfx_serialize(ysfx_t *fx);
 - uint32_t ysfx_get_slider_of_var(ysfx_t *fx, EEL_F *var);
 - bool ysfx_find_data_file(ysfx_t *fx, EEL_F *file, std::string &result);
 - ysfx_file_type_t ysfx_detect_file_type(ysfx_t *fx, const char *path, void **fmtobj);
 
 
  |