1use crate::position::SoundSource;
4use crate::types::Position3D;
5use serde::{Deserialize, Serialize};
6use std::time::Instant;
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
10pub enum GameEngine {
11 Unity,
13 Unreal,
15 Godot,
17 Custom,
19 WebEngine,
21 Console,
23 PlayStation,
25 Xbox,
27 NintendoSwitch,
29}
30
31#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
33pub struct GameAudioSource {
34 pub id: u32,
36 pub category: AudioCategory,
38 pub priority: u8,
40}
41
42#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
44pub enum AudioCategory {
45 Player,
47 Npc,
49 Environment,
51 Music,
53 Sfx,
55 Ui,
57 Voice,
59 Ambient,
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize)]
65pub struct AttenuationSettings {
66 pub min_distance: f32,
68 pub max_distance: f32,
70 pub curve: AttenuationCurve,
72 pub factor: f32,
74}
75
76impl Default for AttenuationSettings {
77 fn default() -> Self {
78 Self {
79 min_distance: 1.0,
80 max_distance: 100.0,
81 curve: AttenuationCurve::Logarithmic,
82 factor: 1.0,
83 }
84 }
85}
86
87#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
89pub enum AttenuationCurve {
90 Linear,
92 Logarithmic,
94 Exponential,
96 Custom,
98}
99
100#[derive(Debug, Clone, Default)]
102pub struct GamingMetrics {
103 pub audio_time_ms: f32,
105 pub active_sources: u32,
107 pub memory_usage_mb: f32,
109 pub cpu_usage_percent: f32,
111 pub gpu_usage_percent: Option<f32>,
113 pub dropped_frames: u32,
115 pub fps: f32,
117 pub latency_ms: f32,
119}
120
121#[derive(Debug, Clone)]
123pub(super) struct GameAudioSourceData {
124 pub handle: GameAudioSource,
126 pub spatial_source: SoundSource,
128 pub audio_data: Vec<f32>,
130 pub state: PlaybackState,
132 pub volume: f32,
134 pub looping: bool,
136 pub attenuation: AttenuationSettings,
138}
139
140#[derive(Debug, Clone, Copy, PartialEq, Eq)]
142pub(super) enum PlaybackState {
143 Stopped,
144 Playing,
145 Paused,
146 Finished,
147}
148
149#[derive(Debug)]
151pub(super) struct FrameTimer {
152 pub last_frame: Instant,
153 pub frame_count: u32,
154 pub fps_accumulator: f32,
155 pub fps_timer: Instant,
156}
157
158impl Default for FrameTimer {
159 fn default() -> Self {
160 let now = Instant::now();
161 Self {
162 last_frame: now,
163 frame_count: 0,
164 fps_accumulator: 0.0,
165 fps_timer: now,
166 }
167 }
168}