#pragma once #include #include #include #include #include #include #include #include #include namespace vamp_zero { struct runtime_config { std::bool_t headless{false}; std::bool_t exit_after_startup{false}; std::string assets_path{"/usr/share/product_vamp"}; std::string heartbeat_path{"/run/product_vamp/heartbeat.json"}; }; struct database_config { std::string path{"/usr/share/product_vamp/catalog.db"}; }; struct control_config { ligo::endpoint_config endpoint{ .name = "product_vamp_control", .protocol = ligo::protocol::HTTP, .bind = "0.0.0.0:8080", .timeout = std::chrono::milliseconds{5000}, .http = { .max_body_size = 64U * 1024U, }, }; std::string ap_ssid{"Vamp Control"}; std::string ap_passphrase{"vamp-control"}; std::string ap_interface{"wlan0"}; std::string zero_ip{"192.168.42.1"}; std::string zero_cidr{"192.168.42.1/24"}; }; struct audio_config { std::bool_t enabled{true}; std::bool_t backing_enabled{false}; std::bool_t metronome_enabled{false}; std::uint32_t tempo_bpm{120}; std::float32_t master_volume{0.70F}; std::float32_t metronome_volume{0.45F}; }; struct config { modulus::config modulus{}; vamp_zero::runtime_config runtime{}; vamp_zero::database_config database{}; vamp_zero::control_config control{}; vamp_zero::audio_config audio{}; luma::application_config display{.title = "Product Vamp"}; }; auto parse_config(boost::json::value const &value) -> std::expected; auto load_config(std::string const &path) -> std::expected; }