Thread de son et menu d'une interface

Thread de son et menu d'une interface - Java - Programmation

Marsh Posté le 28-06-2006 à 17:18:00    

Bonjour a tous,
je travaille sur un mini sudoku avec un binome, bon au niveau du jeu tout fonctionne, mais on a essayé d'intégrer une gestion du son cet après midi, et je peche un peu au niveau de la gestion de la configuration.  
Je m'explique, lorsque l'utilisation lance une nouvelle partie, le thread lit le son en boucle, le probleme c'est qu'on a voulu faire un menu pour activer/desactiver le thread, ca fonctionne, mais lorsqu'on remet le son apres l'avoir désactivé, l'utilisation processeur monte a 100% !
Quelqu'un aurait il une piste ou une autre methode pour procéder ?
 
classe ThreadSound :

Code :
  1. import java.io.ByteArrayInputStream;
  2. import java.io.InputStream;
  3. import javax.sound.sampled.*;
  4. import java.io.*;
  5. public class ThreadSound  extends Thread
  6. {
  7.   private AudioFormat format;
  8.      private byte[] samples;
  9.         public int stopbit;
  10. public void run()
  11.      {
  12.    sound("test.wav" );
  13.    InputStream stream = new ByteArrayInputStream(getSamples());
  14.    stopbit = 0;
  15.    play(stream);
  16.    while(stopbit != 1) {run();}//
  17.      }
  18. public void  test()
  19.   {
  20.    System.out.println("Arret :"+this.isAlive()+"val stopbit : "+stopbit);
  21.   }
  22. public void  arret()
  23.   {
  24.    stopbit = 1;
  25.    //player=null;
  26.    //System.gc();
  27.   }
  28.     public void sound(String filename){
  29.         stopbit = 0;
  30.            try{
  31.                AudioInputStream stream = AudioSystem.getAudioInputStream(new File(filename));
  32.                format = stream.getFormat();
  33.                samples = getSamples(stream);
  34.            }
  35.            catch (UnsupportedAudioFileException e){
  36.                e.printStackTrace();
  37.        }
  38.        catch (IOException e){
  39.                e.printStackTrace();
  40.            }
  41.        }
  42.        public byte[] getSamples(){
  43.            return samples;
  44.        }
  45.        public byte[] getSamples(AudioInputStream stream){
  46.            int length = (int)(stream.getFrameLength() * format.getFrameSize());
  47.            byte[] samples = new byte[length];
  48.            DataInputStream in = new DataInputStream(stream);
  49.            try{
  50.                in.readFully(samples);
  51.            }
  52.            catch (IOException e){
  53.                e.printStackTrace();
  54.            }
  55.            return samples;
  56.        }
  57.        public void play(InputStream source){
  58.         // 100 ms buffer for real time change to the sound stream
  59.            int bufferSize = format.getFrameSize() * Math.round(format.getSampleRate() / 10);
  60.            byte[] buffer = new byte[bufferSize];
  61.            SourceDataLine line;
  62.            try{
  63.                DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
  64.                line = (SourceDataLine)AudioSystem.getLine(info);
  65.                line.open(format, bufferSize);
  66.            }
  67.            catch (LineUnavailableException e){
  68.                e.printStackTrace();
  69.                return;
  70.            }
  71.            line.start();
  72.            try{
  73.                int numBytesRead = 0;
  74.                while (numBytesRead != -1){
  75.                    numBytesRead = source.read(buffer, 0, buffer.length);
  76.                    if (numBytesRead != -1)
  77.                        line.write(buffer, 0, numBytesRead);
  78.                    if (stopbit==1)
  79.                        {
  80.         line.stop();
  81.         line.write(buffer, 0, numBytesRead);
  82.                         numBytesRead=-1;
  83.                        }
  84.                        // arrêt de la lecture du fichier conditioné par le bit stopbit
  85.                }
  86.            }
  87.            catch (IOException e){
  88.               e.printStackTrace();
  89.           }
  90.          line.drain();
  91.          line.close();
  92.          }
  93. }


 
Fichier du menu :

Code :
  1. // Instanciation du son
  2. ThreadSound playbaby;
  3.         [...............]
  4.                   // partie du menu qui gere le stop/lecture
  5.    else if(evt.getSource()==m431){
  6.    playbaby.arret();
  7.    playbaby=null;
  8.    System.gc();
  9.    }
  10.    else if(evt.getSource()==m432){
  11.           playbaby = new ThreadSound();
  12.           playbaby.start();
  13.          playbaby.test();
  14.    }


on a essayé aussi d'autres methodes mais sans succès ... j'avoue que la, on pêche :d


Message édité par l3eleg le 28-06-2006 à 17:20:08
Reply

Marsh Posté le 28-06-2006 à 17:18:00   

Reply

Marsh Posté le 28-06-2006 à 17:32:14    

hmmm je viens de lire sur le forum que l'utilisation du gc sur un thread de reference null ne l'arretait pas. Jen conclus donc qu'on se retrouve avec plusieurs threads en // d'ou le taux d'utilisation cpu, ma question sera donc un peu différent, comment forcer un thread à finir son traitement ?
l'utilisation du stopbit ne semblant pas fonctionner (enfin elle fonctionne mais j'ai une erreur IllegalStateThread lorsque je tente de relancer la lecture du son)

Reply

Marsh Posté le 29-06-2006 à 13:24:08    

Citation :

Code :
  1. while(stopbit != 1) {run();}//



 
Ca fait une boulce infinie ça, pas étonnant que le CPU soit à 100%.


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
Reply

Marsh Posté le 29-06-2006 à 18:55:45    

:hello:
Et, en plus c'est recursif!!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed