From 45839ebf60ff9a6dc1ef117311665c39fb724cbe Mon Sep 17 00:00:00 2001 From: Nova Date: Tue, 7 Feb 2023 18:04:20 -0500 Subject: [PATCH] fix: cargo fmt --- src/core/client.rs | 2 +- src/main.rs | 2 +- src/nodes/audio.rs | 204 +++++++++++++++++++++++---------------------- src/nodes/mod.rs | 4 +- 4 files changed, 109 insertions(+), 103 deletions(-) diff --git a/src/core/client.rs b/src/core/client.rs index 4c9b479..eac7f07 100644 --- a/src/core/client.rs +++ b/src/core/client.rs @@ -2,7 +2,7 @@ use super::scenegraph::Scenegraph; use crate::{ core::{registry::OwnedRegistry, task}, nodes::{ - data, drawable, fields, hmd, input, items, audio, + audio, data, drawable, fields, hmd, input, items, root::Root, spatial, startup::{self, StartupSettings, STARTUP_SETTINGS}, diff --git a/src/main.rs b/src/main.rs index 01c4198..39d2efd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,7 +5,7 @@ mod objects; mod wayland; use crate::core::destroy_queue; -use crate::nodes::{drawable, hmd, input, audio}; +use crate::nodes::{audio, drawable, hmd, input}; use crate::objects::input::mouse_pointer::MousePointer; use crate::objects::input::sk_controller::SkController; use crate::objects::input::sk_hand::SkHand; diff --git a/src/nodes/audio.rs b/src/nodes/audio.rs index 2566e47..fa20e04 100644 --- a/src/nodes/audio.rs +++ b/src/nodes/audio.rs @@ -1,11 +1,11 @@ use super::Node; use crate::core::client::Client; use crate::core::destroy_queue; -use crate::core::resource::ResourceID; use crate::core::registry::Registry; -use crate::nodes::spatial::{Spatial, find_spatial_parent, parse_transform}; +use crate::core::resource::ResourceID; +use crate::nodes::spatial::{find_spatial_parent, parse_transform, Spatial}; use color_eyre::eyre::{ensure, eyre, Result}; -use glam::Vec4Swizzles; +use glam::{vec3a, Vec4Swizzles}; use once_cell::sync::OnceCell; use parking_lot::Mutex; use send_wrapper::SendWrapper; @@ -13,125 +13,131 @@ use serde::Deserialize; use stardust_xr::schemas::flex::deserialize; use stardust_xr::values::Transform; use std::ops::DerefMut; -use std::{sync::Arc, path::PathBuf, ffi::OsStr, fmt::Error}; +use std::{ffi::OsStr, fmt::Error, path::PathBuf, sync::Arc}; use stereokit::sound::Sound as SKSound; use stereokit::sound::SoundInstance; static SOUND_REGISTRY: Registry = Registry::new(); pub struct Sound { - space: Arc, - resource_id: ResourceID, - pending_audio_path: OnceCell, - instance: Mutex>, - volume: f32, - sk_sound: OnceCell>, + space: Arc, + resource_id: ResourceID, + pending_audio_path: OnceCell, + instance: Mutex>, + volume: f32, + sk_sound: OnceCell>, } impl Sound { - pub fn add_to(node: &Arc, resource_id: ResourceID) -> Result> { - ensure!( - node.spatial.get().is_some(), - "Internal: Node does not have a spatial attached!" - ); - let sound = Sound { - space: node.spatial.get().unwrap().clone(), - resource_id, - volume: 1.0, - instance: Mutex::new(None), - pending_audio_path: OnceCell::new(), - sk_sound: OnceCell::new(), - }; - let sound_arc = SOUND_REGISTRY.add(sound); - node.add_local_signal("play", Sound::play_flex); - node.add_local_signal("stop", Sound::stop_flex); - let _ = sound_arc.pending_audio_path.set( - sound_arc - .resource_id - .get_file( - &node - .get_client() - .ok_or_else(|| eyre!("Client not found"))? - .base_resource_prefixes - .lock() - .clone(), - &[OsStr::new("wav"), OsStr::new("mp3")] - ) - .ok_or_else(|| eyre!("Resource not found"))?, - ); - let _ = node.sound.set(sound_arc.clone()); - Ok(sound_arc) - } + pub fn add_to(node: &Arc, resource_id: ResourceID) -> Result> { + ensure!( + node.spatial.get().is_some(), + "Internal: Node does not have a spatial attached!" + ); + let sound = Sound { + space: node.spatial.get().unwrap().clone(), + resource_id, + volume: 1.0, + instance: Mutex::new(None), + pending_audio_path: OnceCell::new(), + sk_sound: OnceCell::new(), + }; + let sound_arc = SOUND_REGISTRY.add(sound); + node.add_local_signal("play", Sound::play_flex); + node.add_local_signal("stop", Sound::stop_flex); + let _ = sound_arc.pending_audio_path.set( + sound_arc + .resource_id + .get_file( + &node + .get_client() + .ok_or_else(|| eyre!("Client not found"))? + .base_resource_prefixes + .lock() + .clone(), + &[OsStr::new("wav"), OsStr::new("mp3")], + ) + .ok_or_else(|| eyre!("Resource not found"))?, + ); + let _ = node.sound.set(sound_arc.clone()); + Ok(sound_arc) + } - fn update(&self) { - if let Some(instance) = self.instance.lock().deref_mut() { - instance.set_position(self.space.global_transform().w_axis.xyz()) - } - } + fn update(&self) { + if let Some(instance) = self.instance.lock().deref_mut() { + instance.set_position(self.space.global_transform().w_axis.xyz()) + } + } - fn play_flex(node: &Node, _calling_client: Arc, _data: &[u8]) -> Result<()> { - let sound =node.sound.get().unwrap(); - let sk_sound = sound - .sk_sound - .get_or_try_init(|| -> color_eyre::eyre::Result> { - let pending_audio_path = sound.pending_audio_path.get().ok_or(Error)?; - let sound = SKSound::from_file(pending_audio_path.as_path()).ok_or(Error)?; + fn play_flex(node: &Node, _calling_client: Arc, _data: &[u8]) -> Result<()> { + let sound = node.sound.get().unwrap(); + let sk_sound = sound + .sk_sound + .get_or_try_init(|| -> color_eyre::eyre::Result> { + let pending_audio_path = sound.pending_audio_path.get().ok_or(Error)?; + let sound = SKSound::from_file(pending_audio_path.as_path()).ok_or(Error)?; - Ok(SendWrapper::new(sound)) - }) - .ok(); - if let Some(sk_sound) = sk_sound { - sound.instance.lock().replace(sk_sound.play_sound(sound.space.global_transform().to_scale_rotation_translation().2, sound.volume)); - } + Ok(SendWrapper::new(sound)) + }) + .ok(); + if let Some(sk_sound) = sk_sound { + let position = sound + .space + .global_transform() + .transform_point3a(vec3a(0.0, 0.0, 0.0)); + sound + .instance + .lock() + .replace(sk_sound.play_sound(position, sound.volume)); + } - Ok(()) - } + Ok(()) + } - pub fn stop_flex(node: &Node, _calling_client: Arc, _data: &[u8]) -> Result<()> { - let sound = node.sound.get().unwrap(); - if let Some(instance) = sound.instance.lock().take() { - instance.stop(); - } - Ok(()) - } + pub fn stop_flex(node: &Node, _calling_client: Arc, _data: &[u8]) -> Result<()> { + let sound = node.sound.get().unwrap(); + if let Some(instance) = sound.instance.lock().take() { + instance.stop(); + } + Ok(()) + } } pub fn update() { - for sound in SOUND_REGISTRY.get_valid_contents() { - sound.update() - } + for sound in SOUND_REGISTRY.get_valid_contents() { + sound.update() + } } pub fn create_interface(client: &Arc) -> Result<()> { - let node = Node::create(client, "", "audio", false); - node.add_local_signal("create_sound", create_flex); - node.add_to_scenegraph().map(|_| ()) + let node = Node::create(client, "", "audio", false); + node.add_local_signal("create_sound", create_flex); + node.add_to_scenegraph().map(|_| ()) } pub fn create_flex(_node: &Node, calling_client: Arc, data: &[u8]) -> Result<()> { - #[derive(Deserialize)] - struct CreateSoundInfo<'a> { - name: &'a str, - parent_path: &'a str, - transform: Transform, - resource: ResourceID, - } - let info: CreateSoundInfo = deserialize(data)?; - let node = Node::create(&calling_client, "/audio/sound", info.name, true); - let parent = find_spatial_parent(&calling_client, info.parent_path)?; - let transform = parse_transform(info.transform, true, true, true); - let node = node.add_to_scenegraph()?; - Spatial::add_to(&node, Some(parent), transform, false)?; - Sound::add_to(&node, info.resource)?; - Ok(()) + #[derive(Deserialize)] + struct CreateSoundInfo<'a> { + name: &'a str, + parent_path: &'a str, + transform: Transform, + resource: ResourceID, + } + let info: CreateSoundInfo = deserialize(data)?; + let node = Node::create(&calling_client, "/audio/sound", info.name, true); + let parent = find_spatial_parent(&calling_client, info.parent_path)?; + let transform = parse_transform(info.transform, true, true, true); + let node = node.add_to_scenegraph()?; + Spatial::add_to(&node, Some(parent), transform, false)?; + Sound::add_to(&node, info.resource)?; + Ok(()) } impl Drop for Sound { - fn drop(&mut self) { - if let Some(instance) = self.instance.lock().take() { - destroy_queue::add(instance); - } - SOUND_REGISTRY.remove(self); - } - -} \ No newline at end of file + fn drop(&mut self) { + if let Some(instance) = self.instance.lock().take() { + destroy_queue::add(instance); + } + SOUND_REGISTRY.remove(self); + } +} diff --git a/src/nodes/mod.rs b/src/nodes/mod.rs index 0ff9e46..93ab72a 100644 --- a/src/nodes/mod.rs +++ b/src/nodes/mod.rs @@ -1,4 +1,5 @@ pub mod alias; +pub mod audio; pub mod data; pub mod drawable; pub mod fields; @@ -8,7 +9,6 @@ pub mod items; pub mod root; pub mod spatial; pub mod startup; -pub mod audio; use color_eyre::eyre::{eyre, Result}; use nanoid::nanoid; @@ -33,13 +33,13 @@ use crate::core::registry::Registry; use self::alias::Alias; use self::data::{PulseReceiver, PulseSender}; +use self::audio::Sound; use self::drawable::lines::Lines; use self::drawable::model::Model; use self::drawable::text::Text; use self::fields::Field; use self::input::{InputHandler, InputMethod}; use self::items::{Item, ItemAcceptor, ItemUI}; -use self::audio::Sound; use self::spatial::zone::Zone; use self::spatial::Spatial; use self::startup::StartupSettings;