|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre habitué
![]() Inscription : juillet 2007 Messages : 222 ![]() |
Bonjour,
j'ai développé un moteur stéréo de son basé sur un Mixer capable de produire des Line que l'on peut contrôler en temps réel pour faire de la stéréo dynamique. Jusqu'à la version jvm1.6.0_31, je détecte systématiquement un mixer logiciel nommé : Java Sound Audio Engine Je le détecte en forçant les mixers détectés à produire des Line et en vérifiant avec isControlSupported qu'elles supportent MUTE, PAN et GAIN. Mais à partir de la jvm1.6.0_32, je ne détecte plus de Mixer valable. Y a-t-il une autre méthode permettant de faire de la stéréo temps réel ou un autre Mixer ou système de son nouveau qui remplace l'ancien qui fonctionne parfaitement jusqu'à la jvm1.6.0_31 ? Que faire ?
__________________
__________________________________ | + | Sylvain Tournois - Création logicielle. | | http://www.anadoncamille.com/ | |
|
00
|
|
|
#2 |
![]() ![]() |
Tu as un petit bout de code qui montre la liste des "mixer" à testé ?
(par contre produire des Line j'avoue ne pas comprendre le sens) |
|
|
00
|
|
|
#3 | ||
|
Membre habitué
![]() Inscription : juillet 2007 Messages : 222 ![]() |
Bonjour,
voici le code que j'utilise pour faire la détection de mixer : Code :
Si la varable STEREO est vraie, les sons produits peuvent être travaillés en stéréo. C'est un travail souvent lié au jeu vidéo. Si un monstre grogne à droite du joueur, on l'entend à droite. S'il sifflote à gauche, on l'entend à gauche dans les hauts parleurs. Le volume (GAIN) permet de produire un effet de distance. J'utilise des Line et précisemment des SourceDataLine pour produire ces effets, en combinaison avec des objets qui font la stéréo automatiquement en fonction de leur position relative au joueur. Quand la détection de mixer ne trouve aucun mixer capable de produire la stéréo, elle passe STEREO à false et trouve rapidement un mixer. Mais il est impossible avec mon code de produire de la stéréo à ce moment-là. Je ne sais pas comment faire. L'ancienne détection de mixer était une simple boucle de passage sur mixer.getName() et je testais qu'il y avait "java" dans son nom. J'obtenais très simplement le mixer stéréo nommé "Java Sound Audio Engine". Depuis la jvm1.6.0_32, je ne détecte plus ce mixer. Qu'est-il devenu ? A-t-il été remplacé et si oui, par quoi ?
__________________
__________________________________ | + | Sylvain Tournois - Création logicielle. | | http://www.anadoncamille.com/ | |
||
|
00
|
|
|
#4 | ||
![]() ![]() |
Je ne sais pas pour le Java Sound engine... il a peut être disparu. Chez moi si je liste tout les mixer j'ai ceci :
Code :
Il y a Plusieurs choses que je ne comprends pas dans ton code, que je vais te demander afin de bien comprendre et trouver une solution éventuelle 1) La variable STEREO semble fixée dés le départ et jamais changée. Je ne comprends pas l'intérêt immédiat (sauf si un autre truc manipule cette variable?). 2) Tu as une exception catchée qui ne fait rien. Il faut toujours s'en occuper pour bien faire. (mais la n'est pas ton problème primaire). 3) La boucle while, a quoi sert cette bricole ? Code :
while ((System.currentTimeMillis() - date < 1000) || (STEREO)) Code :
boolean pc = line.isControlSupported(FloatControl.Type.PAN); La variable "channels" de AudioFormat ne pourrait pas faire l'affaire ? Si elle vaut 2 alors c'est stéréo, enfin j'imagine... Enfin quoiqu'il en soit, ne cherche pas apres "java sound" faut trouver un autre moyen d'obtenir un mixer qui te convienne a mon avis. |
||
|
|
00
|
|
|
#5 |
|
Membre habitué
![]() Inscription : juillet 2007 Messages : 222 ![]() |
pour répondre dans l'ordre :
Je détecte sensiblement la même liste de mixers après la jvm1.6.0_31 et quand je ne trouve pas le mixer Java, je détecte habituellement le périphérique audio principal, que j'utilise pour l'instant en mono. 1) La variable STEREO est disponible pour les autres objets de la machine son que j'ai codée. Elle sert de contrôle sur les sons produits. J'ai une méthode play(String monSon, boolean stéréo) qui construit un gestionnaire de son actif le temps que dure le son. Pendant son activité, on peut paramétrer en temps réel les contrôles MUTE, PAN et GAIN pour produire des effets stéréo. Mais si la variable STEREO globale est fausse, tous les sons sortiront en mono même si le boolean local sereo est vrai. Lors de la détection des mixers, la première passe de boucle vérifie la disponibilité des controles stéréo. Si elle ne trouve aucun mixer qui réponde au besoin, elle passe la variable STEREO à false et refait une passe de test en mono, ce qui détecte habituellement le premier mixer disponible. 2) L'exception non catchée m'évite simplement les surcharges de textes dans le prompt, sachant que la méthode de détection est basée sur une fonctionnalité complète qui ne lève aucune Exception. Si un mixer déclenche une exception à cause des services demandés, il est rejeté et cela peut se faire sans remplir le prompteur de fautes volontaires. La deuxième exception, par contre, se contente de signaler un abus d'exceptions dans la détection, cas où aucun mixer ne serait disponible. 3) La boucle while est bel et bien une bricole qui date d'il y a longtemps et que je vais certainement enlever. Elle permet de forcer la détection pendant une seconde maximum, même si les passes de détection précédentes n'ont rien donné. Au bout d'une seconde, la détection de mixers est abandonnée si aucun n'a été trouvé. Je pense que je vais me contenter des passes stéréo et mono et stopper la détection immédiatement après. 4) Oui le boolean pc détecte la possibilité de faire la stéréo et la détection du nombre de chanels sur la ligne permet certainement de faire les calculs pour la stéréo. Je testerai ton idée, mais j'avoue que penser qu'il faudrait recoder à la main un mixer qui fasse la stéréo en temps réel alors qu'elle était déjà fonctionnelle avant la jvm1.6.0_32 est assez frustrant. Pour le moment j'imagine que Sun a déplacé la fonctionnalité ailleurs mais je ne trouve pas où. J'ai retesté la JavaSoundDemo mais la stéréo est inactive.
__________________
__________________________________ | + | Sylvain Tournois - Création logicielle. | | http://www.anadoncamille.com/ | |
|
00
|
|
|
#6 |
|
Membre habitué
![]() Inscription : juillet 2007 Messages : 222 ![]() |
J'ai testé d'autres paramètres et d'autres méthodes, mais je ne trouve plus aucun mixer avec lequel je puisse implémenter de la stéréo dynamique
Est-il possible d'obtenir des contrôles de Line comme le Java Mixer l'autorisait (PAN et GAIN) ? Autrement, comment programmer de la stéréo temps réel ?
__________________
__________________________________ | + | Sylvain Tournois - Création logicielle. | | http://www.anadoncamille.com/ | |
|
00
|
|
|
#7 | ||
![]() ![]() |
Personnelement j'ai dut louper une étape quelques part ou je ne comprends pas ce que veux dire stéréo temps réel (et pourtant des soft de musique j'en ai codé quelques un en java...)
Mis a part cela, je me suis dit que j'allais essayer de lire un fichier WAV stereo et de contrôler le PAN afin de verifier que je puisse regler le pan et entendre soit la gauche, soit la droite (ou les 2, ou entres les 2). J'ai donc écrit ceci en me basant d'un exemple d'internet : Code :
Dans un premier temps j'ai controler avec un ficheir WAV stéréo afin de contrôler que sa sortait bien en stereo. (franchement des mixer mono ca doit plus exister depuis des lustres). Ensuite j'ai rajouter de quoi modifier le PAN et constater que celui ci fonctionnait. Je ne sais pas si ca va t'aider mais essayons toujours |
||
|
|
00
|
|
|
#8 |
|
Membre habitué
![]() Inscription : juillet 2007 Messages : 222 ![]() |
Merci pour ton aide, je vais de ce pas à la maison pour tester tout ça.
Ce que je veux dire par stéréo temps réel, c'est un effet stéréo indépendant du son joué et de ses propres pistes audio. C'est surtout utile dans le jeu vidéo pour ajouter des effets de profondeur sonore et des effets de mouvement. Il me tarde de tester ton code, là je suis au cyber et les souvenirs que j'ai de mes essais proches de ton code, c'est que je n'ai pas de controle dispo, quand je fais getControl, ça me renvoie null. Mais je pense que j'ai fait une erreur que l'ancien mixer supportait. Il me tarde d'essayer.
__________________
__________________________________ | + | Sylvain Tournois - Création logicielle. | | http://www.anadoncamille.com/ | |
|
00
|
|
|
#9 | ||||
|
Membre habitué
![]() Inscription : juillet 2007 Messages : 222 ![]() |
j'ai essayé ton code sur mon ordi mais j'ai obtenu une exception :
Code :
Code :
FloatControl pan = (FloatControl) sourceLine.getControl(FloatControl.Type.PAN); Voici le nouveau code de détection : Code :
http://sylv.tournois.free.fr/data/jr...ows-i586-s.exe Je reste surpris par ce qui ressemble à la disparition d'une facilité de programmation qui ne ressemble pas à Sun. Je pars à la quête aux infos.
__________________
__________________________________ | + | Sylvain Tournois - Création logicielle. | | http://www.anadoncamille.com/ | |
||||
|
00
|
Copyright © 2000-2013 - www.developpez.com