diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index e1092b5f9b..aef76cad14 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -29,5 +29,6 @@
+
diff --git a/android/app/src/main/java/com/rusefi/app/rusEFI.java b/android/app/src/main/java/com/rusefi/app/rusEFI.java
index 3f2d2db10b..702d663322 100644
--- a/android/app/src/main/java/com/rusefi/app/rusEFI.java
+++ b/android/app/src/main/java/com/rusefi/app/rusEFI.java
@@ -63,6 +63,8 @@ public class rusEFI extends Activity {
private UsbManager usbManager;
private DfuUpload dfuUpload;
+ private SoundBroadcast soundBroadcast = new SoundBroadcast();
+
@SuppressLint("SetTextI18n")
@Override
@@ -202,7 +204,7 @@ public class rusEFI extends Activity {
if (view.getId() == R.id.button) {
handleButton();
} else if (view.getId() == R.id.buttonSound) {
-
+ soundBroadcast.start();
}
}
diff --git a/java_console/shared_ui/src/com/rusefi/ts_plugin/AudioPlayback.java b/java_console/shared_ui/src/com/rusefi/ts_plugin/AudioPlayback.java
new file mode 100644
index 0000000000..91ffd2888e
--- /dev/null
+++ b/java_console/shared_ui/src/com/rusefi/ts_plugin/AudioPlayback.java
@@ -0,0 +1,86 @@
+package com.rusefi.ts_plugin;
+
+import javax.sound.sampled.*;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.ServerSocket;
+import java.net.Socket;
+
+public class AudioPlayback {
+ private static final int sampleRate = 16000;
+
+ private static final AudioFormat format = new AudioFormat(sampleRate, 16, 1, true, false);
+
+ public AudioPlayback() throws IOException {
+ ServerSocket serverSocket = new ServerSocket(16000);
+
+ while (true) {
+
+ Socket clientSocket = serverSocket.accept();
+ new Thread(() -> {
+ try {
+ playSound(clientSocket.getInputStream());
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }).start();
+ }
+ }
+
+ public static void start() {
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ new AudioPlayback();
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ }).start();
+ }
+
+
+ private static void playSound(InputStream stream) throws IOException {
+ while (true) {
+ byte[] buffer = new byte[30000];
+ int got = stream.read(buffer);
+
+ byte copy[] = new byte[got];
+ System.arraycopy(buffer, 0, copy, 0, got);
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ toSpeaker(copy);
+ }
+ }).start();
+ }
+ }
+
+ public static void toSpeaker(byte soundbytes[]) {
+ try {
+ DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, format);
+ SourceDataLine sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
+
+ sourceDataLine.open(format);
+
+ FloatControl volumeControl = (FloatControl) sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN);
+ volumeControl.setValue(100.0f);
+
+ sourceDataLine.start();
+ sourceDataLine.open(format);
+
+ sourceDataLine.start();
+
+ System.out.println("format? :" + sourceDataLine.getFormat());
+
+ sourceDataLine.write(soundbytes, 0, soundbytes.length);
+ System.out.println("Playing " + soundbytes.toString());
+ sourceDataLine.drain();
+ sourceDataLine.close();
+ } catch (Exception e) {
+ System.out.println("Not working in speakers...");
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/java_console/ui/src/main/java/com/rusefi/ConsoleUI.java b/java_console/ui/src/main/java/com/rusefi/ConsoleUI.java
index e2892ab0dd..8da744f40c 100644
--- a/java_console/ui/src/main/java/com/rusefi/ConsoleUI.java
+++ b/java_console/ui/src/main/java/com/rusefi/ConsoleUI.java
@@ -33,6 +33,9 @@ import static com.rusefi.StartupFrame.setFrameIcon;
import static com.rusefi.rusEFIVersion.CONSOLE_VERSION;
import static com.rusefi.ui.storage.PersistentConfiguration.getConfig;
+/**
+ * @see StartupFrame
+ */
public class ConsoleUI {
private static final int DEFAULT_TAB_INDEX = 0;
public String port;