fmod/studio/system/profiling.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 fmod_sys::*;
8use std::mem::MaybeUninit;
9
10use crate::studio::{BufferUsage, CpuUsage, MemoryUsage, System};
11use crate::{FmodResultExt, Result};
12
13#[cfg(doc)]
14use crate::studio::SystemBuilder;
15
16impl System {
17 /// Retrieves buffer usage information.
18 ///
19 /// Stall count and time values are cumulative. They can be reset by calling [`System::reset_buffer_usage`].
20 ///
21 /// Stalls due to the studio command queue overflowing can be avoided by setting a larger command queue size with [`SystemBuilder::settings`].
22 pub fn get_buffer_usage(&self) -> Result<BufferUsage> {
23 let mut usage = MaybeUninit::zeroed();
24 unsafe {
25 FMOD_Studio_System_GetBufferUsage(self.inner.as_ptr(), usage.as_mut_ptr())
26 .to_result()?;
27
28 let usage = usage.assume_init().into();
29 Ok(usage)
30 }
31 }
32
33 /// Resets memory buffer usage statistics.
34 ///
35 /// This function resets the buffer usage data tracked by the FMOD Studio System.
36 pub fn reset_buffer_usage(&self) -> Result<()> {
37 unsafe { FMOD_Studio_System_ResetBufferUsage(self.inner.as_ptr()).to_result() }
38 }
39
40 /// Retrieves the amount of CPU used for different parts of the Studio engine.
41 ///
42 /// For readability, the percentage values are smoothed to provide a more stable output.
43 pub fn get_cpu_usage(&self) -> Result<(CpuUsage, crate::CpuUsage)> {
44 let mut usage = MaybeUninit::zeroed();
45 let mut usage_core = MaybeUninit::zeroed();
46 unsafe {
47 FMOD_Studio_System_GetCPUUsage(
48 self.inner.as_ptr(),
49 usage.as_mut_ptr(),
50 usage_core.as_mut_ptr(),
51 )
52 .to_result()?;
53
54 let usage = usage.assume_init().into();
55 let usage_core = usage_core.assume_init().into();
56 Ok((usage, usage_core))
57 }
58 }
59
60 /// Retrieves memory usage statistics.
61 ///
62 /// The memory usage `sample_data` field for the system is the total size of non-streaming sample data currently loaded.
63 ///
64 /// Memory usage statistics are only available in logging builds, in release builds memoryusage will contain zero for all values after calling this function.
65 pub fn get_memory_usage(&self) -> Result<MemoryUsage> {
66 let mut usage = MaybeUninit::zeroed();
67 unsafe {
68 FMOD_Studio_System_GetMemoryUsage(self.inner.as_ptr(), usage.as_mut_ptr())
69 .to_result()?;
70
71 let usage = usage.assume_init().into();
72 Ok(usage)
73 }
74 }
75}