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

Commit 3f9f41f3 authored by Alice Kuo's avatar Alice Kuo
Browse files

Add audio configuration API and the callback function for bluetooth.audo@2.2

For LE audio hardware offload
1. Add the function to update audio configuration without session
restart
2. Add a callback to notify the audio HAL the audio configuration
changed

Bug: 197296692
Bug: 150670922
Test: HAL 2.1/2.2 work for A2DP software/hardware media, and LE audio
software media/voip call

Change-Id: I8b01ec8dfc9d9cd552770c8c734319a685ee626b
parent 3a16f8fe
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -59,4 +59,14 @@ interface IBluetoothAudioProvider extends @2.1::IBluetoothAudioProvider {
     */
    startSession_2_2(IBluetoothAudioPort hostIf, AudioConfiguration audioConfig)
                generates (Status status, fmq_sync<uint8_t> dataMQ);

    /**
     * Called when the audio configuration of the stream has been changed.
     *
     * @param audioConfig The audio configuration negotiated with the remote
     *    device. The PCM parameters are set if software based encoding,
     *    otherwise the correct codec configuration is used for hardware
     *    encoding.
     */
    updateAudioConfiguration(AudioConfiguration audioConfig);
};
+23 −0
Original line number Diff line number Diff line
@@ -186,6 +186,29 @@ Return<void> BluetoothAudioProvider::endSession() {
  return Void();
}

Return<void> BluetoothAudioProvider::updateAudioConfiguration(
    const AudioConfiguration& audioConfig) {
  LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_);

  if (stack_iface_ == nullptr) {
    LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_)
              << " has NO session";
    return Void();
  }

  if (audioConfig.getDiscriminator() != audio_config_.getDiscriminator()) {
    LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_)
              << " audio config type is not match";
    return Void();
  }

  audio_config_ = audioConfig;
  BluetoothAudioSessionReport_2_2::ReportAudioConfigChanged(session_type_,
                                                            audio_config_);

  return Void();
}

}  // namespace implementation
}  // namespace V2_2
}  // namespace audio
+2 −0
Original line number Diff line number Diff line
@@ -53,6 +53,8 @@ class BluetoothAudioProvider : public IBluetoothAudioProvider {
  Return<void> streamStarted(BluetoothAudioStatus status) override;
  Return<void> streamSuspended(BluetoothAudioStatus status) override;
  Return<void> endSession() override;
  Return<void> updateAudioConfiguration(
      const AudioConfiguration& audioConfig) override;

 protected:
  sp<BluetoothAudioDeathRecipient> death_recipient_;
+21 −3
Original line number Diff line number Diff line
@@ -48,20 +48,38 @@ class BluetoothAudioSessionControl_2_2 {
    std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
        BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
    if (session_ptr != nullptr) {
      return session_ptr->GetAudioSession()->RegisterStatusCback(cbacks);
      PortStatusCallbacks_2_2 cb = {
          .control_result_cb_ = cbacks.control_result_cb_,
          .session_changed_cb_ = cbacks.session_changed_cb_,
          .audio_configuration_changed_cb_ = nullptr};
      return session_ptr->RegisterStatusCback(cb);
    }
    return kObserversCookieUndefined;
  }

  // The control API helps the bluetooth_audio module to register
  // PortStatusCallbacks_2_2
  // @return: cookie - the assigned number to this bluetooth_audio output
  static uint16_t RegisterControlResultCback(
      const SessionType_2_1& session_type,
      const PortStatusCallbacks_2_2& cbacks) {
    std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
        BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
    if (session_ptr != nullptr) {
      return session_ptr->RegisterStatusCback(cbacks);
    }
    return kObserversCookieUndefined;
  }

  // The control API helps the bluetooth_audio module to unregister
  // PortStatusCallbacks
  // PortStatusCallbacks and PortStatusCallbacks_2_2
  // @param: cookie - indicates which bluetooth_audio output is
  static void UnregisterControlResultCback(const SessionType_2_1& session_type,
                                           uint16_t cookie) {
    std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
        BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
    if (session_ptr != nullptr) {
      session_ptr->GetAudioSession()->UnregisterStatusCback(cookie);
      session_ptr->UnregisterStatusCback(cookie);
    }
  }

+14 −1
Original line number Diff line number Diff line
@@ -60,7 +60,20 @@ class BluetoothAudioSessionReport_2_2 {
    std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
        BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
    if (session_ptr != nullptr) {
      session_ptr->GetAudioSession()->ReportControlStatus(start_resp, status);
      session_ptr->ReportControlStatus(start_resp, status);
    }
  }
  // The API reports the Bluetooth stack has replied the changed of the audio
  // configuration, and will inform registered bluetooth_audio outputs
  static void ReportAudioConfigChanged(
      const ::android::hardware::bluetooth::audio::V2_1::SessionType&
          session_type,
      const ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration&
          audio_config) {
    std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
        BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
    if (session_ptr != nullptr) {
      session_ptr->ReportAudioConfigChanged(audio_config);
    }
  }
};
Loading