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.
pull/383/head
Alex Thorlton 2024-07-28 22:52:37 -05:00
rodzic 69f6cc33f9
commit e93b820ff8
1 zmienionych plików z 13 dodań i 7 usunięć

Wyświetl plik

@ -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)