OSDN Git Service

Hearing Aid - codec switching
authorJakub Pawlowski <jpawlowski@google.com>
Tue, 10 Apr 2018 07:16:53 +0000 (00:16 -0700)
committerHansong Zhang <hsz@google.com>
Wed, 26 Sep 2018 21:17:44 +0000 (14:17 -0700)
StartSendingAudio internally sets the codec to the HearingAidAudioSource.
OnDeviceAvailable callback triggers audio framework to  grab codec
configuration from HearingAidAudioSource. Those calls must be made in proper
order, otherwise audio framework will grab bad codec configuration.

This patch also remove default codec configuration, and crash if codec
configuration is not done correctly.

Bug: 116317072
Bug: 116044083
Test: use hearing aid supporting 24kHz codec
Change-Id: I9419d58fa8728fc8e0f0c2d2ed8d8d741309a9a3
Merged-In: I9419d58fa8728fc8e0f0c2d2ed8d8d741309a9a3
Merged-In: I8ce09c709a9cb4e79413a99fc344dffe824bc707

bta/hearing_aid/hearing_aid.cc
bta/hearing_aid/hearing_aid_audio_source.cc
bta/include/bta_hearing_aid_api.h

index 8779542..4fc416e 100644 (file)
@@ -653,11 +653,12 @@ class HearingAidImpl : public HearingAid {
     hearingDevice->accepting_audio = true;
     LOG(INFO) << __func__ << ": address=" << address
               << ", hi_sync_id=" << loghex(hearingDevice->hi_sync_id);
+
+    StartSendingAudio(*hearingDevice);
+
     callbacks->OnDeviceAvailable(hearingDevice->capabilities,
                                  hearingDevice->hi_sync_id, address);
     callbacks->OnConnectionState(ConnectionState::CONNECTED, address);
-
-    StartSendingAudio(*hearingDevice);
   }
 
   void StartSendingAudio(const HearingDevice& hearingDevice) {
@@ -682,17 +683,14 @@ class HearingAidImpl : public HearingAid {
           controller_get_interface()->supports_ble_2m_phy()) {
         codec_in_use = CODEC_G722_24KHZ;
         codec.sample_rate = 24000;
-        codec.bit_rate = 16;
-        codec.data_interval_ms = 10;
       } else if (codecs & (1 << CODEC_G722_16KHZ)) {
         codec_in_use = CODEC_G722_16KHZ;
         codec.sample_rate = 16000;
-        codec.bit_rate = 16;
-        codec.data_interval_ms = 10;
       }
 
-      // TODO: remove once we implement support for other codecs
-      codec_in_use = CODEC_G722_16KHZ;
+      codec.bit_rate = 16;
+      codec.data_interval_ms = 10;
+
       HearingAidAudioSource::Start(codec, audioReceiver);
     }
   }
index 947caaf..9fba78d 100644 (file)
@@ -28,9 +28,9 @@ using base::FilePath;
 extern const char* audio_ha_hw_dump_ctrl_event(tHEARING_AID_CTRL_CMD event);
 
 namespace {
-int bit_rate = 16;
-int sample_rate = 16000;
-int data_interval_ms = 10 /* msec */;
+int bit_rate = -1;
+int sample_rate = -1;
+int data_interval_ms = -1;
 int num_channels = 2;
 alarm_t* audio_timer = nullptr;
 
@@ -94,6 +94,10 @@ void hearing_aid_data_cb(tUIPC_CH_ID, tUIPC_EVENT event) {
       UIPC_Ioctl(*uipc_hearing_aid, UIPC_CH_ID_AV_AUDIO, UIPC_SET_READ_POLL_TMO,
                  reinterpret_cast<void*>(0));
 
+      if (data_interval_ms != 10) {
+        LOG(FATAL) << " Unsupported data interval: " << data_interval_ms;
+      }
+
       audio_timer = alarm_new_periodic("hearing_aid_data_timer");
       alarm_set_on_mloop(audio_timer, data_interval_ms, send_audio_data,
                          nullptr);
@@ -266,6 +270,11 @@ void HearingAidAudioSource::Start(const CodecConfiguration& codecConfiguration,
                                   HearingAidAudioReceiver* audioReceiver) {
   localAudioReceiver = audioReceiver;
   VLOG(2) << "Hearing Aid UIPC Open";
+
+  bit_rate = codecConfiguration.bit_rate;
+  sample_rate = codecConfiguration.sample_rate;
+  data_interval_ms = codecConfiguration.data_interval_ms;
+
   stats.Reset();
 }
 
index 96ad7e6..eeb9bfb 100644 (file)
@@ -21,7 +21,6 @@
 #include <base/callback_forward.h>
 #include <hardware/bt_hearing_aid.h>
 
-
 /** Implementations of HearingAid will also implement this interface */
 class HearingAidAudioReceiver {
  public: