我有一个按钮,单击该按钮应停止播放音频。我第一次尝试并没有停止歌曲,所以我添加了while语句。现在,它不仅不会停止歌曲,而且while还会重复循环并冻结页面。仅当它是第一首歌曲时才会发生这种情况(IE:自动播放被chrome阻止,因此单击除stop以外的任何内容都可以通过playNext()进行路由;并且从那里可以正常工作。)
所以说您单击“下一步”或“最后一个”开始播放歌曲。如果您在第二首歌曲之前单击停止,它将继续播放。如果用户单击下一步,则它会播放两首歌曲,并且停止播放仅适用于第二首歌曲。
playStop();不会阻止它的。
//Controls
//Play A Song Again
function playLast() {
if (context.state == 'running') {
sourceNode.stop(0);
}
console.log(data);
code = 0;
if (lastData == null) {
playNext();
} else {
codeRoute();
}
}
//Stop Playing
function playStop(){
code = 2;
while (context.state == 'running') {
sourceNode.stop(0);
}
}
//Play Next Song
//Step 1
function playNext(){
if(context.state == 'running'){
code =0;
playFunct();
}else{
code =1;//0; to play last song.
console.log(code)
codeRoute();
}
}
如果您需要的信息比上述更多,请针对文件执行的每个步骤将on this page的完整代码分解。
答案 0 :(得分:0)
我认为问题是您为每个AudioBufferSourceNode存储了相同的全局sourceNode
变量。通过执行sourceNode = context.createBufferSource();
将新的AudioBufferSourceNode分配给相同的变量时,您实际上会失去对先前创建的AudioBufferSourceNode的任何引用。但这并不意味着它将停止播放。这只是意味着您无法停止它。
据我所知,通过阅读引用的源代码partOne()
将在页面加载时执行。如果http请求成功,将调用playFirst()
并将创建并启动第一个AudioBufferSourceNode。当自动播放阻止您的站点时,将不会发出声音,但仍计划将AudioBufferSourceNode恢复为AudioContext。
如果我正确理解了您的代码,它将在用户互动时调用playFunct()
以恢复AudioContext。如果发生这种情况,它将创建并启动一个新的AudioBufferSourceNode。同时,您松开对以前创建的AudioBufferSourceNode的任何引用,随着AudioContext的恢复,该引用现在也将开始播放。
一种蛮力的解决方案是,只要创建新的AudioBufferSourceNode,就确保它停止了。像这样创建AudioBufferSourceNode之前只需追加一行。
if (sourceNode) {
sourceNode.stop();
}
sourceNode = context.createBufferSource();
不过,最好重构代码以仅在必要时调用它。
这与问题的答案没有任何关系,但是在您的初始代码示例中,您希望在停止AudioBufferSourceNode时AudioContext的状态发生变化。实际上并非如此。除非您调用suspend()
或close()
,否则AudioContext会继续运行,即使每个关联的AudioBufferSourceNode已停止并且不再发出任何声音。它将永远继续运行。