// 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_utils.hpp" #include "WDL/eel2/ns-eel.h" #include "WDL/eel2/ns-eel-int.h" #include #include struct ysfx_file_t { virtual ~ysfx_file_t() {} virtual int32_t avail() = 0; virtual void rewind() = 0; virtual bool var(ysfx_real *var) = 0; virtual uint32_t mem(uint32_t offset, uint32_t length) = 0; virtual uint32_t string(std::string &str) = 0; virtual bool riff(uint32_t &nch, ysfx_real &samplerate) = 0; virtual bool is_text() = 0; virtual bool is_in_write_mode() = 0; std::unique_ptr m_mutex{new ysfx::mutex}; }; using ysfx_file_u = std::unique_ptr; //------------------------------------------------------------------------------ struct ysfx_raw_file_t final : ysfx_file_t { ysfx_raw_file_t(NSEEL_VMCTX vm, const char *filename); int32_t avail() override; void rewind() override; bool var(ysfx_real *var) override; uint32_t mem(uint32_t offset, uint32_t length) override; uint32_t string(std::string &str) override; bool riff(uint32_t &, ysfx_real &) override { return false; } bool is_text() override { return false; } bool is_in_write_mode() override { return false; } NSEEL_VMCTX m_vm = nullptr; ysfx::FILE_u m_stream; }; //------------------------------------------------------------------------------ struct ysfx_text_file_t final : ysfx_file_t { ysfx_text_file_t(NSEEL_VMCTX vm, const char *filename); int32_t avail() override; void rewind() override; bool var(ysfx_real *var) override; uint32_t mem(uint32_t offset, uint32_t length) override; uint32_t string(std::string &str) override; bool riff(uint32_t &, ysfx_real &) override { return false; } bool is_text() override { return true; } bool is_in_write_mode() override { return false; } NSEEL_VMCTX m_vm = nullptr; ysfx::FILE_u m_stream; std::string m_buf; }; //------------------------------------------------------------------------------ struct ysfx_audio_file_t final : ysfx_file_t { ysfx_audio_file_t(NSEEL_VMCTX vm, const ysfx_audio_format_t &fmt, const char *filename); int32_t avail() override; void rewind() override; bool var(ysfx_real *var) override; uint32_t mem(uint32_t offset, uint32_t length) override; uint32_t string(std::string &str) override; bool riff(uint32_t &nch, ysfx_real &samplerate) override; bool is_text() override { return false; } bool is_in_write_mode() override { return false; } NSEEL_VMCTX m_vm = nullptr; ysfx_audio_format_t m_fmt{}; std::unique_ptr m_reader; enum { buffer_size = 256 }; std::unique_ptr m_buf{new ysfx_real[buffer_size]}; }; //------------------------------------------------------------------------------ struct ysfx_serializer_t final : ysfx_file_t { explicit ysfx_serializer_t(NSEEL_VMCTX vm); void begin(bool write, std::string &buffer); void end(); int32_t avail() override; void rewind() override; bool var(ysfx_real *var) override; uint32_t mem(uint32_t offset, uint32_t length) override; uint32_t string(std::string &str) override; bool riff(uint32_t &, ysfx_real &) override { return false; } bool is_text() override { return false; } bool is_in_write_mode() override { return m_write == 1; } NSEEL_VMCTX m_vm{}; int m_write = -1; std::string *m_buffer = nullptr; size_t m_pos = 0; }; using ysfx_serializer_u = std::unique_ptr; //------------------------------------------------------------------------------ void ysfx_api_init_file();