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

Commit 7caf64f6 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge changes from topic "32khz"

* changes:
  leaudio: Allow to configure AF for more than 16kHz for Microphone
  leaudio: Add missing 32kHz options
  [LE Audio] Add the support for 32k config
parents 766be004 c6365d8b
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -360,6 +360,7 @@ std::unordered_map<int32_t, uint16_t> octets_per_frame_map{
    {30, ::le_audio::codec_spec_conf::kLeAudioCodecLC3FrameLen30},
    {30, ::le_audio::codec_spec_conf::kLeAudioCodecLC3FrameLen30},
    {40, ::le_audio::codec_spec_conf::kLeAudioCodecLC3FrameLen40},
    {40, ::le_audio::codec_spec_conf::kLeAudioCodecLC3FrameLen40},
    {60, ::le_audio::codec_spec_conf::kLeAudioCodecLC3FrameLen60},
    {60, ::le_audio::codec_spec_conf::kLeAudioCodecLC3FrameLen60},
    {80, ::le_audio::codec_spec_conf::kLeAudioCodecLC3FrameLen80},
    {120, ::le_audio::codec_spec_conf::kLeAudioCodecLC3FrameLen120}};
    {120, ::le_audio::codec_spec_conf::kLeAudioCodecLC3FrameLen120}};


std::unordered_map<AudioLocation, uint32_t> audio_location_map{
std::unordered_map<AudioLocation, uint32_t> audio_location_map{
+994 −25

File changed.

Preview size limit exceeded, changes collapsed.

+14 −0
Original line number Original line Diff line number Diff line
@@ -29,34 +29,48 @@
        {
        {
            "name": "Conversational",
            "name": "Conversational",
            "configurations": [
            "configurations": [
                "DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2_Server_Preferred",
                "DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2_1",
                "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_Server_Preferred",
                "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_Server_Preferred",
                "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_1",
                "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_1",
                "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_2",
                "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_2",
                "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_Server_Preferred",
                "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_Server_Preferred",
                "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_1",
                "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_1",
                "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_2",
                "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_2",
                "DualDev_OneChanStereoSnk_OneChanMonoSrc_32_2_Server_Preferred",
                "DualDev_OneChanStereoSnk_OneChanMonoSrc_32_2_1",
                "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2_Server_Preferred",
                "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2_Server_Preferred",
                "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2_1",
                "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2_1",
                "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1_Server_Preferred",
                "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1_Server_Preferred",
                "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1_1",
                "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1_1",
                "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_32_2_Server_Preferred",
                "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_32_2_1",
                "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2_Server_Preferred",
                "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2_Server_Preferred",
                "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2_1",
                "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2_1",
                "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1_Server_Preferred",
                "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1_Server_Preferred",
                "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1_1",
                "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1_1",
                "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2_Server_Preferred",
                "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2_1",
                "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_Server_Preferred",
                "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_Server_Preferred",
                "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_1",
                "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_1",
                "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_2",
                "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_2",
                "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_Server_Preferred",
                "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_Server_Preferred",
                "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_1",
                "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_1",
                "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_2",
                "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_2",
                "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2_Server_Preferred",
                "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2_1",
                "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_Server_Preferred",
                "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_Server_Preferred",
                "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_1",
                "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_1",
                "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_Server_Preferred",
                "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_Server_Preferred",
                "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_1",
                "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_1",
                "SingleDev_OneChanStereoSnk_OneChanMonoSrc_32_2_Server_Preferred",
                "SingleDev_OneChanStereoSnk_OneChanMonoSrc_32_2_1",
                "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_Server_Preferred",
                "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_Server_Preferred",
                "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_1",
                "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_1",
                "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_Server_Preferred",
                "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_Server_Preferred",
                "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_1",
                "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_1",
                "SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2_Server_Preferred",
                "SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2_1",
                "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_Server_Preferred",
                "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_Server_Preferred",
                "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_1",
                "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_1",
                "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_Server_Preferred",
                "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_Server_Preferred",
+48 −10
Original line number Original line Diff line number Diff line
@@ -684,6 +684,52 @@ class LeAudioClientImpl : public LeAudioClient {
    // TODO Implement
    // TODO Implement
  }
  }


  void StartAudioSession(LeAudioDeviceGroup* group,
                          LeAudioCodecConfiguration* source_config,
                          LeAudioCodecConfiguration* sink_config) {
    /* This function is called when group is not yet set to active.
     * This is why we don't have to check if session is started already.
     * Just check if it is acquired.
     */
    ASSERT_LOG(active_group_id_ == bluetooth::groups::kGroupUnknown,
               "Active group is not set.");
    ASSERT_LOG(audio_source_instance_, "Source session not acquired");
    ASSERT_LOG(audio_sink_instance_, "Sink session not acquired");

    /* We assume that peer device always use same frame duration */
    uint32_t frame_duration_us = 0;
    if (!source_config->IsInvalid()) {
      frame_duration_us = source_config->data_interval_us;
    } else if (!sink_config->IsInvalid()) {
      frame_duration_us = sink_config->data_interval_us;
    } else {
      ASSERT_LOG(true, "Both configs are invalid");
    }

    audio_framework_source_config.data_interval_us = frame_duration_us;
    leAudioClientAudioSource->Start(audio_framework_source_config,
                                    audioSinkReceiver);

    /* We use same frame duration for sink/source */
    audio_framework_sink_config.data_interval_us = frame_duration_us;

    /* If group supports more than 16kHz for the microphone in converstional
     * case let's use that also for Audio Framework.
     */
    std::optional<LeAudioCodecConfiguration> sink_configuration =
        group->GetCodecConfigurationByDirection(
            LeAudioContextType::CONVERSATIONAL,
            le_audio::types::kLeAudioDirectionSource);
    if (sink_configuration &&
        sink_configuration->sample_rate >
            bluetooth::audio::le_audio::kSampleRate16000) {
      audio_framework_sink_config.sample_rate = sink_configuration->sample_rate;
    }

    leAudioClientAudioSink->Start(audio_framework_sink_config,
                                  audioSourceReceiver);
  }

  void GroupSetActive(const int group_id) override {
  void GroupSetActive(const int group_id) override {
    DLOG(INFO) << __func__ << " group_id: " << group_id;
    DLOG(INFO) << __func__ << " group_id: " << group_id;


@@ -752,16 +798,8 @@ class LeAudioClientImpl : public LeAudioClient {


    if (active_group_id_ == bluetooth::groups::kGroupUnknown) {
    if (active_group_id_ == bluetooth::groups::kGroupUnknown) {
      /* Expose audio sessions if there was no previous active group */
      /* Expose audio sessions if there was no previous active group */
      audio_framework_source_config.data_interval_us =
      StartAudioSession(group, &current_source_codec_config,
          current_source_codec_config.data_interval_us;
                         &current_sink_codec_config);
      leAudioClientAudioSource->Start(audio_framework_source_config,
                                      audioSinkReceiver);

      audio_framework_sink_config.data_interval_us =
          current_source_codec_config.data_interval_us;

      leAudioClientAudioSink->Start(audio_framework_sink_config,
                                    audioSourceReceiver);
    } else {
    } else {
      /* In case there was an active group. Stop the stream */
      /* In case there was an active group. Stop the stream */
      GroupStop(active_group_id_);
      GroupStop(active_group_id_);
+7 −0
Original line number Original line Diff line number Diff line
@@ -96,6 +96,13 @@ struct LeAudioCodecConfiguration {
             (data_interval_us == other.data_interval_us));
             (data_interval_us == other.data_interval_us));
  }
  }


  bool operator==(const LeAudioCodecConfiguration& other) const {
    return ((num_channels == other.num_channels) &&
            (sample_rate == other.sample_rate) &&
            (bits_per_sample == other.bits_per_sample) &&
            (data_interval_us == other.data_interval_us));
  }

  bool IsInvalid() {
  bool IsInvalid() {
    return (num_channels == 0) || (sample_rate == 0) ||
    return (num_channels == 0) || (sample_rate == 0) ||
           (bits_per_sample == 0) || (data_interval_us == 0);
           (bits_per_sample == 0) || (data_interval_us == 0);
Loading