From 1934566cbaf3d5d14a7f66b967c63ece66bc6f92 Mon Sep 17 00:00:00 2001 From: Jakub Pawlowski Date: Tue, 10 Apr 2018 00:16:53 -0700 Subject: [PATCH] Hearing Aid - codec switching 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 | 14 ++++++-------- bta/hearing_aid/hearing_aid_audio_source.cc | 15 ++++++++++++--- bta/include/bta_hearing_aid_api.h | 1 - 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/bta/hearing_aid/hearing_aid.cc b/bta/hearing_aid/hearing_aid.cc index 87795422d..4fc416e6b 100644 --- a/bta/hearing_aid/hearing_aid.cc +++ b/bta/hearing_aid/hearing_aid.cc @@ -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); } } diff --git a/bta/hearing_aid/hearing_aid_audio_source.cc b/bta/hearing_aid/hearing_aid_audio_source.cc index 947caaf9e..9fba78d7a 100644 --- a/bta/hearing_aid/hearing_aid_audio_source.cc +++ b/bta/hearing_aid/hearing_aid_audio_source.cc @@ -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(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(); } diff --git a/bta/include/bta_hearing_aid_api.h b/bta/include/bta_hearing_aid_api.h index 96ad7e67c..eeb9bfbe4 100644 --- a/bta/include/bta_hearing_aid_api.h +++ b/bta/include/bta_hearing_aid_api.h @@ -21,7 +21,6 @@ #include #include - /** Implementations of HearingAid will also implement this interface */ class HearingAidAudioReceiver { public: -- 2.11.0