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

Commit 8be89bba authored by howardchung's avatar howardchung
Browse files

Floss: Wire A2DP Sink missing callbacks to floss topshim

Some a2dp sink callbacks are missing the wiring. This crash the daemon
when a peer connect to our a2dp sink profile.

Bug: 264745185
Test: run AVRCP/CT/PTH/BV-01-C along with the top of this series
Tag: #floss

Change-Id: I6759daf9e3c28df039e783d9375b5f04a14774c9
parent cfc21525
Loading
Loading
Loading
Loading
+20 −3
Original line number Diff line number Diff line
@@ -31,9 +31,26 @@ namespace rust {
namespace internal {
static A2dpSinkIntf* g_a2dp_sink_if;

static void connection_state_cb(const RawAddress&, btav_connection_state_t, const btav_error_t&) {}
static void audio_state_cb(const RawAddress&, btav_audio_state_t) {}
static void audio_config_cb(const RawAddress&, uint32_t, uint8_t) {}
static A2dpError to_rust_error(const btav_error_t& error) {
  A2dpError a2dp_error = {
      .status = error.status,
      .error_code = error.error_code,
      .error_msg = error.error_msg.value_or(""),
  };
  return a2dp_error;
}

static void connection_state_cb(
    const RawAddress& addr, btav_connection_state_t state, const btav_error_t& error) {
  A2dpError a2dp_error = to_rust_error(error);
  rusty::sink_connection_state_callback(addr, state, a2dp_error);
}
static void audio_state_cb(const RawAddress& addr, btav_audio_state_t state) {
  rusty::sink_audio_state_callback(addr, state);
}
static void audio_config_cb(const RawAddress& addr, uint32_t sample_rate, uint8_t channel_count) {
  rusty::sink_audio_config_callback(addr, sample_rate, channel_count);
}

btav_sink_callbacks_t g_a2dp_sink_callbacks = {
    sizeof(btav_sink_callbacks_t),
+17 −1
Original line number Diff line number Diff line
@@ -221,6 +221,11 @@ pub mod ffi {
            codecs_selectable_capabilities: &Vec<A2dpCodecConfig>,
        );
        fn mandatory_codec_preferred_callback(addr: RawAddress);

        // Currently only by qualification tests.
        fn sink_audio_config_callback(addr: RawAddress, sample_rate: u32, channel_count: u8);
        fn sink_connection_state_callback(addr: RawAddress, state: u32, error: A2dpError);
        fn sink_audio_state_callback(addr: RawAddress, state: u32);
    }
}

@@ -382,7 +387,9 @@ impl A2dp {

#[derive(Debug)]
pub enum A2dpSinkCallbacks {
    ConnectionState(RawAddress, BtavConnectionState),
    ConnectionState(RawAddress, BtavConnectionState, A2dpError),
    AudioState(RawAddress, BtavAudioState),
    AudioConfig(RawAddress, u32, u8),
}

pub struct A2dpSinkCallbacksDispatcher {
@@ -391,6 +398,15 @@ pub struct A2dpSinkCallbacksDispatcher {

type A2dpSinkCb = Arc<Mutex<A2dpSinkCallbacksDispatcher>>;

cb_variant!(A2dpSinkCb, sink_connection_state_callback -> A2dpSinkCallbacks::ConnectionState,
    RawAddress, u32 -> BtavConnectionState, FfiA2dpError -> A2dpError,{
        let _2 = _2.into();
});

cb_variant!(A2dpSinkCb, sink_audio_state_callback -> A2dpSinkCallbacks::AudioState, RawAddress, u32 -> BtavAudioState);

cb_variant!(A2dpSinkCb, sink_audio_config_callback -> A2dpSinkCallbacks::AudioConfig, RawAddress, u32, u8);

pub struct A2dpSink {
    internal: cxx::UniquePtr<ffi::A2dpSinkIntf>,
    _is_init: bool,