From e93b820ff85ff0a6a3686a95a9f5a545797b1137 Mon Sep 17 00:00:00 2001 From: Alex Thorlton Date: Sun, 28 Jul 2024 22:52:37 -0500 Subject: [PATCH] backed/DigiRig: Sync RTS signal to audio playback I originally had some hacky code in here to _hopfeully_ ensure that the RTS signal was raise while packets were being transmitted, but it was only a best-guess attempt. This commit implements an OnPlaybackPositionUpdateListener to tell us exactly when the audio for a packet has finished playing, so we know exactly when to clear the RTS signal. --- src/backend/DigiRig.scala | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/backend/DigiRig.scala b/src/backend/DigiRig.scala index 35a021d9..a848378e 100644 --- a/src/backend/DigiRig.scala +++ b/src/backend/DigiRig.scala @@ -12,6 +12,7 @@ import android.content.SharedPreferences import android.hardware.usb.UsbManager import android.hardware.usb.UsbDevice import android.hardware.usb.UsbDeviceConnection +import android.media.AudioTrack.OnPlaybackPositionUpdateListener import android.util.Log import java.io.{InputStream, OutputStream} @@ -59,7 +60,15 @@ class DigiRig(service : AprsService, prefs : PrefsWrapper) extends AfskUploader( val pendingIntent = PendingIntent.getBroadcast(service, 0, intent, 0) // Audio stuff + var audioPlaying = false output.setVolume(AudioTrack.getMaxVolume()) + output.setPlaybackPositionUpdateListener(new OnPlaybackPositionUpdateListener { + override def onMarkerReached(audioTrack: AudioTrack): Unit = { + DigiRig.this.audioPlaying = false + } + + override def onPeriodicNotification(audioTrack: AudioTrack): Unit = {} + }) val receiver = new BroadcastReceiver() { override def onReceive(ctx: Context, i: Intent) { @@ -167,14 +176,11 @@ class DigiRig(service : AprsService, prefs : PrefsWrapper) extends AfskUploader( Log.d(TAG, "update(): From: " + from + " To: " + to + " Via: " + Digis + " telling " + data) ser.setRTS(true) - val bits_per_byte = 8 - val bits_in_frame = packet.toAX25Frame().length / bits_per_byte - val ms_per_s = 1000 - val sleep_ms = bits_in_frame * ms_per_s / 1200 // aprs is 1200 baud - val sleep_pad_ms = 1500 - Thread.sleep(sleep_ms + sleep_pad_ms) + audioPlaying = true val result = sendMessage(msg) - Thread.sleep(sleep_ms + sleep_pad_ms) + while (audioPlaying) { + Thread.sleep(10) + } ser.setRTS(false) if (result)