Fix reactivity and position tracking in music renderer
This commit addresses two main issues: 1. In the webapp, we ensure proper reactivity by explicitly reassigning the snapshot object when updating track information, which triggers Vue's reactivity system. 2. In the music renderer, we improve position tracking by: - Adding detailed tracing when position changes - Refactoring rel_time calculation to only apply to streams, preserving backend values for regular files - Enhancing logging in the OpenHome renderer to include elapsed time and formatted relative time These changes improve the reliability of playback position tracking and ensure proper UI updates when track information changes.
This commit is contained in:
@@ -463,7 +463,18 @@ impl MusicRenderer {
|
||||
let changed = watched
|
||||
.position
|
||||
.as_ref()
|
||||
.map(|prev| !playback_position_equal(prev, &position))
|
||||
.map(|prev| {
|
||||
let equal = playback_position_equal(prev, &position);
|
||||
if !equal {
|
||||
tracing::trace!(
|
||||
"MusicRenderer [{}]: Position changed - prev_rel_time={:?}, new_rel_time={:?}",
|
||||
self.info.friendly_name(),
|
||||
prev.rel_time,
|
||||
position.rel_time
|
||||
);
|
||||
}
|
||||
!equal
|
||||
})
|
||||
.unwrap_or(true);
|
||||
|
||||
if changed {
|
||||
@@ -943,27 +954,26 @@ impl MusicRenderer {
|
||||
}
|
||||
}
|
||||
|
||||
// Calculate rel_time from track_start_time if available (backend values are unreliable)
|
||||
if let Some(start_time) = self.track_start_time() {
|
||||
if let Ok(elapsed) = start_time.elapsed() {
|
||||
let secs = elapsed.as_secs() as u32;
|
||||
let hours = secs / 3600;
|
||||
let minutes = (secs % 3600) / 60;
|
||||
let seconds = secs % 60;
|
||||
let new_rel_time = format!("{:02}:{:02}:{:02}", hours, minutes, seconds);
|
||||
tracing::info!(
|
||||
"MusicRenderer: Patching rel_time: backend={:?} -> calculated={} (elapsed={}s)",
|
||||
position_info.rel_time,
|
||||
new_rel_time,
|
||||
secs
|
||||
);
|
||||
position_info.rel_time = Some(new_rel_time);
|
||||
// Pour les flux continus uniquement : calculer rel_time depuis track_start_time
|
||||
// Pour les fichiers normaux : garder les valeurs du backend
|
||||
let is_stream = self.is_playing_a_stream();
|
||||
if is_stream {
|
||||
if let Some(start_time) = self.track_start_time() {
|
||||
if let Ok(elapsed) = start_time.elapsed() {
|
||||
let secs = elapsed.as_secs() as u32;
|
||||
let hours = secs / 3600;
|
||||
let minutes = (secs % 3600) / 60;
|
||||
let seconds = secs % 60;
|
||||
let new_rel_time = format!("{:02}:{:02}:{:02}", hours, minutes, seconds);
|
||||
tracing::debug!(
|
||||
"MusicRenderer [{}]: Stream - calculating rel_time from track_start_time: {} (elapsed={}s)",
|
||||
self.info.friendly_name(),
|
||||
new_rel_time,
|
||||
secs
|
||||
);
|
||||
position_info.rel_time = Some(new_rel_time);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
tracing::info!(
|
||||
"MusicRenderer: No track_start_time, keeping backend rel_time={:?}",
|
||||
position_info.rel_time
|
||||
);
|
||||
}
|
||||
|
||||
Ok(position_info)
|
||||
|
||||
@@ -369,15 +369,19 @@ impl PlaybackPosition for OpenHomeRenderer {
|
||||
Some(format_hhmmss_u32(time_info.duration_secs))
|
||||
};
|
||||
|
||||
let rel_time = format_hhmmss_u32(time_info.elapsed_secs);
|
||||
|
||||
tracing::trace!(
|
||||
"OpenHome playback_position: duration_secs={}, track_duration={:?}",
|
||||
"OpenHome playback_position: duration_secs={}, track_duration={:?}, elapsed_secs={}, rel_time={}",
|
||||
time_info.duration_secs,
|
||||
track_duration
|
||||
track_duration,
|
||||
time_info.elapsed_secs,
|
||||
rel_time
|
||||
);
|
||||
|
||||
Ok(PlaybackPositionInfo {
|
||||
track: track_id,
|
||||
rel_time: Some(format_hhmmss_u32(time_info.elapsed_secs)),
|
||||
rel_time: Some(rel_time),
|
||||
abs_time: None,
|
||||
track_duration,
|
||||
track_metadata: track_metadata_xml,
|
||||
|
||||
Reference in New Issue
Block a user