Loading system/packet/avrcp/register_notification_packet.cc +35 −22 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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; } Loading @@ -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_) { Loading Loading @@ -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; } Loading system/packet/tests/avrcp/avrcp_test_packets.h +19 −0 Original line number Diff line number Diff line Loading @@ -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}; Loading system/packet/tests/avrcp/register_notification_packet_test.cc +37 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
system/packet/avrcp/register_notification_packet.cc +35 −22 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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; } Loading @@ -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_) { Loading Loading @@ -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; } Loading
system/packet/tests/avrcp/avrcp_test_packets.h +19 −0 Original line number Diff line number Diff line Loading @@ -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}; Loading
system/packet/tests/avrcp/register_notification_packet_test.cc +37 −0 Original line number Diff line number Diff line Loading @@ -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