fmod1 0.1.0

Rust wrapper for FMOD low-level API
Documentation
use num_derive::FromPrimitive;
use crate::ll;

#[derive(Debug, Default, PartialEq)]
pub struct CpuUsage {
  pub dsp      : f32,
  pub stream   : f32,
  pub geometry : f32,
  pub update   : f32,
  pub total    : f32
}

#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct Delay {
  pub dspclock_start : u64,
  pub dspclock_end   : u64,
  pub stopchannels   : bool
}

#[repr(C)]
#[derive(Debug, Eq, PartialEq)]
pub struct Guid {
  pub data1 : u32,
  pub data2 : u16,
  pub data3 : u16,
  pub data4 : [u8; 8]
}

#[derive(Debug, PartialEq)]
pub struct ListenerAttributes {
  pub pos     : [f32; 3],
  pub vel     : [f32; 3],
  pub forward : [f32; 3],
  pub up      : [f32; 3]
}

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct PluginHandle (pub u32);

#[derive(Debug, Default, Eq, PartialEq)]
pub struct SoundRam {
  pub currentalloced : i32,
  pub maxalloced     : i32,
  pub total          : i32
}

bitflags!{
  #[derive(Clone, Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd)]
  pub struct Channelmask : u32 {
    const FRONT_LEFT     = ll::FMOD_CHANNELMASK_FRONT_LEFT;
    const FRONT_RIGHT    = ll::FMOD_CHANNELMASK_FRONT_RIGHT;
    const FRONT_CENTER   = ll::FMOD_CHANNELMASK_FRONT_CENTER;
    const LOW_FREQUENCY  = ll::FMOD_CHANNELMASK_LOW_FREQUENCY;
    const SURROUND_LEFT  = ll::FMOD_CHANNELMASK_SURROUND_LEFT;
    const SURROUND_RIGHT = ll::FMOD_CHANNELMASK_SURROUND_RIGHT;
    const BACK_LEFT      = ll::FMOD_CHANNELMASK_BACK_LEFT;
    const BACK_RIGHT     = ll::FMOD_CHANNELMASK_BACK_RIGHT;
    const BACK_CENTER    = ll::FMOD_CHANNELMASK_BACK_CENTER;
    const MONO           = ll::FMOD_CHANNELMASK_MONO;
    const STEREO         = ll::FMOD_CHANNELMASK_STEREO;
    const LRC            = ll::FMOD_CHANNELMASK_LRC;
    const QUAD           = ll::FMOD_CHANNELMASK_QUAD;
    const SURROUND       = ll::FMOD_CHANNELMASK_SURROUND;
    const _5POINT1       = ll::FMOD_CHANNELMASK_5POINT1;
    const _5POINT1_REARS = ll::FMOD_CHANNELMASK_5POINT1_REARS;
    const _7POINT0       = ll::FMOD_CHANNELMASK_7POINT0;
    const _7POINT1       = ll::FMOD_CHANNELMASK_7POINT1;
  }
}

bitflags!{
  #[derive(Clone, Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd)]
  pub struct DebugFlags : u32 {
    const LEVEL_NONE          = ll::FMOD_DEBUG_LEVEL_NONE;
    const LEVEL_ERROR         = ll::FMOD_DEBUG_LEVEL_ERROR;
    const LEVEL_WARNING       = ll::FMOD_DEBUG_LEVEL_WARNING;
    const LEVEL_LOG           = ll::FMOD_DEBUG_LEVEL_LOG;
    const TYPE_MEMORY         = ll::FMOD_DEBUG_TYPE_MEMORY;
    const TYPE_FILE           = ll::FMOD_DEBUG_TYPE_FILE;
    const TYPE_CODEC          = ll::FMOD_DEBUG_TYPE_CODEC;
    const TYPE_TRACE          = ll::FMOD_DEBUG_TYPE_TRACE;
    const DISPLAY_TIMESTAMPS  = ll::FMOD_DEBUG_DISPLAY_TIMESTAMPS;
    const DISPLAY_LINENUMBERS = ll::FMOD_DEBUG_DISPLAY_LINENUMBERS;
    const DISPLAY_THREAD      = ll::FMOD_DEBUG_DISPLAY_THREAD;
  }
}

bitflags!{
  #[derive(Clone, Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd)]
  pub struct DriverState : u32 {
    const DRIVER_STATE_CONNECTED = ll::FMOD_DRIVER_STATE_CONNECTED;
    const DRIVER_STATE_DEFAULT   = ll::FMOD_DRIVER_STATE_DEFAULT;
  }
}

bitflags!{
  #[derive(Clone, Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd)]
  pub struct MemoryType : u32 {
    const NORMAL           = ll::FMOD_MEMORY_NORMAL;
    const STREAM_FILE      = ll::FMOD_MEMORY_STREAM_FILE;
    const STREAM_DECODE    = ll::FMOD_MEMORY_STREAM_DECODE;
    const SAMPLEDATA       = ll::FMOD_MEMORY_SAMPLEDATA;
    const DSP_BUFFER       = ll::FMOD_MEMORY_DSP_BUFFER;
    const PLUGIN           = ll::FMOD_MEMORY_PLUGIN;
    const XBOX360_PHYSICAL = ll::FMOD_MEMORY_XBOX360_PHYSICAL;
    const PERSISTENT       = ll::FMOD_MEMORY_PERSISTENT;
    const SECONDARY        = ll::FMOD_MEMORY_SECONDARY;
    const ALL              = ll::FMOD_MEMORY_ALL;
  }
}

bitflags!{
  #[derive(Clone, Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd)]
  pub struct Mode : u32 {
    const DEFAULT                   = ll::FMOD_DEFAULT;
    const LOOP_OFF                  = ll::FMOD_LOOP_OFF;
    const LOOP_NORMAL               = ll::FMOD_LOOP_NORMAL;
    const LOOP_BIDI                 = ll::FMOD_LOOP_BIDI;
    const _2D                       = ll::FMOD_2D;
    const _3D                       = ll::FMOD_3D;
    const CREATESTREAM              = ll::FMOD_CREATESTREAM;
    const CREATESAMPLE              = ll::FMOD_CREATESAMPLE;
    const CREATECOMPRESSEDSAMPLE    = ll::FMOD_CREATECOMPRESSEDSAMPLE;
    const OPENUSER                  = ll::FMOD_OPENUSER;
    const OPENMEMORY                = ll::FMOD_OPENMEMORY;
    const OPENMEMORY_POINT          = ll::FMOD_OPENMEMORY_POINT;
    const OPENRAW                   = ll::FMOD_OPENRAW;
    const OPENONLY                  = ll::FMOD_OPENONLY;
    const ACCURATETIME              = ll::FMOD_ACCURATETIME;
    const MPEGSEARCH                = ll::FMOD_MPEGSEARCH;
    const NONBLOCKING               = ll::FMOD_NONBLOCKING;
    const UNIQUE                    = ll::FMOD_UNIQUE;
    const _3D_HEADRELATIVE          = ll::FMOD_3D_HEADRELATIVE;
    const _3D_WORLDRELATIVE         = ll::FMOD_3D_WORLDRELATIVE;
    const _3D_INVERSEROLLOFF        = ll::FMOD_3D_INVERSEROLLOFF;
    const _3D_LINEARROLLOFF         = ll::FMOD_3D_LINEARROLLOFF;
    const _3D_LINEARSQUAREROLLOFF   = ll::FMOD_3D_LINEARSQUAREROLLOFF;
    const _3D_INVERSETAPEREDROLLOFF = ll::FMOD_3D_INVERSETAPEREDROLLOFF;
    const _3D_CUSTOMROLLOFF         = ll::FMOD_3D_CUSTOMROLLOFF;
    const _3D_IGNOREGEOMETRY        = ll::FMOD_3D_IGNOREGEOMETRY;
    const IGNORETAGS                = ll::FMOD_IGNORETAGS;
    const LOWMEM                    = ll::FMOD_LOWMEM;
    const LOADSECONDARYRAM          = ll::FMOD_LOADSECONDARYRAM;
    const VIRTUAL_PLAYFROMSTART     = ll::FMOD_VIRTUAL_PLAYFROMSTART;
  }
}

bitflags!{
  #[derive(Clone, Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd)]
  pub struct PortIndex : u64 {
    const NONE = u64::MAX;
  }
}

bitflags!{
  #[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
  pub struct Timeunit : u32 {
    const MS          = ll::FMOD_TIMEUNIT_MS;
    const PCM         = ll::FMOD_TIMEUNIT_PCM;
    const PCMBYTES    = ll::FMOD_TIMEUNIT_PCMBYTES;
    const RAWBYTES    = ll::FMOD_TIMEUNIT_RAWBYTES;
    const PCMFRACTION = ll::FMOD_TIMEUNIT_PCMFRACTION;
    const MODORDER    = ll::FMOD_TIMEUNIT_MODORDER;
    const MODROW      = ll::FMOD_TIMEUNIT_MODROW;
    const MODPATTERN  = ll::FMOD_TIMEUNIT_MODPATTERN;
  }
}

#[derive(Copy, Clone, Debug, Eq, PartialEq, FromPrimitive)]
pub enum Error {
  Badcommand              = ll::FMOD_RESULT_FMOD_ERR_BADCOMMAND                as isize,
  ChannelAlloc            = ll::FMOD_RESULT_FMOD_ERR_CHANNEL_ALLOC             as isize,
  ChannelStolen           = ll::FMOD_RESULT_FMOD_ERR_CHANNEL_STOLEN            as isize,
  Dma                     = ll::FMOD_RESULT_FMOD_ERR_DMA                       as isize,
  DspConnection           = ll::FMOD_RESULT_FMOD_ERR_DSP_CONNECTION            as isize,
  DspDontprocess          = ll::FMOD_RESULT_FMOD_ERR_DSP_DONTPROCESS           as isize,
  DspFormat               = ll::FMOD_RESULT_FMOD_ERR_DSP_FORMAT                as isize,
  DspInuse                = ll::FMOD_RESULT_FMOD_ERR_DSP_INUSE                 as isize,
  DspNotfound             = ll::FMOD_RESULT_FMOD_ERR_DSP_NOTFOUND              as isize,
  DspReserved             = ll::FMOD_RESULT_FMOD_ERR_DSP_RESERVED              as isize,
  DspSilence              = ll::FMOD_RESULT_FMOD_ERR_DSP_SILENCE               as isize,
  DspType                 = ll::FMOD_RESULT_FMOD_ERR_DSP_TYPE                  as isize,
  FileBad                 = ll::FMOD_RESULT_FMOD_ERR_FILE_BAD                  as isize,
  FileCouldnotseek        = ll::FMOD_RESULT_FMOD_ERR_FILE_COULDNOTSEEK         as isize,
  FileDiskejected         = ll::FMOD_RESULT_FMOD_ERR_FILE_DISKEJECTED          as isize,
  FileEof                 = ll::FMOD_RESULT_FMOD_ERR_FILE_EOF                  as isize,
  FileEndofdata           = ll::FMOD_RESULT_FMOD_ERR_FILE_ENDOFDATA            as isize,
  FileNotfound            = ll::FMOD_RESULT_FMOD_ERR_FILE_NOTFOUND             as isize,
  Format                  = ll::FMOD_RESULT_FMOD_ERR_FORMAT                    as isize,
  HeaderMismatch          = ll::FMOD_RESULT_FMOD_ERR_HEADER_MISMATCH           as isize,
  Http                    = ll::FMOD_RESULT_FMOD_ERR_HTTP                      as isize,
  HttpAccess              = ll::FMOD_RESULT_FMOD_ERR_HTTP_ACCESS               as isize,
  HttpProxyAuth           = ll::FMOD_RESULT_FMOD_ERR_HTTP_PROXY_AUTH           as isize,
  HttpServerError         = ll::FMOD_RESULT_FMOD_ERR_HTTP_SERVER_ERROR         as isize,
  HttpTimeout             = ll::FMOD_RESULT_FMOD_ERR_HTTP_TIMEOUT              as isize,
  Initialization          = ll::FMOD_RESULT_FMOD_ERR_INITIALIZATION            as isize,
  Initialized             = ll::FMOD_RESULT_FMOD_ERR_INITIALIZED               as isize,
  Internal                = ll::FMOD_RESULT_FMOD_ERR_INTERNAL                  as isize,
  InvalidFloat            = ll::FMOD_RESULT_FMOD_ERR_INVALID_FLOAT             as isize,
  InvalidHandle           = ll::FMOD_RESULT_FMOD_ERR_INVALID_HANDLE            as isize,
  InvalidParam            = ll::FMOD_RESULT_FMOD_ERR_INVALID_PARAM             as isize,
  InvalidPosition         = ll::FMOD_RESULT_FMOD_ERR_INVALID_POSITION          as isize,
  InvalidSpeaker          = ll::FMOD_RESULT_FMOD_ERR_INVALID_SPEAKER           as isize,
  InvalidSyncpoint        = ll::FMOD_RESULT_FMOD_ERR_INVALID_SYNCPOINT         as isize,
  InvalidThread           = ll::FMOD_RESULT_FMOD_ERR_INVALID_THREAD            as isize,
  InvalidVector           = ll::FMOD_RESULT_FMOD_ERR_INVALID_VECTOR            as isize,
  Maxaudible              = ll::FMOD_RESULT_FMOD_ERR_MAXAUDIBLE                as isize,
  Memory                  = ll::FMOD_RESULT_FMOD_ERR_MEMORY                    as isize,
  MemoryCantpoint         = ll::FMOD_RESULT_FMOD_ERR_MEMORY_CANTPOINT          as isize,
  Needs3d                 = ll::FMOD_RESULT_FMOD_ERR_NEEDS3D                   as isize,
  Needshardware           = ll::FMOD_RESULT_FMOD_ERR_NEEDSHARDWARE             as isize,
  NetConnect              = ll::FMOD_RESULT_FMOD_ERR_NET_CONNECT               as isize,
  NetSocketError          = ll::FMOD_RESULT_FMOD_ERR_NET_SOCKET_ERROR          as isize,
  NetUrl                  = ll::FMOD_RESULT_FMOD_ERR_NET_URL                   as isize,
  NetWouldBlock           = ll::FMOD_RESULT_FMOD_ERR_NET_WOULD_BLOCK           as isize,
  Notready                = ll::FMOD_RESULT_FMOD_ERR_NOTREADY                  as isize,
  OutputAllocated         = ll::FMOD_RESULT_FMOD_ERR_OUTPUT_ALLOCATED          as isize,
  OutputCreatebuffer      = ll::FMOD_RESULT_FMOD_ERR_OUTPUT_CREATEBUFFER       as isize,
  OutputDrivercall        = ll::FMOD_RESULT_FMOD_ERR_OUTPUT_DRIVERCALL         as isize,
  OutputFormat            = ll::FMOD_RESULT_FMOD_ERR_OUTPUT_FORMAT             as isize,
  OutputInit              = ll::FMOD_RESULT_FMOD_ERR_OUTPUT_INIT               as isize,
  OutputNodrivers         = ll::FMOD_RESULT_FMOD_ERR_OUTPUT_NODRIVERS          as isize,
  Plugin                  = ll::FMOD_RESULT_FMOD_ERR_PLUGIN                    as isize,
  PluginMissing           = ll::FMOD_RESULT_FMOD_ERR_PLUGIN_MISSING            as isize,
  PluginResource          = ll::FMOD_RESULT_FMOD_ERR_PLUGIN_RESOURCE           as isize,
  PluginVersion           = ll::FMOD_RESULT_FMOD_ERR_PLUGIN_VERSION            as isize,
  Record                  = ll::FMOD_RESULT_FMOD_ERR_RECORD                    as isize,
  ReverbChannelgroup      = ll::FMOD_RESULT_FMOD_ERR_REVERB_CHANNELGROUP       as isize,
  ReverbInstance          = ll::FMOD_RESULT_FMOD_ERR_REVERB_INSTANCE           as isize,
  Subsounds               = ll::FMOD_RESULT_FMOD_ERR_SUBSOUNDS                 as isize,
  SubsoundAllocated       = ll::FMOD_RESULT_FMOD_ERR_SUBSOUND_ALLOCATED        as isize,
  SubsoundCantmove        = ll::FMOD_RESULT_FMOD_ERR_SUBSOUND_CANTMOVE         as isize,
  Tagnotfound             = ll::FMOD_RESULT_FMOD_ERR_TAGNOTFOUND               as isize,
  Toomanychannels         = ll::FMOD_RESULT_FMOD_ERR_TOOMANYCHANNELS           as isize,
  Truncated               = ll::FMOD_RESULT_FMOD_ERR_TRUNCATED                 as isize,
  Unimplemented           = ll::FMOD_RESULT_FMOD_ERR_UNIMPLEMENTED             as isize,
  Uninitialized           = ll::FMOD_RESULT_FMOD_ERR_UNINITIALIZED             as isize,
  Unsupported             = ll::FMOD_RESULT_FMOD_ERR_UNSUPPORTED               as isize,
  Version                 = ll::FMOD_RESULT_FMOD_ERR_VERSION                   as isize,
  EventAlreadyLoaded      = ll::FMOD_RESULT_FMOD_ERR_EVENT_ALREADY_LOADED      as isize,
  EventLiveupdateBusy     = ll::FMOD_RESULT_FMOD_ERR_EVENT_LIVEUPDATE_BUSY     as isize,
  EventLiveupdateMismatch = ll::FMOD_RESULT_FMOD_ERR_EVENT_LIVEUPDATE_MISMATCH as isize,
  EventLiveupdateTimeout  = ll::FMOD_RESULT_FMOD_ERR_EVENT_LIVEUPDATE_TIMEOUT  as isize,
  EventNotfound           = ll::FMOD_RESULT_FMOD_ERR_EVENT_NOTFOUND            as isize,
  StudioUninitialized     = ll::FMOD_RESULT_FMOD_ERR_STUDIO_UNINITIALIZED      as isize,
  StudioNotLoaded         = ll::FMOD_RESULT_FMOD_ERR_STUDIO_NOT_LOADED         as isize,
  InvalidString           = ll::FMOD_RESULT_FMOD_ERR_INVALID_STRING            as isize,
  AlreadyLocked           = ll::FMOD_RESULT_FMOD_ERR_ALREADY_LOCKED            as isize,
  NotLocked               = ll::FMOD_RESULT_FMOD_ERR_NOT_LOCKED                as isize,
  RecordDisconnected      = ll::FMOD_RESULT_FMOD_ERR_RECORD_DISCONNECTED       as isize,
  Toomanysamples          = ll::FMOD_RESULT_FMOD_ERR_TOOMANYSAMPLES            as isize
}

#[derive(Copy, Clone, Debug, Eq, PartialEq, FromPrimitive)]
pub enum Plugintype {
  Output = ll::FMOD_PLUGINTYPE_FMOD_PLUGINTYPE_OUTPUT as isize,
  Codec  = ll::FMOD_PLUGINTYPE_FMOD_PLUGINTYPE_CODEC as isize,
  Dsp    = ll::FMOD_PLUGINTYPE_FMOD_PLUGINTYPE_DSP as isize,
  MAX    = ll::FMOD_PLUGINTYPE_FMOD_PLUGINTYPE_MAX as isize
}

#[derive(Copy, Clone, Debug, Eq, PartialEq, FromPrimitive)]
pub enum Speaker {
  FrontLeft     = ll::FMOD_SPEAKER_FMOD_SPEAKER_FRONT_LEFT      as isize,
  FrontRight    = ll::FMOD_SPEAKER_FMOD_SPEAKER_FRONT_RIGHT     as isize,
  FrontCenter   = ll::FMOD_SPEAKER_FMOD_SPEAKER_FRONT_CENTER    as isize,
  LowFrequency  = ll::FMOD_SPEAKER_FMOD_SPEAKER_LOW_FREQUENCY   as isize,
  SurroundLeft  = ll::FMOD_SPEAKER_FMOD_SPEAKER_SURROUND_LEFT   as isize,
  SurroundRight = ll::FMOD_SPEAKER_FMOD_SPEAKER_SURROUND_RIGHT  as isize,
  BackLeft      = ll::FMOD_SPEAKER_FMOD_SPEAKER_BACK_LEFT       as isize,
  BackRight     = ll::FMOD_SPEAKER_FMOD_SPEAKER_BACK_RIGHT      as isize,
  TopFrontLeft  = ll::FMOD_SPEAKER_FMOD_SPEAKER_TOP_FRONT_LEFT  as isize,
  TopFrontRight = ll::FMOD_SPEAKER_FMOD_SPEAKER_TOP_FRONT_RIGHT as isize,
  TopBackLeft   = ll::FMOD_SPEAKER_FMOD_SPEAKER_TOP_BACK_LEFT   as isize,
  TopBackRight  = ll::FMOD_SPEAKER_FMOD_SPEAKER_TOP_BACK_RIGHT  as isize,
  MAX           = ll::FMOD_SPEAKER_FMOD_SPEAKER_MAX             as isize
}

#[derive(Copy, Clone, Debug, Eq, PartialEq, FromPrimitive)]
pub enum Speakermode {
  Default        = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_DEFAULT       as isize,
  Raw            = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_RAW           as isize,
  Mono           = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_MONO          as isize,
  Stereo         = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_STEREO        as isize,
  Quad           = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_QUAD          as isize,
  Surround       = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_SURROUND      as isize,
  _5Point1       = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_5POINT1       as isize,
  _7Point1       = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_7POINT1       as isize,
  _7Point1Point4 = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_7POINT1POINT4 as isize,
  MAX            = ll::FMOD_SPEAKERMODE_FMOD_SPEAKERMODE_MAX           as isize
}

impl Error {
  /// # Panics
  ///
  /// Panics if `ll` is not a valid result
  // ll is i32 on windows and u32 on linux
  #[allow(clippy::allow_attributes, clippy::unnecessary_cast)]
  pub fn from_ll (ll : ll::FMOD_RESULT) -> Self {
    use num_traits::FromPrimitive;
    Self::from_u32 (ll as u32).unwrap()
  }
}

impl Guid {
  #[inline]
  pub fn as_mut_ll (&mut self) -> &mut ll::FMOD_GUID {
    debug_assert_eq!(
      std::mem::size_of::<Self>(),
      std::mem::size_of::<ll::FMOD_GUID>());
    unsafe { &mut *(std::ptr::from_mut::<Guid> (self) as *mut fmod_sys::FMOD_GUID) }
  }
}

impl ListenerAttributes {
  #[inline]
  pub fn from_ll (
    pos     : ll::FMOD_VECTOR,
    vel     : ll::FMOD_VECTOR,
    forward : ll::FMOD_VECTOR,
    up      : ll::FMOD_VECTOR
  ) -> Self {
    let convert = |vec : ll::FMOD_VECTOR| [vec.x, vec.y, vec.z];
    let pos     = convert (pos);
    let vel     = convert (vel);
    let forward = convert (forward);
    let up      = convert (up);
    ListenerAttributes { pos, vel, forward, up }
  }
}

impl Speakermode {
  /// # Panics
  ///
  /// Panics if `ll` is not a valid speaker mode
  // ll is i32 on windows and u32 on linux
  #[allow(clippy::allow_attributes, clippy::unnecessary_cast)]
  pub fn from_ll (ll : ll::FMOD_SPEAKERMODE) -> Self {
    use num_traits::FromPrimitive;
    Self::from_u32 (ll as u32).unwrap()
  }
}

impl Default for Timeunit {
  fn default() -> Self {
    Timeunit::empty()
  }
}