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

Commit 6e415034 authored by Jakub Pawłowski's avatar Jakub Pawłowski Committed by Gerrit Code Review
Browse files

Merge "leaudio: Fix update metadata"

parents 2d55f053 9bcfbdcb
Loading
Loading
Loading
Loading
+38 −32
Original line number Diff line number Diff line
@@ -222,8 +222,8 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
        }

        while (leAudioDevice) {
          PrepareAndSendUpdateMetadata(group, leAudioDevice,
                                       metadata_context_type, ccid_list);
          PrepareAndSendUpdateMetadata(leAudioDevice, metadata_context_type,
                                       ccid_list);
          leAudioDevice = group->GetNextActiveDevice(leAudioDevice);
        }
        break;
@@ -2118,16 +2118,13 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
                                      GATT_WRITE_NO_RSP, NULL, NULL);
  }

  void PrepareAndSendUpdateMetadata(LeAudioDeviceGroup* group,
                                    LeAudioDevice* leAudioDevice,
  void PrepareAndSendUpdateMetadata(LeAudioDevice* leAudioDevice,
                                    le_audio::types::AudioContexts context_type,
                                    const std::vector<uint8_t>& ccid_list) {
    std::vector<struct le_audio::client_parser::ascs::ctp_update_metadata>
        confs;

    for (; leAudioDevice;
         leAudioDevice = group->GetNextActiveDevice(leAudioDevice)) {
      if (!leAudioDevice->IsMetadataChanged(context_type, ccid_list)) continue;
    if (!leAudioDevice->IsMetadataChanged(context_type, ccid_list)) return;

    /* Request server to update ASEs with new metadata */
    for (struct ase* ase = leAudioDevice->GetFirstActiveAse(); ase != nullptr;
@@ -2136,6 +2133,16 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
                ADDRESS_TO_LOGGABLE_CSTR(leAudioDevice->address_), ase->id,
                ase->cis_id, ToString(ase->state).c_str());

      if (ase->state != AseState::BTA_LE_AUDIO_ASE_STATE_ENABLING &&
          ase->state != AseState::BTA_LE_AUDIO_ASE_STATE_STREAMING) {
        /* This might happen when update metadata happens on late connect */
        LOG_DEBUG(
            "Metadata for ase_id %d cannot be updated due to invalid ase state "
            "- see log above",
            ase->id);
        continue;
      }

      /* Filter multidirectional audio context for each ase direction */
      auto directional_audio_context =
          context_type & leAudioDevice->GetAvailableContexts(ase->direction);
@@ -2156,14 +2163,13 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
      confs.push_back(conf);
    }

    if (confs.size() != 0) {
      std::vector<uint8_t> value;
      le_audio::client_parser::ascs::PrepareAseCtpUpdateMetadata(confs, value);

      BtaGattQueue::WriteCharacteristic(leAudioDevice->conn_id_,
                                        leAudioDevice->ctp_hdls_.val_hdl, value,
                                        GATT_WRITE_NO_RSP, NULL, NULL);

      return;
    }
  }