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;