V-Gears 0
Free Final Fantasy VII engine.
AudioManager.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2022 The V-Gears Team
3 *
4 * This file is part of V-Gears
5 *
6 * V-Gears is free software: you can redistribute it and/or modify it under
7 * terms of the GNU General Public License as published by the Free Software
8 * Foundation, version 3.0 (GPLv3) of the License.
9 *
10 * V-Gears is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 */
15
16#pragma once
17
18#include <OgreSingleton.h>
19#include <boost/thread.hpp>
20#include <vorbis/vorbisfile.h>
21#include "Manager.h"
22
23// Include OpenAL
24#if defined(__WIN32__) || defined(_WIN32)
25 #include <al.h>
26 #include <alc.h>
27#else
28 #include <AL/al.h>
29 #include <AL/alc.h>
30#endif
31
39class AudioManager : public Manager, public Ogre::Singleton<AudioManager>{
40
41 public:
42
48 struct Music{
49
54
59
63 float loop;
64 };
65
71 struct Sound{
72
77
82 };
83
88
92 virtual ~AudioManager();
93
97 void operator()();
98
104 void Input(const VGears::Event& event) override;
105
109 void UpdateDebug() override;
110
114 void OnResize() override;
115
121 void ClearField() override;
122
128 void ClearBattle() override;
129
135 void ClearWorld() override;
136
144 void MusicPause();
145
152 void MusicResume();
153
161 void ScriptPlayMusic(const char* name);
162
173 void MusicPlay(const Ogre::String& name);
174
182 void ScriptPlaySound(const char* name);
183
192 void ScriptPlaySound(const char* name, const int channel);
193
204 void ScriptPlaySounds(
205 const char* name1, const char* name2, const char* name3, const char* name4
206 );
207
213 void SoundPlay(const Ogre::String& name);
214
221 void MusicStop();
222
228 void AddMusic(const AudioManager::Music& music);
229
237
243 void AddSound(const AudioManager::Sound& sound);
244
252
259 void AddTrack(const int id, const int track_id);
260
267 int ScriptGetTrack(int id);
268
275
283 void ScriptSetBattleTrack(int id);
284
285 private:
286
290 class Player{
291
292 public:
298 Player(boost::recursive_mutex* mutex);
299
303 ~Player();
304
308 void Pause();
309
315 void Play(const Ogre::String& file);
316
322 void Resume();
323
327 void Stop();
328
334 void SetLoop(const float loop);
335
341 void Update();
342
349 float GetPosition();
350
351 private:
352
356 boost::recursive_mutex* update_mutex_;
357
361 float loop_;
362
367
371 OggVorbis_File vorbis_file_;
372
376 vorbis_info* vorbis_info_;
377
382
387
391 char* buffer_;
392
396 ALuint source_;
397
403 ALsizei FillBuffer();
404 };
405
411 const bool Init();
412
419 const char* ALError();
420
427 const char* ALCError( const ALCdevice* device );
428
432 void UpdateField() override;
433
437 void UpdateBattle() override;
438
442 void UpdateWorld() override;
443
448
452 ALCdevice* al_device_;
453
457 ALCcontext* al_context_;
458
464 char* buffer_;
465
469 boost::recursive_mutex update_mutex_;
470
474 boost::thread* update_thread_;
475
480
485
490
495
499 std::list<AudioManager::Music> music_list_;
500
504 std::unordered_map<unsigned int, unsigned int> tracks_;
505
510
514 std::list<AudioManager::Sound> sound_list_;
515
523 static ALsizei channel_buffer_size_;
524
531};
An audio player.
Definition: AudioManager.h:290
float loop_
Loop point for the current track.
Definition: AudioManager.h:361
bool stream_finished_
Indicates if the stream is finished.
Definition: AudioManager.h:386
void Play(const Ogre::String &file)
Plays an audio file.
Definition: AudioManager.cpp:287
void Stop()
Stops the audio player.
Definition: AudioManager.cpp:330
void Pause()
Pauses the player.
Definition: AudioManager.cpp:274
float GetPosition()
Get the playing position of the current track.
Definition: AudioManager.cpp:432
int vorbis_section_
Section of the track.
Definition: AudioManager.h:381
void Resume()
Resumes the playback of a paused player.
Definition: AudioManager.cpp:279
~Player()
Destructor.
Definition: AudioManager.cpp:272
OggVorbis_File vorbis_file_
File played or to play.
Definition: AudioManager.h:371
vorbis_info * vorbis_info_
Info about the track.
Definition: AudioManager.h:376
boost::recursive_mutex * update_mutex_
Mutex to handle concurrent update on the player.
Definition: AudioManager.h:356
Player(boost::recursive_mutex *mutex)
Constructor.
Definition: AudioManager.cpp:267
ALuint source_
Audio source.
Definition: AudioManager.h:396
char * buffer_
Audio buffer.
Definition: AudioManager.h:391
void Update()
Updates the audio player.
Definition: AudioManager.cpp:357
void SetLoop(const float loop)
Sets the loop for the current track.
Definition: AudioManager.cpp:352
Ogre::String file_
Name of the file currently being played.
Definition: AudioManager.h:366
ALsizei FillBuffer()
Fills the audio buffer.
Definition: AudioManager.cpp:398
The audio manager.
Definition: AudioManager.h:39
void SoundPlay(const Ogre::String &name)
Plays a sound.
Definition: AudioManager.cpp:146
void MusicPlay(const Ogre::String &name)
Plays a music track.
Definition: AudioManager.cpp:125
void ScriptSetBattleTrack(int id)
Sets the music track for upcoming battles.
Definition: AudioManager.cpp:234
void ClearBattle() override
Clears all battle information in the audio manager.
Definition: AudioManager.cpp:104
std::unordered_map< unsigned int, unsigned int > tracks_
IDs of the music tracks of the current content (field or world map).
Definition: AudioManager.h:504
void ClearField() override
Clears all field information in the audio manager.
Definition: AudioManager.cpp:102
void UpdateWorld() override
Updates the audio manager while on the world map.
Definition: AudioManager.cpp:248
int battle_track_
ID of the track for the current battle.
Definition: AudioManager.h:509
AudioManager::Music * GetMusic(const Ogre::String &name)
Retrieves a music track by name.
Definition: AudioManager.cpp:209
void Input(const VGears::Event &event) override
Handles an input event.
Definition: AudioManager.cpp:96
ALCcontext * al_context_
Audio context.
Definition: AudioManager.h:457
boost::thread * update_thread_
Thread to handle concurrent operations.
Definition: AudioManager.h:474
bool initialized_
Indicates if the audio manager has been initialized.
Definition: AudioManager.h:447
char * buffer_
Audio buffer.
Definition: AudioManager.h:464
void ClearWorld() override
Clears all world map information in the audio manager.
Definition: AudioManager.cpp:106
std::list< AudioManager::Music > music_list_
List of music.
Definition: AudioManager.h:499
void ScriptPlaySounds(const char *name1, const char *name2, const char *name3, const char *name4)
Plays up to 4 sounds, in 4 different channels.
Definition: AudioManager.cpp:166
int ScriptGetBattleTrack()
Retrieves the music ID for the current or next battle.
Definition: AudioManager.cpp:232
void UpdateBattle() override
Updates the audio manager while on a battle.
Definition: AudioManager.cpp:242
AudioManager::Player music_
Music player for either fields or world map.
Definition: AudioManager.h:484
void MusicResume()
resumes currently paused music.
Definition: AudioManager.cpp:114
void UpdateDebug() override
Updates the audio manager with debug information.
Definition: AudioManager.cpp:98
const bool Init()
Initializes the audio manager.
void MusicPause()
Pauses currently playing music.
Definition: AudioManager.cpp:108
void AddTrack(const int id, const int track_id)
Adds a music track ID to the list of music tracks of the field.
Definition: AudioManager.cpp:223
int ScriptGetTrack(int id)
Retrieves the music ID for the specified track for a field or world map.
Definition: AudioManager.cpp:227
static ALsizei channel_buffer_size_
Size of a channel buffer.
Definition: AudioManager.h:523
void ScriptPlaySound(const char *name)
Plays a sound.
Definition: AudioManager.cpp:159
void AddSound(const AudioManager::Sound &sound)
Adds a sound to the audio manager.
Definition: AudioManager.cpp:194
const char * ALError()
Handles errors.
Definition: AudioManager.cpp:250
const char * ALCError(const ALCdevice *device)
Handles errors.
Definition: AudioManager.cpp:257
void AddMusic(const AudioManager::Music &music)
Adds a music track to the audio manager.
Definition: AudioManager.cpp:179
AudioManager::Player battle_music_
Music player for battles.
Definition: AudioManager.h:489
AudioManager::Player fx_
Sound effect player.
Definition: AudioManager.h:494
ALCdevice * al_device_
Audio output device.
Definition: AudioManager.h:452
void UpdateField() override
Updates the audio manager while on the field.
Definition: AudioManager.cpp:236
virtual ~AudioManager()
Destructor.
Definition: AudioManager.cpp:71
boost::recursive_mutex update_mutex_
Mutex to handle concurrent operations.
Definition: AudioManager.h:469
void ScriptPlayMusic(const char *name)
Plays a music track.
Definition: AudioManager.cpp:120
void operator()()
Used by boost libraries.
Definition: AudioManager.cpp:85
AudioManager()
Constructor.
Definition: AudioManager.cpp:33
std::list< AudioManager::Sound > sound_list_
List of music.
Definition: AudioManager.h:514
AudioManager::Sound * GetSound(const Ogre::String &name)
Retrieves a sound by name.
Definition: AudioManager.cpp:216
static int channel_buffer_number_
Number of buffers.
Definition: AudioManager.h:530
void OnResize() override
Handles resizing events.
Definition: AudioManager.cpp:100
void MusicStop()
Stops the currently playing music.
Definition: AudioManager.cpp:173
bool thread_continue_
Flag to indicate if the playback must continue.
Definition: AudioManager.h:479
A base manager.
Definition: Manager.h:24
Ogre::String String
Definition: TypeDefine.h:37
Music structure.
Definition: AudioManager.h:48
Ogre::String name
The name of the track.
Definition: AudioManager.h:53
Ogre::String file
Track filename.
Definition: AudioManager.h:58
float loop
Music loop location for continuous playback.
Definition: AudioManager.h:63
Music structure.
Definition: AudioManager.h:71
Ogre::String file
Sound filename.
Definition: AudioManager.h:81
Ogre::String name
The name of the sound.
Definition: AudioManager.h:76
An input event.
Definition: Event.h:84