aboutsummaryrefslogtreecommitdiffstats
path: root/mumd/src/audio.rs
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2021-03-30 11:21:38 +0200
committerGustav Sörnäs <gustav@sornas.net>2021-03-30 15:25:56 +0200
commite1907114374c842654f86b234b816f57dbbc79d4 (patch)
tree92595ffb0be7afcd19c7a2150010374f988b711a /mumd/src/audio.rs
parent8c3a37b40260711ef13a6130a612537b64b78215 (diff)
downloadmum-e1907114374c842654f86b234b816f57dbbc79d4.tar.gz
add StateError and AudioError
Diffstat (limited to 'mumd/src/audio.rs')
-rw-r--r--mumd/src/audio.rs23
1 files changed, 12 insertions, 11 deletions
diff --git a/mumd/src/audio.rs b/mumd/src/audio.rs
index 1e231e2..82acfee 100644
--- a/mumd/src/audio.rs
+++ b/mumd/src/audio.rs
@@ -4,6 +4,7 @@ mod noise_gate;
use crate::audio::output::SaturatingAdd;
use crate::audio::noise_gate::{from_interleaved_samples_stream, OpusEncoder, StreamingNoiseGate, StreamingSignalExt};
+use crate::error::{AudioError, AudioStream};
use crate::network::VoiceStreamType;
use crate::state::StatePhase;
@@ -85,16 +86,16 @@ pub struct Audio {
}
impl Audio {
- pub fn new(input_volume: f32, output_volume: f32, phase_watcher: watch::Receiver<StatePhase>) -> Self {
+ pub fn new(input_volume: f32, output_volume: f32, phase_watcher: watch::Receiver<StatePhase>) -> Result<Self, AudioError> {
let sample_rate = SampleRate(SAMPLE_RATE);
let host = cpal::default_host();
let output_device = host
.default_output_device()
- .expect("default output device not found");
+ .ok_or(AudioError::NoDevice(AudioStream::Output))?;
let output_supported_config = output_device
.supported_output_configs()
- .expect("error querying output configs")
+ .map_err(|e| AudioError::NoConfigs(AudioStream::Output, e))?
.find_map(|c| {
if c.min_sample_rate() <= sample_rate && c.max_sample_rate() >= sample_rate {
Some(c)
@@ -102,17 +103,17 @@ impl Audio {
None
}
})
- .unwrap() //TODO handle panic
+ .ok_or(AudioError::NoSupportedConfig(AudioStream::Output))?
.with_sample_rate(sample_rate);
let output_supported_sample_format = output_supported_config.sample_format();
let output_config: StreamConfig = output_supported_config.into();
let input_device = host
.default_input_device()
- .expect("default input device not found");
+ .ok_or(AudioError::NoDevice(AudioStream::Input))?;
let input_supported_config = input_device
.supported_input_configs()
- .expect("error querying output configs")
+ .map_err(|e| AudioError::NoConfigs(AudioStream::Input, e))?
.find_map(|c| {
if c.min_sample_rate() <= sample_rate && c.max_sample_rate() >= sample_rate {
Some(c)
@@ -120,7 +121,7 @@ impl Audio {
None
}
})
- .unwrap() //TODO handle panic
+ .ok_or(AudioError::NoSupportedConfig(AudioStream::Input))?
.with_sample_rate(sample_rate);
let input_supported_sample_format = input_supported_config.sample_format();
let input_config: StreamConfig = input_supported_config.into();
@@ -164,7 +165,7 @@ impl Audio {
err_fn,
),
}
- .unwrap(); //TODO handle panic
+ .map_err(|e| AudioError::InvalidStream(AudioStream::Output, e))?;
let (sample_sender, sample_receiver) = futures_channel::mpsc::channel(1_000_000);
@@ -199,7 +200,7 @@ impl Audio {
err_fn,
),
}
- .unwrap(); //TODO handle panic
+ .map_err(|e| AudioError::InvalidStream(AudioStream::Input, e))?;
let opus_stream = OpusEncoder::new(
4,
@@ -217,7 +218,7 @@ impl Audio {
position_info: None,
});
- output_stream.play().unwrap(); //TODO handle panic?
+ output_stream.play().map_err(|e| AudioError::OutputPlayError(e))?;
let mut res = Self {
output_config,
@@ -232,7 +233,7 @@ impl Audio {
play_sounds,
};
res.load_sound_effects(&[]);
- res
+ Ok(res)
}
pub fn load_sound_effects(&mut self, sound_effects: &[SoundEffect]) {