Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Impl Deref for newtypes #71

Merged
merged 11 commits into from
Aug 5, 2024
2 changes: 1 addition & 1 deletion examples/audio_control.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ fn main() {
struct MyMusicPlayer;

fn startup(mut commands: Commands, studio: Res<FmodStudio>) {
let event_description = studio.0.get_event("event:/Music/Level 03").unwrap();
let event_description = studio.get_event("event:/Music/Level 03").unwrap();

commands
.spawn(MyMusicPlayer)
Expand Down
2 changes: 1 addition & 1 deletion examples/minimal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ fn main() {
struct MyMusicPlayer;

fn startup(mut commands: Commands, studio: Res<FmodStudio>) {
let event_description = studio.0.get_event("event:/Music/Level 03").unwrap();
let event_description = studio.get_event("event:/Music/Level 03").unwrap();

commands
.spawn(MyMusicPlayer)
Expand Down
8 changes: 2 additions & 6 deletions examples/parameters.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,13 +63,13 @@ struct ForestSfxPlayer;
struct CountrySfxPlayer;

fn startup(mut commands: Commands, studio: Res<FmodStudio>) {
let event_description = studio.0.get_event("event:/Ambience/Forest").unwrap();
let event_description = studio.get_event("event:/Ambience/Forest").unwrap();

commands
.spawn(ForestSfxPlayer)
.insert(AudioSource::new(event_description));

let event_description = studio.0.get_event("event:/Ambience/Country").unwrap();
let event_description = studio.get_event("event:/Ambience/Country").unwrap();

commands
.spawn(CountrySfxPlayer)
Expand All @@ -89,7 +89,6 @@ fn set_rain(
if input.just_pressed(KeyCode::ArrowUp) {
for audio_source in audio_sources.iter() {
audio_source
.event_instance
.set_parameter_by_name("Rain", 1.0, false)
.expect("Could not set parameter.");
}
Expand All @@ -98,7 +97,6 @@ fn set_rain(
if input.just_pressed(KeyCode::ArrowDown) {
for audio_source in audio_sources.iter() {
audio_source
.event_instance
.set_parameter_by_name("Rain", 0.0, false)
.expect("Could not set parameter.");
}
Expand All @@ -112,7 +110,6 @@ fn set_hour(
if input.just_pressed(KeyCode::KeyE) {
for audio_source in audio_sources.iter() {
audio_source
.event_instance
.set_parameter_by_name_with_label("Hour", "Evening", false)
.expect("Could not set parameter.");
}
Expand All @@ -121,7 +118,6 @@ fn set_hour(
if input.just_pressed(KeyCode::KeyM) {
for audio_source in audio_sources.iter() {
audio_source
.event_instance
.set_parameter_by_name_with_label("Hour", "Morning", false)
.expect("Could not set parameter.");
}
Expand Down
2 changes: 1 addition & 1 deletion examples/spatial.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ fn setup_scene(
});

// Audio source: Orbiting cube
let event_description = studio.0.get_event("event:/Music/Radio Station").unwrap();
let event_description = studio.get_event("event:/Music/Radio Station").unwrap();

commands
.spawn(SpatialAudioBundle::new(event_description))
Expand Down
1 change: 0 additions & 1 deletion src/components/audio_listener.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ impl AudioListener {
}

studio
.0
.set_listener_attributes(
0,
attributes3d(
Expand Down
39 changes: 17 additions & 22 deletions src/components/audio_source.rs
Original file line number Diff line number Diff line change
@@ -1,22 +1,18 @@
use bevy::math::Vec3;
use bevy::prelude::{AudioSinkPlayback, Component, GlobalTransform, Query};
use bevy::prelude::{AudioSinkPlayback, Component, Deref, DerefMut, GlobalTransform, Query};
use libfmod::StopMode::Immediate;
use libfmod::{EventDescription, EventInstance, StopMode};

use crate::attributes_3d::attributes3d;
use crate::components::velocity::Velocity;

/// See the [`Velocity`] component for information on enabling the Doppler effect.
#[derive(Component)]
pub struct AudioSource {
pub event_instance: EventInstance,
}
#[derive(Component, Deref, DerefMut)]
pub struct AudioSource(EventInstance);

impl AudioSource {
pub fn new(event_description: EventDescription) -> Self {
Self {
event_instance: event_description.create_instance().unwrap(),
}
Self(event_description.create_instance().unwrap())
}

pub(crate) fn update_3d_attributes(
Expand All @@ -32,7 +28,6 @@ impl AudioSource {
}

audio_source
.event_instance
.set_3d_attributes(attributes3d(
transform.translation(),
velocity,
Expand All @@ -46,49 +41,49 @@ impl AudioSource {

impl AudioSinkPlayback for AudioSource {
fn volume(&self) -> f32 {
self.event_instance.get_volume().unwrap().0
self.get_volume().unwrap().0
}

fn set_volume(&self, volume: f32) {
self.event_instance.set_volume(volume).unwrap();
self.0.set_volume(volume).unwrap();
}

fn speed(&self) -> f32 {
self.event_instance.get_pitch().unwrap().0
self.get_pitch().unwrap().0
}

fn set_speed(&self, speed: f32) {
self.event_instance.set_pitch(speed).unwrap();
self.set_pitch(speed).unwrap();
}

fn play(&self) {
if self.event_instance.get_paused().unwrap() {
self.event_instance.set_paused(false).unwrap();
if self.get_paused().unwrap() {
self.set_paused(false).unwrap();
} else {
self.event_instance.start().unwrap();
self.start().unwrap();
}
}

fn pause(&self) {
self.event_instance.set_paused(true).unwrap();
self.set_paused(true).unwrap();
}

fn is_paused(&self) -> bool {
self.event_instance.get_paused().unwrap()
self.get_paused().unwrap()
}

fn stop(&self) {
self.event_instance.stop(StopMode::AllowFadeout).unwrap();
self.0.stop(StopMode::AllowFadeout).unwrap();
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here is an example of what I was talking about in the PR description


fn empty(&self) -> bool {
self.event_instance.is_valid()
self.is_valid()
}
}

impl Drop for AudioSource {
fn drop(&mut self) {
self.event_instance.stop(Immediate).unwrap();
self.event_instance.release().unwrap();
self.0.stop(Immediate).unwrap();
self.release().unwrap();
}
}
4 changes: 2 additions & 2 deletions src/fmod_studio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ use std::env::var;
use std::fs::canonicalize;
use std::path::{Path, PathBuf};

use bevy::prelude::{debug, trace, Resource};
use bevy::prelude::{debug, trace, Deref, DerefMut, Resource};
#[cfg(feature = "live-update")]
use libfmod::ffi::FMOD_STUDIO_INIT_LIVEUPDATE;
use libfmod::ffi::{
FMOD_INIT_3D_RIGHTHANDED, FMOD_STUDIO_INIT_NORMAL, FMOD_STUDIO_LOAD_BANK_NORMAL,
};
use libfmod::Studio;

#[derive(Resource)]
#[derive(Resource, Deref, DerefMut)]
pub struct FmodStudio(pub Studio);

impl FmodStudio {
Expand Down