Toast Engine
Loading...
Searching...
No Matches
audio_system.hpp
Go to the documentation of this file.
1
8
9#pragma once
10#include "assets.hpp"
11
12#include <filesystem>
13#include <fmod/fmod_studio.h>
14#include <glm/glm.hpp>
15#include <toast/events/listener.hpp>
16#include <toast/world/box.hpp>
17
18namespace toast {
19class AudioListener;
20class AudioVolume;
21}
22
23namespace audio {
24
33class AudioSystem {
34public:
35 AudioSystem() noexcept;
36 ~AudioSystem() noexcept;
37
38 [[nodiscard]]
39 static auto get() noexcept -> AudioSystem&;
40
41 void tick() noexcept;
42
45 static void generateIntermediates(const std::filesystem::path& path);
46
47 [[nodiscard]]
48 auto loadBank(assets::Handle<assets::AudioBank> bank) const -> std::pair<FMOD_STUDIO_BANK*, std::vector<std::string>>;
49 void unloadBank(FMOD_STUDIO_BANK*) const;
50
51 void updateListenerAttributes(
52 int id, glm::vec3 pos, glm::vec3 velocity, glm::vec3 forward, glm::vec3 up, std::optional<glm::vec3> attenuation_override
53 );
54 void updateListenerWeight(int id, float weight);
55 void setListenerPosition(int index, glm::vec3 pos);
56 [[nodiscard]]
57 auto listenerPositions() const -> const std::vector<glm::vec3>&;
58 void registerListener(toast::AudioListener& listener);
59 void unregisterListener(toast::AudioListener& listener);
60 void registerVolume(toast::AudioVolume& volume);
61 void unregisterVolume(toast::AudioVolume& volume);
62
63 void playEvent(std::string_view guid_str);
64 void stopEvent(std::string_view guid_str, bool allow_fadeout);
65 void pauseEvent(std::string_view guid_str, bool value);
66 void setParameter(std::string_view guid_str, std::string_view name, float value);
67 void setParameter(std::string_view guid_str, std::string_view name, bool value);
68 void setVolume(std::string_view guid_str, float volume);
69 void setPitch(std::string_view guid_str, float pitch);
70 [[nodiscard]]
71 auto isEventPlaying(std::string_view guid_str) -> bool;
72
73 // Runtime control for VCA, Bus, and Port assets
74 void setVcaVolume(std::string_view guid_str, float volume);
75 void setBusVolume(std::string_view guid_str, float volume);
76 void setPortVolume(std::string_view guid_str, float volume);
77
78 // Snapshot runtime controls (intensity = 0.0 - 1.0, enable/disable)
79 void setSnapshotIntensity(std::string_view guid_str, float intensity);
80 void setSnapshotEnabled(std::string_view guid_str, bool enabled);
81
82 [[nodiscard]]
83 auto playEvent3D(std::string_view guid_str) -> uint64_t;
84 void stopEvent3D(uint64_t instance_id, bool allow_fadeout);
85 void set3DAttributes(
86 uint64_t instance_id, const glm::vec3& pos, const glm::vec3& vel, const glm::vec3& fwd, const glm::vec3& up
87 );
88 void set3DMinMaxDistance(uint64_t instance_id, float min_distance, float max_distance);
89 void pauseEvent(uint64_t instance_id, bool value);
90 void setParameter(uint64_t instance_id, std::string_view name, float value);
91 void setParameter(uint64_t instance_id, std::string_view name, bool value);
92 void setVolume(uint64_t instance_id, float volume);
93 void setPitch(uint64_t instance_id, float pitch);
94 [[nodiscard]]
95 auto isEventPlaying(uint64_t instance_id) -> bool;
96 void set3DOverrideAttenuation(uint64_t instance_id, float min_distance, float max_distance);
97
98 void keyOffEvent(uint64_t instance_id);
99 [[nodiscard]]
100 auto getTimelinePosition(uint64_t instance_id) -> int;
101 void setTimelinePosition(uint64_t instance_id, int ms);
102 void setParameterByID(uint64_t instance_id, FMOD_STUDIO_PARAMETER_ID id, float value);
103 [[nodiscard]]
104 auto getPlaybackState(uint64_t instance_id) -> FMOD_STUDIO_PLAYBACK_STATE;
105
106 [[nodiscard]]
107 auto getRawInstance(uint64_t instance_id) -> FMOD_STUDIO_EVENTINSTANCE*;
108
109private:
110 static inline AudioSystem* instance = nullptr;
111 FMOD_STUDIO_SYSTEM* m_system = nullptr;
112 FMOD_SYSTEM* m_core_system = nullptr;
113
116 auto loadMasterBanks() -> bool;
117
118 bool m_master_banks_loaded = false;
120 bool m_retry_master_banks = false;
121 event::Listener m_listener;
122
123 [[nodiscard]]
124 auto loadBankData(const std::vector<uint8_t>& data) const -> FMOD_STUDIO_BANK*;
125
126 std::unordered_map<std::string, FMOD_STUDIO_EVENTINSTANCE*> m_active_instances;
127 auto getOrCreateInstance(std::string_view guid_str) -> FMOD_STUDIO_EVENTINSTANCE*;
129 void keepOnListener(FMOD_STUDIO_EVENTINSTANCE* inst) const;
130
131 uint64_t m_next_instance_id = 1; // 0 = null
132 std::unordered_map<uint64_t, FMOD_STUDIO_EVENTINSTANCE*> m_instances_3d;
133
134 std::unordered_map<std::string, FMOD_STUDIO_EVENTINSTANCE*>
135 m_snapshot_instances;
136
137 std::vector<glm::vec3> m_listener_positions;
138 std::vector<toast::Box<toast::AudioListener>> m_listeners;
139 std::mutex m_listeners_mutex;
140
141 std::vector<toast::Box<toast::AudioVolume>> m_volumes;
142 std::mutex m_volumes_mutex;
143};
144
145}
pseudo shared pointer for Nodes
Type-safe smart pointer for assets.
Definition core_types.hpp:149
static void generateIntermediates(const std::filesystem::path &path)
Reads a strings bank's GUID/path table into cache://fmod/audio.json for the editor's importer.
Definition audio_system.cpp:252
manages the lifetime, subscription, and unsubscription of callbacks
Definition listener.hpp:39
Definition audio_listener.hpp:15
Base interface for audio-reactive volumes.
Definition audio_volume.hpp:25