From e78ae4fefc46fd525d6739404bf6411ddc130bc9 Mon Sep 17 00:00:00 2001
From: Louis Pearson <desttinghimgame@gmail.com>
Date: Wed, 22 May 2019 05:29:38 -0600
Subject: [PATCH] Remove hacks, clean up crufty code

Former-commit-id: 7c10103235e8d9e2967baa1f8e33d68995bdf4d5
---
 voxygen/src/audio/mod.rs           | 23 +++++++++++++----------
 voxygen/src/hud/settings_window.rs |  4 ++--
 voxygen/src/main.rs                |  4 ++--
 voxygen/src/session.rs             |  2 +-
 voxygen/src/settings.rs            | 15 ++++-----------
 5 files changed, 22 insertions(+), 26 deletions(-)

diff --git a/voxygen/src/audio/mod.rs b/voxygen/src/audio/mod.rs
index d41cd65b25..8af09d54dd 100644
--- a/voxygen/src/audio/mod.rs
+++ b/voxygen/src/audio/mod.rs
@@ -25,10 +25,13 @@ pub struct AudioFrontend {
 
 impl AudioFrontend {
     pub fn new(settings: &AudioSettings) -> Self {
-        let mut device = rodio::output_devices()
-            .find(|x| x.name() == settings.audio_device)
-            .or_else(rodio::default_output_device)
-            .expect("No Audio devices found");
+        let mut device = match &settings.audio_device {
+            Some(dev) => rodio::output_devices()
+                .find(|x| &x.name() == dev)
+                .or_else(rodio::default_output_device)
+                .expect("No Audio devices found"),
+            None => rodio::default_output_device().expect("No audio devices found"),
+        };
 
         let mut sink =
             rodio::SpatialSink::new(&device, [0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [-1.0, 0.0, 0.0]);
@@ -38,7 +41,7 @@ impl AudioFrontend {
             device,
             // streams: HashMap::<String, SpatialSink>::new(),
             stream: sink,
-            devices: AudioFrontend::get_devices_raw(),
+            devices: AudioFrontend::list_devices_raw(),
         }
     }
 
@@ -76,18 +79,18 @@ impl AudioFrontend {
 
     /// Returns a vec of the audio devices available.
     /// Does not return rodio Device struct in case our audio backend changes.
-    pub fn get_devices(&self) -> Vec<String> {
+    pub fn list_device_names(&self) -> Vec<String> {
         self.devices.iter().map(|x| x.name()).collect()
     }
 
     /// Returns vec of devices
-    fn get_devices_raw() -> Vec<Device> {
+    fn list_devices_raw() -> Vec<Device> {
         rodio::output_devices().collect()
     }
 
     /// Caches vec of devices for later reference
-    fn collect_devices(&mut self) {
-        self.devices = AudioFrontend::get_devices_raw()
+    fn maintain_devices(&mut self) {
+        self.devices = AudioFrontend::list_devices_raw()
     }
 
     /// Returns the default audio device.
@@ -100,7 +103,7 @@ impl AudioFrontend {
 
     /// Returns the name of the current audio device.
     /// Does not return rodio Device struct in case our audio backend changes.
-    pub fn get_device(&self) -> String {
+    pub fn get_device_name(&self) -> String {
         self.device.name()
     }
 
diff --git a/voxygen/src/hud/settings_window.rs b/voxygen/src/hud/settings_window.rs
index 5426067a74..323aef618e 100644
--- a/voxygen/src/hud/settings_window.rs
+++ b/voxygen/src/hud/settings_window.rs
@@ -562,8 +562,8 @@ impl<'a> Widget for SettingsWindow<'a> {
             }
 
             // Audio Device Selector --------------------------------------------
-            let device = self.global_state.audio.get_device();
-            let device_list = self.global_state.audio.get_devices();
+            let device = self.global_state.audio.get_device_name();
+            let device_list = self.global_state.audio.list_device_names();
             Text::new("Volume")
                 .down_from(state.ids.audio_volume_slider, 10.0)
                 .font_size(14)
diff --git a/voxygen/src/main.rs b/voxygen/src/main.rs
index 838a2b0c5a..f48ea71175 100644
--- a/voxygen/src/main.rs
+++ b/voxygen/src/main.rs
@@ -159,8 +159,8 @@ fn main() {
         default_hook(panic_info);
     }));
 
-    if settings.audio.audio_device == "" {
-        settings.audio.audio_device = AudioFrontend::get_default_device();
+    if settings.audio.audio_device == None {
+        settings.audio.audio_device = Some(AudioFrontend::get_default_device());
     }
 
     let mut global_state = GlobalState {
diff --git a/voxygen/src/session.rs b/voxygen/src/session.rs
index 91450623d7..1fa492c173 100644
--- a/voxygen/src/session.rs
+++ b/voxygen/src/session.rs
@@ -202,7 +202,7 @@ impl PlayState for SessionState {
                     HudEvent::ChangeAudioDevice(name) => {
                         global_state.audio.set_device(name.clone());
 
-                        global_state.settings.audio.audio_device = name;
+                        global_state.settings.audio.audio_device = Some(name);
                         global_state.settings.save_to_file();
                     }
                 }
diff --git a/voxygen/src/settings.rs b/voxygen/src/settings.rs
index 0791ec7cbb..8986f08cac 100644
--- a/voxygen/src/settings.rs
+++ b/voxygen/src/settings.rs
@@ -60,20 +60,14 @@ pub struct GraphicsSettings {
 }
 
 /// AudioSettings controls the volume of different audio subsystems and which
-/// which device is used.
+/// device is used.
 #[derive(Clone, Debug, Serialize, Deserialize)]
 pub struct AudioSettings {
     pub music_volume: f32,
     pub sfx_volume: f32,
 
-    /// Audio Device that Voxygen wil use to play audio.
-    pub audio_device: String,
-
-    /// Audio devices that are available. Listed here so that it can be accessed
-    /// from the settings editor in the HUD, but skipped over because it is a
-    /// runtime specific detail that should not be persisted.
-    #[serde(skip)]
-    pub audio_devices: Vec<String>,
+    /// Audio Device that Voxygen will use to play audio.
+    pub audio_device: Option<String>,
 }
 
 impl Default for Settings {
@@ -114,8 +108,7 @@ impl Default for Settings {
             audio: AudioSettings {
                 music_volume: 0.5,
                 sfx_volume: 0.5,
-                audio_device: "".to_string(),
-                audio_devices: vec![],
+                audio_device: None,
             },
         }
     }