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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
macro_rules! impl_audio_ext {
($name: ident) => {
paste::paste! {
unsafe impl AudioExt for $name {
fn default() -> Self {
let ptr = unsafe { ffi::[<$name _create>]() };
assert!(!ptr.is_null());
$name { inner: ptr }
}
fn set_volume(&mut self, volume: f32) {
unsafe {
soloud_sys::soloud::[<$name _setVolume>](self.inner, volume)
}
}
fn set_looping(&mut self, flag: bool) {
unsafe {
soloud_sys::soloud::[<$name _setLooping>](self.inner, flag as i32)
}
}
fn set_auto_stop(&mut self, flag: bool) {
unsafe {
soloud_sys::soloud::[<$name _setAutoStop>](self.inner, flag as i32)
}
}
fn set_3d_min_max_distance(&mut self, min_distance: f32, max_distance: f32) {
unsafe {
soloud_sys::soloud::[<$name _set3dMinMaxDistance>](self.inner, min_distance, max_distance)
}
}
fn set_3d_attenuation(&mut self, model: AttenuationModel, rolloff_factor: f32) {
unsafe {
soloud_sys::soloud::[<$name _set3dAttenuation>](self.inner, model as u32, rolloff_factor)
}
}
fn set_3d_doppler_factor(&mut self, doppler_factor: f32) {
unsafe {
soloud_sys::soloud::[<$name _set3dDopplerFactor>](self.inner, doppler_factor)
}
}
fn set_3d_listener_relative(&mut self, flag: bool) {
unsafe {
soloud_sys::soloud::[<$name _set3dListenerRelative>](self.inner, flag as i32)
}
}
fn set_3d_distance_delay(&mut self, distance_delay: i32) {
unsafe {
soloud_sys::soloud::[<$name _set3dDistanceDelay>](self.inner, distance_delay)
}
}
// fn set_3d_collider(&mut self, collider: Option<&AudioCollider>) {
// let mut collider = match collider {
// Some(v) => unsafe { v.inner() },
// None => std::ptr::null_mut(),
// };
// unsafe {
// soloud_sys::soloud::[<$name _set3dCollider>](self.inner, &mut collider as *mut *mut _)
// }
// }
// fn set_3d_attenuator(&mut self, attenuator: Option<&AudioAttenuator>) {
// let mut attenuator = match attenuator {
// Some(v) => unsafe { v.inner() },
// None => std::ptr::null_mut(),
// };
// unsafe {
// soloud_sys::soloud::[<$name _set3dAttenuator>](self.inner, &mut attenuator as *mut *mut _)
// }
// }
fn set_inaudible_behavior(&mut self, must_tick: bool, kill: bool) {
unsafe {
soloud_sys::soloud::[<$name _setInaudibleBehavior>](self.inner, must_tick as i32, kill as i32)
}
}
fn set_loop_point(&mut self, loop_point: f64) {
unsafe {
soloud_sys::soloud::[<$name _setLoopPoint>](self.inner, loop_point)
}
}
fn loop_point(&self) -> f64 {
unsafe {
soloud_sys::soloud::[<$name _getLoopPoint>](self.inner)
}
}
fn set_filter<F: FilterExt>(&mut self, filter_id: u32, filter: Option<&F>) {
let filter = match filter {
Some(v) => unsafe { v.inner() },
None => std::ptr::null_mut(),
};
unsafe {
soloud_sys::soloud::[<$name _setFilter>](self.inner, filter_id, filter)
}
}
fn stop(&mut self) {
unsafe {
soloud_sys::soloud::[<$name _stop>](self.inner)
}
}
unsafe fn inner(&self) -> *mut *mut std::os::raw::c_void {
self.inner
}
}
unsafe impl Send for $name {}
unsafe impl Sync for $name {}
impl Drop for $name {
fn drop(&mut self) {
unsafe {
soloud_sys::soloud::[<$name _destroy>](self.inner);
self.inner = std::ptr::null_mut();
}
}
}
}
};
}
pub(crate) use impl_audio_ext;