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

Commit 24b336e3 authored by Jakub Pawlowski's avatar Jakub Pawlowski
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.

Test: use hearing aid supporting 24kHz codec
Change-Id: I9419d58fa8728fc8e0f0c2d2ed8d8d741309a9a3
parent 9ec541f0
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: