diff --git a/bumble/avrcp.py b/bumble/avrcp.py index 5054e80a..a96571a6 100644 --- a/bumble/avrcp.py +++ b/bumble/avrcp.py @@ -1517,6 +1517,8 @@ class PlaybackPositionChangedEvent(Event): @dataclass class TrackChangedEvent(Event): event_id = EventId.TRACK_CHANGED + NO_TRACK = 0xFFFFFFFFFFFFFFFF + uid: int = field(metadata=_UINT64_BE_METADATA) @@ -1653,6 +1655,7 @@ class Delegate: self.player_app_settings = {} self.uid_counter = 0 self.addressed_player_id = 0 + self.current_track_uid = TrackChangedEvent.NO_TRACK async def get_supported_events(self) -> list[EventId]: return self.supported_events @@ -1714,6 +1717,9 @@ class Delegate: async def get_addressed_player_id(self) -> int: return self.addressed_player_id + async def get_current_track_uid(self) -> int: + return self.current_track_uid + # TODO add other delegate methods @@ -2845,6 +2851,10 @@ class Protocol(utils.EventEmitter): ) case EventId.UIDS_CHANGED: event = UidsChangedEvent(await self.delegate.get_uid_counter()) + case EventId.TRACK_CHANGED: + event = TrackChangedEvent( + await self.delegate.get_current_track_uid() + ) case _: logger.warning( "Event supported but not handled %s", command.event_id diff --git a/tests/avrcp_test.py b/tests/avrcp_test.py index b37b184d..1c50f7f9 100644 --- a/tests/avrcp_test.py +++ b/tests/avrcp_test.py @@ -135,7 +135,7 @@ def test_command(command: avrcp.Command): "event,", [ avrcp.UidsChangedEvent(uid_counter=7), - avrcp.TrackChangedEvent(identifier=b'12356'), + avrcp.TrackChangedEvent(uid=12356), avrcp.VolumeChangedEvent(volume=9), avrcp.PlaybackStatusChangedEvent(play_status=avrcp.PlayStatus.PLAYING), avrcp.AddressedPlayerChangedEvent( @@ -715,6 +715,24 @@ async def test_monitor_now_playing_content(): await anext(now_playing_iter) +# ----------------------------------------------------------------------------- +@pytest.mark.asyncio +async def test_monitor_track_changed(): + two_devices = await TwoDevices.create_with_avdtp() + + delegate = two_devices.protocols[1].delegate = avrcp.Delegate( + [avrcp.EventId.TRACK_CHANGED] + ) + delegate.current_track_uid = avrcp.TrackChangedEvent.NO_TRACK + track_iter = two_devices.protocols[0].monitor_track_changed() + + # Interim + assert (await anext(track_iter)) == avrcp.TrackChangedEvent.NO_TRACK + # Changed + two_devices.protocols[1].notify_track_changed(1) + assert (await anext(track_iter)) == 1 + + # ----------------------------------------------------------------------------- @pytest.mark.asyncio async def test_monitor_uid_changed(): @@ -729,7 +747,6 @@ async def test_monitor_uid_changed(): # Interim assert (await anext(uid_iter)) == 0 # Changed - # Changed two_devices.protocols[1].notify_uids_changed(1) assert (await anext(uid_iter)) == 1