2013-09-20 1 views
3

J'ai un clip en boucle, et changer le volume comme ceci:Java - Modifier le volume d'un clip en boucle sans faire de bruit?

clip.stop(); 
clip.flush(); 
FloatControl fc = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); 
fc.setValue(new_volume); 
clip.loop(javax.sound.midi.Sequencer.LOOP_CONTINUOUSLY); 

Problème: lorsque le clip est redémarré, il ne joue pas au même cadre qu'elle a pris fin; il y a un saut audible dans la boucle. Si je ne vide pas le clip, ce problème disparaît, mais le volume ne change pas tant que les données tamponnées ne sont pas épuisées, ce qui est encore pire.

J'ai essayé d'obtenir et de réinitialiser la position du cadre, mais cela n'a pas semblé changer quoi que ce soit.

Y at-il un moyen de reprendre la lecture là où elle s'était arrêtée? (N'a pas besoin d'être exact ...) Yat-il un moyen de mesurer la quantité de données qui seront vidées et définir le cadre en fonction de cela?

Répondre

2

Résoudre ma propre question ... duh. GetFramePosition pour la boucle audio peut renvoyer un multiple de la longueur totale de trame du fichier audio

Lorsque vous réglez la position du cadre sur une valeur supérieure à la taille totale, le clip recommence depuis le début.

La solution est donc:

loop.setFramePosition(old_pos % loop.getFrameLength()); 
Questions connexes