Files
pmomusic/Blackboard/Done/bug_lecture_queue_interne.md
Eric Coissac 5701fbf465 Fix queue duplication and internal queue playback bugs
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
2026-01-16 22:46:05 +01:00

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 :

  1. Les commandes UPnP SetAVTransportURI + Play sont envoyées
  2. Le renderer passe brièvement par un état STOPPED pendant l'initialisation
  3. Le watcher détecte ce STOPPED et 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 à false au démarrage d'une nouvelle piste (play_from_index, play_from_queue, etc.) et lors d'un stop()
  • Passé à true quand l'état PLAYING est 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é