2016-05-04 3 views
0

Мне нужно закодировать свой источник с некоторым параметром cross (в секундах). Будет здорово прослушивать цикл без прерывания на границе образца. AudioBufferSourceNode - это audioNode в моем коде. Я столкнулся с проблемой неспособности повторно использовать буфер, можно ли обойти это?Как я могу спрятать AudioBufferSourceNode с перекрытием (используя тот же AudioBuffer)

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

Вы не можете повторно использовать буфер. Когда-то остановился источник-источник, ушел навсегда. Где ваш аудиоузел? Но это не проблема. Когда вы декодируете из звукового файла, вы снова можете использовать буфер из декодирования. Просто создайте больше источников буферов. Вы можете создать столько, сколько хотите. Какой язык вы используете в любом случае? Скажите несколько примеров того, что вы делаете, и какие рамки вы используете.

Остерегайтесь разницы между буфером от декодирования и источником буфера. Ваш audionode является источником буфера, который может быть загружен буфером. Вы можете повторно использовать буфер, но не источник буфера. Поэтому создайте источник буфера в вашем коде playnote.

 Смежные вопросы

  • Нет связанных вопросов^_^