DIPLOMARBEIT
DIPLOMARBEIT
DIPLOMARBEIT
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
3.4 Verbinden der Komponenten<br />
In der ersten Zeile wird hier der bei der Instanziierung übergebene Verweis auf die Audio‐Ausgabe<br />
(SourceDataLine) festgehalten. Danach wird ein PipedInputStream angelegt, der mit einem<br />
PipedOutputStream verbunden wird. Dadurch entsteht eine sogenannte Pipe 17 . Das ist ein ge‐<br />
pufferter Datenstrom zwischen zwei Prozessen. So kann der Schreib‐ und Leseprozess voneinander<br />
entkoppelt werden. Die Daten werden in den PipedOutputStream geschrieben und können<br />
dann von einem anderen Thread aus dem PipedInputStream gelesen werden.<br />
Des Weiteren findet dort auch eine Umwandlung zwischen den Audioformaten statt:<br />
Das Zielformat ist im ersten und die Quelle im zweiten Parameter angegeben. Damit die Audiodaten<br />
auch korrekt ausgegeben werden können, muss das Format mit dem der Audioausgabe übereins‐<br />
timmen. Das Eingabeformat ist beim verwendeten VoIP‐Clienten üblicherweise 8 Bit ULAW und das<br />
Ausgabeformat 16 Bit PCM. Die Konversion wird von der bereits erwähnten Klasse AudioSystem<br />
durchgeführt, welche ein Bestandteil von Java ist.<br />
Da es sich bei der Klasse AudioOutputStream um eine Ableitung der Klasse OutputStream<br />
handelt, findet man dort auch die write()‐Methoden, welche die Methoden der Oberklasse über‐<br />
schreiben. Es gibt insgesamt drei dieser Methoden, jeweils mit unterschiedlichen Parametern. Es<br />
muss nur die write()‐Methode für ein einzelnes Byte implementiert werden, die anderen können<br />
durch mehrfaches Aufrufen dieser einen Methode nachgeahmt werden 18 . Im Folgenden wird nur die<br />
Methode mit einem Byte als Parameter behandelt.<br />
Vorausgesetzt, die oben erwähnte Pipe wurde erfolgreich erstellt, so wird das Byte b in die Pipe ge‐<br />
schrieben und die konvertierten Daten werden anschließend aus der Pipe gelesen, welche dann auf<br />
der Audiohardware ausgegeben werden:<br />
Diese Stelle ist auch ideal dazu geeignet, die konvertierten Daten für den Spracherkenner abzuzwei‐<br />
gen. Der Datenfluss ist im folgenden Diagramm nochmal zusammenfassend dargestellt:<br />
62<br />
input_stream = AudioSystem.getAudioInputStream(<br />
source_line.getFormat(), audio_input_stream);<br />
output_stream.write(b);<br />
int len = input_stream.read(buff, 0, buff.length);<br />
source_line.write(buff, 0, len);<br />
Abbildung 41: Der Weg der Audiodaten im VoIP‐Clienten<br />
17 engl. für Rohr, Röhre<br />
18 Die Implementierung der anderen write()‐Methoden ist sinnvoll um die Performance zu optimieren.