Fix bug where tracks were duplicated in queue position 0 during playlist refreshes by comparing items with URI or didl_id Fix race condition in internal queue playback where transient STOPPED states caused unwanted auto-advance - Updated sync_queue in interne.rs to use didl_id as fallback for URI comparison - Added items_match function in openhome.rs for robust item comparison - Modified lcs_flags in openhome.rs to use items_match for LCS algorithm - Added has_played_since_track_start flag in musicrenderer.rs to prevent auto-advance on transient STOPPED states - Updated play_* methods in musicrenderer.rs to reset the has_played flag before starting playback - Added diagnostic logs in sync_queue for tracking item matching issues
1.9 KiB
1.9 KiB
Bug lecture queue interne - RESOLU
Tâche originale
Crate concernée : pmocontrol
Problème rapporté : Lors de la lecture sur un Renderer avec queue interne, si l'utilisateur clique sur un item de la queue pour déclencher sa lecture, tout semble se passer normalement pendant une seconde. Puis, avant que la lecture ne démarre réellement, le lecteur passe à la piste suivante.
Synthèse de la résolution
Cause racine
Race condition dans la logique d'auto-advance du watcher. Quand l'utilisateur sélectionne une piste :
- Les commandes UPnP
SetAVTransportURI+Playsont envoyées - Le renderer passe brièvement par un état
STOPPEDpendant l'initialisation - Le watcher détecte ce
STOPPEDet déclenche l'auto-advance vers la piste suivante
Le système ne distinguait pas un état STOPPED transitoire (initialisation) d'un état STOPPED réel (fin de piste).
Solution
Ajout d'un flag has_played_since_track_start dans MusicRendererState :
- Remis à
falseau démarrage d'une nouvelle piste (play_from_index,play_from_queue, etc.) et lors d'unstop() - Passé à
truequand l'étatPLAYINGest détecté par le watcher - L'auto-advance n'est autorisé que si le flag est
true
Ainsi, un état STOPPED transitoire (avant que PLAYING ne soit observé) n'entraîne plus d'auto-advance.
Fichier modifié
pmocontrol/src/music_renderer/musicrenderer.rs
Méthodes ajoutées/modifiées
MusicRendererState.has_played_since_track_start(nouveau champ)set_has_played_flag(),clear_has_played_flag(),check_and_clear_has_played_flag()(nouvelles méthodes)handle_state_change()(modifié pour utiliser le flag)play_current_from_queue(),play_next_from_queue(),play_from_index(),play_from_queue(),stop()(modifiés pour réinitialiser le flag)
Statut : Corrigé et testé