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

Commit b170116c authored by Ajay Panicker's avatar Ajay Panicker
Browse files

AVRCP: Fix size for Register Notification Response packets

Bug: 68854188
Test: ./run_host_unit_tests.py && ./run_unit_test.sh net_test_btpackets
Change-Id: I62d864e2c27d809944f160dc45906b90cbb84f3d
(cherry picked from commit 142763fa10b721c0d51d7585fc01bf127f5b9e32)
parent f6a8ffb9
Loading
Loading
Loading
Loading
+35 −22
Original line number Diff line number Diff line
@@ -123,13 +123,8 @@ RegisterNotificationResponseBuilder::MakeAddressedPlayerBuilder(
  std::unique_ptr<RegisterNotificationResponseBuilder> builder(
      new RegisterNotificationResponseBuilder(interim,
                                              Event::ADDRESSED_PLAYER_CHANGED));

  LOG(ERROR) << loghex(player_id);
  builder->data_ = ((uint32_t)player_id) << 16;
  LOG(ERROR) << loghex(builder->data_);
  builder->data_ |= uid_counter;
  LOG(ERROR) << loghex(builder->data_);

  return builder;
}

@@ -145,12 +140,38 @@ RegisterNotificationResponseBuilder::MakeUidsChangedBuilder(

size_t RegisterNotificationResponseBuilder::size() const {
  size_t data_size = 0;
  if (event_ == Event::PLAYBACK_STATUS_CHANGED)

  // We specifically avoid having a default case here in order to ensure that
  // there is an error in case an event isn't handled.
  switch (event_) {
    case Event::PLAYBACK_STATUS_CHANGED:
      data_size = 1;
  else if (event_ == Event::TRACK_CHANGED)
      break;
    case Event::TRACK_CHANGED:
      data_size = 8;
  else if (event_ == Event::PLAYBACK_POS_CHANGED)
      break;
    case Event::PLAYBACK_POS_CHANGED:
      data_size = 4;
      break;
    case Event::PLAYER_APPLICATION_SETTING_CHANGED:
      LOG(FATAL) << "Player Application Notification Not Implemented";
      break;
    case Event::NOW_PLAYING_CONTENT_CHANGED:
      data_size = 0;
      break;
    case Event::AVAILABLE_PLAYERS_CHANGED:
      data_size = 0;
      break;
    case Event::ADDRESSED_PLAYER_CHANGED:
      data_size = 4;
      break;
    case Event::UIDS_CHANGED:
      data_size = 2;
      break;
    case Event::VOLUME_CHANGED:
      LOG(FATAL) << "Volume Changed Notification Not Implemented";
      break;
  }

  return VendorPacket::kMinSize() + 1 + data_size;
}
@@ -161,15 +182,7 @@ bool RegisterNotificationResponseBuilder::Serialize(

  PacketBuilder::PushHeader(pkt);

  size_t data_size = 0;
  if (event_ == Event::PLAYBACK_STATUS_CHANGED)
    data_size = 1;
  else if (event_ == Event::TRACK_CHANGED)
    data_size = 8;
  else if (event_ == Event::PLAYBACK_POS_CHANGED)
    data_size = 4;

  VendorPacketBuilder::PushHeader(pkt, 1 + data_size);
  VendorPacketBuilder::PushHeader(pkt, size() - VendorPacket::kMinSize());

  AddPayloadOctets1(pkt, static_cast<uint8_t>(event_));
  switch (event_) {
@@ -205,9 +218,9 @@ bool RegisterNotificationResponseBuilder::Serialize(
      AddPayloadOctets2(pkt, base::ByteSwap(uid_counter));
      break;
    }
    default:
    case Event::VOLUME_CHANGED:
      // TODO (apanicke): Add Volume Changed builder for when we are controller.
      LOG(FATAL) << "Unhandled event for register notification";
      LOG(FATAL) << "Volume Changed Notification Not Implemented";
      break;
  }

+19 −0
Original line number Diff line number Diff line
@@ -111,6 +111,25 @@ std::vector<uint8_t> changed_play_pos_notification = {
    0x0d, 0x48, 0x00, 0x00, 0x19, 0x58, 0x31, 0x00,
    0x00, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00};

// AVRCP Interim Now Playing Changed Notification
std::vector<uint8_t> interim_now_playing_notification = {
    0x0f, 0x48, 0x00, 0x00, 0x19, 0x58, 0x31, 0x00, 0x00, 0x01, 0x09};

// AVRCP Interim Available Players Changed Notification
std::vector<uint8_t> interim_available_players_notification = {
    0x0f, 0x48, 0x00, 0x00, 0x19, 0x58, 0x31, 0x00, 0x00, 0x01, 0x0a};

// AVRCP Interim Addressed Player Changed Notification with active
// player ID 1
std::vector<uint8_t> interim_addressed_player_notification = {
    0x0f, 0x48, 0x00, 0x00, 0x19, 0x58, 0x31, 0x00,
    0x00, 0x05, 0x0b, 0x00, 0x01, 0x00, 0x00};

// AVRCP Interim UIDs Changed Notification
std::vector<uint8_t> interim_uids_notificaiton = {0x0f, 0x48, 0x00, 0x00, 0x19,
                                                  0x58, 0x31, 0x00, 0x00, 0x03,
                                                  0x0c, 0x00, 0x00};

// AVRCP Interim Volume Changed Notification with volume at 55% (0x47)
std::vector<uint8_t> interim_volume_changed_notification = {
    0x0f, 0x48, 0x00, 0x00, 0x19, 0x58, 0x31, 0x00, 0x00, 0x02, 0x0d, 0x47};
+37 −0
Original line number Diff line number Diff line
@@ -130,5 +130,42 @@ TEST(RegisterNotificationResponseBuilderTest, playPositionBuilderTest) {
  ASSERT_EQ(test_packet->GetData(), changed_play_pos_notification);
}

TEST(RegisterNotificationResponseBuilderTest, nowPlayingBuilderTest) {
  auto builder =
      RegisterNotificationResponseBuilder::MakeNowPlayingBuilder(true);
  ASSERT_EQ(builder->size(), interim_now_playing_notification.size());
  auto test_packet = TestRegNotifReqPacket::Make();
  builder->Serialize(test_packet);
  ASSERT_EQ(test_packet->GetData(), interim_now_playing_notification);
}

TEST(RegisterNotificationResponseBuilderTest, availablePlayersBuilderTest) {
  auto builder =
      RegisterNotificationResponseBuilder::MakeAvailablePlayersBuilder(true);
  ASSERT_EQ(builder->size(), interim_available_players_notification.size());
  auto test_packet = TestRegNotifReqPacket::Make();
  builder->Serialize(test_packet);
  ASSERT_EQ(test_packet->GetData(), interim_available_players_notification);
}

TEST(RegisterNotificationResponseBuilderTest, addressedPlayerBuilderTest) {
  auto builder =
      RegisterNotificationResponseBuilder::MakeAddressedPlayerBuilder(true, 1,
                                                                      0x0000);
  ASSERT_EQ(builder->size(), interim_addressed_player_notification.size());
  auto test_packet = TestRegNotifReqPacket::Make();
  builder->Serialize(test_packet);
  ASSERT_EQ(test_packet->GetData(), interim_addressed_player_notification);
}

TEST(RegisterNotificationResponseBuilderTest, uidsChangedBuilderTest) {
  auto builder =
      RegisterNotificationResponseBuilder::MakeUidsChangedBuilder(true, 0x0000);
  ASSERT_EQ(builder->size(), interim_uids_notificaiton.size());
  auto test_packet = TestRegNotifReqPacket::Make();
  builder->Serialize(test_packet);
  ASSERT_EQ(test_packet->GetData(), interim_uids_notificaiton);
}

}  // namespace avrcp
}  // namespace bluetooth