# Summary
Introduces a trait-based platform abstraction layer that makes the boundary
between platform-specific and shared code explicit and compile-time verified.
The TLDR version of this new trait stuff works:
1. Define a `PlatformInterface` trait.
2. Each platform defines a zero-sized struct implementing the trait (ex `WebPlatform`).
3. Create an ifdef'd type alias on those structs:
```rust
#[cfg(feature = "web")]
pub type Platform = web::WebPlatform;
#[cfg(all(feature = "desktop"))]
pub type Platform = desktop::DesktopPlatform;
#[cfg(all(feature = "mobile", not(feature = "web")))]
pub type Platform = mobile::MobilePlatform;
```
5. Add a compile time assertion that `Platform` implements `PlatformInterface`.
# Motivation
Previously, platform code used a mix of pub use re-exports and #[cfg] blocks
that made it difficult to understand what each platform must implement. The
new trait-based approach provides:
- Clear documentation of the platform contract
- Compile-time verification that all platforms implement required
functionality
- Ability to cargo check without feature flags (via stub platform)
# Changes
New traits in imp/mod.rs:
- PlatformInterface - logging, permissions, network, config, storage. Overall this the trait that platforms must satify to compile.
- AudioSystemInterface - audio system initialization and recording
- AudioPlayerInterface - opus audio playback
Type aliases:
- Platform, AudioSystem, AudioPlayer resolve to the correct types based on
feature flags
Call site updates:
- Changed from imp::function() to Platform::function() syntax
- Removed ImpRead/ImpWrite helper traits in favor of direct bounds
# Testing
Manual testing reveals that Web and Desktop still work, I (Liam) have not tested the mobile version beyond compilation.
Co-authored-by: Liam Warfield <liam.warfield@gmail.com>
Reviewed-on: #18
Co-authored-by: Sam Sartor <me@samsartor.com>
Co-committed-by: Sam Sartor <me@samsartor.com>
(Turns out not) Pretty simple, if the average amplitude is under a certain value clear
out the buffer! The value I chose (.001) was an arbitrary value I got
from printf debugging. I was able to show that this worked pretty well
on the desktop session. Hopefully we'll add this to the settings page at
some point.
Once the app has been under that threshold for more than 200ms, we stop transmitting and send a terminator packet.
Reviewed-on: #13
Reviewed-by: restitux <restitux@ohea.xyz>
Remove public_url config option
Use proxy_url instead for example configs
Get status from relative endpoint, like /config
Show version on login page
Reviewed-on: #5
Co-authored-by: Sam Sartor <me@samsartor.com>
Co-committed-by: Sam Sartor <me@samsartor.com>
Reviewed-on: #3
Automatically choose supported profile
Play stream once created
Co-authored-by: Sam Sartor <me@samsartor.com>
Co-committed-by: Sam Sartor <me@samsartor.com>