Unified playback behavior and playlist binding detachment
This commit ensures unified playback behavior across all backends by automatically playing the current track from the queue when available. It also detaches playlist bindings from source renderers during control point operations, improving consistency and reliability of music playback transitions.
This commit is contained in:
@@ -1318,8 +1318,17 @@ impl ControlPoint {
|
||||
);
|
||||
}
|
||||
|
||||
// 5b. Detach playlist binding from source renderer
|
||||
self.detach_queue_playlist(source_renderer_id);
|
||||
tracing::debug!(
|
||||
source = source_renderer_id.0.as_str(),
|
||||
"Detached playlist binding from source renderer"
|
||||
);
|
||||
|
||||
// 6. Start playback on destination renderer (if there was a current item)
|
||||
if source_snapshot.current_index.is_some() && !source_snapshot.items.is_empty() {
|
||||
// play() détecte automatiquement la queue et joue le track courant
|
||||
// (comportement unifié pour tous les backends)
|
||||
if let Err(e) = dest_renderer.play() {
|
||||
tracing::warn!(
|
||||
dest = dest_renderer_id.0.as_str(),
|
||||
|
||||
@@ -298,9 +298,25 @@ impl MusicRenderer {
|
||||
}
|
||||
|
||||
/// Transport control: play
|
||||
///
|
||||
/// Démarre ou reprend la lecture. Si une queue non vide existe,
|
||||
/// joue le track courant de la queue automatiquement (comportement unifié pour tous les backends).
|
||||
pub fn play(&self) -> Result<(), ControlPointError> {
|
||||
// Vérifier si on a une queue non vide
|
||||
let queue = self.queue.lock().expect("Queue mutex poisoned");
|
||||
let queue_not_empty = queue.len().unwrap_or(0) > 0;
|
||||
drop(queue); // Libérer le lock avant l'appel au backend
|
||||
|
||||
if queue_not_empty {
|
||||
// Si on a des items dans la queue, jouer le track courant (ou le premier si aucun n'est sélectionné)
|
||||
// peek_current() initialise automatiquement l'index à 0 si nécessaire
|
||||
// Cela fonctionne pour tous les backends (UPnP interne, OpenHome, etc.)
|
||||
self.play_current_from_queue()
|
||||
} else {
|
||||
// Queue vide : déléguer au backend (reprend la lecture en cours, etc.)
|
||||
self.backend.lock().expect("Backend mutex poisoned").play()
|
||||
}
|
||||
}
|
||||
|
||||
/// Transport control: pause
|
||||
pub fn pause(&self) -> Result<(), ControlPointError> {
|
||||
|
||||
Reference in New Issue
Block a user