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

AWT/Swing Java Discussion :

AudioClip plante à l'envoi de threads?


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Par défaut AudioClip plante à l'envoi de threads?
    Bonjour,
    je suis en train de créer un jeu de plateau et je souhaiterais mettre une musique de fond.
    Le problème est que le jeu appelle plusieurs thread via un Moustener. A chaque clic mon pion bouge. Cette création répété de thread coupe systématiquement la musique entre le 5 et le 6 eme apel d'un thread.

    Pensant que c'était un pb de thread j'ai fais un projet de test et pris un petit code qui me donne la liste des thread existant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     public static void printThreads() {
    		      Thread[] ta = new Thread[Thread.activeCount()];
    		      int n = Thread.enumerate(ta);
    		      for (int i=0; i<n; i++) {
    		         System.out.println("Le thread "+ i + " est " + ta[i].getName());
    		      } }
    Le résultat après plantage de la musique et le même qu'avant:
    Le thread 0 est AWT-Shutdown
    Le thread 1 est AWT-Windows
    Le thread 2 est AWT-EventQueue-0
    Le thread 3 est Image Fetcher 3
    Le thread 4 est Java Sound Event Dispatcher
    Le thread 5 est Thread-4
    Le thread 6 est DestroyJavaVM
    Java Sound Event Dispatcher semble etre le thread qui gère le sons,or il est toujours là.

    Voici une partie du code:
    Le Main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package Pandemie;
    import java.util.Hashtable;
    import java.util.LinkedList;
    import java.util.List;
     
    import Joueur.Joueur;
    import Ville.Ville;
    public class Pandemie {
    	public static List<Joueur> Joueurs;
            public static void main(String[] args){
            	Joueurs = new LinkedList<Joueur>();
            	Fenetre fen = new Fenetre();
            	Joueur Joueur=new Joueur("Atlanta",1,-30,-58);
            	Joueur.setPion(fen.initialise_pion(Joueur, new Ville("Atlanta",0,247,321,new String[]{"Washington","Miami","Chicago"} )));
            	Joueurs.add(Joueur);//Joueur 1
     
            	Thread zic = new ThreadMusique();
        		zic.run();
            }
    }
    La musique!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package Pandemie;
     
    import java.applet.Applet;
    import java.applet.AudioClip;
    import java.net.URL;
     
    public class ThreadMusique extends Thread{
    	public void run(){
    		URL url = Pandemie.class.getResource("Ghost_in_the_shell.wav");
    		AudioClip ac = Applet.newAudioClip(url);
    		ac.play();
    		ac.loop();
    	}
    }
    La fenêtre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    package Pandemie;
     
    import java.awt.Dimension;
    import java.awt.Toolkit;
     
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
     
    import Joueur.Joueur;
    import Ville.Ville;
     
    public class Fenetre extends JFrame{
     
         public Fenetre(){
             this.setTitle("Pandemie");
             this.setLocationRelativeTo(null);
             this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             this.setExtendedState(this.MAXIMIZED_BOTH);
             this.setUndecorated(true);
             this.setContentPane(new Map());
             this.setLayout(null);
             this.setVisible(true);
     
     
         }
         JLabel initialise_pion(Joueur j,Ville atlanta) {
     
     		JLabel label = new JLabel();
     		ImageIcon image = new ImageIcon(Toolkit.getDefaultToolkit().getImage("pion"+j.getCode_couleur()+".png"));
     		label.setPreferredSize(new Dimension(image.getIconWidth(), image.getIconHeight()));
     		label.setIcon(image);
     		add(label);
     		label.setBounds(atlanta.getPosition().x+j.getDecal_x(),atlanta.getPosition().y+j.getDecal_y(),50,80);
     		return label;
     	}
     
     
    }
    Pour finir, le mouvement du pion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    package Joueur;
     
    import java.awt.Point;
     
    import javax.swing.JLabel;
     
     
    import Pandemie.Pandemie;
    import Ville.Ville;
     
    public class Joueur {
    	String position;//la position est une ville
        int decal_x;
        int decal_y;
        int code_couleur;
        JLabel pion;
        static int joueur_actuel=0;
     
    	public Joueur(String position,int code_couleur,int decal_x,int decal_y) {
    		this.position=position;
    		this.decal_x=decal_x;
    		this.decal_y=decal_y;
    		this.code_couleur=code_couleur;
    	}
        public JLabel getPion() {
    		return pion;
    	}
    	public void setPion(JLabel pion) {
    		this.pion = pion;
    	}
    	public String getPosition() {
    		return position;
    	}
    	public void setPosition(String position) {
    		this.position = position;
    	}
    	public int getDecal_x() {
    		return decal_x;
    	}
    	public void setDecal_x(int decal_x) {
    		this.decal_x = decal_x;
    	}
    	public int getDecal_y() {
    		return decal_y;
    	}
    	public void setDecal_y(int decal_y) {
    		this.decal_y = decal_y;
    	}
    	public int getCode_couleur() {
    		return code_couleur;
    	}
    	public void setCode_couleur(int code_couleur) {
    		this.code_couleur = code_couleur;
    	}
     
    	//
    	// Fonction Graphique de joueur
    	//
     
    	public static void Deplacement_pions(Point Clic){
            Pandemie.Joueurs.get(Joueur.joueur_actuel).Deplacement_pion(Clic);
     
    	}
    	public void Deplacement_pion(Point Clic){
    	 	int i=0;
    	 	System.out.println("AAAAAAAA "+Clic);
    	 	Thread t = new Thread(new Mouvement(10,10,this.pion));
            t.start();
     
    	}
    	class Mouvement implements Runnable{
    	   	 int x;
    	   	 int y;
    	   	 JLabel label;
    	       public Mouvement(int x, int y,JLabel label) {
    	    	   this.x=x;
    	    	   this.y=y;
    	    	   this.label=label;
    			}
    			@Override
    	       public void run() {
    				int i=0;
    			 	for( i = 0; i < 1; i++)
    			    {
    			 		System.out.println("new:"+x+i+y+i);
    			 		i++;
    			 		label.setLocation(new Point(x+i,y+i));
    			 		label.setVisible(true);
    			 		try {
    			            Thread.sleep(10);
    				    } catch (InterruptedException e) {
    				        e.printStackTrace();
     
    			        }
    				}
    		   }              
    	   }  
    }
    Le projet de test fais simplement bouger mon pion de 100 en x et 100 en y. On peut noter qu'envoyer des thread qui ne font rien pose le même problème.

    En résumé, tout fonctionne, mais la suite de thread finit par arrêter la musique sans aucune erreur affichée... -_-
    Merci de votre aide!

    edit: J'ai continué mes tests sur la journée, il semble vraiment que ce soit un pb de thread... Je pourrais aussi tenter d'autres méthodes pour jouer un sons, mais je n'ai pas trouvé d'autres exemples simple sur lesquels m'appuyer.Si vous avez des idées...

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Par défaut
    voici ma nouvelle classe musique qui fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    package sound;
     
    import java.awt.Point;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.io.*;
    import javax.sound.sampled.*;
     
     
    public class Musique implements Runnable{
    	private AudioFormat format;
    	private byte[] samples;
    	public Musique(String filename){
    		try{
    			AudioInputStream stream = AudioSystem.getAudioInputStream(new File(filename));
    			format = stream.getFormat();
    			samples = getSamples(stream);
    		}
    		catch (UnsupportedAudioFileException e){
    			e.printStackTrace();
    		}
    		catch (IOException e){
    			e.printStackTrace();
    		}
    	}
    	public byte[] getSamples(){
    		return samples;
    	}
    	public byte[] getSamples(AudioInputStream stream){
    		int length = (int)(stream.getFrameLength() * format.getFrameSize());
    		byte[] samples = new byte[length];
    		DataInputStream in = new DataInputStream(stream);
    		try{
    			in.readFully(samples);
    		}
    		catch (IOException e){
    			e.printStackTrace();
    		}
    		return samples;
    	}
    	public void play(InputStream source){
    		// 100 ms buffer for real time change to the sound stream
    		int bufferSize = format.getFrameSize() * Math.round(format.getSampleRate() / 10);
    		byte[] buffer = new byte[bufferSize];
    		SourceDataLine line;
    		try{
    			DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
    			line = (SourceDataLine)AudioSystem.getLine(info);
    			line.open(format, bufferSize);
    		}
    		catch (LineUnavailableException e){
    			e.printStackTrace();
    			return;
    		}
    		line.start();
    		try{
    			int numBytesRead = 0;
    			while (numBytesRead != -1){
    				numBytesRead = source.read(buffer, 0, buffer.length);
    				if (numBytesRead != -1)
    				line.write(buffer, 0, numBytesRead);
    			}
    		}
    		catch (IOException e){
    			e.printStackTrace();
    		}
    		line.drain();
    		line.close();
    	}
    	@Override
    	public void run() {
    		InputStream stream = new ByteArrayInputStream(this.getSamples());
    		this.play(stream);
     
    	}
     
     
    }
    Ne me demandez pas pourquoi ça marche mais ça marche. Plus de plantage de la musique.
    Malheureusement il me faut faire un loop sur la musique et je n'ai pas trouvé comment faire...

    edit:
    voilà le nouveau code pour la zic, à la fin de la fonction start, je la relance. Simple, efficace.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    package sound;
     
    import java.awt.Point;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.io.*;
    import javax.sound.sampled.*;
     
     
    public class Musique implements Runnable{
    	private AudioFormat format;
    	private byte[] samples;
    	public Musique(String filename){
    		try{
    			AudioInputStream stream = AudioSystem.getAudioInputStream(new File(filename));
    			format = stream.getFormat();
    			samples = getSamples(stream);
     
    		}
    		catch (UnsupportedAudioFileException e){
    			e.printStackTrace();
    		}
    		catch (IOException e){
    			e.printStackTrace();
    		}
    	}
    	public byte[] getSamples(){
    		return samples;
    	}
    	public byte[] getSamples(AudioInputStream stream){
    		int length = (int)(stream.getFrameLength() * format.getFrameSize());
    		byte[] samples = new byte[length];
    		DataInputStream in = new DataInputStream(stream);
    		try{
    			in.readFully(samples);
    		}
    		catch (IOException e){
    			e.printStackTrace();
    		}
    		return samples;
    	}
    	public void play(InputStream source){
    		// 100 ms buffer for real time change to the sound stream
    		int bufferSize = format.getFrameSize() * Math.round(format.getSampleRate() / 10);
    		byte[] buffer = new byte[bufferSize];
    		SourceDataLine line;
    		try{
    			DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
    			line = (SourceDataLine)AudioSystem.getLine(info);
    			line.open(format, bufferSize);
    		}
    		catch (LineUnavailableException e){
    			e.printStackTrace();
    			return;
    		}
    		line.start();
    		try{
    			int numBytesRead = 0;
    			while (numBytesRead != -1){
    				numBytesRead = source.read(buffer, 0, buffer.length);
    				if (numBytesRead != -1)
    				line.write(buffer, 0, numBytesRead);
    			}
    		}
    		catch (IOException e){
    			e.printStackTrace();
    		}
    		line.drain();
    		line.close();
    		System.out.println("aaazz");
    		InputStream stream = new ByteArrayInputStream(this.getSamples());
    		this.play(stream);
    	}
    	@Override
    	public void run() {
    		InputStream stream = new ByteArrayInputStream(this.getSamples());
    		this.play(stream);
     
    	}
     
     
    }
    Je met le sujet en résolu, si vous avez des idées sur le 1er problème n’hésitez pas.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/06/2009, 00h08
  2. Réponses: 8
    Dernier message: 29/06/2008, 23h47
  3. Multithreading envoi données aux thread
    Par seareal001 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/06/2008, 12h31
  4. Envoie de structure à un thread.
    Par mohdaef dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 24/03/2008, 17h23
  5. [Thread]Problème d'envoie de message
    Par homeostasie dans le forum MFC
    Réponses: 4
    Dernier message: 15/02/2007, 09h26

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