Merge branch 'audioless' into 'master'

Allow the game to start without an audio device

See merge request veloren/veloren!874
This commit is contained in:
Imbris 2020-04-01 11:41:29 +00:00
commit 0d6e3028da
5 changed files with 35 additions and 22 deletions

View File

@ -238,11 +238,8 @@ impl AudioFrontend {
/// Returns the default audio device.
/// Does not return rodio Device struct in case our audio backend changes.
pub fn get_default_device() -> String {
rodio::default_output_device()
.expect("No audio output devices detected.")
.name()
.expect("Unable to get device name")
pub fn get_default_device() -> Option<String> {
rodio::default_output_device().map(|dev| dev.name().expect("Unable to get device name"))
}
/// Returns a vec of the audio devices available.

View File

@ -1,4 +1,5 @@
#![deny(unsafe_code)]
#![feature(bool_to_option)]
#![recursion_limit = "2048"]
use veloren_voxygen::{
@ -7,7 +8,7 @@ use veloren_voxygen::{
logging,
menu::main::MainMenuState,
meta::Meta,
settings::Settings,
settings::{AudioOutput, Settings},
window::Window,
Direction, GlobalState, PlayState, PlayStateResult,
};
@ -44,16 +45,13 @@ fn main() {
panic!("Failed to save settings: {:?}", err);
}
let audio_device = || match &settings.audio.audio_device {
Some(d) => d.to_string(),
None => audio::get_default_device(),
};
let mut audio = if settings.audio.audio_on {
AudioFrontend::new(audio_device(), settings.audio.max_sfx_channels)
} 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,8 +492,7 @@ pub struct AudioSettings {
pub max_sfx_channels: usize,
/// Audio Device that Voxygen will use to play audio.
pub audio_device: Option<String>,
pub audio_on: bool,
pub output: AudioOutput,
}
impl Default for AudioSettings {
@ -484,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,
}
}
}