+35
-6
@@ -10,6 +10,7 @@
|
||||
#include <future>
|
||||
#include <iostream>
|
||||
#include <iterator>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <thread>
|
||||
@@ -27,6 +28,7 @@
|
||||
#include <modulus.hpp>
|
||||
|
||||
#include <vamp_zero/config.hpp>
|
||||
#include <vamp_zero/audio.hpp>
|
||||
#include <vamp_zero/database.hpp>
|
||||
#include <vamp_zero/errors.hpp>
|
||||
#include <vamp_zero/library.hpp>
|
||||
@@ -129,6 +131,14 @@ auto load_initial_state(vamp_zero::config const& config) -> std::expected<vamp_z
|
||||
auto state = vamp_zero::app_state{
|
||||
.performance = std::move(*performance),
|
||||
.practice = std::move(*practice),
|
||||
.audio = {
|
||||
.track_enabled = config.audio.track_enabled,
|
||||
.metronome_enabled = config.audio.metronome_enabled,
|
||||
.metronome_bpm = config.audio.metronome_bpm,
|
||||
.metronome_min_bpm = config.audio.metronome_min_bpm,
|
||||
.metronome_max_bpm = config.audio.metronome_max_bpm,
|
||||
.metronome_step = config.audio.metronome_step,
|
||||
},
|
||||
};
|
||||
if (auto valid = vamp_zero::validate_app_state(state); !valid) {
|
||||
return std::unexpected(valid.error());
|
||||
@@ -136,7 +146,7 @@ auto load_initial_state(vamp_zero::config const& config) -> std::expected<vamp_z
|
||||
return state;
|
||||
}
|
||||
|
||||
auto run_headless(vamp_zero::config const& config, vamp_zero::control_state& state) -> std::expected<void, modulus::error> {
|
||||
auto run_headless(vamp_zero::config const& config, vamp_zero::control_state& state, vamp_zero::audio_controller* audio) -> std::expected<void, modulus::error> {
|
||||
auto io = boost::asio::io_context{};
|
||||
auto endpoint = make_server_endpoint(config);
|
||||
if (!endpoint) {
|
||||
@@ -147,6 +157,12 @@ auto run_headless(vamp_zero::config const& config, vamp_zero::control_state& sta
|
||||
if (!started) {
|
||||
return std::unexpected(started.error());
|
||||
}
|
||||
if (audio != nullptr) {
|
||||
state.set_observer([audio](vamp_zero::app_state app) {
|
||||
audio->sync(app);
|
||||
});
|
||||
audio->sync(state.snapshot());
|
||||
}
|
||||
auto heartbeat = write_heartbeat(config);
|
||||
if (!heartbeat) {
|
||||
server.stop();
|
||||
@@ -162,7 +178,7 @@ auto run_headless(vamp_zero::config const& config, vamp_zero::control_state& sta
|
||||
return {};
|
||||
}
|
||||
|
||||
auto run_display(vamp_zero::config const& config, vamp_zero::control_state& state) -> std::expected<void, modulus::error> {
|
||||
auto run_display(vamp_zero::config const& config, vamp_zero::control_state& state, vamp_zero::audio_controller* audio) -> std::expected<void, modulus::error> {
|
||||
auto io = boost::asio::io_context{};
|
||||
auto endpoint = make_server_endpoint(config);
|
||||
if (!endpoint) {
|
||||
@@ -171,12 +187,18 @@ auto run_display(vamp_zero::config const& config, vamp_zero::control_state& stat
|
||||
auto ui = vamp_zero::zero_ui{io.get_executor(), config.display, [&state](vamp_protocol::page_command command) {
|
||||
static_cast<void>(state.apply(command));
|
||||
}};
|
||||
state.set_observer([&ui, &config](vamp_zero::app_state app) {
|
||||
state.set_observer([&ui, &config, audio](vamp_zero::app_state app) {
|
||||
if (audio != nullptr) {
|
||||
audio->sync(app);
|
||||
}
|
||||
auto status = ui.publish(vamp_zero::make_ui_state(config, std::move(app)));
|
||||
if (!status) {
|
||||
modulus::log_error("failed to publish UI state: " + status.error().describe());
|
||||
}
|
||||
});
|
||||
if (audio != nullptr) {
|
||||
audio->sync(state.snapshot());
|
||||
}
|
||||
auto published = ui.publish(vamp_zero::make_ui_state(config, state.snapshot()));
|
||||
if (!published) {
|
||||
return std::unexpected(published.error());
|
||||
@@ -316,8 +338,15 @@ auto vamp_zero::run(vamp_zero::command_line command) -> std::expected<void, modu
|
||||
return std::unexpected(initial.error());
|
||||
}
|
||||
auto state = vamp_zero::control_state{*config, std::move(*initial)};
|
||||
if (config->runtime.headless) {
|
||||
return run_headless(*config, state);
|
||||
auto audio_controller = std::unique_ptr<vamp_zero::audio_controller>{};
|
||||
auto audio = vamp_zero::create_audio_controller(config->audio);
|
||||
if (!audio) {
|
||||
modulus::log_error("audio unavailable: " + audio.error().describe());
|
||||
} else {
|
||||
audio_controller = std::move(*audio);
|
||||
}
|
||||
return run_display(*config, state);
|
||||
if (config->runtime.headless) {
|
||||
return run_headless(*config, state, audio_controller.get());
|
||||
}
|
||||
return run_display(*config, state, audio_controller.get());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user