2
2
#include < bave/json_io.hpp>
3
3
#include < bave/loader.hpp>
4
4
#include < spaced/scenes/home.hpp>
5
+ #include < spaced/services/audio.hpp>
5
6
#include < spaced/services/gamepad_provider.hpp>
6
7
#include < spaced/services/layout.hpp>
7
8
#include < spaced/services/resources.hpp>
13
14
namespace spaced {
14
15
namespace {
15
16
using bave::App;
17
+ using bave::AudioClip;
18
+ using bave::AudioDevice;
19
+ using bave::AudioStreamer;
16
20
using bave::Gamepad;
17
21
using bave::KeyInput;
18
22
using bave::Loader;
@@ -23,19 +27,7 @@ using bave::PointerTap;
23
27
using bave::Rect;
24
28
using bave::RenderDevice;
25
29
using bave::RenderView;
26
-
27
- struct SceneSwitcherImpl : ISceneSwitcher {
28
- App& app; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
29
- Services const & services; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
30
- std::unique_ptr<Scene> next_scene{};
31
-
32
- explicit SceneSwitcherImpl (App& app, Services const & services) : app(app), services(services) {}
33
-
34
- void switch_to_scene (std::unique_ptr<Scene> new_scene) final { next_scene = std::move (new_scene); }
35
-
36
- [[nodiscard]] auto get_app () const -> App& final { return app; }
37
- [[nodiscard]] auto get_services () const -> Services const & final { return services; }
38
- };
30
+ using bave::Seconds;
39
31
40
32
struct GamepadProvider : IGamepadProvider {
41
33
bave::App& app; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
@@ -72,8 +64,50 @@ struct Layout : ILayout {
72
64
73
65
void set_framebuffer_size (glm::vec2 const size) final { framebuffer_size = size; }
74
66
};
67
+
68
+ struct Audio : IAudio {
69
+ NotNull<AudioDevice*> audio_device;
70
+ NotNull<AudioStreamer*> audio_streamer;
71
+ NotNull<Resources const *> resources;
72
+
73
+ explicit Audio (NotNull<AudioDevice*> audio_device, NotNull<AudioStreamer*> audio_streamer, NotNull<Resources const *> resources)
74
+ : audio_device(audio_device), audio_streamer(audio_streamer), resources(resources) {}
75
+
76
+ [[nodiscard]] auto get_sfx_gain () const -> float final { return audio_device->sfx_gain ; }
77
+ void set_sfx_gain (float const gain) final { audio_device->sfx_gain = gain; }
78
+
79
+ [[nodiscard]] auto get_music_gain () const -> float final { return audio_streamer->gain ; }
80
+ void set_music_gain (float const gain) final { audio_streamer->gain = gain; }
81
+
82
+ void play_sfx (std::string_view const uri) final {
83
+ auto const clip = resources->get <AudioClip>(uri);
84
+ if (!clip) { return ; }
85
+ audio_device->play_once (*clip);
86
+ }
87
+
88
+ void play_music (std::string_view const uri, Seconds const crossfade) final {
89
+ auto const clip = resources->get <AudioClip>(uri);
90
+ if (!clip) { return ; }
91
+ audio_streamer->play (clip, crossfade);
92
+ }
93
+
94
+ void stop_music () final { audio_streamer->stop (); }
95
+ };
75
96
} // namespace
76
97
98
+ struct SceneSwitcher : ISceneSwitcher {
99
+ App& app; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
100
+ Services const & services; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
101
+ std::unique_ptr<Scene> next_scene{};
102
+
103
+ explicit SceneSwitcher (App& app, Services const & services) : app(app), services(services) {}
104
+
105
+ void switch_to_scene (std::unique_ptr<Scene> new_scene) final { next_scene = std::move (new_scene); }
106
+
107
+ [[nodiscard]] auto get_app () const -> App& final { return app; }
108
+ [[nodiscard]] auto get_services () const -> Services const & final { return services; }
109
+ };
110
+
77
111
void Spaced::set_bindings ([[maybe_unused]] Serializer& serializer) {}
78
112
79
113
Spaced::Spaced (App& app) : Driver(app), m_scene(std::make_unique<Scene>(app, m_services)) {
@@ -99,9 +133,10 @@ void Spaced::tick() {
99
133
m_layout->set_framebuffer_size (get_app ().get_framebuffer_size ());
100
134
101
135
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-static-cast-downcast)
102
- if (auto & switcher = static_cast <SceneSwitcherImpl&>(m_services. get <ISceneSwitcher>()); switcher. next_scene ) {
136
+ if (m_scene_switcher-> next_scene ) {
103
137
m_resources->clear ();
104
- m_scene = std::move (switcher.next_scene );
138
+ m_audio->stop_music ();
139
+ m_scene = std::move (m_scene_switcher->next_scene );
105
140
}
106
141
107
142
m_scene->tick_frame (dt);
@@ -156,12 +191,16 @@ void Spaced::create_services() {
156
191
set_bindings (*serializer);
157
192
m_services.bind <Serializer>(std::move (serializer));
158
193
159
- auto gamepad_provider = std::make_unique<GamepadProvider>(get_app ());
160
- m_services.bind <IGamepadProvider>(std::move (gamepad_provider));
194
+ m_services.bind <IGamepadProvider>(std::make_unique<GamepadProvider>(get_app ()));
195
+
196
+ auto audio = std::make_unique<Audio>(&get_app ().get_audio_device (), &get_app ().get_audio_streamer (), m_resources);
197
+ m_audio = audio.get ();
198
+ m_services.bind <IAudio>(std::move (audio));
161
199
}
162
200
163
201
void Spaced::set_scene () {
164
- auto switcher = std::make_unique<SceneSwitcherImpl>(get_app (), m_services);
202
+ auto switcher = std::make_unique<SceneSwitcher>(get_app (), m_services);
203
+ m_scene_switcher = switcher.get ();
165
204
switcher->switch_to <Home>();
166
205
m_services.bind <ISceneSwitcher>(std::move (switcher));
167
206
}
0 commit comments