IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Multimédia Java Discussion :

[Audio] JAVA SOUND comment ca marche?


Sujet :

Multimédia Java

  1. #1
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut [Audio] JAVA SOUND comment ca marche?
    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:

    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");
    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é.


    Par contre, les codes suivant m'ont posés pas mal de soucis:

    CAS 01
    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");
    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.play("EFFECT_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.

    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

  2. #2
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    Problème résolu pour les WAV. J'arrive maintenant à jouer 2 WAV en simultanné, alors que je l'ai chargé qu'une seule fois.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2008
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Hello!

    Pourrais-tu me dire de quelle facon tu as résolu ton problème? j'ai actuellement le meme...

    Merci!

    A+

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par choucroute Voir le message
    Hello!

    Pourrais-tu me dire de quelle facon tu as résolu ton problème? j'ai actuellement le meme...

    Merci!

    A+
    Je sais d'où ça vient. Il ne faut pas utiliser directement les méthodes getLine() et getClip() de la classe AudioSystem, il faut récupérer les mixeurs compatibles, sélectionner parmi eux celui qui supporte le plus de lignes en même temps et appeler la méthode getLine(Line.Info info) sur ce mixeur. Si tu veux savoir comment faire, va jeter un coup d'oeil dans mon code source, dans la classe OggClip.

    En fait, AudioSystem te renvoie par défaut une ligne venant du premier mixeur compatible avec ta ligne qu'elle trouve. Si fortuitement, le mixeur sollicité supporte le mixage, c'est bon mais dans l'autre cas, ça pose problème. Je reste ouvert à vos questions.

    Enfin, rien ne sert de réinventer l'eau chaude. On peut tout à fait écrire un Sound Manager en utilisant l'API Java Sound pour lire des morceaux de musiques préchargés en utilisant une instance de l'interface Clip et en l'ouvrant avec les données décompressées. Cette API supporte de base les formats wav et au, ça évite d'avoir à recoder tout ça. Pour le format OGG, il existe JOGG, JORBIS et EasyOgg par dessus.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Audio] Envoi et réception de flux audio avec Java Sound
    Par djanat22 dans le forum Multimédia
    Réponses: 3
    Dernier message: 24/01/2014, 10h38
  2. Java Sound Audio Engine
    Par anadoncamille dans le forum Général Java
    Réponses: 8
    Dernier message: 06/12/2012, 20h27
  3. Réponses: 1
    Dernier message: 13/10/2009, 18h37
  4. [Signal] FFT audio : comment ca marche ?
    Par mathieu3392 dans le forum Traitement du signal
    Réponses: 66
    Dernier message: 26/09/2009, 11h03
  5. débutant - appli java et bdd comment ça marche
    Par 123quatre dans le forum Général Java
    Réponses: 6
    Dernier message: 25/09/2008, 21h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo