This commit is contained in:
Matthew Deville 2025-09-04 16:40:03 +02:00
parent 518c9835e8
commit 55a94f0a75
2 changed files with 12 additions and 12 deletions

View file

@ -10,13 +10,13 @@ use {
/// Event carrying interleaved mic samples as f32 in the device's native /// Event carrying interleaved mic samples as f32 in the device's native
/// sample rate and channel layout. /// sample rate and channel layout.
#[derive(Event, Debug, Clone)] #[derive(Event, Debug, Clone)]
pub struct MicData { pub struct AudioCaptureData {
pub samples: Vec<f32>, pub samples: Vec<f32>,
pub sample_rate: u32, pub sample_rate: u32,
pub channels: u16, pub channels: u16,
} }
pub fn handle_mic_events(mut reader: EventReader<MicData>) { pub fn handle_audio_capture_events(mut reader: EventReader<AudioCaptureData>) {
for event in reader.read() { for event in reader.read() {
// Process mic data here. // Process mic data here.
// For example, print the number of samples received. // For example, print the number of samples received.
@ -31,7 +31,7 @@ pub fn handle_mic_events(mut reader: EventReader<MicData>) {
/// Holds the CPAL stream alive and a channel for transferring audio to Bevy world. /// Holds the CPAL stream alive and a channel for transferring audio to Bevy world.
#[derive(Resource)] #[derive(Resource)]
struct MicStream { struct AudioCaptureStream {
rx: Receiver<Vec<f32>>, rx: Receiver<Vec<f32>>,
#[allow(dead_code)] #[allow(dead_code)]
stream: cpal::Stream, // kept to prevent drop stream: cpal::Stream, // kept to prevent drop
@ -39,13 +39,13 @@ struct MicStream {
channels: u16, channels: u16,
} }
pub struct AudioInputPlugin; pub struct AudioCapturePlugin;
impl Plugin for AudioInputPlugin { impl Plugin for AudioCapturePlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.add_event::<MicData>() app.add_event::<AudioCaptureData>()
.add_systems(Startup, init_audio_input_stream) .add_systems(Startup, init_audio_input_stream)
.add_systems(Update, pump_mic_events); .add_systems(Update, dispatch_audio_events);
} }
} }
@ -81,7 +81,7 @@ fn init_audio_input_stream(mut commands: Commands) {
channels, sample_rate channels, sample_rate
); );
commands.insert_resource(MicStream { commands.insert_resource(AudioCaptureStream {
rx, rx,
stream, stream,
sample_rate, sample_rate,
@ -124,10 +124,10 @@ where
) )
} }
fn pump_mic_events(mic: Res<MicStream>, mut writer: EventWriter<MicData>) { fn dispatch_audio_events(mic: Res<AudioCaptureStream>, mut writer: EventWriter<AudioCaptureData>) {
// Drain any available audio buffers without blocking the frame. // Drain any available audio buffers without blocking the frame.
while let Ok(samples) = mic.rx.try_recv() { while let Ok(samples) = mic.rx.try_recv() {
writer.write(MicData { writer.write(AudioCaptureData {
samples, samples,
sample_rate: mic.sample_rate, sample_rate: mic.sample_rate,
channels: mic.channels, channels: mic.channels,

View file

@ -12,14 +12,14 @@ fn main() {
.add_plugins(( .add_plugins((
DefaultPlugins, DefaultPlugins,
Material2dPlugin::<CustomMaterial>::default(), Material2dPlugin::<CustomMaterial>::default(),
audio_input::AudioInputPlugin, audio_input::AudioCapturePlugin,
)) ))
.add_systems(Startup, systems::setup) .add_systems(Startup, systems::setup)
.add_systems( .add_systems(
Update, Update,
( (
material::update_material_time, material::update_material_time,
audio_input::handle_mic_events, audio_input::handle_audio_capture_events,
systems::screen_resized, systems::screen_resized,
systems::mouse_moved, systems::mouse_moved,
systems::exit_app.run_if(input_just_pressed(KeyCode::Escape)), systems::exit_app.run_if(input_just_pressed(KeyCode::Escape)),