ShitEngine 1.4.2
基于 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
12// enable_shared_from_this:track 持 group 的 shared_ptr(m_groupOwner)拉长组生命周期,
13// 避免 AudioPlayer::destroy 先释放 group 后,仍被外部持有的 track 析构时访问已释放的组。
14class AudioTrackGroup : public std::enable_shared_from_this<AudioTrackGroup> {
15public:
16 ~AudioTrackGroup() = default;
17
18 void pauseAll();
19 void resumeAll();
20 void stopAll();
21 void setVolume(float gain);
22 float getVolume() const { return m_gain; }
23 const std::string& getName() const { return m_name; }
24
25private:
26 friend class AudioPlayer;
27 friend class AudioTrack;
28 AudioTrackGroup(const std::string& name) : m_name(name) {}
29 void registerTrack(AudioTrack* track);
30 void unregisterTrack(AudioTrack* track);
31
32 std::string m_name;
33 float m_gain = 1.0f;
34 std::vector<AudioTrack*> m_tracks;
35};
36
38public:
39 static inline bool Init() { return GetInstance().init(); }
40 static inline void Destroy() { GetInstance().destroy(); }
41 static inline void Update() { GetInstance().update(); }
42 static inline AudioTrackGroup* CreateTrackGroup(const std::string& name) {
43 return GetInstance().createTrackGroup(name);
44 }
45 static inline AudioTrackGroup* GetTrackGroup(const std::string& name) {
46 return GetInstance().getTrackGroup(name);
47 }
48
51 static inline std::shared_ptr<AudioTrack> Play(const std::string& filePath, const std::string& group = "default") {
52 auto& inst = GetInstance();
53 AudioTrackGroup* g = inst.getTrackGroup(group);
54 if (!g) {
55 ST_CORE_WARN("AudioPlayer::Play 指定的音频组 \"{}\" 不存在,将按无分组播放(不受该组音量/暂停控制)", group);
56 }
57 return inst.play(filePath, g);
58 }
59 static inline void SetMasterVolume(float gain) { GetInstance().setMasterVolume(gain); }
60 static inline float GetMasterVolume() { return GetInstance().m_masterGain; }
61 static inline void PauseAll() { GetInstance().pauseAll(); }
62 static inline void ResumeAll() { GetInstance().resumeAll(); }
63 static inline void StopAll() { GetInstance().stopAll(); }
64 static inline void ApplyTrackGain(AudioTrack* track, const AudioTrackGroup* group) {
65 GetInstance().applyTrackGain(track, group);
66 }
67
69
70 AudioPlayer(const AudioPlayer&) = delete;
74
75private:
76 friend class EngineContext;
77 AudioPlayer() = default;
78 ~AudioPlayer() = default;
79
80 bool init();
81 void destroy();
82 void update();
83 AudioTrackGroup* createTrackGroup(const std::string& name);
84 AudioTrackGroup* getTrackGroup(const std::string& name);
85 std::shared_ptr<AudioTrack> play(const std::string& filePath, AudioTrackGroup* group, int loopCount = 0);
86 void setMasterVolume(float gain);
87 void pauseAll();
88 void resumeAll();
89 void stopAll();
90 void applyTrackGain(AudioTrack* track, const AudioTrackGroup* group);
91
92 struct MIX_Mixer* m_mixer = nullptr;
93 bool m_isInited = false;
94 float m_masterGain = 1.0f;
95 std::unordered_map<std::string, std::shared_ptr<AudioTrackGroup>> m_groups;
96 std::vector<std::shared_ptr<AudioTrack>> m_tracks;
97};
98
99} // namespace Shit
#define SHIT_API
定义 Core.h:14
#define ST_CORE_WARN(...)
定义 Log.h:70
static AudioTrackGroup * GetTrackGroup(const std::string &name)
定义 AudioPlayer.h:45
static void Update()
定义 AudioPlayer.h:41
static void Destroy()
定义 AudioPlayer.h:40
AudioPlayer(const AudioPlayer &)=delete
AudioPlayer & operator=(const AudioPlayer &)=delete
static void ResumeAll()
定义 AudioPlayer.h:62
static AudioPlayer & GetInstance()
static void PauseAll()
定义 AudioPlayer.h:61
static AudioTrackGroup * CreateTrackGroup(const std::string &name)
定义 AudioPlayer.h:42
static void SetMasterVolume(float gain)
定义 AudioPlayer.h:59
static void ApplyTrackGain(AudioTrack *track, const AudioTrackGroup *group)
定义 AudioPlayer.h:64
AudioPlayer(AudioPlayer &&)=delete
static std::shared_ptr< AudioTrack > Play(const std::string &filePath, const std::string &group="default")
播放音频,返回共享句柄。播放结束后引擎自动回收资源; 调用方保存返回值可安全持有(track 播完后 isFinished()==true, 但对象不会悬垂——引擎释放的是自己的引用,调用方持有期间对象...
定义 AudioPlayer.h:51
friend class EngineContext
定义 AudioPlayer.h:76
static void StopAll()
定义 AudioPlayer.h:63
AudioPlayer & operator=(AudioPlayer &&)=delete
static float GetMasterVolume()
定义 AudioPlayer.h:60
static bool Init()
定义 AudioPlayer.h:39
定义 AudioPlayer.h:14
const std::string & getName() const
定义 AudioPlayer.h:23
friend class AudioPlayer
定义 AudioPlayer.h:26
~AudioTrackGroup()=default
void setVolume(float gain)
float getVolume() const
定义 AudioPlayer.h:22
friend class AudioTrack
定义 AudioPlayer.h:27
定义 AudioTrack.h:13
定义 AnimationClip.h:12