Hallo,
ich hab mir ein kleines Programm geschrieben, das einen Audiostream (z.B. per Mikrofon) aufnehmen und danach wieder abspielen kann.
Das Programm funktioniert - wenn ich innere Klassen verwende. Sobald ich aber mehrere "normale" Klassen nehme (nennt man die alle äußere Klassen oder haben die nochmal eine eigene Bezeichnung) bekomme ich Probleme mit der Wertübergabe. Momentan ist es so, dass ich auf Methoden/Attribute einer anderen Klasse zugreife, indem ich deren Instanz vor den Befehl schreibe.
Beispiel:
Beim Programmaufruf bekomme ich jedoch einen NullPointer. Ist ja klar, Sound ist ja null. Aber wie stell ich das jetzt aber am geschicktesten an, damit das Programm trotzdem funktioniert? Ist diese von mir oben gezeigte Instanziierung überhaupt sinnvoll, oder gibt es da einen besseren Weg die Klassen untereinander kommunizieren zu lassen?
Wäre schön wenn mir hier jemand weiterhelfen könnte.
Das komplette Projekt: antoras.de/programmierung/sound.rar
Teile des Codes:
ich hab mir ein kleines Programm geschrieben, das einen Audiostream (z.B. per Mikrofon) aufnehmen und danach wieder abspielen kann.
Das Programm funktioniert - wenn ich innere Klassen verwende. Sobald ich aber mehrere "normale" Klassen nehme (nennt man die alle äußere Klassen oder haben die nochmal eine eigene Bezeichnung) bekomme ich Probleme mit der Wertübergabe. Momentan ist es so, dass ich auf Methoden/Attribute einer anderen Klasse zugreife, indem ich deren Instanz vor den Befehl schreibe.
Beispiel:
Code:
private Sound sound = new Sound();
sound.audioInputStream.read();
Beim Programmaufruf bekomme ich jedoch einen NullPointer. Ist ja klar, Sound ist ja null. Aber wie stell ich das jetzt aber am geschicktesten an, damit das Programm trotzdem funktioniert? Ist diese von mir oben gezeigte Instanziierung überhaupt sinnvoll, oder gibt es da einen besseren Weg die Klassen untereinander kommunizieren zu lassen?
Wäre schön wenn mir hier jemand weiterhelfen könnte.
Das komplette Projekt: antoras.de/programmierung/sound.rar
Teile des Codes:
Code:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.TargetDataLine;
/**
* This class manage the audio data
* @author antoras
*
*/
public class Sound /* extends SoundAdministration */{
protected boolean stopCapture = false;
//Listen the binary data
protected ByteArrayOutputStream byteArrayOutputStream;
//Set important parameters
protected AudioFormat audioFormat;
//Can read the audio data
protected TargetDataLine targetDataLine;
//Stream with an specific audio format
protected AudioInputStream audioInputStream;
//Audio byte line
protected SourceDataLine sourceDataLine;
/**
* Capture audio data in a thread. Otherwise it is difficult to
* do other things
*/
public void captureAudio() {
try {
audioFormat = getAudioFormat();
DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, audioFormat);
targetDataLine = (TargetDataLine) AudioSystem.getLine(dataLineInfo);
targetDataLine.open(audioFormat);
targetDataLine.start();
Thread captureThread = new Thread(new CaptureThread());
captureThread.start();
} catch (Exception e) {
System.out.println(e);
System.exit(0);
}
}
/**
* Play back the audio data in a thread. Otherwise it is difficult to
* do other things
*/
public void playAudio() {
try {
byte audioData[] = byteArrayOutputStream.toByteArray();
InputStream byteArrayInputStream = new ByteArrayInputStream(audioData);
AudioFormat audioFormat = getAudioFormat();
audioInputStream = new AudioInputStream(byteArrayInputStream, audioFormat,
audioData.length/audioFormat.getFrameSize());
DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, audioFormat);
sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
sourceDataLine.open(audioFormat);
sourceDataLine.start();
Thread playThread = new Thread(new PlayThread());
playThread.start();
} catch (Exception e) {
System.out.println(e);
System.exit(0);
}
}
/**
* There can be problems without/wrong parameters of the AudioFormat
* @return
*/
public AudioFormat getAudioFormat() {
//8000, 11025, 16000, 22050, 44100
float sampleRate = 8000.0F;
//8, 16
int sampleSizeInBits = 16;
//1, 2
int channels = 1;
boolean signed = true;
boolean bigEndian = false;
return new AudioFormat( sampleRate, sampleSizeInBits,channels, signed, bigEndian);
}
}
Code:
import java.io.ByteArrayOutputStream;
/**
* Thread to capture the audio files
* Stop if stopButton applied
* @author antoras
*
*/
public class CaptureThread extends Thread {
private byte tempBuffer[] = new byte[10000];
private Sound sound = new Sound();
/**
* The data can not directly written to the byteArrayOutputStream.
* Therefore they must buffered.
*/
public void run() {
sound.byteArrayOutputStream = new ByteArrayOutputStream();
sound.stopCapture = false;
try {
//Loop until the stopButton is applied
while (!sound.stopCapture) {
int cnt = sound.targetDataLine.read(tempBuffer, 0, tempBuffer.length);
if (cnt > 0) {
sound.byteArrayOutputStream.write(tempBuffer, 0, cnt);
}
}
sound.byteArrayOutputStream.close();
} catch (Exception e) {
System.out.println(e);
System.exit(0);
}
}
}