网络音频缓冲奇怪的行为

ja.*_*ja. 6 audio buffer web web-audio-api

这里发生了一些奇怪的事情.我创建了一个音频缓冲区,将其存储在变量中并尝试重复使用它几次 - 但它似乎已损坏

我做了一些按钮

    <button onclick="play();">play(0)</button>
    <button onclick="playsection();">play section</button>
    <button onclick="stop();">stop()</button>
Run Code Online (Sandbox Code Playgroud)

获取一些音频数据

context = new AudioContext();

var getWav = new XMLHttpRequest();
var wavbuf;

getWav.open("GET", "/wav/test.wav", true);
getWav.responseType = "arraybuffer";

getWav.onload = function() {
    context.decodeAudioData(getWav.response, function(buffer){
    wavbuf = buffer;
    });
}

getWav.send();

var p;
Run Code Online (Sandbox Code Playgroud)

我可以多次评估play()而不会出错

function play(){
    p = context.createBufferSource();
    p.buffer = wavbuf;
    p.connect(context.destination);
    p.start(0);
}
Run Code Online (Sandbox Code Playgroud)

如果我 停止(10)评估之前按下停止,则playsection似乎只能工作一次 - 或偶尔不止一次

function playsection(){
    p = context.createBufferSource();
    p.buffer = wavbuf;
    p.connect(context.destination);
    p.start(0, 6); // start after 6 seconds 
    p.stop(10);    // stop after 10 seconds 
}


function stop(){
    p.stop();
}
Run Code Online (Sandbox Code Playgroud)

看起来像p.buffer = wavbuf创建一个指向缓冲区而不是副本的指针

这是一个错误还是一个功能?

kte*_*tec 1

所以这很有趣,它会连续播放该部分而不会停止:

function playsection(){
    p = context.createBufferSource();
    p.buffer = wavbuf;
    p.connect(context.destination);
    p.start(0, 6); // start after 6 seconds 
}
Run Code Online (Sandbox Code Playgroud)

或没有偏移量:

function playsection(){
    p = context.createBufferSource();
    p.buffer = wavbuf;
    p.connect(context.destination);
    p.start(0);
    p.stop(10);    // stop after 10 seconds 
}
Run Code Online (Sandbox Code Playgroud)

甚至在开始时声明偏移量和持续时间:

function playsection(){
    p = context.createBufferSource();
    p.buffer = wavbuf;
    p.connect(context.destination);
    p.start(0,6,10);
}
Run Code Online (Sandbox Code Playgroud)