2009-07-28 5 views
0

Je rejoue le son avec SourceDataLine de Java mais chaque fois que j'essaie d'ajuster le volume (gain), il y a un délai de 0,2-0,5 seconde entre l'action et la réponse dans le haut-parleur. Les données audio sont écrites en morceaux de 4k à 16k (16 bits mono, 22kHz ~ 44k/s). Comment puis-je faire ce réglage du volume plus en temps réel?Ajustement du volume sonore java en temps réel

Le write(byte[], int, int) bloque-t-il le réglage du gain du FloatControl? Ai-je besoin de revenir à un mode DSP pour ajuster simultanément le volume de données du tampon sonore ou soumettre des morceaux plus petits?

JDK7, décent PC Windows

+0

Pas la réponse que je cherchais, mais il me semble que je devrais revenir aux livres de développement Java Game pour une solution DSP. – akarnokd

Répondre

2

Système audio prend les données de SourceDataLine en morceaux de quelques (...) cent kilo-octets et les tampons. Si vous modifiez les paramètres, cela ne prendra effet que lorsque le tampon de lecture du système sera vide et que les nouvelles données seront lues à partir de SDL. Ce que vous devez faire est de pirater quelque part en changeant le volume de lecture du système (ce qui a un effet immédiat) plutôt que de modyfier les données que vous lui fournissez.

+0

Messing avec le volume principal du système ne semble pas être un bon moyen car je suppose que j'aurais besoin de JNI/JNA pour le faire. Et je déteste personnellement ces applications qui le font de cette façon. De plus, je dois reproduire de la musique et d'autres sons simultanément avec différents réglages de volume. – akarnokd

+0

Malheureusement, je ne peux pas vous aider plus que cela. C'est la seule chose que je sais à propos de JavaSound qu'il est cassé de plusieurs façons inattendues .. :( – Marcin

+0

Merci, malheureusement, ce sujet est également au-delà de mes experts aussi - c'est pourquoi j'ai demandé. génération sonore – akarnokd

0

Si vous pouvez affecter/créer la classe Line.Info que contient votre mélangeur pour votre Line, vous pouvez modifier ses tampons minimum et maximum. Ensuite, vous pouvez définir les tampons à la taille des morceaux que vous l'alimentez, puis votre délai sera réduit à 0 (supposé)

0

Avez-vous essayé d'utiliser une taille de tampon personnalisée (inférieure) lors de l'appel à SourceDataLine.open ()?

SourceDataLine.open(AudioFormat format, int bufferSize) 

Cela devrait diminuer la latence. La solution de volume de lecture principale sera probablement encore plus rapide.

Questions connexes