Skip to main content

ggwave_rs/
ffi.rs

1#![allow(non_camel_case_types)]
2#![allow(non_snake_case)]
3#![allow(non_upper_case_globals)]
4
5use libc::{c_float, c_int, c_void};
6
7pub const GGWAVE_MAX_INSTANCES: c_int = 4;
8
9#[repr(C)]
10#[derive(Debug, Copy, Clone, PartialEq, Eq)]
11pub enum ggwave_SampleFormat {
12    GGWAVE_SAMPLE_FORMAT_UNDEFINED = 0,
13    GGWAVE_SAMPLE_FORMAT_U8 = 1,
14    GGWAVE_SAMPLE_FORMAT_I8 = 2,
15    GGWAVE_SAMPLE_FORMAT_U16 = 3,
16    GGWAVE_SAMPLE_FORMAT_I16 = 4,
17    GGWAVE_SAMPLE_FORMAT_F32 = 5,
18}
19
20#[repr(C)]
21#[derive(Debug, Copy, Clone, PartialEq, Eq)]
22pub enum ggwave_ProtocolId {
23    GGWAVE_PROTOCOL_AUDIBLE_NORMAL = 0,
24    GGWAVE_PROTOCOL_AUDIBLE_FAST = 1,
25    GGWAVE_PROTOCOL_AUDIBLE_FASTEST = 2,
26    GGWAVE_PROTOCOL_ULTRASOUND_NORMAL = 3,
27    GGWAVE_PROTOCOL_ULTRASOUND_FAST = 4,
28    GGWAVE_PROTOCOL_ULTRASOUND_FASTEST = 5,
29    GGWAVE_PROTOCOL_DT_NORMAL = 6,
30    GGWAVE_PROTOCOL_DT_FAST = 7,
31    GGWAVE_PROTOCOL_DT_FASTEST = 8,
32    GGWAVE_PROTOCOL_MT_NORMAL = 9,
33    GGWAVE_PROTOCOL_MT_FAST = 10,
34    GGWAVE_PROTOCOL_MT_FASTEST = 11,
35    GGWAVE_PROTOCOL_CUSTOM_0 = 12,
36    GGWAVE_PROTOCOL_CUSTOM_1 = 13,
37    GGWAVE_PROTOCOL_CUSTOM_2 = 14,
38    GGWAVE_PROTOCOL_CUSTOM_3 = 15,
39    GGWAVE_PROTOCOL_CUSTOM_4 = 16,
40    GGWAVE_PROTOCOL_CUSTOM_5 = 17,
41    GGWAVE_PROTOCOL_CUSTOM_6 = 18,
42    GGWAVE_PROTOCOL_CUSTOM_7 = 19,
43    GGWAVE_PROTOCOL_CUSTOM_8 = 20,
44    GGWAVE_PROTOCOL_CUSTOM_9 = 21,
45    GGWAVE_PROTOCOL_COUNT = 22,
46}
47
48#[repr(C)]
49#[derive(Debug, Copy, Clone, PartialEq, Eq)]
50pub enum ggwave_Filter {
51    GGWAVE_FILTER_HANN = 0,
52    GGWAVE_FILTER_HAMMING = 1,
53    GGWAVE_FILTER_FIRST_ORDER_HIGH_PASS = 2,
54}
55
56pub const GGWAVE_OPERATING_MODE_RX: c_int = 1 << 1;
57pub const GGWAVE_OPERATING_MODE_TX: c_int = 1 << 2;
58pub const GGWAVE_OPERATING_MODE_RX_AND_TX: c_int =
59    GGWAVE_OPERATING_MODE_RX | GGWAVE_OPERATING_MODE_TX;
60pub const GGWAVE_OPERATING_MODE_TX_ONLY_TONES: c_int = 1 << 3;
61pub const GGWAVE_OPERATING_MODE_USE_DSS: c_int = 1 << 4;
62
63#[repr(C)]
64#[derive(Debug, Copy, Clone)]
65pub struct ggwave_Parameters {
66    pub payloadLength: c_int,
67    pub sampleRateInp: c_float,
68    pub sampleRateOut: c_float,
69    pub sampleRate: c_float,
70    pub samplesPerFrame: c_int,
71    pub soundMarkerThreshold: c_float,
72    pub sampleFormatInp: ggwave_SampleFormat,
73    pub sampleFormatOut: ggwave_SampleFormat,
74    pub operatingMode: c_int,
75}
76
77pub type ggwave_Instance = c_int;
78
79extern "C" {
80    pub fn ggwave_setLogFile(fptr: *mut c_void);
81    pub fn ggwave_getDefaultParameters() -> ggwave_Parameters;
82    pub fn ggwave_init(parameters: ggwave_Parameters) -> ggwave_Instance;
83    pub fn ggwave_free(instance: ggwave_Instance);
84    pub fn ggwave_encode(
85        instance: ggwave_Instance,
86        payloadBuffer: *const c_void,
87        payloadSize: c_int,
88        protocolId: ggwave_ProtocolId,
89        volume: c_int,
90        waveformBuffer: *mut c_void,
91        query: c_int,
92    ) -> c_int;
93    pub fn ggwave_decode(
94        instance: ggwave_Instance,
95        waveformBuffer: *const c_void,
96        waveformSize: c_int,
97        payloadBuffer: *mut c_void,
98    ) -> c_int;
99    pub fn ggwave_ndecode(
100        instance: ggwave_Instance,
101        waveformBuffer: *const c_void,
102        waveformSize: c_int,
103        payloadBuffer: *mut c_void,
104        payloadSize: c_int,
105    ) -> c_int;
106    pub fn ggwave_rxToggleProtocol(protocolId: ggwave_ProtocolId, state: c_int);
107    pub fn ggwave_txToggleProtocol(protocolId: ggwave_ProtocolId, state: c_int);
108    pub fn ggwave_rxProtocolSetFreqStart(protocolId: ggwave_ProtocolId, freqStart: c_int);
109    pub fn ggwave_txProtocolSetFreqStart(protocolId: ggwave_ProtocolId, freqStart: c_int);
110    pub fn ggwave_rxDurationFrames(instance: ggwave_Instance) -> c_int;
111}
112