From 11f18868ea02fa0e4183c5e61c003a4907a95c91 Mon Sep 17 00:00:00 2001 From: mintybasil <163682877+mintybasil@users.noreply.github.com> Date: Wed, 2 Jul 2025 15:16:39 -0400 Subject: [PATCH] Update audio to latest sdl3 changes --- Cargo.lock | 20 +++++++++--------- src/app.rs | 6 ++---- src/app/audio.rs | 55 +++++++++++++++++++++++++++--------------------- 3 files changed, 43 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c89d664..042c779 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -325,9 +325,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "sdl3" -version = "0.14.23" +version = "0.14.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f49aa6ce4bf8663ee4f412166eb8911df72a906c8840ded69a33de5a53951a0" +checksum = "662e4d5d815d4a64e2720e811efe4d2bc032e8335111ef27f94acad9731e81bb" dependencies = [ "bitflags", "lazy_static", @@ -345,9 +345,9 @@ checksum = "c4d0c6070f236297a8e7931cbe5f652e3f0e5a8a214b12984357bd4904874cc7" [[package]] name = "sdl3-image-sys" -version = "0.1.2" +version = "0.2.0+SDL3-image-3.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0df364a60f4c203e2cfb24e574100ccabb73736d8bf66fcdb40e8064e74537d7" +checksum = "1d92bd93ce75ca9b027474f90c788daf3b5ced8410ee3c1dcb478a10030bf162" dependencies = [ "cmake", "rpkg-config", @@ -357,15 +357,15 @@ dependencies = [ [[package]] name = "sdl3-src" -version = "3.2.10" +version = "3.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e677fa126db179fb8f03c982163321496ddf57a6d8a1e41eeef4600f956038b1" +checksum = "c5b5d192485408fa251477ea1dfb4778d864efaec72f730ce3a753deaffb27bb" [[package]] name = "sdl3-sys" -version = "0.4.7+SDL3-3.2.10" +version = "0.5.2+SDL3-3.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d16a8a3623a4cb39a3661c81d9d4c5fd77ada27fc056e320b3651bf7bde1b1" +checksum = "f0a31799d7cbd36f2b187c32a56975fbdd371c200a91b01d4ed0faf0012bcf9c" dependencies = [ "cmake", "rpkg-config", @@ -380,9 +380,9 @@ checksum = "f28923d2ce72ff317d8eb7cec97ddfb8f351c330d7bcbf8c76e91332122c93b3" [[package]] name = "sdl3-ttf-sys" -version = "0.1.2+SDL3-ttf-3.2.2" +version = "0.2.0+SDL3-ttf-3.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532a0c92efad5a0c32ca27ea6cd2ee9fab3f57015361e1f68310ee3b76f1100b" +checksum = "1d1d8477496fa2b081fb8f63cf8d0a9a9ba6a7a8f2a21b87e7d13d2ab6d73582" dependencies = [ "cmake", "rpkg-config", diff --git a/src/app.rs b/src/app.rs index 2a598d1..e435b8d 100644 --- a/src/app.rs +++ b/src/app.rs @@ -64,10 +64,8 @@ impl App { let playlist = projectm::playlist::Playlist::create(&pm); // make window full-size - let primary_display_id = video_subsystem.get_primary_display_id(); - let display_bounds = video_subsystem - .display_usable_bounds(primary_display_id) - .unwrap(); + let primary_display = video_subsystem.get_primary_display().unwrap(); + let display_bounds = primary_display.get_usable_bounds().unwrap(); window .set_size(display_bounds.width(), display_bounds.height()) .unwrap(); diff --git a/src/app/audio.rs b/src/app/audio.rs index 622f9f1..dc94c5a 100644 --- a/src/app/audio.rs +++ b/src/app/audio.rs @@ -1,5 +1,5 @@ use projectm::core::ProjectM; -use sdl3::audio::{AudioDevice, AudioDeviceID, AudioSpec, AudioStream}; +use sdl3::audio::{AudioDevice, AudioDeviceID, AudioSpec, AudioStreamOwner}; use super::config::FrameRate; use super::ProjectMWrapped; @@ -9,7 +9,7 @@ const CHANNELS: u32 = 2; // Number of audio channels pub struct Audio { audio_subsystem: sdl3::AudioSubsystem, - recording_stream: Option>, + recording_stream: Option>, is_capturing: bool, frame_rate: Option, projectm: ProjectMWrapped, @@ -50,7 +50,11 @@ impl Audio { println!("Audio Devices:"); for device in devices { - println!(" - {} [{}]", device.name(), device.id()); + println!( + " - {} [{}]", + device.name().unwrap_or_else(|_| "unknown".to_string()), + device.id() + ); } } @@ -67,26 +71,30 @@ impl Audio { format: Some(sdl3::audio::AudioFormat::f32_sys()), // Assuming F32SYS is the correct format }; - // Open audio device for recording (use default device if none specified) - let device_id = device_id - .or_else(|| Some(self.get_default_recording_device().id())) - .unwrap(); // Ensure device_id is Some + let device = match device_id { + Some(id) => AudioDevice::new(id, self.audio_subsystem.clone()), + None => self.get_default_recording_device(), + }; - let audio_stream = match AudioStream::open_device_stream(device_id, Some(&desired_spec)) { + let audio_stream = match device.open_device_stream(Some(&desired_spec)) { Ok(stream) => stream, Err(e) => { println!("Failed to open audio stream: {}", e); return; } }; - println!("Capturing audio from device {:?}", audio_stream); + + println!("Capturing audio from device {:?}", audio_stream.device_id()); // Get the actual device ID and name from the stream let actual_device_id = audio_stream.device_id(); let actual_device_name = audio_stream.device_name(); if actual_device_id.is_none() { - println!("Failed to get device ID from audio stream: {:?}", audio_stream); + println!( + "Failed to get device ID from audio stream: {:?}", + audio_stream.device_name() + ); return; } @@ -123,7 +131,7 @@ impl Audio { let current_device_index = current_device_name.as_ref().and_then(|name| { device_list .iter() - .position(|d| d.name() == *name) + .position(|d| d.name() == Ok(name.to_string())) }); let current_device_index = current_device_index.unwrap_or_else(|| { @@ -138,23 +146,21 @@ impl Audio { println!( "Switching from device '{}' to '{}'", current_device_name.unwrap_or_else(|| "unknown".to_string()), - next_device_id.name() + next_device_id.name().unwrap_or_else(|_| "unknown".to_string()) ); // Start capturing from next device self.begin_audio_recording(Some(next_device_id)); } - pub fn stop_audio_recording(&mut self) { if let Some(stream) = self.recording_stream.take() { // Retrieve the device name before dropping the stream - let current_device_name = stream.device_name().unwrap_or_else(|| "unknown".to_string()); + let current_device_name = stream + .device_name() + .unwrap_or_else(|| "unknown".to_string()); - println!( - "Stopping audio capture for device {}", - current_device_name - ); + println!("Stopping audio capture for device {}", current_device_name); // The recording device will be closed when the stream is dropped self.is_capturing = false; @@ -205,17 +211,18 @@ impl Audio { } } } - } fn get_device_list(&self) -> Vec { - self.audio_subsystem.audio_recording_device_ids().unwrap_or_else(|e| { - println!("Failed to get audio device list: {}", e); - Vec::new() - }) + self.audio_subsystem + .audio_recording_device_ids() + .unwrap_or_else(|e| { + println!("Failed to get audio device list: {}", e); + Vec::new() + }) } pub fn recording_device_name(&self) -> Option { self.current_device_name.clone() } -} \ No newline at end of file +}