1

私はAngie 2でオーディオを生成する必要があり、WebAudioではなくJSで動作するサンプルが見つかりました。 JSでうまくいっていて、TS(Angular 2)のサウンドを今日再生できるようになりました(例えばランダムノイズ)。私のサービスではなく、スクリプトプロセッサイベント(onaudioprocess)からの変数にアクセスする必要があるということです。以下にサンプルコードがあります。WebAudioのScriptProcessor(Angular 2)

これは可能でしょうか? JSでは、グローバル変数があり、うまくいきました。

輸入...

@Injectable() 
export class SomeService { 
    variable: any; 
    constructor() 
    { 
    this.variable = new Variable(); 
    this.initWebAudio(); 
    } 

    initWebAudio(): void 
    { 
     try { 
      this.context = new ((<any>window).AudioContext || (<any>window).webkitAudioContext)(); 
      this.context.SampleRate = this.sample_rate; 

      this.masterGainNode = this.context.createGain(); 
      this.masterGainNode.gain.value = 0.5; 
      this.masterGainNode.connect(this.context.destination); 

      this.startJSProcessor(); 
      } 
      catch(e) { 
      alert('Web Audio API is not supported in this browser'); 
      }  
    } 

    startJSProcessor(): void 
    {  
     if(this.context.createScriptProcessor) 
     { 
      this.jsProcessor = this.context.createScriptProcessor(4096, 1, 2); 
      //alert("Chrome Desktop/Android"); 
     } 
     else if(this.context.createJavaScriptNode) 
     { 
      this.jsProcessor= this.context.createJavaScriptNode(4096,1,2); 
      //alert("Safari"); 
     } 
     else 
     { 
      alert("No way"); 
     }   
     this.jsProcessor.onaudioprocess = this.generateSounds; 
     this.jsProcessor.connect(this.masterGainNode); 
    } 

    generateSounds(event: any): void 
    {  
     var outputR = event.outputBuffer.getChannelData(0); 
     var outputL = event.outputBuffer.getChannelData(1);  

     //"this" is undefined here...  
     var something = this.variable.something; 
     } 

答えて

2

これは年間のJSの人々をflummoxingされています同じ問題です。 this.generateSoundsをコールバックに直接使用することはできません。これは、thisバインディングが失われるためです。はい、それは正しいです

this.jsProcessor.onaudioprocess = (event: any) => { 
    this.generateSounds(event); 
}; 
+0

this.jsProcessor.onaudioprocess = this.generateSounds.bind(this); 

または(等価):これを試してみてください。私はこれを試して、今すぐ動作します。 –