feat: configure audio output using an enum

This commit is contained in:
Marli Frost 2020-03-31 19:12:49 +01:00
parent a83f09bd60
commit 3806f08eb0
No known key found for this signature in database
GPG Key ID: CB0BEA7CF9BD1245
4 changed files with 32 additions and 26 deletions

View File

@ -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);

View File

@ -36,7 +36,7 @@ impl PlayState for MainMenuState {
let mut client_init: Option<ClientInit> = 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();
}

View File

@ -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) => {

View File

@ -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<String>,
/// 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,
}
}
}