@bornengine/engine 0.4.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +231 -0
  3. package/native/android/Cargo.lock +1848 -0
  4. package/native/android/Cargo.toml +24 -0
  5. package/native/android/src/lib.rs +702 -0
  6. package/native/ios/Cargo.lock +1690 -0
  7. package/native/ios/Cargo.toml +32 -0
  8. package/native/ios/src/lib.rs +1267 -0
  9. package/native/linux/Cargo.lock +3279 -0
  10. package/native/linux/Cargo.toml +29 -0
  11. package/native/linux/src/lib.rs +1331 -0
  12. package/native/macos/Cargo.lock +3310 -0
  13. package/native/macos/Cargo.toml +46 -0
  14. package/native/macos/src/lib.rs +1302 -0
  15. package/native/shared/Cargo.lock +1899 -0
  16. package/native/shared/Cargo.toml +62 -0
  17. package/native/shared/assets/default_font.ttf +0 -0
  18. package/native/shared/build.rs +270 -0
  19. package/native/shared/shaders/common/clouds.wgsl +122 -0
  20. package/native/shared/shaders/common/fog.wgsl +16 -0
  21. package/native/shared/shaders/common/foliage_wind.wgsl +98 -0
  22. package/native/shared/shaders/common/imposter.wgsl +112 -0
  23. package/native/shared/shaders/common/pbr.wgsl +186 -0
  24. package/native/shared/shaders/common/shadows.wgsl +186 -0
  25. package/native/shared/shaders/common/sky.wgsl +8 -0
  26. package/native/shared/shaders/common/tonemap.wgsl +25 -0
  27. package/native/shared/shaders/impulse_field.wgsl +57 -0
  28. package/native/shared/shaders/material_abi.wgsl +383 -0
  29. package/native/shared/shaders/materials/test_minimal.wgsl +42 -0
  30. package/native/shared/src/anim_mixer.rs +61 -0
  31. package/native/shared/src/attach.rs +263 -0
  32. package/native/shared/src/audio/decode.rs +123 -0
  33. package/native/shared/src/audio/mod.rs +863 -0
  34. package/native/shared/src/audio/render.rs +892 -0
  35. package/native/shared/src/audio/spsc.rs +156 -0
  36. package/native/shared/src/audio/stream.rs +226 -0
  37. package/native/shared/src/custom_shaders.rs +104 -0
  38. package/native/shared/src/decals.rs +245 -0
  39. package/native/shared/src/drs.rs +211 -0
  40. package/native/shared/src/engine.rs +261 -0
  41. package/native/shared/src/ffi.rs +116 -0
  42. package/native/shared/src/ffi_core/assets.rs +388 -0
  43. package/native/shared/src/ffi_core/audio_ffi.rs +184 -0
  44. package/native/shared/src/ffi_core/draw.rs +334 -0
  45. package/native/shared/src/ffi_core/game_loop.rs +577 -0
  46. package/native/shared/src/ffi_core/input.rs +234 -0
  47. package/native/shared/src/ffi_core/mod.rs +127 -0
  48. package/native/shared/src/ffi_core/models.rs +1154 -0
  49. package/native/shared/src/ffi_core/ragdoll_ffi.rs +261 -0
  50. package/native/shared/src/ffi_core/scene.rs +626 -0
  51. package/native/shared/src/ffi_core/vfx.rs +212 -0
  52. package/native/shared/src/ffi_core/visual.rs +691 -0
  53. package/native/shared/src/frame_callbacks.rs +122 -0
  54. package/native/shared/src/geometry.rs +236 -0
  55. package/native/shared/src/handles.rs +182 -0
  56. package/native/shared/src/input.rs +448 -0
  57. package/native/shared/src/jolt_sys.rs +822 -0
  58. package/native/shared/src/lib.rs +55 -0
  59. package/native/shared/src/models.rs +1093 -0
  60. package/native/shared/src/models_gltf.rs +1280 -0
  61. package/native/shared/src/particles.rs +391 -0
  62. package/native/shared/src/physics_jolt.rs +1908 -0
  63. package/native/shared/src/picking.rs +298 -0
  64. package/native/shared/src/postfx.rs +345 -0
  65. package/native/shared/src/profiler.rs +492 -0
  66. package/native/shared/src/ragdoll.rs +474 -0
  67. package/native/shared/src/renderer/atmosphere_lut.rs +573 -0
  68. package/native/shared/src/renderer/brdf_lut.rs +154 -0
  69. package/native/shared/src/renderer/draw2d.rs +143 -0
  70. package/native/shared/src/renderer/formats.rs +822 -0
  71. package/native/shared/src/renderer/froxel.rs +421 -0
  72. package/native/shared/src/renderer/gi_bake.rs +653 -0
  73. package/native/shared/src/renderer/graph.rs +462 -0
  74. package/native/shared/src/renderer/hiz.rs +269 -0
  75. package/native/shared/src/renderer/hot_reload.rs +390 -0
  76. package/native/shared/src/renderer/impulse_field.rs +456 -0
  77. package/native/shared/src/renderer/lighting.rs +154 -0
  78. package/native/shared/src/renderer/material_instancing.rs +171 -0
  79. package/native/shared/src/renderer/material_pipeline.rs +700 -0
  80. package/native/shared/src/renderer/material_system.rs +1996 -0
  81. package/native/shared/src/renderer/material_system_tests.rs +601 -0
  82. package/native/shared/src/renderer/material_system_wasm.rs +41 -0
  83. package/native/shared/src/renderer/mod.rs +12556 -0
  84. package/native/shared/src/renderer/model_draw.rs +641 -0
  85. package/native/shared/src/renderer/occlusion.rs +429 -0
  86. package/native/shared/src/renderer/planar_pass.rs +593 -0
  87. package/native/shared/src/renderer/planar_reflection.rs +499 -0
  88. package/native/shared/src/renderer/post_pass.rs +249 -0
  89. package/native/shared/src/renderer/postfx_chain.rs +728 -0
  90. package/native/shared/src/renderer/pt_pass.rs +577 -0
  91. package/native/shared/src/renderer/scene_pass.rs +607 -0
  92. package/native/shared/src/renderer/shader_include.rs +205 -0
  93. package/native/shared/src/renderer/shader_library.rs +135 -0
  94. package/native/shared/src/renderer/shaders/ao.rs +570 -0
  95. package/native/shared/src/renderer/shaders/core.rs +1243 -0
  96. package/native/shared/src/renderer/shaders/env.rs +907 -0
  97. package/native/shared/src/renderer/shaders/gi.rs +810 -0
  98. package/native/shared/src/renderer/shaders/mod.rs +19 -0
  99. package/native/shared/src/renderer/shaders/post.rs +1558 -0
  100. package/native/shared/src/renderer/shaders/pt.rs +1859 -0
  101. package/native/shared/src/renderer/shaders/ssgi.rs +1586 -0
  102. package/native/shared/src/renderer/shadow_pass.rs +731 -0
  103. package/native/shared/src/renderer/ssgi_pass.rs +392 -0
  104. package/native/shared/src/renderer/ssr_pass.rs +188 -0
  105. package/native/shared/src/renderer/texture_store.rs +473 -0
  106. package/native/shared/src/renderer/transient.rs +591 -0
  107. package/native/shared/src/renderer/types.rs +941 -0
  108. package/native/shared/src/renderer/util.rs +152 -0
  109. package/native/shared/src/scene.rs +1362 -0
  110. package/native/shared/src/sdf_cache.rs +274 -0
  111. package/native/shared/src/shadows.rs +1036 -0
  112. package/native/shared/src/staging.rs +102 -0
  113. package/native/shared/src/string_header.rs +266 -0
  114. package/native/shared/src/text_renderer.rs +502 -0
  115. package/native/shared/src/textures.rs +197 -0
  116. package/native/tvos/Cargo.lock +1693 -0
  117. package/native/tvos/Cargo.toml +36 -0
  118. package/native/tvos/metal-patched/Cargo.toml +178 -0
  119. package/native/tvos/metal-patched/LICENSE-APACHE +201 -0
  120. package/native/tvos/metal-patched/LICENSE-MIT +25 -0
  121. package/native/tvos/metal-patched/src/acceleration_structure.rs +667 -0
  122. package/native/tvos/metal-patched/src/acceleration_structure_pass.rs +108 -0
  123. package/native/tvos/metal-patched/src/argument.rs +366 -0
  124. package/native/tvos/metal-patched/src/blitpass.rs +102 -0
  125. package/native/tvos/metal-patched/src/buffer.rs +71 -0
  126. package/native/tvos/metal-patched/src/capturedescriptor.rs +76 -0
  127. package/native/tvos/metal-patched/src/capturemanager.rs +113 -0
  128. package/native/tvos/metal-patched/src/commandbuffer.rs +192 -0
  129. package/native/tvos/metal-patched/src/commandqueue.rs +44 -0
  130. package/native/tvos/metal-patched/src/computepass.rs +107 -0
  131. package/native/tvos/metal-patched/src/constants.rs +152 -0
  132. package/native/tvos/metal-patched/src/counters.rs +119 -0
  133. package/native/tvos/metal-patched/src/depthstencil.rs +190 -0
  134. package/native/tvos/metal-patched/src/device.rs +2134 -0
  135. package/native/tvos/metal-patched/src/drawable.rs +39 -0
  136. package/native/tvos/metal-patched/src/encoder.rs +2041 -0
  137. package/native/tvos/metal-patched/src/heap.rs +281 -0
  138. package/native/tvos/metal-patched/src/indirect_encoder.rs +344 -0
  139. package/native/tvos/metal-patched/src/lib.rs +657 -0
  140. package/native/tvos/metal-patched/src/library.rs +902 -0
  141. package/native/tvos/metal-patched/src/mps.rs +575 -0
  142. package/native/tvos/metal-patched/src/pipeline/compute.rs +475 -0
  143. package/native/tvos/metal-patched/src/pipeline/mod.rs +71 -0
  144. package/native/tvos/metal-patched/src/pipeline/render.rs +762 -0
  145. package/native/tvos/metal-patched/src/renderpass.rs +443 -0
  146. package/native/tvos/metal-patched/src/resource.rs +182 -0
  147. package/native/tvos/metal-patched/src/sampler.rs +165 -0
  148. package/native/tvos/metal-patched/src/sync.rs +178 -0
  149. package/native/tvos/metal-patched/src/texture.rs +352 -0
  150. package/native/tvos/metal-patched/src/types.rs +90 -0
  151. package/native/tvos/metal-patched/src/vertexdescriptor.rs +250 -0
  152. package/native/tvos/src/audio_backend.rs +197 -0
  153. package/native/tvos/src/lib.rs +1891 -0
  154. package/native/visionos/Cargo.lock +1693 -0
  155. package/native/visionos/Cargo.toml +40 -0
  156. package/native/visionos/src/audio_backend.rs +197 -0
  157. package/native/visionos/src/lib.rs +1887 -0
  158. package/native/watchos/Cargo.lock +16 -0
  159. package/native/watchos/Cargo.toml +19 -0
  160. package/native/watchos/shaders/bloom_postfx.metal +99 -0
  161. package/native/watchos/src/BloomWatchApp.swift +1267 -0
  162. package/native/watchos/src/BloomWatchAudio.swift +179 -0
  163. package/native/watchos/src/audio.rs +55 -0
  164. package/native/watchos/src/draw_list.rs +229 -0
  165. package/native/watchos/src/ffi_stubs.rs +915 -0
  166. package/native/watchos/src/ffi_stubs_manual.rs +35 -0
  167. package/native/watchos/src/lib.rs +1124 -0
  168. package/native/watchos/src/models.rs +746 -0
  169. package/native/watchos/src/postfx.rs +95 -0
  170. package/native/watchos/src/scene.rs +534 -0
  171. package/native/watchos/src/textures.rs +184 -0
  172. package/native/web/Cargo.lock +1657 -0
  173. package/native/web/Cargo.toml +43 -0
  174. package/native/web/bloom_glue.js +695 -0
  175. package/native/web/build.sh +131 -0
  176. package/native/web/index.html +35 -0
  177. package/native/web/jolt_bridge.js +1519 -0
  178. package/native/web/src/input_ffi.rs +286 -0
  179. package/native/web/src/lib.rs +1796 -0
  180. package/native/web/src/material_ffi.rs +710 -0
  181. package/native/web/src/parity_ffi.rs +343 -0
  182. package/native/web/src/physics_ffi.rs +643 -0
  183. package/native/web/src/ragdoll_ffi.rs +250 -0
  184. package/native/web/src/render_settings.rs +98 -0
  185. package/native/windows/Cargo.lock +1815 -0
  186. package/native/windows/Cargo.toml +68 -0
  187. package/native/windows/src/lib.rs +1486 -0
  188. package/package.json +4279 -0
  189. package/src/audio/index.ts +315 -0
  190. package/src/core/colors.ts +63 -0
  191. package/src/core/index.ts +1206 -0
  192. package/src/core/keys.ts +63 -0
  193. package/src/core/types.ts +104 -0
  194. package/src/index.ts +171 -0
  195. package/src/math/index.ts +516 -0
  196. package/src/mobile/index.ts +294 -0
  197. package/src/models/index.ts +1258 -0
  198. package/src/physics/index.ts +1134 -0
  199. package/src/scene/index.ts +698 -0
  200. package/src/shapes/index.ts +120 -0
  201. package/src/text/index.ts +48 -0
  202. package/src/textures/index.ts +187 -0
  203. package/src/vfx/index.ts +191 -0
  204. package/src/world/index.ts +24 -0
  205. package/src/world/loader.ts +423 -0
  206. package/src/world/prefab.ts +217 -0
  207. package/src/world/render.ts +172 -0
  208. package/src/world/saver.ts +108 -0
  209. package/src/world/serialize.ts +301 -0
  210. package/src/world/terrain.ts +355 -0
  211. package/src/world/types.ts +160 -0
  212. package/src/world/validate.ts +319 -0
  213. package/src/world/version.ts +114 -0
@@ -0,0 +1,40 @@
1
+ [package]
2
+ name = "bloom-visionos"
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+
6
+ [lib]
7
+ name = "bloom_visionos"
8
+ crate-type = ["staticlib"]
9
+
10
+ [features]
11
+ default = ["jolt", "models3d", "image-extras"]
12
+ jolt = ["bloom-shared/jolt"]
13
+ # EN-014 — see native/shared/Cargo.toml. Default-on so existing games are
14
+ # unaffected; pure-2D games opt out via Perry feature forwarding.
15
+ models3d = ["bloom-shared/models3d"]
16
+ image-extras = ["bloom-shared/image-extras"]
17
+
18
+ # Match perry-runtime's panic strategy so the final perry-driven link
19
+ # doesn't see two copies of rust_eh_personality (and friends) from two
20
+ # independent Rust staticlibs. ld64.lld flags these as duplicate symbols;
21
+ # GNU ld silently tolerates them, which is why only Apple targets break.
22
+ # Mirrors the same setting in native/watchos/Cargo.toml.
23
+ [profile.release]
24
+ panic = "abort"
25
+
26
+ [dependencies]
27
+ bloom-shared = { path = "../shared", default-features = false, features = ["mp3"] }
28
+ objc2 = "0.6"
29
+ objc2-foundation = { version = "0.3", features = ["NSDate", "NSRunLoop", "NSString", "NSThread", "NSObject", "NSLocale", "NSArray"] }
30
+ raw-window-handle = "0.6"
31
+ wgpu = "29"
32
+ # Needed by bloom_set_env_clear_from_hdr (HDR env-map decode); mirrors macOS.
33
+ image = { version = "0.25", default-features = false, features = ["hdr"] }
34
+
35
+ [patch.crates-io]
36
+ # visionOS shares tvOS's vendored Metal crate (it already carries the
37
+ # target_os = "visionos" cfg arms). Referenced as a sibling to avoid
38
+ # duplicating the large vendored crate; the published package ships
39
+ # native/tvos/metal-patched, so this relative path resolves there too.
40
+ metal = { path = "../tvos/metal-patched" }
@@ -0,0 +1,197 @@
1
+ //! CoreAudio (RemoteIO) backend for tvOS: AudioUnit FFI bindings, the
2
+ //! render callback, and the bloom_init_audio / bloom_close_audio entry
3
+ //! points. The render callback owns the engine's AudioRenderer (handed
4
+ //! off via AudioMixer::take_renderer) — see native/shared/src/audio for
5
+ //! the threading contract.
6
+
7
+ use crate::engine;
8
+ use std::ffi::c_void;
9
+
10
+ // CoreAudio (iOS) — RemoteIO Audio Unit
11
+ // ============================================================
12
+
13
+ type AudioUnit = *mut c_void;
14
+ type OSStatus = i32;
15
+ type AudioUnitPropertyID = u32;
16
+ type AudioUnitScope = u32;
17
+ type AudioUnitElement = u32;
18
+
19
+ #[repr(C)]
20
+ #[derive(Clone, Copy)]
21
+ struct AudioComponentDescription {
22
+ component_type: u32,
23
+ component_sub_type: u32,
24
+ component_manufacturer: u32,
25
+ component_flags: u32,
26
+ component_flags_mask: u32,
27
+ }
28
+
29
+ #[repr(C)]
30
+ #[derive(Clone, Copy)]
31
+ struct AudioStreamBasicDescription {
32
+ sample_rate: f64,
33
+ format_id: u32,
34
+ format_flags: u32,
35
+ bytes_per_packet: u32,
36
+ frames_per_packet: u32,
37
+ bytes_per_frame: u32,
38
+ channels_per_frame: u32,
39
+ bits_per_channel: u32,
40
+ reserved: u32,
41
+ }
42
+
43
+ #[repr(C)]
44
+ struct AudioBufferList {
45
+ number_buffers: u32,
46
+ buffers: [AudioBufferData; 1],
47
+ }
48
+
49
+ #[repr(C)]
50
+ struct AudioBufferData {
51
+ number_channels: u32,
52
+ data_byte_size: u32,
53
+ data: *mut c_void,
54
+ }
55
+
56
+ type AURenderCallback = unsafe extern "C" fn(
57
+ in_ref_con: *mut c_void,
58
+ io_action_flags: *mut u32,
59
+ in_time_stamp: *const c_void,
60
+ in_bus_number: u32,
61
+ in_number_frames: u32,
62
+ io_data: *mut AudioBufferList,
63
+ ) -> OSStatus;
64
+
65
+ #[repr(C)]
66
+ struct AURenderCallbackStruct {
67
+ input_proc: AURenderCallback,
68
+ input_proc_ref_con: *mut c_void,
69
+ }
70
+
71
+ type AudioComponent = *mut c_void;
72
+
73
+ #[link(name = "AudioToolbox", kind = "framework")]
74
+ extern "C" {
75
+ fn AudioComponentFindNext(component: AudioComponent, desc: *const AudioComponentDescription) -> AudioComponent;
76
+ fn AudioComponentInstanceNew(component: AudioComponent, out: *mut AudioUnit) -> OSStatus;
77
+ fn AudioUnitSetProperty(
78
+ unit: AudioUnit,
79
+ property_id: AudioUnitPropertyID,
80
+ scope: AudioUnitScope,
81
+ element: AudioUnitElement,
82
+ data: *const c_void,
83
+ data_size: u32,
84
+ ) -> OSStatus;
85
+ fn AudioUnitInitialize(unit: AudioUnit) -> OSStatus;
86
+ fn AudioOutputUnitStart(unit: AudioUnit) -> OSStatus;
87
+ fn AudioOutputUnitStop(unit: AudioUnit) -> OSStatus;
88
+ fn AudioComponentInstanceDispose(unit: AudioUnit) -> OSStatus;
89
+ }
90
+
91
+ const K_AUDIO_UNIT_TYPE_OUTPUT: u32 = u32::from_be_bytes(*b"auou");
92
+ const K_AUDIO_UNIT_SUB_TYPE_REMOTE_IO: u32 = u32::from_be_bytes(*b"rioc");
93
+ const K_AUDIO_UNIT_MANUFACTURER_APPLE: u32 = u32::from_be_bytes(*b"appl");
94
+
95
+ const K_AUDIO_UNIT_PROPERTY_STREAM_FORMAT: AudioUnitPropertyID = 8;
96
+ const K_AUDIO_UNIT_PROPERTY_SET_RENDER_CALLBACK: AudioUnitPropertyID = 23;
97
+ const K_AUDIO_UNIT_SCOPE_INPUT: AudioUnitScope = 1;
98
+
99
+ const K_AUDIO_FORMAT_LINEAR_PCM: u32 = u32::from_be_bytes(*b"lpcm");
100
+ const K_AUDIO_FORMAT_FLAG_IS_FLOAT: u32 = 1;
101
+ const K_AUDIO_FORMAT_FLAG_IS_PACKED: u32 = 8;
102
+
103
+ struct AudioUnitInstance { unit: AudioUnit }
104
+ unsafe impl Send for AudioUnitInstance {}
105
+ unsafe impl Sync for AudioUnitInstance {}
106
+
107
+ static mut AUDIO_UNIT: Option<AudioUnitInstance> = None;
108
+ // Render half of the audio system — owned by the CoreAudio render thread
109
+ // after bloom_init_audio hands it off via AudioMixer::take_renderer.
110
+ // See native/shared/src/audio/mod.rs for the threading contract.
111
+ static mut AUDIO_RENDERER: Option<bloom_shared::audio::AudioRenderer> = None;
112
+
113
+ unsafe extern "C" fn audio_render_callback(
114
+ _in_ref_con: *mut c_void,
115
+ _io_action_flags: *mut u32,
116
+ _in_time_stamp: *const c_void,
117
+ _in_bus_number: u32,
118
+ in_number_frames: u32,
119
+ io_data: *mut AudioBufferList,
120
+ ) -> OSStatus {
121
+ let buffer_list = &mut *io_data;
122
+ let buffer = &mut buffer_list.buffers[0];
123
+ let num_samples = in_number_frames as usize * 2;
124
+ let output = std::slice::from_raw_parts_mut(buffer.data as *mut f32, num_samples);
125
+ match AUDIO_RENDERER.as_mut() {
126
+ Some(r) => r.mix(output),
127
+ None => output.iter_mut().for_each(|s| *s = 0.0),
128
+ }
129
+ 0
130
+ }
131
+
132
+ #[no_mangle]
133
+ pub extern "C" fn bloom_init_audio() {
134
+ unsafe {
135
+ // Hand the render half to the audio thread before the callback
136
+ // can fire. Idempotent: a second init keeps the existing renderer.
137
+ if AUDIO_RENDERER.is_none() {
138
+ AUDIO_RENDERER = engine().audio.take_renderer();
139
+ }
140
+ let desc = AudioComponentDescription {
141
+ component_type: K_AUDIO_UNIT_TYPE_OUTPUT,
142
+ component_sub_type: K_AUDIO_UNIT_SUB_TYPE_REMOTE_IO,
143
+ component_manufacturer: K_AUDIO_UNIT_MANUFACTURER_APPLE,
144
+ component_flags: 0,
145
+ component_flags_mask: 0,
146
+ };
147
+
148
+ let component = AudioComponentFindNext(std::ptr::null_mut(), &desc);
149
+ if component.is_null() { return; }
150
+
151
+ let mut unit: AudioUnit = std::ptr::null_mut();
152
+ if AudioComponentInstanceNew(component, &mut unit) != 0 { return; }
153
+
154
+ let stream_desc = AudioStreamBasicDescription {
155
+ sample_rate: 44100.0,
156
+ format_id: K_AUDIO_FORMAT_LINEAR_PCM,
157
+ format_flags: K_AUDIO_FORMAT_FLAG_IS_FLOAT | K_AUDIO_FORMAT_FLAG_IS_PACKED,
158
+ bytes_per_packet: 8,
159
+ frames_per_packet: 1,
160
+ bytes_per_frame: 8,
161
+ channels_per_frame: 2,
162
+ bits_per_channel: 32,
163
+ reserved: 0,
164
+ };
165
+
166
+ AudioUnitSetProperty(
167
+ unit, K_AUDIO_UNIT_PROPERTY_STREAM_FORMAT, K_AUDIO_UNIT_SCOPE_INPUT, 0,
168
+ &stream_desc as *const _ as *const c_void,
169
+ std::mem::size_of::<AudioStreamBasicDescription>() as u32,
170
+ );
171
+
172
+ let callback_struct = AURenderCallbackStruct {
173
+ input_proc: audio_render_callback,
174
+ input_proc_ref_con: std::ptr::null_mut(),
175
+ };
176
+
177
+ AudioUnitSetProperty(
178
+ unit, K_AUDIO_UNIT_PROPERTY_SET_RENDER_CALLBACK, K_AUDIO_UNIT_SCOPE_INPUT, 0,
179
+ &callback_struct as *const _ as *const c_void,
180
+ std::mem::size_of::<AURenderCallbackStruct>() as u32,
181
+ );
182
+
183
+ AudioUnitInitialize(unit);
184
+ AudioOutputUnitStart(unit);
185
+ AUDIO_UNIT = Some(AudioUnitInstance { unit });
186
+ }
187
+ }
188
+
189
+ #[no_mangle]
190
+ pub extern "C" fn bloom_close_audio() {
191
+ unsafe {
192
+ if let Some(au) = AUDIO_UNIT.take() {
193
+ AudioOutputUnitStop(au.unit);
194
+ AudioComponentInstanceDispose(au.unit);
195
+ }
196
+ }
197
+ }