fmod/studio/
enums.rs

1// Copyright (c) 2024 Melody Madeline Lyons
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at https://mozilla.org/MPL/2.0/.
6
7use crate::{Error, Result};
8use fmod_sys::*;
9use lanyard::Utf8CString;
10use std::ffi::{c_float, c_int};
11
12/// Loading state of various objects.
13#[derive(Debug, Clone, Copy, PartialEq, Eq)]
14// stupid enum repr hack
15#[cfg_attr(target_env = "msvc", repr(i32))]
16#[cfg_attr(not(target_env = "msvc"), repr(u32))]
17pub enum LoadingState {
18    /// Currently unloading.
19    Unloading = FMOD_STUDIO_LOADING_STATE_UNLOADING,
20    /// Not loaded.
21    Unloaded = FMOD_STUDIO_LOADING_STATE_UNLOADED,
22    /// Loading in progress.
23    Loading = FMOD_STUDIO_LOADING_STATE_LOADING,
24    /// Loaded and ready to play.
25    Loaded = FMOD_STUDIO_LOADING_STATE_LOADED,
26    /// Failed to load.
27    Error(Error) = FMOD_STUDIO_LOADING_STATE_ERROR,
28}
29
30impl LoadingState {
31    /// Try creating a `LoadingState` from its FFI equivalent.
32    pub fn try_from_ffi(value: FMOD_STUDIO_LOADING_STATE, error: Option<Error>) -> Result<Self> {
33        match value {
34            FMOD_STUDIO_LOADING_STATE_UNLOADING => Ok(LoadingState::Unloading),
35            FMOD_STUDIO_LOADING_STATE_UNLOADED => Ok(LoadingState::Unloaded),
36            FMOD_STUDIO_LOADING_STATE_LOADING => Ok(LoadingState::Loading),
37            FMOD_STUDIO_LOADING_STATE_LOADED => Ok(LoadingState::Loaded),
38            FMOD_STUDIO_LOADING_STATE_ERROR => {
39                error.map(LoadingState::Error).ok_or(Error::InvalidParam)
40            }
41            _ => Err(Error::EnumFromPrivitive {
42                name: "LoadingState",
43                primitive: i64::from(value),
44            }),
45        }
46    }
47}
48
49/// Loaded and ready to play.
50#[derive(Debug, Clone, Copy, PartialEq, Eq)]
51#[derive(
52    num_enum::TryFromPrimitive,
53    num_enum::IntoPrimitive,
54    num_enum::UnsafeFromPrimitive
55)]
56// stupid enum repr hack
57#[cfg_attr(target_env = "msvc", repr(i32))]
58#[cfg_attr(not(target_env = "msvc"), repr(u32))]
59pub enum StopMode {
60    /// Allows AHDSR modulators to complete their release, and DSP effect tails to play out.
61    AllowFadeout = FMOD_STUDIO_STOP_ALLOWFADEOUT,
62    /// Stops the event instance immediately.
63    Immediate = FMOD_STUDIO_STOP_IMMEDIATE,
64}
65
66/// Event parameter types.
67#[derive(Debug, Clone, Copy, PartialEq, Eq)]
68#[derive(
69    num_enum::TryFromPrimitive,
70    num_enum::IntoPrimitive,
71    num_enum::UnsafeFromPrimitive
72)]
73// stupid enum repr hack
74#[cfg_attr(target_env = "msvc", repr(i32))]
75#[cfg_attr(not(target_env = "msvc"), repr(u32))]
76pub enum ParameterKind {
77    /// API settable parameter.
78    GameControlled = FMOD_STUDIO_PARAMETER_GAME_CONTROLLED,
79    /// Distance between the event and the listener.
80    AutomaticDistance = FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE,
81    /// Angle between the event's forward vector and the vector pointing from the event to the listener (0 to 180 degrees).
82    AutomaticEventConeAngle = FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_CONE_ANGLE,
83    /// Horizontal angle between the event's forward vector and listener's forward vector (-180 to 180 degrees).
84    AutomaticEventOrientation = FMOD_STUDIO_PARAMETER_AUTOMATIC_EVENT_ORIENTATION,
85    /// Horizontal angle between the listener's forward vector and the vector pointing from the listener to the event (-180 to 180 degrees).
86    AutomaticDirection = FMOD_STUDIO_PARAMETER_AUTOMATIC_DIRECTION,
87    /// Angle between the listener's XZ plane and the vector pointing from the listener to the event (-90 to 90 degrees).
88    AutomaticElevation = FMOD_STUDIO_PARAMETER_AUTOMATIC_ELEVATION,
89    /// Horizontal angle between the listener's forward vector and the global positive Z axis (-180 to 180 degrees).
90    AutomaticListenerOrientation = FMOD_STUDIO_PARAMETER_AUTOMATIC_LISTENER_ORIENTATION,
91    /// Magnitude of the relative velocity of the event and the listener.
92    AutomaticSpeed = FMOD_STUDIO_PARAMETER_AUTOMATIC_SPEED,
93    /// Magnitude of the absolute velocity of the event.
94    AutomaticSpeedAbsolute = FMOD_STUDIO_PARAMETER_AUTOMATIC_SPEED_ABSOLUTE,
95    /// Distance between the event and the listener in the range min distance - max distance represented as 0 - 1.
96    AutomaticDistanceNormalized = FMOD_STUDIO_PARAMETER_AUTOMATIC_DISTANCE_NORMALIZED,
97}
98
99/// User property types.
100#[derive(Clone, PartialEq, Debug)]
101pub enum UserPropertyKind {
102    /// Integer.
103    Int(c_int),
104    /// Boolean.
105    Bool(bool),
106    /// Float.
107    Float(c_float),
108    /// String.
109    String(Utf8CString),
110}
111
112/// Playback state of various objects.
113#[derive(Debug, Clone, Copy, PartialEq, Eq)]
114#[derive(
115    num_enum::TryFromPrimitive,
116    num_enum::IntoPrimitive,
117    num_enum::UnsafeFromPrimitive
118)]
119// stupid enum repr hack
120#[cfg_attr(target_env = "msvc", repr(i32))]
121#[cfg_attr(not(target_env = "msvc"), repr(u32))]
122pub enum PlaybackState {
123    /// Playing.
124    Playing = FMOD_STUDIO_PLAYBACK_PLAYING,
125    /// The timeline cursor is paused on a sustain point. (`EventInstance` only.)
126    Sustaining = FMOD_STUDIO_PLAYBACK_SUSTAINING,
127    /// Stopped.
128    Stopped = FMOD_STUDIO_PLAYBACK_STOPPED,
129    /// Preparing to start.
130    Starting = FMOD_STUDIO_PLAYBACK_STARTING,
131    /// Preparing to stop.
132    Stopping = FMOD_STUDIO_PLAYBACK_STOPPING,
133}
134
135/// These definitions describe built-in event properties.
136#[derive(Debug, Clone, Copy, PartialEq, Eq)]
137#[derive(
138    num_enum::TryFromPrimitive,
139    num_enum::IntoPrimitive,
140    num_enum::UnsafeFromPrimitive
141)]
142// stupid enum repr hack
143#[cfg_attr(target_env = "msvc", repr(i32))]
144#[cfg_attr(not(target_env = "msvc"), repr(u32))]
145pub enum EventProperty {
146    /// Priority to set on Core API Channels created by this event instance, or -1 for default.
147    ChannelPriority = FMOD_STUDIO_EVENT_PROPERTY_CHANNELPRIORITY,
148    /// Schedule delay in DSP clocks, or -1 for default.
149    ScheduleDelay = FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_DELAY,
150    /// Schedule look-ahead on the timeline in DSP clocks, or -1 for default.
151    ScheduleLookahead = FMOD_STUDIO_EVENT_PROPERTY_SCHEDULE_LOOKAHEAD,
152    /// Override the event's 3D minimum distance, or -1 for default.
153    MinimumDistance = FMOD_STUDIO_EVENT_PROPERTY_MINIMUM_DISTANCE,
154    /// Override the event's 3D maximum distance, or -1 for default.
155    MaximumDistance = FMOD_STUDIO_EVENT_PROPERTY_MAXIMUM_DISTANCE,
156    /// Override the event's cooldown, or -1 for default.
157    Cooldown = FMOD_STUDIO_EVENT_PROPERTY_COOLDOWN,
158}
159
160/// Command replay command instance handle types.
161#[derive(Debug, Clone, Copy, PartialEq, Eq)]
162#[derive(
163    num_enum::TryFromPrimitive,
164    num_enum::IntoPrimitive,
165    num_enum::UnsafeFromPrimitive
166)]
167// stupid enum repr hack
168#[cfg_attr(target_env = "msvc", repr(i32))]
169#[cfg_attr(not(target_env = "msvc"), repr(u32))]
170pub enum InstanceType {
171    /// No type, handle is unused.
172    None = FMOD_STUDIO_INSTANCETYPE_NONE,
173    /// `System`.
174    System = FMOD_STUDIO_INSTANCETYPE_SYSTEM,
175    /// `EventDescription`.
176    EventDescription = FMOD_STUDIO_INSTANCETYPE_EVENTDESCRIPTION,
177    /// `EventInstance`.
178    EventInstance = FMOD_STUDIO_INSTANCETYPE_EVENTINSTANCE,
179    /// `ParameterInstance`.
180    ParameterInstance = FMOD_STUDIO_INSTANCETYPE_PARAMETERINSTANCE,
181    /// `Bus`.
182    Bus = FMOD_STUDIO_INSTANCETYPE_BUS,
183    /// `Vca`.
184    Vca = FMOD_STUDIO_INSTANCETYPE_VCA,
185    /// `Bank`.
186    Bank = FMOD_STUDIO_INSTANCETYPE_BANK,
187    /// `CommandReplay`.
188    CommandReplay = FMOD_STUDIO_INSTANCETYPE_COMMANDREPLAY,
189}