From 9463772c181618b8b1535a45c991821ea5f50aaf Mon Sep 17 00:00:00 2001 From: Georg Lukas Date: Wed, 15 Feb 2012 21:58:20 +0100 Subject: [PATCH] AFSK: allow bluetooth headset, audio routing --- AndroidManifest.xml | 1 + res/values/arrays.xml | 6 +++++ res/values/strings.xml | 12 ++++++++++ res/xml/backend_afsk.xml | 30 +++++++++++++++++++------ src/backend/AfskUploader.scala | 41 +++++++++++++++++++++++++++++++--- 5 files changed, 80 insertions(+), 10 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 77d3019..9ddc1a1 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -11,6 +11,7 @@ + diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 5b29ce4..a1f171c 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -14,6 +14,12 @@ afsk bluetooth + + 0 + 2 + 3 + 4 + @string/p_source_smart diff --git a/res/values/strings.xml b/res/values/strings.xml index 19e74da..906c2e0 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -257,6 +257,15 @@ Frame Sync Prefix No-Op Preamble (e.g. for VOX control) Enter the prefix time [ms] +Bluetooth Headset +Use Bluetooth (SCO) headset for AFSK +Audio Output + + Voice Call + Ringtone + Music + Alarm + APRS-IS TCP server (port 14580) to contact @@ -300,4 +309,7 @@ Bluetooth is not supported! Please enable Bluetooth! Please configure a Bluetooth TNC! + +Requesting bluetooth SCO link... +Bluetooth SCO link established. diff --git a/res/xml/backend_afsk.xml b/res/xml/backend_afsk.xml index 0aa49e3..cc3af4a 100644 --- a/res/xml/backend_afsk.xml +++ b/res/xml/backend_afsk.xml @@ -5,13 +5,21 @@ - + + + + + diff --git a/src/backend/AfskUploader.scala b/src/backend/AfskUploader.scala index b6accf2..3e8059d 100644 --- a/src/backend/AfskUploader.scala +++ b/src/backend/AfskUploader.scala @@ -1,5 +1,7 @@ package org.aprsdroid.app +import _root_.android.content.{BroadcastReceiver, Context, Intent, IntentFilter} +import _root_.android.media.AudioManager import _root_.android.util.Log import _root_.java.net.{InetAddress, DatagramSocket, DatagramPacket} import _root_.net.ab0oo.aprs.parser.{APRSPacket, Digipeater, Parser} @@ -13,12 +15,36 @@ class AfskUploader(service : AprsService, prefs : PrefsWrapper) extends AprsIsUp // frame prefix: bytes = milliseconds * baudrate / 8 / 1000 var FrameLength = prefs.getStringInt("afsk.prefix", 1000)*1200/8/1000 var Digis = prefs.getString("digi_path", "WIDE1-1") - val output = new Afsk() + val use_bt = prefs.getAfskBluetooth() + val out_type = prefs.getAfskOutput() + val output = new Afsk(out_type) val abp = new AudioBufferProcessor(this) + val btScoReceiver = new BroadcastReceiver() { + override def onReceive(ctx : Context, i : Intent) { + val state = i.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1) + Log.d(TAG, "AudioManager SCO event: " + state) + if (state == AudioManager.SCO_AUDIO_STATE_CONNECTED) { + // we are connected, perform actual start + log(service.getString(R.string.afsk_info_sco_est)) + abp.start() + service.unregisterReceiver(this) + service.postPosterStarted() + } + } + } + def start() = { - abp.start() - true + if (use_bt) { + log(service.getString(R.string.afsk_info_sco_req)) + service.getSystemService(Context.AUDIO_SERVICE) + .asInstanceOf[AudioManager].startBluetoothSco() + service.registerReceiver(btScoReceiver, new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED)) + false + } else { + abp.start() + true + } } def update(packet : APRSPacket) : String = { @@ -35,6 +61,9 @@ class AfskUploader(service : AprsService, prefs : PrefsWrapper) extends AprsIsUp def stop() { abp.stopRecording() + if (use_bt) + service.getSystemService(Context.AUDIO_SERVICE) + .asInstanceOf[AudioManager].stopBluetoothSco() } def received(data : Array[Byte]) { @@ -45,4 +74,10 @@ class AfskUploader(service : AprsService, prefs : PrefsWrapper) extends AprsIsUp Log.e(TAG, "bad packet: %s".format(data.map("%02x".format(_)).mkString(" "))); e.printStackTrace() } } + + def log(s : String) { + Log.i(TAG, s) + service.postAddPost(StorageDatabase.Post.TYPE_INFO, R.string.post_info, s) + } + }