1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
use bevy::prelude::*;
use rrise::sound_engine::{
register_game_obj, set_position, unregister_game_obj, PostEvent as RPostEvent,
};
use crate::plugin::CallbackChannel;
use crate::ToAkTransform;
use rrise::AkTransform;
pub use rrise::{AkCallbackInfo, AkCallbackType, AkGameObjectID, AkID, AkPlayingID, AkResult};
use tracing::{debug, error};
pub struct SoundEngine {}
pub struct PostEventAtLocation<'a> {
inner: RPostEvent<'a>,
has_flags: bool,
tmp_id: AkGameObjectID,
at: AkTransform,
}
impl<'a> PostEventAtLocation<'a> {
pub fn new<T: Into<AkID<'a>>, U: ToAkTransform>(event_id: T, at: U) -> Self {
let tmp_id = (&event_id as *const T) as AkGameObjectID;
Self {
inner: RPostEvent::new(tmp_id, event_id),
has_flags: false,
tmp_id,
at: at.to_ak_transform(),
}
}
pub fn add_flags(&mut self, flags: AkCallbackType) -> &mut Self {
self.has_flags = flags.0 > AkCallbackType(0).0;
self.inner.add_flags(flags);
self
}
pub fn flags(&mut self, flags: AkCallbackType) -> &mut Self {
self.has_flags = flags.0 > AkCallbackType(0).0;
self.inner.flags(flags);
self
}
#[tracing::instrument(level = "debug", skip_all)]
pub fn post(&mut self, cb_channel: Option<CallbackChannel>) -> Result<AkPlayingID, AkResult> {
register_game_obj(self.tmp_id)?;
set_position(self.tmp_id, self.at)?;
debug!("Registered tmp Wwise emitter {}", self.tmp_id);
let post_result = match (self.has_flags, cb_channel) {
(false, _) => self.inner.post(),
(true, None) => {
if self.has_flags {
warn!(
"Event {:?} wants callbacks but didn't pass a World; you won't receive bevy events for it",
self.inner,
)
}
self.inner.post()
}
(true, Some(cb_channel)) => {
self.inner.post_with_callback(move |cb_info| {
if cb_channel.sender.try_send(cb_info.clone()).is_err() {
warn!("Could not send {:?}", cb_info);
}
})
}
};
if let Err(akr) = unregister_game_obj(self.tmp_id) {
error!(
"Couldn't unregister Wwise emitter {}; this might be a leak - {}",
self.tmp_id, akr
);
} else {
debug!("Unregistered tmp Wwise emitter {}", self.tmp_id);
}
post_result
}
}