Skip to content

Commit 61e6e90

Browse files
committed
feat: 添加音频控制功能,支持停止 reminderQueue 中的音频播放
1 parent cfdb019 commit 61e6e90

File tree

4 files changed

+47
-6
lines changed

4 files changed

+47
-6
lines changed

exam/Scripts/audioController.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,15 @@ var audioController = (function() {
7676
audio.currentTime = 0;
7777
} catch (e) {}
7878
});
79+
// 停止reminderQueue中audioCache的所有音频
80+
if (window.audioCache) {
81+
Object.values(window.audioCache).forEach(audio => {
82+
try {
83+
audio.pause();
84+
audio.currentTime = 0;
85+
} catch (e) {}
86+
});
87+
}
7988
}
8089

8190
function getAudioSrc(type) {
@@ -156,3 +165,5 @@ var audioController = (function() {
156165

157166
audioController.init();
158167
window.audioController = audioController;
168+
// 兼容reminderQueue的audioCache全局停止
169+
if (typeof window.audioCache === 'undefined') window.audioCache = {};

exam/Scripts/reminderQueue.js

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
var reminderQueue = (function() {
33
var queue = [];
44
var audioCache = {};
5+
var currentAudio = null; // 当前正在播放的音频对象
6+
var isStopped = false; // 标记是否已停止提醒
57

68
function addReminder(reminder) {
79
queue.push(reminder);
@@ -12,6 +14,10 @@ var reminderQueue = (function() {
1214
}
1315

1416
function processQueue() {
17+
if (isStopped) {
18+
setTimeout(processQueue, 1000);
19+
return;
20+
}
1521
var now = Date.now();
1622
while (queue.length > 0 && queue[0].time <= now) {
1723
var reminder = queue.shift();
@@ -21,10 +27,18 @@ var reminderQueue = (function() {
2127
}
2228

2329
function executeReminder(reminder) {
30+
stop(); // 确保不会有多个音频同时播放
31+
var audioObj = null;
2432
if (audioCache[reminder.audio]) {
25-
audioCache[reminder.audio].play();
33+
audioObj = audioCache[reminder.audio];
2634
} else if (audioController.getAudioSrc(reminder.audio)) {
27-
audioController.play(reminder.audio);
35+
audioObj = new Audio(audioController.getAudioSrc(reminder.audio));
36+
audioCache[reminder.audio] = audioObj;
37+
}
38+
if (audioObj) {
39+
currentAudio = audioObj;
40+
currentAudio.currentTime = 0;
41+
currentAudio.play();
2842
} else {
2943
errorSystem.show('音频文件不存在: ' + reminder.audio, 'error');
3044
}
@@ -37,9 +51,25 @@ var reminderQueue = (function() {
3751
}
3852
}
3953

54+
function stop() {
55+
isStopped = true;
56+
if (currentAudio) {
57+
try {
58+
currentAudio.pause();
59+
currentAudio.currentTime = 0;
60+
} catch (e) {}
61+
currentAudio = null;
62+
}
63+
// 1秒后允许继续处理队列(防止误触)
64+
setTimeout(function() {
65+
isStopped = false;
66+
}, 1000);
67+
}
68+
4069
return {
4170
addReminder: addReminder,
42-
processQueue: processQueue
71+
processQueue: processQueue,
72+
stop: stop
4373
};
4474
})();
4575

exam/Scripts/reminderSettings.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -366,8 +366,8 @@ document.addEventListener("DOMContentLoaded", () => {
366366
const stopAudioBtn = document.getElementById('stop-audio-btn');
367367
if (stopAudioBtn) {
368368
stopAudioBtn.addEventListener('click', function() {
369-
if (window.audioController && typeof window.audioController.stop === 'function') {
370-
window.audioController.stop();
369+
if (window.reminderQueue && typeof window.reminderQueue.stop === 'function') {
370+
window.reminderQueue.stop();
371371
}
372372
});
373373
}

exam/exam_config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
{
4242
"name": "地理",
4343
"start": "2025-06-25T16:10:00",
44-
"end": "2025-06-25T17:40:00"
44+
"end": "2025-07-01T17:40:00"
4545
}
4646
]
4747
}

0 commit comments

Comments
 (0)