@@ -215,7 +215,14 @@ struct SpircTask {
215215 /// when no other future resolves, otherwise resets the delay
216216 update_state : bool ,
217217
218- state_sender : broadcast:: Sender < PlayerState > ,
218+ player_update_sender : broadcast:: Sender < PlayerUpdateEvent > ,
219+ cluster_update_sender : broadcast:: Sender < ClusterUpdateEvent > ,
220+ queue_update_sender : broadcast:: Sender < QueueUpdateEvent > ,
221+ player_state_sender : watch:: Sender < Option < PlayerState > > ,
222+ cluster_state_sender : watch:: Sender < ClusterState > ,
223+ queue_list_sender : watch:: Sender < QueueList > ,
224+ last_active_device_id : Option < String > ,
225+ last_player_state : Option < PlayerState > ,
219226
220227 spirc_id : usize ,
221228}
@@ -254,7 +261,12 @@ const UPDATE_STATE_DELAY: Duration = Duration::from_millis(200);
254261/// The spotify connect handle
255262pub struct Spirc {
256263 commands : mpsc:: UnboundedSender < SpircCommand > ,
257- state_sender : broadcast:: Sender < PlayerState > ,
264+ player_update_sender : broadcast:: Sender < PlayerUpdateEvent > ,
265+ cluster_update_sender : broadcast:: Sender < ClusterUpdateEvent > ,
266+ queue_update_sender : broadcast:: Sender < QueueUpdateEvent > ,
267+ player_state_sender : watch:: Sender < Option < PlayerState > > ,
268+ cluster_state_sender : watch:: Sender < ClusterState > ,
269+ queue_list_sender : watch:: Sender < QueueList > ,
258270}
259271
260272impl Spirc {
@@ -332,7 +344,18 @@ impl Spirc {
332344 let _ = session. login5 ( ) . auth_token ( ) . await ?;
333345
334346 let ( cmd_tx, cmd_rx) = mpsc:: unbounded_channel ( ) ;
335- let ( state_tx, _) = broadcast:: channel ( 1 ) ;
347+ let ( player_update_sender_tx, _) = broadcast:: channel ( 1 ) ;
348+ let ( cluster_update_sender_tx, _) = broadcast:: channel ( 1 ) ;
349+ let ( queue_update_sender_tx, _) = broadcast:: channel ( 1 ) ;
350+ let ( player_state_sender_tx, _) = watch:: channel ( None ) ;
351+ let ( cluster_state_sender_tx, _) = watch:: channel ( ClusterState {
352+ devices : HashMap :: new ( ) ,
353+ active_device_id : None ,
354+ } ) ;
355+ let ( queue_list_sender_tx, _) = watch:: channel ( QueueList {
356+ prev_tracks : Vec :: new ( ) ,
357+ next_tracks : Vec :: new ( ) ,
358+ } ) ;
336359
337360 let player_events = player. get_player_event_channel ( ) ;
338361
@@ -369,14 +392,26 @@ impl Spirc {
369392 update_volume : false ,
370393 update_state : false ,
371394
372- state_sender : state_tx. clone ( ) ,
395+ player_update_sender : player_update_tx. clone ( ) ,
396+ cluster_update_sender : cluster_update_tx. clone ( ) ,
397+ queue_update_sender : queue_update_tx. clone ( ) ,
398+ player_state_sender : player_state_sender_tx. clone ( ) ,
399+ cluster_state_sender : cluster_state_sender_tx. clone ( ) ,
400+ queue_list_sender : queue_list_sender_tx. clone ( ) ,
401+ last_active_device_id : None ,
402+ last_player_state : None ,
373403
374404 spirc_id,
375405 } ;
376406
377407 let spirc = Spirc {
378408 commands : cmd_tx,
379- state_sender : state_tx,
409+ player_update_sender : player_update_tx,
410+ cluster_update_sender : cluster_update_tx,
411+ queue_update_sender : queue_update_tx,
412+ player_state_sender : player_state_sender_tx,
413+ cluster_state_sender : cluster_state_sender_tx,
414+ queue_list_sender : queue_list_sender_tx,
380415 } ;
381416
382417 let initial_volume = task. connect_state . device_info ( ) . volume ;
@@ -549,12 +584,34 @@ impl Spirc {
549584 . send ( SpircCommand :: Transfer ( transfer_request) ) ?)
550585 }
551586
552- /// Get a channel which sends the [PlayerState] whenever it changes.
553- ///
554- /// Forwards the internal [PlayerState] when we are the active device. When we are only
555- /// a spectator, forwards any [PlayerState] update from the active player.
556- pub fn get_state_update_channel ( & self ) -> broadcast:: Receiver < PlayerState > {
557- self . state_sender . subscribe ( )
587+ /// Get a channel which sends lightweight playback state updates.
588+ pub fn get_player_update_channel ( & self ) -> broadcast:: Receiver < PlayerUpdateEvent > {
589+ self . player_update_sender . subscribe ( )
590+ }
591+
592+ /// Get a channel which sends device topology changes (devices appearing/disappearing, active device changes).
593+ pub fn get_cluster_update_channel ( & self ) -> broadcast:: Receiver < ClusterUpdateEvent > {
594+ self . cluster_update_sender . subscribe ( )
595+ }
596+
597+ /// Get a channel which sends queue change events when prev/next tracks differ.
598+ pub fn get_queue_update_channel ( & self ) -> broadcast:: Receiver < QueueUpdateEvent > {
599+ self . queue_update_sender . subscribe ( )
600+ }
601+
602+ /// Watch the current player state (full PlayerState)
603+ pub fn watch_player_state ( & self ) -> watch:: Receiver < Option < PlayerState > > {
604+ self . player_state_sender . subscribe ( )
605+ }
606+
607+ /// Watch the current cluster state (all devices and active device)
608+ pub fn watch_cluster_state ( & self ) -> watch:: Receiver < ClusterState > {
609+ self . cluster_state_sender . subscribe ( )
610+ }
611+
612+ /// Watch the current queue list (previous and next tracks)
613+ pub fn watch_queue_list ( & self ) -> watch:: Receiver < QueueList > {
614+ self . queue_list_sender . subscribe ( )
558615 }
559616}
560617
0 commit comments