2015-04-24 1 views
1

Les Javadoc for DataLine.flush() étatsRedémarrage d'un objet de clip - méthode flush()

Flushes données en file d'attente à partir de la ligne. Les données vidées sont ignorées. Dans certains cas, toutes les données mises en file d'attente ne peuvent pas être supprimées. Par exemple, un mélangeur peut vider des données du tampon pour une ligne d'entrée spécifique, mais toutes les données non jouées déjà dans le tampon de sortie (le résultat du mixage) seront toujours lues. Vous pouvez appeler cette méthode après avoir mis en pause une ligne (le cas normal) si vous voulez ignorer les données "périmées" lorsque vous redémarrez la lecture ou la capture. (Il est légal de vider une ligne qui est pas arrêté, mais cela sur une ligne active est susceptible de provoquer une discontinuité dans les données, résultant en un clic perceptible.)

Qu'est-ce que cela signifie exactement?

En outre, pour le redémarrage d'un objet Clip, beaucoup de gens sur ce site a suggéré d'utiliser ceci:

clip.stop(); 
clip.setFramePosition(0); 
clip.start(); 

Lorsque vous utilisez le code ci-dessus, je remarquai qu'un clip d'échantillon (qui est d'environ 15 secondes si ce qui compte) ne redémarre pas au début et est incohérent dans sa "position de redémarrage". Cependant, quand j'ai essayé

clip.stop(); 
clip.flush(); 
clip.setFramePosition(0); 
clip.start(); 

Le clip a fonctionné parfaitement et a redémarré dès le début du son. Ma question est, qu'est-ce que la méthode flush() fait pour réparer mon précédent problème? Aussi, pourquoi ai-je eu le problème en premier lieu?

Répondre

4

Une ligne de données telle que Clip possède un tampon de données interne, probablement un byte[]. Le tampon sera généralement rempli en morceaux, en avance sur la position de lecture.

Supposons à un certain instant, nous avons:

  playback position 
        v 
buffer:   [..|.....] 
    file: [..........|.....................] 

Donc, si nous nous arrêtons la ligne, le tampon a encore des données dans ce — données qui est en avance sur la position de lecture.

Si tout ce que nous faisons est de définir la position de lecture, les données sont toujours là et seront lues la prochaine fois que nous le commencerons. Le rinçage de la ligne supprime ces données. Nous pouvons également appeler le drain pour attendre la lecture de ces données.

+0

@Kootling Avez-vous lu ma réponse? Est-ce que cela répond à votre question? Y a-t-il encore quelque chose que tu ne comprends pas? – Radiodef

+0

Je vois, merci. Quelle est la durée du tampon habituellement? – Kootling

+0

Cela dépendra de l'implémentation. Vous pouvez le découvrir avec ['getBufferSize'] (http://docs.oracle.com/javase/8/docs/api/javax/sound/sampled/DataLine.html#getBufferSize--). Certaines surcharges de 'open' vous permettent également de le spécifier. J'ai balancé dans le code source et il semblerait que la valeur par défaut (trouvée dans 'com.sun.media.sound.AbstractDataLine') est dimensionnée à tout ce que 500ms d'audio serait pour le format donné. – Radiodef