2009-12-17 8 views
1

J'ai un problème pour lire un son correctement en Java en utilisant l'interface Clip.Problèmes Java lors de la lecture de clips audio

Jouer le son fonctionne en utilisant:

clip = (Clip)mixer.getLine(dataLineInfo); 
clip.open(audioFormat, byteData, 0, byteData.length); 
clip.start(); 

Cependant, il y a une fuite de mémoire si clips ne sont pas fermées.

J'ai essayé d'ajouter un écouteur de ligne avant de commencer le clip, et utilisez le code suivant:

public void update(LineEvent e) { 
    if (e.getType() == LineEvent.Type.STOP) { 
     e.getLine().close(); 

Cependant, cela provoque le son degrage. Ajouter une seconde de sommeil dans la méthode fait que les choses fonctionnent à nouveau sur ma machine - mais je préférerais une solution plus élégante - Je ne pense pas que l'attente dans une méthode d'écoute est une bonne pratique et que les autres machines prennent plus de temps.

Il est bizarre que l'événement d'arrêt soit envoyé un certain temps avant l'arrêt du son.

Quelqu'un at-il des idées sur une meilleure façon de résoudre ce problème?

(par rapport à this, this et this mais aucune des solutions pour moi)

Répondre

1

Cela semble être les symptômes décrits dans bug 4434125. La solution suggérée dans ces commentaires de bogue est d'appeler clip.drain() (dans un thread approprié, car il s'agit d'un appel bloquant), puis de fermer le clip lorsque le vidage est terminé (puisqu'il se bloquera jusqu'à ce que le tampon interne de la ligne de données soit vidé) (selon Javadocs for the drain method)

+0

Merci - c'est le problème. "L'ancienne implémentation (Java Sound Engine) ne sera pas corrigé." Ainsi, le code tente maintenant d'utiliser le mélangeur par défaut du système. – Pool

Questions connexes