Unravel Engine C++ Reference
Loading...
Searching...
No Matches
audio_system.cpp
Go to the documentation of this file.
1#include "audio_system.h"
2#include <engine/events.h>
3
7#include <engine/ecs/ecs.h>
8
9#include <audiopp/logger.h>
10#include <logging/logging.h>
11
12namespace unravel
13{
14
15namespace
16{
17
18void on_create_component(entt::registry& r, entt::entity e)
19{
20 auto& comp = r.get<audio_source_component>(e);
21
22 if(r.all_of<active_component>(e))
23 {
24 comp.on_play_begin();
25 }
26}
27void on_destroy_component(entt::registry& r, entt::entity e)
28{
29 auto& comp = r.get<audio_source_component>(e);
30 comp.on_play_end();
31}
32
33void on_create_active_component(entt::registry& r, entt::entity e)
34{
35 if(auto comp = r.try_get<audio_source_component>(e))
36 {
37 comp->on_play_begin();
38 }
39}
40void on_destroy_active_component(entt::registry& r, entt::entity e)
41{
42 if(auto comp = r.try_get<audio_source_component>(e))
43 {
44 comp->on_play_end();
45 }
46}
47
48
49} // namespace
50
52{
53 APPLOG_TRACE("{}::{}", hpp::type_name_str(*this), __func__);
54
55 auto& ev = ctx.get_cached<events>();
56 ev.on_frame_update.connect(sentinel_, this, &audio_system::on_frame_update);
57
58 ev.on_play_begin.connect(sentinel_, 10, this, &audio_system::on_play_begin);
59 ev.on_play_end.connect(sentinel_, -10, this, &audio_system::on_play_end);
60 ev.on_pause.connect(sentinel_, 10, this, &audio_system::on_pause);
61 ev.on_resume.connect(sentinel_, -10, this, &audio_system::on_resume);
62 ev.on_skip_next_frame.connect(sentinel_, -10, this, &audio_system::on_skip_next_frame);
63
64 audio::set_info_logger(
65 [](const std::string& s)
66 {
67 APPLOG_TRACE(s);
68 });
69 audio::set_error_logger(
70 [](const std::string& s)
71 {
72 APPLOG_ERROR(s);
73 });
74
75 audio::set_trace_logger(
76 [](const std::string& s)
77 {
78 APPLOG_TRACE(s);
79 });
80
81 device_ = std::make_unique<audio::device>();
82
83 return true;
84}
85
87{
88 APPLOG_TRACE("{}::{}", hpp::type_name_str(*this), __func__);
89
90 return true;
91}
92
93void audio_system::on_play_begin(rtti::context& ctx)
94{
95 APPLOG_TRACE("{}::{}", hpp::type_name_str(*this), __func__);
96
97 auto& ec = ctx.get_cached<ecs>();
98 auto& scn = ec.get_scene();
99 auto& registry = *scn.registry;
100
101 registry.on_construct<audio_source_component>().connect<&on_create_component>();
102 registry.on_destroy<audio_source_component>().connect<&on_destroy_component>();
103
104
105 registry.on_construct<active_component>().connect<&on_create_active_component>();
106 registry.on_destroy<active_component>().connect<&on_destroy_active_component>();
107
108
109 registry.view<audio_source_component, active_component>().each(
110 [&](auto e, auto&& comp, auto&& active)
111 {
112 comp.on_play_begin();
113 });
114}
115
116void audio_system::on_play_end(rtti::context& ctx)
117{
118 APPLOG_TRACE("{}::{}", hpp::type_name_str(*this), __func__);
119
120 auto& ec = ctx.get_cached<ecs>();
121 auto& scn = ec.get_scene();
122 auto& registry = *scn.registry;
123
124 registry.view<audio_source_component, active_component>().each(
125 [&](auto e, auto&& comp, auto&& active)
126 {
127 comp.on_play_end();
128 });
129
130 registry.on_construct<active_component>().disconnect<&on_create_active_component>();
131 registry.on_destroy<active_component>().disconnect<&on_destroy_active_component>();
132
133 registry.on_construct<audio_source_component>().disconnect<&on_create_component>();
134 registry.on_destroy<audio_source_component>().disconnect<&on_destroy_component>();
135}
136
137void audio_system::on_pause(rtti::context& ctx)
138{
139 auto& ec = ctx.get_cached<ecs>();
140 auto& scn = ec.get_scene();
141 auto& registry = *scn.registry;
142
143 registry.view<audio_source_component>().each(
144 [&](auto e, auto&& comp)
145 {
146 comp.pause();
147 });
148}
149
150void audio_system::on_resume(rtti::context& ctx)
151{
152 auto& ec = ctx.get_cached<ecs>();
153 auto& scn = ec.get_scene();
154 auto& registry = *scn.registry;
155
156 registry.view<audio_source_component>().each(
157 [&](auto e, auto&& comp)
158 {
159 comp.resume();
160 });
161}
162
163void audio_system::on_skip_next_frame(rtti::context& ctx)
164{
165 delta_t step(1.0f / 60.0f);
166 on_frame_update(ctx, step);
167}
168
169void audio_system::on_frame_update(rtti::context& ctx, delta_t dt)
170{
171 auto& ev = ctx.get_cached<events>();
172
173 auto& ec = ctx.get_cached<ecs>();
174 auto& scn = ec.get_scene();
175 auto& registry = *scn.registry;
176
177 // update auidio spatial properties from transform
178 registry.view<transform_component, audio_listener_component, active_component>().each(
179 [&](auto e, auto&& transform, auto&& comp, auto&& active)
180 {
181 comp.update(transform.get_transform_global(), dt);
182 });
183
184 registry.view<transform_component, audio_source_component, active_component>().each(
185 [&](auto e, auto&& transform, auto&& comp, auto&& active)
186 {
187 comp.update(transform.get_transform_global(), dt);
188 });
189}
190
191} // namespace unravel
Class that contains core data for audio sources.
auto init(rtti::context &ctx) -> bool
Initializes the audio system with the given context.
auto deinit(rtti::context &ctx) -> bool
Deinitializes the audio system with the given context.
std::chrono::duration< float > delta_t
#define APPLOG_ERROR(...)
Definition logging.h:20
#define APPLOG_TRACE(...)
Definition logging.h:17
bgfx::Transform transform
Definition graphics.h:40
auto get_cached() -> T &
Definition context.hpp:49
Manages the entity-component-system (ECS) operations for the ACE framework.
Definition ecs.h:12
auto get_scene() -> scene &
Gets the current scene.
Definition ecs.cpp:30
hpp::event< void(rtti::context &, delta_t)> on_frame_update
Definition events.h:16