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

Commit b50cf10a authored by Jakub Tyszkowski's avatar Jakub Tyszkowski
Browse files

LeAudio: Support for Live recordings

This change adds a mechanism for selecting the proper
audio set configuration based on the recording tracks metadata.
The sink and source contexts are both taken into the account
when the configuraiton is selected.

Bug: 256967923
Bug: 243630511
Bug: 256549386
Bug: 229041682
Test: 'atest --host bluetooth_le_audio_test bluetooth_le_audio_client_test --no-bazel-mode' plus manual testing
Change-Id: I82861bd9e109b392b4c1261e3cca9895e1efe2b6
parent 5b38fa67
Loading
Loading
Loading
Loading
+309 −126

File changed.

Preview size limit exceeded, changes collapsed.

+2 −2
Original line number Diff line number Diff line
@@ -1629,9 +1629,9 @@ LeAudioDeviceGroup::GetActiveConfiguration(void) {

std::optional<LeAudioCodecConfiguration>
LeAudioDeviceGroup::GetCodecConfigurationByDirection(
    types::LeAudioContextType group_context_type, uint8_t direction) {
    types::LeAudioContextType group_context_type, uint8_t direction) const {
  const set_configurations::AudioSetConfiguration* audio_set_conf =
      available_context_to_configuration_map[group_context_type];
      available_context_to_configuration_map.at(group_context_type);
  LeAudioCodecConfiguration group_config = {0, 0, 0, 0};
  if (!audio_set_conf) return std::nullopt;

+1 −1
Original line number Diff line number Diff line
@@ -313,7 +313,7 @@ class LeAudioDeviceGroup {
      LeAudioDevice* leAudioDevice,
      const set_configurations::AudioSetConfiguration* audio_set_conf);
  std::optional<LeAudioCodecConfiguration> GetCodecConfigurationByDirection(
      types::LeAudioContextType group_context_type, uint8_t direction);
      types::LeAudioContextType group_context_type, uint8_t direction) const;
  bool IsContextSupported(types::LeAudioContextType group_context_type);
  bool IsMetadataChanged(types::AudioContexts group_context_type,
                         const std::vector<uint8_t>& ccid_list);
+11 −8
Original line number Diff line number Diff line
@@ -75,6 +75,10 @@ constexpr int max_num_of_ases = 5;

static constexpr char kNotifyUpperLayerAboutGroupBeingInIdleDuringCall[] =
    "persist.bluetooth.leaudio.notify.idle.during.call";
const char* test_flags[] = {
    "INIT_logging_debug_enabled_for_all=true",
    nullptr,
};

void osi_property_set_bool(const char* key, bool value);

@@ -292,6 +296,8 @@ class MockLeAudioSourceHalClient : public LeAudioSourceAudioHalClient {
class UnicastTestNoInit : public Test {
 protected:
  void SetUpMockAudioHal() {
    bluetooth::common::InitFlags::Load(test_flags);

    /* Since these are returned by the Acquire() methods as unique_ptrs, we
     * will not free them manually.
     */
@@ -3698,28 +3704,26 @@ TEST_F(UnicastTest, MicrophoneAttachToCurrentMediaScenario) {
  ConnectLeAudio(test_address0);
  ASSERT_NE(group_id, bluetooth::groups::kGroupUnknown);

  // Start streaming
  uint8_t cis_count_out = 1;
  uint8_t cis_count_in = 0;

  // Audio sessions are started only when device gets active
  EXPECT_CALL(*mock_le_audio_source_hal_client_, Start(_, _)).Times(1);
  EXPECT_CALL(*mock_le_audio_sink_hal_client_, Start(_, _)).Times(1);
  LeAudioClient::Get()->GroupSetActive(group_id);

  StartStreaming(AUDIO_USAGE_MEDIA, AUDIO_CONTENT_TYPE_MUSIC, group_id,
                 AUDIO_SOURCE_MIC);

  EXPECT_CALL(
      mock_state_machine_,
      StartStream(_, le_audio::types::LeAudioContextType::VOICEASSISTANTS, _,
                  _))
      .Times(1);

  StartStreaming(AUDIO_USAGE_MEDIA, AUDIO_CONTENT_TYPE_MUSIC, group_id,
                 AUDIO_SOURCE_MIC);
  Mock::VerifyAndClearExpectations(&mock_audio_hal_client_callbacks_);
  Mock::VerifyAndClearExpectations(&mock_le_audio_source_hal_client_);
  SyncOnMainLoop();

  // Verify Data transfer on one audio source cis
  uint8_t cis_count_out = 1;
  uint8_t cis_count_in = 0;
  TestAudioDataTransfer(group_id, cis_count_out, cis_count_in, 1920);

  // Suspend
@@ -3727,7 +3731,6 @@ TEST_F(UnicastTest, MicrophoneAttachToCurrentMediaScenario) {
  LeAudioClient::Get()->GroupSuspend(group_id);
  Mock::VerifyAndClearExpectations(&mock_audio_hal_client_callbacks_);
  Mock::VerifyAndClearExpectations(&mock_le_audio_source_hal_client_);
  // Mock::VerifyAndClearExpectations(&mock_audio_hal_client_);

  // Resume
  StartStreaming(AUDIO_USAGE_MEDIA, AUDIO_CONTENT_TYPE_MUSIC, group_id,
+1 −1
Original line number Diff line number Diff line
@@ -122,7 +122,7 @@ struct AudioSetConfigurationProviderJson {
      case types::LeAudioContextType::GAME:
        return "Game";
      case types::LeAudioContextType::VOICEASSISTANTS:
        return "VoiceAssinstants";
        return "VoiceAssistants";
      default:
        return kDefaultScenario;
    }
Loading