2012-10-28 1 views
1

Je veux créer un séquenceur de sons aléatoire, juste pour en savoir plus sur WebAudio et Dart.Comment utiliser correctement WebAudio et Timer dans Dart

Mon idée est de charger des exemples sonores et de les jouer dans un ordre aléatoire indéfini.

Pour cela, j'ai chargé tous les fichiers, les décodées dans un ArrayBuffer et les mettre à jouer avec la fonction suivante:

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(); 
} 

Le problème est que, après un certain temps, les sons cessent de jouer.

Qu'est-ce qui ne va pas?

Est-ce la meilleure façon de faire ce que j'essaie de faire?

Si quelqu'un veut tester mon code, voici le lien: http://cg.usr.sh/Dart/WebAudioTest/WebAudioTest.html

Répondre

2

Après changer les choses au hasard, je l'ai eu à travailler comme je m'y attendais.

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(); 
} 
Questions connexes