ShitEngine
基于 C++20 与 SDL3 的轻量级 2D 游戏引擎
载入中...
搜索中...
未找到
AudioPlayer.h
浏览该文件的文档.
1#pragma once
2#include "../Core/Core.h"
3#include "../Core/Log.h"
4#include "AudioTrack.h"
5#include <string>
6#include <unordered_map>
7#include <memory>
8#include <vector>
9
10namespace Shit {
11
12class AudioTrackGroup {
13public:
14 ~AudioTrackGroup() = default;
15
16 void pauseAll();
17 void resumeAll();
18 void stopAll();
19 void setVolume(float gain);
20 float getVolume() const { return m_gain; }
21 const std::string& getName() const { return m_name; }
22
23private:
24 friend class AudioPlayer;
25 friend class AudioTrack;
26 AudioTrackGroup(const std::string& name) : m_name(name) {}
27 void registerTrack(AudioTrack* track);
28 void unregisterTrack(AudioTrack* track);
29
30 std::string m_name;
31 float m_gain = 1.0f;
32 std::vector<AudioTrack*> m_tracks;
33};
34
36public:
37 static inline bool Init() { return GetInstance().init(); }
38 static inline void Destroy() { GetInstance().destroy(); }
39 static inline void Update() { GetInstance().update(); }
40 static inline AudioTrackGroup* CreateTrackGroup(const std::string& name) {
41 return GetInstance().createTrackGroup(name);
42 }
43 static inline AudioTrackGroup* GetTrackGroup(const std::string& name) {
44 return GetInstance().getTrackGroup(name);
45 }
46 static inline AudioTrack* Play(const std::string& filePath, const std::string& group = "default") {
47 auto& inst = GetInstance();
48 AudioTrackGroup* g = inst.getTrackGroup(group);
49 if (!g) {
50 ST_CORE_WARN("AudioPlayer::Play 指定的音频组 \"{}\" 不存在,将按无分组播放(不受该组音量/暂停控制)", group);
51 }
52 return inst.play(filePath, g);
53 }
54 static inline void SetMasterVolume(float gain) { GetInstance().setMasterVolume(gain); }
55 static inline float GetMasterVolume() { return GetInstance().m_masterGain; }
56 static inline void PauseAll() { GetInstance().pauseAll(); }
57 static inline void ResumeAll() { GetInstance().resumeAll(); }
58 static inline void StopAll() { GetInstance().stopAll(); }
59 static inline void ApplyTrackGain(AudioTrack* track, const AudioTrackGroup* group) {
60 GetInstance().applyTrackGain(track, group);
61 }
62
64
65 AudioPlayer(const AudioPlayer&) = delete;
69
70private:
71 friend class EngineContext;
72 AudioPlayer() = default;
73 ~AudioPlayer() = default;
74
75 bool init();
76 void destroy();
77 void update();
78 AudioTrackGroup* createTrackGroup(const std::string& name);
79 AudioTrackGroup* getTrackGroup(const std::string& name);
80 AudioTrack* play(const std::string& filePath, AudioTrackGroup* group, int loopCount = 0);
81 void setMasterVolume(float gain);
82 void pauseAll();
83 void resumeAll();
84 void stopAll();
85 void applyTrackGain(AudioTrack* track, const AudioTrackGroup* group);
86
87 struct MIX_Mixer* m_mixer = nullptr;
88 bool m_isInited = false;
89 float m_masterGain = 1.0f;
90 std::unordered_map<std::string, std::unique_ptr<AudioTrackGroup>> m_groups;
91 std::vector<std::unique_ptr<AudioTrack>> m_tracks;
92};
93
94} // namespace Shit
#define SHIT_API
定义 Core.h:14
#define ST_CORE_WARN(...)
定义 Log.h:52
static AudioTrack * Play(const std::string &filePath, const std::string &group="default")
定义 AudioPlayer.h:46
static AudioTrackGroup * GetTrackGroup(const std::string &name)
定义 AudioPlayer.h:43
static void Update()
定义 AudioPlayer.h:39
static void Destroy()
定义 AudioPlayer.h:38
AudioPlayer(const AudioPlayer &)=delete
AudioPlayer & operator=(const AudioPlayer &)=delete
static void ResumeAll()
定义 AudioPlayer.h:57
static AudioPlayer & GetInstance()
static void PauseAll()
定义 AudioPlayer.h:56
static AudioTrackGroup * CreateTrackGroup(const std::string &name)
定义 AudioPlayer.h:40
static void SetMasterVolume(float gain)
定义 AudioPlayer.h:54
static void ApplyTrackGain(AudioTrack *track, const AudioTrackGroup *group)
定义 AudioPlayer.h:59
AudioPlayer(AudioPlayer &&)=delete
friend class EngineContext
定义 AudioPlayer.h:71
static void StopAll()
定义 AudioPlayer.h:58
AudioPlayer & operator=(AudioPlayer &&)=delete
static float GetMasterVolume()
定义 AudioPlayer.h:55
static bool Init()
定义 AudioPlayer.h:37
定义 AudioPlayer.h:12
const std::string & getName() const
定义 AudioPlayer.h:21
friend class AudioPlayer
定义 AudioPlayer.h:24
~AudioTrackGroup()=default
void setVolume(float gain)
float getVolume() const
定义 AudioPlayer.h:20
friend class AudioTrack
定义 AudioPlayer.h:25
定义 AudioTrack.h:12
定义 AudioPlayer.h:10