From 315767f19f8f017db7bf6d6f93486336463b8dff Mon Sep 17 00:00:00 2001 From: Louis Pearson Date: Sat, 11 May 2019 14:39:46 -0600 Subject: [PATCH] Add code to ignore jack as an audio device Former-commit-id: 1dbaa796f82f2e9be26a3648e9aaca81f3348134 --- .../audio/soundtrack/Ethereal_Bonds.ogg | 3 + .../audio/soundtrack/Mineral_Deposits.ogg | 3 + assets/voxygen/audio/soundtrack/Ruination.ogg | 3 + assets/voxygen/audio/soundtrack/Snowtop.ogg | 3 + .../audio/soundtrack/fiesta_del_pueblo.ogg | 3 + .../library_theme_with_harpsichord.ogg | 3 + .../audio/soundtrack/sacred_temple.ogg | 3 + .../audio/soundtrack/veloren_title_tune-3.ogg | 3 + voxygen/Cargo.toml | 4 + voxygen/src/audio/mod.rs | 94 +++++++++++++++++++ voxygen/src/main.rs | 14 ++- voxygen/src/menu/main/mod.rs | 4 + 12 files changed, 137 insertions(+), 3 deletions(-) create mode 100644 assets/voxygen/audio/soundtrack/Ethereal_Bonds.ogg create mode 100644 assets/voxygen/audio/soundtrack/Mineral_Deposits.ogg create mode 100644 assets/voxygen/audio/soundtrack/Ruination.ogg create mode 100644 assets/voxygen/audio/soundtrack/Snowtop.ogg create mode 100644 assets/voxygen/audio/soundtrack/fiesta_del_pueblo.ogg create mode 100644 assets/voxygen/audio/soundtrack/library_theme_with_harpsichord.ogg create mode 100644 assets/voxygen/audio/soundtrack/sacred_temple.ogg create mode 100644 assets/voxygen/audio/soundtrack/veloren_title_tune-3.ogg create mode 100644 voxygen/src/audio/mod.rs diff --git a/assets/voxygen/audio/soundtrack/Ethereal_Bonds.ogg b/assets/voxygen/audio/soundtrack/Ethereal_Bonds.ogg new file mode 100644 index 0000000000..fa53b42f72 --- /dev/null +++ b/assets/voxygen/audio/soundtrack/Ethereal_Bonds.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:295cac684268e297ea4d534aea5aa1b1cb852001ee1b2fed10c1ee63bac3be83 +size 2560641 diff --git a/assets/voxygen/audio/soundtrack/Mineral_Deposits.ogg b/assets/voxygen/audio/soundtrack/Mineral_Deposits.ogg new file mode 100644 index 0000000000..42c1da0905 --- /dev/null +++ b/assets/voxygen/audio/soundtrack/Mineral_Deposits.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2261a1229682f1aecc9776eb8eee46c774bdff75a2a2a2e897bfa09c4217532 +size 8395603 diff --git a/assets/voxygen/audio/soundtrack/Ruination.ogg b/assets/voxygen/audio/soundtrack/Ruination.ogg new file mode 100644 index 0000000000..516cba9cf9 --- /dev/null +++ b/assets/voxygen/audio/soundtrack/Ruination.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc36bd7de61a370ab8d003142dbc57d188cc98b55f08cb71cdb784ff635cb195 +size 7631089 diff --git a/assets/voxygen/audio/soundtrack/Snowtop.ogg b/assets/voxygen/audio/soundtrack/Snowtop.ogg new file mode 100644 index 0000000000..6f565b2ec2 --- /dev/null +++ b/assets/voxygen/audio/soundtrack/Snowtop.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a8f4f0bdecb127a862338937ea5b9cfef4115c26b383298b48e9bb08773d209 +size 5037032 diff --git a/assets/voxygen/audio/soundtrack/fiesta_del_pueblo.ogg b/assets/voxygen/audio/soundtrack/fiesta_del_pueblo.ogg new file mode 100644 index 0000000000..11da92a168 --- /dev/null +++ b/assets/voxygen/audio/soundtrack/fiesta_del_pueblo.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f11476de97adf237b063041fa3a85d5e32997c5465511acd92d1069ac9ae1617 +size 11193495 diff --git a/assets/voxygen/audio/soundtrack/library_theme_with_harpsichord.ogg b/assets/voxygen/audio/soundtrack/library_theme_with_harpsichord.ogg new file mode 100644 index 0000000000..3ea6a24535 --- /dev/null +++ b/assets/voxygen/audio/soundtrack/library_theme_with_harpsichord.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5bd20e01b74c51319dcb502b81f41345651990096db5f120064044dd320f21dd +size 3639871 diff --git a/assets/voxygen/audio/soundtrack/sacred_temple.ogg b/assets/voxygen/audio/soundtrack/sacred_temple.ogg new file mode 100644 index 0000000000..983e6818ec --- /dev/null +++ b/assets/voxygen/audio/soundtrack/sacred_temple.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdd47e13e39a46d2c3ae40481707937f99e04aab4c24ecc31cee6e828446eb68 +size 4288785 diff --git a/assets/voxygen/audio/soundtrack/veloren_title_tune-3.ogg b/assets/voxygen/audio/soundtrack/veloren_title_tune-3.ogg new file mode 100644 index 0000000000..6dc81427cb --- /dev/null +++ b/assets/voxygen/audio/soundtrack/veloren_title_tune-3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8aaf0657c2f87c0850dbee612dd5848046876872d9ee04f1bb19203c5d264cad +size 2813669 diff --git a/voxygen/Cargo.toml b/voxygen/Cargo.toml index 9334546e4f..27d32d90b4 100644 --- a/voxygen/Cargo.toml +++ b/voxygen/Cargo.toml @@ -24,6 +24,10 @@ conrod_core = { git = "https://gitlab.com/veloren/conrod.git" } conrod_winit = { git = "https://gitlab.com/veloren/conrod.git" } euc = "0.2" +# Audio +rodio = "0.8" +lewton = "0.9" + # ECS specs = "0.14" diff --git a/voxygen/src/audio/mod.rs b/voxygen/src/audio/mod.rs new file mode 100644 index 0000000000..1f904aecdb --- /dev/null +++ b/voxygen/src/audio/mod.rs @@ -0,0 +1,94 @@ +//extern crate byteorder; +extern crate lewton; +extern crate rodio; + +use common::assets; +use rodio::{Decoder, Device, Source, SpatialSink}; +use std::{ + collections::HashMap, + fs::File, + io::BufReader, + path::PathBuf, + sync::mpsc::{channel, Receiver, Sender, TryRecvError}, + thread, + thread::{sleep, JoinHandle}, + time::Duration, +}; +use vek::*; + +#[derive(Clone, Debug, PartialEq)] +pub struct Position { + pub relative: bool, + pub pos: Vec3, + pub vel: Vec3, +} + +#[derive(Clone, Debug, PartialEq)] +pub struct Fade { + pub in_duration: Duration, + pub out_duration: Duration, +} + +#[derive(Clone, Debug, PartialEq)] +pub struct Stream { + pub buffer: u64, + pub start_tick: Duration, + pub duration: Duration, + pub volume: f32, + pub repeat: Option<()>, + pub positional: Option, + pub fading: Option, +} + +#[derive(Clone, Debug, PartialEq)] +pub enum Buffer { + File(PathBuf), + Raw(Vec), +} + +enum Msg { + Position(Vec3, Vec3, Mat4), + CreateSource(Buffer), + Stop, +} + +pub struct AudioFrontend { + device: Device, + streams: HashMap, //always use SpatialSink even if no possition is used for now +} + +impl AudioFrontend { + pub fn new() -> Self { + let mut device = rodio::default_output_device().unwrap(); + + for d in rodio::devices() { + if d.name().contains("jack") { + continue; + } + + device = d; + break; + } + + AudioFrontend { + device, + streams: HashMap::::new(), + } + } + + pub fn play_music(&mut self, path: &str) { + let file = File::open(format!("assets/{}", path)).unwrap(); + let src = Decoder::new(BufReader::new(file)).unwrap(); + + let mut sink = rodio::SpatialSink::new( + &self.device, + [0.0, 0.0, 0.0], + [1.0, 0.0, 0.0], + [-1.0, 0.0, 0.0], + ); + + sink.append(src); + + self.streams.insert(path.to_string(), sink); + } +} diff --git a/voxygen/src/main.rs b/voxygen/src/main.rs index d69eafb3b2..fff5c6c223 100644 --- a/voxygen/src/main.rs +++ b/voxygen/src/main.rs @@ -4,6 +4,7 @@ #[macro_use] pub mod ui; pub mod anim; +pub mod audio; pub mod error; pub mod hud; pub mod key_state; @@ -19,7 +20,7 @@ pub mod window; // Reexports pub use crate::error::Error; -use crate::{menu::main::MainMenuState, settings::Settings, window::Window}; +use crate::{audio::AudioFrontend, menu::main::MainMenuState, settings::Settings, window::Window}; use log; use simplelog::{CombinedLogger, Config, TermLogger, WriteLogger}; use std::{fs::File, mem, panic, str::FromStr, thread}; @@ -31,6 +32,7 @@ const DEFAULT_PUBLIC_SERVER: &'static str = "server.veloren.net"; pub struct GlobalState { settings: Settings, window: Window, + audio: AudioFrontend, } impl GlobalState { @@ -91,7 +93,9 @@ fn main() { ]) .unwrap(); - // Set up panic handler to relay swish panic messages to the user. + let audio = AudioFrontend::new(); + + // Set up panic handler to relay swish panic messages to the user let settings_clone = settings.clone(); let default_hook = panic::take_hook(); panic::set_hook(Box::new(move |panic_info| { @@ -153,7 +157,11 @@ fn main() { default_hook(panic_info); })); - let mut global_state = GlobalState { settings, window }; + let mut global_state = GlobalState { + settings, + window, + audio, + }; // Set up the initial play state. let mut states: Vec> = vec![Box::new(MainMenuState::new(&mut global_state))]; diff --git a/voxygen/src/menu/main/mod.rs b/voxygen/src/menu/main/mod.rs index 41c3b1e7bd..318c991df2 100644 --- a/voxygen/src/menu/main/mod.rs +++ b/voxygen/src/menu/main/mod.rs @@ -47,6 +47,10 @@ impl PlayState for MainMenuState { // Used for client creation. let mut client_init: Option = None; + global_state + .audio + .play_music("voxygen/audio/soundtrack/veloren_title_tune-3.ogg"); + loop { // Handle window events. for event in global_state.window.fetch_events() {