From af97801d31203f8d3f7e319fcad8234432676662 Mon Sep 17 00:00:00 2001 From: Nikolai Rodionov Date: Mon, 1 Dec 2025 14:35:28 +0100 Subject: [PATCH] Trying to come up with the structure --- .../{coreaudio.rs => coreaudio_ab.rs} | 0 engine/src/audio_engine/jack.rs | 0 engine/src/audio_engine/jack_ab.rs | 26 +++++++ engine/src/audio_engine/mod.rs | 11 +-- engine/src/control_pane/dummy.rs | 9 +++ engine/src/control_pane/grpc/mod.rs | 76 +++++++++++++++++++ engine/src/control_pane/mod.rs | 6 ++ engine/src/main.rs | 53 +++---------- lib/src/lib.rs | 3 +- tui/src/main.rs | 2 +- 10 files changed, 138 insertions(+), 48 deletions(-) rename engine/src/audio_engine/{coreaudio.rs => coreaudio_ab.rs} (100%) delete mode 100644 engine/src/audio_engine/jack.rs create mode 100644 engine/src/audio_engine/jack_ab.rs create mode 100644 engine/src/control_pane/dummy.rs create mode 100644 engine/src/control_pane/grpc/mod.rs create mode 100644 engine/src/control_pane/mod.rs diff --git a/engine/src/audio_engine/coreaudio.rs b/engine/src/audio_engine/coreaudio_ab.rs similarity index 100% rename from engine/src/audio_engine/coreaudio.rs rename to engine/src/audio_engine/coreaudio_ab.rs diff --git a/engine/src/audio_engine/jack.rs b/engine/src/audio_engine/jack.rs deleted file mode 100644 index e69de29..0000000 diff --git a/engine/src/audio_engine/jack_ab.rs b/engine/src/audio_engine/jack_ab.rs new file mode 100644 index 0000000..6e6d1ab --- /dev/null +++ b/engine/src/audio_engine/jack_ab.rs @@ -0,0 +1,26 @@ +use crate::audio_engine::AudioBackend; + +pub(crate) struct JackAudioBackend { + pub(crate) name: String, + pub(crate) running: bool, +} + +impl JackAudioBackend { + pub(crate) fn new(name: String, running: bool) -> Self { + Self { name, running } + } +} + +impl AudioBackend for JackAudioBackend { + fn start_client(&self) { + todo!() + } + + fn init_client(&self) { + todo!() + } + + fn discover(&self) { + todo!() + } +} diff --git a/engine/src/audio_engine/mod.rs b/engine/src/audio_engine/mod.rs index 944c711..10df893 100644 --- a/engine/src/audio_engine/mod.rs +++ b/engine/src/audio_engine/mod.rs @@ -1,12 +1,13 @@ -mod jack; -mod coreaudio; +#[cfg(feature = "jack")] +pub(crate) mod jack_ab; -trait AudioBackend { +pub(crate) trait AudioBackend { // Start a audio backend client // It should be executed either on the startup, // or when the audio backend is switched - fn start_client(); + fn start_client(&self); // Initialization of the client should happen // when a project is opened. - fn init_client(); + fn init_client(&self); + fn discover(&self); } diff --git a/engine/src/control_pane/dummy.rs b/engine/src/control_pane/dummy.rs new file mode 100644 index 0000000..7db05e0 --- /dev/null +++ b/engine/src/control_pane/dummy.rs @@ -0,0 +1,9 @@ +use crate::control_pane::ControlPane; + +struct Dummy {} + +impl ControlPane for Dummy { + async fn start_server(&self) -> Result<(), Box> { + todo!() + } +} diff --git a/engine/src/control_pane/grpc/mod.rs b/engine/src/control_pane/grpc/mod.rs new file mode 100644 index 0000000..8f94fed --- /dev/null +++ b/engine/src/control_pane/grpc/mod.rs @@ -0,0 +1,76 @@ +use lib::termix::audio_backend::{ + self, Backend, BackendList, FILE_DESCRIPTOR_SET, + audio_backend_server::{AudioBackend, AudioBackendServer}, +}; +use log::info; +use tonic::{Response, transport::Server}; +use tonic_reflection::server; + + +use crate::control_pane::ControlPane; +#[cfg(feature = "jack") ] +use crate::audio_engine::jack_ab::JackAudioBackend; + +pub(crate) struct Grpc { + pub(crate) port: i32, + pub(crate) enable_reflections: bool, +} + +impl ControlPane for Grpc { + async fn start_server(&self) -> Result<(), Box> { + info!("starting the grpc server on port {}", self.port); + // TODO: Use the port from self + let addr = "[::1]:50051".parse()?; + let mut server = Server::builder(); + let audio_backend_reflections = server::Builder::configure() + .register_encoded_file_descriptor_set(FILE_DESCRIPTOR_SET) + .build_v1() + .unwrap(); + let audio_backend = TermixAudioBackend::default(); + + server + .add_service(audio_backend_reflections) + .add_service(AudioBackendServer::new(audio_backend)) + .serve(addr) + .await?; + + Ok(()) + } +} + +#[derive(Debug, Default)] +pub struct TermixAudioBackend {} + +#[tonic::async_trait] +impl AudioBackend for TermixAudioBackend { + async fn start_client( + &self, + requesa: tonic::Request<()>, + ) -> std::result::Result, tonic::Status> { + info!("starting the audio backend client"); + todo!() + } + + async fn init_connection( + &self, + request: tonic::Request<()>, + ) -> std::result::Result, tonic::Status> { + info!("initializing the connection to the audio backend"); + todo!() + } + + async fn get_available_backends( + &self, + request: tonic::Request<()>, + ) -> Result, tonic::Status> { + info!("discovering available backends"); + let mut response = BackendList::default(); + if cfg!(feature = "jack") { + let jack = JackAudioBackend{ name: "jack".to_string(), running: todo!() }; + response.backends.push(Backend { + name: "jack".to_string(), + }); + } + Ok(Response::new(response)) + } +} diff --git a/engine/src/control_pane/mod.rs b/engine/src/control_pane/mod.rs new file mode 100644 index 0000000..83e765a --- /dev/null +++ b/engine/src/control_pane/mod.rs @@ -0,0 +1,6 @@ +pub(crate) mod dummy; +pub(crate) mod grpc; + +pub(crate) trait ControlPane { + async fn start_server(&self) -> Result<(), Box>; +} diff --git a/engine/src/main.rs b/engine/src/main.rs index 939ee01..e4f47a8 100644 --- a/engine/src/main.rs +++ b/engine/src/main.rs @@ -1,58 +1,29 @@ -mod audio_engine; +pub(crate) mod audio_engine; +pub(crate) mod control_pane; + +use crate::control_pane::ControlPane; use clap::Parser; -use lib::termix::audio_backend::{Backend, BackendList, FILE_DESCRIPTOR_SET, audio_backend_server::{AudioBackend, AudioBackendServer}}; -use tonic::{Request, Response, Result, Status, transport::Server}; -use log::{debug, error, log_enabled, info, Level}; -use tonic_reflection::server::v1::{ReflectionService, ServerReflection}; + /// Simple program to greet a person #[derive(Parser, Debug)] #[command(version, about, long_about = None)] struct Args { #[arg(long, default_value_t = 50051)] grpc_port: i32, + #[arg(long, default_value_t = true)] + grpc_enable_reflections: bool, } -#[derive(Debug, Default)] -pub struct TermixAudioBackend {} - -#[tonic::async_trait] -impl AudioBackend for TermixAudioBackend { - async fn start_client(&self,requesa:tonic::Request<()>,) -> std::result::Result,tonic::Status> { - info!("starting the audio backend client"); - todo!() - } - - async fn init_connection(&self,request:tonic::Request<()>,) -> std::result::Result,tonic::Status> { - info!("initializing the connection to the audio backend"); - todo!() - } - - async fn get_available_backends(&self, request:tonic::Request<()>) -> Result, tonic::Status> { - info!("discovering available backends"); - let mut response = BackendList::default(); - if cfg!(feature = "jack") { - response.backends.push(Backend{ name: "jack".to_string() }); - } - Ok(Response::new(response)) - } -} - - #[tokio::main] async fn main() -> Result<(), Box> { env_logger::init(); let args = Args::parse(); - // start_grpc_server() - info!("starting the grpc server on port {}", args.grpc_port); - let reflections = tonic_reflection::server::Builder::configure().register_encoded_file_descriptor_set(FILE_DESCRIPTOR_SET).build_v1().unwrap(); - let addr = "[::1]:50051".parse()?; - let greeter = TermixAudioBackend::default(); - Server::builder() - .add_service(AudioBackendServer::new(greeter)) - .add_service(reflections) - .serve(addr) - .await?; + let grpc_control_pane = control_pane::grpc::Grpc { + port: args.grpc_port, + enable_reflections: args.grpc_enable_reflections, + }; + grpc_control_pane.start_server().await?; Ok(()) } diff --git a/lib/src/lib.rs b/lib/src/lib.rs index bde0ac5..d12b1c5 100644 --- a/lib/src/lib.rs +++ b/lib/src/lib.rs @@ -1,6 +1,7 @@ pub mod termix { pub mod audio_backend { - pub const FILE_DESCRIPTOR_SET: &[u8] = tonic::include_file_descriptor_set!("audio_backend_descriptor"); + pub const FILE_DESCRIPTOR_SET: &[u8] = + tonic::include_file_descriptor_set!("audio_backend_descriptor"); tonic::include_proto!("termix.audio_backend"); } } diff --git a/tui/src/main.rs b/tui/src/main.rs index 1c6f2bd..d36510f 100644 --- a/tui/src/main.rs +++ b/tui/src/main.rs @@ -1,7 +1,7 @@ +use clap::Parser; use color_eyre::Result; use crossterm::event::{self, Event}; use ratatui::{DefaultTerminal, Frame}; -use clap::Parser; /// Simple program to greet a person #[derive(Parser, Debug)]