PDA

View Full Version : [JAVA] Gestione file audio


franksisca
05-11-2005, 17:07
Ragazzi, io in un thread avvio un file audio, mentre se premo un pulsante non funziona. il codice è questo:

private void avviaMusica(){
try{
this.file=new File("digitalClock/bell.wav");
this.ais=AudioSystem.getAudioInputStream(file);
this.audioformat=ais.getFormat();
this.info = new DataLine.Info(SourceDataLine.class,audioformat);
this.line=(SourceDataLine) AudioSystem.getLine(info);
line.open(audioformat);
line.start();
copyStream(ais,line);
line.drain();
line.close();
}
catch(Exception e){e.printStackTrace();}
}

private void copyStream(AudioInputStream ais, SourceDataLine line) {
// TODO Auto-generated method stub
try{
int buffer =128000;
byte []buf=new byte [buffer];
while(true){
int read=ais.read(buf);
if(read==-1)break;
line.write(buf,0,read);
}
}
catch(Exception e){e.printStackTrace();}
}

naturalmente le variabili sono:

private File file;
private AudioInputStream ais;
private AudioFormat audioformat;
private DataLine.Info info;
private SourceDataLine line;


mi dite perchè non riesco a stopparlo????
e mi dite come farlo.

BlueDragon
06-11-2005, 00:08
Ragazzi, io in un thread avvio un file audio, mentre se premo un pulsante non funziona. il codice è questo:
[..]
mi dite perchè non riesco a stopparlo????
e mi dite come farlo.
Non sono riuscito a capire qual'è la tua esatta situazione...cmq una volta che l'audio parte, finché non è finito il file il codice cicla dentro quel "while (true)"..
Quindi quando premi il pulsante "Stop" devi far uscire il codice da quel ciclo, magari mettendo una variabile boolean che cambi quand'è il momento :)

franksisca
06-11-2005, 10:53
ok, ora provo e vi faccio sapere.

Alvaro Vitali
06-11-2005, 12:36
Se ti può essere utile tempo fa ho realizzato una classe per gestire la riproduzione di file audio con le classiche funzionalità (play, stop, mute e loop) e puoi consultarne il codice, c'è anche l'API in javadoc.

http://www.code4fun.org/_apps/audioplayer/

Ciao.

franksisca
06-11-2005, 14:51
ok, grazie anche a te, comunque ho provato e niente, non funziona mettendo la variabile a false.CIAO

BlueDragon
06-11-2005, 19:57
ok, grazie anche a te, comunque ho provato e niente, non funziona mettendo la variabile a false.CIAO
Considera che l'istruzione line.write(buf,0,read) non è instantanea, ma da quel che ho capito ci mette tanto quanto ci mette il "mixer" a ricevere il buffer che gli stai mandando. Quindi se fai un buffer grande tanto quanto il file audio, praticamente il while fa un sola iterazione e non potrai stopparlo quando vuoi mettendo la condizione di loop a false.
Al contrario con un buffer molto piccolo il ciclo esegue molti loop e puoi fermarlo in maniera quasi istantanea.

Oppure (cosa migliore) puoi guardare nelle api per vedere qual'è il metodo "giusto" da invocare per stoppare la riproduzione....ad esempio: potresti invocare line.stop().

franksisca
06-11-2005, 20:00
ok, + tardi provo e vi faccio sapere
ciao