fmod/
types.rs

1use num_derive::FromPrimitive;
2use crate::ll;
3
4#[derive(Debug, Default, PartialEq)]
5pub struct CpuUsage {
6  pub dsp      : f32,
7  pub stream   : f32,
8  pub geometry : f32,
9  pub update   : f32,
10  pub total    : f32
11}
12
13#[derive(Clone, Debug, Default, Eq, PartialEq)]
14pub struct Delay {
15  pub dspclock_start : u64,
16  pub dspclock_end   : u64,
17  pub stopchannels   : bool
18}
19
20#[repr(C)]
21#[derive(Debug, Eq, PartialEq)]
22pub struct Guid {
23  pub data1 : u32,
24  pub data2 : u16,
25  pub data3 : u16,
26  pub data4 : [u8; 8]
27}
28
29#[derive(Debug, PartialEq)]
30pub struct ListenerAttributes {
31  pub pos     : [f32; 3],
32  pub vel     : [f32; 3],
33  pub forward : [f32; 3],
34  pub up      : [f32; 3]
35}
36
37#[derive(Clone, Debug, Eq, PartialEq)]
38pub struct PluginHandle (pub u32);
39
40#[derive(Debug, Default, Eq, PartialEq)]
41pub struct SoundRam {
42  pub currentalloced : i32,
43  pub maxalloced     : i32,
44  pub total          : i32
45}
46
47bitflags!{
48  #[derive(Clone, Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd)]
49  pub struct Channelmask : u32 {
50    const FRONT_LEFT     = ll::FMOD_CHANNELMASK_FRONT_LEFT;
51    const FRONT_RIGHT    = ll::FMOD_CHANNELMASK_FRONT_RIGHT;
52    const FRONT_CENTER   = ll::FMOD_CHANNELMASK_FRONT_CENTER;
53    const LOW_FREQUENCY  = ll::FMOD_CHANNELMASK_LOW_FREQUENCY;
54    const SURROUND_LEFT  = ll::FMOD_CHANNELMASK_SURROUND_LEFT;
55    const SURROUND_RIGHT = ll::FMOD_CHANNELMASK_SURROUND_RIGHT;
56    const BACK_LEFT      = ll::FMOD_CHANNELMASK_BACK_LEFT;
57    const BACK_RIGHT     = ll::FMOD_CHANNELMASK_BACK_RIGHT;
58    const BACK_CENTER    = ll::FMOD_CHANNELMASK_BACK_CENTER;
59    const MONO           = ll::FMOD_CHANNELMASK_MONO;
60    const STEREO         = ll::FMOD_CHANNELMASK_STEREO;
61    const LRC            = ll::FMOD_CHANNELMASK_LRC;
62    const QUAD           = ll::FMOD_CHANNELMASK_QUAD;
63    const SURROUND       = ll::FMOD_CHANNELMASK_SURROUND;
64    const _5POINT1       = ll::FMOD_CHANNELMASK_5POINT1;
65    const _5POINT1_REARS = ll::FMOD_CHANNELMASK_5POINT1_REARS;
66    const _7POINT0       = ll::FMOD_CHANNELMASK_7POINT0;
67    const _7POINT1       = ll::FMOD_CHANNELMASK_7POINT1;
68  }
69}
70
71bitflags!{
72  #[derive(Clone, Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd)]
73  pub struct DebugFlags : u32 {
74    const LEVEL_NONE          = ll::FMOD_DEBUG_LEVEL_NONE;
75    const LEVEL_ERROR         = ll::FMOD_DEBUG_LEVEL_ERROR;
76    const LEVEL_WARNING       = ll::FMOD_DEBUG_LEVEL_WARNING;
77    const LEVEL_LOG           = ll::FMOD_DEBUG_LEVEL_LOG;
78    const TYPE_MEMORY         = ll::FMOD_DEBUG_TYPE_MEMORY;
79    const TYPE_FILE           = ll::FMOD_DEBUG_TYPE_FILE;
80    const TYPE_CODEC          = ll::FMOD_DEBUG_TYPE_CODEC;
81    const TYPE_TRACE          = ll::FMOD_DEBUG_TYPE_TRACE;
82    const DISPLAY_TIMESTAMPS  = ll::FMOD_DEBUG_DISPLAY_TIMESTAMPS;
83    const DISPLAY_LINENUMBERS = ll::FMOD_DEBUG_DISPLAY_LINENUMBERS;
84    const DISPLAY_THREAD      = ll::FMOD_DEBUG_DISPLAY_THREAD;
85  }
86}
87
88bitflags!{
89  #[derive(Clone, Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd)]
90  pub struct DriverState : u32 {
91    const DRIVER_STATE_CONNECTED = ll::FMOD_DRIVER_STATE_CONNECTED;
92    const DRIVER_STATE_DEFAULT   = ll::FMOD_DRIVER_STATE_DEFAULT;
93  }
94}
95
96bitflags!{
97  #[derive(Clone, Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd)]
98  pub struct MemoryType : u32 {
99    const NORMAL           = ll::FMOD_MEMORY_NORMAL;
100    const STREAM_FILE      = ll::FMOD_MEMORY_STREAM_FILE;
101    const STREAM_DECODE    = ll::FMOD_MEMORY_STREAM_DECODE;
102    const SAMPLEDATA       = ll::FMOD_MEMORY_SAMPLEDATA;
103    const DSP_BUFFER       = ll::FMOD_MEMORY_DSP_BUFFER;
104    const PLUGIN           = ll::FMOD_MEMORY_PLUGIN;
105    const XBOX360_PHYSICAL = ll::FMOD_MEMORY_XBOX360_PHYSICAL;
106    const PERSISTENT       = ll::FMOD_MEMORY_PERSISTENT;
107    const SECONDARY        = ll::FMOD_MEMORY_SECONDARY;
108    const ALL              = ll::FMOD_MEMORY_ALL;
109  }
110}
111
112bitflags!{
113  #[derive(Clone, Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd)]
114  pub struct Mode : u32 {
115    const DEFAULT                   = ll::FMOD_DEFAULT;
116    const LOOP_OFF                  = ll::FMOD_LOOP_OFF;
117    const LOOP_NORMAL               = ll::FMOD_LOOP_NORMAL;
118    const LOOP_BIDI                 = ll::FMOD_LOOP_BIDI;
119    const _2D                       = ll::FMOD_2D;
120    const _3D                       = ll::FMOD_3D;
121    const CREATESTREAM              = ll::FMOD_CREATESTREAM;
122    const CREATESAMPLE              = ll::FMOD_CREATESAMPLE;
123    const CREATECOMPRESSEDSAMPLE    = ll::FMOD_CREATECOMPRESSEDSAMPLE;
124    const OPENUSER                  = ll::FMOD_OPENUSER;
125    const OPENMEMORY                = ll::FMOD_OPENMEMORY;
126    const OPENMEMORY_POINT          = ll::FMOD_OPENMEMORY_POINT;
127    const OPENRAW                   = ll::FMOD_OPENRAW;
128    const OPENONLY                  = ll::FMOD_OPENONLY;
129    const ACCURATETIME              = ll::FMOD_ACCURATETIME;
130    const MPEGSEARCH                = ll::FMOD_MPEGSEARCH;
131    const NONBLOCKING               = ll::FMOD_NONBLOCKING;
132    const UNIQUE                    = ll::FMOD_UNIQUE;
133    const _3D_HEADRELATIVE          = ll::FMOD_3D_HEADRELATIVE;
134    const _3D_WORLDRELATIVE         = ll::FMOD_3D_WORLDRELATIVE;
135    const _3D_INVERSEROLLOFF        = ll::FMOD_3D_INVERSEROLLOFF;
136    const _3D_LINEARROLLOFF         = ll::FMOD_3D_LINEARROLLOFF;
137    const _3D_LINEARSQUAREROLLOFF   = ll::FMOD_3D_LINEARSQUAREROLLOFF;
138    const _3D_INVERSETAPEREDROLLOFF = ll::FMOD_3D_INVERSETAPEREDROLLOFF;
139    const _3D_CUSTOMROLLOFF         = ll::FMOD_3D_CUSTOMROLLOFF;
140    const _3D_IGNOREGEOMETRY        = ll::FMOD_3D_IGNOREGEOMETRY;
141    const IGNORETAGS                = ll::FMOD_IGNORETAGS;
142    const LOWMEM                    = ll::FMOD_LOWMEM;
143    const LOADSECONDARYRAM          = ll::FMOD_LOADSECONDARYRAM;
144    const VIRTUAL_PLAYFROMSTART     = ll::FMOD_VIRTUAL_PLAYFROMSTART;
145  }
146}
147
148bitflags!{
149  #[derive(Clone, Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd)]
150  pub struct PortIndex : u64 {
151    const NONE = u64::MAX;
152  }
153}
154
155bitflags!{
156  #[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
157  pub struct Timeunit : u32 {
158    const MS          = ll::FMOD_TIMEUNIT_MS;
159    const PCM         = ll::FMOD_TIMEUNIT_PCM;
160    const PCMBYTES    = ll::FMOD_TIMEUNIT_PCMBYTES;
161    const RAWBYTES    = ll::FMOD_TIMEUNIT_RAWBYTES;
162    const PCMFRACTION = ll::FMOD_TIMEUNIT_PCMFRACTION;
163    const MODORDER    = ll::FMOD_TIMEUNIT_MODORDER;
164    const MODROW      = ll::FMOD_TIMEUNIT_MODROW;
165    const MODPATTERN  = ll::FMOD_TIMEUNIT_MODPATTERN;
166  }
167}
168
169#[derive(Copy, Clone, Debug, Eq, PartialEq, FromPrimitive)]
170pub enum Error {
171  Badcommand              = ll::FMOD_RESULT_FMOD_ERR_BADCOMMAND                as isize,
172  ChannelAlloc            = ll::FMOD_RESULT_FMOD_ERR_CHANNEL_ALLOC             as isize,
173  ChannelStolen           = ll::FMOD_RESULT_FMOD_ERR_CHANNEL_STOLEN            as isize,
174  Dma                     = ll::FMOD_RESULT_FMOD_ERR_DMA                       as isize,
175  DspConnection           = ll::FMOD_RESULT_FMOD_ERR_DSP_CONNECTION            as isize,
176  DspDontprocess          = ll::FMOD_RESULT_FMOD_ERR_DSP_DONTPROCESS           as isize,
177  DspFormat               = ll::FMOD_RESULT_FMOD_ERR_DSP_FORMAT                as isize,
178  DspInuse                = ll::FMOD_RESULT_FMOD_ERR_DSP_INUSE                 as isize,
179  DspNotfound             = ll::FMOD_RESULT_FMOD_ERR_DSP_NOTFOUND              as isize,
180  DspReserved             = ll::FMOD_RESULT_FMOD_ERR_DSP_RESERVED              as isize,
181  DspSilence              = ll::FMOD_RESULT_FMOD_ERR_DSP_SILENCE               as isize,
182  DspType                 = ll::FMOD_RESULT_FMOD_ERR_DSP_TYPE                  as isize,
183  FileBad                 = ll::FMOD_RESULT_FMOD_ERR_FILE_BAD                  as isize,
184  FileCouldnotseek        = ll::FMOD_RESULT_FMOD_ERR_FILE_COULDNOTSEEK         as isize,
185  FileDiskejected         = ll::FMOD_RESULT_FMOD_ERR_FILE_DISKEJECTED          as isize,
186  FileEof                 = ll::FMOD_RESULT_FMOD_ERR_FILE_EOF                  as isize,
187  FileEndofdata           = ll::FMOD_RESULT_FMOD_ERR_FILE_ENDOFDATA            as isize,
188  FileNotfound            = ll::FMOD_RESULT_FMOD_ERR_FILE_NOTFOUND             as isize,
189  Format                  = ll::FMOD_RESULT_FMOD_ERR_FORMAT                    as isize,
190  HeaderMismatch          = ll::FMOD_RESULT_FMOD_ERR_HEADER_MISMATCH           as isize,
191  Http                    = ll::FMOD_RESULT_FMOD_ERR_HTTP                      as isize,
192  HttpAccess              = ll::FMOD_RESULT_FMOD_ERR_HTTP_ACCESS               as isize,
193  HttpProxyAuth           = ll::FMOD_RESULT_FMOD_ERR_HTTP_PROXY_AUTH           as isize,
194  HttpServerError         = ll::FMOD_RESULT_FMOD_ERR_HTTP_SERVER_ERROR         as isize,
195  HttpTimeout             = ll::FMOD_RESULT_FMOD_ERR_HTTP_TIMEOUT              as isize,
196  Initialization          = ll::FMOD_RESULT_FMOD_ERR_INITIALIZATION            as isize,
197  Initialized             = ll::FMOD_RESULT_FMOD_ERR_INITIALIZED               as isize,
198  Internal                = ll::FMOD_RESULT_FMOD_ERR_INTERNAL                  as isize,
199  InvalidFloat            = ll::FMOD_RESULT_FMOD_ERR_INVALID_FLOAT             as isize,
200  InvalidHandle           = ll::FMOD_RESULT_FMOD_ERR_INVALID_HANDLE            as isize,
201  InvalidParam            = ll::FMOD_RESULT_FMOD_ERR_INVALID_PARAM             as isize,
202  InvalidPosition         = ll::FMOD_RESULT_FMOD_ERR_INVALID_POSITION          as isize,
203  InvalidSpeaker          = ll::FMOD_RESULT_FMOD_ERR_INVALID_SPEAKER           as isize,
204  InvalidSyncpoint        = ll::FMOD_RESULT_FMOD_ERR_INVALID_SYNCPOINT         as isize,
205  InvalidThread           = ll::FMOD_RESULT_FMOD_ERR_INVALID_THREAD            as isize,
206  InvalidVector           = ll::FMOD_RESULT_FMOD_ERR_INVALID_VECTOR            as isize,
207  Maxaudible              = ll::FMOD_RESULT_FMOD_ERR_MAXAUDIBLE                as isize,
208  Memory                  = ll::FMOD_RESULT_FMOD_ERR_MEMORY                    as isize,
209  MemoryCantpoint         = ll::FMOD_RESULT_FMOD_ERR_MEMORY_CANTPOINT          as isize,
210  Needs3d                 = ll::FMOD_RESULT_FMOD_ERR_NEEDS3D                   as isize,
211  Needshardware           = ll::FMOD_RESULT_FMOD_ERR_NEEDSHARDWARE             as isize,
212  NetConnect              = ll::FMOD_RESULT_FMOD_ERR_NET_CONNECT               as isize,
213  NetSocketError          = ll::FMOD_RESULT_FMOD_ERR_NET_SOCKET_ERROR          as isize,
214  NetUrl                  = ll::FMOD_RESULT_FMOD_ERR_NET_URL                   as isize,
215  NetWouldBlock           = ll::FMOD_RESULT_FMOD_ERR_NET_WOULD_BLOCK           as isize,
216  Notready                = ll::FMOD_RESULT_FMOD_ERR_NOTREADY                  as isize,
217  OutputAllocated         = ll::FMOD_RESULT_FMOD_ERR_OUTPUT_ALLOCATED          as isize,
218  OutputCreatebuffer      = ll::FMOD_RESULT_FMOD_ERR_OUTPUT_CREATEBUFFER       as isize,
219  OutputDrivercall        = ll::FMOD_RESULT_FMOD_ERR_OUTPUT_DRIVERCALL         as isize,
220  OutputFormat            = ll::FMOD_RESULT_FMOD_ERR_OUTPUT_FORMAT             as isize,
221  OutputInit              = ll::FMOD_RESULT_FMOD_ERR_OUTPUT_INIT               as isize,
222  OutputNodrivers         = ll::FMOD_RESULT_FMOD_ERR_OUTPUT_NODRIVERS          as isize,
223  Plugin                  = ll::FMOD_RESULT_FMOD_ERR_PLUGIN                    as isize,
224  PluginMissing           = ll::FMOD_RESULT_FMOD_ERR_PLUGIN_MISSING            as isize,
225  PluginResource          = ll::FMOD_RESULT_FMOD_ERR_PLUGIN_RESOURCE           as isize,
226  PluginVersion           = ll::FMOD_RESULT_FMOD_ERR_PLUGIN_VERSION            as isize,
227  Record                  = ll::FMOD_RESULT_FMOD_ERR_RECORD                    as isize,
228  ReverbChannelgroup      = ll::FMOD_RESULT_FMOD_ERR_REVERB_CHANNELGROUP       as isize,
229  ReverbInstance          = ll::FMOD_RESULT_FMOD_ERR_REVERB_INSTANCE           as isize,
230  Subsounds               = ll::FMOD_RESULT_FMOD_ERR_SUBSOUNDS                 as isize,
231  SubsoundAllocated       = ll::FMOD_RESULT_FMOD_ERR_SUBSOUND_ALLOCATED        as isize,
232  SubsoundCantmove        = ll::FMOD_RESULT_FMOD_ERR_SUBSOUND_CANTMOVE         as isize,
233  Tagnotfound             = ll::FMOD_RESULT_FMOD_ERR_TAGNOTFOUND               as isize,
234  Toomanychannels         = ll::FMOD_RESULT_FMOD_ERR_TOOMANYCHANNELS           as isize,
235  Truncated               = ll::FMOD_RESULT_FMOD_ERR_TRUNCATED                 as isize,
236  Unimplemented           = ll::FMOD_RESULT_FMOD_ERR_UNIMPLEMENTED             as isize,
237  Uninitialized           = ll::FMOD_RESULT_FMOD_ERR_UNINITIALIZED             as isize,
238  Unsupported             = ll::FMOD_RESULT_FMOD_ERR_UNSUPPORTED               as isize,
239  Version                 = ll::FMOD_RESULT_FMOD_ERR_VERSION                   as isize,
240  EventAlreadyLoaded      = ll::FMOD_RESULT_FMOD_ERR_EVENT_ALREADY_LOADED      as isize,
241  EventLiveupdateBusy     = ll::FMOD_RESULT_FMOD_ERR_EVENT_LIVEUPDATE_BUSY     as isize,
242  EventLiveupdateMismatch = ll::FMOD_RESULT_FMOD_ERR_EVENT_LIVEUPDATE_MISMATCH as isize,
243  EventLiveupdateTimeout  = ll::FMOD_RESULT_FMOD_ERR_EVENT_LIVEUPDATE_TIMEOUT  as isize,
244  EventNotfound           = ll::FMOD_RESULT_FMOD_ERR_EVENT_NOTFOUND            as isize,
245  StudioUninitialized     = ll::FMOD_RESULT_FMOD_ERR_STUDIO_UNINITIALIZED      as isize,
246  StudioNotLoaded         = ll::FMOD_RESULT_FMOD_ERR_STUDIO_NOT_LOADED         as isize,
247  InvalidString           = ll::FMOD_RESULT_FMOD_ERR_INVALID_STRING            as isize,
248  AlreadyLocked           = ll::FMOD_RESULT_FMOD_ERR_ALREADY_LOCKED            as isize,
249  NotLocked               = ll::FMOD_RESULT_FMOD_ERR_NOT_LOCKED                as isize,
250  RecordDisconnected      = ll::FMOD_RESULT_FMOD_ERR_RECORD_DISCONNECTED       as isize,
251  Toomanysamples          = ll::FMOD_RESULT_FMOD_ERR_TOOMANYSAMPLES            as isize
252}
253
254#[derive(Copy, Clone, Debug, Eq, PartialEq, FromPrimitive)]
255pub enum Plugintype {
256  Output = ll::FMOD_PLUGINTYPE_FMOD_PLUGINTYPE_OUTPUT as isize,
257  Codec  = ll::FMOD_PLUGINTYPE_FMOD_PLUGINTYPE_CODEC as isize,
258  Dsp    = ll::FMOD_PLUGINTYPE_FMOD_PLUGINTYPE_DSP as isize,
259  MAX    = ll::FMOD_PLUGINTYPE_FMOD_PLUGINTYPE_MAX as isize
260}
261
262#[derive(Copy, Clone, Debug, Eq, PartialEq, FromPrimitive)]
263pub enum Speaker {
264  FrontLeft     = ll::FMOD_SPEAKER_FMOD_SPEAKER_FRONT_LEFT      as isize,
265  FrontRight    = ll::FMOD_SPEAKER_FMOD_SPEAKER_FRONT_RIGHT     as isize,
266  FrontCenter   = ll::FMOD_SPEAKER_FMOD_SPEAKER_FRONT_CENTER    as isize,
267  LowFrequency  = ll::FMOD_SPEAKER_FMOD_SPEAKER_LOW_FREQUENCY   as isize,
268  SurroundLeft  = ll::FMOD_SPEAKER_FMOD_SPEAKER_SURROUND_LEFT   as isize,
269  SurroundRight = ll::FMOD_SPEAKER_FMOD_SPEAKER_SURROUND_RIGHT  as isize,
270  BackLeft      = ll::FMOD_SPEAKER_FMOD_SPEAKER_BACK_LEFT       as isize,
271  BackRight     = ll::FMOD_SPEAKER_FMOD_SPEAKER_BACK_RIGHT      as isize,
272  TopFrontLeft  = ll::FMOD_SPEAKER_FMOD_SPEAKER_TOP_FRONT_LEFT  as isize,
273  TopFrontRight = ll::FMOD_SPEAKER_FMOD_SPEAKER_TOP_FRONT_RIGHT as isize,
274  TopBackLeft   = ll::FMOD_SPEAKER_FMOD_SPEAKER_TOP_BACK_LEFT   as isize,
275  TopBackRight  = ll::FMOD_SPEAKER_FMOD_SPEAKER_TOP_BACK_RIGHT  as isize,
276  MAX           = ll::FMOD_SPEAKER_FMOD_SPEAKER_MAX             as isize
277}
278
279#[derive(Copy, Clone, Debug, Eq, PartialEq, FromPrimitive)]
280pub enum Speakermode {
281  Default        = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_DEFAULT       as isize,
282  Raw            = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_RAW           as isize,
283  Mono           = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_MONO          as isize,
284  Stereo         = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_STEREO        as isize,
285  Quad           = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_QUAD          as isize,
286  Surround       = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_SURROUND      as isize,
287  _5Point1       = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_5POINT1       as isize,
288  _7Point1       = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_7POINT1       as isize,
289  _7Point1Point4 = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_7POINT1POINT4 as isize,
290  MAX            = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_MAX           as isize
291}
292
293impl Error {
294  /// # Panics
295  ///
296  /// Panics if `ll` is not a valid result
297  // ll is i32 on windows and u32 on linux
298  #[allow(clippy::allow_attributes, clippy::unnecessary_cast)]
299  pub fn from_ll (ll : ll::FMOD_RESULT) -> Self {
300    use num_traits::FromPrimitive;
301    Self::from_u32 (ll as u32).unwrap()
302  }
303}
304
305impl Guid {
306  #[inline]
307  pub fn as_mut_ll (&mut self) -> &mut ll::FMOD_GUID {
308    debug_assert_eq!(
309      std::mem::size_of::<Self>(),
310      std::mem::size_of::<ll::FMOD_GUID>());
311    unsafe { &mut *(std::ptr::from_mut::<Guid> (self) as *mut fmod_sys::FMOD_GUID) }
312  }
313}
314
315impl ListenerAttributes {
316  #[inline]
317  pub fn from_ll (
318    pos     : ll::FMOD_VECTOR,
319    vel     : ll::FMOD_VECTOR,
320    forward : ll::FMOD_VECTOR,
321    up      : ll::FMOD_VECTOR
322  ) -> Self {
323    let convert = |vec : ll::FMOD_VECTOR| [vec.x, vec.y, vec.z];
324    let pos     = convert (pos);
325    let vel     = convert (vel);
326    let forward = convert (forward);
327    let up      = convert (up);
328    ListenerAttributes { pos, vel, forward, up }
329  }
330}
331
332impl Speakermode {
333  /// # Panics
334  ///
335  /// Panics if `ll` is not a valid speaker mode
336  // ll is i32 on windows and u32 on linux
337  #[allow(clippy::allow_attributes, clippy::unnecessary_cast)]
338  pub fn from_ll (ll : ll::FMOD_SPEAKERMODE) -> Self {
339    use num_traits::FromPrimitive;
340    Self::from_u32 (ll as u32).unwrap()
341  }
342}
343
344impl Default for Timeunit {
345  fn default() -> Self {
346    Timeunit::empty()
347  }
348}