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
    }
}