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

Commit dbf94364 authored by shihchienc's avatar shihchienc Committed by Patrick Chang
Browse files

floss: topshim: add lc3 callback and related functions

1. Add lc3 support in topshim

Tag: #floss
Bug: 277338500
Test: manual
Test: ./build.py && /build.py --target test
Change-Id: I42314b14ae95bf5547e8725d9e8fef55a37d7e3e
parent 65ab0e90
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -872,6 +872,11 @@ impl IBluetooth for BluetoothDBus {
    fn is_wbs_supported(&self) -> bool {
        dbus_generated!()
    }

    #[dbus_method("IsSwbSupported")]
    fn is_swb_supported(&self) -> bool {
        dbus_generated!()
    }
}

pub(crate) struct BluetoothQALegacyDBus {
+5 −0
Original line number Diff line number Diff line
@@ -635,6 +635,11 @@ impl IBluetooth for IBluetoothDBus {
    fn is_wbs_supported(&self) -> bool {
        dbus_generated!()
    }

    #[dbus_method("IsSwbSupported")]
    fn is_swb_supported(&self) -> bool {
        dbus_generated!()
    }
}

impl_dbus_arg_enum!(SocketType);
+7 −0
Original line number Diff line number Diff line
@@ -209,6 +209,9 @@ pub trait IBluetooth {

    /// Returns whether WBS is supported.
    fn is_wbs_supported(&self) -> bool;

    /// Returns whether SWB is supported.
    fn is_swb_supported(&self) -> bool;
}

/// Adapter API for Bluetooth qualification and verification.
@@ -2359,6 +2362,10 @@ impl IBluetooth for Bluetooth {
    fn is_wbs_supported(&self) -> bool {
        self.intf.lock().unwrap().get_wbs_supported()
    }

    fn is_swb_supported(&self) -> bool {
        self.intf.lock().unwrap().get_swb_supported()
    }
}

impl BtifSdpCallbacks for Bluetooth {
+32 −8
Original line number Diff line number Diff line
@@ -104,7 +104,7 @@ pub trait IBluetoothMedia {
    /// Returns true iff A2DP audio has started.
    fn get_a2dp_audio_started(&mut self, address: String) -> bool;

    /// Returns the negotiated codec (CVSD=1, mSBC=2) to use if HFP audio has started.
    /// Returns the negotiated codec (CVSD=1, mSBC=2, LC3=4) to use if HFP audio has started.
    /// Returns 0 if HFP audio hasn't started.
    fn get_hfp_audio_final_codecs(&mut self, address: String) -> u8;

@@ -769,13 +769,36 @@ impl BluetoothMedia {
                    .unwrap()
                    .set_battery_info(self.battery_provider_id, battery_set);
            }
            HfpCallbacks::CapsUpdate(wbs_supported, addr) => {
                let hfp_cap = match wbs_supported {
            HfpCallbacks::WbsCapsUpdate(wbs_supported, addr) => {
                if let Some(cur_hfp_cap) = self.hfp_cap.get_mut(&addr) {
                    if wbs_supported {
                        *cur_hfp_cap |= HfpCodecCapability::MSBC;
                    } else if (*cur_hfp_cap & HfpCodecCapability::MSBC) == HfpCodecCapability::MSBC
                    {
                        *cur_hfp_cap ^= HfpCodecCapability::MSBC;
                    }
                } else {
                    let new_hfp_cap = match wbs_supported {
                        true => HfpCodecCapability::CVSD | HfpCodecCapability::MSBC,
                        false => HfpCodecCapability::CVSD,
                    };

                self.hfp_cap.insert(addr, hfp_cap);
                    self.hfp_cap.insert(addr, new_hfp_cap);
                }
            }
            HfpCallbacks::SwbCapsUpdate(swb_supported, addr) => {
                if let Some(cur_hfp_cap) = self.hfp_cap.get_mut(&addr) {
                    if swb_supported {
                        *cur_hfp_cap |= HfpCodecCapability::LC3;
                    } else if (*cur_hfp_cap & HfpCodecCapability::LC3) == HfpCodecCapability::LC3 {
                        *cur_hfp_cap ^= HfpCodecCapability::LC3;
                    }
                } else {
                    let new_hfp_cap = match swb_supported {
                        true => HfpCodecCapability::CVSD | HfpCodecCapability::LC3,
                        false => HfpCodecCapability::CVSD,
                    };
                    self.hfp_cap.insert(addr, new_hfp_cap);
                }
            }
            HfpCallbacks::IndicatorQuery(addr) => {
                match self.hfp.as_mut() {
@@ -2168,6 +2191,7 @@ impl IBluetoothMedia for BluetoothMedia {

        match self.hfp_audio_state.get(&addr) {
            Some(BthfAudioState::Connected) => match self.hfp_cap.get(&addr) {
                Some(caps) if (*caps & HfpCodecCapability::LC3) == HfpCodecCapability::LC3 => 4,
                Some(caps) if (*caps & HfpCodecCapability::MSBC) == HfpCodecCapability::MSBC => 2,
                Some(caps) if (*caps & HfpCodecCapability::CVSD) == HfpCodecCapability::CVSD => 1,
                _ => {
+6 −1
Original line number Diff line number Diff line
@@ -156,7 +156,12 @@ class DBusHeadsetCallbacks : public headset::Callbacks {

  void WbsCallback(headset::bthf_wbs_config_t wbs, RawAddress* addr) override {
    LOG_INFO("WbsCallback %d from %s", wbs, ADDRESS_TO_LOGGABLE_CSTR(*addr));
    rusty::hfp_caps_update_callback(wbs == headset::BTHF_WBS_YES, *addr);
    rusty::hfp_wbs_caps_update_callback(wbs == headset::BTHF_WBS_YES, *addr);
  }

  void SwbCallback(headset::bthf_swb_config_t swb, RawAddress* addr) override {
    LOG_INFO("SwbCallback %d from %s", swb, ADDRESS_TO_LOGGABLE_CSTR(*addr));
    rusty::hfp_swb_caps_update_callback(swb == headset::BTHF_SWB_YES, *addr);
  }

  void AtChldCallback(headset::bthf_chld_type_t chld, RawAddress* bd_addr) override {
Loading