1use crate::loader::Module;
2use crate::Error;
3
4const K4A_LIBNAME: &'static str = "k4a.dll";
5const K4ARECORD_LIBNAME: &'static str = "k4arecord.dll";
6
7macro_rules! proc_address {
8 ($m:ident, $proc_name:ident) => {
9 std::mem::transmute($m.get_proc_address(concat!(stringify!($proc_name), "\0").as_ptr())?)
10 };
11}
12
13pub struct Api {
14 #[allow(dead_code)]
15 module_k4a: Module, pub funcs: super::k4a::Funcs,
17}
18
19impl Api {
20 pub(crate) fn with_module(module_k4a: Module) -> Result<Api, Error> {
21 unsafe {
22 let funcs = super::k4a::Funcs {
23 k4a_device_get_installed_count: proc_address!(
24 module_k4a,
25 k4a_device_get_installed_count
26 ),
27 k4a_set_debug_message_handler: proc_address!(
28 module_k4a,
29 k4a_set_debug_message_handler
30 ),
31 k4a_set_allocator: proc_address!(module_k4a, k4a_set_allocator),
32 k4a_device_open: proc_address!(module_k4a, k4a_device_open),
33 k4a_device_close: proc_address!(module_k4a, k4a_device_close),
34 k4a_device_get_capture: proc_address!(module_k4a, k4a_device_get_capture),
35 k4a_device_get_imu_sample: proc_address!(module_k4a, k4a_device_get_imu_sample),
36 k4a_capture_create: proc_address!(module_k4a, k4a_capture_create),
37 k4a_capture_release: proc_address!(module_k4a, k4a_capture_release),
38 k4a_capture_reference: proc_address!(module_k4a, k4a_capture_reference),
39 k4a_capture_get_color_image: proc_address!(module_k4a, k4a_capture_get_color_image),
40 k4a_capture_get_depth_image: proc_address!(module_k4a, k4a_capture_get_depth_image),
41 k4a_capture_get_ir_image: proc_address!(module_k4a, k4a_capture_get_ir_image),
42 k4a_capture_set_color_image: proc_address!(module_k4a, k4a_capture_set_color_image),
43 k4a_capture_set_depth_image: proc_address!(module_k4a, k4a_capture_set_depth_image),
44 k4a_capture_set_ir_image: proc_address!(module_k4a, k4a_capture_set_ir_image),
45 k4a_capture_set_temperature_c: proc_address!(
46 module_k4a,
47 k4a_capture_set_temperature_c
48 ),
49 k4a_capture_get_temperature_c: proc_address!(
50 module_k4a,
51 k4a_capture_get_temperature_c
52 ),
53 k4a_image_create: proc_address!(module_k4a, k4a_image_create),
54 k4a_image_create_from_buffer: proc_address!(
55 module_k4a,
56 k4a_image_create_from_buffer
57 ),
58 k4a_image_get_buffer: proc_address!(module_k4a, k4a_image_get_buffer),
59 k4a_image_get_size: proc_address!(module_k4a, k4a_image_get_size),
60 k4a_image_get_format: proc_address!(module_k4a, k4a_image_get_format),
61 k4a_image_get_width_pixels: proc_address!(module_k4a, k4a_image_get_width_pixels),
62 k4a_image_get_height_pixels: proc_address!(module_k4a, k4a_image_get_height_pixels),
63 k4a_image_get_stride_bytes: proc_address!(module_k4a, k4a_image_get_stride_bytes),
64 k4a_image_get_timestamp_usec: proc_address!(
65 module_k4a,
66 k4a_image_get_timestamp_usec
67 ),
68 k4a_image_get_device_timestamp_usec: proc_address!(
69 module_k4a,
70 k4a_image_get_device_timestamp_usec
71 ),
72 k4a_image_get_system_timestamp_nsec: proc_address!(
73 module_k4a,
74 k4a_image_get_system_timestamp_nsec
75 ),
76 k4a_image_get_exposure_usec: proc_address!(module_k4a, k4a_image_get_exposure_usec),
77 k4a_image_get_white_balance: proc_address!(module_k4a, k4a_image_get_white_balance),
78 k4a_image_get_iso_speed: proc_address!(module_k4a, k4a_image_get_iso_speed),
79 k4a_image_set_device_timestamp_usec: proc_address!(
80 module_k4a,
81 k4a_image_set_device_timestamp_usec
82 ),
83 k4a_image_set_timestamp_usec: proc_address!(
84 module_k4a,
85 k4a_image_set_timestamp_usec
86 ),
87 k4a_image_set_system_timestamp_nsec: proc_address!(
88 module_k4a,
89 k4a_image_set_system_timestamp_nsec
90 ),
91 k4a_image_set_exposure_usec: proc_address!(module_k4a, k4a_image_set_exposure_usec),
92 k4a_image_set_exposure_time_usec: proc_address!(
93 module_k4a,
94 k4a_image_set_exposure_time_usec
95 ),
96 k4a_image_set_white_balance: proc_address!(module_k4a, k4a_image_set_white_balance),
97 k4a_image_set_iso_speed: proc_address!(module_k4a, k4a_image_set_iso_speed),
98 k4a_image_reference: proc_address!(module_k4a, k4a_image_reference),
99 k4a_image_release: proc_address!(module_k4a, k4a_image_release),
100 k4a_device_start_cameras: proc_address!(module_k4a, k4a_device_start_cameras),
101 k4a_device_stop_cameras: proc_address!(module_k4a, k4a_device_stop_cameras),
102 k4a_device_start_imu: proc_address!(module_k4a, k4a_device_start_imu),
103 k4a_device_stop_imu: proc_address!(module_k4a, k4a_device_stop_imu),
104 k4a_device_get_serialnum: proc_address!(module_k4a, k4a_device_get_serialnum),
105 k4a_device_get_version: proc_address!(module_k4a, k4a_device_get_version),
106 k4a_device_get_color_control_capabilities: proc_address!(
107 module_k4a,
108 k4a_device_get_color_control_capabilities
109 ),
110 k4a_device_get_color_control: proc_address!(
111 module_k4a,
112 k4a_device_get_color_control
113 ),
114 k4a_device_set_color_control: proc_address!(
115 module_k4a,
116 k4a_device_set_color_control
117 ),
118 k4a_device_get_raw_calibration: proc_address!(
119 module_k4a,
120 k4a_device_get_raw_calibration
121 ),
122 k4a_device_get_calibration: proc_address!(module_k4a, k4a_device_get_calibration),
123 k4a_device_get_sync_jack: proc_address!(module_k4a, k4a_device_get_sync_jack),
124 k4a_calibration_get_from_raw: proc_address!(
125 module_k4a,
126 k4a_calibration_get_from_raw
127 ),
128 k4a_calibration_3d_to_3d: proc_address!(module_k4a, k4a_calibration_3d_to_3d),
129 k4a_calibration_2d_to_3d: proc_address!(module_k4a, k4a_calibration_2d_to_3d),
130 k4a_calibration_3d_to_2d: proc_address!(module_k4a, k4a_calibration_3d_to_2d),
131 k4a_calibration_2d_to_2d: proc_address!(module_k4a, k4a_calibration_2d_to_2d),
132 k4a_calibration_color_2d_to_depth_2d: proc_address!(
133 module_k4a,
134 k4a_calibration_color_2d_to_depth_2d
135 ),
136 k4a_transformation_create: proc_address!(module_k4a, k4a_transformation_create),
137 k4a_transformation_destroy: proc_address!(module_k4a, k4a_transformation_destroy),
138 k4a_transformation_depth_image_to_color_camera: proc_address!(
139 module_k4a,
140 k4a_transformation_depth_image_to_color_camera
141 ),
142 k4a_transformation_depth_image_to_color_camera_custom: proc_address!(
143 module_k4a,
144 k4a_transformation_depth_image_to_color_camera_custom
145 ),
146 k4a_transformation_color_image_to_depth_camera: proc_address!(
147 module_k4a,
148 k4a_transformation_color_image_to_depth_camera
149 ),
150 k4a_transformation_depth_image_to_point_cloud: proc_address!(
151 module_k4a,
152 k4a_transformation_depth_image_to_point_cloud
153 ),
154 };
155
156 Ok(Api { module_k4a, funcs })
157 }
158 }
159
160 pub fn new() -> Result<Api, Error> {
161 Self::with_library_directory(
162 std::env::current_exe()
163 .map_err(|_| Error::Failed)?
164 .parent()
165 .ok_or(Error::Failed)?
166 .to_str()
167 .ok_or(Error::Failed)?,
168 )
169 }
170
171 pub fn with_library_directory(lib_dir: &str) -> Result<Api, Error> {
172 Self::with_module(Module::load_library(lib_dir, K4A_LIBNAME)?)
173 }
174
175 pub fn with_get_module() -> Result<Api, Error> {
176 Self::with_module(Module::get_module(K4A_LIBNAME)?)
177 }
178}
179
180pub struct ApiRecord {
181 #[allow(dead_code)]
182 pub(crate) module_k4arecord: Module, pub funcs: super::k4arecord::Funcs,
184}
185
186impl ApiRecord {
187 pub(crate) fn with_module(module_k4arecord: Module) -> Result<ApiRecord, Error> {
188 unsafe {
189 let funcs = super::k4arecord::Funcs {
190 k4a_record_create: proc_address!(module_k4arecord, k4a_record_create),
191 k4a_record_add_tag: proc_address!(module_k4arecord, k4a_record_add_tag),
192 k4a_record_add_imu_track: proc_address!(module_k4arecord, k4a_record_add_imu_track),
193 k4a_record_add_attachment: proc_address!(
194 module_k4arecord,
195 k4a_record_add_attachment
196 ),
197 k4a_record_add_custom_video_track: proc_address!(
198 module_k4arecord,
199 k4a_record_add_custom_video_track
200 ),
201 k4a_record_add_custom_subtitle_track: proc_address!(
202 module_k4arecord,
203 k4a_record_add_custom_subtitle_track
204 ),
205 k4a_record_write_header: proc_address!(module_k4arecord, k4a_record_write_header),
206 k4a_record_write_capture: proc_address!(module_k4arecord, k4a_record_write_capture),
207 k4a_record_write_imu_sample: proc_address!(
208 module_k4arecord,
209 k4a_record_write_imu_sample
210 ),
211 k4a_record_write_custom_track_data: proc_address!(
212 module_k4arecord,
213 k4a_record_write_custom_track_data
214 ),
215 k4a_record_flush: proc_address!(module_k4arecord, k4a_record_flush),
216 k4a_record_close: proc_address!(module_k4arecord, k4a_record_close),
217 k4a_playback_open: proc_address!(module_k4arecord, k4a_playback_open),
218 k4a_playback_get_raw_calibration: proc_address!(
219 module_k4arecord,
220 k4a_playback_get_raw_calibration
221 ),
222 k4a_playback_get_calibration: proc_address!(
223 module_k4arecord,
224 k4a_playback_get_calibration
225 ),
226 k4a_playback_get_record_configuration: proc_address!(
227 module_k4arecord,
228 k4a_playback_get_record_configuration
229 ),
230 k4a_playback_check_track_exists: proc_address!(
231 module_k4arecord,
232 k4a_playback_check_track_exists
233 ),
234 k4a_playback_get_track_count: proc_address!(
235 module_k4arecord,
236 k4a_playback_get_track_count
237 ),
238 k4a_playback_get_track_name: proc_address!(
239 module_k4arecord,
240 k4a_playback_get_track_name
241 ),
242 k4a_playback_track_is_builtin: proc_address!(
243 module_k4arecord,
244 k4a_playback_track_is_builtin
245 ),
246 k4a_playback_track_get_video_settings: proc_address!(
247 module_k4arecord,
248 k4a_playback_track_get_video_settings
249 ),
250 k4a_playback_track_get_codec_id: proc_address!(
251 module_k4arecord,
252 k4a_playback_track_get_codec_id
253 ),
254 k4a_playback_track_get_codec_context: proc_address!(
255 module_k4arecord,
256 k4a_playback_track_get_codec_context
257 ),
258 k4a_playback_get_tag: proc_address!(module_k4arecord, k4a_playback_get_tag),
259 k4a_playback_set_color_conversion: proc_address!(
260 module_k4arecord,
261 k4a_playback_set_color_conversion
262 ),
263 k4a_playback_get_attachment: proc_address!(
264 module_k4arecord,
265 k4a_playback_get_attachment
266 ),
267 k4a_playback_get_next_capture: proc_address!(
268 module_k4arecord,
269 k4a_playback_get_next_capture
270 ),
271 k4a_playback_get_previous_capture: proc_address!(
272 module_k4arecord,
273 k4a_playback_get_previous_capture
274 ),
275 k4a_playback_get_next_imu_sample: proc_address!(
276 module_k4arecord,
277 k4a_playback_get_next_imu_sample
278 ),
279 k4a_playback_get_previous_imu_sample: proc_address!(
280 module_k4arecord,
281 k4a_playback_get_previous_imu_sample
282 ),
283 k4a_playback_get_next_data_block: proc_address!(
284 module_k4arecord,
285 k4a_playback_get_next_data_block
286 ),
287 k4a_playback_get_previous_data_block: proc_address!(
288 module_k4arecord,
289 k4a_playback_get_previous_data_block
290 ),
291 k4a_playback_data_block_get_device_timestamp_usec: proc_address!(
292 module_k4arecord,
293 k4a_playback_data_block_get_device_timestamp_usec
294 ),
295 k4a_playback_data_block_get_buffer_size: proc_address!(
296 module_k4arecord,
297 k4a_playback_data_block_get_buffer_size
298 ),
299 k4a_playback_data_block_get_buffer: proc_address!(
300 module_k4arecord,
301 k4a_playback_data_block_get_buffer
302 ),
303 k4a_playback_data_block_release: proc_address!(
304 module_k4arecord,
305 k4a_playback_data_block_release
306 ),
307 k4a_playback_seek_timestamp: proc_address!(
308 module_k4arecord,
309 k4a_playback_seek_timestamp
310 ),
311 k4a_playback_get_recording_length_usec: proc_address!(
312 module_k4arecord,
313 k4a_playback_get_recording_length_usec
314 ),
315 k4a_playback_get_last_timestamp_usec: proc_address!(
316 module_k4arecord,
317 k4a_playback_get_last_timestamp_usec
318 ),
319 k4a_playback_close: proc_address!(module_k4arecord, k4a_playback_close),
320 };
321
322 Ok(ApiRecord {
323 module_k4arecord,
324 funcs,
325 })
326 }
327 }
328
329 pub fn new() -> Result<ApiRecord, Error> {
330 Self::with_library_directory(
331 std::env::current_exe()
332 .map_err(|_| Error::Failed)?
333 .parent()
334 .ok_or(Error::Failed)?
335 .to_str()
336 .ok_or(Error::Failed)?,
337 )
338 }
339
340 pub fn with_library_directory(lib_dir: &str) -> Result<ApiRecord, Error> {
341 Self::with_module(Module::load_library(lib_dir, K4ARECORD_LIBNAME)?)
342 }
343}