Loading system/bta/le_audio/client.cc +42 −48 Original line number Diff line number Diff line Loading @@ -156,6 +156,7 @@ class LeAudioClientImpl : public LeAudioClient { active_group_id_(bluetooth::groups::kGroupUnknown), stream_request_started_(false), current_context_type_(LeAudioContextType::MEDIA), upcoming_context_type_(LeAudioContextType::MEDIA), audio_receiver_state_(AudioState::IDLE), audio_sender_state_(AudioState::IDLE), current_source_codec_config({0, 0, 0, 0}), Loading Loading @@ -2283,6 +2284,7 @@ class LeAudioClientImpl : public LeAudioClient { void Dump(int fd) { dprintf(fd, " Active group: %d\n", active_group_id_); dprintf(fd, " current content type: 0x%08hx\n", current_context_type_); dprintf(fd, " upcoming content type: 0x%08hx\n", upcoming_context_type_); printCurrentStreamConfiguration(fd); dprintf(fd, " ----------------\n "); dprintf(fd, " LE Audio Groups:\n"); Loading Loading @@ -2376,6 +2378,7 @@ class LeAudioClientImpl : public LeAudioClient { " context: " << static_cast<int>(context_type); } current_context_type_ = upcoming_context_type_; } void OnAudioResume() { Loading @@ -2391,33 +2394,13 @@ class LeAudioClientImpl : public LeAudioClient { return; } std::optional<LeAudioCodecConfiguration> source_configuration = group->GetCodecConfigurationByDirection( current_context_type_, le_audio::types::kLeAudioDirectionSink); std::optional<LeAudioCodecConfiguration> sink_configuration = group->GetCodecConfigurationByDirection( current_context_type_, le_audio::types::kLeAudioDirectionSource); /* Check if Bluetooth audio HAL session requires reconfiguration */ bool sessions_requires_update = (((source_configuration && (*source_configuration != current_source_codec_config)) || (!source_configuration && !current_source_codec_config.IsInvalid()))) || ((sink_configuration && (*sink_configuration != current_sink_codec_config)) || (!sink_configuration && !current_sink_codec_config.IsInvalid())); if (sessions_requires_update) { if (upcoming_context_type_ != current_context_type_) { /* Wait until session is updated */ CancelStreamingRequest(); do_in_main_thread(FROM_HERE, base::Bind(&LeAudioClientImpl::UpdateCurrentHalSessions, base::Unretained(instance), active_group_id_, current_context_type_)); return; } /* TODO check if group already started streaming */ GroupStream(active_group_id_, static_cast<uint16_t>(current_context_type_)); } Loading Loading @@ -2661,6 +2644,8 @@ class LeAudioClientImpl : public LeAudioClient { } auto new_context = ChooseContextType(contexts); DLOG(INFO) << __func__ << " new_context_type: " << static_cast<int>(new_context); auto group = aseGroups_.FindById(active_group_id_); if (!group) { Loading @@ -2669,10 +2654,13 @@ class LeAudioClientImpl : public LeAudioClient { return; } if ((new_context != current_context_type_) && (group->GetState() == AseState::BTA_LE_AUDIO_ASE_STATE_STREAMING)) { if (new_context == current_context_type_) { LOG(INFO) << __func__ << " Context did not changed."; return; } if (active_group_id_ == bluetooth::groups::kGroupUnknown) { LOG(WARNING) << ", cannot start straming if no active group set"; LOG(WARNING) << ", cannot start streaming if no active group set"; return; } Loading @@ -2688,22 +2676,27 @@ class LeAudioClientImpl : public LeAudioClient { (*source_configuration != current_source_codec_config)) || (sink_configuration && (*sink_configuration != current_sink_codec_config))) { do_in_main_thread( FROM_HERE, base::Bind(&LeAudioClientImpl::UpdateCurrentHalSessions, base::Unretained(instance), group->group_id_, new_context)); current_context_type_ = new_context; DLOG(INFO) << __func__ << " Will UpdateCurrentHalSessions group" << group->group_id_ << "for context type: " << static_cast<int>(upcoming_context_type_); if (group->GetState() == AseState::BTA_LE_AUDIO_ASE_STATE_STREAMING) { GroupStop(group->group_id_); return; } upcoming_context_type_ = new_context; /* Schedule HAL Session update */ do_in_main_thread(FROM_HERE, base::Bind(&LeAudioClientImpl::UpdateCurrentHalSessions, base::Unretained(instance), group->group_id_, upcoming_context_type_)); } else { /* Configuration is the same for new context, just will do update * metadata of stream */ GroupStream(active_group_id_, static_cast<uint16_t>(new_context)); } current_context_type_ = new_context; } static void OnGattReadRspStatic(uint16_t conn_id, tGATT_STATUS status, Loading Loading @@ -2881,6 +2874,7 @@ class LeAudioClientImpl : public LeAudioClient { int active_group_id_; bool stream_request_started_; LeAudioContextType current_context_type_; LeAudioContextType upcoming_context_type_; /* Microphone (s) */ AudioState audio_receiver_state_; Loading system/stack/btm/btm_iso_impl.h +20 −13 Original line number Diff line number Diff line Loading @@ -43,9 +43,10 @@ static constexpr uint8_t kIsoHeaderWithTsLen = 12; static constexpr uint8_t kIsoHeaderWithoutTsLen = 8; static constexpr uint8_t kStateFlagsNone = 0x00; static constexpr uint8_t kStateFlagIsConnected = 0x01; static constexpr uint8_t kStateFlagHasDataPathSet = 0x02; static constexpr uint8_t kStateFlagIsBroadcast = 0x04; static constexpr uint8_t kStateFlagIsConnecting = 0x01; static constexpr uint8_t kStateFlagIsConnected = 0x02; static constexpr uint8_t kStateFlagHasDataPathSet = 0x04; static constexpr uint8_t kStateFlagIsBroadcast = 0x10; struct iso_sync_info { uint32_t first_sync_ts; Loading Loading @@ -194,20 +195,22 @@ struct iso_impl { LOG_ASSERT(len == 2) << "Invalid packet length: " << len; STREAM_TO_UINT16(status, stream); if (status == HCI_SUCCESS) { /* Wait for connection established event */ return; } for (auto cis : conn_params.conn_pairs) { for (auto cis_param : conn_params.conn_pairs) { cis_establish_cmpl_evt evt; if (status == HCI_SUCCESS) { /* Set connecting flag and wait for connection established event */ auto cis = GetCisIfKnown(cis_param.cis_conn_handle); cis->state_flags |= kStateFlagIsConnecting; } else { evt.status = status; evt.cis_conn_hdl = cis.cis_conn_handle; evt.cis_conn_hdl = cis_param.cis_conn_handle; evt.cig_id = 0xFF; cig_callbacks_->OnCisEvent(kIsoEventCisEstablishCmpl, &evt); } } } void establish_cis(struct iso_manager::cis_establish_params conn_params) { for (auto& el : conn_params.conn_pairs) { Loading @@ -225,7 +228,9 @@ struct iso_impl { void disconnect_cis(uint16_t cis_handle, uint8_t reason) { auto cis = GetCisIfKnown(cis_handle); LOG_ASSERT(cis) << "No such cis"; LOG_ASSERT(cis->state_flags & kStateFlagIsConnected) << "Not connected"; LOG_ASSERT(cis->state_flags & kStateFlagIsConnected || cis->state_flags & kStateFlagIsConnecting) << "Not connected"; bluetooth::legacy::hci::GetInterface().Disconnect( cis_handle, static_cast<tHCI_STATUS>(reason)); } Loading Loading @@ -465,6 +470,8 @@ struct iso_impl { if (evt.status == HCI_SUCCESS) cis->state_flags |= kStateFlagIsConnected; cis->state_flags &= ~kStateFlagIsConnecting; evt.cig_id = cis->cig_id; cig_callbacks_->OnCisEvent(kIsoEventCisEstablishCmpl, &evt); } Loading Loading
system/bta/le_audio/client.cc +42 −48 Original line number Diff line number Diff line Loading @@ -156,6 +156,7 @@ class LeAudioClientImpl : public LeAudioClient { active_group_id_(bluetooth::groups::kGroupUnknown), stream_request_started_(false), current_context_type_(LeAudioContextType::MEDIA), upcoming_context_type_(LeAudioContextType::MEDIA), audio_receiver_state_(AudioState::IDLE), audio_sender_state_(AudioState::IDLE), current_source_codec_config({0, 0, 0, 0}), Loading Loading @@ -2283,6 +2284,7 @@ class LeAudioClientImpl : public LeAudioClient { void Dump(int fd) { dprintf(fd, " Active group: %d\n", active_group_id_); dprintf(fd, " current content type: 0x%08hx\n", current_context_type_); dprintf(fd, " upcoming content type: 0x%08hx\n", upcoming_context_type_); printCurrentStreamConfiguration(fd); dprintf(fd, " ----------------\n "); dprintf(fd, " LE Audio Groups:\n"); Loading Loading @@ -2376,6 +2378,7 @@ class LeAudioClientImpl : public LeAudioClient { " context: " << static_cast<int>(context_type); } current_context_type_ = upcoming_context_type_; } void OnAudioResume() { Loading @@ -2391,33 +2394,13 @@ class LeAudioClientImpl : public LeAudioClient { return; } std::optional<LeAudioCodecConfiguration> source_configuration = group->GetCodecConfigurationByDirection( current_context_type_, le_audio::types::kLeAudioDirectionSink); std::optional<LeAudioCodecConfiguration> sink_configuration = group->GetCodecConfigurationByDirection( current_context_type_, le_audio::types::kLeAudioDirectionSource); /* Check if Bluetooth audio HAL session requires reconfiguration */ bool sessions_requires_update = (((source_configuration && (*source_configuration != current_source_codec_config)) || (!source_configuration && !current_source_codec_config.IsInvalid()))) || ((sink_configuration && (*sink_configuration != current_sink_codec_config)) || (!sink_configuration && !current_sink_codec_config.IsInvalid())); if (sessions_requires_update) { if (upcoming_context_type_ != current_context_type_) { /* Wait until session is updated */ CancelStreamingRequest(); do_in_main_thread(FROM_HERE, base::Bind(&LeAudioClientImpl::UpdateCurrentHalSessions, base::Unretained(instance), active_group_id_, current_context_type_)); return; } /* TODO check if group already started streaming */ GroupStream(active_group_id_, static_cast<uint16_t>(current_context_type_)); } Loading Loading @@ -2661,6 +2644,8 @@ class LeAudioClientImpl : public LeAudioClient { } auto new_context = ChooseContextType(contexts); DLOG(INFO) << __func__ << " new_context_type: " << static_cast<int>(new_context); auto group = aseGroups_.FindById(active_group_id_); if (!group) { Loading @@ -2669,10 +2654,13 @@ class LeAudioClientImpl : public LeAudioClient { return; } if ((new_context != current_context_type_) && (group->GetState() == AseState::BTA_LE_AUDIO_ASE_STATE_STREAMING)) { if (new_context == current_context_type_) { LOG(INFO) << __func__ << " Context did not changed."; return; } if (active_group_id_ == bluetooth::groups::kGroupUnknown) { LOG(WARNING) << ", cannot start straming if no active group set"; LOG(WARNING) << ", cannot start streaming if no active group set"; return; } Loading @@ -2688,22 +2676,27 @@ class LeAudioClientImpl : public LeAudioClient { (*source_configuration != current_source_codec_config)) || (sink_configuration && (*sink_configuration != current_sink_codec_config))) { do_in_main_thread( FROM_HERE, base::Bind(&LeAudioClientImpl::UpdateCurrentHalSessions, base::Unretained(instance), group->group_id_, new_context)); current_context_type_ = new_context; DLOG(INFO) << __func__ << " Will UpdateCurrentHalSessions group" << group->group_id_ << "for context type: " << static_cast<int>(upcoming_context_type_); if (group->GetState() == AseState::BTA_LE_AUDIO_ASE_STATE_STREAMING) { GroupStop(group->group_id_); return; } upcoming_context_type_ = new_context; /* Schedule HAL Session update */ do_in_main_thread(FROM_HERE, base::Bind(&LeAudioClientImpl::UpdateCurrentHalSessions, base::Unretained(instance), group->group_id_, upcoming_context_type_)); } else { /* Configuration is the same for new context, just will do update * metadata of stream */ GroupStream(active_group_id_, static_cast<uint16_t>(new_context)); } current_context_type_ = new_context; } static void OnGattReadRspStatic(uint16_t conn_id, tGATT_STATUS status, Loading Loading @@ -2881,6 +2874,7 @@ class LeAudioClientImpl : public LeAudioClient { int active_group_id_; bool stream_request_started_; LeAudioContextType current_context_type_; LeAudioContextType upcoming_context_type_; /* Microphone (s) */ AudioState audio_receiver_state_; Loading
system/stack/btm/btm_iso_impl.h +20 −13 Original line number Diff line number Diff line Loading @@ -43,9 +43,10 @@ static constexpr uint8_t kIsoHeaderWithTsLen = 12; static constexpr uint8_t kIsoHeaderWithoutTsLen = 8; static constexpr uint8_t kStateFlagsNone = 0x00; static constexpr uint8_t kStateFlagIsConnected = 0x01; static constexpr uint8_t kStateFlagHasDataPathSet = 0x02; static constexpr uint8_t kStateFlagIsBroadcast = 0x04; static constexpr uint8_t kStateFlagIsConnecting = 0x01; static constexpr uint8_t kStateFlagIsConnected = 0x02; static constexpr uint8_t kStateFlagHasDataPathSet = 0x04; static constexpr uint8_t kStateFlagIsBroadcast = 0x10; struct iso_sync_info { uint32_t first_sync_ts; Loading Loading @@ -194,20 +195,22 @@ struct iso_impl { LOG_ASSERT(len == 2) << "Invalid packet length: " << len; STREAM_TO_UINT16(status, stream); if (status == HCI_SUCCESS) { /* Wait for connection established event */ return; } for (auto cis : conn_params.conn_pairs) { for (auto cis_param : conn_params.conn_pairs) { cis_establish_cmpl_evt evt; if (status == HCI_SUCCESS) { /* Set connecting flag and wait for connection established event */ auto cis = GetCisIfKnown(cis_param.cis_conn_handle); cis->state_flags |= kStateFlagIsConnecting; } else { evt.status = status; evt.cis_conn_hdl = cis.cis_conn_handle; evt.cis_conn_hdl = cis_param.cis_conn_handle; evt.cig_id = 0xFF; cig_callbacks_->OnCisEvent(kIsoEventCisEstablishCmpl, &evt); } } } void establish_cis(struct iso_manager::cis_establish_params conn_params) { for (auto& el : conn_params.conn_pairs) { Loading @@ -225,7 +228,9 @@ struct iso_impl { void disconnect_cis(uint16_t cis_handle, uint8_t reason) { auto cis = GetCisIfKnown(cis_handle); LOG_ASSERT(cis) << "No such cis"; LOG_ASSERT(cis->state_flags & kStateFlagIsConnected) << "Not connected"; LOG_ASSERT(cis->state_flags & kStateFlagIsConnected || cis->state_flags & kStateFlagIsConnecting) << "Not connected"; bluetooth::legacy::hci::GetInterface().Disconnect( cis_handle, static_cast<tHCI_STATUS>(reason)); } Loading Loading @@ -465,6 +470,8 @@ struct iso_impl { if (evt.status == HCI_SUCCESS) cis->state_flags |= kStateFlagIsConnected; cis->state_flags &= ~kStateFlagIsConnecting; evt.cig_id = cis->cig_id; cig_callbacks_->OnCisEvent(kIsoEventCisEstablishCmpl, &evt); } Loading