如何确定网络音频源停止

时间:2019-03-30 02:33:50

标签: javascript web-audio

我有一个按钮,单击该按钮应停止播放音频。我第一次尝试并没有停止歌曲,所以我添加了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的完整代码分解。

1 个答案:

答案 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已停止并且不再发出任何声音。它将永远继续运行。