From d25511112b48a010336ffe4471283ce649b9f0b7 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Tue, 21 Apr 2026 13:37:21 +0200 Subject: [PATCH 01/33] add bench for process --- RustApp/benches/audio.rs | 58 +++++++++++++++++++++++++++++++++++----- RustApp/src/audio/mod.rs | 6 ++--- 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/RustApp/benches/audio.rs b/RustApp/benches/audio.rs index e5c6ecb3..0e29f80f 100644 --- a/RustApp/benches/audio.rs +++ b/RustApp/benches/audio.rs @@ -1,6 +1,10 @@ use std::io::Write; -use android_mic::audio::player::process_audio; +use android_mic::{ + audio::{AudioPacketFormat, AudioProcessParams, player::process_audio}, + config::{AudioEffect, AudioFormat, ChannelCount, SampleRate}, + streamer::{AudioPacketMessage, AudioStream}, +}; use criterion::{Criterion, criterion_group, criterion_main}; use rtrb::{Producer, RingBuffer}; @@ -20,11 +24,11 @@ fn feed_producer(producer: &mut Producer, src: &[u8]) { producer.write(src).unwrap(); } -fn bench_audio(c: &mut Criterion) { - c.bench_function("audio_processing", |b| { - let shared_buffer_size = 48000 * 2; +const SHARED_BUFFER_SIZE: usize = 48000 * 2; - let (mut producer, mut consumer) = RingBuffer::::new(shared_buffer_size); +fn bench_player(c: &mut Criterion) { + c.bench_function("bench_player", |b| { + let (mut producer, mut consumer) = RingBuffer::::new(SHARED_BUFFER_SIZE); // pre-fill fake audio buffer let mut output = vec![0i16; 480 * 2]; @@ -39,5 +43,47 @@ fn bench_audio(c: &mut Criterion) { }); } -criterion_group!(benches, bench_audio); +fn bench_process(c: &mut Criterion) { + c.bench_function("bench_process", |b| { + let (producer, mut consumer) = RingBuffer::::new(SHARED_BUFFER_SIZE); + + let audio_params = AudioProcessParams { + target_format: AudioPacketFormat { + sample_rate: SampleRate::S48000, + audio_format: AudioFormat::I16, + channel_count: ChannelCount::Mono, + }, + denoise: None, + amplify: None, + post_effect: AudioEffect::NoEffect, + speex_noise_suppress: -30, + speex_vad_enabled: false, + speex_vad_threshold: 80, + speex_agc_enabled: false, + speex_agc_target: 8000, + speex_dereverb_enabled: false, + speex_dereverb_level: 0.5, + }; + + let mut audio_stream = AudioStream::new(producer, audio_params, false); + + b.iter(|| { + let source = make_random(3840); + + let packet = AudioPacketMessage { + buffer: source, + sample_rate: 48000, + channel_count: 1, + audio_format: 2, + }; + + audio_stream.process_audio_packet(packet).unwrap(); + + let chunk = consumer.read_chunk(consumer.slots()).unwrap(); + chunk.commit_all(); + }); + }); +} + +criterion_group!(benches, bench_player, bench_process); criterion_main!(benches); diff --git a/RustApp/src/audio/mod.rs b/RustApp/src/audio/mod.rs index 5f02f366..67f35f64 100644 --- a/RustApp/src/audio/mod.rs +++ b/RustApp/src/audio/mod.rs @@ -285,7 +285,7 @@ impl AudioBytes for u32 { #[derive(Debug, Clone)] pub struct AudioPacketFormat { - sample_rate: SampleRate, - audio_format: AudioFormat, - channel_count: ChannelCount, + pub sample_rate: SampleRate, + pub audio_format: AudioFormat, + pub channel_count: ChannelCount, } From 10bfe7430831716c6cc7cad33d3ce8b7236eeca8 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Tue, 21 Apr 2026 13:11:47 +0200 Subject: [PATCH 02/33] remove some indice check --- RustApp/src/audio/process.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/RustApp/src/audio/process.rs b/RustApp/src/audio/process.rs index fba4a41e..c0f1ecdc 100644 --- a/RustApp/src/audio/process.rs +++ b/RustApp/src/audio/process.rs @@ -225,13 +225,11 @@ where for buf in packet .buffer - .chunks_exact(audio_format.sample_size() * channel_count) + .chunks_exact(audio_format.sample_size()) { - for channel in 0..channel_count { - let start = channel * audio_format.sample_size(); - let end = start + audio_format.sample_size(); - let sample = F::from_bytes(&buf[start..end]).to_f32(); - result[channel].push(sample); + for result in &mut result { + let sample = F::from_bytes(buf).to_f32(); + result.push(sample); } } From 66f6f4a37f60f4e63e00acf68f12d7a3ca8b89c0 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Tue, 21 Apr 2026 17:13:23 +0200 Subject: [PATCH 03/33] remove some unwrap --- RustApp/src/audio/resampler.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/RustApp/src/audio/resampler.rs b/RustApp/src/audio/resampler.rs index c5b69cbe..1f7d0d6c 100644 --- a/RustApp/src/audio/resampler.rs +++ b/RustApp/src/audio/resampler.rs @@ -22,11 +22,14 @@ pub fn resample_f32_stream( let resample_ratio = output_sample_rate as f64 / input_sample_rate as f64; let mut resampler_cache = RESAMPLER_CACHE.lock().unwrap(); - if resampler_cache.is_none() - || resampler_cache.as_ref().unwrap().input_rate != input_sample_rate - || resampler_cache.as_ref().unwrap().output_rate != output_sample_rate - || resampler_cache.as_ref().unwrap().num_channels != data.len() - { + if match resampler_cache.as_ref() { + Some(c) => { + c.input_rate != input_sample_rate + || c.output_rate != output_sample_rate + || c.num_channels != data.len() + } + None => true, + } { let resampler = rubato::FastFixedIn::::new( resample_ratio, 1.0, From f8d39556ae4e22f933daf9ce9eec5dbf0eb04f89 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Tue, 21 Apr 2026 18:51:58 +0200 Subject: [PATCH 04/33] Update resampler.rs --- RustApp/src/audio/resampler.rs | 45 +++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/RustApp/src/audio/resampler.rs b/RustApp/src/audio/resampler.rs index 1f7d0d6c..c4142b36 100644 --- a/RustApp/src/audio/resampler.rs +++ b/RustApp/src/audio/resampler.rs @@ -6,7 +6,6 @@ struct ResamplerCache { input_rate: u32, output_rate: u32, num_channels: usize, - sample_buffer: Vec>, resampler: rubato::FastFixedIn, } @@ -42,35 +41,41 @@ pub fn resample_f32_stream( input_rate: input_sample_rate, output_rate: output_sample_rate, num_channels: data.len(), - sample_buffer: vec![Vec::with_capacity(chunk_size); data.len()], resampler, }); } let cache = resampler_cache.as_mut().unwrap(); - let mut output: Vec> = vec![Vec::new(); data.len()]; - // Append new data into the cache - for channel_idx in 0..data.len() { - cache.sample_buffer[channel_idx].extend_from_slice(&data[channel_idx]); - } + let mut chunk_output: Vec> = cache.resampler.output_buffer_allocate(true); - while cache.sample_buffer[0].len() >= chunk_size { - let chunk_output = cache.resampler.process(&cache.sample_buffer, None)?; + let mut output: Vec> = + vec![Vec::with_capacity(chunk_output[0].len() * data[0].len() / chunk_size); data.len()]; - // Clear the sample buffer for the next round - for channel in &mut cache.sample_buffer { - channel.drain(0..chunk_size); - } + let mut data = data + .iter() + .map(|e| e.chunks_exact(chunk_size)) + .collect::>(); - // Append the resampled data to the output - for (channel_idx, channel_data) in chunk_output.iter().enumerate() { - if channel_idx < output.len() { - output[channel_idx].extend_from_slice(channel_data); + let mut buffer = Vec::with_capacity(data.len()); + + loop { + for chunk in &mut data { + if let Some(chunk) = chunk.next() { + buffer.push(chunk); + } else { + return Ok(output); } } - } - // For each channel, skip the delay samples - Ok(output) + let (_, frames) = cache + .resampler + .process_into_buffer(&buffer, &mut chunk_output, None)?; + + for (output, chunk) in output.iter_mut().zip(chunk_output.iter()) { + output.extend_from_slice(&chunk[..frames]); + } + + buffer.clear(); + } } From 7a19ce43ae97ae4a799579ccdfd732791d18ea5f Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Tue, 21 Apr 2026 19:48:52 +0200 Subject: [PATCH 05/33] fix --- RustApp/src/audio/resampler.rs | 61 +++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 9 deletions(-) diff --git a/RustApp/src/audio/resampler.rs b/RustApp/src/audio/resampler.rs index c4142b36..ec27667f 100644 --- a/RustApp/src/audio/resampler.rs +++ b/RustApp/src/audio/resampler.rs @@ -6,6 +6,8 @@ struct ResamplerCache { input_rate: u32, output_rate: u32, num_channels: usize, + unprocessed_buffer: Vec>, + output_buffer: Vec>, resampler: rubato::FastFixedIn, } @@ -41,38 +43,79 @@ pub fn resample_f32_stream( input_rate: input_sample_rate, output_rate: output_sample_rate, num_channels: data.len(), + unprocessed_buffer: vec![Vec::new(); data.len()], + output_buffer: resampler.output_buffer_allocate(true), resampler, }); } let cache = resampler_cache.as_mut().unwrap(); - let mut chunk_output: Vec> = cache.resampler.output_buffer_allocate(true); - let mut output: Vec> = - vec![Vec::with_capacity(chunk_output[0].len() * data[0].len() / chunk_size); data.len()]; + vec![ + Vec::with_capacity(cache.output_buffer[0].len() * data[0].len() / chunk_size); + data.len() + ]; + + let start = if !cache.unprocessed_buffer[0].is_empty() { + let missing = chunk_size - cache.unprocessed_buffer[0].len(); + if data[0].len() >= missing { + for (data, unprocessed_buffer) in data.iter().zip(cache.unprocessed_buffer.iter_mut()) { + unprocessed_buffer.extend_from_slice(&data[0..missing]); + } + + let (_, frames) = cache.resampler.process_into_buffer( + &cache.unprocessed_buffer, + &mut cache.output_buffer, + None, + )?; + + for (output, chunk) in output.iter_mut().zip(cache.output_buffer.iter()) { + output.extend_from_slice(&chunk[..frames]); + } + + for channel in &mut cache.unprocessed_buffer { + channel.clear(); + } + missing + } else { + 0 + } + } else { + 0 + }; let mut data = data .iter() - .map(|e| e.chunks_exact(chunk_size)) + .map(|channel_data| channel_data[start..].chunks_exact(chunk_size)) .collect::>(); let mut buffer = Vec::with_capacity(data.len()); + let mut done = false; loop { for chunk in &mut data { if let Some(chunk) = chunk.next() { buffer.push(chunk); } else { - return Ok(output); + done = true; + } + } + + if done { + for (chunk, unprocessed_buffer) in data.iter().zip(cache.unprocessed_buffer.iter_mut()) + { + unprocessed_buffer.extend_from_slice(chunk.remainder()); } + return Ok(output); } - let (_, frames) = cache - .resampler - .process_into_buffer(&buffer, &mut chunk_output, None)?; + let (_, frames) = + cache + .resampler + .process_into_buffer(&buffer, &mut cache.output_buffer, None)?; - for (output, chunk) in output.iter_mut().zip(chunk_output.iter()) { + for (output, chunk) in output.iter_mut().zip(cache.output_buffer.iter()) { output.extend_from_slice(&chunk[..frames]); } From b0a32c2f516c4280ea108c69bf453249917f068d Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Tue, 21 Apr 2026 20:04:53 +0200 Subject: [PATCH 06/33] add bench for resampling --- RustApp/benches/audio.rs | 38 +++++++++++++++++++++++++++--------- RustApp/src/audio/mod.rs | 2 +- RustApp/src/audio/process.rs | 2 +- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/RustApp/benches/audio.rs b/RustApp/benches/audio.rs index 0e29f80f..00c50e3a 100644 --- a/RustApp/benches/audio.rs +++ b/RustApp/benches/audio.rs @@ -1,12 +1,16 @@ use std::io::Write; use android_mic::{ - audio::{AudioPacketFormat, AudioProcessParams, player::process_audio}, + audio::{ + AudioPacketFormat, AudioProcessParams, player::process_audio, + process::convert_packet_to_f32, resampler::resample_f32_stream, + }, config::{AudioEffect, AudioFormat, ChannelCount, SampleRate}, streamer::{AudioPacketMessage, AudioStream}, }; use criterion::{Criterion, criterion_group, criterion_main}; -use rtrb::{Producer, RingBuffer}; + +use rtrb::RingBuffer; fn make_random(size: usize) -> Vec { use rand::rngs::StdRng; @@ -17,11 +21,8 @@ fn make_random(size: usize) -> Vec { let mut v = vec![0; size]; rng.fill_bytes(&mut v); - v -} -fn feed_producer(producer: &mut Producer, src: &[u8]) { - producer.write(src).unwrap(); + v } const SHARED_BUFFER_SIZE: usize = 48000 * 2; @@ -36,7 +37,7 @@ fn bench_player(c: &mut Criterion) { let source = make_random(48000); b.iter(|| { - feed_producer(&mut producer, &source); + producer.write(&source).unwrap(); process_audio::(&mut output, &mut consumer, 480); }); @@ -72,7 +73,7 @@ fn bench_process(c: &mut Criterion) { let packet = AudioPacketMessage { buffer: source, - sample_rate: 48000, + sample_rate: 44100, channel_count: 1, audio_format: 2, }; @@ -85,5 +86,24 @@ fn bench_process(c: &mut Criterion) { }); } -criterion_group!(benches, bench_player, bench_process); +fn bench_resampling(c: &mut Criterion) { + c.bench_function("bench_resampling", |b| { + let source = make_random(3840); + + let packet = AudioPacketMessage { + buffer: source, + sample_rate: 44100, + channel_count: 1, + audio_format: 2, + }; + + let buffer = convert_packet_to_f32(&packet).unwrap(); + + b.iter(|| { + resample_f32_stream(&buffer, 44100, 48000).unwrap(); + }); + }); +} + +criterion_group!(benches, bench_player, bench_process, bench_resampling); criterion_main!(benches); diff --git a/RustApp/src/audio/mod.rs b/RustApp/src/audio/mod.rs index 67f35f64..0ce45b86 100644 --- a/RustApp/src/audio/mod.rs +++ b/RustApp/src/audio/mod.rs @@ -12,7 +12,7 @@ mod denoise_rnnoise; pub mod player; mod postprocessing; pub mod process; -mod resampler; +pub mod resampler; mod speexdsp; /// Audio processing parameters diff --git a/RustApp/src/audio/process.rs b/RustApp/src/audio/process.rs index c0f1ecdc..41544a66 100644 --- a/RustApp/src/audio/process.rs +++ b/RustApp/src/audio/process.rs @@ -201,7 +201,7 @@ impl AudioStream { } } -fn convert_packet_to_f32(packet: &AudioPacketMessage) -> anyhow::Result>> { +pub fn convert_packet_to_f32(packet: &AudioPacketMessage) -> anyhow::Result>> { let audio_format = AudioFormat::from_android_format(packet.audio_format).unwrap(); match audio_format { AudioFormat::U8 => convert_packet_to_f32_internal::(packet), From 0136dc89fd19bd77243e196a1190019f056d79bf Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Wed, 22 Apr 2026 18:11:54 +0200 Subject: [PATCH 07/33] update deps --- RustApp/Cargo.lock | 1582 +++++++++++++++++++++++--------------------- RustApp/Cargo.toml | 8 +- 2 files changed, 840 insertions(+), 750 deletions(-) diff --git a/RustApp/Cargo.lock b/RustApp/Cargo.lock index 8b2d1461..3b771eb7 100644 --- a/RustApp/Cargo.lock +++ b/RustApp/Cargo.lock @@ -98,15 +98,6 @@ dependencies = [ "winit", ] -[[package]] -name = "addr2line" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" -dependencies = [ - "gimli", -] - [[package]] name = "adler2" version = "2.0.1" @@ -164,21 +155,21 @@ checksum = "3aa2999eb46af81abb65c2d30d446778d7e613b60bbf4e174a027e80f90a3c14" [[package]] name = "alsa" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c88dbbce13b232b26250e1e2e6ac18b6a891a646b8148285036ebce260ac5c3" +checksum = "812947049edcd670a82cd5c73c3661d2e58468577ba8489de58e1a73c04cbd5d" dependencies = [ "alsa-sys", - "bitflags 2.10.0", + "bitflags 2.11.1", "cfg-if", "libc", ] [[package]] name = "alsa-sys" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +checksum = "ad7569085a265dd3f607ebecce7458eaab2132a84393534c95b18dcbc3f31e04" dependencies = [ "libc", "pkg-config", @@ -186,23 +177,21 @@ dependencies = [ [[package]] name = "android-activity" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" +checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" dependencies = [ "android-properties", - "bitflags 2.10.0", + "bitflags 2.11.1", "cc", - "cesu8", - "jni", - "jni-sys", + "jni 0.22.4", "libc", "log", "ndk", "ndk-context", "ndk-sys 0.6.0+11769913", "num_enum", - "thiserror 1.0.69", + "thiserror 2.0.18", ] [[package]] @@ -215,7 +204,7 @@ dependencies = [ "cached", "cargo-packager-resource-resolver", "chrono", - "clap 4.5.56", + "clap 4.6.1", "constcat", "cpal", "criterion", @@ -242,7 +231,7 @@ dependencies = [ "prost", "prost-build", "rand 0.10.1", - "resvg 0.46.0", + "resvg 0.47.0", "rtrb", "rubato", "rust-embed", @@ -281,9 +270,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.21" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", @@ -296,15 +285,15 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] @@ -331,12 +320,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" -dependencies = [ - "backtrace", -] +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "anymap3" @@ -361,9 +347,9 @@ dependencies = [ [[package]] name = "arc-swap" -version = "1.8.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ded5f9a03ac8f24d1b8a25101ee812cd32cdc8c50a4c50237de2c4915850e73" +checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" dependencies = [ "rustversion", ] @@ -410,30 +396,30 @@ dependencies = [ "enumflags2", "futures-channel", "futures-util", - "rand 0.9.2", + "rand 0.9.4", "raw-window-handle", "serde", "serde_repr", "tokio", "url", - "zbus 5.13.2", + "zbus 5.14.0", ] [[package]] name = "ashpd" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "618a409b91d5265798a99e3d1d0b226911605e581c4e7255e83c1e397b172bce" +checksum = "33a3c86f3fd70c0ffa500ed189abfa90b5a52398a45d5dc372fcc38ebeb7a645" dependencies = [ "enumflags2", "futures-channel", "futures-util", - "rand 0.9.2", + "rand 0.9.4", "serde", "serde_repr", "tokio", "url", - "zbus 5.13.2", + "zbus 5.14.0", ] [[package]] @@ -472,13 +458,13 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.3" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" dependencies = [ "async-task", "concurrent-queue", - "fastrand 2.3.0", + "fastrand 2.4.1", "futures-lite 2.6.1", "pin-project-lite", "slab", @@ -517,7 +503,7 @@ dependencies = [ "futures-lite 2.6.1", "parking", "polling 3.11.0", - "rustix 1.1.3", + "rustix 1.1.4", "slab", "windows-sys 0.61.2", ] @@ -574,7 +560,7 @@ dependencies = [ "cfg-if", "event-listener 5.4.1", "futures-lite 2.6.1", - "rustix 1.1.3", + "rustix 1.1.4", ] [[package]] @@ -585,14 +571,14 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "async-signal" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" dependencies = [ "async-io 2.6.0", "async-lock 3.4.2", @@ -600,7 +586,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 1.1.3", + "rustix 1.1.4", "signal-hook-registry", "slab", "windows-sys 0.61.2", @@ -625,7 +611,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -642,7 +628,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -745,14 +731,14 @@ dependencies = [ [[package]] name = "auto_enums" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c170965892137a3a9aeb000b4524aa3cc022a310e709d848b6e1cdce4ab4781" +checksum = "65398a2893f41bce5c9259f6e1a4f03fbae40637c1bdc755b4f387f48c613b03" dependencies = [ "derive_utils", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -761,21 +747,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "backtrace" -version = "0.3.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-link 0.2.1", -] - [[package]] name = "base64" version = "0.22.1" @@ -797,7 +768,7 @@ version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "cexpr", "clang-sys", "itertools 0.13.0", @@ -806,9 +777,9 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "shlex", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -834,9 +805,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" dependencies = [ "serde_core", ] @@ -871,7 +842,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" dependencies = [ - "objc2 0.6.3", + "objc2 0.6.4", ] [[package]] @@ -909,9 +880,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.1" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "by_address" @@ -936,7 +907,7 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -953,35 +924,36 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cached" -version = "0.56.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "801927ee168e17809ab8901d9f01f700cd7d8d6a6527997fee44e4b0327a253c" +checksum = "53b6f5d101f0f6322c8646a45b7c581a673e476329040d97565815c2461dd0c4" dependencies = [ "ahash", "cached_proc_macro", "cached_proc_macro_types", - "hashbrown 0.15.5", + "hashbrown 0.16.1", "once_cell", + "parking_lot 0.12.5", "thiserror 2.0.18", "web-time", ] [[package]] name = "cached_proc_macro" -version = "0.25.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9225bdcf4e4a9a4c08bf16607908eb2fbf746828d5e0b5e019726dbf6571f201" +checksum = "8ebcf9c75f17a17d55d11afc98e46167d4790a263f428891b8705ab2f793eca3" dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -996,7 +968,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "cairo-sys-rs", "glib", "libc", @@ -1021,7 +993,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "log", "polling 3.11.0", "rustix 0.38.44", @@ -1031,13 +1003,13 @@ dependencies = [ [[package]] name = "calloop" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb9f6e1368bd4621d2c86baa7e37de77a938adf5221e5dd3d6133340101b309e" +checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "polling 3.11.0", - "rustix 1.1.3", + "rustix 1.1.4", "slab", "tracing", ] @@ -1060,8 +1032,8 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" dependencies = [ - "calloop 0.14.3", - "rustix 1.1.3", + "calloop 0.14.4", + "rustix 1.1.4", "wayland-backend", "wayland-client", ] @@ -1084,7 +1056,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b43458dd2ee3cdab3f5b105acd80791383b730380c929018701313d7d299d4e8" dependencies = [ - "ctor", + "ctor 0.2.9", ] [[package]] @@ -1095,9 +1067,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.55" +version = "1.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" +checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" dependencies = [ "find-msvc-tools", "jobserver", @@ -1161,9 +1133,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.43" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" dependencies = [ "iana-time-zone", "js-sys", @@ -1229,9 +1201,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.56" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75ca66430e33a14957acc24c5077b503e7d374151b2b4b3a10c83b4ceb4be0e" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", "clap_derive", @@ -1239,26 +1211,26 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.56" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793207c7fa6300a0608d1080b858e5fdbe713cdc1c8db9fb17777d8a13e63df0" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstream", "anstyle", - "clap_lex 0.7.7", + "clap_lex 1.1.0", "strsim 0.11.1", ] [[package]] name = "clap_derive" -version = "4.5.55" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -1272,9 +1244,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.7" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "clipboard-win" @@ -1362,9 +1334,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "com" @@ -1483,11 +1455,11 @@ dependencies = [ [[package]] name = "coreaudio-rs" -version = "0.13.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aae284fbaf7d27aa0e292f7677dfbe26503b0d555026f702940805a630eac17" +checksum = "16dd574a72a021b90c7656c474ea31d11a2f0366a8eff574186e761e0b9e3586" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.11.1", "libc", "objc2-audio-toolbox", "objc2-core-audio", @@ -1500,7 +1472,7 @@ name = "cosmic-client-toolkit" version = "0.1.0" source = "git+https://github.com/pop-os/cosmic-protocols?rev=d0e95be#d0e95be25e423cfe523b11111a3666ed7aaf0dc4" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "cosmic-protocols", "libc", "smithay-client-toolkit 0.20.0", @@ -1526,7 +1498,7 @@ dependencies = [ "tokio", "tracing", "xdg", - "zbus 5.13.2", + "zbus 5.14.0", ] [[package]] @@ -1535,13 +1507,13 @@ version = "1.0.0" source = "git+https://github.com/pop-os/libcosmic.git?rev=3e78eb238159d90956e85e95e868164671b649f6#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "cosmic-freedesktop-icons" version = "0.4.0" -source = "git+https://github.com/pop-os/freedesktop-icons#7a61a704f6d1ec41f71cbe766e3cc484858523fa" +source = "git+https://github.com/pop-os/freedesktop-icons#9c562fe3ecf03241a46a60c0078cd6ea10bd75ce" dependencies = [ "bstr", "btoi", @@ -1557,7 +1529,7 @@ name = "cosmic-protocols" version = "0.1.0" source = "git+https://github.com/pop-os/cosmic-protocols?rev=d0e95be#d0e95be25e423cfe523b11111a3666ed7aaf0dc4" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -1569,25 +1541,25 @@ dependencies = [ [[package]] name = "cosmic-settings-daemon" version = "0.1.0" -source = "git+https://github.com/pop-os/dbus-settings-bindings#87c3c35666b926a24a1e8045fd70be2db1145e34" +source = "git+https://github.com/pop-os/dbus-settings-bindings#507e342c21d3ce6ae41b1d4f3fa2f0ad5ee23e75" dependencies = [ - "zbus 5.13.2", + "zbus 5.14.0", ] [[package]] name = "cosmic-text" -version = "0.17.1" -source = "git+https://github.com/pop-os/cosmic-text.git#d7dc22dd20773c132814e256fd38fe071ab1b742" +version = "0.18.2" +source = "git+https://github.com/pop-os/cosmic-text.git#4d74f795cc771fdcc7ea0f9cacba63fcf036fad6" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "fontdb 0.23.0", "harfrust", "linebender_resource_handle", "log", "rangemap", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "self_cell", - "skrifa 0.40.0", + "skrifa", "smol_str 0.3.2", "swash", "sys-locale", @@ -1615,15 +1587,15 @@ dependencies = [ [[package]] name = "cpal" -version = "0.17.1" +version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b1f9c7312f19fc2fa12fd7acaf38de54e8320ba10d1a02dcbe21038def51ccb" +checksum = "d8942da362c0f0d895d7cac616263f2f9424edc5687364dfd1d25ef7eba506d7" dependencies = [ "alsa", "coreaudio-rs", "dasp_sample", "jack", - "jni", + "jni 0.21.1", "js-sys", "libc", "mach2", @@ -1631,7 +1603,7 @@ dependencies = [ "ndk-context", "num-derive", "num-traits", - "objc2 0.6.3", + "objc2 0.6.4", "objc2-audio-toolbox", "objc2-avf-audio", "objc2-core-audio", @@ -1681,7 +1653,7 @@ dependencies = [ "anes", "cast", "ciborium", - "clap 4.5.56", + "clap 4.6.1", "criterion-plot", "itertools 0.13.0", "num-traits", @@ -1764,9 +1736,9 @@ checksum = "42aaeae719fd78ce501d77c6cdf01f7e96f26bcd5617a4903a1c2b97e388543a" [[package]] name = "csscolorparser" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a878cfd6075649977f548ed439564cfdbe1f190a6656a00b48af7740f2f148" +checksum = "199f851bd3cb5004c09474252c7f74e7c047441ed0979bf3688a7106a13da952" dependencies = [ "num-traits", "phf 0.13.1", @@ -1781,14 +1753,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] -name = "ctor-lite" -version = "0.1.1" +name = "ctor" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b29fccfdaeb0f9bd90da5759b1d0eaa2f6cfcfe90960124cfc83141ed4e111fd" +checksum = "95d0d11eb38e7642efca359c3cf6eb7b2e528182d09110165de70192b0352775" +dependencies = [ + "dtor", +] [[package]] name = "cursor-icon" @@ -1802,7 +1777,7 @@ version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bdbd1f579714e3c809ebd822c81ef148b1ceaeb3d535352afc73fd0c4c6a0017" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "libloading 0.8.9", "winapi", ] @@ -1827,6 +1802,16 @@ dependencies = [ "darling_macro 0.21.3", ] +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core 0.23.0", + "darling_macro 0.23.0", +] + [[package]] name = "darling_core" version = "0.20.11" @@ -1838,7 +1823,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -1852,7 +1837,20 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.114", + "syn 2.0.117", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.117", ] [[package]] @@ -1863,7 +1861,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -1874,7 +1872,18 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.114", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core 0.23.0", + "quote", + "syn 2.0.117", ] [[package]] @@ -2004,9 +2013,9 @@ checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" [[package]] name = "deranged" -version = "0.5.5" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ "powerfmt", "serde_core", @@ -2041,7 +2050,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2051,7 +2060,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2063,18 +2072,18 @@ dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "derive_utils" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccfae181bab5ab6c5478b2ccb69e4c68a02f8c3ec72f6616bfec9dbc599d2ee0" +checksum = "362f47930db19fe7735f527e6595e4900316b893ebf6d48ad3d31be928d57dd6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2125,14 +2134,14 @@ checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" [[package]] name = "dispatch2" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "block2 0.6.2", "libc", - "objc2 0.6.3", + "objc2 0.6.4", ] [[package]] @@ -2143,14 +2152,14 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "dlib" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" dependencies = [ "libloading 0.8.9", ] @@ -2160,7 +2169,7 @@ name = "dnd" version = "0.1.0" source = "git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2#6b9faab87bea9cebec6ae036906fd67fed254f5f" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "mime", "raw-window-handle", "smithay-client-toolkit 0.19.2", @@ -2169,9 +2178,9 @@ dependencies = [ [[package]] name = "doctest-file" -version = "1.0.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" +checksum = "c2db04e74f0a9a93103b50e90b96024c9b2bdca8bce6a632ec71b88736d3d359" [[package]] name = "document-features" @@ -2191,7 +2200,7 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dpi" version = "0.1.1" -source = "git+https://github.com/pop-os/winit.git?tag=iced-xdg-surface-0.13-rc#0c4adf468b8397e5b1dc9183418f56b972916e42" +source = "git+https://github.com/pop-os/winit.git?tag=iced-xdg-surface-0.13-rc#dd46a1499bcc38f2134ab869e8860a32e091c55b" [[package]] name = "dpi" @@ -2205,7 +2214,7 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0f8a69e60d75ae7dab4ef26a59ca99f2a89d4c142089b537775ae0c198bdcde" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "bytemuck", "drm-ffi", "drm-fourcc", @@ -2238,6 +2247,12 @@ dependencies = [ "linux-raw-sys 0.6.5", ] +[[package]] +name = "dtor" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f72721db8027a4e96dd6fb50d2a1d32259c9d3da1b63dee612ccd981e14293" + [[package]] name = "dyn-clone" version = "1.0.20" @@ -2278,7 +2293,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2299,14 +2314,14 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "env_filter" -version = "0.1.4" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" +checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" dependencies = [ "log", "regex", @@ -2314,9 +2329,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.8" +version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" +checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" dependencies = [ "anstream", "anstyle", @@ -2359,9 +2374,9 @@ dependencies = [ [[package]] name = "euclid" -version = "0.22.13" +version = "0.22.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df61bf483e837f88d5c2291dcf55c67be7e676b3a51acc48db3a7b163b91ed63" +checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" dependencies = [ "num-traits", ] @@ -2421,9 +2436,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.3.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "fdeflate" @@ -2477,9 +2492,9 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", @@ -2517,7 +2532,7 @@ dependencies = [ "fluent-syntax", "intl-memoizer", "intl_pluralrules", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "self_cell", "smallvec", "unic-langid", @@ -2555,19 +2570,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] -name = "font-types" -version = "0.10.1" +name = "foldhash" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39a654f404bbcbd48ea58c617c2993ee91d1cb63727a37bf2323a4edeed1b8c5" -dependencies = [ - "bytemuck", -] +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "font-types" -version = "0.11.0" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4d2d0cf79d38430cc9dc9aadec84774bff2e1ba30ae2bf6c16cfce9385a23" +checksum = "5b38ad915f6dadd993ced50848a8291a543bd41ca62bc10740d5e64e2ab4cfd7" dependencies = [ "bytemuck", ] @@ -2627,7 +2639,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2666,9 +2678,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -2681,9 +2693,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -2691,27 +2703,26 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", "futures-util", - "num_cpus", ] [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-lite" @@ -2734,7 +2745,7 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ - "fastrand 2.3.0", + "fastrand 2.4.1", "futures-core", "futures-io", "parking", @@ -2743,32 +2754,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-channel", "futures-core", @@ -2778,7 +2789,6 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -2852,12 +2862,11 @@ dependencies = [ [[package]] name = "generic_singleton" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2d5de0fc83987dac514f3b910c5d08392b220efe8cf72086c660029a197bf73" +checksum = "ab6e923c8e978e57cf63e2e200ca967d1d20f0ea2662b28f6d4e11c44aa6ab16" dependencies = [ "anymap3", - "lazy_static", "parking_lot 0.12.5", ] @@ -2867,7 +2876,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" dependencies = [ - "rustix 1.1.3", + "rustix 1.1.4", "windows-link 0.2.1", ] @@ -2926,7 +2935,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2941,20 +2950,14 @@ dependencies = [ [[package]] name = "gif" -version = "0.14.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5df2ba84018d80c213569363bdcd0c64e6933c67fe4c1d60ecf822971a3c35e" +checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" dependencies = [ "color_quant", "weezl", ] -[[package]] -name = "gimli" -version = "0.32.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" - [[package]] name = "gio" version = "0.18.4" @@ -3010,7 +3013,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "futures-channel", "futures-core", "futures-executor", @@ -3038,7 +3041,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -3095,7 +3098,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "gpu-alloc-types", ] @@ -3105,7 +3108,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", ] [[package]] @@ -3127,7 +3130,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "gpu-descriptor-types", "hashbrown 0.15.5", ] @@ -3138,14 +3141,14 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", ] [[package]] name = "grid" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9e2d4c0a8296178d8802098410ca05d86b17a10bb5ab559b3fb404c1f948220" +checksum = "b40ca9252762c466af32d0b1002e91e4e1bc5398f77455e55474deb466355ff5" [[package]] name = "gtk" @@ -3196,7 +3199,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -3222,14 +3225,14 @@ dependencies = [ [[package]] name = "harfrust" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f9f40651a03bc0f7316bd75267ff5767e93017ef3cfffe76c6aa7252cc5a31c" +checksum = "9da2e5ae821f6e96664977bf974d6d6a2d6682f9ccee23e62ec1d134246845f9" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "bytemuck", "core_maths", - "read-fonts 0.37.0", + "read-fonts", "smallvec", ] @@ -3245,9 +3248,7 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", + "foldhash 0.1.5", ] [[package]] @@ -3255,6 +3256,17 @@ name = "hashbrown" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] + +[[package]] +name = "hashbrown" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" [[package]] name = "hassle-rs" @@ -3262,7 +3274,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "com", "libc", "libloading 0.8.9", @@ -3381,7 +3393,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.114", + "syn 2.0.117", "unic-langid", ] @@ -3395,7 +3407,7 @@ dependencies = [ "i18n-config", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -3454,7 +3466,7 @@ name = "iced_core" version = "0.14.0-dev" source = "git+https://github.com/pop-os/libcosmic.git?rev=3e78eb238159d90956e85e95e868164671b649f6#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "bytes", "dnd", "glam", @@ -3465,7 +3477,7 @@ dependencies = [ "once_cell", "palette", "raw-window-handle", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "serde", "smol_str 0.2.2", "thiserror 1.0.69", @@ -3481,7 +3493,7 @@ dependencies = [ "futures", "iced_core", "log", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "tokio", "wasm-bindgen-futures", "wasm-timer", @@ -3495,7 +3507,7 @@ dependencies = [ "cosmic-text", "etagere", "lru", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "wgpu", ] @@ -3504,7 +3516,7 @@ name = "iced_graphics" version = "0.14.0-dev" source = "git+https://github.com/pop-os/libcosmic.git?rev=3e78eb238159d90956e85e95e868164671b649f6#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "bytemuck", "cosmic-text", "half", @@ -3516,7 +3528,7 @@ dependencies = [ "lyon_path", "once_cell", "raw-window-handle", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "thiserror 1.0.69", "unicode-segmentation", ] @@ -3559,9 +3571,9 @@ dependencies = [ "kurbo 0.10.4", "log", "resvg 0.42.0", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "softbuffer", - "tiny-skia", + "tiny-skia 0.11.4", ] [[package]] @@ -3570,7 +3582,7 @@ version = "0.14.0-dev" source = "git+https://github.com/pop-os/libcosmic.git?rev=3e78eb238159d90956e85e95e868164671b649f6#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "as-raw-xcb-connection", - "bitflags 2.10.0", + "bitflags 2.11.1", "bytemuck", "cosmic-client-toolkit", "futures", @@ -3583,7 +3595,7 @@ dependencies = [ "once_cell", "raw-window-handle", "resvg 0.42.0", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "rustix 0.38.44", "thiserror 1.0.69", "tiny-xlib", @@ -3609,7 +3621,7 @@ dependencies = [ "once_cell", "ouroboros", "pulldown-cmark", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "thiserror 1.0.69", "unicode-segmentation", "url", @@ -3627,7 +3639,7 @@ dependencies = [ "iced_graphics", "iced_runtime", "log", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "rustix 0.38.44", "thiserror 1.0.69", "tracing", @@ -3641,12 +3653,13 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -3654,9 +3667,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -3667,9 +3680,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -3681,15 +3694,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -3701,15 +3714,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -3755,15 +3768,15 @@ dependencies = [ [[package]] name = "image" -version = "0.25.9" +version = "0.25.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" dependencies = [ "bytemuck", "byteorder-lite", "moxcms", "num-traits", - "png 0.18.0", + "png 0.18.1", "zune-core", "zune-jpeg", ] @@ -3812,23 +3825,23 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.0", "serde", "serde_core", ] [[package]] name = "inotify" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" +checksum = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "inotify-sys", "libc", ] @@ -3853,9 +3866,9 @@ dependencies = [ [[package]] name = "interprocess" -version = "2.2.3" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d941b405bd2322993887859a8ee6ac9134945a24ec5ec763a8a962fc64dfec2d" +checksum = "069323743400cb7ab06a8fe5c1ed911d36b6919ec531661d034c89083629595b" dependencies = [ "doctest-file", "futures-core", @@ -3863,7 +3876,7 @@ dependencies = [ "recvmsg", "tokio", "widestring", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3951,9 +3964,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jack" @@ -3961,7 +3974,7 @@ version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7811b07bcac5dafabf814ab52c4b0ca9b7948aa1e279f572f03aa6544d47d27" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "jack-sys", "lazy_static", "libc", @@ -3984,9 +3997,9 @@ dependencies = [ [[package]] name = "jiff" -version = "0.2.18" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67e8da4c49d6d9909fe03361f9b620f58898859f5c7aded68351e85e71ecf50" +checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" dependencies = [ "jiff-static", "log", @@ -3997,13 +4010,13 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.18" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c84ee7f197eca9a86c6fd6cb771e55eb991632f15f2bc3ca6ec838929e6e78" +checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -4015,18 +4028,70 @@ dependencies = [ "cesu8", "cfg-if", "combine", - "jni-sys", + "jni-sys 0.3.1", "log", "thiserror 1.0.69", "walkdir", "windows-sys 0.45.0", ] +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys 0.4.1", + "log", + "simd_cesu8", + "thiserror 2.0.18", + "walkdir", + "windows-link 0.2.1", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.117", +] + [[package]] name = "jni-sys" -version = "0.3.0" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.117", +] [[package]] name = "jobserver" @@ -4046,10 +4111,12 @@ checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" [[package]] name = "js-sys" -version = "0.3.85" +version = "0.3.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" +checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" dependencies = [ + "cfg-if", + "futures-util", "once_cell", "wasm-bindgen", ] @@ -4069,7 +4136,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "serde", "unicode-segmentation", ] @@ -4093,9 +4160,9 @@ checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" [[package]] name = "known-folders" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d463f34ca3c400fde3a054da0e0b8c6ffa21e4590922f3e18281bb5eeef4cbdc" +checksum = "7a1886916523694cd6ea3d175f03a1e5010699a2a4cc13696d83d7bea1d80638" dependencies = [ "windows-sys 0.61.2", ] @@ -4190,9 +4257,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.180" +version = "0.2.185" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" +checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" [[package]] name = "libcosmic" @@ -4200,7 +4267,7 @@ version = "1.0.0" source = "git+https://github.com/pop-os/libcosmic.git?rev=3e78eb238159d90956e85e95e868164671b649f6#3e78eb238159d90956e85e95e868164671b649f6" dependencies = [ "apply", - "ashpd 0.12.1", + "ashpd 0.12.3", "auto_enums", "chrono", "cosmic-config", @@ -4237,7 +4304,7 @@ dependencies = [ "tracing", "unicode-segmentation", "url", - "zbus 5.13.2", + "zbus 5.14.0", ] [[package]] @@ -4268,13 +4335,14 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.12" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "libc", - "redox_syscall 0.7.0", + "plain", + "redox_syscall 0.7.4", ] [[package]] @@ -4303,7 +4371,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bcb64f856d7b5144b0c102ec029f4d8a474c91c86336a2f5e96494e3d2f72db3" dependencies = [ "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -4332,15 +4400,15 @@ checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7" [[package]] name = "linux-raw-sys" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "litrs" @@ -4350,9 +4418,9 @@ checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] name = "local-ip-address" -version = "0.6.10" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79ef8c257c92ade496781a32a581d43e3d512cf8ce714ecf04ea80f93ed0ff4a" +checksum = "d7b0187df4e614e42405b49511b82ff7a1774fbd9a816060ee465067847cac22" dependencies = [ "libc", "neli", @@ -4382,9 +4450,9 @@ checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" [[package]] name = "lyon" -version = "1.0.16" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbcb7d54d54c8937364c9d41902d066656817dce1e03a44e5533afebd1ef4352" +checksum = "bd0578bdecb7d6d88987b8b2b1e3a4e2f81df9d0ece1078623324a567904e7b7" dependencies = [ "lyon_algorithms", "lyon_tessellation", @@ -4392,9 +4460,9 @@ dependencies = [ [[package]] name = "lyon_algorithms" -version = "1.0.16" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c0829e28c4f336396f250d850c3987e16ce6db057ffe047ce0dd54aab6b647" +checksum = "9815fac08e6fd96733a11dce4f9d15a3f338e96a2e2311ee21e1b738efc2bc0f" dependencies = [ "lyon_path", "num-traits", @@ -4402,9 +4470,9 @@ dependencies = [ [[package]] name = "lyon_geom" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e260b6de923e6e47adfedf6243013a7a874684165a6a277594ee3906021b2343" +checksum = "4336502e29e32af93cf2dad2214ed6003c17ceb5bd499df77b1de663b9042b92" dependencies = [ "arrayvec", "euclid", @@ -4413,9 +4481,9 @@ dependencies = [ [[package]] name = "lyon_path" -version = "1.0.16" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aeca86bcfd632a15984ba029b539ffb811e0a70bf55e814ef8b0f54f506fdeb" +checksum = "5c463f9c428b7fc5ec885dcd39ce4aa61e29111d0e33483f6f98c74e89d8621e" dependencies = [ "lyon_geom", "num-traits", @@ -4423,9 +4491,9 @@ dependencies = [ [[package]] name = "lyon_tessellation" -version = "1.0.16" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3f586142e1280335b1bc89539f7c97dd80f08fc43e9ab1b74ef0a42b04aa353" +checksum = "8e43b7e44161571868f5c931d12583592c223c5583eef86b08aa02b7048a3552" dependencies = [ "float_next_after", "lyon_path", @@ -4434,12 +4502,12 @@ dependencies = [ [[package]] name = "mac-notification-sys" -version = "0.6.9" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fd3f75411f4725061682ed91f131946e912859d0044d39c4ec0aac818d7621" +checksum = "29a16783dd1a47849b8c8133c9cd3eb2112cfbc6901670af3dba47c8bbfb07d3" dependencies = [ "cc", - "objc2 0.6.3", + "objc2 0.6.4", "objc2-foundation 0.3.2", "time", ] @@ -4464,15 +4532,15 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "memmap2" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" dependencies = [ "libc", ] @@ -4501,7 +4569,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "block", "core-graphics-types", "foreign-types", @@ -4536,9 +4604,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "log", @@ -4548,9 +4616,9 @@ dependencies = [ [[package]] name = "moxcms" -version = "0.7.11" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" dependencies = [ "num-traits", "pxfm", @@ -4569,16 +4637,16 @@ dependencies = [ [[package]] name = "muda" -version = "0.17.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" +checksum = "7c9fec5a4e89860383d778d10563a605838f8f0b2f9303868937e5ff32e86177" dependencies = [ "crossbeam-channel", "dpi 0.1.2", "gtk", "keyboard-types", "libxdo", - "objc2 0.6.3", + "objc2 0.6.4", "objc2-app-kit 0.3.2", "objc2-core-foundation", "objc2-foundation 0.3.2", @@ -4608,11 +4676,11 @@ checksum = "8bd5a652b6faf21496f2cfd88fc49989c8db0825d1f6746b1a71a6ede24a63ad" dependencies = [ "arrayvec", "bit-set", - "bitflags 2.10.0", + "bitflags 2.11.1", "cfg_aliases 0.1.1", "codespan-reporting", "hexf-parse", - "indexmap 2.13.0", + "indexmap 2.14.0", "log", "rustc-hash 1.1.0", "spirv", @@ -4627,8 +4695,8 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.10.0", - "jni-sys", + "bitflags 2.11.1", + "jni-sys 0.3.1", "log", "ndk-sys 0.6.0+11769913", "num_enum", @@ -4648,7 +4716,7 @@ version = "0.5.0+25.2.9519653" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" dependencies = [ - "jni-sys", + "jni-sys 0.3.1", ] [[package]] @@ -4657,7 +4725,7 @@ version = "0.6.0+11769913" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" dependencies = [ - "jni-sys", + "jni-sys 0.3.1", ] [[package]] @@ -4666,7 +4734,7 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22f9786d56d972959e1408b6a93be6af13b9c1392036c5c1fafa08a1b0c6ee87" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "byteorder", "derive_builder", "getset", @@ -4686,7 +4754,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -4733,7 +4801,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "fsevent-sys", "inotify", "kqueue", @@ -4747,16 +4815,16 @@ dependencies = [ [[package]] name = "notify-rust" -version = "4.12.0" +version = "4.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21af20a1b50be5ac5861f74af1a863da53a11c38684d9818d82f1c42f7fdc6c2" +checksum = "5e551a9f0db223eaf3eb156906f99f46897fd951ee66dd1cb0be14db4d36d2fa" dependencies = [ "futures-lite 2.6.1", "log", "mac-notification-sys", "serde", "tauri-winrt-notification", - "zbus 5.13.2", + "zbus 5.14.0", ] [[package]] @@ -4765,7 +4833,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", ] [[package]] @@ -4780,9 +4848,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" [[package]] name = "num-derive" @@ -4792,7 +4860,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -4814,21 +4882,11 @@ dependencies = [ "libm", ] -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi 0.5.2", - "libc", -] - [[package]] name = "num_enum" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" dependencies = [ "num_enum_derive", "rustversion", @@ -4836,21 +4894,21 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" dependencies = [ - "proc-macro-crate 3.4.0", + "proc-macro-crate 3.5.0", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "nusb" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5750d884c774a2862b0049b0318aea27cecc9e873485540af5ed8ab8841247da" +checksum = "8a330b3bc7f8b4fc729a4c63164b3927eeeaced198222a3ce6b8b6e034851b7a" dependencies = [ "blocking", "core-foundation 0.10.1", @@ -4858,10 +4916,10 @@ dependencies = [ "futures-core", "futures-io", "io-kit-sys", - "linux-raw-sys 0.11.0", + "linux-raw-sys 0.12.1", "log", "once_cell", - "rustix 1.1.3", + "rustix 1.1.4", "slab", "tokio", "windows-sys 0.61.2", @@ -4905,9 +4963,9 @@ dependencies = [ [[package]] name = "objc2" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" dependencies = [ "objc2-encode", ] @@ -4918,7 +4976,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -4934,9 +4992,9 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "block2 0.6.2", - "objc2 0.6.3", + "objc2 0.6.4", "objc2-core-foundation", "objc2-foundation 0.3.2", ] @@ -4947,9 +5005,9 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6948501a91121d6399b79abaa33a8aa4ea7857fe019f341b8c23ad6e81b79b08" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "libc", - "objc2 0.6.3", + "objc2 0.6.4", "objc2-core-audio", "objc2-core-audio-types", "objc2-core-foundation", @@ -4962,7 +5020,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13a380031deed8e99db00065c45937da434ca987c034e13b87e4441f9e4090be" dependencies = [ - "objc2 0.6.3", + "objc2 0.6.4", "objc2-foundation 0.3.2", ] @@ -4972,7 +5030,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "block2 0.5.1", "objc2 0.5.2", "objc2-core-location", @@ -4997,7 +5055,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1eebcea8b0dbff5f7c8504f3107c68fc061a3eb44932051c8cf8a68d969c3b2" dependencies = [ "dispatch2", - "objc2 0.6.3", + "objc2 0.6.4", "objc2-core-audio-types", "objc2-core-foundation", "objc2-foundation 0.3.2", @@ -5009,8 +5067,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a89f2ec274a0cf4a32642b2991e8b351a404d290da87bb6a9a9d8632490bd1c" dependencies = [ - "bitflags 2.10.0", - "objc2 0.6.3", + "bitflags 2.11.1", + "objc2 0.6.4", ] [[package]] @@ -5019,7 +5077,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -5031,11 +5089,11 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "block2 0.6.2", "dispatch2", "libc", - "objc2 0.6.3", + "objc2 0.6.4", ] [[package]] @@ -5044,7 +5102,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "objc2-core-foundation", ] @@ -5084,7 +5142,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "block2 0.5.1", "dispatch", "libc", @@ -5097,10 +5155,10 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "block2 0.6.2", "libc", - "objc2 0.6.3", + "objc2 0.6.4", "objc2-core-foundation", ] @@ -5122,7 +5180,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -5134,7 +5192,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -5157,7 +5215,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "block2 0.5.1", "objc2 0.5.2", "objc2-cloud-kit", @@ -5189,7 +5247,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "block2 0.5.1", "objc2 0.5.2", "objc2-core-location", @@ -5205,20 +5263,11 @@ dependencies = [ "objc", ] -[[package]] -name = "object" -version = "0.37.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" @@ -5234,9 +5283,9 @@ checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" [[package]] name = "open" -version = "5.3.3" +version = "5.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" +checksum = "9f3bab717c29a857abf75fcef718d441ec7cb2725f937343c734740a985d37fd" dependencies = [ "is-wsl", "libc", @@ -5251,9 +5300,9 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "orbclient" -version = "0.3.50" +version = "0.3.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ad2c6bae700b7aa5d1cc30c59bdd3a1c180b09dbaea51e2ae2b8e1cf211fdd" +checksum = "12c6933ddbbd16539a7672e697bb8d41ac3a4e99ac43eeb40c07236bd7fcb2dd" dependencies = [ "libc", "libredox", @@ -5296,7 +5345,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -5340,7 +5389,7 @@ dependencies = [ "by_address", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -5448,7 +5497,7 @@ checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ "fixedbitset", "hashbrown 0.15.5", - "indexmap 2.13.0", + "indexmap 2.14.0", ] [[package]] @@ -5479,7 +5528,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared 0.11.3", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -5488,7 +5537,7 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" dependencies = [ - "fastrand 2.3.0", + "fastrand 2.4.1", "phf_shared 0.13.1", ] @@ -5502,7 +5551,7 @@ dependencies = [ "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -5515,7 +5564,7 @@ dependencies = [ "phf_shared 0.13.1", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "uncased", ] @@ -5546,29 +5595,29 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pin-utils" @@ -5578,20 +5627,26 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" dependencies = [ "atomic-waker", - "fastrand 2.3.0", + "fastrand 2.4.1", "futures-io", ] [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plain" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "plotters" @@ -5636,11 +5691,11 @@ dependencies = [ [[package]] name = "png" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "crc32fast", "fdeflate", "flate2", @@ -5673,7 +5728,7 @@ dependencies = [ "concurrent-queue", "hermit-abi 0.5.2", "pin-project-lite", - "rustix 1.1.3", + "rustix 1.1.4", "windows-sys 0.61.2", ] @@ -5691,18 +5746,18 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" dependencies = [ "portable-atomic", ] [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -5735,7 +5790,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -5769,11 +5824,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.23.10+spec-1.0.0", + "toml_edit 0.25.11+spec-1.1.0", ] [[package]] @@ -5819,7 +5874,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -5839,7 +5894,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "version_check", "yansi", ] @@ -5875,7 +5930,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.114", + "syn 2.0.117", "tempfile", ] @@ -5889,7 +5944,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -5907,7 +5962,7 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f86ba2052aebccc42cbbb3ed234b8b13ce76f75c3551a303cb2bcffcff12bb14" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "getopts", "memchr", "pulldown-cmark-escape", @@ -5922,12 +5977,9 @@ checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae" [[package]] name = "pxfm" -version = "0.1.27" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7186d3822593aa4393561d186d1393b3923e9d6163d3fbfd6e825e3e6cf3e6a8" -dependencies = [ - "num-traits", -] +checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" [[package]] name = "quick-error" @@ -5946,18 +5998,18 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.38.4" +version = "0.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" dependencies = [ "memchr", ] [[package]] name = "quote" -version = "1.0.44" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -5976,9 +6028,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -5987,9 +6039,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", @@ -6052,9 +6104,9 @@ checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" [[package]] name = "range-alloc" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" +checksum = "ca45419789ae5a7899559e9512e58ca889e41f04f1f2445e9f4b290ceccd1d08" [[package]] name = "rangemap" @@ -6088,16 +6140,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "read-fonts" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717cf23b488adf64b9d711329542ba34de147df262370221940dfabc2c91358" -dependencies = [ - "bytemuck", - "font-types 0.10.1", -] - [[package]] name = "read-fonts" version = "0.37.0" @@ -6106,7 +6148,7 @@ checksum = "7b634fabf032fab15307ffd272149b622260f55974d9fad689292a5d33df02e5" dependencies = [ "bytemuck", "core_maths", - "font-types 0.11.0", + "font-types", ] [[package]] @@ -6124,6 +6166,16 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" +[[package]] +name = "redox_event" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea3e412d205440c7b0218af26247226f979ed1201674cda7a33cc70609084b5" +dependencies = [ + "bitflags 2.11.1", + "libredox", +] + [[package]] name = "redox_syscall" version = "0.2.16" @@ -6139,16 +6191,16 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", ] [[package]] name = "redox_syscall" -version = "0.7.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f3fe0889e69e2ae9e41f4d6c4c0181701d00e4697b356fb1f74173a5e0ee27" +checksum = "f450ad9c3b1da563fb6948a8e0fb0fb9269711c9c73d9ea1de5058c79c8d643a" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", ] [[package]] @@ -6179,14 +6231,14 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "regex" -version = "1.12.2" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -6196,9 +6248,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -6207,9 +6259,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "renderdoc-sys" @@ -6229,24 +6281,24 @@ dependencies = [ "pico-args", "rgb", "svgtypes 0.15.3", - "tiny-skia", + "tiny-skia 0.11.4", "usvg 0.42.0", ] [[package]] name = "resvg" -version = "0.46.0" +version = "0.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b563218631706d614e23059436526d005b50ab5f2d506b55a17eb65c5eb83419" +checksum = "9be183ad6a216aa96f33e4c8033b0988b8b3ea6fd2359d19af5bac4643fd8e81" dependencies = [ - "gif 0.14.1", + "gif 0.14.2", "image-webp", "log", "pico-args", "rgb", "svgtypes 0.16.1", - "tiny-skia", - "usvg 0.46.0", + "tiny-skia 0.12.0", + "usvg 0.47.0", "zune-jpeg", ] @@ -6261,7 +6313,7 @@ dependencies = [ "dispatch2", "js-sys", "log", - "objc2 0.6.3", + "objc2 0.6.4", "objc2-app-kit 0.3.2", "objc2-core-foundation", "objc2-foundation 0.3.2", @@ -6276,20 +6328,20 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.52" +version = "0.8.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" dependencies = [ "bytemuck", ] [[package]] name = "ron" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd490c5b18261893f14449cbd28cb9c0b637aebf161cd77900bfdedaff21ec32" +checksum = "4147b952f3f819eca0e99527022f7d6a8d05f111aeb0a62960c74eb283bec8fc" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "once_cell", "serde", "serde_derive", @@ -6314,9 +6366,9 @@ dependencies = [ [[package]] name = "rtrb" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8388ea1a9e0ea807e442e8263a699e7edcb320ecbcd21b4fa8ff859acce3ba" +checksum = "7204ed6420f698836b76d4d5c2ec5dec7585fd5c3a788fd1cde855d1de598239" [[package]] name = "rubato" @@ -6350,7 +6402,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.114", + "syn 2.0.117", "walkdir", ] @@ -6364,12 +6416,6 @@ dependencies = [ "walkdir", ] -[[package]] -name = "rustc-demangle" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" - [[package]] name = "rustc-hash" version = "1.1.0" @@ -6378,9 +6424,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] name = "rustc_version" @@ -6425,7 +6471,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "errno", "libc", "linux-raw-sys 0.4.15", @@ -6434,14 +6480,14 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "errno", "libc", - "linux-raw-sys 0.11.0", + "linux-raw-sys 0.12.1", "windows-sys 0.61.2", ] @@ -6457,7 +6503,7 @@ version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "bytemuck", "smallvec", "ttf-parser 0.21.1", @@ -6473,7 +6519,7 @@ version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "bytemuck", "core_maths", "log", @@ -6540,7 +6586,7 @@ dependencies = [ "log", "memmap2", "smithay-client-toolkit 0.19.2", - "tiny-skia", + "tiny-skia 0.11.4", ] [[package]] @@ -6551,9 +6597,9 @@ checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" @@ -6582,7 +6628,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -6591,7 +6637,7 @@ version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ - "indexmap 2.13.0", + "indexmap 2.14.0", "itoa", "memchr", "serde", @@ -6607,7 +6653,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -6621,15 +6667,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.16.1" +version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" dependencies = [ "base64", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.13.0", + "indexmap 2.14.0", "schemars 0.9.0", "schemars 1.2.1", "serde_core", @@ -6640,14 +6686,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.16.1" +version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" dependencies = [ - "darling 0.21.3", + "darling 0.23.0", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -6690,9 +6736,25 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.8" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "simd_cesu8" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" +dependencies = [ + "rustc_version", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "simplecss" @@ -6709,16 +6771,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" -[[package]] -name = "skrifa" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c31071dedf532758ecf3fed987cdb4bd9509f900e026ab684b4ecb81ea49841" -dependencies = [ - "bytemuck", - "read-fonts 0.35.0", -] - [[package]] name = "skrifa" version = "0.40.0" @@ -6726,7 +6778,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fbdfe3d2475fbd7ddd1f3e5cf8288a30eb3e5f95832829570cd88115a7434ac" dependencies = [ "bytemuck", - "read-fonts 0.37.0", + "read-fonts", ] [[package]] @@ -6756,7 +6808,7 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "calloop 0.13.0", "calloop-wayland-source 0.3.0", "cursor-icon", @@ -6781,16 +6833,16 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "bytemuck", - "calloop 0.14.3", + "calloop 0.14.4", "calloop-wayland-source 0.4.1", "cursor-icon", "libc", "log", "memmap2", "pkg-config", - "rustix 1.1.3", + "rustix 1.1.4", "thiserror 2.0.18", "wayland-backend", "wayland-client", @@ -6843,18 +6895,18 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "softbuffer" version = "0.4.1" -source = "git+https://github.com/pop-os/softbuffer?tag=cosmic-4.0#a3f77e251e7422803f693df6e3fc313c010c4dcb" +source = "git+https://github.com/pop-os/softbuffer?tag=cosmic-4.0#c2b2c19ddb38ff17495643699f97cb1f2064a1be" dependencies = [ "as-raw-xcb-connection", "bytemuck", @@ -6862,7 +6914,7 @@ dependencies = [ "cocoa", "core-graphics", "drm", - "fastrand 2.3.0", + "fastrand 2.4.1", "foreign-types", "js-sys", "log", @@ -6914,7 +6966,7 @@ version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", ] [[package]] @@ -6967,23 +7019,23 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" -version = "0.27.2" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.27.2" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -7014,11 +7066,11 @@ dependencies = [ [[package]] name = "swash" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47846491253e976bdd07d0f9cc24b7daf24720d11309302ccbbc6e6b6e53550a" +checksum = "842f3cd369c2ba38966204f983eaa5e54a8e84a7d7159ed36ade2b6c335aae64" dependencies = [ - "skrifa 0.37.0", + "skrifa", "yazi", "zeno", ] @@ -7036,9 +7088,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.114" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -7053,7 +7105,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -7110,14 +7162,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.24.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ - "fastrand 2.3.0", - "getrandom 0.3.4", + "fastrand 2.4.1", + "getrandom 0.4.2", "once_cell", - "rustix 1.1.3", + "rustix 1.1.4", "windows-sys 0.61.2", ] @@ -7162,7 +7214,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -7173,14 +7225,14 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "time" -version = "0.3.46" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9da98b7d9b7dad93488a84b8248efc35352b0b2657397d4167e7ad67e5d535e5" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "itoa", @@ -7199,9 +7251,9 @@ checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.26" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78cc610bac2dcee56805c99642447d4c5dbde4d01f752ffea0199aee1f601dc4" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ "num-conv", "time-core", @@ -7219,7 +7271,22 @@ dependencies = [ "cfg-if", "log", "png 0.17.16", - "tiny-skia-path", + "tiny-skia-path 0.11.4", +] + +[[package]] +name = "tiny-skia" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47ffee5eaaf5527f630fb0e356b90ebdec84d5d18d937c5e440350f88c5a91ea" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "png 0.18.1", + "tiny-skia-path 0.12.0", ] [[package]] @@ -7233,14 +7300,25 @@ dependencies = [ "strict-num", ] +[[package]] +name = "tiny-skia-path" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca365c3faccca67d06593c5980fa6c57687de727a03131735bb85f01fdeeb9" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + [[package]] name = "tiny-xlib" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0324504befd01cab6e0c994f34b2ffa257849ee019d3fb3b64fb2c858887d89e" +checksum = "a90a0ca3ee6a69f2ad28fd11621a4c3f03b371f366be500b64df260c4ffbafb4" dependencies = [ "as-raw-xcb-connection", - "ctor-lite", + "ctor 0.10.0", "libloading 0.8.9", "pkg-config", "tracing", @@ -7248,9 +7326,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "serde_core", @@ -7269,9 +7347,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -7284,9 +7362,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.49.0" +version = "1.52.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6" dependencies = [ "bytes", "libc", @@ -7294,7 +7372,7 @@ dependencies = [ "parking_lot 0.12.5", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.2", + "socket2 0.6.3", "tokio-macros", "tracing", "windows-sys 0.61.2", @@ -7302,13 +7380,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -7367,9 +7445,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.5+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] @@ -7380,7 +7458,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.13.0", + "indexmap 2.14.0", "toml_datetime 0.6.3", "winnow 0.5.40", ] @@ -7391,7 +7469,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ - "indexmap 2.13.0", + "indexmap 2.14.0", "serde", "serde_spanned", "toml_datetime 0.6.3", @@ -7400,23 +7478,23 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.23.10+spec-1.0.0" +version = "0.25.11+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" dependencies = [ - "indexmap 2.13.0", - "toml_datetime 0.7.5+spec-1.1.0", + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow 0.7.14", + "winnow 1.0.2", ] [[package]] name = "toml_parser" -version = "1.0.6+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 0.7.14", + "winnow 1.0.2", ] [[package]] @@ -7439,7 +7517,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -7463,21 +7541,21 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.21.3" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c" +checksum = "93e1484378c343c5a9b291188fa58917c7184967683f8cfe4a05461986970553" dependencies = [ "crossbeam-channel", "dirs", "libappindicator", "muda", - "objc2 0.6.3", + "objc2 0.6.4", "objc2-app-kit 0.3.2", "objc2-core-foundation", "objc2-core-graphics", "objc2-foundation 0.3.2", "once_cell", - "png 0.17.16", + "png 0.18.1", "thiserror 2.0.18", "windows-sys 0.60.2", ] @@ -7503,7 +7581,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90" dependencies = [ - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", ] [[package]] @@ -7514,19 +7592,19 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] name = "uds_windows" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" dependencies = [ "memoffset 0.9.1", "tempfile", - "winapi", + "windows-sys 0.61.2", ] [[package]] @@ -7595,9 +7673,9 @@ checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-linebreak" @@ -7619,9 +7697,9 @@ checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" [[package]] name = "unicode-vo" @@ -7686,7 +7764,7 @@ dependencies = [ "siphasher", "strict-num", "svgtypes 0.15.3", - "tiny-skia-path", + "tiny-skia-path 0.11.4", "unicode-bidi", "unicode-script", "unicode-vo", @@ -7695,9 +7773,9 @@ dependencies = [ [[package]] name = "usvg" -version = "0.46.0" +version = "0.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e419dff010bb12512b0ae9e3d2f318dfbdf0167fde7eb05465134d4e8756076f" +checksum = "d46cf96c5f498d36b7a9693bc6a7075c0bb9303189d61b2249b0dc3d309c07de" dependencies = [ "base64", "data-url", @@ -7713,7 +7791,8 @@ dependencies = [ "siphasher", "strict-num", "svgtypes 0.16.1", - "tiny-skia-path", + "tiny-skia-path 0.12.0", + "ttf-parser 0.25.1", "unicode-bidi", "unicode-script", "unicode-vo", @@ -7734,9 +7813,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.20.0" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" dependencies = [ "js-sys", "serde_core", @@ -7788,11 +7867,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.57.1", ] [[package]] @@ -7801,14 +7880,14 @@ version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.51.0", ] [[package]] name = "wasm-bindgen" -version = "0.2.108" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" dependencies = [ "cfg-if", "once_cell", @@ -7819,23 +7898,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.58" +version = "0.4.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" +checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8" dependencies = [ - "cfg-if", - "futures-util", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.108" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7843,22 +7918,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.108" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.108" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" dependencies = [ "unicode-ident", ] @@ -7880,7 +7955,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" dependencies = [ "anyhow", - "indexmap 2.13.0", + "indexmap 2.14.0", "wasm-encoder", "wasmparser", ] @@ -7906,21 +7981,21 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "hashbrown 0.15.5", - "indexmap 2.13.0", + "indexmap 2.14.0", "semver", ] [[package]] name = "wayland-backend" -version = "0.3.12" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fee64194ccd96bf648f42a65a7e589547096dfa702f7cadef84347b66ad164f9" +checksum = "2857dd20b54e916ec7253b3d6b4d5c4d7d4ca2c33c2e11c6c76a99bd8744755d" dependencies = [ "cc", "downcast-rs", - "rustix 1.1.3", + "rustix 1.1.4", "scoped-tls", "smallvec", "wayland-sys", @@ -7928,12 +8003,12 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.12" +version = "0.31.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e6faa537fbb6c186cb9f1d41f2f811a4120d1b57ec61f50da451a0c5122bec" +checksum = "645c7c96bb74690c3189b5c9cb4ca1627062bb23693a4fad9d8c3de958260144" dependencies = [ - "bitflags 2.10.0", - "rustix 1.1.3", + "bitflags 2.11.1", + "rustix 1.1.4", "wayland-backend", "wayland-scanner", ] @@ -7944,29 +8019,29 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "cursor-icon", "wayland-backend", ] [[package]] name = "wayland-cursor" -version = "0.31.12" +version = "0.31.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5864c4b5b6064b06b1e8b74ead4a98a6c45a285fe7a0e784d24735f011fdb078" +checksum = "4a52d18780be9b1314328a3de5f930b73d2200112e3849ca6cb11822793fb34d" dependencies = [ - "rustix 1.1.3", + "rustix 1.1.4", "wayland-client", "xcursor", ] [[package]] name = "wayland-protocols" -version = "0.32.10" +version = "0.32.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baeda9ffbcfc8cd6ddaade385eaf2393bd2115a69523c735f12242353c3df4f3" +checksum = "563a85523cade2429938e790815fd7319062103b9f4a2dc806e9b53b95982d8f" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "wayland-backend", "wayland-client", "wayland-scanner", @@ -7979,7 +8054,7 @@ version = "20250721.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7988,11 +8063,11 @@ dependencies = [ [[package]] name = "wayland-protocols-misc" -version = "0.3.10" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791c58fdeec5406aa37169dd815327d1e47f334219b523444bc26d70ceb4c34e" +checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -8001,11 +8076,11 @@ dependencies = [ [[package]] name = "wayland-protocols-plasma" -version = "0.3.10" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa98634619300a535a9a97f338aed9a5ff1e01a461943e8346ff4ae26007306b" +checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -8014,11 +8089,11 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.10" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9597cdf02cf0c34cd5823786dce6b5ae8598f05c2daf5621b6e178d4f7345f3" +checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -8028,33 +8103,33 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.8" +version = "0.31.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5423e94b6a63e68e439803a3e153a9252d5ead12fd853334e2ad33997e3889e3" +checksum = "9c324a910fd86ebdc364a3e61ec1f11737d3b1d6c273c0239ee8ff4bc0d24b4a" dependencies = [ "proc-macro2", - "quick-xml 0.38.4", + "quick-xml 0.39.2", "quote", ] [[package]] name = "wayland-server" -version = "0.31.11" +version = "0.31.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9297ab90f8d1f597711d36455c5b1b2290eca59b8134485e377a296b80b118c9" +checksum = "cc1846eb04c49182e04f4a099e2a830a2b745610bbc1d61246e206f29c7000a0" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "downcast-rs", - "rustix 1.1.3", + "rustix 1.1.4", "wayland-backend", "wayland-scanner", ] [[package]] name = "wayland-sys" -version = "0.31.8" +version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6dbfc3ac5ef974c92a2235805cc0114033018ae1290a72e474aa8b28cbbdfd" +checksum = "d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be" dependencies = [ "dlib", "log", @@ -8064,9 +8139,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.85" +version = "0.3.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" +checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d" dependencies = [ "js-sys", "wasm-bindgen", @@ -8121,10 +8196,10 @@ checksum = "0348c840d1051b8e86c3bcd31206080c5e71e5933dabd79be1ce732b0b2f089a" dependencies = [ "arrayvec", "bit-vec", - "bitflags 2.10.0", + "bitflags 2.11.1", "cfg_aliases 0.1.1", "document-features", - "indexmap 2.13.0", + "indexmap 2.14.0", "log", "naga", "once_cell", @@ -8148,7 +8223,7 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.10.0", + "bitflags 2.11.1", "block", "cfg_aliases 0.1.1", "core-graphics-types", @@ -8189,7 +8264,7 @@ version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc9d91f0e2c4b51434dfa6db77846f2793149d8e73f800fa2e41f52b8eac3c5d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "js-sys", "web-sys", ] @@ -8386,7 +8461,7 @@ checksum = "942ac266be9249c84ca862f0a164a39533dc2f6f33dc98ec89c8da99b82ea0bd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -8397,7 +8472,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -8408,7 +8483,7 @@ checksum = "da33557140a288fae4e1d5f8873aaf9eb6613a9cf82c3e070223ff177f598b60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -8419,7 +8494,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -8826,12 +8901,12 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winit" version = "0.30.5" -source = "git+https://github.com/pop-os/winit.git?tag=iced-xdg-surface-0.13-rc#0c4adf468b8397e5b1dc9183418f56b972916e42" +source = "git+https://github.com/pop-os/winit.git?tag=iced-xdg-surface-0.13-rc#dd46a1499bcc38f2134ab869e8860a32e091c55b" dependencies = [ "ahash", "android-activity", "atomic-waker", - "bitflags 2.10.0", + "bitflags 2.11.1", "block2 0.5.1", "bytemuck", "calloop 0.13.0", @@ -8854,7 +8929,7 @@ dependencies = [ "percent-encoding", "pin-project", "raw-window-handle", - "redox_syscall 0.7.0", + "redox_event", "rustix 0.38.44", "sctk-adwaita", "smithay-client-toolkit 0.19.2", @@ -8886,9 +8961,18 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.14" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" dependencies = [ "memchr", ] @@ -8911,6 +8995,12 @@ dependencies = [ "wit-bindgen-rust-macro", ] +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -8930,9 +9020,9 @@ checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" dependencies = [ "anyhow", "heck 0.5.0", - "indexmap 2.13.0", + "indexmap 2.14.0", "prettyplease", - "syn 2.0.114", + "syn 2.0.117", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -8948,7 +9038,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -8960,8 +9050,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.10.0", - "indexmap 2.13.0", + "bitflags 2.11.1", + "indexmap 2.14.0", "log", "serde", "serde_derive", @@ -8980,7 +9070,7 @@ checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" dependencies = [ "anyhow", "id-arena", - "indexmap 2.13.0", + "indexmap 2.14.0", "log", "semver", "serde", @@ -8992,9 +9082,9 @@ dependencies = [ [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "x11" @@ -9028,7 +9118,7 @@ dependencies = [ "libc", "libloading 0.8.9", "once_cell", - "rustix 1.1.3", + "rustix 1.1.4", "x11rb-protocol", "xcursor", ] @@ -9078,7 +9168,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.1", "dlib", "log", "once_cell", @@ -9120,9 +9210,9 @@ checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -9131,13 +9221,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "synstructure", ] @@ -9162,7 +9252,7 @@ dependencies = [ "nix", "once_cell", "ordered-stream", - "rand 0.8.5", + "rand 0.8.6", "serde", "serde_repr", "sha1", @@ -9179,9 +9269,9 @@ dependencies = [ [[package]] name = "zbus" -version = "5.13.2" +version = "5.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfeff997a0aaa3eb20c4652baf788d2dfa6d2839a0ead0b3ff69ce2f9c4bdd1" +checksum = "ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc" dependencies = [ "async-broadcast 0.7.2", "async-executor", @@ -9199,7 +9289,7 @@ dependencies = [ "hex", "libc", "ordered-stream", - "rustix 1.1.3", + "rustix 1.1.4", "serde", "serde_repr", "tokio", @@ -9207,10 +9297,10 @@ dependencies = [ "uds_windows", "uuid", "windows-sys 0.61.2", - "winnow 0.7.14", - "zbus_macros 5.13.2", + "winnow 0.7.15", + "zbus_macros 5.14.0", "zbus_names 4.3.1", - "zvariant 5.9.2", + "zvariant 5.10.0", ] [[package]] @@ -9229,16 +9319,16 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.13.2" +version = "5.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bbd5a90dbe8feee5b13def448427ae314ccd26a49cac47905cafefb9ff846f1" +checksum = "897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222" dependencies = [ - "proc-macro-crate 3.4.0", + "proc-macro-crate 3.5.0", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "zbus_names 4.3.1", - "zvariant 5.9.2", + "zvariant 5.10.0", "zvariant_utils 3.3.0", ] @@ -9260,8 +9350,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" dependencies = [ "serde", - "winnow 0.7.14", - "zvariant 5.9.2", + "winnow 0.7.15", + "zvariant 5.10.0", ] [[package]] @@ -9284,50 +9374,50 @@ checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" [[package]] name = "zerocopy" -version = "0.8.37" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7456cf00f0685ad319c5b1693f291a650eaf345e941d082fc4e03df8a03996ac" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.37" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1328722bbf2115db7e19d69ebcc15e795719e2d66b60827c6a69a117365e37a0" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "synstructure", ] [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -9336,9 +9426,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "serde", "yoke", @@ -9348,20 +9438,20 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "zmij" -version = "1.0.19" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" [[package]] name = "zune-core" @@ -9371,9 +9461,9 @@ checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" [[package]] name = "zune-jpeg" -version = "0.5.12" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "410e9ecef634c709e3831c2cfdb8d9c32164fae1c67496d5b68fff728eec37fe" +checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" dependencies = [ "zune-core", ] @@ -9394,16 +9484,16 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.9.2" +version = "5.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b64ef4f40c7951337ddc7023dd03528a57a3ce3408ee9da5e948bd29b232c4" +checksum = "5708299b21903bbe348e94729f22c49c55d04720a004aa350f1f9c122fd2540b" dependencies = [ "endi", "enumflags2", "serde", "url", - "winnow 0.7.14", - "zvariant_derive 5.9.2", + "winnow 0.7.15", + "zvariant_derive 5.10.0", "zvariant_utils 3.3.0", ] @@ -9422,14 +9512,14 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "5.9.2" +version = "5.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "484d5d975eb7afb52cc6b929c13d3719a20ad650fea4120e6310de3fc55e415c" +checksum = "5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c" dependencies = [ - "proc-macro-crate 3.4.0", + "proc-macro-crate 3.5.0", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "zvariant_utils 3.3.0", ] @@ -9453,6 +9543,6 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.114", - "winnow 0.7.14", + "syn 2.0.117", + "winnow 0.7.15", ] diff --git a/RustApp/Cargo.toml b/RustApp/Cargo.toml index ccd93b8d..7354c83b 100644 --- a/RustApp/Cargo.toml +++ b/RustApp/Cargo.toml @@ -58,7 +58,7 @@ anyhow = { version = "1", features = ["backtrace"] } thiserror = "2" enum_dispatch = "0.3" futures = "0.3" -cached = "0.56" +cached = "0.59" constcat = "0.6" cargo-packager-resource-resolver = { version = "0.1", features = [ "auto-detect-format", @@ -87,8 +87,8 @@ notify-rust = "4" byteorder = "1" nusb = { version = "0.2.2", optional = true, features = ["tokio", "smol"] } serde_with = "3" -strum = { version = "0.27", features = ["derive"] } -resvg = "0.46" +strum = { version = "0.28", features = ["derive"] } +resvg = "0.47" rubato = "0.16" #https://github.com/tauri-apps/fix-path-env-rs/pull/19 fix-path-env = { git = "https://github.com/wiiznokes/fix-path-env-rs", rev = "8612a0d8590843dbe9c6326d26292963e6a97f2a" } @@ -115,7 +115,7 @@ mslnk = "0.1" winres = "0.1" [target.'cfg(not(target_os = "linux"))'.dependencies] -tray-icon = "0.21.1" +tray-icon = "0.22" # [patch."https://github.com/pop-os/libcosmic.git"] # libcosmic = { path = "../../libcosmic" } From a63a1808215ce3190ebfa332b8aeef5e1cce25e7 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Wed, 22 Apr 2026 18:27:55 +0200 Subject: [PATCH 08/33] patch cosmic text to fix compile --- RustApp/Cargo.lock | 4 ++-- RustApp/Cargo.toml | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/RustApp/Cargo.lock b/RustApp/Cargo.lock index 3b771eb7..6cda8828 100644 --- a/RustApp/Cargo.lock +++ b/RustApp/Cargo.lock @@ -1548,8 +1548,8 @@ dependencies = [ [[package]] name = "cosmic-text" -version = "0.18.2" -source = "git+https://github.com/pop-os/cosmic-text.git#4d74f795cc771fdcc7ea0f9cacba63fcf036fad6" +version = "0.17.2" +source = "git+https://github.com/pop-os//cosmic-text.git?rev=4fd11f0e5e076fc16f5c7c239da22ac99a3a60b9#4fd11f0e5e076fc16f5c7c239da22ac99a3a60b9" dependencies = [ "bitflags 2.11.1", "fontdb 0.23.0", diff --git a/RustApp/Cargo.toml b/RustApp/Cargo.toml index 7354c83b..7be4409f 100644 --- a/RustApp/Cargo.toml +++ b/RustApp/Cargo.toml @@ -123,6 +123,8 @@ tray-icon = "0.22" # [patch."https://github.com/wiiznokes/speexdsp-rs-fork"] # speexdsp = { path = "../../speexdsp-rs-fork" } +[patch."https://github.com/pop-os/cosmic-text.git"] +cosmic-text = { git = "https://github.com/pop-os//cosmic-text.git", rev = "4fd11f0e5e076fc16f5c7c239da22ac99a3a60b9" } [dev-dependencies] criterion = "0.8" @@ -130,4 +132,4 @@ rand = "0.10" [[bench]] name = "audio" -harness = false \ No newline at end of file +harness = false From e3f6782a88c82d084fe1fe0276b154e36e7210a4 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Wed, 22 Apr 2026 23:57:47 +0200 Subject: [PATCH 09/33] update rubato to 2.0 --- RustApp/Cargo.lock | 65 +++++++++++- RustApp/Cargo.toml | 2 +- RustApp/result.md | 15 +++ RustApp/src/audio/mod.rs | 1 + RustApp/src/audio/process.rs | 15 ++- RustApp/src/audio/resampler.rs | 187 ++++++++++++++++++++------------- 6 files changed, 198 insertions(+), 87 deletions(-) create mode 100644 RustApp/result.md diff --git a/RustApp/Cargo.lock b/RustApp/Cargo.lock index 6cda8828..534b65cb 100644 --- a/RustApp/Cargo.lock +++ b/RustApp/Cargo.lock @@ -729,6 +729,43 @@ dependencies = [ "winapi", ] +[[package]] +name = "audio-core" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ebbf82d06013f4c41fe71303feb980cddd78496d904d06be627972de51a24" + +[[package]] +name = "audioadapter" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91f87b70b051c5866680ad79f6743a42ccab264c009d1a71f4d33a3872ae60c8" +dependencies = [ + "audio-core", + "num-traits", +] + +[[package]] +name = "audioadapter-buffers" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9097d67933fb083d382ce980430afdb758aada60846010aee6be068c06cef0ca" +dependencies = [ + "audioadapter", + "audioadapter-sample", + "num-traits", +] + +[[package]] +name = "audioadapter-sample" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ab94f2bc04a14e1f49ee5f222f66460e8a1b51627bdfedf34eed394d747938" +dependencies = [ + "audio-core", + "num-traits", +] + [[package]] name = "auto_enums" version = "0.8.8" @@ -6372,14 +6409,18 @@ checksum = "7204ed6420f698836b76d4d5c2ec5dec7585fd5c3a788fd1cde855d1de598239" [[package]] name = "rubato" -version = "0.16.2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5258099699851cfd0082aeb645feb9c084d9a5e1f1b8d5372086b989fc5e56a1" +checksum = "ce96ead1a91f7895704a9f08ea5947dfc8bd7c1f2936a22295b655ec67e5c6ef" dependencies = [ + "audioadapter", + "audioadapter-buffers", "num-complex", "num-integer", "num-traits", "realfft", + "visibility", + "windowfunctions", ] [[package]] @@ -7834,6 +7875,17 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "visibility" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d674d135b4a8c1d7e813e2f8d1c9a58308aee4a680323066025e53132218bd91" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "vte" version = "0.14.1" @@ -8321,6 +8373,15 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "windowfunctions" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90628d739333b7c5d2ee0b70210b97b8cddc38440c682c96fd9e2c24c2db5f3a" +dependencies = [ + "num-traits", +] + [[package]] name = "windows" version = "0.52.0" diff --git a/RustApp/Cargo.toml b/RustApp/Cargo.toml index 7be4409f..a8f336cd 100644 --- a/RustApp/Cargo.toml +++ b/RustApp/Cargo.toml @@ -89,7 +89,7 @@ nusb = { version = "0.2.2", optional = true, features = ["tokio", "smol"] } serde_with = "3" strum = { version = "0.28", features = ["derive"] } resvg = "0.47" -rubato = "0.16" +rubato = "2" #https://github.com/tauri-apps/fix-path-env-rs/pull/19 fix-path-env = { git = "https://github.com/wiiznokes/fix-path-env-rs", rev = "8612a0d8590843dbe9c6326d26292963e6a97f2a" } env_logger = "0.11" diff --git a/RustApp/result.md b/RustApp/result.md new file mode 100644 index 00000000..048ba2a4 --- /dev/null +++ b/RustApp/result.md @@ -0,0 +1,15 @@ +# Linux, master + +bench_resampling time: [22.339 µs 22.393 µs 22.447 µs] + +# Linux, rubato 0.16, opti no copy input + +bench_resampling time: [19.860 µs 20.463 µs 21.003 µs] +change: [−9.3247% −7.3958% −5.7062%] (p = 0.00 < 0.05) +Performance has improved. + +# Linux, rubato 0.16, opti no copy input + +bench_resampling time: [15.149 µs 15.495 µs 15.876 µs] +change: [−24.540% −22.301% −20.162%] (p = 0.00 < 0.05) +Performance has improved. diff --git a/RustApp/src/audio/mod.rs b/RustApp/src/audio/mod.rs index 0ce45b86..9fd1bd4b 100644 --- a/RustApp/src/audio/mod.rs +++ b/RustApp/src/audio/mod.rs @@ -13,6 +13,7 @@ pub mod player; mod postprocessing; pub mod process; pub mod resampler; +// pub mod resampler2; mod speexdsp; /// Audio processing parameters diff --git a/RustApp/src/audio/process.rs b/RustApp/src/audio/process.rs index 41544a66..323eb089 100644 --- a/RustApp/src/audio/process.rs +++ b/RustApp/src/audio/process.rs @@ -58,8 +58,8 @@ impl AudioStream { } else { let tmp = resample_f32_stream( &buffer, - current_sample_rate, - DENOISE_RNNOISE_SAMPLE_RATE, + current_sample_rate as usize, + DENOISE_RNNOISE_SAMPLE_RATE as usize, )?; current_sample_rate = DENOISE_RNNOISE_SAMPLE_RATE; Cow::Owned(tmp) @@ -76,7 +76,7 @@ impl AudioStream { let prepared_buffer = if current_sample_rate == SPEEXDSP_SAMPLE_RATE { Cow::Borrowed(&buffer) } else { - let tmp = resample_f32_stream(&buffer, current_sample_rate, SPEEXDSP_SAMPLE_RATE)?; + let tmp = resample_f32_stream(&buffer, current_sample_rate as usize, SPEEXDSP_SAMPLE_RATE as usize)?; current_sample_rate = SPEEXDSP_SAMPLE_RATE; Cow::Owned(tmp) }; @@ -89,8 +89,8 @@ impl AudioStream { } else { resample_f32_stream( &buffer, - current_sample_rate, - config.target_format.sample_rate.to_number(), + current_sample_rate as usize, + config.target_format.sample_rate.to_number() as usize, )? }; @@ -223,10 +223,7 @@ where // Initialize a vector to hold the results for each channel let mut result = vec![Vec::with_capacity(samples_per_channel); channel_count]; - for buf in packet - .buffer - .chunks_exact(audio_format.sample_size()) - { + for buf in packet.buffer.chunks_exact(audio_format.sample_size()) { for result in &mut result { let sample = F::from_bytes(buf).to_f32(); result.push(sample); diff --git a/RustApp/src/audio/resampler.rs b/RustApp/src/audio/resampler.rs index ec27667f..63f4c2e7 100644 --- a/RustApp/src/audio/resampler.rs +++ b/RustApp/src/audio/resampler.rs @@ -1,28 +1,30 @@ use std::sync::{LazyLock, Mutex}; -use rubato::Resampler; +use rubato::{Indexing, Resampler}; struct ResamplerCache { - input_rate: u32, - output_rate: u32, + input_rate: usize, + output_rate: usize, num_channels: usize, unprocessed_buffer: Vec>, - output_buffer: Vec>, - resampler: rubato::FastFixedIn, + resampler: rubato::Fft, } static RESAMPLER_CACHE: LazyLock>> = LazyLock::new(|| Mutex::new(None)); +const CHUNK_SIZE: usize = 1024; + pub fn resample_f32_stream( data: &[Vec], - input_sample_rate: u32, - output_sample_rate: u32, + input_sample_rate: usize, + output_sample_rate: usize, ) -> anyhow::Result>> { - let chunk_size = 1024; - let resample_ratio = output_sample_rate as f64 / input_sample_rate as f64; let mut resampler_cache = RESAMPLER_CACHE.lock().unwrap(); + let input_len = data[0].len(); + let nb_channel = data.len(); + if match resampler_cache.as_ref() { Some(c) => { c.input_rate != input_sample_rate @@ -31,94 +33,129 @@ pub fn resample_f32_stream( } None => true, } { - let resampler = rubato::FastFixedIn::::new( - resample_ratio, - 1.0, - rubato::PolynomialDegree::Cubic, - chunk_size, - data.len(), + let resampler = rubato::Fft::new( + input_sample_rate, + output_sample_rate, + CHUNK_SIZE, + 1, + nb_channel, + rubato::FixedSync::Both, )?; *resampler_cache = Some(ResamplerCache { input_rate: input_sample_rate, output_rate: output_sample_rate, - num_channels: data.len(), - unprocessed_buffer: vec![Vec::new(); data.len()], - output_buffer: resampler.output_buffer_allocate(true), + num_channels: nb_channel, + unprocessed_buffer: vec![Vec::with_capacity(resampler.input_frames_max()); nb_channel], resampler, }); } let cache = resampler_cache.as_mut().unwrap(); + let ResamplerCache { + resampler, + unprocessed_buffer, + .. + } = cache; + + let needed = resampler.input_frames_next(); + + let output_len = { + let max_output_frames = cache.resampler.output_frames_max(); + let estimated_chunks = (input_len + unprocessed_buffer[0].len()) / needed + 2; + max_output_frames * estimated_chunks + }; - let mut output: Vec> = - vec![ - Vec::with_capacity(cache.output_buffer[0].len() * data[0].len() / chunk_size); - data.len() - ]; - - let start = if !cache.unprocessed_buffer[0].is_empty() { - let missing = chunk_size - cache.unprocessed_buffer[0].len(); - if data[0].len() >= missing { - for (data, unprocessed_buffer) in data.iter().zip(cache.unprocessed_buffer.iter_mut()) { + let mut output: Vec> = vec![ + { + let mut v = Vec::with_capacity(output_len); + // safety: we only write in this function and we set the real len at the end + unsafe { + v.set_len(output_len); + } + v + }; + data.len() + ]; + + let mut buffer_out = rubato::audioadapter_buffers::direct::SequentialSliceOfVecs::new_mut( + &mut output, + nb_channel, + output_len, + ) + .unwrap(); + + let mut input_offset = 0; + let mut output_offset = 0; + + if !unprocessed_buffer[0].is_empty() { + let missing = needed - unprocessed_buffer[0].len(); + if input_len >= missing { + for (data, unprocessed_buffer) in data.iter().zip(unprocessed_buffer.iter_mut()) { unprocessed_buffer.extend_from_slice(&data[0..missing]); } - let (_, frames) = cache.resampler.process_into_buffer( - &cache.unprocessed_buffer, - &mut cache.output_buffer, - None, - )?; + let buffer_in_leftover = + rubato::audioadapter_buffers::direct::SequentialSliceOfVecs::new( + unprocessed_buffer, + nb_channel, + needed, + ) + .unwrap(); - for (output, chunk) in output.iter_mut().zip(cache.output_buffer.iter()) { - output.extend_from_slice(&chunk[..frames]); - } + let (_, frames) = cache + .resampler + .process_into_buffer(&buffer_in_leftover, &mut buffer_out, None) + .unwrap(); + + output_offset = frames; - for channel in &mut cache.unprocessed_buffer { + for channel in unprocessed_buffer.iter_mut() { channel.clear(); } - missing - } else { - 0 + input_offset = missing; } - } else { - 0 }; - let mut data = data - .iter() - .map(|channel_data| channel_data[start..].chunks_exact(chunk_size)) - .collect::>(); - - let mut buffer = Vec::with_capacity(data.len()); - - let mut done = false; - loop { - for chunk in &mut data { - if let Some(chunk) = chunk.next() { - buffer.push(chunk); - } else { - done = true; - } - } - - if done { - for (chunk, unprocessed_buffer) in data.iter().zip(cache.unprocessed_buffer.iter_mut()) - { - unprocessed_buffer.extend_from_slice(chunk.remainder()); - } - return Ok(output); - } - - let (_, frames) = - cache - .resampler - .process_into_buffer(&buffer, &mut cache.output_buffer, None)?; + // workarround for the lifetime issue + // because in process_into_buffer, buffer_out and buffer_in must have the same lifetime. + let mut buffer_out = rubato::audioadapter_buffers::direct::SequentialSliceOfVecs::new_mut( + &mut output, + nb_channel, + output_len, + ) + .unwrap(); + + let buffer_in = rubato::audioadapter_buffers::direct::SequentialSliceOfVecs::new( + data, nb_channel, input_len, + ) + .unwrap(); + + while (input_len - input_offset) >= needed { + let indexing = Indexing { + input_offset, + output_offset, + partial_len: None, + active_channels_mask: None, + }; + + let (_, frames) = cache + .resampler + .process_into_buffer(&buffer_in, &mut buffer_out, Some(&indexing)) + .unwrap(); + + input_offset += needed; + output_offset += frames; + } - for (output, chunk) in output.iter_mut().zip(cache.output_buffer.iter()) { - output.extend_from_slice(&chunk[..frames]); - } + for (chunk, unprocessed_buffer) in data.iter().zip(unprocessed_buffer.iter_mut()) { + unprocessed_buffer.clear(); + unprocessed_buffer.extend_from_slice(&chunk[input_offset..]); + } - buffer.clear(); + for channel in &mut output { + channel.truncate(output_offset); } + + Ok(output) } From 5f1187f8049a8b514e37a60d83e106c01894c2f3 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Wed, 22 Apr 2026 23:58:03 +0200 Subject: [PATCH 10/33] Update result.md --- RustApp/result.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RustApp/result.md b/RustApp/result.md index 048ba2a4..78818156 100644 --- a/RustApp/result.md +++ b/RustApp/result.md @@ -8,7 +8,7 @@ bench_resampling time: [19.860 µs 20.463 µs 21.003 µs] change: [−9.3247% −7.3958% −5.7062%] (p = 0.00 < 0.05) Performance has improved. -# Linux, rubato 0.16, opti no copy input +# Linux, rubato 2.0 bench_resampling time: [15.149 µs 15.495 µs 15.876 µs] change: [−24.540% −22.301% −20.162%] (p = 0.00 < 0.05) From efc1249b37041638a83c05c3484161a0a24bc179 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Thu, 23 Apr 2026 00:15:09 +0200 Subject: [PATCH 11/33] reuse variable --- RustApp/src/audio/process.rs | 39 +++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/RustApp/src/audio/process.rs b/RustApp/src/audio/process.rs index 323eb089..81ac27f0 100644 --- a/RustApp/src/audio/process.rs +++ b/RustApp/src/audio/process.rs @@ -76,7 +76,11 @@ impl AudioStream { let prepared_buffer = if current_sample_rate == SPEEXDSP_SAMPLE_RATE { Cow::Borrowed(&buffer) } else { - let tmp = resample_f32_stream(&buffer, current_sample_rate as usize, SPEEXDSP_SAMPLE_RATE as usize)?; + let tmp = resample_f32_stream( + &buffer, + current_sample_rate as usize, + SPEEXDSP_SAMPLE_RATE as usize, + )?; current_sample_rate = SPEEXDSP_SAMPLE_RATE; Cow::Owned(tmp) }; @@ -96,44 +100,51 @@ impl AudioStream { // inject post effect if needed // NOTE: one day I might add UI for users to customize these parameters, but for now just hardcode the presets - let sample_rate = config.target_format.sample_rate.to_number(); match &config.post_effect { + AudioEffect::NoEffect => {} AudioEffect::Echo => { - post_apply_echo(&mut buffer, sample_rate, 300, 0.5, 0.3, 0.25); + post_apply_echo(&mut buffer, current_sample_rate, 300, 0.5, 0.3, 0.25); } AudioEffect::ReverbIntimate => { - post_apply_reverb(&mut buffer, sample_rate, 0.5, 0.8, 0.15); + post_apply_reverb(&mut buffer, current_sample_rate, 0.5, 0.8, 0.15); } AudioEffect::ReverbSpatious => { - post_apply_reverb(&mut buffer, sample_rate, 0.85, 0.5, 0.3); + post_apply_reverb(&mut buffer, current_sample_rate, 0.85, 0.5, 0.3); } AudioEffect::Spaceship => { - post_apply_flanger(&mut buffer, sample_rate, 0.25, 1.0, 6.0, 0.8, 0.5); + post_apply_flanger(&mut buffer, current_sample_rate, 0.25, 1.0, 6.0, 0.8, 0.5); } AudioEffect::Underwater => { - post_apply_phaser(&mut buffer, sample_rate, 1.5, 150.0, 1200.0, 0.6, 0.7); + post_apply_phaser( + &mut buffer, + current_sample_rate, + 1.5, + 150.0, + 1200.0, + 0.6, + 0.7, + ); } AudioEffect::PitchUp => { - post_apply_pitch_shift(&mut buffer, sample_rate, 1.5, 1.0); + post_apply_pitch_shift(&mut buffer, current_sample_rate, 1.5, 1.0); } AudioEffect::PitchDown => { - post_apply_pitch_shift(&mut buffer, sample_rate, 0.75, 1.0); + post_apply_pitch_shift(&mut buffer, current_sample_rate, 0.75, 1.0); } AudioEffect::Demon => { - post_apply_pitch_shift(&mut buffer, sample_rate, 0.8, 0.65); + post_apply_pitch_shift(&mut buffer, current_sample_rate, 0.8, 0.65); } AudioEffect::Walkie => { - post_apply_walkie_talkie(&mut buffer, sample_rate, 1200.0, 1.5, 5.0, 1.0); + post_apply_walkie_talkie(&mut buffer, current_sample_rate, 1200.0, 1.5, 5.0, 1.0); } AudioEffect::Popstar => { - post_apply_popstar(&mut buffer, sample_rate, 0.02, 0.8); + post_apply_popstar(&mut buffer, current_sample_rate, 0.02, 0.8); } AudioEffect::Robot => { // NOTE: this vocoder preset does not sound great, but I have no idea how to improve it further // Leave it here for now and maybe one day there will be a better solution - post_apply_vocoder(&mut buffer, sample_rate, 4, 120.0, 2.8, 0.9); + post_apply_vocoder(&mut buffer, current_sample_rate, 4, 120.0, 2.8, 0.9); } - AudioEffect::NoEffect => {} } if let Some(amplify) = config.amplify { From 4304df5ec2de3345d953253a1074386835d2f7ab Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Thu, 23 Apr 2026 00:25:50 +0200 Subject: [PATCH 12/33] add bench for speexdsp --- RustApp/benches/audio.rs | 48 ++++++++++++++++++++++++++++++++++++++-- RustApp/result.md | 6 +++++ RustApp/src/audio/mod.rs | 5 ++--- 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/RustApp/benches/audio.rs b/RustApp/benches/audio.rs index 00c50e3a..df90e5cd 100644 --- a/RustApp/benches/audio.rs +++ b/RustApp/benches/audio.rs @@ -4,8 +4,9 @@ use android_mic::{ audio::{ AudioPacketFormat, AudioProcessParams, player::process_audio, process::convert_packet_to_f32, resampler::resample_f32_stream, + speexdsp::process_speex_f32_stream, }, - config::{AudioEffect, AudioFormat, ChannelCount, SampleRate}, + config::{AudioEffect, AudioFormat, ChannelCount, DenoiseKind, SampleRate}, streamer::{AudioPacketMessage, AudioStream}, }; use criterion::{Criterion, criterion_group, criterion_main}; @@ -105,5 +106,48 @@ fn bench_resampling(c: &mut Criterion) { }); } -criterion_group!(benches, bench_player, bench_process, bench_resampling); +fn bench_speexdsp(c: &mut Criterion) { + c.bench_function("bench_speexdsp", |b| { + let source = make_random(3840); + + let packet = AudioPacketMessage { + buffer: source, + sample_rate: 48000, + channel_count: 1, + audio_format: 2, + }; + + let buffer = convert_packet_to_f32(&packet).unwrap(); + + let audio_params = AudioProcessParams { + target_format: AudioPacketFormat { + sample_rate: SampleRate::S48000, + audio_format: AudioFormat::I16, + channel_count: ChannelCount::Mono, + }, + denoise: Some(DenoiseKind::Speexdsp), + amplify: None, + post_effect: AudioEffect::NoEffect, + speex_noise_suppress: -30, + speex_vad_enabled: false, + speex_vad_threshold: 80, + speex_agc_enabled: false, + speex_agc_target: 8000, + speex_dereverb_enabled: false, + speex_dereverb_level: 0.5, + }; + + b.iter(|| { + process_speex_f32_stream(&buffer, &audio_params).unwrap(); + }); + }); +} + +criterion_group!( + benches, + bench_player, + bench_process, + bench_resampling, + bench_speexdsp +); criterion_main!(benches); diff --git a/RustApp/result.md b/RustApp/result.md index 78818156..d6abb8d5 100644 --- a/RustApp/result.md +++ b/RustApp/result.md @@ -13,3 +13,9 @@ Performance has improved. bench_resampling time: [15.149 µs 15.495 µs 15.876 µs] change: [−24.540% −22.301% −20.162%] (p = 0.00 < 0.05) Performance has improved. + +## For speexdsp + +# Linux, master + +bench_speexdsp time: [97.000 µs 97.257 µs 97.523 µs] diff --git a/RustApp/src/audio/mod.rs b/RustApp/src/audio/mod.rs index 9fd1bd4b..3273ea57 100644 --- a/RustApp/src/audio/mod.rs +++ b/RustApp/src/audio/mod.rs @@ -8,13 +8,12 @@ use crate::{ ui::app::{AppState, Stream}, }; -mod denoise_rnnoise; +pub mod denoise_rnnoise; pub mod player; mod postprocessing; pub mod process; pub mod resampler; -// pub mod resampler2; -mod speexdsp; +pub mod speexdsp; /// Audio processing parameters #[derive(Clone, Debug)] From 3d35b26f5f1d04a15461afbb0f5950ee4f425c2a Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Thu, 23 Apr 2026 00:56:34 +0200 Subject: [PATCH 13/33] add process cache structure. This is usefull because we call the resampling function with different parameter --- RustApp/benches/audio.rs | 16 +++++++++---- RustApp/src/audio/process.rs | 34 ++++++++++++++++++++++++---- RustApp/src/audio/resampler.rs | 21 +++++++---------- RustApp/src/streamer/tcp_streamer.rs | 9 +++++++- RustApp/src/streamer/udp_streamer.rs | 9 +++++++- RustApp/src/streamer/usb_streamer.rs | 9 +++++++- 6 files changed, 73 insertions(+), 25 deletions(-) diff --git a/RustApp/benches/audio.rs b/RustApp/benches/audio.rs index df90e5cd..460eb90f 100644 --- a/RustApp/benches/audio.rs +++ b/RustApp/benches/audio.rs @@ -2,8 +2,10 @@ use std::io::Write; use android_mic::{ audio::{ - AudioPacketFormat, AudioProcessParams, player::process_audio, - process::convert_packet_to_f32, resampler::resample_f32_stream, + AudioPacketFormat, AudioProcessParams, + player::process_audio, + process::{ProcessCache, convert_packet_to_f32}, + resampler::resample_f32_stream, speexdsp::process_speex_f32_stream, }, config::{AudioEffect, AudioFormat, ChannelCount, DenoiseKind, SampleRate}, @@ -69,6 +71,8 @@ fn bench_process(c: &mut Criterion) { let mut audio_stream = AudioStream::new(producer, audio_params, false); + let mut cache = ProcessCache::new(); + b.iter(|| { let source = make_random(3840); @@ -79,7 +83,9 @@ fn bench_process(c: &mut Criterion) { audio_format: 2, }; - audio_stream.process_audio_packet(packet).unwrap(); + audio_stream + .process_audio_packet(packet, &mut cache) + .unwrap(); let chunk = consumer.read_chunk(consumer.slots()).unwrap(); chunk.commit_all(); @@ -100,8 +106,10 @@ fn bench_resampling(c: &mut Criterion) { let buffer = convert_packet_to_f32(&packet).unwrap(); + let mut cache = None; + b.iter(|| { - resample_f32_stream(&buffer, 44100, 48000).unwrap(); + resample_f32_stream(&buffer, 44100, 48000, &mut cache).unwrap(); }); }); } diff --git a/RustApp/src/audio/process.rs b/RustApp/src/audio/process.rs index 81ac27f0..54e819dd 100644 --- a/RustApp/src/audio/process.rs +++ b/RustApp/src/audio/process.rs @@ -7,6 +7,7 @@ use crate::{ post_apply_echo, post_apply_flanger, post_apply_phaser, post_apply_pitch_shift, post_apply_popstar, post_apply_reverb, post_apply_vocoder, post_apply_walkie_talkie, }, + resampler::ResamplerCache, speexdsp::{SPEEXDSP_SAMPLE_RATE, process_speex_f32_stream}, }, config::{AudioEffect, AudioFormat, DenoiseKind}, @@ -15,6 +16,24 @@ use crate::{ use super::{AudioBytes, denoise_rnnoise::denoise_f32_stream, resampler::resample_f32_stream}; +#[derive(Default)] +pub struct ProcessCache { + resample_rnnoise_cache: Option, + resample_speexdsp_cache: Option, + resample_to_target: Option, +} + +impl ProcessCache { + pub fn new() -> Self { + Self::default() + } + pub fn clear(&mut self) { + self.resample_rnnoise_cache = None; + self.resample_speexdsp_cache = None; + self.resample_to_target = None; + } +} + impl AudioStream { /// This function converts an audio stream from packet into producer /// apply any necessary conversions based on the audio format @@ -22,13 +41,14 @@ impl AudioStream { pub fn process_audio_packet( &mut self, packet: AudioPacketMessage, + cache: &mut ProcessCache, ) -> anyhow::Result>> { match self.audio_params.target_format.audio_format { - AudioFormat::I16 => self.process_audio_packet_internal::(packet), - AudioFormat::I24 => self.process_audio_packet_internal::(packet), - AudioFormat::I32 => self.process_audio_packet_internal::(packet), - AudioFormat::U8 => self.process_audio_packet_internal::(packet), - AudioFormat::F32 => self.process_audio_packet_internal::(packet), + AudioFormat::I16 => self.process_audio_packet_internal::(packet, cache), + AudioFormat::I24 => self.process_audio_packet_internal::(packet, cache), + AudioFormat::I32 => self.process_audio_packet_internal::(packet, cache), + AudioFormat::U8 => self.process_audio_packet_internal::(packet, cache), + AudioFormat::F32 => self.process_audio_packet_internal::(packet, cache), } .map_err(|e| { warn!("failed to convert audio stream: {e}"); @@ -39,6 +59,7 @@ impl AudioStream { fn process_audio_packet_internal( &mut self, packet: AudioPacketMessage, + cache: &mut ProcessCache, ) -> anyhow::Result>> where F: cpal::SizedSample + AudioBytes + std::fmt::Debug + 'static, @@ -60,6 +81,7 @@ impl AudioStream { &buffer, current_sample_rate as usize, DENOISE_RNNOISE_SAMPLE_RATE as usize, + &mut cache.resample_rnnoise_cache, )?; current_sample_rate = DENOISE_RNNOISE_SAMPLE_RATE; Cow::Owned(tmp) @@ -80,6 +102,7 @@ impl AudioStream { &buffer, current_sample_rate as usize, SPEEXDSP_SAMPLE_RATE as usize, + &mut cache.resample_speexdsp_cache, )?; current_sample_rate = SPEEXDSP_SAMPLE_RATE; Cow::Owned(tmp) @@ -95,6 +118,7 @@ impl AudioStream { &buffer, current_sample_rate as usize, config.target_format.sample_rate.to_number() as usize, + &mut cache.resample_to_target, )? }; diff --git a/RustApp/src/audio/resampler.rs b/RustApp/src/audio/resampler.rs index 63f4c2e7..811f9d2a 100644 --- a/RustApp/src/audio/resampler.rs +++ b/RustApp/src/audio/resampler.rs @@ -1,8 +1,6 @@ -use std::sync::{LazyLock, Mutex}; - use rubato::{Indexing, Resampler}; -struct ResamplerCache { +pub struct ResamplerCache { input_rate: usize, output_rate: usize, num_channels: usize, @@ -10,22 +8,18 @@ struct ResamplerCache { resampler: rubato::Fft, } -static RESAMPLER_CACHE: LazyLock>> = - LazyLock::new(|| Mutex::new(None)); - const CHUNK_SIZE: usize = 1024; pub fn resample_f32_stream( data: &[Vec], input_sample_rate: usize, output_sample_rate: usize, + cache: &mut Option, ) -> anyhow::Result>> { - let mut resampler_cache = RESAMPLER_CACHE.lock().unwrap(); - let input_len = data[0].len(); let nb_channel = data.len(); - - if match resampler_cache.as_ref() { + + if match cache { Some(c) => { c.input_rate != input_sample_rate || c.output_rate != output_sample_rate @@ -42,16 +36,16 @@ pub fn resample_f32_stream( rubato::FixedSync::Both, )?; - *resampler_cache = Some(ResamplerCache { + *cache = Some(ResamplerCache { input_rate: input_sample_rate, output_rate: output_sample_rate, num_channels: nb_channel, unprocessed_buffer: vec![Vec::with_capacity(resampler.input_frames_max()); nb_channel], resampler, }); - } + }; - let cache = resampler_cache.as_mut().unwrap(); + let cache = cache.as_mut().unwrap(); let ResamplerCache { resampler, unprocessed_buffer, @@ -67,6 +61,7 @@ pub fn resample_f32_stream( }; let mut output: Vec> = vec![ + #[allow(clippy::uninit_vec)] { let mut v = Vec::with_capacity(output_len); // safety: we only write in this function and we set the real len at the end diff --git a/RustApp/src/streamer/tcp_streamer.rs b/RustApp/src/streamer/tcp_streamer.rs index 166d47dd..f6568738 100644 --- a/RustApp/src/streamer/tcp_streamer.rs +++ b/RustApp/src/streamer/tcp_streamer.rs @@ -9,6 +9,7 @@ use tokio::{ use tokio_util::codec::{Framed, LengthDelimitedCodec}; use crate::{ + audio::process::ProcessCache, config::ConnectionMode, streamer::{CHECK_1, CHECK_2, StreamerMsg, WriteError}, }; @@ -24,6 +25,7 @@ pub struct TcpStreamer { pub port: u16, pub state: TcpStreamerState, stream_config: AudioStream, + process_cache: ProcessCache, } #[allow(clippy::large_enum_variant)] @@ -53,6 +55,7 @@ pub async fn new( port: addr.port(), stream_config, state: TcpStreamerState::Listening { listener }, + process_cache: ProcessCache::new(), }; Ok(streamer) @@ -61,6 +64,7 @@ pub async fn new( impl StreamerTrait for TcpStreamer { fn reconfigure_stream(&mut self, stream_config: AudioStream) { self.stream_config = stream_config; + self.process_cache.clear(); } fn status(&self) -> StreamerMsg { @@ -132,7 +136,10 @@ impl StreamerTrait for TcpStreamer { let buffer_size = packet.buffer.len(); let sample_rate = packet.sample_rate; - match self.stream_config.process_audio_packet(packet) { + match self + .stream_config + .process_audio_packet(packet, &mut self.process_cache) + { Ok(Some(buffer)) => { debug!("received {} bytes", buffer_size); Ok(Some(StreamerMsg::UpdateAudioWave { diff --git a/RustApp/src/streamer/udp_streamer.rs b/RustApp/src/streamer/udp_streamer.rs index 64171a9d..519856f8 100644 --- a/RustApp/src/streamer/udp_streamer.rs +++ b/RustApp/src/streamer/udp_streamer.rs @@ -6,6 +6,7 @@ use tokio::net::UdpSocket; use tokio_util::{codec::LengthDelimitedCodec, udp::UdpFramed}; use crate::{ + audio::process::ProcessCache, config::ConnectionMode, streamer::{ AudioPacketMessage, CHECK_2, WriteError, @@ -26,6 +27,7 @@ pub struct UdpStreamer { framed: UdpFramed, is_listening: bool, tracked_sequence: u32, + process_cache: ProcessCache, } pub async fn new( @@ -46,6 +48,7 @@ pub async fn new( tracked_sequence: 0, is_listening: true, framed: UdpFramed::new(socket, LengthDelimitedCodec::new()), + process_cache: ProcessCache::new(), }; Ok(streamer) @@ -54,6 +57,7 @@ pub async fn new( impl StreamerTrait for UdpStreamer { fn reconfigure_stream(&mut self, stream_config: AudioStream) { self.stream_config = stream_config; + self.process_cache.clear(); } fn status(&self) -> StreamerMsg { @@ -103,7 +107,10 @@ impl StreamerTrait for UdpStreamer { let buffer_size = packet.buffer.len(); let sample_rate = packet.sample_rate; - match self.stream_config.process_audio_packet(packet) { + match self.stream_config.process_audio_packet( + packet, + &mut self.process_cache, + ) { Ok(Some(buffer)) => { debug!( "From {:?}, received {} bytes", diff --git a/RustApp/src/streamer/usb_streamer.rs b/RustApp/src/streamer/usb_streamer.rs index 38848bf3..e76af73f 100644 --- a/RustApp/src/streamer/usb_streamer.rs +++ b/RustApp/src/streamer/usb_streamer.rs @@ -8,6 +8,7 @@ use tokio_util::codec::{FramedRead, LengthDelimitedCodec}; use super::AudioStream; use crate::{ + audio::process::ProcessCache, config::ConnectionMode, streamer::{ CHECK_2, WriteError, @@ -28,6 +29,7 @@ pub struct UsbStreamer { writer: EndpointWrite, is_listening: bool, tracked_sequence: u32, + process_cache: ProcessCache, } // switch a USB device to accessory mode @@ -169,6 +171,7 @@ pub async fn new(stream_config: AudioStream) -> Result Result StreamerMsg { @@ -226,7 +230,10 @@ impl StreamerTrait for UsbStreamer { let buffer_size = packet.buffer.len(); let sample_rate = packet.sample_rate; - match self.stream_config.process_audio_packet(packet) { + match self.stream_config.process_audio_packet( + packet, + &mut self.process_cache, + ) { Ok(Some(buffer)) => { debug!("received {} bytes", buffer_size); Some(StreamerMsg::UpdateAudioWave { From 0d561bfc7f0dad938429509cc9e6b3bddf0fb196 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Thu, 23 Apr 2026 01:49:50 +0200 Subject: [PATCH 14/33] opti, cache result for resampling (not significatif) --- RustApp/benches/audio.rs | 4 +-- RustApp/result.md | 7 +++++ RustApp/src/audio/process.rs | 54 ++++++++++++++++---------------- RustApp/src/audio/resampler.rs | 57 +++++++++++++++++++++------------- 4 files changed, 73 insertions(+), 49 deletions(-) diff --git a/RustApp/benches/audio.rs b/RustApp/benches/audio.rs index 460eb90f..78161d9b 100644 --- a/RustApp/benches/audio.rs +++ b/RustApp/benches/audio.rs @@ -53,11 +53,11 @@ fn bench_process(c: &mut Criterion) { let audio_params = AudioProcessParams { target_format: AudioPacketFormat { - sample_rate: SampleRate::S48000, + sample_rate: SampleRate::S16000, audio_format: AudioFormat::I16, channel_count: ChannelCount::Mono, }, - denoise: None, + denoise: Some(DenoiseKind::Speexdsp), amplify: None, post_effect: AudioEffect::NoEffect, speex_noise_suppress: -30, diff --git a/RustApp/result.md b/RustApp/result.md index d6abb8d5..6ee7196e 100644 --- a/RustApp/result.md +++ b/RustApp/result.md @@ -19,3 +19,10 @@ Performance has improved. # Linux, master bench_speexdsp time: [97.000 µs 97.257 µs 97.523 µs] + +## For process + +# Linux, after resampling cache result opti + +bench_process time: [160.59 µs 162.31 µs 164.43 µs] + diff --git a/RustApp/src/audio/process.rs b/RustApp/src/audio/process.rs index 54e819dd..8b85f950 100644 --- a/RustApp/src/audio/process.rs +++ b/RustApp/src/audio/process.rs @@ -7,7 +7,7 @@ use crate::{ post_apply_echo, post_apply_flanger, post_apply_phaser, post_apply_pitch_shift, post_apply_popstar, post_apply_reverb, post_apply_vocoder, post_apply_walkie_talkie, }, - resampler::ResamplerCache, + resampler::{ResamplerCache, resample_f32_stream_owned}, speexdsp::{SPEEXDSP_SAMPLE_RATE, process_speex_f32_stream}, }, config::{AudioEffect, AudioFormat, DenoiseKind}, @@ -74,18 +74,19 @@ impl AudioStream { if let Some(denoise) = &config.denoise { match denoise { DenoiseKind::Rnnoise => { - let prepared_buffer = if current_sample_rate == DENOISE_RNNOISE_SAMPLE_RATE { - Cow::Borrowed(&buffer) - } else { - let tmp = resample_f32_stream( - &buffer, - current_sample_rate as usize, - DENOISE_RNNOISE_SAMPLE_RATE as usize, - &mut cache.resample_rnnoise_cache, - )?; - current_sample_rate = DENOISE_RNNOISE_SAMPLE_RATE; - Cow::Owned(tmp) - }; + let prepared_buffer: Cow<'_, [Vec]> = + if current_sample_rate == DENOISE_RNNOISE_SAMPLE_RATE { + Cow::Borrowed(&buffer) + } else { + let tmp = resample_f32_stream( + &buffer, + current_sample_rate as usize, + DENOISE_RNNOISE_SAMPLE_RATE as usize, + &mut cache.resample_rnnoise_cache, + )?; + current_sample_rate = DENOISE_RNNOISE_SAMPLE_RATE; + Cow::Borrowed(tmp) + }; // denoise the audio stream buffer = denoise_f32_stream(&prepared_buffer)?; @@ -95,18 +96,19 @@ impl AudioStream { } if config.is_speex_used() { - let prepared_buffer = if current_sample_rate == SPEEXDSP_SAMPLE_RATE { - Cow::Borrowed(&buffer) - } else { - let tmp = resample_f32_stream( - &buffer, - current_sample_rate as usize, - SPEEXDSP_SAMPLE_RATE as usize, - &mut cache.resample_speexdsp_cache, - )?; - current_sample_rate = SPEEXDSP_SAMPLE_RATE; - Cow::Owned(tmp) - }; + let prepared_buffer: Cow<'_, [Vec]> = + if current_sample_rate == SPEEXDSP_SAMPLE_RATE { + Cow::Borrowed(&buffer) + } else { + let tmp = resample_f32_stream( + &buffer, + current_sample_rate as usize, + SPEEXDSP_SAMPLE_RATE as usize, + &mut cache.resample_speexdsp_cache, + )?; + current_sample_rate = SPEEXDSP_SAMPLE_RATE; + Cow::Borrowed(tmp) + }; buffer = process_speex_f32_stream(&prepared_buffer, config)?; } @@ -114,7 +116,7 @@ impl AudioStream { buffer = if config.target_format.sample_rate.to_number() == current_sample_rate { buffer } else { - resample_f32_stream( + resample_f32_stream_owned( &buffer, current_sample_rate as usize, config.target_format.sample_rate.to_number() as usize, diff --git a/RustApp/src/audio/resampler.rs b/RustApp/src/audio/resampler.rs index 811f9d2a..897a5b16 100644 --- a/RustApp/src/audio/resampler.rs +++ b/RustApp/src/audio/resampler.rs @@ -3,27 +3,44 @@ use rubato::{Indexing, Resampler}; pub struct ResamplerCache { input_rate: usize, output_rate: usize, - num_channels: usize, + nb_channels: usize, unprocessed_buffer: Vec>, resampler: rubato::Fft, + result: Vec>, } const CHUNK_SIZE: usize = 1024; -pub fn resample_f32_stream( +pub fn resample_f32_stream_owned( data: &[Vec], input_sample_rate: usize, output_sample_rate: usize, cache: &mut Option, ) -> anyhow::Result>> { + resample_f32_stream(data, input_sample_rate, output_sample_rate, cache)?; + + let cache = cache.as_mut().unwrap(); + + Ok(std::mem::replace( + &mut cache.result, + vec![Vec::new(); cache.nb_channels], + )) +} + +pub fn resample_f32_stream<'a>( + data: &[Vec], + input_sample_rate: usize, + output_sample_rate: usize, + cache: &'a mut Option, +) -> anyhow::Result<&'a mut [Vec]> { let input_len = data[0].len(); let nb_channel = data.len(); - + if match cache { Some(c) => { c.input_rate != input_sample_rate || c.output_rate != output_sample_rate - || c.num_channels != data.len() + || c.nb_channels != data.len() } None => true, } { @@ -39,9 +56,10 @@ pub fn resample_f32_stream( *cache = Some(ResamplerCache { input_rate: input_sample_rate, output_rate: output_sample_rate, - num_channels: nb_channel, + nb_channels: nb_channel, unprocessed_buffer: vec![Vec::with_capacity(resampler.input_frames_max()); nb_channel], resampler, + result: vec![Vec::new(); nb_channel], }); }; @@ -60,21 +78,18 @@ pub fn resample_f32_stream( max_output_frames * estimated_chunks }; - let mut output: Vec> = vec![ - #[allow(clippy::uninit_vec)] - { - let mut v = Vec::with_capacity(output_len); - // safety: we only write in this function and we set the real len at the end - unsafe { - v.set_len(output_len); - } - v - }; - data.len() - ]; + for v in &mut cache.result { + if v.capacity() < output_len { + v.reserve_exact(output_len - v.len()); + } + // safety: we only write in this function and we set the real len at the end + unsafe { + v.set_len(output_len); + } + } let mut buffer_out = rubato::audioadapter_buffers::direct::SequentialSliceOfVecs::new_mut( - &mut output, + &mut cache.result, nb_channel, output_len, ) @@ -115,7 +130,7 @@ pub fn resample_f32_stream( // workarround for the lifetime issue // because in process_into_buffer, buffer_out and buffer_in must have the same lifetime. let mut buffer_out = rubato::audioadapter_buffers::direct::SequentialSliceOfVecs::new_mut( - &mut output, + &mut cache.result, nb_channel, output_len, ) @@ -148,9 +163,9 @@ pub fn resample_f32_stream( unprocessed_buffer.extend_from_slice(&chunk[input_offset..]); } - for channel in &mut output { + for channel in &mut cache.result { channel.truncate(output_offset); } - Ok(output) + Ok(&mut cache.result) } From ede7e6b4bdb0ec97aeec4d1b03e8a71aca3c65f0 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Thu, 23 Apr 2026 02:00:30 +0200 Subject: [PATCH 15/33] add local cache for speexdsp --- RustApp/benches/audio.rs | 4 +++- RustApp/src/audio/process.rs | 6 ++++-- RustApp/src/audio/speexdsp.rs | 26 ++++++++++---------------- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/RustApp/benches/audio.rs b/RustApp/benches/audio.rs index 78161d9b..020aa94f 100644 --- a/RustApp/benches/audio.rs +++ b/RustApp/benches/audio.rs @@ -145,8 +145,10 @@ fn bench_speexdsp(c: &mut Criterion) { speex_dereverb_level: 0.5, }; + let mut cache = None; + b.iter(|| { - process_speex_f32_stream(&buffer, &audio_params).unwrap(); + process_speex_f32_stream(&buffer, &audio_params, &mut cache).unwrap(); }); }); } diff --git a/RustApp/src/audio/process.rs b/RustApp/src/audio/process.rs index 8b85f950..a98974c7 100644 --- a/RustApp/src/audio/process.rs +++ b/RustApp/src/audio/process.rs @@ -8,7 +8,7 @@ use crate::{ post_apply_popstar, post_apply_reverb, post_apply_vocoder, post_apply_walkie_talkie, }, resampler::{ResamplerCache, resample_f32_stream_owned}, - speexdsp::{SPEEXDSP_SAMPLE_RATE, process_speex_f32_stream}, + speexdsp::{SPEEXDSP_SAMPLE_RATE, SpeexdspCache, process_speex_f32_stream}, }, config::{AudioEffect, AudioFormat, DenoiseKind}, streamer::{AudioPacketMessage, AudioStream}, @@ -21,6 +21,7 @@ pub struct ProcessCache { resample_rnnoise_cache: Option, resample_speexdsp_cache: Option, resample_to_target: Option, + speexdsp: Option, } impl ProcessCache { @@ -31,6 +32,7 @@ impl ProcessCache { self.resample_rnnoise_cache = None; self.resample_speexdsp_cache = None; self.resample_to_target = None; + self.speexdsp = None; } } @@ -110,7 +112,7 @@ impl AudioStream { Cow::Borrowed(tmp) }; - buffer = process_speex_f32_stream(&prepared_buffer, config)?; + buffer = process_speex_f32_stream(&prepared_buffer, config, &mut cache.speexdsp)?; } buffer = if config.target_format.sample_rate.to_number() == current_sample_rate { diff --git a/RustApp/src/audio/speexdsp.rs b/RustApp/src/audio/speexdsp.rs index 38b7c92c..abbed29a 100644 --- a/RustApp/src/audio/speexdsp.rs +++ b/RustApp/src/audio/speexdsp.rs @@ -1,5 +1,3 @@ -use std::sync::{LazyLock, Mutex}; - use speexdsp::preprocess::SpeexPreprocess; use crate::audio::AudioProcessParams; @@ -10,7 +8,7 @@ use crate::audio::AudioProcessParams; pub const SPEEXDSP_SAMPLE_RATE: u32 = 48000; const FRAME_SIZE: usize = (SPEEXDSP_SAMPLE_RATE as f32 * 0.02) as usize; // 20 ms frame -struct SpeexdspCache { +pub struct SpeexdspCache { sample_buffer: Vec>, denoisers: Vec, config_denoise_enabled: bool, @@ -23,6 +21,9 @@ struct SpeexdspCache { config_dereverb_level: f32, } +// safe because packets are processed in order, and not concurrently +unsafe impl Send for SpeexdspCache {} + impl SpeexdspCache { fn is_config_changed(&self, config: &AudioProcessParams) -> bool { self.config_denoise_enabled != config.is_speex_denoise_enabled() @@ -36,23 +37,16 @@ impl SpeexdspCache { } } -// safe because packets are processed in order, and not concurrently -unsafe impl Send for SpeexdspCache {} - -// safe because packets are processed in order, and not concurrently -static DENOISE_CACHE: LazyLock>> = LazyLock::new(|| Mutex::new(None)); - pub fn process_speex_f32_stream( data: &[Vec], config: &AudioProcessParams, + cache: &mut Option, ) -> anyhow::Result>> { - let mut denoise_cache = DENOISE_CACHE.lock().unwrap(); - - if denoise_cache.is_none() - || data.len() != denoise_cache.as_ref().unwrap().denoisers.len() - || denoise_cache.as_ref().unwrap().is_config_changed(config) + if cache.is_none() + || data.len() != cache.as_ref().unwrap().denoisers.len() + || cache.as_ref().unwrap().is_config_changed(config) { - *denoise_cache = Some(SpeexdspCache { + *cache = Some(SpeexdspCache { sample_buffer: vec![Vec::with_capacity(FRAME_SIZE); data.len()], denoisers: data .iter() @@ -86,7 +80,7 @@ pub fn process_speex_f32_stream( }); } - let cache = denoise_cache.as_mut().unwrap(); + let cache = cache.as_mut().unwrap(); let mut output: Vec> = vec![Vec::new(); data.len()]; // Convert f32 to i16 From 9e2fd88e9da96f796265ab39c6583f07bedaa5dd Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Thu, 23 Apr 2026 02:10:30 +0200 Subject: [PATCH 16/33] add local cache for rnnoise --- RustApp/src/audio/denoise_rnnoise.rs | 19 ++++++++----------- RustApp/src/audio/process.rs | 11 ++++++++--- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/RustApp/src/audio/denoise_rnnoise.rs b/RustApp/src/audio/denoise_rnnoise.rs index 932f2ca6..05ee3834 100644 --- a/RustApp/src/audio/denoise_rnnoise.rs +++ b/RustApp/src/audio/denoise_rnnoise.rs @@ -1,27 +1,24 @@ -use std::sync::{LazyLock, Mutex}; - use nnnoiseless::DenoiseState; pub const DENOISE_RNNOISE_SAMPLE_RATE: u32 = 48000; -struct DenoiseCache { +pub struct DenoiseCache { sample_buffer: Vec>, denoisers: Vec>>, } -static DENOISE_CACHE: LazyLock>> = LazyLock::new(|| Mutex::new(None)); - -pub fn denoise_f32_stream(data: &[Vec]) -> anyhow::Result>> { - let mut denoise_cache = DENOISE_CACHE.lock().unwrap(); - - if denoise_cache.is_none() || data.len() != denoise_cache.as_ref().unwrap().denoisers.len() { - *denoise_cache = Some(DenoiseCache { +pub fn process_denoise_rnnoise_f32_stream( + data: &[Vec], + cache: &mut Option, +) -> anyhow::Result>> { + if cache.is_none() || data.len() != cache.as_ref().unwrap().denoisers.len() { + *cache = Some(DenoiseCache { sample_buffer: vec![Vec::with_capacity(DenoiseState::FRAME_SIZE); data.len()], denoisers: vec![DenoiseState::new(); data.len()], }); } - let cache = denoise_cache.as_mut().unwrap(); + let cache = cache.as_mut().unwrap(); let mut output: Vec> = vec![Vec::new(); data.len()]; let mut output_buffer_i16 = [0.0; DenoiseState::FRAME_SIZE]; diff --git a/RustApp/src/audio/process.rs b/RustApp/src/audio/process.rs index a98974c7..ddf2ce6d 100644 --- a/RustApp/src/audio/process.rs +++ b/RustApp/src/audio/process.rs @@ -2,7 +2,7 @@ use std::borrow::Cow; use crate::{ audio::{ - denoise_rnnoise::DENOISE_RNNOISE_SAMPLE_RATE, + denoise_rnnoise::{DENOISE_RNNOISE_SAMPLE_RATE, DenoiseCache}, postprocessing::{ post_apply_echo, post_apply_flanger, post_apply_phaser, post_apply_pitch_shift, post_apply_popstar, post_apply_reverb, post_apply_vocoder, post_apply_walkie_talkie, @@ -14,7 +14,9 @@ use crate::{ streamer::{AudioPacketMessage, AudioStream}, }; -use super::{AudioBytes, denoise_rnnoise::denoise_f32_stream, resampler::resample_f32_stream}; +use super::{ + AudioBytes, denoise_rnnoise::process_denoise_rnnoise_f32_stream, resampler::resample_f32_stream, +}; #[derive(Default)] pub struct ProcessCache { @@ -22,6 +24,7 @@ pub struct ProcessCache { resample_speexdsp_cache: Option, resample_to_target: Option, speexdsp: Option, + denoise: Option, } impl ProcessCache { @@ -33,6 +36,7 @@ impl ProcessCache { self.resample_speexdsp_cache = None; self.resample_to_target = None; self.speexdsp = None; + self.denoise = None; } } @@ -91,7 +95,8 @@ impl AudioStream { }; // denoise the audio stream - buffer = denoise_f32_stream(&prepared_buffer)?; + buffer = + process_denoise_rnnoise_f32_stream(&prepared_buffer, &mut cache.denoise)?; } DenoiseKind::Speexdsp => {} } From 1b99a19a37a749ab108019b2c3251cbfc059a828 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Thu, 23 Apr 2026 02:10:40 +0200 Subject: [PATCH 17/33] add bench for rnnoise --- RustApp/benches/audio.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/RustApp/benches/audio.rs b/RustApp/benches/audio.rs index 020aa94f..9f5e7930 100644 --- a/RustApp/benches/audio.rs +++ b/RustApp/benches/audio.rs @@ -3,6 +3,7 @@ use std::io::Write; use android_mic::{ audio::{ AudioPacketFormat, AudioProcessParams, + denoise_rnnoise::{self}, player::process_audio, process::{ProcessCache, convert_packet_to_f32}, resampler::resample_f32_stream, @@ -153,6 +154,27 @@ fn bench_speexdsp(c: &mut Criterion) { }); } +fn bench_rnnoise(c: &mut Criterion) { + c.bench_function("bench_rnnoise", |b| { + let source = make_random(3840); + + let packet = AudioPacketMessage { + buffer: source, + sample_rate: 48000, + channel_count: 1, + audio_format: 2, + }; + + let buffer = convert_packet_to_f32(&packet).unwrap(); + + let mut cache = None; + + b.iter(|| { + denoise_rnnoise::process_denoise_rnnoise_f32_stream(&buffer, &mut cache).unwrap(); + }); + }); +} + criterion_group!( benches, bench_player, From d0ec560f712bb07b8f7fb8a39e88c80e5478ad7d Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Thu, 23 Apr 2026 02:15:37 +0200 Subject: [PATCH 18/33] add plan --- RustApp/result.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/RustApp/result.md b/RustApp/result.md index 6ee7196e..9e17e651 100644 --- a/RustApp/result.md +++ b/RustApp/result.md @@ -26,3 +26,10 @@ bench_speexdsp time: [97.000 µs 97.257 µs 97.523 µs] bench_process time: [160.59 µs 162.31 µs 164.43 µs] +## Opti plan + +- [ ] test ringbuffer instead of rtrb +- [ ] add optimization flag when vendoring speexdsp +- [ ] speexdsp +- [ ] rnnoise +- [ ] writting to the ring buff From f4d3d1cb9e939579b4710c601ebd1b05fe0e8f76 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Thu, 23 Apr 2026 02:43:47 +0200 Subject: [PATCH 19/33] Update result.md --- RustApp/result.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/RustApp/result.md b/RustApp/result.md index 9e17e651..73e1cfab 100644 --- a/RustApp/result.md +++ b/RustApp/result.md @@ -33,3 +33,8 @@ bench_process time: [160.59 µs 162.31 µs 164.43 µs] - [ ] speexdsp - [ ] rnnoise - [ ] writting to the ring buff + + +- https://crates.io/crates/ringbuf +- https://crates.io/crates/ringbuffer +- https://crates.io/crates/rtrb \ No newline at end of file From 28bc7cfc396ab532a85d9aa509794ae4e6a43753 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Thu, 23 Apr 2026 15:39:01 +0200 Subject: [PATCH 20/33] fix bench --- RustApp/benches/audio.rs | 3 ++- RustApp/result.md | 13 +++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/RustApp/benches/audio.rs b/RustApp/benches/audio.rs index 9f5e7930..ae5c134f 100644 --- a/RustApp/benches/audio.rs +++ b/RustApp/benches/audio.rs @@ -180,6 +180,7 @@ criterion_group!( bench_player, bench_process, bench_resampling, - bench_speexdsp + bench_speexdsp, + bench_rnnoise, ); criterion_main!(benches); diff --git a/RustApp/result.md b/RustApp/result.md index 73e1cfab..e324bf56 100644 --- a/RustApp/result.md +++ b/RustApp/result.md @@ -1,3 +1,5 @@ +## For resampling + # Linux, master bench_resampling time: [22.339 µs 22.393 µs 22.447 µs] @@ -14,12 +16,20 @@ bench_resampling time: [15.149 µs 15.495 µs 15.876 µs] change: [−24.540% −22.301% −20.162%] (p = 0.00 < 0.05) Performance has improved. +# Windows, rubato 2.0 + +bench_resampling time: [14.344 µs 14.373 µs 14.411 µs] + ## For speexdsp # Linux, master bench_speexdsp time: [97.000 µs 97.257 µs 97.523 µs] +# Windows, master + +bench_speexdsp time: [112.83 µs 113.34 µs 114.04 µs] + ## For process # Linux, after resampling cache result opti @@ -34,7 +44,6 @@ bench_process time: [160.59 µs 162.31 µs 164.43 µs] - [ ] rnnoise - [ ] writting to the ring buff - - https://crates.io/crates/ringbuf - https://crates.io/crates/ringbuffer -- https://crates.io/crates/rtrb \ No newline at end of file +- https://crates.io/crates/rtrb From a4e8811ac83a6a9aa4f606599534c98bedac5e51 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Thu, 23 Apr 2026 15:54:22 +0200 Subject: [PATCH 21/33] no change --- RustApp/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RustApp/Cargo.toml b/RustApp/Cargo.toml index a8f336cd..38378bf4 100644 --- a/RustApp/Cargo.toml +++ b/RustApp/Cargo.toml @@ -50,8 +50,8 @@ cpal = { version = "0.17", features = ["jack"] } rtrb = "0.3" local-ip-address = "0.6" log = "0.4" -zconf = "0.1.3" serde = "1" +zconf = "0.1.3" light_enum = "0.2.2" tokio = { version = "1", features = ["full"] } anyhow = { version = "1", features = ["backtrace"] } @@ -85,7 +85,7 @@ libcosmic = { git = "https://github.com/pop-os/libcosmic.git", rev = "3e78eb2381 ] } notify-rust = "4" byteorder = "1" -nusb = { version = "0.2.2", optional = true, features = ["tokio", "smol"] } +nusb = { version = "0.2", optional = true, features = ["tokio", "smol"] } serde_with = "3" strum = { version = "0.28", features = ["derive"] } resvg = "0.47" From ccfbeeab6912a4c1ce8403c8e2e9e4409c352a6b Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Thu, 23 Apr 2026 19:50:12 +0200 Subject: [PATCH 22/33] add ring buffer --- RustApp/Cargo.toml | 18 ++- RustApp/result.md | 3 +- RustApp/src/audio/chunked_ring_buffer.rs | 160 +++++++++++++++++++++++ RustApp/src/audio/mod.rs | 1 + RustApp/src/audio/speexdsp.rs | 30 +++-- 5 files changed, 190 insertions(+), 22 deletions(-) create mode 100644 RustApp/src/audio/chunked_ring_buffer.rs diff --git a/RustApp/Cargo.toml b/RustApp/Cargo.toml index 38378bf4..f5dfe6f6 100644 --- a/RustApp/Cargo.toml +++ b/RustApp/Cargo.toml @@ -117,6 +117,15 @@ winres = "0.1" [target.'cfg(not(target_os = "linux"))'.dependencies] tray-icon = "0.22" + +[dev-dependencies] +criterion = "0.8" +rand = "0.10" + +[[bench]] +name = "audio" +harness = false + # [patch."https://github.com/pop-os/libcosmic.git"] # libcosmic = { path = "../../libcosmic" } @@ -126,10 +135,5 @@ tray-icon = "0.22" [patch."https://github.com/pop-os/cosmic-text.git"] cosmic-text = { git = "https://github.com/pop-os//cosmic-text.git", rev = "4fd11f0e5e076fc16f5c7c239da22ac99a3a60b9" } -[dev-dependencies] -criterion = "0.8" -rand = "0.10" - -[[bench]] -name = "audio" -harness = false +# [patch."crates-io"] +# ringbuffer = { git = "https://github.com/cdellacqua/ringbuffer.rs.git", rev = "134b0641a28099df1668d5faae13773e0847b2dd" } diff --git a/RustApp/result.md b/RustApp/result.md index e324bf56..5a77842c 100644 --- a/RustApp/result.md +++ b/RustApp/result.md @@ -38,11 +38,12 @@ bench_process time: [160.59 µs 162.31 µs 164.43 µs] ## Opti plan +- [x] writting to the ring buff - [ ] test ringbuffer instead of rtrb - [ ] add optimization flag when vendoring speexdsp +- [ ] test other audio backend - [ ] speexdsp - [ ] rnnoise -- [ ] writting to the ring buff - https://crates.io/crates/ringbuf - https://crates.io/crates/ringbuffer diff --git a/RustApp/src/audio/chunked_ring_buffer.rs b/RustApp/src/audio/chunked_ring_buffer.rs new file mode 100644 index 00000000..a5756806 --- /dev/null +++ b/RustApp/src/audio/chunked_ring_buffer.rs @@ -0,0 +1,160 @@ +use std::{cmp::max, fmt::Debug}; + +#[derive(Clone)] +pub struct ChunkedRingBuffer { + v: Vec, + cap: usize, + chunk_size: usize, + /// Index of the first element of the first chunk + ptr_start: usize, + /// Index where the next element will be inserted + ptr_end: usize, + /// Distinguishes between empty and full states when ptr_start == ptr_end + is_full: bool, +} + +impl Debug for ChunkedRingBuffer { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("ChunkedRingBuffer") + .field("cap", &self.cap) + .field("chunk_size", &self.chunk_size) + .field("ptr_start", &self.ptr_start) + .field("ptr_end", &self.ptr_end) + .field("full", &self.is_full) + .finish() + } +} + +impl ChunkedRingBuffer { + pub fn new(nb_chunk: usize, chunk_size: usize) -> Self { + let cap = nb_chunk * chunk_size; + let mut v = Vec::with_capacity(cap); + #[allow(clippy::uninit_vec)] + unsafe { + v.set_len(cap) + }; + Self { + v, + cap, + chunk_size, + ptr_start: 0, + ptr_end: 0, + is_full: false, + } + } + + fn grow(&mut self, min_cap: usize) + where + T: Copy, + { + let old_len = self.len(); + let old_cap = self.cap; + + let min_cap = ((min_cap + self.chunk_size - 1) / self.chunk_size) * self.chunk_size; + let new_cap = max(self.cap * 2, min_cap); + + let mut new_v = Vec::with_capacity(new_cap); + #[allow(clippy::uninit_vec)] + unsafe { + new_v.set_len(new_cap) + }; + + if old_len > 0 { + if self.ptr_start < self.ptr_end { + new_v[0..old_len].copy_from_slice(&self.v[self.ptr_start..self.ptr_end]); + } else { + let part1_len = old_cap - self.ptr_start; + new_v[0..part1_len].copy_from_slice(&self.v[self.ptr_start..old_cap]); + new_v[part1_len..part1_len + self.ptr_end] + .copy_from_slice(&self.v[0..self.ptr_end]); + } + } + + self.ptr_start = 0; + self.ptr_end = old_len; + self.cap = new_cap; + self.v = new_v; + self.is_full = false; + } + + pub fn len(&self) -> usize { + if self.is_full { + self.cap + } else if self.ptr_start <= self.ptr_end { + self.ptr_end - self.ptr_start + } else { + (self.cap - self.ptr_start) + self.ptr_end + } + } + + pub fn extend(&mut self, slice: &[T]) + where + T: Copy, + { + if slice.is_empty() { + return; + } + + if self.cap < self.len() + slice.len() { + self.grow(self.len() + slice.len()); + } + + let slice_len = slice.len(); + + let mut copied = 0; + + if self.ptr_start <= self.ptr_end { + let to_be_copied = (self.cap - self.ptr_end).min(slice_len); + self.v[self.ptr_end..self.ptr_end + to_be_copied] + .copy_from_slice(&slice[0..to_be_copied]); + copied += to_be_copied; + + if copied < slice_len { + let to_be_copied = (self.ptr_start).min(slice_len - copied); + self.v[0..to_be_copied].copy_from_slice(&slice[copied..copied + to_be_copied]); + copied += to_be_copied; + } + } else { + self.v[self.ptr_end..self.ptr_end + slice_len].copy_from_slice(slice); + copied = slice_len; + } + + self.ptr_end = (self.ptr_end + copied) % self.cap; + self.is_full = self.ptr_start == self.ptr_end; + } + + pub fn first_chunk(&self) -> &[T] { + debug_assert!(self.has_chunk_available()); + &self.v[self.ptr_start..self.ptr_start + self.chunk_size] + } + + pub fn first_chunk_mut(&mut self) -> &mut [T] { + debug_assert!(self.has_chunk_available()); + &mut self.v[self.ptr_start..self.ptr_start + self.chunk_size] + } + + pub fn remove_first_chunk(&mut self) { + debug_assert!(self.has_chunk_available()); + self.remove_n(self.chunk_size); + } + + fn remove_n(&mut self, n: usize) { + debug_assert!( + self.len() >= n, + "Attempted to remove {} elements, but only {} are available", + n, + self.len(), + ); + + self.ptr_start = (self.ptr_start + n) % self.cap; + self.is_full = false; + } + + pub fn number_of_chunk(&self) -> usize { + self.len() / self.chunk_size + } + + pub fn has_chunk_available(&self) -> bool { + self.len() >= self.chunk_size + } +} diff --git a/RustApp/src/audio/mod.rs b/RustApp/src/audio/mod.rs index 3273ea57..f2f6bda8 100644 --- a/RustApp/src/audio/mod.rs +++ b/RustApp/src/audio/mod.rs @@ -8,6 +8,7 @@ use crate::{ ui::app::{AppState, Stream}, }; +mod chunked_ring_buffer; pub mod denoise_rnnoise; pub mod player; mod postprocessing; diff --git a/RustApp/src/audio/speexdsp.rs b/RustApp/src/audio/speexdsp.rs index abbed29a..9067fe1f 100644 --- a/RustApp/src/audio/speexdsp.rs +++ b/RustApp/src/audio/speexdsp.rs @@ -1,6 +1,6 @@ use speexdsp::preprocess::SpeexPreprocess; -use crate::audio::AudioProcessParams; +use crate::audio::{AudioProcessParams, chunked_ring_buffer::ChunkedRingBuffer}; // xxx: do we really need to change the sample rate ? // apparently, speexdsp is optimized for low sample rate (8000, 16000), according to chatgpt, @@ -9,7 +9,7 @@ pub const SPEEXDSP_SAMPLE_RATE: u32 = 48000; const FRAME_SIZE: usize = (SPEEXDSP_SAMPLE_RATE as f32 * 0.02) as usize; // 20 ms frame pub struct SpeexdspCache { - sample_buffer: Vec>, + sample_buffer: Vec>, denoisers: Vec, config_denoise_enabled: bool, config_noise_suppress: i32, @@ -47,7 +47,10 @@ pub fn process_speex_f32_stream( || cache.as_ref().unwrap().is_config_changed(config) { *cache = Some(SpeexdspCache { - sample_buffer: vec![Vec::with_capacity(FRAME_SIZE); data.len()], + sample_buffer: vec![ + ChunkedRingBuffer::new((data[0].len() / FRAME_SIZE) + 1, FRAME_SIZE); + data.len() + ], denoisers: data .iter() .map(|_| { @@ -96,16 +99,18 @@ pub fn process_speex_f32_stream( // Append new data into the cache for channel_idx in 0..data_i16.len() { - cache.sample_buffer[channel_idx].extend_from_slice(&data_i16[channel_idx]); + cache.sample_buffer[channel_idx].extend(&data_i16[channel_idx]); } - while cache.sample_buffer[0].len() >= FRAME_SIZE { + while cache.sample_buffer[0].has_chunk_available() { for channel_idx in 0..data.len() { - match cache.denoisers[channel_idx] - .preprocess_run(&mut cache.sample_buffer[channel_idx][0..FRAME_SIZE]) - { + let view = &mut cache.sample_buffer[channel_idx]; + + let part1 = view.first_chunk_mut(); + + match cache.denoisers[channel_idx].preprocess_run(part1) { 0 => { - cache.sample_buffer[channel_idx][0..FRAME_SIZE].fill(0); + part1.fill(0); } 1 => {} _ => panic!(), @@ -113,16 +118,13 @@ pub fn process_speex_f32_stream( // Scale back to -1.0 to 1.0 range output[channel_idx].extend_from_slice( - &cache.sample_buffer[channel_idx][0..FRAME_SIZE] + &part1 .iter() .map(|&x| x as f32 / i16::MAX as f32) .collect::>(), ); - } - // Clear the sample buffer for the next round - for channel in &mut cache.sample_buffer { - channel.drain(0..FRAME_SIZE); + view.remove_first_chunk(); } } From f9b946ce2a0be395b57109635650f29bc8a648cd Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Thu, 23 Apr 2026 19:57:26 +0200 Subject: [PATCH 23/33] Update speexdsp.rs --- RustApp/src/audio/speexdsp.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/RustApp/src/audio/speexdsp.rs b/RustApp/src/audio/speexdsp.rs index 9067fe1f..6e9d3247 100644 --- a/RustApp/src/audio/speexdsp.rs +++ b/RustApp/src/audio/speexdsp.rs @@ -84,7 +84,6 @@ pub fn process_speex_f32_stream( } let cache = cache.as_mut().unwrap(); - let mut output: Vec> = vec![Vec::new(); data.len()]; // Convert f32 to i16 let data_i16: Vec> = data @@ -102,6 +101,9 @@ pub fn process_speex_f32_stream( cache.sample_buffer[channel_idx].extend(&data_i16[channel_idx]); } + let mut output: Vec> = + vec![Vec::with_capacity(cache.sample_buffer[0].number_of_chunk() * FRAME_SIZE); data.len()]; + while cache.sample_buffer[0].has_chunk_available() { for channel_idx in 0..data.len() { let view = &mut cache.sample_buffer[channel_idx]; From 2e201f414d1e7221f52b85c54046aeacce249672 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Thu, 23 Apr 2026 19:58:25 +0200 Subject: [PATCH 24/33] Update speexdsp.rs --- RustApp/src/audio/speexdsp.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/RustApp/src/audio/speexdsp.rs b/RustApp/src/audio/speexdsp.rs index 6e9d3247..a7fd0774 100644 --- a/RustApp/src/audio/speexdsp.rs +++ b/RustApp/src/audio/speexdsp.rs @@ -108,11 +108,11 @@ pub fn process_speex_f32_stream( for channel_idx in 0..data.len() { let view = &mut cache.sample_buffer[channel_idx]; - let part1 = view.first_chunk_mut(); + let chunk = view.first_chunk_mut(); - match cache.denoisers[channel_idx].preprocess_run(part1) { + match cache.denoisers[channel_idx].preprocess_run(chunk) { 0 => { - part1.fill(0); + chunk.fill(0); } 1 => {} _ => panic!(), @@ -120,7 +120,7 @@ pub fn process_speex_f32_stream( // Scale back to -1.0 to 1.0 range output[channel_idx].extend_from_slice( - &part1 + &chunk .iter() .map(|&x| x as f32 / i16::MAX as f32) .collect::>(), From 938f410542ac1451ac293adf00869979d0655afb Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Thu, 23 Apr 2026 20:08:34 +0200 Subject: [PATCH 25/33] add ring buffer opti for rnnoise --- RustApp/result.md | 10 ++++++++ RustApp/src/audio/denoise_rnnoise.rs | 37 +++++++++++++++++----------- RustApp/src/audio/speexdsp.rs | 6 ++--- 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/RustApp/result.md b/RustApp/result.md index 5a77842c..4b3a31d1 100644 --- a/RustApp/result.md +++ b/RustApp/result.md @@ -48,3 +48,13 @@ bench_process time: [160.59 µs 162.31 µs 164.43 µs] - https://crates.io/crates/ringbuf - https://crates.io/crates/ringbuffer - https://crates.io/crates/rtrb + +## For rnnoise + +# Windows, Master, without the processing + +bench_rnnoise time: [1.3651 µs 1.3685 µs 1.3728 µs] + +# Windows, with ringbuff opti, without the processing + +bench_rnnoise time: [1.0802 µs 1.0907 µs 1.1036 µs] diff --git a/RustApp/src/audio/denoise_rnnoise.rs b/RustApp/src/audio/denoise_rnnoise.rs index 05ee3834..037e733c 100644 --- a/RustApp/src/audio/denoise_rnnoise.rs +++ b/RustApp/src/audio/denoise_rnnoise.rs @@ -1,9 +1,11 @@ use nnnoiseless::DenoiseState; +use crate::audio::chunked_ring_buffer::ChunkedRingBuffer; + pub const DENOISE_RNNOISE_SAMPLE_RATE: u32 = 48000; pub struct DenoiseCache { - sample_buffer: Vec>, + sample_buffer: Vec>, denoisers: Vec>>, } @@ -13,13 +15,18 @@ pub fn process_denoise_rnnoise_f32_stream( ) -> anyhow::Result>> { if cache.is_none() || data.len() != cache.as_ref().unwrap().denoisers.len() { *cache = Some(DenoiseCache { - sample_buffer: vec![Vec::with_capacity(DenoiseState::FRAME_SIZE); data.len()], + sample_buffer: vec![ + ChunkedRingBuffer::new( + (data[0].len() / DenoiseState::FRAME_SIZE) + 1, + DenoiseState::FRAME_SIZE + ); + data.len() + ], denoisers: vec![DenoiseState::new(); data.len()], }); } let cache = cache.as_mut().unwrap(); - let mut output: Vec> = vec![Vec::new(); data.len()]; let mut output_buffer_i16 = [0.0; DenoiseState::FRAME_SIZE]; // Convert f32 to i16 range @@ -30,15 +37,21 @@ pub fn process_denoise_rnnoise_f32_stream( // Append new data into the cache for channel_idx in 0..data_i16.len() { - cache.sample_buffer[channel_idx].extend_from_slice(&data_i16[channel_idx]); + cache.sample_buffer[channel_idx].extend(&data_i16[channel_idx]); } - while cache.sample_buffer[0].len() >= DenoiseState::FRAME_SIZE { + let mut output: Vec> = + vec![ + Vec::with_capacity(cache.sample_buffer[0].number_of_chunk() * DenoiseState::FRAME_SIZE); + data.len() + ]; + + while cache.sample_buffer[0].has_chunk_available() { for channel_idx in 0..data.len() { - cache.denoisers[channel_idx].process_frame( - &mut output_buffer_i16, - &cache.sample_buffer[channel_idx][0..DenoiseState::FRAME_SIZE], - ); + let ring_buffer = &mut cache.sample_buffer[channel_idx]; + let chunk = ring_buffer.first_chunk(); + + cache.denoisers[channel_idx].process_frame(&mut output_buffer_i16, chunk); // Scale back to -1.0 to 1.0 range output[channel_idx].extend_from_slice( @@ -47,11 +60,7 @@ pub fn process_denoise_rnnoise_f32_stream( .map(|&x| x / i16::MAX as f32) .collect::>(), ); - } - - // Clear the sample buffer for the next round - for channel in &mut cache.sample_buffer { - channel.drain(0..DenoiseState::FRAME_SIZE); + ring_buffer.remove_first_chunk(); } } diff --git a/RustApp/src/audio/speexdsp.rs b/RustApp/src/audio/speexdsp.rs index a7fd0774..8bf9c6d4 100644 --- a/RustApp/src/audio/speexdsp.rs +++ b/RustApp/src/audio/speexdsp.rs @@ -106,9 +106,9 @@ pub fn process_speex_f32_stream( while cache.sample_buffer[0].has_chunk_available() { for channel_idx in 0..data.len() { - let view = &mut cache.sample_buffer[channel_idx]; + let ring_buffer = &mut cache.sample_buffer[channel_idx]; - let chunk = view.first_chunk_mut(); + let chunk = ring_buffer.first_chunk_mut(); match cache.denoisers[channel_idx].preprocess_run(chunk) { 0 => { @@ -126,7 +126,7 @@ pub fn process_speex_f32_stream( .collect::>(), ); - view.remove_first_chunk(); + ring_buffer.remove_first_chunk(); } } From 496e862071be5af61e8eb1e8544a874465145fba Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Thu, 23 Apr 2026 22:14:58 +0200 Subject: [PATCH 26/33] add see opti for speexdsp --- RustApp/Cargo.lock | 32 ++++++++++++++++---------------- RustApp/Cargo.toml | 2 +- RustApp/result.md | 4 ++-- RustApp/src/audio/speexdsp.rs | 8 ++------ 4 files changed, 21 insertions(+), 25 deletions(-) diff --git a/RustApp/Cargo.lock b/RustApp/Cargo.lock index 534b65cb..638ea3f4 100644 --- a/RustApp/Cargo.lock +++ b/RustApp/Cargo.lock @@ -1795,9 +1795,9 @@ dependencies = [ [[package]] name = "ctor" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95d0d11eb38e7642efca359c3cf6eb7b2e528182d09110165de70192b0352775" +checksum = "83cf0d42651b16c6dfe68685716d18480d18a9c39c62d76e8cf3eb6ed5d8bcbf" dependencies = [ "dtor", ] @@ -2286,9 +2286,9 @@ dependencies = [ [[package]] name = "dtor" -version = "0.7.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f72721db8027a4e96dd6fb50d2a1d32259c9d3da1b63dee612ccd981e14293" +checksum = "edf234dd1594d6dd434a8fb8cada51ddbbc593e40e4a01556a0b31c62da2775b" [[package]] name = "dyn-clone" @@ -4034,9 +4034,9 @@ dependencies = [ [[package]] name = "jiff" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" +checksum = "f00b5dbd620d61dfdcb6007c9c1f6054ebd75319f163d886a9055cec1155073d" dependencies = [ "jiff-static", "log", @@ -4047,9 +4047,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" +checksum = "e000de030ff8022ea1da3f466fbb0f3a809f5e51ed31f6dd931c35181ad8e6d7" dependencies = [ "proc-macro2", "quote", @@ -4294,9 +4294,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.185" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libcosmic" @@ -6977,7 +6977,7 @@ dependencies = [ [[package]] name = "speexdsp" version = "0.1.1" -source = "git+https://github.com/wiiznokes/speexdsp-rs-fork?branch=helper-for-preprocess_ctl#b44601c86492151417219573758d0a295e1d7d31" +source = "git+https://github.com/wiiznokes/speexdsp-rs-fork?branch=add-sse-opti#2f8778b7ad994dc8b6dd1720910021ef57231916" dependencies = [ "speexdsp-resampler", "speexdsp-sys", @@ -6986,7 +6986,7 @@ dependencies = [ [[package]] name = "speexdsp-resampler" version = "0.1.0" -source = "git+https://github.com/wiiznokes/speexdsp-rs-fork?branch=helper-for-preprocess_ctl#b44601c86492151417219573758d0a295e1d7d31" +source = "git+https://github.com/wiiznokes/speexdsp-rs-fork?branch=add-sse-opti#2f8778b7ad994dc8b6dd1720910021ef57231916" dependencies = [ "cfg-if", ] @@ -6994,7 +6994,7 @@ dependencies = [ [[package]] name = "speexdsp-sys" version = "0.1.2" -source = "git+https://github.com/wiiznokes/speexdsp-rs-fork?branch=helper-for-preprocess_ctl#b44601c86492151417219573758d0a295e1d7d31" +source = "git+https://github.com/wiiznokes/speexdsp-rs-fork?branch=add-sse-opti#2f8778b7ad994dc8b6dd1720910021ef57231916" dependencies = [ "bindgen", "cc", @@ -7359,7 +7359,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a90a0ca3ee6a69f2ad28fd11621a4c3f03b371f366be500b64df260c4ffbafb4" dependencies = [ "as-raw-xcb-connection", - "ctor 0.10.0", + "ctor 0.10.1", "libloading 0.8.9", "pkg-config", "tracing", @@ -7582,9 +7582,9 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.22.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93e1484378c343c5a9b291188fa58917c7184967683f8cfe4a05461986970553" +checksum = "7f9eb1da86bd0ab8931fad00650d2ba7473260c5bab06d6f24d04339edb88faa" dependencies = [ "crossbeam-channel", "dirs", diff --git a/RustApp/Cargo.toml b/RustApp/Cargo.toml index f5dfe6f6..ae31803f 100644 --- a/RustApp/Cargo.toml +++ b/RustApp/Cargo.toml @@ -95,7 +95,7 @@ fix-path-env = { git = "https://github.com/wiiznokes/fix-path-env-rs", rev = "86 env_logger = "0.11" nnnoiseless = "0.5" open = "5" -speexdsp = { git = "https://github.com/wiiznokes/speexdsp-rs-fork", branch = "helper-for-preprocess_ctl", features = [ +speexdsp = { git = "https://github.com/wiiznokes/speexdsp-rs-fork", branch = "add-sse-opti", features = [ "sys", "vendored-sys", ] } diff --git a/RustApp/result.md b/RustApp/result.md index 4b3a31d1..95c4f07a 100644 --- a/RustApp/result.md +++ b/RustApp/result.md @@ -42,8 +42,8 @@ bench_process time: [160.59 µs 162.31 µs 164.43 µs] - [ ] test ringbuffer instead of rtrb - [ ] add optimization flag when vendoring speexdsp - [ ] test other audio backend -- [ ] speexdsp -- [ ] rnnoise +- [x] speexdsp +- [x] rnnoise - https://crates.io/crates/ringbuf - https://crates.io/crates/ringbuffer diff --git a/RustApp/src/audio/speexdsp.rs b/RustApp/src/audio/speexdsp.rs index 8bf9c6d4..d4afa482 100644 --- a/RustApp/src/audio/speexdsp.rs +++ b/RustApp/src/audio/speexdsp.rs @@ -110,12 +110,8 @@ pub fn process_speex_f32_stream( let chunk = ring_buffer.first_chunk_mut(); - match cache.denoisers[channel_idx].preprocess_run(chunk) { - 0 => { - chunk.fill(0); - } - 1 => {} - _ => panic!(), + if !cache.denoisers[channel_idx].preprocess_run(chunk) { + chunk.fill(0); } // Scale back to -1.0 to 1.0 range From 88baae72f63b41acad8401ef6730d29e3c6236b9 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Thu, 23 Apr 2026 23:25:24 +0200 Subject: [PATCH 27/33] benchmark opti --- RustApp/benches/audio.rs | 160 +++++++++++------------ RustApp/src/audio/chunked_ring_buffer.rs | 2 +- RustApp/src/audio/denoise_rnnoise.rs | 5 +- RustApp/src/audio/speexdsp.rs | 14 +- 4 files changed, 95 insertions(+), 86 deletions(-) diff --git a/RustApp/benches/audio.rs b/RustApp/benches/audio.rs index ae5c134f..6d495da8 100644 --- a/RustApp/benches/audio.rs +++ b/RustApp/benches/audio.rs @@ -32,14 +32,14 @@ fn make_random(size: usize) -> Vec { const SHARED_BUFFER_SIZE: usize = 48000 * 2; fn bench_player(c: &mut Criterion) { - c.bench_function("bench_player", |b| { - let (mut producer, mut consumer) = RingBuffer::::new(SHARED_BUFFER_SIZE); + let (mut producer, mut consumer) = RingBuffer::::new(SHARED_BUFFER_SIZE); - // pre-fill fake audio buffer - let mut output = vec![0i16; 480 * 2]; + // pre-fill fake audio buffer + let mut output = vec![0i16; 480 * 2]; - let source = make_random(48000); + let source = make_random(48000); + c.bench_function("bench_player", |b| { b.iter(|| { producer.write(&source).unwrap(); @@ -49,31 +49,31 @@ fn bench_player(c: &mut Criterion) { } fn bench_process(c: &mut Criterion) { - c.bench_function("bench_process", |b| { - let (producer, mut consumer) = RingBuffer::::new(SHARED_BUFFER_SIZE); - - let audio_params = AudioProcessParams { - target_format: AudioPacketFormat { - sample_rate: SampleRate::S16000, - audio_format: AudioFormat::I16, - channel_count: ChannelCount::Mono, - }, - denoise: Some(DenoiseKind::Speexdsp), - amplify: None, - post_effect: AudioEffect::NoEffect, - speex_noise_suppress: -30, - speex_vad_enabled: false, - speex_vad_threshold: 80, - speex_agc_enabled: false, - speex_agc_target: 8000, - speex_dereverb_enabled: false, - speex_dereverb_level: 0.5, - }; - - let mut audio_stream = AudioStream::new(producer, audio_params, false); - - let mut cache = ProcessCache::new(); + let (producer, mut consumer) = RingBuffer::::new(SHARED_BUFFER_SIZE); + + let audio_params = AudioProcessParams { + target_format: AudioPacketFormat { + sample_rate: SampleRate::S16000, + audio_format: AudioFormat::I16, + channel_count: ChannelCount::Mono, + }, + denoise: Some(DenoiseKind::Speexdsp), + amplify: None, + post_effect: AudioEffect::NoEffect, + speex_noise_suppress: -30, + speex_vad_enabled: false, + speex_vad_threshold: 80, + speex_agc_enabled: false, + speex_agc_target: 8000, + speex_dereverb_enabled: false, + speex_dereverb_level: 0.5, + }; + + let mut audio_stream = AudioStream::new(producer, audio_params, false); + + let mut cache = ProcessCache::new(); + c.bench_function("bench_process", |b| { b.iter(|| { let source = make_random(3840); @@ -95,20 +95,20 @@ fn bench_process(c: &mut Criterion) { } fn bench_resampling(c: &mut Criterion) { - c.bench_function("bench_resampling", |b| { - let source = make_random(3840); + let source = make_random(3840); - let packet = AudioPacketMessage { - buffer: source, - sample_rate: 44100, - channel_count: 1, - audio_format: 2, - }; + let packet = AudioPacketMessage { + buffer: source, + sample_rate: 44100, + channel_count: 1, + audio_format: 2, + }; - let buffer = convert_packet_to_f32(&packet).unwrap(); + let buffer = convert_packet_to_f32(&packet).unwrap(); - let mut cache = None; + let mut cache = None; + c.bench_function("bench_resampling", |b| { b.iter(|| { resample_f32_stream(&buffer, 44100, 48000, &mut cache).unwrap(); }); @@ -116,38 +116,38 @@ fn bench_resampling(c: &mut Criterion) { } fn bench_speexdsp(c: &mut Criterion) { - c.bench_function("bench_speexdsp", |b| { - let source = make_random(3840); - - let packet = AudioPacketMessage { - buffer: source, - sample_rate: 48000, - channel_count: 1, - audio_format: 2, - }; - - let buffer = convert_packet_to_f32(&packet).unwrap(); - - let audio_params = AudioProcessParams { - target_format: AudioPacketFormat { - sample_rate: SampleRate::S48000, - audio_format: AudioFormat::I16, - channel_count: ChannelCount::Mono, - }, - denoise: Some(DenoiseKind::Speexdsp), - amplify: None, - post_effect: AudioEffect::NoEffect, - speex_noise_suppress: -30, - speex_vad_enabled: false, - speex_vad_threshold: 80, - speex_agc_enabled: false, - speex_agc_target: 8000, - speex_dereverb_enabled: false, - speex_dereverb_level: 0.5, - }; - - let mut cache = None; + let source = make_random(3840); + + let packet = AudioPacketMessage { + buffer: source, + sample_rate: 48000, + channel_count: 1, + audio_format: 2, + }; + + let buffer = convert_packet_to_f32(&packet).unwrap(); + + let audio_params = AudioProcessParams { + target_format: AudioPacketFormat { + sample_rate: SampleRate::S48000, + audio_format: AudioFormat::I16, + channel_count: ChannelCount::Mono, + }, + denoise: Some(DenoiseKind::Speexdsp), + amplify: None, + post_effect: AudioEffect::NoEffect, + speex_noise_suppress: -30, + speex_vad_enabled: false, + speex_vad_threshold: 80, + speex_agc_enabled: false, + speex_agc_target: 8000, + speex_dereverb_enabled: false, + speex_dereverb_level: 0.5, + }; + + let mut cache = None; + c.bench_function("bench_speexdsp", |b| { b.iter(|| { process_speex_f32_stream(&buffer, &audio_params, &mut cache).unwrap(); }); @@ -155,20 +155,20 @@ fn bench_speexdsp(c: &mut Criterion) { } fn bench_rnnoise(c: &mut Criterion) { - c.bench_function("bench_rnnoise", |b| { - let source = make_random(3840); + let source = make_random(3840); - let packet = AudioPacketMessage { - buffer: source, - sample_rate: 48000, - channel_count: 1, - audio_format: 2, - }; + let packet = AudioPacketMessage { + buffer: source, + sample_rate: 48000, + channel_count: 1, + audio_format: 2, + }; - let buffer = convert_packet_to_f32(&packet).unwrap(); + let buffer = convert_packet_to_f32(&packet).unwrap(); - let mut cache = None; + let mut cache = None; + c.bench_function("bench_rnnoise", |b| { b.iter(|| { denoise_rnnoise::process_denoise_rnnoise_f32_stream(&buffer, &mut cache).unwrap(); }); diff --git a/RustApp/src/audio/chunked_ring_buffer.rs b/RustApp/src/audio/chunked_ring_buffer.rs index a5756806..58ed42bf 100644 --- a/RustApp/src/audio/chunked_ring_buffer.rs +++ b/RustApp/src/audio/chunked_ring_buffer.rs @@ -50,7 +50,7 @@ impl ChunkedRingBuffer { let old_len = self.len(); let old_cap = self.cap; - let min_cap = ((min_cap + self.chunk_size - 1) / self.chunk_size) * self.chunk_size; + let min_cap = min_cap.div_ceil(self.chunk_size) * self.chunk_size; let new_cap = max(self.cap * 2, min_cap); let mut new_v = Vec::with_capacity(new_cap); diff --git a/RustApp/src/audio/denoise_rnnoise.rs b/RustApp/src/audio/denoise_rnnoise.rs index 037e733c..74f9f60f 100644 --- a/RustApp/src/audio/denoise_rnnoise.rs +++ b/RustApp/src/audio/denoise_rnnoise.rs @@ -13,7 +13,10 @@ pub fn process_denoise_rnnoise_f32_stream( data: &[Vec], cache: &mut Option, ) -> anyhow::Result>> { - if cache.is_none() || data.len() != cache.as_ref().unwrap().denoisers.len() { + if match cache { + Some(c) => data.len() != c.denoisers.len(), + None => true, + } { *cache = Some(DenoiseCache { sample_buffer: vec![ ChunkedRingBuffer::new( diff --git a/RustApp/src/audio/speexdsp.rs b/RustApp/src/audio/speexdsp.rs index d4afa482..8c11cb03 100644 --- a/RustApp/src/audio/speexdsp.rs +++ b/RustApp/src/audio/speexdsp.rs @@ -42,10 +42,16 @@ pub fn process_speex_f32_stream( config: &AudioProcessParams, cache: &mut Option, ) -> anyhow::Result>> { - if cache.is_none() - || data.len() != cache.as_ref().unwrap().denoisers.len() - || cache.as_ref().unwrap().is_config_changed(config) - { + if match cache { + Some(c) => { + if data.len() != c.denoisers.len() || c.is_config_changed(config) { + dbg!(data.len(), c.denoisers.len(), c.is_config_changed(config)); + } + + data.len() != c.denoisers.len() || c.is_config_changed(config) + } + None => true, + } { *cache = Some(SpeexdspCache { sample_buffer: vec![ ChunkedRingBuffer::new((data[0].len() / FRAME_SIZE) + 1, FRAME_SIZE); From 2161729ead4592eff6ae2cab2105bfb59bcac494 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Fri, 24 Apr 2026 00:47:45 +0200 Subject: [PATCH 28/33] add flamegraph to bench --- RustApp/.gitignore | 5 +- RustApp/Cargo.lock | 249 +++++++++++++++++++++++++++++++++++---- RustApp/Cargo.toml | 7 +- RustApp/benches/audio.rs | 12 +- 4 files changed, 243 insertions(+), 30 deletions(-) diff --git a/RustApp/.gitignore b/RustApp/.gitignore index 8d32d4af..e83a5050 100644 --- a/RustApp/.gitignore +++ b/RustApp/.gitignore @@ -9,4 +9,7 @@ /flatpak-out /repo /log -/config/ \ No newline at end of file +/config/ +/perf.data +/perf.data.old +/flamegraph.svg \ No newline at end of file diff --git a/RustApp/Cargo.lock b/RustApp/Cargo.lock index 638ea3f4..13e4088e 100644 --- a/RustApp/Cargo.lock +++ b/RustApp/Cargo.lock @@ -98,6 +98,15 @@ dependencies = [ "winit", ] +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + [[package]] name = "adler2" version = "2.0.1" @@ -133,12 +142,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" [[package]] -name = "alloca" -version = "0.4.0" +name = "aligned-vec" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" dependencies = [ - "cc", + "equator", ] [[package]] @@ -228,6 +237,7 @@ dependencies = [ "notify-rust", "nusb", "open", + "pprof", "prost", "prost-build", "rand 0.10.1", @@ -784,6 +794,21 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link 0.2.1", +] + [[package]] name = "base64" version = "0.22.1" @@ -1653,6 +1678,15 @@ dependencies = [ "windows 0.62.2", ] +[[package]] +name = "cpp_demangle" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2bb79cb74d735044c972aae58ed0aaa9a837e85b01106a54c39e42e97f62253" +dependencies = [ + "cfg-if", +] + [[package]] name = "cpufeatures" version = "0.2.17" @@ -1682,24 +1716,25 @@ dependencies = [ [[package]] name = "criterion" -version = "0.8.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "950046b2aa2492f9a536f5f4f9a3de7b9e2476e575e05bd6c333371add4d98f3" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" dependencies = [ - "alloca", "anes", "cast", "ciborium", "clap 4.6.1", "criterion-plot", - "itertools 0.13.0", + "is-terminal", + "itertools 0.10.5", "num-traits", + "once_cell", "oorandom", - "page_size", "plotters", "rayon", "regex", "serde", + "serde_derive", "serde_json", "tinytemplate", "walkdir", @@ -1707,12 +1742,12 @@ dependencies = [ [[package]] name = "criterion-plot" -version = "0.8.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8d80a2f4f5b554395e47b5d8305bc3d27813bacb73493eb1001e8f76dae29ea" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" dependencies = [ "cast", - "itertools 0.13.0", + "itertools 0.10.5", ] [[package]] @@ -2048,6 +2083,15 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" +[[package]] +name = "debugid" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" +dependencies = [ + "uuid", +] + [[package]] name = "deranged" version = "0.5.8" @@ -2377,6 +2421,26 @@ dependencies = [ "log", ] +[[package]] +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -2511,6 +2575,18 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +[[package]] +name = "findshlibs" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40b9e59cd0f7e0806cca4be089683ecb6434e602038df21fe6bf6711b2f07f64" +dependencies = [ + "cc", + "lazy_static", + "libc", + "winapi", +] + [[package]] name = "fix-path-env" version = "0.0.0" @@ -2995,6 +3071,12 @@ dependencies = [ "weezl", ] +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + [[package]] name = "gio" version = "0.18.4" @@ -3872,6 +3954,24 @@ dependencies = [ "serde_core", ] +[[package]] +name = "inferno" +version = "0.11.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "232929e1d75fe899576a3d5c7416ad0d88dbfbb3c3d6aa00873a7408a50ddb88" +dependencies = [ + "ahash", + "indexmap 2.14.0", + "is-terminal", + "itoa", + "log", + "num-format", + "once_cell", + "quick-xml 0.26.0", + "rgb", + "str_stack", +] + [[package]] name = "inotify" version = "0.11.1" @@ -3965,6 +4065,17 @@ dependencies = [ "once_cell", ] +[[package]] +name = "is-terminal" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" +dependencies = [ + "hermit-abi 0.5.2", + "libc", + "windows-sys 0.61.2", +] + [[package]] name = "is-wsl" version = "0.4.0" @@ -3981,6 +4092,15 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -4900,6 +5020,16 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "num-format" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" +dependencies = [ + "arrayvec", + "itoa", +] + [[package]] name = "num-integer" version = "0.1.46" @@ -5300,6 +5430,15 @@ dependencies = [ "objc", ] +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.21.4" @@ -5394,16 +5533,6 @@ dependencies = [ "ttf-parser 0.25.1", ] -[[package]] -name = "page_size" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "palette" version = "0.7.6" @@ -5805,6 +5934,29 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +[[package]] +name = "pprof" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38a01da47675efa7673b032bf8efd8214f1917d89685e07e395ab125ea42b187" +dependencies = [ + "aligned-vec", + "backtrace", + "cfg-if", + "criterion", + "findshlibs", + "inferno", + "libc", + "log", + "nix", + "once_cell", + "smallvec", + "spin", + "symbolic-demangle", + "tempfile", + "thiserror 2.0.18", +] + [[package]] name = "ppv-lite86" version = "0.2.21" @@ -6024,6 +6176,15 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" +[[package]] +name = "quick-xml" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f50b1c63b38611e7d4d7f68b82d3ad0cc71a2ad2e7f61fc10f1328d917c93cd" +dependencies = [ + "memchr", +] + [[package]] name = "quick-xml" version = "0.37.5" @@ -6457,6 +6618,12 @@ dependencies = [ "walkdir", ] +[[package]] +name = "rustc-demangle" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" + [[package]] name = "rustc-hash" version = "1.1.0" @@ -7001,6 +7168,15 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "spin" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" +dependencies = [ + "lock_api", +] + [[package]] name = "spirv" version = "0.3.0+sdk-1.3.268.0" @@ -7022,6 +7198,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "str_stack" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9091b6114800a5f2141aee1d1b9d6ca3592ac062dc5decb3764ec5895a47b4eb" + [[package]] name = "strength_reduce" version = "0.2.4" @@ -7116,6 +7298,29 @@ dependencies = [ "zeno", ] +[[package]] +name = "symbolic-common" +version = "12.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "332615d90111d8eeaf86a84dc9bbe9f65d0d8c5cf11b4caccedc37754eb0dcfd" +dependencies = [ + "debugid", + "memmap2", + "stable_deref_trait", + "uuid", +] + +[[package]] +name = "symbolic-demangle" +version = "12.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "912017718eb4d21930546245af9a3475c9dccf15675a5c215664e76621afc471" +dependencies = [ + "cpp_demangle", + "rustc-demangle", + "symbolic-common", +] + [[package]] name = "syn" version = "1.0.109" diff --git a/RustApp/Cargo.toml b/RustApp/Cargo.toml index ae31803f..d581a03f 100644 --- a/RustApp/Cargo.toml +++ b/RustApp/Cargo.toml @@ -119,13 +119,18 @@ tray-icon = "0.22" [dev-dependencies] -criterion = "0.8" +criterion = "0.5" rand = "0.10" +pprof = { version = "0.15", features = ["flamegraph", "criterion"] } [[bench]] name = "audio" harness = false +[profile.bench] +debug = true + + # [patch."https://github.com/pop-os/libcosmic.git"] # libcosmic = { path = "../../libcosmic" } diff --git a/RustApp/benches/audio.rs b/RustApp/benches/audio.rs index 6d495da8..fb4a75d5 100644 --- a/RustApp/benches/audio.rs +++ b/RustApp/benches/audio.rs @@ -175,12 +175,12 @@ fn bench_rnnoise(c: &mut Criterion) { }); } +use pprof::criterion::{Output, PProfProfiler}; + + criterion_group!( - benches, - bench_player, - bench_process, - bench_resampling, - bench_speexdsp, - bench_rnnoise, + name = benches; + config = Criterion::default().with_profiler(PProfProfiler::new(100, Output::Flamegraph(None))); + targets = bench_player, bench_process, bench_resampling, bench_speexdsp, bench_rnnoise, ); criterion_main!(benches); From 19052b2a6a8fd1dfef523bc42e4698f8768f76f6 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Fri, 24 Apr 2026 00:49:03 +0200 Subject: [PATCH 29/33] fmt --- RustApp/benches/audio.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/RustApp/benches/audio.rs b/RustApp/benches/audio.rs index fb4a75d5..60d4aba2 100644 --- a/RustApp/benches/audio.rs +++ b/RustApp/benches/audio.rs @@ -177,7 +177,6 @@ fn bench_rnnoise(c: &mut Criterion) { use pprof::criterion::{Output, PProfProfiler}; - criterion_group!( name = benches; config = Criterion::default().with_profiler(PProfProfiler::new(100, Output::Flamegraph(None))); From 19d830559177ffb6d010a7af033a3df45caf57ae Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Fri, 24 Apr 2026 16:46:11 +0200 Subject: [PATCH 30/33] change bench value --- RustApp/benches/audio.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RustApp/benches/audio.rs b/RustApp/benches/audio.rs index 60d4aba2..cf6d7b94 100644 --- a/RustApp/benches/audio.rs +++ b/RustApp/benches/audio.rs @@ -53,7 +53,7 @@ fn bench_process(c: &mut Criterion) { let audio_params = AudioProcessParams { target_format: AudioPacketFormat { - sample_rate: SampleRate::S16000, + sample_rate: SampleRate::S48000, audio_format: AudioFormat::I16, channel_count: ChannelCount::Mono, }, From ca59d05a3fcb9989088a778d0b4a6aaa9519a862 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Fri, 24 Apr 2026 17:51:41 +0200 Subject: [PATCH 31/33] fix benchmarks on windows --- RustApp/Cargo.toml | 13 +++++++------ RustApp/benches/audio.rs | 13 +++++++++++++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/RustApp/Cargo.toml b/RustApp/Cargo.toml index d581a03f..a25cd597 100644 --- a/RustApp/Cargo.toml +++ b/RustApp/Cargo.toml @@ -104,23 +104,24 @@ interprocess = { version = "2", features = ["tokio"] } async-stream = "0.3" itertools = "0.14" -[build-dependencies] -prost-build = "0.14" - [target.'cfg(target_os = "windows")'.dependencies] mslnk = "0.1" -[target.'cfg(target_os = "windows")'.build-dependencies] -winres = "0.1" - [target.'cfg(not(target_os = "linux"))'.dependencies] tray-icon = "0.22" +[build-dependencies] +prost-build = "0.14" + +[target.'cfg(target_os = "windows")'.build-dependencies] +winres = "0.1" [dev-dependencies] criterion = "0.5" rand = "0.10" + +[target.'cfg(target_os = "linux")'.dev-dependencies] pprof = { version = "0.15", features = ["flamegraph", "criterion"] } [[bench]] diff --git a/RustApp/benches/audio.rs b/RustApp/benches/audio.rs index cf6d7b94..be7957dd 100644 --- a/RustApp/benches/audio.rs +++ b/RustApp/benches/audio.rs @@ -175,11 +175,24 @@ fn bench_rnnoise(c: &mut Criterion) { }); } +#[cfg(not(target_os = "linux"))] +criterion_group!( + benches, + bench_player, + bench_process, + bench_resampling, + bench_speexdsp, + bench_rnnoise, +); + +#[cfg(target_os = "linux")] use pprof::criterion::{Output, PProfProfiler}; +#[cfg(target_os = "linux")] criterion_group!( name = benches; config = Criterion::default().with_profiler(PProfProfiler::new(100, Output::Flamegraph(None))); targets = bench_player, bench_process, bench_resampling, bench_speexdsp, bench_rnnoise, ); + criterion_main!(benches); From e51c2517798ccf0f514c9bd0e3edb79be9a7275c Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Fri, 24 Apr 2026 17:59:24 +0200 Subject: [PATCH 32/33] Delete result.md --- RustApp/result.md | 60 ----------------------------------------------- 1 file changed, 60 deletions(-) delete mode 100644 RustApp/result.md diff --git a/RustApp/result.md b/RustApp/result.md deleted file mode 100644 index 95c4f07a..00000000 --- a/RustApp/result.md +++ /dev/null @@ -1,60 +0,0 @@ -## For resampling - -# Linux, master - -bench_resampling time: [22.339 µs 22.393 µs 22.447 µs] - -# Linux, rubato 0.16, opti no copy input - -bench_resampling time: [19.860 µs 20.463 µs 21.003 µs] -change: [−9.3247% −7.3958% −5.7062%] (p = 0.00 < 0.05) -Performance has improved. - -# Linux, rubato 2.0 - -bench_resampling time: [15.149 µs 15.495 µs 15.876 µs] -change: [−24.540% −22.301% −20.162%] (p = 0.00 < 0.05) -Performance has improved. - -# Windows, rubato 2.0 - -bench_resampling time: [14.344 µs 14.373 µs 14.411 µs] - -## For speexdsp - -# Linux, master - -bench_speexdsp time: [97.000 µs 97.257 µs 97.523 µs] - -# Windows, master - -bench_speexdsp time: [112.83 µs 113.34 µs 114.04 µs] - -## For process - -# Linux, after resampling cache result opti - -bench_process time: [160.59 µs 162.31 µs 164.43 µs] - -## Opti plan - -- [x] writting to the ring buff -- [ ] test ringbuffer instead of rtrb -- [ ] add optimization flag when vendoring speexdsp -- [ ] test other audio backend -- [x] speexdsp -- [x] rnnoise - -- https://crates.io/crates/ringbuf -- https://crates.io/crates/ringbuffer -- https://crates.io/crates/rtrb - -## For rnnoise - -# Windows, Master, without the processing - -bench_rnnoise time: [1.3651 µs 1.3685 µs 1.3728 µs] - -# Windows, with ringbuff opti, without the processing - -bench_rnnoise time: [1.0802 µs 1.0907 µs 1.1036 µs] From 0a3788c23e0851f5c3f56d8ccd6b3c649f416971 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Fri, 24 Apr 2026 18:01:46 +0200 Subject: [PATCH 33/33] don't include sse opti because no gain found in benchmark --- RustApp/Cargo.lock | 6 +++--- RustApp/Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/RustApp/Cargo.lock b/RustApp/Cargo.lock index 13e4088e..80cee664 100644 --- a/RustApp/Cargo.lock +++ b/RustApp/Cargo.lock @@ -7144,7 +7144,7 @@ dependencies = [ [[package]] name = "speexdsp" version = "0.1.1" -source = "git+https://github.com/wiiznokes/speexdsp-rs-fork?branch=add-sse-opti#2f8778b7ad994dc8b6dd1720910021ef57231916" +source = "git+https://github.com/wiiznokes/speexdsp-rs-fork?branch=helper-for-preprocess_ctl#d28bb69f50976684519fa1fc5c95ad964decc2cd" dependencies = [ "speexdsp-resampler", "speexdsp-sys", @@ -7153,7 +7153,7 @@ dependencies = [ [[package]] name = "speexdsp-resampler" version = "0.1.0" -source = "git+https://github.com/wiiznokes/speexdsp-rs-fork?branch=add-sse-opti#2f8778b7ad994dc8b6dd1720910021ef57231916" +source = "git+https://github.com/wiiznokes/speexdsp-rs-fork?branch=helper-for-preprocess_ctl#d28bb69f50976684519fa1fc5c95ad964decc2cd" dependencies = [ "cfg-if", ] @@ -7161,7 +7161,7 @@ dependencies = [ [[package]] name = "speexdsp-sys" version = "0.1.2" -source = "git+https://github.com/wiiznokes/speexdsp-rs-fork?branch=add-sse-opti#2f8778b7ad994dc8b6dd1720910021ef57231916" +source = "git+https://github.com/wiiznokes/speexdsp-rs-fork?branch=helper-for-preprocess_ctl#d28bb69f50976684519fa1fc5c95ad964decc2cd" dependencies = [ "bindgen", "cc", diff --git a/RustApp/Cargo.toml b/RustApp/Cargo.toml index a25cd597..636b3974 100644 --- a/RustApp/Cargo.toml +++ b/RustApp/Cargo.toml @@ -95,7 +95,7 @@ fix-path-env = { git = "https://github.com/wiiznokes/fix-path-env-rs", rev = "86 env_logger = "0.11" nnnoiseless = "0.5" open = "5" -speexdsp = { git = "https://github.com/wiiznokes/speexdsp-rs-fork", branch = "add-sse-opti", features = [ +speexdsp = { git = "https://github.com/wiiznokes/speexdsp-rs-fork", branch = "helper-for-preprocess_ctl", features = [ "sys", "vendored-sys", ] }