1

WebAudio と Dart についてさらに学習するためだけに、ランダム サウンド シーケンサーを作成したいと考えています。

私のアイデアは、いくつかのサウンド サンプルをロードし、それらをランダムな順序で際限なく再生することです。

そのために、すべてのファイルをロードし、配列バッファーでデコードして、次の関数で再生します。

void startAudio()
{
   int index=random.nextInt(buffers.length);
   print("Audio played [${index}].");
   source.buffer=buffers[index];
   source.connect(context.destination, 0, 0);
   source.start(0);
   Timer timer=new Timer(100, this.proceed);
}

void proceed(Timer timer)
{
   this.startAudio();
}

問題は、しばらくするとサウンドの再生が停止することです。

何がうまくいかないのですか?

私がやろうとしていることをするのは最善の方法ですか?

誰かが私のコードをテストしたい場合は、ここにリンクがあります: http://cg.usr.sh/Dart/WebAudioTest/WebAudioTest.html

4

1 に答える 1

2

ランダムに変更した後、期待どおりに動作するようになりました。

 import 'dart:html';
 import 'dart:math';
 import 'dart:async';

 class AudioMaker
 {
   List<String> urls;

   AudioContext context;
   List<AudioBuffer> buffers;

   Random random;

   AudioMaker()
   {
     this.urls=new List<String>();
     this.context=new AudioContext();
     this.buffers=new List<AudioBuffer>();
     this.random=new Random(0);
   }

   void checkAndStart()
   {
     if(buffers.length == urls.length)
     {
       Timer timer=new Timer.repeating(500, this.startAudio);
     }
   }

   void startAudio(Timer timer)
   {
     int index=random.nextInt(this.buffers.length);
     print("Audio played [${index}].");
     AudioBufferSourceNode source=context.createBufferSource();
     source.buffer=this.buffers[index];
     source.connect(context.destination, 0, 0);
     source.start(0);
   }

   void _decodeAudio(url)
   {
     HttpRequest hr=new HttpRequest.get(url, (req){
       this.context.decodeAudioData(req.response, (audio_buff)
           {
             print("${url} decoded.");
             this.buffers.add(audio_buff);
             checkAndStart();
           }, (evt)
           {
             print("Error");
           });
     });
     hr.responseType="arraybuffer";
   }

   void loadAndStart()
   {
     for(String url in this.urls)
     {
       this._decodeAudio(url);
     }
   }
 }

 main()
 {
   AudioMaker audioMaker=new AudioMaker();
   audioMaker.urls.add("bark.ogg");
   audioMaker.urls.add("drip.ogg");
   audioMaker.urls.add("glass.ogg");
   audioMaker.urls.add("sonar.ogg");
   audioMaker.loadAndStart();
 }
于 2012-10-28T13:38:54.263 に答える