ShitEngine
1.4.2
基于 C++20 与 SDL3 的轻量级 2D 游戏引擎
Toggle main menu visibility
载入中...
搜索中...
未找到
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
10
namespace
Shit
{
11
12
// enable_shared_from_this:track 持 group 的 shared_ptr(m_groupOwner)拉长组生命周期,
13
// 避免 AudioPlayer::destroy 先释放 group 后,仍被外部持有的 track 析构时访问已释放的组。
14
class
AudioTrackGroup :
public
std::enable_shared_from_this<AudioTrackGroup> {
15
public
:
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
25
private
:
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
37
class
SHIT_API
AudioPlayer
{
38
public
:
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
68
static
AudioPlayer
&
GetInstance
();
69
70
AudioPlayer
(
const
AudioPlayer
&) =
delete
;
71
AudioPlayer
&
operator=
(
const
AudioPlayer
&) =
delete
;
72
AudioPlayer
(
AudioPlayer
&&) =
delete
;
73
AudioPlayer
&
operator=
(
AudioPlayer
&&) =
delete
;
74
75
private
:
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
AudioTrack.h
Core.h
SHIT_API
#define SHIT_API
定义
Core.h:14
Log.h
ST_CORE_WARN
#define ST_CORE_WARN(...)
定义
Log.h:70
Shit::AudioPlayer::GetTrackGroup
static AudioTrackGroup * GetTrackGroup(const std::string &name)
定义
AudioPlayer.h:45
Shit::AudioPlayer::Update
static void Update()
定义
AudioPlayer.h:41
Shit::AudioPlayer::Destroy
static void Destroy()
定义
AudioPlayer.h:40
Shit::AudioPlayer::AudioPlayer
AudioPlayer(const AudioPlayer &)=delete
Shit::AudioPlayer::operator=
AudioPlayer & operator=(const AudioPlayer &)=delete
Shit::AudioPlayer::ResumeAll
static void ResumeAll()
定义
AudioPlayer.h:62
Shit::AudioPlayer::GetInstance
static AudioPlayer & GetInstance()
Shit::AudioPlayer::PauseAll
static void PauseAll()
定义
AudioPlayer.h:61
Shit::AudioPlayer::CreateTrackGroup
static AudioTrackGroup * CreateTrackGroup(const std::string &name)
定义
AudioPlayer.h:42
Shit::AudioPlayer::SetMasterVolume
static void SetMasterVolume(float gain)
定义
AudioPlayer.h:59
Shit::AudioPlayer::ApplyTrackGain
static void ApplyTrackGain(AudioTrack *track, const AudioTrackGroup *group)
定义
AudioPlayer.h:64
Shit::AudioPlayer::AudioPlayer
AudioPlayer(AudioPlayer &&)=delete
Shit::AudioPlayer::Play
static std::shared_ptr< AudioTrack > Play(const std::string &filePath, const std::string &group="default")
播放音频,返回共享句柄。播放结束后引擎自动回收资源; 调用方保存返回值可安全持有(track 播完后 isFinished()==true, 但对象不会悬垂——引擎释放的是自己的引用,调用方持有期间对象...
定义
AudioPlayer.h:51
Shit::AudioPlayer::EngineContext
friend class EngineContext
定义
AudioPlayer.h:76
Shit::AudioPlayer::StopAll
static void StopAll()
定义
AudioPlayer.h:63
Shit::AudioPlayer::operator=
AudioPlayer & operator=(AudioPlayer &&)=delete
Shit::AudioPlayer::GetMasterVolume
static float GetMasterVolume()
定义
AudioPlayer.h:60
Shit::AudioPlayer::Init
static bool Init()
定义
AudioPlayer.h:39
Shit::AudioTrackGroup
定义
AudioPlayer.h:14
Shit::AudioTrackGroup::getName
const std::string & getName() const
定义
AudioPlayer.h:23
Shit::AudioTrackGroup::stopAll
void stopAll()
Shit::AudioTrackGroup::resumeAll
void resumeAll()
Shit::AudioTrackGroup::AudioPlayer
friend class AudioPlayer
定义
AudioPlayer.h:26
Shit::AudioTrackGroup::pauseAll
void pauseAll()
Shit::AudioTrackGroup::~AudioTrackGroup
~AudioTrackGroup()=default
Shit::AudioTrackGroup::setVolume
void setVolume(float gain)
Shit::AudioTrackGroup::getVolume
float getVolume() const
定义
AudioPlayer.h:22
Shit::AudioTrackGroup::AudioTrack
friend class AudioTrack
定义
AudioPlayer.h:27
Shit::AudioTrack
定义
AudioTrack.h:13
Shit
定义
AnimationClip.h:12
include
ShitEngine
Audio
AudioPlayer.h
制作者
1.17.0