Supponendo che sia stato modificato il sistema di sicurezza, permettendo ad un'applet di registrare il succo č questo:
si crea un oggetto TargetDataLine che permetta di leggere il playback della scheda audio: il formato audio scelto per i dati č 44khz stereo 16 bit.
La registrazione č demandata ad un Thread che nel metodo run() legge un array di dati dalla linea di registrazione e la scrive su un buffer di byte che risiede in memoria (pessimo modo per registrare, ma noi supponiamo di non voler registrare grossi file audio nč di doverli scrivere su un hard disk).
La riproduzione l'ho messa per semplicitā direttamente nel metodo stop del Thread: i dati del buffer di byte in memoria vengono passati ad un oggetto Clip (che č sempre un Line perō in riproduzione) e riprodotti semplicemente con la chiamata al metodo start() del Clip stesso.
Tieni conto che il codice qui sotto č solo dimostrativo, manca un'interfaccia che dica al thread quanto iniziare a registrare e quando smettere, ma la sostanza č questa (alla fine mancano i bottoni

)
Codice:
import javax.sound.sampled.*;
import java.io.*;
public class ... implements Runnable ...{
Thread recorder=null;
boolean doProcess=false;
TargetDataLine targetLine=null;
AudioFormat format=null;
ByteArrayOutputStream byteOut=new ByteArrayOutputStream();
public void init() {
format=new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
44100f,
16,
2,
4,
44100f,
false);
DataLine.Info info=new DataLine.Info(TargetDataLine.class,format);
try {
targetLine=(TargetDataLine) AudioSystem.getLine(info);
targetLine.open(format);
} catch (Exception ex) {}
}
public void start() {
if(recorder==null) {
recorder=new Thread(this);
doProcess=true;
}
targetLine.start();
recorder.start();
}
public void stop() {
doProcess=false;
targetLine.stop();
targetLine.close();
recorder=null;
//l'oggetto clip ci serve per rileggere i dati
//e riprodurli
Clip clip=null;
DataLine.Info info=new DataLine.Info(Clip.class,format);
try {
clip=(Clip)AudioSystem.getLine(info);
clip.open(format,byteOut.toByteArray(),0,byteOut.size());
} catch (Exception ex) {}
clip.start();
}
public void run() {
byte[] data=new byte[targetLine.getBufferSize()/5];
int bytesRead=0;
while(doProcess) {
try {
bytesRead=targetLine.read(data,0,data.length);
byteOut.write(data,0,bytesRead);
} catch (Exception ex) {
System.out.println(ex);
System.exit(0);
}
}
}
}