some ideas including stub

This commit is contained in:
2026-01-24 22:08:09 -07:00
committed by Liam Warfield
parent 09985e6031
commit 35b2a06e64
7 changed files with 160 additions and 43 deletions
-1
View File
@@ -146,7 +146,6 @@ desktop = [
"rfd/xdg-portal",
"etcetera",
]
mobile = [
"dioxus/mobile",
"tokio",
+5
View File
@@ -108,3 +108,8 @@ pub async fn network_connect(
pub async fn get_status(client: &reqwest::Client) -> color_eyre::Result<ServerStatus> {
bail!("status not supported on desktop yet")
}
#[allow(unused)]
pub use tokio::spawn;
#[allow(unused)]
pub type SpawnHandle = tokio::runtime::Handle;
-4
View File
@@ -7,10 +7,6 @@ use std::time::Duration;
pub use super::connect::*;
// ============================================================================
// Platform Struct
// ============================================================================
/// Mobile platform implementation using Tokio, native audio, and Android permissions.
pub struct MobilePlatform;
+36 -14
View File
@@ -31,8 +31,7 @@ pub trait AudioSystemInterface: Sized {
each: impl FnMut(Vec<u8>, bool) + Send + 'static,
) -> Result<(), Error>;
/// Begin playback of an audio stream, returning an object that can be passed
/// with opus frames.
/// Begin playback of an audio stream, returning an object that can be passed opus frames.
fn create_player(&mut self) -> Result<Self::AudioPlayer, Error>;
}
@@ -89,18 +88,17 @@ pub trait PlatformInterface {
// Platform Modules
// ============================================================================
#[cfg(feature = "web")]
pub mod web;
#[cfg(any(feature = "desktop", feature = "mobile"))]
pub mod connect;
#[cfg(any(feature = "desktop", feature = "mobile"))]
pub mod native_audio;
mod connect;
#[cfg(feature = "desktop")]
pub mod desktop;
mod desktop;
#[cfg(feature = "mobile")]
pub mod mobile;
mod mobile;
#[cfg(any(feature = "desktop", feature = "mobile"))]
mod native_audio;
mod stub;
#[cfg(feature = "web")]
mod web;
// ============================================================================
// Platform Type Alias
@@ -115,20 +113,44 @@ pub type Platform = desktop::DesktopPlatform;
#[cfg(all(feature = "mobile", not(feature = "web"), not(feature = "desktop")))]
pub type Platform = mobile::MobilePlatform;
#[cfg(all(
not(feature = "mobile"),
not(feature = "web"),
not(feature = "desktop")
))]
pub type Platform = stub::StubPlatform;
pub type AudioSystem = <Platform as PlatformInterface>::AudioSystem;
pub type AudioPlayer = <AudioSystem as AudioSystemInterface>::AudioPlayer;
// ========================
// Platform Async Runtime
// ========================
// Note: these can not be part of the Platform because they differ in Send requiremets
#[cfg(all(any(feature = "desktop", feature = "mobile"), not(feature = "web")))]
pub use native_audio::{spawn, SpawnHandle};
pub use connect::{spawn, SpawnHandle};
#[cfg(all(
not(feature = "desktop"),
not(feature = "mobile"),
not(feature = "web")
))]
pub use stub::{spawn, SpawnHandle};
#[cfg(feature = "web")]
pub use web::{spawn, SpawnHandle};
/// Compile-time assertion that CurrentPlatform implements Platform.
// =======================
// Compile-time Assertions
// =======================
const _: () = {
fn assert_platform<T: PlatformInterface>() {}
let _ = assert_platform::<Platform>;
// Check each implementation, and prevent warnings that the implementations are unused.
#[cfg(feature = "web")]
let _ = assert_platform::<web::WebPlatform>;
#[cfg(feature = "desktop")]
let _ = assert_platform::<desktop::DesktopPlatform>;
#[cfg(feature = "mobile")]
let _ = assert_platform::<mobile::MobilePlatform>;
let _ = assert_platform::<stub::StubPlatform>;
};
-10
View File
@@ -6,16 +6,6 @@ use std::sync::Arc;
use std::sync::Mutex;
use tracing::{error, info, warn};
// =============
// Async runtime
// =============
pub use tokio::spawn;
pub type SpawnHandle = tokio::runtime::Handle;
// ============
// Audio System
// ============
pub struct NativeAudioSystem {
output: cpal::Device,
input: cpal::Device,
+117
View File
@@ -0,0 +1,117 @@
use crate::effects::AudioProcessor;
use color_eyre::eyre::Error;
use dioxus::hooks::UnboundedReceiver;
use mumble_web2_common::{ClientConfig, ServerStatus};
use std::future::Future;
pub struct StubPlatform;
impl super::PlatformInterface for StubPlatform {
type AudioSystem = StubAudioSystem;
fn init_logging() {
todo!()
}
fn request_permissions() {
todo!()
}
fn network_connect(
_address: String,
_username: String,
_event_rx: &mut UnboundedReceiver<crate::app::Command>,
_gui_config: &ClientConfig,
) -> impl Future<Output = Result<(), Error>> {
async { todo!() }
}
fn get_status(
_client: &reqwest::Client,
) -> impl Future<Output = color_eyre::Result<ServerStatus>> {
async { todo!() }
}
fn load_config() -> impl Future<Output = color_eyre::Result<ClientConfig>> {
async { todo!() }
}
fn load_username() -> Option<String> {
todo!()
}
fn load_server_url() -> Option<String> {
todo!()
}
fn set_default_username(_username: &str) -> Option<()> {
todo!()
}
fn set_default_server(_server: &str) -> Option<()> {
todo!()
}
fn sleep(_duration: std::time::Duration) -> impl Future<Output = ()> {
async { todo!() }
}
}
pub struct StubAudioSystem;
impl super::AudioSystemInterface for StubAudioSystem {
type AudioPlayer = StubAudioPlayer;
async fn new() -> Result<Self, Error> {
todo!()
}
fn set_processor(&self, _processor: AudioProcessor) {
todo!()
}
fn start_recording(
&mut self,
_each: impl FnMut(Vec<u8>, bool) + Send + 'static,
) -> Result<(), Error> {
todo!()
}
fn create_player(&mut self) -> Result<Self::AudioPlayer, Error> {
todo!()
}
}
pub struct StubAudioPlayer;
impl super::AudioPlayerInterface for StubAudioPlayer {
fn play_opus(&mut self, _payload: &[u8]) {
todo!()
}
}
#[allow(unused)]
pub struct SpawnHandle;
impl SpawnHandle {
#[allow(unused)]
pub fn spawn<F>(&self, _future: F)
where
F: Future<Output = ()> + 'static,
{
todo!()
}
#[allow(unused)]
pub fn current() -> Self {
SpawnHandle
}
}
#[allow(unused)]
pub fn spawn<F>(_future: F)
where
F: Future<Output = ()> + 'static,
{
todo!()
}
+2 -14
View File
@@ -38,18 +38,10 @@ use web_sys::WorkletOptions;
use web_sys::{console, window};
use web_sys::{AudioContext, AudioDataCopyToOptions};
pub trait ImpRead: AsyncRead + Unpin + 'static {}
impl<T: AsyncRead + Unpin + 'static> ImpRead for T {}
pub trait ImpWrite: AsyncWrite + Unpin + 'static {}
impl<T: AsyncWrite + Unpin + 'static> ImpWrite for T {}
// =============
// Async runtime
// =============
#[allow(unused)]
pub use wasm_bindgen_futures::spawn_local as spawn;
#[allow(unused)]
#[derive(Clone)]
pub struct SpawnHandle;
@@ -66,10 +58,6 @@ impl SpawnHandle {
}
}
// ============================================================================
// Platform Struct
// ============================================================================
/// Web platform implementation using WebTransport and Web Audio API.
pub struct WebPlatform;