essentia_sys/
lib.rs

1#[cxx::bridge(namespace = "essentia_bridge")]
2pub mod ffi {
3
4    // ===== Helper Structs =====
5    pub struct SliceFloat<'a> {
6        slice: &'a [f32],
7    }
8
9    pub struct VecString {
10        vec: Vec<String>,
11    }
12
13    pub struct SliceStereoSample<'a> {
14        slice: &'a [StereoSample],
15    }
16
17    pub struct MatrixFloat<'a> {
18        slice: &'a [f32],
19        dim1: usize,
20        dim2: usize,
21    }
22
23    pub struct TensorFloat<'a> {
24        slice: &'a [f32],
25        shape: &'a [usize],
26    }
27
28    pub struct MapEntryVectorFloat<'a> {
29        key: String,
30        value: &'a [f32],
31    }
32
33    pub struct MapEntryVectorString {
34        key: String,
35        value: Vec<String>,
36    }
37
38    pub struct MapEntryVectorInt<'a> {
39        key: String,
40        value: &'a [i32],
41    }
42
43    pub struct MapEntryFloat {
44        key: String,
45        value: f32,
46    }
47
48    #[derive(Clone, Debug)]
49    pub struct StereoSample {
50        left: f32,
51        right: f32,
52    }
53
54    #[derive(Clone, Debug)]
55    pub struct Complex {
56        real: f32,
57        imag: f32,
58    }
59
60    pub struct VecComplex {
61        vec: Vec<Complex>,
62    }
63
64    pub struct MapEntryVectorComplex<'a> {
65        key: String,
66        value: &'a [Complex],
67    }
68
69    // ===== Data Type Enum =====
70    #[derive(Debug, Clone, Copy)]
71    pub enum DataType {
72        Float,
73        String,
74        Bool,
75        Int,
76        UnsignedInt,
77        Long,
78        StereoSample,
79        Complex,
80        TensorFloat,
81        VectorFloat,
82        VectorString,
83        VectorBool,
84        VectorInt,
85        VectorStereoSample,
86        VectorComplex,
87        VectorVectorFloat,
88        VectorVectorString,
89        VectorVectorStereoSample,
90        VectorVectorComplex,
91        VectorMatrixFloat,
92        MapVectorFloat,
93        MapVectorString,
94        MapVectorInt,
95        MapVectorComplex,
96        MapFloat,
97        MatrixFloat,
98        Pool,
99    }
100
101    // ===== Introspection Structs =====
102    pub struct ParameterInfo {
103        name: String,
104        data_type: DataType,
105        constraint: String,
106        description: String,
107        default_value: String,
108    }
109
110    pub struct InputOutputInfo {
111        name: String,
112        data_type: DataType,
113        description: String,
114    }
115
116    // ===== C++ Bridge =====
117    unsafe extern "C++" {
118        include!("bridge/bridge.h");
119
120        // ===== Core types =====
121        pub type AlgorithmBridge;
122        pub type ParameterMapBridge;
123        pub type PoolBridge;
124        pub type DataContainer;
125
126        // ===== Essentia Initialization =====
127        pub fn init_essentia();
128        pub fn shutdown_essentia();
129
130        // ===== Algorithm Bridge Creation =====
131        pub fn get_algorithm_names() -> Vec<String>;
132        pub fn create_algorithm_bridge(name: &str) -> Result<UniquePtr<AlgorithmBridge>>;
133
134        // ===== Algorithm Bridge Introspection =====
135        pub fn get_name(self: &AlgorithmBridge) -> String;
136        pub fn get_category(self: &AlgorithmBridge) -> String;
137        pub fn get_description(self: &AlgorithmBridge) -> String;
138        pub fn get_parameter_infos(self: &AlgorithmBridge) -> Vec<ParameterInfo>;
139        pub fn get_input_infos(self: &AlgorithmBridge) -> Vec<InputOutputInfo>;
140        pub fn get_output_infos(self: &AlgorithmBridge) -> Vec<InputOutputInfo>;
141
142        // ===== Algorithm Bridge Configuration & Execution =====
143        pub fn configure(
144            self: Pin<&mut AlgorithmBridge>,
145            parameter_map_bridge: UniquePtr<ParameterMapBridge>,
146        ) -> Result<()>;
147        pub fn compute(self: Pin<&mut AlgorithmBridge>) -> Result<()>;
148        pub fn reset(self: Pin<&mut AlgorithmBridge>) -> Result<()>;
149
150        // ===== Algorithm Bridge Input/Output =====
151        pub fn set_input(
152            self: Pin<&mut AlgorithmBridge>,
153            input_name: &str,
154            data_container: UniquePtr<DataContainer>,
155        ) -> Result<()>;
156        pub fn setup_output(
157            self: Pin<&mut AlgorithmBridge>,
158            output_name: &str,
159            data_type: DataType,
160        ) -> Result<()>;
161        pub fn get_output(self: &AlgorithmBridge, output_name: &str) -> Result<&DataContainer>;
162
163        // ===== Data Container Constructors =====
164        pub fn create_data_container_from_bool(value: bool) -> UniquePtr<DataContainer>;
165        pub fn create_data_container_from_string(value: &str) -> UniquePtr<DataContainer>;
166        pub fn create_data_container_from_float(value: f32) -> UniquePtr<DataContainer>;
167        pub fn create_data_container_from_int(value: i32) -> UniquePtr<DataContainer>;
168        pub fn create_data_container_from_unsigned_int(value: u32) -> UniquePtr<DataContainer>;
169        pub fn create_data_container_from_long(value: i64) -> UniquePtr<DataContainer>;
170        pub fn create_data_container_from_stereo_sample(
171            value: StereoSample,
172        ) -> UniquePtr<DataContainer>;
173        pub fn create_data_container_from_complex(value: Complex) -> UniquePtr<DataContainer>;
174        pub fn create_data_container_from_vector_bool(value: &[bool]) -> UniquePtr<DataContainer>;
175        pub fn create_data_container_from_vector_int(value: &[i32]) -> UniquePtr<DataContainer>;
176        pub fn create_data_container_from_vector_string(value: &[&str])
177        -> UniquePtr<DataContainer>;
178        pub fn create_data_container_from_vector_float(value: &[f32]) -> UniquePtr<DataContainer>;
179        pub fn create_data_container_from_vector_stereo_sample(
180            value: &[StereoSample],
181        ) -> UniquePtr<DataContainer>;
182        pub fn create_data_container_from_vector_complex(
183            value: &[Complex],
184        ) -> UniquePtr<DataContainer>;
185        pub fn create_data_container_from_vector_vector_float(
186            value: Vec<SliceFloat>,
187        ) -> UniquePtr<DataContainer>;
188        pub fn create_data_container_from_matrix_float(
189            value: MatrixFloat,
190        ) -> UniquePtr<DataContainer>;
191        pub fn create_data_container_from_tensor_float(
192            value: TensorFloat,
193        ) -> UniquePtr<DataContainer>;
194        pub fn create_data_container_from_vector_vector_string(
195            value: Vec<VecString>,
196        ) -> UniquePtr<DataContainer>;
197        pub fn create_data_container_from_vector_vector_stereo_sample(
198            value: Vec<SliceStereoSample>,
199        ) -> UniquePtr<DataContainer>;
200        pub fn create_data_container_from_vector_vector_complex(
201            value: Vec<VecComplex>,
202        ) -> UniquePtr<DataContainer>;
203        pub fn create_data_container_from_vector_matrix_float(
204            value: Vec<MatrixFloat>,
205        ) -> UniquePtr<DataContainer>;
206        pub fn create_data_container_from_map_vector_float(
207            value: Vec<MapEntryVectorFloat>,
208        ) -> UniquePtr<DataContainer>;
209        pub fn create_data_container_from_map_vector_string(
210            value: Vec<MapEntryVectorString>,
211        ) -> UniquePtr<DataContainer>;
212        pub fn create_data_container_from_map_vector_int(
213            value: Vec<MapEntryVectorInt>,
214        ) -> UniquePtr<DataContainer>;
215        pub fn create_data_container_from_map_vector_complex(
216            value: Vec<MapEntryVectorComplex>,
217        ) -> UniquePtr<DataContainer>;
218        pub fn create_data_container_from_map_float(
219            value: Vec<MapEntryFloat>,
220        ) -> UniquePtr<DataContainer>;
221        pub fn create_data_container_from_pool(
222            value: UniquePtr<PoolBridge>,
223        ) -> UniquePtr<DataContainer>;
224
225        // ===== Data Container Introspection =====
226        pub fn get_data_type(self: &DataContainer) -> DataType;
227
228        // ===== Data Container Accessors =====
229        pub fn get_bool(self: &DataContainer) -> Result<bool>;
230        pub fn get_string(self: &DataContainer) -> Result<String>;
231        pub fn get_float(self: &DataContainer) -> Result<f32>;
232        pub fn get_int(self: &DataContainer) -> Result<i32>;
233        pub fn get_unsigned_int(self: &DataContainer) -> Result<u32>;
234        pub fn get_long(self: &DataContainer) -> Result<i64>;
235        pub fn get_stereo_sample(self: &DataContainer) -> Result<StereoSample>;
236        pub fn get_complex(self: &DataContainer) -> Result<Complex>;
237        pub fn get_vector_bool(self: &DataContainer) -> Result<Vec<bool>>;
238        pub fn get_vector_int(self: &DataContainer) -> Result<&[i32]>;
239        pub fn get_vector_string(self: &DataContainer) -> Result<Vec<String>>;
240        pub fn get_vector_float(self: &DataContainer) -> Result<&[f32]>;
241        pub fn get_vector_stereo_sample(self: &DataContainer) -> Result<&[StereoSample]>;
242        pub fn get_vector_complex(self: &DataContainer) -> Result<&[Complex]>;
243        pub fn get_vector_vector_float(self: &DataContainer) -> Result<Vec<SliceFloat>>;
244        pub fn get_matrix_float(self: &DataContainer) -> Result<MatrixFloat>;
245        pub fn get_tensor_float(self: &DataContainer) -> Result<TensorFloat>;
246        pub fn get_vector_vector_string(self: &DataContainer) -> Result<Vec<VecString>>;
247        pub fn get_vector_vector_stereo_sample(
248            self: &DataContainer,
249        ) -> Result<Vec<SliceStereoSample>>;
250        pub fn get_vector_vector_complex(self: &DataContainer) -> Result<Vec<VecComplex>>;
251        pub fn get_vector_matrix_float(self: &DataContainer) -> Result<Vec<MatrixFloat>>;
252        pub fn get_map_vector_float(self: &DataContainer) -> Result<Vec<MapEntryVectorFloat>>;
253        pub fn get_map_vector_string(self: &DataContainer) -> Result<Vec<MapEntryVectorString>>;
254        pub fn get_map_vector_int(self: &DataContainer) -> Result<Vec<MapEntryVectorInt>>;
255        pub fn get_map_vector_complex(self: &DataContainer) -> Result<Vec<MapEntryVectorComplex>>;
256        pub fn get_map_float(self: &DataContainer) -> Result<Vec<MapEntryFloat>>;
257        pub fn get_pool(self: &DataContainer) -> &PoolBridge;
258
259        // ===== Parameter Map Bridge =====
260        pub fn create_parameter_map_bridge() -> UniquePtr<ParameterMapBridge>;
261        pub fn add(
262            self: Pin<&mut ParameterMapBridge>,
263            key: &str,
264            data_container: UniquePtr<DataContainer>,
265        ) -> Result<()>;
266
267        // ===== Pool Bridge =====
268        pub fn create_pool_bridge() -> UniquePtr<PoolBridge>;
269        pub fn clone(self: &PoolBridge) -> UniquePtr<PoolBridge>;
270        pub fn set(self: Pin<&mut PoolBridge>, key: &str, data_container: UniquePtr<DataContainer>);
271        pub fn get(self: &PoolBridge, key: &str) -> Result<UniquePtr<DataContainer>>;
272        pub fn contains(self: &PoolBridge, key: &str) -> bool;
273        pub fn keys(self: &PoolBridge) -> Vec<String>;
274    }
275}