Divide Framework 0.1
A free and open-source 3D Framework under heavy development
Loading...
Searching...
No Matches
SFXDevice.cpp
Go to the documentation of this file.
1
2
3#include "Headers/SFXDevice.h"
4
8
10
11namespace Divide {
12
14 : AudioAPIWrapper("SFXDevice", context),
15 _state(true, true, true, true),
16 _api(nullptr)
17{
18 _playNextInPlaylist = false;
19}
20
22{
24}
25
27 assert(_api == nullptr && "SFXDevice error: initAudioAPI called twice!");
28
29 switch (_apiID)
30 {
31 case AudioAPI::FMOD: {
32 _api = std::make_unique<FMOD_API>(_context );
33 } break;
34 case AudioAPI::OpenAL: {
35 _api = std::make_unique<OpenAL_API>( _context );
36 } break;
37 case AudioAPI::SDL: {
38 _api = std::make_unique<SDL_API>( _context );
39 } break;
40 default:
41 case AudioAPI::COUNT:
42 {
43 Console::errorfn(LOCALE_STR("ERROR_SFX_DEVICE_API"));
45 }
46 }
47
48 return _api->initAudioAPI();
49}
50
52 _musicPlaylists.clear();
53 _currentPlaylist.second.clear();
54
55 if (_api != nullptr) {
56 _api->closeAudioAPI();
57 _api.reset();
58 }
59}
60
62 NOP();
63}
64
65bool SFXDevice::frameStarted( [[maybe_unused]] const FrameEvent& evt )
66{
68
70 _api->musicFinished();
71
72 if (!_currentPlaylist.second.empty()) {
73 _currentPlaylist.first = (_currentPlaylist.first + 1u) % _currentPlaylist.second.size();
74 _api->playMusic(_currentPlaylist.second[_currentPlaylist.first]);
75 }
76 _playNextInPlaylist = false;
77 }
78
79 return true;
80}
81
84
85 DIVIDE_ASSERT(_api != nullptr, "SFXDevice error: playSound called without init!");
86
87 _api->playSound(sound);
88}
89
90void SFXDevice::addMusic(const U32 playlistEntry, const Handle<AudioDescriptor> music) {
91 auto& [crtPlaylistIndex, songs] = _musicPlaylists[playlistEntry];
92 songs.push_back(music);
93 crtPlaylistIndex = 0;
94}
95
96bool SFXDevice::playMusic(const U32 playlistEntry) {
97 const MusicPlaylists::iterator it = _musicPlaylists.find(playlistEntry);
98 if (it != std::cend(_musicPlaylists)) {
99 return playMusic(it->second);
100 }
101
102 return false;
103}
104
105bool SFXDevice::playMusic(const MusicPlaylist& playlist) {
107
108 if (!playlist.second.empty()) {
109 _currentPlaylist = playlist;
110 _api->playMusic(_currentPlaylist.second[_currentPlaylist.first]);
111 return true;
112 }
113
114 return false;
115}
116
119
120 _api->playMusic(music);
121}
122
124 DIVIDE_ASSERT(_api != nullptr, "SFXDevice error: pauseMusic called without init!");
125
126 _api->pauseMusic();
127}
128
130 DIVIDE_ASSERT(_api != nullptr, "SFXDevice error: stopMusic called without init!");
131
132 _api->stopMusic();
133}
134
136 DIVIDE_ASSERT(_api != nullptr, "SFXDevice error: stopAllSounds called without init!");
137
138 _api->stopAllSounds();
139}
140
141void SFXDevice::setMusicVolume(const I8 value) {
142 DIVIDE_ASSERT(_api != nullptr, "SFXDevice error: setMusicVolume called without init!");
143
144 _api->setMusicVolume(value);
145}
146
147void SFXDevice::setSoundVolume(const I8 value) {
148 DIVIDE_ASSERT(_api != nullptr, "SFXDevice error: setSoundVolume called without init!");
149
150 _api->setSoundVolume(value);
151}
152
154 _playNextInPlaylist = true;
155}
156
159 _musicPlaylists.clear();
160}
161
162}; //namespace Divide
#define LOCALE_STR(X)
Definition: Localization.h:91
#define DIVIDE_ASSERT(...)
#define NOP()
#define PROFILE_SCOPE_AUTO(CATEGORY)
Definition: Profiler.h:87
Audio Programming Interface.
std::pair< U32, vector< Handle< AudioDescriptor > > > MusicPlaylist
AudioAPIWrapper_uptr _api
Definition: SFXDevice.h:91
void addMusic(U32 playlistEntry, Handle< AudioDescriptor > music)
Definition: SFXDevice.cpp:90
void playMusic(Handle< AudioDescriptor > music) override
Definition: SFXDevice.cpp:117
MusicPlaylist _currentPlaylist
Definition: SFXDevice.h:88
void setMusicVolume(I8 value) override
Definition: SFXDevice.cpp:141
~SFXDevice() override
Definition: SFXDevice.cpp:21
void playSound(Handle< AudioDescriptor > sound) override
Definition: SFXDevice.cpp:82
ErrorCode initAudioAPI() override
Definition: SFXDevice.cpp:26
void stopMusic() override
Definition: SFXDevice.cpp:129
std::atomic_bool _playNextInPlaylist
Definition: SFXDevice.h:92
bool frameStarted(const FrameEvent &evt) override
Definition: SFXDevice.cpp:65
MusicPlaylists _musicPlaylists
Definition: SFXDevice.h:87
void stopAllSounds() override
Definition: SFXDevice.cpp:135
void pauseMusic() override
Definition: SFXDevice.cpp:123
void musicFinished() noexcept override
Definition: SFXDevice.cpp:153
void setSoundVolume(I8 value) override
Definition: SFXDevice.cpp:147
void closeAudioAPI() override
Definition: SFXDevice.cpp:51
constexpr Optick::Category::Type Sound
Definition: Profiler.h:61
Handle console commands that start with a forward slash.
Definition: AIProcessor.cpp:7
uint32_t U32
static NO_INLINE void errorfn(const char *format, T &&... args)