Bonjour,
Ma question n'est pas une question de newbe, mais je suis perplexe par l'API javax.sound de SUN.
J'ai construit ma propre librairie pour jouer des sons au format WAVE et MIDI. Je pense qu'il existe des API prêtes à l'emploi, mais c'est simplement une question d'expérience...
Je suis finallement arrivé à mes fins. Le code suivant suffit à lancer un bout de musique:
A noter que loop() et play() sont gérées avec des threads. On entend bien la musique de fond, et un petit son de 2 secondes qui est joué.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SoundManager s = SoundManager.getInstance(); s.addWaveSound(new File("s01.wav"), "EFFECT_01"); s.addWaveSound(new File("m01.wav"), "MUSIK_01"); s.loop("MUSIK_01"); s.play("EFFECT_01");
Par contre, les codes suivant m'ont posés pas mal de soucis:
CAS 01
CAS 02
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SoundManager s = SoundManager.getInstance(); s.addWaveSound(new File("s01.wav"), "EFFECT_01"); s.addWaveSound(new File("m01.wav"), "MUSIK_01"); s.loop("MUSIK_01"); s.loop("MUSIK_01"); s.play("EFFECT_01");
Naturellement, on devrait entendre dans les 2 cas un espèce d'écho car 2 sons identiques sont joués quasi simultanément.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SoundManager s = SoundManager.getInstance(); s.addWaveSound(new File("s01.wav"), "EFFECT_01"); s.addWaveSound(new File("m01.wav"), "MUSIK_01"); s.loop("MUSIK_01"); s.play("EFFECT_01"); s.play("EFFECT_01");
Afin de minimiser les accès IO et les instanciations, Le principal concept du manager consistait à ne charger QU'UNE SEULE FOIS les données. Les appels de play() et loop() utilisent les données chargées en mémoire pour jouer les sons.
J'ai initialement utilisé la classe javax.sound.sampled.Clip car facile d'utilisation. Malheureusement, pour une raison inconnue, cette classe n'est pas capable de jouer 2 morceaux identiques en même temps. Ceci est valable pour le cas 01 et le cas 02.
En utilisant javax.sound.sampled.SourceDataLine à la place, le code est légèrement plus long, notamment pour le coup du loop(). Finallement, le résultat n'est pas convaincant car les 2 sons identiques sont joués de manière asynchrone de quelques millisecondes. Autrement dit, 0-50 ms du premier, 0-50ms du deuxième, 50-100ms du premier, 50-100ms du deuxième, etc. L'effet est déplaisant!
La seule solution qui marche est de recharger à chaque fois le son pour obtenir le résultat voulu. Cette solution ne me convient pas trop. De plus, a chaque coup, j'ai un IOException, UnsupportedAudioFileException et un LineUnavailableException à traiter.
Pour un son midi, dans tous les cas, mon système ne peut jouer qu'un et un seul midi à la fois... Est-ce normal?
Je souhaiterai dans un premier temps savoir si certains d'entre vous sont tombés sur ce problème et quelles solutions avez-vous adoptées.
Si ces commentaires ne suffisent pas, je peux éventuellement poster l'essentiel du code.
Uncle Google n'a pas été mon ami cette fois ci
Merci de votre attention.
Cordialement,
Billy
Partager