Skip to content

Commit fb0203b

Browse files
committed
add broadcast/watch channel fields and public api
1 parent ea633fc commit fb0203b

1 file changed

Lines changed: 68 additions & 11 deletions

File tree

connect/src/spirc.rs

Lines changed: 68 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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
255262
pub 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

260272
impl 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

Comments
 (0)