我需要使用一些交叉参数(以秒为单位)循环我的源代码。在不中断示例边界的情况下监听循环将是很棒的.AudioBufferSourceNode是我的代码中的audioNode。 我遇到了无法重用缓冲区的问题,是否有可能解决这个问题?
playNoteOn: function(indexNote){
var attack = this.get('attack'),
release = this.get('release'),
volume = 1 + this.get('volume') / 100,
reverb = _.clone(this.get('reverb')),
loop = this.get('loop'), cross;
//peace for Loop process
if (loop) {
//milli sec
attack = this.get('startLoop')*1000;
release = this.get('endLoop')*1000;
//sec
cross = this.get('crossLoop');
}
//peace for ADSR process
var t0 = this.get('audioNode').context.currentTime,
spread = attack/1000 + release/1000,
attackSpread = t0 + attack/1000;
[this.get('schema').leftGain, this.get('schema').rightGain].forEach(function(gain, index){
gain.gain.cancelScheduledValues(0);
gain.gain.setValueAtTime(0, t0);
gain.gain.linearRampToValueAtTime(volume, attackSpread);
// gain.gain.setValueAtTime(volume, decaySpread);
// gain.gain.linearRampToValueAtTime(0, releaseSpread);
});
this.get('audioNode').connect(this.get('schema').splitter, 0, 0);
this.get('audioNode').connect(this.get('schema').leftGain);
this.get('audioNode').connect(this.get('schema').rightGain);
this.get('audioNode').connect(this.get('schema').reverb);
this.get('audioNode').connect(APP.Models.Synth.get('schema').reverb);
APP.Models.Synth.get('effects').where({active: false}).forEach(function(effect){
effect.get('node').disconnect();
});
APP.Models.Synth.get('effects').where({active: true}).forEach(function(effect){
effect.get('node').disconnect();
effect.get('node').setParams(effect.toJSON()).getNode(this.get('audioNode'), [this.get('schema').leftGain, this.get('schema').rightGain]);
}, this);
if(loop){
this.get('audioNode').loop = true;
this.get('audioNode').loopEnd = this.get('audioNode').buffer.duration - cross;
}
this.get('audioNode').start(t0);
},
答案 0 :(得分:0)
您无法重复使用缓冲区。一旦停止,sourcebuffer就会永远消失。无论如何,你的音频节点对象在哪里?但那没问题。从声音文件解码后,您可以再次使用解码缓冲区。只需创建更多缓冲源。您可以根据自己的喜好创建。你还用什么语言?说出你正在做什么以及你使用哪些框架的背景。
注意缓冲区与解码和缓冲区之间的区别。您的audionode是一个缓冲源,可以通过缓冲区进行处理。您可以重用缓冲区而不是缓冲区源。所以在你的playnote代码中创建缓冲源。