Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 768d021d authored by Jakub Pawlowski's avatar Jakub Pawlowski Committed by Hansong Zhang
Browse files

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
parent 7b8079d9
Loading
Loading
Loading
Loading
+6 −8
Original line number Diff line number Diff line
@@ -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;
      HearingAidAudioSource::Start(codec, audioReceiver);
    }
  }
+12 −3
Original line number Diff line number Diff line
@@ -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();
}

+0 −1
Original line number Diff line number Diff line
@@ -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: