#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace vamp_zero { class audio_controller { public: audio_controller(vamp_zero::audio_config config, sonus::engine engine); audio_controller(vamp_zero::audio_controller const &) = delete; auto operator=(vamp_zero::audio_controller const &) -> vamp_zero::audio_controller & = delete; ~audio_controller(); auto sync(vamp_zero::app_state const &state) -> void; auto tick(vamp_zero::app_state const &state, vamp_zero::score_load_state const &loaded, std::filesystem::path const &assets) -> std::optional>; auto position(vamp_zero::score_document const &score, std::uint32_t bpm) const -> std::optional; private: vamp_zero::audio_config config_{}; sonus::engine engine_; mutable std::mutex mutex_{}; boost::asio::thread_pool worker_{1}; std::future> preparation_{}; std::uint64_t preparing_session_{}; std::shared_ptr preparing_catalog_{}; std::optional attempted_session_{}; std::shared_ptr catalog_{}; sonus::transport_session playback_{}; std::bool_t reported_{true}; }; auto create_audio_controller(vamp_zero::audio_config const &config) -> std::expected, modulus::error>; }