1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#include "Sound_Player.h"
#include "Buzzer.h"
SoundPlayCtrlStruct SoundPlayCtrl;
void Sound_Player_Init(void)
{
SoundPlayCtrl.Playing = SND_SRC_NONE; //加载要播放的声音
SoundPlayCtrl.Timer = 0;
SoundPlayCtrl.Cycle = 0;
SoundPlayCtrl.Status = SND_PLAYER_IDLE;
SoundPlayCtrl.VolInit = 1;
Buzzer_Start_Up();
}
uint8_t Sound_Play(uint8_t SoundID)
{
if (SoundPlayCtrl.VolInit) //首次播放时初始化音量
{
SoundPlayCtrl.VolInit = 0;
}
if (SoundID < SND_TOTAL_NUM)
{
if (SoundPlayCtrl.Status != SND_PLAYER_IDLE) //如果有声音正在播放,则返回播放失败
return 1;
SoundPlayCtrl.Playing = SoundID; //加载要播放的声音
SoundPlayCtrl.Timer = 0;
SoundPlayCtrl.Cycle = SndAttributeTable[SoundID].Cycle;
SoundPlayCtrl.Status = SND_PLAYER_PLAY_REQ;
return 0; //返回播放成功
}
else
return 2; //返回错误状态
}
uint8_t Sound_Stop(uint8_t SoundID)
{
if (SoundID < SND_TOTAL_NUM)
{
if ((SoundPlayCtrl.Status == SND_PLAYER_IDLE) ||
(SoundPlayCtrl.Playing != SoundID)) //如果播放器已停止播放或正在播放的声音不是请求停止播放的声音
return 0; //返回停止成功
if (SoundPlayCtrl.Status == SND_PLAYER_PLAY_REQ) //请求停止播放的声音是刚请求播放的声音
{
SoundPlayCtrl.Playing = SND_SRC_NONE;
SoundPlayCtrl.Timer = 0;
SoundPlayCtrl.Cycle = 0;
SoundPlayCtrl.Status = SND_PLAYER_IDLE; //取消播放请求
return 0; //返回停止成功
}
SoundPlayCtrl.Status = SND_PLAYER_STOP_REQ; //请求停止播放声音
return 1; //返回停止失败
}
else
return 2; //返回错误状态
}
void Sound_Clear(void)
{
if (SoundPlayCtrl.Status == SND_PLAYER_IDLE)
return;
else if (SoundPlayCtrl.Status == SND_PLAYER_PLAY_REQ)
{
SoundPlayCtrl.Playing = SND_SRC_NONE;
SoundPlayCtrl.Timer = 0;
SoundPlayCtrl.Cycle = 0;
SoundPlayCtrl.Status = SND_PLAYER_IDLE; //取消播放请求
return;
}
else
{
if (SoundPlayCtrl.Playing < SND_TOTAL_NUM)
{
if (SndAttributeTable[SoundPlayCtrl.Playing].Mode == SND_MODE_SINGLE)
Buzzer_Stop_Play();
else
;
}
SoundPlayCtrl.Playing = SND_SRC_NONE;
SoundPlayCtrl.Timer = 0;
SoundPlayCtrl.Cycle = 0;
SoundPlayCtrl.Status = SND_PLAYER_IDLE; //取消播放请求
}
}
uint8_t Sound_Priority_Query(uint8_t SoundID)
{
if (SoundID == SND_SRC_CURRENT)
{
if (SoundPlayCtrl.Playing < SND_TOTAL_NUM)
return SndAttributeTable[SoundPlayCtrl.Playing].Priority;
else
return 0xFF;
}
else if (SoundID < SND_TOTAL_NUM)
return SndAttributeTable[SoundID].Priority;
else
return 0xFF;
}
// 10ms
void Sound_Play_Service(void)
{
if (SoundPlayCtrl.Status == SND_PLAYER_IDLE)
return;
if (SoundPlayCtrl.Timer >= 10)
SoundPlayCtrl.Timer -= 10;
else if (SoundPlayCtrl.Timer > 0)
SoundPlayCtrl.Timer = 0;
if ((SoundPlayCtrl.Status == SND_PLAYER_PLAYING) || (SoundPlayCtrl.Status == SND_PLAYER_PLAY_REQ))
{
if (SoundPlayCtrl.Timer == 0)
{
if (SoundPlayCtrl.Cycle == 0)
{
if (SoundPlayCtrl.Playing < SND_TOTAL_NUM)
{
if (SndAttributeTable[SoundPlayCtrl.Playing].Mode != SND_MODE_SINGLE)
Buzzer_Stop_Play();
}
SoundPlayCtrl.Playing = SND_SRC_NONE;
SoundPlayCtrl.Status = SND_PLAYER_IDLE;
}
else
{
if (SoundPlayCtrl.Playing < SND_TOTAL_NUM)
{
if (SndAttributeTable[SoundPlayCtrl.Playing].Mode == SND_MODE_SINGLE)
Buzzer_Play_Track(SndAttributeTable[SoundPlayCtrl.Playing].Index);
else
{
if (SoundPlayCtrl.Status == SND_PLAYER_PLAY_REQ)
Buzzer_Repeat_Play_Track(SndAttributeTable[SoundPlayCtrl.Playing].Index);
}
SoundPlayCtrl.Timer = SndAttributeTable[SoundPlayCtrl.Playing].Period;
SoundPlayCtrl.Status = SND_PLAYER_PLAYING;
if (SoundPlayCtrl.Cycle != SND_CYCLE_NONSTOP)
SoundPlayCtrl.Cycle--;
}
else
{
SoundPlayCtrl.Playing = SND_SRC_NONE;
SoundPlayCtrl.Cycle = 0;
SoundPlayCtrl.Status = SND_PLAYER_IDLE; //取消播放请求
}
}
}
}
else //当前声音被请求停止播放
{
if (SoundPlayCtrl.Playing < SND_TOTAL_NUM)
{
if (SndAttributeTable[SoundPlayCtrl.Playing].Mode != SND_MODE_SINGLE)
{
Buzzer_Stop_Play();
SoundPlayCtrl.Playing = SND_SRC_NONE;
SoundPlayCtrl.Cycle = 0;
SoundPlayCtrl.Status = SND_PLAYER_IDLE;
}
else
{
if (SoundPlayCtrl.Timer == 0)
{
SoundPlayCtrl.Playing = SND_SRC_NONE;
SoundPlayCtrl.Cycle = 0;
SoundPlayCtrl.Status = SND_PLAYER_IDLE;
}
}
}
}
}