From 2b0debfdfaed3179f74cc6611a55db71d7ca6130 Mon Sep 17 00:00:00 2001 From: increasing Date: Tue, 12 May 2026 16:49:47 +0200 Subject: [PATCH] cleanup deps --- Cargo.lock | 321 +---------------------------------- Cargo.toml | 9 +- examples/live_note.rs | 22 ++- examples/pattern_playback.rs | 22 ++- examples/render.rs | 2 +- src/audio_processing/mod.rs | 24 ++- src/lib.rs | 18 +- src/live_audio.rs | 81 +++------ 8 files changed, 73 insertions(+), 426 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d1845f2..2457de5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -116,125 +116,12 @@ dependencies = [ "windows", ] -[[package]] -name = "dasp" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7381b67da416b639690ac77c73b86a7b5e64a29e31d1f75fb3b1102301ef355a" -dependencies = [ - "dasp_envelope", - "dasp_frame", - "dasp_interpolate", - "dasp_peak", - "dasp_ring_buffer", - "dasp_rms", - "dasp_sample", - "dasp_signal", - "dasp_slice", - "dasp_window", -] - -[[package]] -name = "dasp_envelope" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ec617ce7016f101a87fe85ed44180839744265fae73bb4aa43e7ece1b7668b6" -dependencies = [ - "dasp_frame", - "dasp_peak", - "dasp_ring_buffer", - "dasp_rms", - "dasp_sample", -] - -[[package]] -name = "dasp_frame" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a3937f5fe2135702897535c8d4a5553f8b116f76c1529088797f2eee7c5cd6" -dependencies = [ - "dasp_sample", -] - -[[package]] -name = "dasp_interpolate" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc975a6563bb7ca7ec0a6c784ead49983a21c24835b0bc96eea11ee407c7486" -dependencies = [ - "dasp_frame", - "dasp_ring_buffer", - "dasp_sample", -] - -[[package]] -name = "dasp_peak" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cf88559d79c21f3d8523d91250c397f9a15b5fc72fbb3f87fdb0a37b79915bf" -dependencies = [ - "dasp_frame", - "dasp_sample", -] - -[[package]] -name = "dasp_ring_buffer" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07d79e19b89618a543c4adec9c5a347fe378a19041699b3278e616e387511ea1" - -[[package]] -name = "dasp_rms" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6c5dcb30b7e5014486e2822537ea2beae50b19722ffe2ed7549ab03774575aa" -dependencies = [ - "dasp_frame", - "dasp_ring_buffer", - "dasp_sample", -] - [[package]] name = "dasp_sample" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" -[[package]] -name = "dasp_signal" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa1ab7d01689c6ed4eae3d38fe1cea08cba761573fbd2d592528d55b421077e7" -dependencies = [ - "dasp_envelope", - "dasp_frame", - "dasp_interpolate", - "dasp_peak", - "dasp_ring_buffer", - "dasp_rms", - "dasp_sample", - "dasp_window", -] - -[[package]] -name = "dasp_slice" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e1c7335d58e7baedafa516cb361360ff38d6f4d3f9d9d5ee2a2fc8e27178fa1" -dependencies = [ - "dasp_frame", - "dasp_sample", -] - -[[package]] -name = "dasp_window" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99ded7b88821d2ce4e8b842c9f1c86ac911891ab89443cc1de750cae764c5076" -dependencies = [ - "dasp_sample", -] - [[package]] name = "dispatch2" version = "0.3.0" @@ -251,46 +138,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" -[[package]] -name = "errno" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" -dependencies = [ - "libc", - "windows-sys 0.60.2", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "getrandom" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi", -] - [[package]] name = "hashbrown" version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - [[package]] name = "hound" version = "3.5.1" @@ -345,12 +198,6 @@ version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" - [[package]] name = "log" version = "0.4.27" @@ -421,16 +268,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "num_enum" version = "0.7.4" @@ -564,12 +401,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - [[package]] name = "rt-write-lock" version = "0.1.0" @@ -582,49 +413,6 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad8388ea1a9e0ea807e442e8263a699e7edcb320ecbcd21b4fa8ff859acce3ba" -[[package]] -name = "rtsan-standalone" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6a4b90a2bb001ee7995beb43c38b9ed112660936ae2183d462ee5e794a1b59" -dependencies = [ - "rtsan-standalone-macros", - "rtsan-standalone-sys", -] - -[[package]] -name = "rtsan-standalone-macros" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "849bff7a4ddb988fd4daa20f818e7cd699195ac81c9a6f2372444e04ba88e71e" -dependencies = [ - "quote", - "syn", -] - -[[package]] -name = "rtsan-standalone-sys" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b463f269f93c0e4be0e325b3a3fe46b3948992d36b37c8a5d949e9b903d9294" -dependencies = [ - "num_cpus", - "tempfile", -] - -[[package]] -name = "rustix" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" -dependencies = [ - "bitflags 2.9.1", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.60.2", -] - [[package]] name = "rustversion" version = "1.0.21" @@ -657,19 +445,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "tempfile" -version = "3.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" -dependencies = [ - "fastrand", - "getrandom", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - [[package]] name = "thiserror" version = "1.0.69" @@ -712,11 +487,10 @@ name = "torque-tracker-engine" version = "0.2.0" dependencies = [ "cpal", - "dasp", + "dasp_sample", "hound", "rt-write-lock", "rtrb", - "rtsan-standalone", "simple-left-right", "triomphe", ] @@ -743,15 +517,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" -dependencies = [ - "wit-bindgen-rt", -] - [[package]] name = "wasm-bindgen" version = "0.2.100" @@ -889,15 +654,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.2", -] - [[package]] name = "windows-targets" version = "0.42.2" @@ -922,29 +678,13 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", + "windows_i686_gnullvm", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] -[[package]] -name = "windows-targets" -version = "0.53.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" -dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -] - [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -957,12 +697,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -975,12 +709,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -993,24 +721,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -1023,12 +739,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -1041,12 +751,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -1059,12 +763,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -1077,12 +775,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - [[package]] name = "winnow" version = "0.7.12" @@ -1091,12 +783,3 @@ checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] - -[[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.1", -] diff --git a/Cargo.toml b/Cargo.toml index e9d47a6..d5b9acc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,23 +2,24 @@ name = "torque-tracker-engine" version = "0.2.0" edition = "2024" -authors = ["Lucas Baumann"] rust-version = "1.89" license = "MPL-2.0" description = "Audio Backend for Torque Tracker, an old school music tracker" -keywords = ["audio", "interactive"] +keywords = ["audio", "interactive", "no_std"] categories = ["multimedia::audio"] repository = "https://tangled.sh/did:plc:54jgbo4psy24qu2bk4njtpc4/torque-tracker-engine" [dependencies] -dasp = { version = "0.11.0", default-features = false, features = ["std"] } rtrb = "0.3.1" -rtsan-standalone = "0.2.0" simple-left-right = "0.2.3" triomphe = {version = "0.1.15", default-features = false } rt-write-lock = "0.1.0" +[features] +rtsan = [] + [dev-dependencies] +dasp_sample = "0.11.0" hound = "3.5.1" cpal = "0.16.0" diff --git a/examples/live_note.rs b/examples/live_note.rs index 9e8b628..20e332d 100644 --- a/examples/live_note.rs +++ b/examples/live_note.rs @@ -1,7 +1,4 @@ -use std::{ - num::{NonZero, NonZeroU16}, - time::Duration, -}; +use std::{num::NonZero, time::Duration}; use cpal::traits::{DeviceTrait, HostTrait}; use torque_tracker_engine::{ @@ -23,7 +20,7 @@ fn main() { assert!(spec.channels == 1); let sample_data = reader .samples::() - .map(|result| ::from_sample(result.unwrap())); + .map(|result| ::from_sample(result.unwrap())); let sample = Sample::new_mono(sample_data); let meta = SampleMetaData { sample_rate: NonZero::new(spec.sample_rate).unwrap(), @@ -50,16 +47,25 @@ fn main() { println!("device: {:?}", default_device.name()); let config = OutputConfig { buffer_size: 2048, - channel_count: NonZeroU16::new(2).unwrap(), sample_rate: NonZero::new(default_config.sample_rate().0).unwrap(), interpolation: Interpolation::Quadratic, }; - let (mut audio_callback, _, _, mut send) = manager.get_callback::(config, ()); + let (mut audio_callback, _, _, mut send) = manager.get_callback::<()>(config, ()); let stream = default_device .build_output_stream( &default_config.config(), - move |data, _| audio_callback(data, ()), + move |data, _| { + if let Some(finished) = audio_callback.render(data.len(), ()) { + let (stereo, []) = data.as_chunks_mut::<2>() else { + panic!(); + }; + stereo + .iter_mut() + .zip(finished.iter().copied()) + .for_each(|(out, rendered)| *out = rendered.into()); + } + }, |e| eprintln!("{e:?}"), None, ) diff --git a/examples/pattern_playback.rs b/examples/pattern_playback.rs index a12d9d1..4b871a9 100644 --- a/examples/pattern_playback.rs +++ b/examples/pattern_playback.rs @@ -1,7 +1,4 @@ -use std::{ - num::{NonZero, NonZeroU16}, - time::Duration, -}; +use std::{num::NonZero, time::Duration}; use cpal::traits::{DeviceTrait, HostTrait}; use torque_tracker_engine::{ @@ -24,7 +21,7 @@ fn main() { assert!(spec.channels == 1); let sample_data = reader .samples::() - .map(|result| ::from_sample(result.unwrap())); + .map(|result| ::from_sample(result.unwrap())); let sample = Sample::new_mono(sample_data); let meta = SampleMetaData { sample_rate: NonZero::new(spec.sample_rate).unwrap(), @@ -69,16 +66,25 @@ fn main() { println!("device: {:?}", default_device.name()); let config = OutputConfig { buffer_size: 1024, - channel_count: NonZeroU16::new(2).unwrap(), sample_rate: NonZero::new(default_config.sample_rate().0).unwrap(), interpolation: Interpolation::Linear, }; - let (mut callback, _, mut status, mut send) = manager.get_callback::(config, ()); + let (mut callback, _, mut status, mut send) = manager.get_callback::<()>(config, ()); let _stream = default_device .build_output_stream( &default_config.config(), - move |data, _| callback(data, ()), + move |data, _| { + if let Some(finished) = callback.render(data.len(), ()) { + let (stereo, []) = data.as_chunks_mut::<2>() else { + panic!(); + }; + stereo + .iter_mut() + .zip(finished.iter().copied()) + .for_each(|(out, rendered)| *out = rendered.into()); + } + }, |e| eprintln!("{e:?}"), None, ) diff --git a/examples/render.rs b/examples/render.rs index f8526bb..4cd41bf 100644 --- a/examples/render.rs +++ b/examples/render.rs @@ -19,7 +19,7 @@ fn main() { assert!(spec.channels == 1); let sample_data = reader .samples::() - .map(|result| ::from_sample(result.unwrap())); + .map(|result| ::from_sample(result.unwrap())); let sample = Sample::new_mono(sample_data); let meta = SampleMetaData { diff --git a/src/audio_processing/mod.rs b/src/audio_processing/mod.rs index 4ab9b4b..8e957d9 100644 --- a/src/audio_processing/mod.rs +++ b/src/audio_processing/mod.rs @@ -1,11 +1,9 @@ use core::{ - array, iter, + iter, ops::{self, Div, DivAssign, IndexMut}, slice, }; -use dasp::sample::ToSample; - pub(crate) mod instrument; pub mod playback; pub(crate) mod sample; @@ -89,6 +87,12 @@ impl iter::Sum for Frame { } } +impl Into<[f32; 2]> for Frame { + fn into(self) -> [f32; 2] { + self.0 + } +} + impl From<[f32; 2]> for Frame { fn from(value: [f32; 2]) -> Self { Self(value) @@ -102,14 +106,6 @@ impl From for Frame { } impl Frame { - // split into left and right. - pub fn split_array(value: [Frame; N]) -> ([f32; N], [f32; N]) { - ( - array::from_fn(|i| value[i].0[0]), - array::from_fn(|i| value[i].0[1]), - ) - } - pub fn sum_to_mono(self) -> f32 { self.0[0] + self.0[1] } @@ -134,9 +130,9 @@ impl Frame { unsafe { core::mem::transmute::<&'a [f32; 2], &'a Self>(value) } } - pub fn to_sample>(self) -> [S; 2] { - [self.0[0].to_sample_(), self.0[1].to_sample_()] - } + // pub fn to_sample>(self) -> [S; 2] { + // [self.0[0].to_sample_(), self.0[1].to_sample_()] + // } pub fn to_raw<'a>(into: &mut [Self]) -> &'a mut [[f32; 2]] { // TODO: use from/into_raw_parts diff --git a/src/lib.rs b/src/lib.rs index b8dd1b1..57da748 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,5 @@ #![no_std] +#![cfg_attr(feature = "rtsan", feature(sanitize))] pub mod audio_processing; pub mod file; @@ -6,12 +7,7 @@ mod live_audio; pub mod project; pub mod sample; -use core::{ - fmt::Debug, - num::{NonZero, NonZeroU16}, - ops::Deref, - time::Duration, -}; +use core::{fmt::Debug, num::NonZero, ops::Deref, time::Duration}; extern crate alloc; @@ -142,15 +138,12 @@ impl AudioManager { /// ## Panics /// /// Will panic if there is an active stream. - pub fn get_callback< - Sample: dasp::sample::Sample + dasp::sample::FromSample, - StreamData: Clone, - >( + pub fn get_callback( &mut self, config: OutputConfig, initial_stream_data: StreamData, ) -> ( - impl FnMut(&mut [Sample], StreamData) + use, + LiveAudio, Duration, StatusRecv, StreamSend, @@ -174,7 +167,7 @@ impl AudioManager { self.buffer_time = buffer_time; ( - audio_worker.get_typed_callback(), + audio_worker, buffer_time, StatusRecv(from_worker), StreamSend(to_worker.0), @@ -217,7 +210,6 @@ impl SongEdit<'_> { #[derive(Debug, Clone, Copy)] pub struct OutputConfig { pub buffer_size: u32, - pub channel_count: NonZeroU16, pub sample_rate: NonZero, pub interpolation: Interpolation, } diff --git a/src/live_audio.rs b/src/live_audio.rs index 77697d4..465ad35 100644 --- a/src/live_audio.rs +++ b/src/live_audio.rs @@ -9,10 +9,9 @@ use crate::sample::Sample; use crate::{OutputConfig, ToWorkerMsg}; use alloc::boxed::Box; use alloc::vec; -use dasp::sample::ToSample; use simple_left_right::Reader; -pub(crate) struct LiveAudio { +pub struct LiveAudio { song: Reader, playback_state: Option, live_note: Option, @@ -25,7 +24,7 @@ pub(crate) struct LiveAudio { impl LiveAudio { /// Not realtime safe. - pub fn new( + pub(crate) fn new( song: Reader, manager: rtrb::Consumer, state_sender: rt_write_lock::Writer<(Option, S)>, @@ -42,7 +41,7 @@ impl LiveAudio { } } - #[rtsan_standalone::nonblocking] + #[cfg_attr(feature = "rtsan", sanitize(realtime = "nonblocking"))] fn send_state(&mut self, stream_data: S) { let playback_state = self.playback_state.as_ref().map(|s| s.get_status()); let mut write_guard = self.state_sender.write(); @@ -50,7 +49,7 @@ impl LiveAudio { *write_guard = (playback_state, stream_data); } - #[rtsan_standalone::nonblocking] + #[cfg_attr(feature = "rtsan", sanitize(realtime = "nonblocking"))] /// returns true if work was done fn fill_internal_buffer(&mut self, len: usize) -> bool { // the output buffer should be smaller than the internal buffer @@ -158,64 +157,28 @@ impl LiveAudio { true } - /// converts the internal buffer to any possible output format and channel count - /// sums stereo to mono and fills channels 3 and up with silence - #[rtsan_standalone::nonblocking] - #[inline] - fn fill_from_internal>( - &mut self, - data: &mut [Sample], - ) { - // convert the internal buffer and move it to the out_buffer - if self.config.channel_count.get() == 1 { - data.iter_mut() - .zip(self.buffer.iter()) - .for_each(|(out, buf)| *out = buf.sum_to_mono().to_sample_()); + pub fn render(&mut self, required_len: usize, stream_data: S) -> Option<&[Frame]> { + assert!(required_len <= self.buffer.len()); + let worked = self.fill_internal_buffer(required_len); + self.send_state(stream_data); + if worked { + Some(&self.buffer[..required_len]) } else { - data.chunks_exact_mut(usize::from(self.config.channel_count.get())) - .map(|frame| frame.split_first_chunk_mut::<2>().unwrap().0) - .zip(self.buffer.iter()) - .for_each(|(out, buf)| *out = buf.to_sample()); + None } } - // unsure wether i want to use this or untyped_callback - // also relevant when cpal gets made into a generic that maybe this gets useful - pub fn get_typed_callback>( - mut self, - ) -> impl FnMut(&mut [Sample], S) { - move |audio_data, stream_data| { - let channel_count = usize::from(self.config.channel_count.get()); - assert!(audio_data.len().is_multiple_of(channel_count)); - let out_frames = audio_data.len() / channel_count; - assert!(self.buffer.len() > out_frames); - // assert_eq!( - // data.len(), - // usize::try_from(self.config.buffer_size).unwrap() - // * usize::from(self.config.channel_count.get()) - // ); - - if self.fill_internal_buffer(out_frames) { - self.fill_from_internal(audio_data); - } - self.send_state(stream_data); - } - // move |data, info| { - // assert_eq!( - // data.len(), - // usize::try_from(self.config.buffer_size).unwrap() - // * usize::from(self.config.channel_count.get()) - // ); - // self.send_state(Some(info)); - // } - } - - // pub fn get_callback(mut self) -> impl FnMut(&mut [Frame], S::BufferInformation) { - // move |data, info| { - // assert_eq!(data.len(), self.config.buffer_size as usize * self.config.channel_count.get() as usize) - - // if self.fill_internal_buffer() { - // self.fill_from_internal(data); + // // unsure wether i want to use this or untyped_callback + // // also relevant when cpal gets made into a generic that maybe this gets useful + // pub fn get_typed(mut self) -> impl FnMut(usize, S) -> Option<&[Frame]> { + // move |required_len, stream_data| { + // assert!(self.buffer.len() > required_len); + // self.send_state(stream_data); + + // if self.fill_internal_buffer(required_len) { + // return Some(&self.buffer[..required_len]); + // } else { + // None // } // } // } -- 2.51.2