1#![allow(non_upper_case_globals)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4use super::{firewall, raw::MediaTrack};
5use crate::raw;
6
7use std::fmt::Debug;
8use std::os::raw::c_void;
9use std::panic::RefUnwindSafe;
10use std::ptr::{null, null_mut, NonNull};
11
12pub trait IReaperControlSurface: RefUnwindSafe + Debug {
47 fn GetTypeString(&self) -> *const ::std::os::raw::c_char {
48 null()
49 }
50
51 fn GetDescString(&self) -> *const ::std::os::raw::c_char {
52 null()
53 }
54
55 fn GetConfigString(&self) -> *const ::std::os::raw::c_char {
56 null()
57 }
58
59 fn CloseNoReset(&self) {}
60
61 fn Run(&mut self) {}
62
63 fn SetTrackListChange(&self) {}
64
65 fn SetSurfaceVolume(&self, _trackid: *mut MediaTrack, _volume: f64) {}
66
67 fn SetSurfacePan(&self, _trackid: *mut MediaTrack, _pan: f64) {}
68
69 fn SetSurfaceMute(&self, _trackid: *mut MediaTrack, _mute: bool) {}
70
71 fn SetSurfaceSelected(&self, _trackid: *mut MediaTrack, _selected: bool) {}
72
73 fn SetSurfaceSolo(&self, _trackid: *mut MediaTrack, _solo: bool) {}
74
75 fn SetSurfaceRecArm(&self, _trackid: *mut MediaTrack, _recarm: bool) {}
76
77 fn SetPlayState(&self, _play: bool, _pause: bool, _rec: bool) {}
78
79 fn SetRepeatState(&self, _rep: bool) {}
80
81 fn SetTrackTitle(&self, _trackid: *mut MediaTrack, _title: *const ::std::os::raw::c_char) {}
82
83 fn GetTouchState(&self, _trackid: *mut MediaTrack, _isPan: ::std::os::raw::c_int) -> bool {
84 false
85 }
86
87 fn SetAutoMode(&self, _mode: ::std::os::raw::c_int) {}
88
89 fn ResetCachedVolPanStates(&self) {}
90
91 fn OnTrackSelection(&self, _trackid: *mut MediaTrack) {}
92
93 fn IsKeyDown(&self, _key: ::std::os::raw::c_int) -> bool {
94 false
95 }
96
97 fn Extended(
98 &self,
99 _call: ::std::os::raw::c_int,
100 _parm1: *mut ::std::os::raw::c_void,
101 _parm2: *mut ::std::os::raw::c_void,
102 _parm3: *mut ::std::os::raw::c_void,
103 ) -> ::std::os::raw::c_int {
104 0
105 }
106}
107
108pub unsafe fn add_cpp_control_surface(
164 callback_target: NonNull<Box<dyn IReaperControlSurface>>,
165) -> NonNull<raw::IReaperControlSurface> {
166 let instance = crate::bindings::root::reaper_control_surface::add_control_surface(
167 callback_target.as_ptr() as *mut c_void,
168 );
169 NonNull::new_unchecked(instance)
170}
171
172pub unsafe fn remove_cpp_control_surface(surface: NonNull<raw::IReaperControlSurface>) {
178 crate::bindings::root::reaper_control_surface::remove_control_surface(surface.as_ptr());
179}
180
181#[no_mangle]
182extern "C" fn GetTypeString(
183 callback_target: *mut Box<dyn IReaperControlSurface>,
184) -> *const ::std::os::raw::c_char {
185 firewall(|| unsafe { &*callback_target }.GetTypeString()).unwrap_or(null_mut())
186}
187
188#[no_mangle]
189extern "C" fn GetDescString(
190 callback_target: *mut Box<dyn IReaperControlSurface>,
191) -> *const ::std::os::raw::c_char {
192 firewall(|| unsafe { &*callback_target }.GetDescString()).unwrap_or(null_mut())
193}
194
195#[no_mangle]
196extern "C" fn GetConfigString(
197 callback_target: *mut Box<dyn IReaperControlSurface>,
198) -> *const ::std::os::raw::c_char {
199 firewall(|| unsafe { &*callback_target }.GetConfigString()).unwrap_or(null_mut())
200}
201
202#[no_mangle]
203extern "C" fn CloseNoReset(callback_target: *mut Box<dyn IReaperControlSurface>) {
204 firewall(|| unsafe { &*callback_target }.CloseNoReset());
205}
206
207#[no_mangle]
208extern "C" fn Run(callback_target: *mut Box<dyn IReaperControlSurface>) {
209 firewall(|| unsafe { &mut *callback_target }.Run());
213}
214
215#[no_mangle]
216extern "C" fn SetTrackListChange(callback_target: *mut Box<dyn IReaperControlSurface>) {
217 firewall(|| unsafe { &*callback_target }.SetTrackListChange());
218}
219
220#[no_mangle]
221extern "C" fn SetSurfaceVolume(
222 callback_target: *mut Box<dyn IReaperControlSurface>,
223 trackid: *mut MediaTrack,
224 volume: f64,
225) {
226 firewall(|| unsafe { &*callback_target }.SetSurfaceVolume(trackid, volume));
227}
228
229#[no_mangle]
230extern "C" fn SetSurfacePan(
231 callback_target: *mut Box<dyn IReaperControlSurface>,
232 trackid: *mut MediaTrack,
233 pan: f64,
234) {
235 firewall(|| unsafe { &*callback_target }.SetSurfacePan(trackid, pan));
236}
237
238#[no_mangle]
239extern "C" fn SetSurfaceMute(
240 callback_target: *mut Box<dyn IReaperControlSurface>,
241 trackid: *mut MediaTrack,
242 mute: bool,
243) {
244 firewall(|| unsafe { &*callback_target }.SetSurfaceMute(trackid, mute));
245}
246
247#[no_mangle]
248extern "C" fn SetSurfaceSelected(
249 callback_target: *mut Box<dyn IReaperControlSurface>,
250 trackid: *mut MediaTrack,
251 selected: bool,
252) {
253 firewall(|| unsafe { &*callback_target }.SetSurfaceSelected(trackid, selected));
254}
255
256#[no_mangle]
257extern "C" fn SetSurfaceSolo(
258 callback_target: *mut Box<dyn IReaperControlSurface>,
259 trackid: *mut MediaTrack,
260 solo: bool,
261) {
262 firewall(|| unsafe { &*callback_target }.SetSurfaceSolo(trackid, solo));
263}
264
265#[no_mangle]
266extern "C" fn SetSurfaceRecArm(
267 callback_target: *mut Box<dyn IReaperControlSurface>,
268 trackid: *mut MediaTrack,
269 recarm: bool,
270) {
271 firewall(|| unsafe { &*callback_target }.SetSurfaceRecArm(trackid, recarm));
272}
273
274#[no_mangle]
275extern "C" fn SetPlayState(
276 callback_target: *mut Box<dyn IReaperControlSurface>,
277 play: bool,
278 pause: bool,
279 rec: bool,
280) {
281 firewall(|| unsafe { &*callback_target }.SetPlayState(play, pause, rec));
282}
283
284#[no_mangle]
285extern "C" fn SetRepeatState(callback_target: *mut Box<dyn IReaperControlSurface>, rep: bool) {
286 firewall(|| unsafe { &*callback_target }.SetRepeatState(rep));
287}
288
289#[no_mangle]
290extern "C" fn SetTrackTitle(
291 callback_target: *mut Box<dyn IReaperControlSurface>,
292 trackid: *mut MediaTrack,
293 title: *const ::std::os::raw::c_char,
294) {
295 firewall(|| unsafe { &*callback_target }.SetTrackTitle(trackid, title));
296}
297
298#[no_mangle]
299extern "C" fn GetTouchState(
300 callback_target: *mut Box<dyn IReaperControlSurface>,
301 trackid: *mut MediaTrack,
302 isPan: ::std::os::raw::c_int,
303) -> bool {
304 firewall(|| unsafe { &*callback_target }.GetTouchState(trackid, isPan)).unwrap_or(false)
305}
306
307#[no_mangle]
308extern "C" fn SetAutoMode(
309 callback_target: *mut Box<dyn IReaperControlSurface>,
310 mode: ::std::os::raw::c_int,
311) {
312 firewall(|| unsafe { &*callback_target }.SetAutoMode(mode));
313}
314
315#[no_mangle]
316extern "C" fn ResetCachedVolPanStates(callback_target: *mut Box<dyn IReaperControlSurface>) {
317 firewall(|| unsafe { &*callback_target }.ResetCachedVolPanStates());
318}
319
320#[no_mangle]
321extern "C" fn OnTrackSelection(
322 callback_target: *mut Box<dyn IReaperControlSurface>,
323 trackid: *mut MediaTrack,
324) {
325 firewall(|| unsafe { &*callback_target }.OnTrackSelection(trackid));
326}
327
328#[no_mangle]
329extern "C" fn IsKeyDown(
330 callback_target: *mut Box<dyn IReaperControlSurface>,
331 key: ::std::os::raw::c_int,
332) -> bool {
333 firewall(|| unsafe { &*callback_target }.IsKeyDown(key)).unwrap_or(false)
334}
335
336#[no_mangle]
337extern "C" fn Extended(
338 callback_target: *mut Box<dyn IReaperControlSurface>,
339 call: ::std::os::raw::c_int,
340 parm1: *mut ::std::os::raw::c_void,
341 parm2: *mut ::std::os::raw::c_void,
342 parm3: *mut ::std::os::raw::c_void,
343) -> ::std::os::raw::c_int {
344 firewall(|| unsafe { &*callback_target }.Extended(call, parm1, parm2, parm3)).unwrap_or(0)
345}