tutto il codice, se ci giochiamo assieme impariamo qualcosa o almeno io...
Test.java
codice:
package audio;
public class Test {
public static void main(String[] args) {
Finestra windows = new Finestra();
windows.start();
}
}
Finestra.java
codice:
package audio;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
public class Finestra extends Thread {
private JFrame frame;
private FileDialog sceltafile;
private JFrame dialogsceltafile;
private JButton bottonestop;
private JButton bottoneapri;
private JButton bottonecomincia;
Riproduzione t1;
public Finestra () {
frame = new JFrame ("APF");
bottoneapri = new JButton ("Apri");
bottonecomincia = new JButton ("Comincia");
bottonestop = new JButton ("Stop");
dialogsceltafile = new JFrame ();
sceltafile = new FileDialog (dialogsceltafile);
}
public void run(){
bottoneapri.addActionListener(new ApriListener());
bottonecomincia.addActionListener(new CominciaListener());
bottonecomincia.addActionListener(new CominciaListener());
bottonestop.addActionListener(new ChiudiListener());
frame.add(bottonestop);
frame.add(bottoneapri);
frame.add(bottonecomincia);
frame.setLayout(new FlowLayout());
frame.setSize(400, 300);
frame.setVisible(true);
}
public class ApriListener implements ActionListener{
private File scelta;
public void actionPerformed(ActionEvent e){
sceltafile.setVisible(true);
if ((sceltafile.getFile())!=null)
scelta = new File(sceltafile.getDirectory() + "/" + sceltafile.getFile());
t1=new Riproduzione (scelta);
t1.start();
}
}
public class ChiudiListener implements ActionListener{
public void actionPerformed(ActionEvent e){
t1.fermati();
}
}
public class CominciaListener implements ActionListener{
public void actionPerformed(ActionEvent e){
t1.comincia();
}
}
}
Riproduzione.java
codice:
package audio;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
public class Riproduzione extends Thread {
private File f;
private SourceDataLine sdl=null;
private static final int EXTERNAL_BUFFER = 128000;
private byte[] data = new byte[EXTERNAL_BUFFER];
private AudioFormat af=null;
private AudioInputStream ais=null;
private Boolean stopped=false;
public Riproduzione (File percorso){
f=percorso;
}
public void run () {
try {
ais = AudioSystem.getAudioInputStream(f);
af = AudioSystem.getAudioFileFormat(f).getFormat();
sdl = AudioSystem.getSourceDataLine(af);
sdl.open(af);
}
catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedAudioFileException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (LineUnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void comincia(){
sdl.start();
int BytesRead = 0;
while (BytesRead != -1 && !stopped) {
try {
BytesRead = ais.read(data, 0, EXTERNAL_BUFFER);
} catch (IOException e) {
e.printStackTrace();
}
if (BytesRead >= 0) {
sdl.write(data, 0, BytesRead);
}
}
sdl.drain();
sdl.close();
}
public void fermati(){
sdl.stop();
stopped=true;
}
}
Si accettano consigli di ogni tipo tranne "commentalo", è una cosa che faccio se il codice funziona. Inoltre il ciclo sembra terminare regolarmente, e appena finisce la riproduzione i pulsanti rispondono di nuovo.
ps. visto che la Java Sound di default supporta solo alcuni, pochi, tipi di wav, suggerisco uno dei primi due clip di questo sito per provare il programma, che si sentono...
http://www.talkingwav.com/cartoon_wav_sounds.html