diff --git a/voxygen/src/main.rs b/voxygen/src/main.rs index f874529d10..72382f5ecd 100644 --- a/voxygen/src/main.rs +++ b/voxygen/src/main.rs @@ -8,7 +8,7 @@ use veloren_voxygen::{ logging, menu::main::MainMenuState, meta::Meta, - settings::Settings, + settings::{AudioOutput, Settings}, window::Window, Direction, GlobalState, PlayState, PlayStateResult, }; @@ -45,20 +45,13 @@ fn main() { panic!("Failed to save settings: {:?}", err); } - let mut audio = settings - .audio - .audio_on - .then(|| { - settings - .audio - .audio_device - .as_ref() - .map(Clone::clone) - .or_else(audio::get_default_device) - }) - .flatten() - .map(|dev| AudioFrontend::new(dev, settings.audio.max_sfx_channels)) - .unwrap_or_else(AudioFrontend::no_audio); + let mut audio = match settings.audio.output { + AudioOutput::Off => None, + AudioOutput::Automatic => audio::get_default_device(), + AudioOutput::Device(ref dev) => Some(dev.clone()), + } + .map(|dev| AudioFrontend::new(dev, settings.audio.max_sfx_channels)) + .unwrap_or_else(AudioFrontend::no_audio); audio.set_music_volume(settings.audio.music_volume); audio.set_sfx_volume(settings.audio.sfx_volume); diff --git a/voxygen/src/menu/main/mod.rs b/voxygen/src/menu/main/mod.rs index 145d8e9b16..3e873f048d 100644 --- a/voxygen/src/menu/main/mod.rs +++ b/voxygen/src/menu/main/mod.rs @@ -36,7 +36,7 @@ impl PlayState for MainMenuState { let mut client_init: Option = None; // Kick off title music - if global_state.settings.audio.audio_on && global_state.audio.music_enabled() { + if global_state.settings.audio.output.is_enabled() && global_state.audio.music_enabled() { global_state.audio.play_title_music(); } diff --git a/voxygen/src/session.rs b/voxygen/src/session.rs index 335b06b21d..2f1220c070 100644 --- a/voxygen/src/session.rs +++ b/voxygen/src/session.rs @@ -6,6 +6,7 @@ use crate::{ menu::char_selection::CharSelectionState, render::Renderer, scene::{camera, Scene, SceneData}, + settings::AudioOutput, window::{AnalogGameInput, Event, GameInput}, Direction, Error, GlobalState, PlayState, PlayStateResult, }; @@ -613,7 +614,7 @@ impl PlayState for SessionState { HudEvent::ChangeAudioDevice(name) => { global_state.audio.set_device(name.clone()); - global_state.settings.audio.audio_device = Some(name); + global_state.settings.audio.output = AudioOutput::Device(name); global_state.settings.save_to_file_warn(); }, HudEvent::ChangeMaxFPS(fps) => { diff --git a/voxygen/src/settings.rs b/voxygen/src/settings.rs index 59583661e4..e28132f592 100644 --- a/voxygen/src/settings.rs +++ b/voxygen/src/settings.rs @@ -461,7 +461,26 @@ impl Default for GraphicsSettings { } } } +#[derive(Clone, Debug, Serialize, Deserialize)] +pub enum AudioOutput { + /// Veloren's audio system wont work on some systems, + /// so you can use this to disable it, and allow the + /// game to function + // If this option is disabled, functions in the rodio + // library MUST NOT be called. + Off, + Automatic, + Device(String), +} +impl AudioOutput { + pub fn is_enabled(&self) -> bool { + match self { + Self::Off => false, + _ => true, + } + } +} /// `AudioSettings` controls the volume of different audio subsystems and which /// device is used. #[derive(Clone, Debug, Serialize, Deserialize)] @@ -473,13 +492,7 @@ pub struct AudioSettings { pub max_sfx_channels: usize, /// Audio Device that Voxygen will use to play audio. - pub audio_device: Option, - /// Veloren's audio system wont work on some systems, - /// so you can use this to disable it, and allow the - /// game to function - // If this option is disabled, functions in the rodio - // library MUST NOT be called. - pub audio_on: bool, + pub output: AudioOutput, } impl Default for AudioSettings { @@ -489,8 +502,7 @@ impl Default for AudioSettings { music_volume: 0.4, sfx_volume: 0.6, max_sfx_channels: 10, - audio_device: None, - audio_on: true, + output: AudioOutput::Automatic, } } }