diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2020-10-10 20:33:55 +0200 |
|---|---|---|
| committer | Gustav Sörnäs <gustav@sornas.net> | 2020-10-10 20:33:55 +0200 |
| commit | ab8116223328412484d1e76a9ff7b2055f05abf5 (patch) | |
| tree | a38ddfa10111aa6f7b5015015a1b33fae2fdb42c /mumd/src/audio.rs | |
| parent | 2aee60f7bbc6186cf6ca63aef182e1fe52fa03ad (diff) | |
| download | mum-ab8116223328412484d1e76a9ff7b2055f05abf5.tar.gz | |
big ol refactor
Co-authored-by: Eskil Queseth <eskilq@kth.se>
Diffstat (limited to 'mumd/src/audio.rs')
| -rw-r--r-- | mumd/src/audio.rs | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/mumd/src/audio.rs b/mumd/src/audio.rs index d1a309c..c6f30fb 100644 --- a/mumd/src/audio.rs +++ b/mumd/src/audio.rs @@ -1,6 +1,6 @@ -use cpal::{Sample, SampleFormat, OutputCallbackInfo, Stream, StreamConfig, SampleRate}; use cpal::traits::DeviceTrait; use cpal::traits::HostTrait; +use cpal::{OutputCallbackInfo, Sample, SampleFormat, SampleRate, Stream, StreamConfig}; use std::collections::VecDeque; use std::sync::Arc; use std::sync::Mutex; @@ -11,17 +11,21 @@ pub struct Audio { pub output_stream: Stream, } -impl Audio { +impl Audio { pub fn new() -> Self { let output_buffer = Arc::new(Mutex::new(VecDeque::new())); let host = cpal::default_host(); - let device = host.default_output_device().expect("default output device not found"); - let mut supported_configs_range = device.supported_output_configs() - .expect("error querying configs"); - let supported_config = supported_configs_range.next() - .expect("no supported config??") - .with_sample_rate(SampleRate(48000)); + let device = host + .default_output_device() + .expect("default output device not found"); + let mut supported_configs_range = device + .supported_output_configs() + .expect("error querying configs"); + let supported_config = supported_configs_range + .next() + .expect("no supported config??") + .with_sample_rate(SampleRate(48000)); let supported_sample_format = supported_config.sample_format(); let config: StreamConfig = supported_config.into(); @@ -29,10 +33,17 @@ impl Audio { let stream_audio_buf = Arc::clone(&output_buffer); let stream = match supported_sample_format { - SampleFormat::F32 => device.build_output_stream(&config, curry_callback::<f32>(stream_audio_buf), err_fn), - SampleFormat::I16 => device.build_output_stream(&config, curry_callback::<i16>(stream_audio_buf), err_fn), - SampleFormat::U16 => device.build_output_stream(&config, curry_callback::<u16>(stream_audio_buf), err_fn), - }.unwrap(); + SampleFormat::F32 => { + device.build_output_stream(&config, curry_callback::<f32>(stream_audio_buf), err_fn) + } + SampleFormat::I16 => { + device.build_output_stream(&config, curry_callback::<i16>(stream_audio_buf), err_fn) + } + SampleFormat::U16 => { + device.build_output_stream(&config, curry_callback::<u16>(stream_audio_buf), err_fn) + } + } + .unwrap(); Self { output_buffer, @@ -42,9 +53,9 @@ impl Audio { } } -fn curry_callback<T: Sample>(buf: Arc<Mutex<VecDeque<f32>>>) - -> impl FnMut(&mut [T], - &OutputCallbackInfo) + Send + 'static { +fn curry_callback<T: Sample>( + buf: Arc<Mutex<VecDeque<f32>>>, +) -> impl FnMut(&mut [T], &OutputCallbackInfo) + Send + 'static { move |data: &mut [T], _info: &OutputCallbackInfo| { let mut lock = buf.lock().unwrap(); for sample in data.iter_mut() { |
