WebAudioAPI有时会丢弃计划的淡入淡出值

时间:2018-03-12 10:30:58

标签: javascript web-applications web-audio web-audio-api

大家, 我正在使用Web Audio API开发一个音乐网络应用程序,而且我遇到了一个我无法理解的问题。

该应用程序基本上是这样的:用户浏览全屏图像,在该图像上有一些与特定声音相关的特定点。该应用程序播放更接近用户的声音,并在用户离开时淡出它们。

当用户处于有两个以上声音(3或4,但有时也有2个就足够)播放的位置时,问题发生(不是每次),然后进入"无声&# 34;位置。

在这种情况下,渐变会以某种方式掉落,声音会突然中断。我可以从日志中看到它进入了衰落函数,但它并没有执行预定的增益曲线。

为了更清楚,这里是我的算法所做的步骤的一个例子:

  • 当用户处于位置A时,让我们说3个声音在播放;
  • 用户移动到位置B,并在操作完成时触发事件;
  • 算法计算与位置B关联的声音数量:零;
  • 与位置A中的声音进行比较并计算出声音1,2和3消失,并且需要通过淡出来停止;
  • 每个声音的
  • 调用fadeOut函数,该函数使用WebAudioAPI方法调度淡入淡出值,并使用setTimeout()调度停止操作;

结果是声音保持最大音量,直到调用停止功能。

这里是fadeOut()函数:

StreamSound.prototype.fadeOut = function (fadeTime) {
const self = this;
if (self.isPlaying()) {
    if (!fadeTime) {
        console.warn(`Missing argument fadeTime. Set to 1 second`);
        fadeTime = 1;
    }
    var currGain = self.masterGain.gain.value;
    var curTime = self.context.currentTime;
    self.masterGain.gain.cancelScheduledValues(curTime);
    self.masterGain.gain.setValueAtTime(currGain, curTime);
    self.masterGain.gain.linearRampToValueAtTime(0.0001, curTime + fadeTime);
    self.fading = true;
    setTimeout(function () {
        // If has not secondary streams
        if (self.secondaryStream === undefined) {
            console.log(`No secondary streams -> stop`);
            self.pause();
        } else if (!self.secondaryStream.isPlaying()) {
            console.log(`Not playing secondary streams -> stop`);
            self.pause();
        } else {
            self.playing = false;
        }
        self.fading = false;
        console.log(`Fade out stream finished [ ID: ${self.index} ]`);
    }, fadeTime * 1000 + 25);
    console.log(`Fading out stream [ ID: ${self.index} ]`);
} else {
    console.warn(`Cannot fade out. Sound not playing [ ID: ${self.index} ]`);
}
};

我想这可能是因为调度问题,或者它是否与JS线程管理相关?

我知道用这些信息帮助我并不容易,但也许有人有类似的问题。

非常感谢, 弗朗西斯

编辑:我打开了另一篇文章,其中包含更一般的说明以及源代码和在线测试版的链接 - > WebAudioAPI musical application: clicks and crackles and abrupt stops

0 个答案:

没有答案