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
9 changes: 5 additions & 4 deletions examples/audio_control.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use bevy::prelude::*;
use bevy_fmod::prelude::AudioSource;
use bevy_fmod::prelude::*;
use libfmod::StopMode;

fn main() {
App::new()
Expand All @@ -29,27 +30,27 @@ 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)
.insert(AudioSource::new(event_description));
}

fn play_music(mut audio_sources: Query<&AudioSource, With<MyMusicPlayer>>) {
audio_sources.single_mut().play();
audio_sources.single_mut().start().unwrap();
}

fn audio_control(query: Query<&AudioSource>, input: Res<ButtonInput<KeyCode>>) {
if input.just_pressed(KeyCode::KeyS) {
for audio_player in query.iter() {
audio_player.stop();
audio_player.stop(StopMode::AllowFadeout).unwrap();
}
}

if input.just_pressed(KeyCode::KeyP) {
for audio_player in query.iter() {
audio_player.play();
audio_player.start().unwrap();
}
}

Expand Down
4 changes: 2 additions & 2 deletions examples/minimal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@ 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)
.insert(AudioSource::new(event_description));
}

fn play_music(mut audio_sources: Query<&AudioSource, With<MyMusicPlayer>>) {
audio_sources.single_mut().play();
audio_sources.single_mut().start().unwrap();
}
10 changes: 3 additions & 7 deletions examples/parameters.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,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 @@ -76,7 +76,7 @@ fn startup(mut commands: Commands, studio: Res<FmodStudio>) {

fn play_music(audio_sources: Query<&AudioSource>) {
for audio_source in audio_sources.iter() {
audio_source.play();
audio_source.start().unwrap();
}
}

Expand All @@ -87,7 +87,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 @@ -96,7 +95,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 @@ -110,7 +108,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 @@ -119,7 +116,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
4 changes: 2 additions & 2 deletions examples/spatial.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,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 All @@ -72,7 +72,7 @@ fn setup_scene(
}

fn play_music(mut audio_sources: Query<&AudioSource>) {
audio_sources.single_mut().play();
audio_sources.single_mut().start().unwrap();
}

fn orbit_audio_source(
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
58 changes: 24 additions & 34 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::{Component, GlobalTransform, Query};
use bevy::prelude::{Component, Deref, DerefMut, GlobalTransform, Query};
use libfmod::StopMode::Immediate;
use libfmod::{EventDescription, EventInstance, StopMode};
use libfmod::{EventDescription, EventInstance};

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(pub 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 @@ -45,58 +40,53 @@ impl AudioSource {
}

impl AudioSource {
#[deprecated = "Use `AudioSource::get_volume` instead."]
pub fn volume(&self) -> f32 {
self.event_instance.get_volume().unwrap().0
self.get_volume().unwrap().0
}

#[deprecated = "Use `AudioSource::set_volume` instead."]
pub fn set_volume(&self, volume: f32) {
self.event_instance.set_volume(volume).unwrap();
self.0.set_volume(volume).unwrap();
}

#[deprecated = "Use `AudioSource::get_pitch` instead."]
pub fn speed(&self) -> f32 {
self.event_instance.get_pitch().unwrap().0
self.get_pitch().unwrap().0
}

#[deprecated = "Use `AudioSource::set_pitch` instead."]
pub fn set_speed(&self, speed: f32) {
self.event_instance.set_pitch(speed).unwrap();
self.set_pitch(speed).unwrap();
}

#[deprecated = "Use `AudioSource::start` instead."]
pub 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();
}
}

#[deprecated = "Use `AudioSource::set_paused(bool)` instead."]
pub fn pause(&self) {
self.event_instance.set_paused(true).unwrap();
self.set_paused(true).unwrap();
}

#[deprecated = "Use `AudioSource::get_paused` instead."]
pub fn is_paused(&self) -> bool {
self.event_instance.get_paused().unwrap()
}

pub fn stop(&self) {
self.event_instance.stop(StopMode::AllowFadeout).unwrap();
}

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

pub fn toggle(&self) {
if self.is_paused() {
self.play();
} else {
self.pause();
}
self.0.set_paused(!self.0.get_paused().unwrap()).unwrap();
}
}

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
@@ -1,15 +1,15 @@
use std::fs::canonicalize;
use std::path::Path;

use bevy::prelude::{debug, Resource};
use bevy::prelude::{debug, 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, System};

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

impl FmodStudio {
Expand Down