Sub Inicia_Java
Dim thisClass As String = (Me).As(JavaObject).RunMethod("getClass",Null)
jo.InitializeNewInstance(thisClass.Replace("class ","") & "$" & "AudioCapture",Null)
StartRecording
End Sub
Sub StartRecording
jo.RunMethod("startRecording", Null)
End Sub
Sub StopRecording
jo.RunMethod("stopRecording", Null)
End Sub
#if java
import javax.sound.sampled.*;
import java.io.ByteArrayOutputStream;
public class AudioCapture {
public AudioCapture() {
// inicialização necessária
}
private TargetDataLine line;
private boolean running = false;
public void startRecording() {
try {
AudioFormat format = new AudioFormat(16000, 16, 1, true, false);
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
if (!AudioSystem.isLineSupported(info)) {
subQvEvent("logs", "Line not supported");
return;
}
line = (TargetDataLine) AudioSystem.getLine(info);
line.open(format);
line.start();
running = true;
new Thread(() -> {
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
while (running) {
int numRead = line.read(buffer, 0, buffer.length);
if (numRead > 0) {
out.write(buffer, 0, numRead);
}
}
line.drain();
line.close();
subQvEvent("audio_data", out.toByteArray());
}).start();
} catch (LineUnavailableException e) {
subQvEvent("logs", "Line unavailable: " + e.getMessage());
}
}
public void stopRecording() {
running = false;
}
private void subQvEvent(String eventName, Object data) {
getBA().raiseEventFromDifferentThread(null, null, 0, eventName.toLowerCase() + "_qv", true, new Object[]{data});
}
}
#end if
Sub audio_data(data() As Byte)
Log("Received audio data of length: " & data.Length)
End Sub
Sub logs(message As String)
Log(message)
End Sub