1 use bitflags::bitflags;
2 use std::mem::transmute;
3 
4 #[derive(Debug, PartialEq)]
5 /// An audio channel identifier
6 pub enum AudioChannel {}
7 
8 #[derive(Debug, PartialEq)]
9 /// A control channel identifier
10 pub enum ControlChannel {}
11 
12 #[derive(Debug, PartialEq)]
13 /// A string channel identifier
14 pub enum StrChannel {}
15 
16 /// Define the type of csound messages
17 #[derive(Debug, PartialEq)]
18 pub enum MessageType {
19     /// standard message.
20     CSOUNDMSG_DEFAULT,
21 
22     /// error message (initerror, perferror, etc.).
23     CSOUNDMSG_ERROR,
24 
25     /// orchestra opcodes (e.g. printks).
26     CSOUNDMSG_ORCH,
27 
28     /// for progress display and heartbeat characters.
29     CSOUNDMSG_REALTIME,
30 
31     /// warning messages.
32     CSOUNDMSG_WARNING,
33 
34     /// stdout messages.
35     CSOUNDMSG_STDOUT,
36 }
37 
38 impl From<u32> for MessageType {
from(value: u32) -> Self39     fn from(value: u32) -> Self {
40         match value {
41             0x0000 => MessageType::CSOUNDMSG_DEFAULT,
42             0x1000 => MessageType::CSOUNDMSG_ERROR,
43             0x2000 => MessageType::CSOUNDMSG_ORCH,
44             0x3000 => MessageType::CSOUNDMSG_REALTIME,
45             0x4000 => MessageType::CSOUNDMSG_WARNING,
46             0x5000 => MessageType::CSOUNDMSG_STDOUT,
47             _ => MessageType::CSOUNDMSG_ERROR,
48         }
49     }
50 }
51 
52 /// Csound error codes
53 #[derive(Debug, PartialEq, PartialOrd)]
54 pub enum Status {
55     /// Termination requested by SIGINT or SIGTERM.
56     CS_SIGNAL,
57 
58     /// Failed to allocate requested memory.
59     CS_MEMORY,
60 
61     /// Failed during performance.
62     CS_PERFORMANCE,
63 
64     /// Failed during initialization.
65     CS_INITIALIZATION,
66 
67     /// Unspecified failure.
68     CS_ERROR,
69 
70     /// Completed successfully.
71     CS_SUCCESS,
72 
73     /// Completed but with additional info.
74     CS_OK(i32),
75 }
76 
77 impl From<i32> for Status {
from(value: i32) -> Self78     fn from(value: i32) -> Self {
79         match value {
80             -5 => Status::CS_SIGNAL,
81             -4 => Status::CS_MEMORY,
82             -3 => Status::CS_PERFORMANCE,
83             -2 => Status::CS_INITIALIZATION,
84             -1 => Status::CS_ERROR,
85             0 => Status::CS_SUCCESS,
86             value => Status::CS_OK(value),
87         }
88     }
89 }
90 
91 impl Status {
to_i32(&self) -> i3292     pub fn to_i32(&self) -> i32 {
93         match self {
94             Status::CS_SIGNAL => -5,
95             Status::CS_MEMORY => -4,
96             Status::CS_PERFORMANCE => -3,
97             Status::CS_INITIALIZATION => -2,
98             Status::CS_ERROR => -1,
99             Status::CS_SUCCESS => 0,
100             Status::CS_OK(value) => *value,
101         }
102     }
103 }
104 
105 /// Enum variant which represent channel's types in callbacks.
106 ///
107 /// Channels which could trigger a callback, that is, channels created using  the [*invalue*](http://www.csounds.com/manual/html/invalue.html),
108 /// [*outvalue*](http://www.csounds.com/manual/html/outvalue.html) opcodes. Only control and string channels are supported.
109 #[derive(Debug, Clone, PartialEq)]
110 pub enum ChannelData {
111     CS_CONTROL_CHANNEL(f64),
112     CS_STRING_CHANNEL(String),
113     CS_UNKNOWN_CHANNEL,
114 }
115 
116 bitflags! {
117     /// Defines the types of csound bus cahnnels
118     ///
119     /// and if the channel is an input or an output
120     pub struct ControlChannelType: u32 {
121         /// Unknown channel - use it to request the channel type
122         const CSOUND_UNKNOWN_CHANNEL =     0;
123 
124         /// Define a csound control channel
125         const CSOUND_CONTROL_CHANNEL =     1;
126         /// Define a audio channel (chanel content is and array with ksmps elements)
127         const CSOUND_AUDIO_CHANNEL  =      2;
128         /// String channel
129         const CSOUND_STRING_CHANNEL =      3;
130         /// Pvs channel
131         const CSOUND_PVS_CHANNEL =         4;
132         /// Generic channel
133         const CSOUND_VAR_CHANNEL =         5;
134 
135         const CSOUND_CHANNEL_TYPE_MASK =   15;
136 
137         const CSOUND_INPUT_CHANNEL =       16;
138 
139         const CSOUND_OUTPUT_CHANNEL =      32;
140     }
141 }
142 
143 bitflags! {
144     /// Defines the types of csound bus cahnnels
145     ///
146     /// and if the channel is an input or an output
147     pub struct KeyCallbackType: u8 {
148         /// Unknown channel - use it to request the channel type
149         const CSOUND_CALLBACK_KBD_EVENT = 1;
150         const CSOUND_CALLBACK_KBD_TEXT =  2;
151     }
152 }
153 
154 /// The languages supported by csound
155 #[derive(Debug, Clone, PartialEq)]
156 pub enum Language {
157     CSLANGUAGE_DEFAULT = 0,
158     CSLANGUAGE_AFRIKAANS,
159     CSLANGUAGE_ALBANIAN,
160     CSLANGUAGE_ARABIC,
161     CSLANGUAGE_ARMENIAN,
162     CSLANGUAGE_ASSAMESE,
163     CSLANGUAGE_AZERI,
164     CSLANGUAGE_BASQUE,
165     CSLANGUAGE_BELARUSIAN,
166     CSLANGUAGE_BENGALI,
167     CSLANGUAGE_BULGARIAN,
168     CSLANGUAGE_CATALAN,
169     CSLANGUAGE_CHINESE,
170     CSLANGUAGE_CROATIAN,
171     CSLANGUAGE_CZECH,
172     CSLANGUAGE_DANISH,
173     CSLANGUAGE_DUTCH,
174     CSLANGUAGE_ENGLISH_UK,
175     CSLANGUAGE_ENGLISH_US,
176     CSLANGUAGE_ESTONIAN,
177     CSLANGUAGE_FAEROESE,
178     CSLANGUAGE_FARSI,
179     CSLANGUAGE_FINNISH,
180     CSLANGUAGE_FRENCH,
181     CSLANGUAGE_GEORGIAN,
182     CSLANGUAGE_GERMAN,
183     CSLANGUAGE_GREEK,
184     CSLANGUAGE_GUJARATI,
185     CSLANGUAGE_HEBREW,
186     CSLANGUAGE_HINDI,
187     CSLANGUAGE_HUNGARIAN,
188     CSLANGUAGE_ICELANDIC,
189     CSLANGUAGE_INDONESIAN,
190     CSLANGUAGE_ITALIAN,
191     CSLANGUAGE_JAPANESE,
192     CSLANGUAGE_KANNADA,
193     CSLANGUAGE_KASHMIRI,
194     CSLANGUAGE_KONKANI,
195     CSLANGUAGE_KOREAN,
196     CSLANGUAGE_LATVIAN,
197     CSLANGUAGE_LITHUANIAN,
198     CSLANGUAGE_MACEDONIAN,
199     CSLANGUAGE_MALAY,
200     CSLANGUAGE_MALAYALAM,
201     CSLANGUAGE_MANIPURI,
202     CSLANGUAGE_MARATHI,
203     CSLANGUAGE_NEPALI,
204     CSLANGUAGE_NORWEGIAN,
205     CSLANGUAGE_ORIYA,
206     CSLANGUAGE_POLISH,
207     CSLANGUAGE_PORTUGUESE,
208     CSLANGUAGE_PUNJABI,
209     CSLANGUAGE_ROMANIAN,
210     CSLANGUAGE_RUSSIAN,
211     CSLANGUAGE_SANSKRIT,
212     CSLANGUAGE_SERBIAN,
213     CSLANGUAGE_SINDHI,
214     CSLANGUAGE_SLOVAK,
215     CSLANGUAGE_SLOVENIAN,
216     CSLANGUAGE_SPANISH,
217     CSLANGUAGE_SWAHILI,
218     CSLANGUAGE_SWEDISH,
219     CSLANGUAGE_TAMIL,
220     CSLANGUAGE_TATAR,
221     CSLANGUAGE_TELUGU,
222     CSLANGUAGE_THAI,
223     CSLANGUAGE_TURKISH,
224     CSLANGUAGE_UKRAINIAN,
225     CSLANGUAGE_URDU,
226     CSLANGUAGE_UZBEK,
227     CSLANGUAGE_VIETNAMESE,
228     CSLANGUAGE_COLUMBIAN,
229 }
230 
231 /// Describes the differents file types which are supported are by csound
232 #[derive(Debug, Copy, Clone, Eq, PartialEq)]
233 pub enum FileTypes {
234     /* This should only be used internally by the original FileOpen()
235     API call or for temp files written with <CsFileB> */
236     CSFTYPE_UNKNOWN = 0,
237     CSFTYPE_UNIFIED_CSD = 1, /* Unified Csound document */
238     CSFTYPE_ORCHESTRA,       /* the primary orc file (may be temporary) */
239     CSFTYPE_SCORE,           /* the primary sco file (may be temporary)
240                              or any additional score opened by Cscore */
241     CSFTYPE_ORC_INCLUDE,   /* a file #included by the orchestra */
242     CSFTYPE_SCO_INCLUDE,   /* a file #included by the score */
243     CSFTYPE_SCORE_OUT,     /* used for score.srt, score.xtr, cscore.out */
244     CSFTYPE_SCOT,          /* Scot score input format */
245     CSFTYPE_OPTIONS,       /* for .csoundrc and -@ flag */
246     CSFTYPE_EXTRACT_PARMS, /* extraction file specified by -x */
247 
248     /* audio file types that Csound can write (10-19) or read */
249     CSFTYPE_RAW_AUDIO,
250     CSFTYPE_IRCAM,
251     CSFTYPE_AIFF,
252     CSFTYPE_AIFC,
253     CSFTYPE_WAVE,
254     CSFTYPE_AU,
255     CSFTYPE_SD2,
256     CSFTYPE_W64,
257     CSFTYPE_WAVEX,
258     CSFTYPE_FLAC,
259     CSFTYPE_CAF,
260     CSFTYPE_WVE,
261     CSFTYPE_OGG,
262     CSFTYPE_MPC2K,
263     CSFTYPE_RF64,
264     CSFTYPE_AVR,
265     CSFTYPE_HTK,
266     CSFTYPE_MAT4,
267     CSFTYPE_MAT5,
268     CSFTYPE_NIST,
269     CSFTYPE_PAF,
270     CSFTYPE_PVF,
271     CSFTYPE_SDS,
272     CSFTYPE_SVX,
273     CSFTYPE_VOC,
274     CSFTYPE_XI,
275     CSFTYPE_UNKNOWN_AUDIO, /* used when opening audio file for reading
276                            or temp file written with <CsSampleB> */
277 
278     /* miscellaneous music formats */
279     CSFTYPE_SOUNDFONT,
280     CSFTYPE_STD_MIDI,   /* Standard MIDI file */
281     CSFTYPE_MIDI_SYSEX, /* Raw MIDI codes, eg. SysEx dump */
282 
283     /* analysis formats */
284     CSFTYPE_HETRO,
285     CSFTYPE_HETROT,
286     CSFTYPE_PVC,   /* original PVOC format */
287     CSFTYPE_PVCEX, /* PVOC-EX format */
288     CSFTYPE_CVANAL,
289     CSFTYPE_LPC,
290     CSFTYPE_ATS,
291     CSFTYPE_LORIS,
292     CSFTYPE_SDIF,
293     CSFTYPE_HRTF,
294 
295     /* Types for plugins and the files they read/write */
296     CSFTYPE_UNUSED,
297     CSFTYPE_LADSPA_PLUGIN,
298     CSFTYPE_SNAPSHOT,
299 
300     /* Special formats for Csound ftables or scanned synthesis
301     matrices with header info */
302     CSFTYPE_FTABLES_TEXT,   /* for ftsave and ftload  */
303     CSFTYPE_FTABLES_BINARY, /* for ftsave and ftload  */
304     CSFTYPE_XSCANU_MATRIX,  /* for xscanu opcode  */
305 
306     /* These are for raw lists of numbers without header info */
307     CSFTYPE_FLOATS_TEXT,    /* used by GEN23, GEN28, dumpk, readk */
308     CSFTYPE_FLOATS_BINARY,  /* used by dumpk, readk, etc. */
309     CSFTYPE_INTEGER_TEXT,   /* used by dumpk, readk, etc. */
310     CSFTYPE_INTEGER_BINARY, /* used by dumpk, readk, etc. */
311 
312     /* image file formats */
313     CSFTYPE_IMAGE_PNG,
314 
315     /* For files that don't match any of the above */
316     CSFTYPE_POSTSCRIPT,  /* EPS format used by graphs */
317     CSFTYPE_SCRIPT_TEXT, /* executable script files (eg. Python) */
318     CSFTYPE_OTHER_TEXT,
319     CSFTYPE_OTHER_BINARY,
320 }
321 
322 impl From<u8> for FileTypes {
from(item: u8) -> Self323     fn from(item: u8) -> Self {
324         if item > 63 {
325             FileTypes::CSFTYPE_UNKNOWN
326         } else {
327             unsafe { transmute(item) }
328         }
329     }
330 }
331