Ajout de la gestion de la position en temps réel et amélioration de la gestion de la durée
Ajout de l'événement Position pour envoyer la position courante ~1/s pendant la lecture. Modification de la gestion de la durée dans le registry pour ne pas écraser une durée déjà connue par la source (priorité à la source pour les flux radio). Mise à jour du handler position_update pour utiliser update_duration au lieu de update_position, et suppression de la gestion de position_sec qui est maintenant gérée par PlayerEvent::Position. Le serveur gère maintenant la position via les événements Position émis par PlayerSource, et la durée est uniquement utilisée comme fallback pour les sources sans durée connue.
This commit is contained in:
@@ -152,15 +152,19 @@ impl RendererRegistry {
|
||||
.map(|i| i.device_instance.clone())
|
||||
}
|
||||
|
||||
/// Met à jour la position et la durée depuis le navigateur (audio.currentTime).
|
||||
pub fn update_position(&self, instance_id: &str, position_sec: f64, duration_sec: Option<f64>) {
|
||||
/// Met à jour la durée depuis le navigateur.
|
||||
/// La position est gérée par PlayerSource via PlayerEvent::Position.
|
||||
/// On n'utilise duration_sec que si la source ne la connaît pas (flux radio sans durée).
|
||||
pub fn update_duration(&self, instance_id: &str, duration_sec: Option<f64>) {
|
||||
let instances = self.instances.read();
|
||||
if let Some(instance) = instances.get(instance_id) {
|
||||
let mut s = instance.state.write();
|
||||
s.position = Some(crate::pipeline::seconds_to_upnp_time(position_sec));
|
||||
if let Some(dur) = duration_sec {
|
||||
if dur > 0.0 {
|
||||
s.duration = Some(crate::pipeline::seconds_to_upnp_time(dur));
|
||||
// N'écraser la durée que si elle n'est pas déjà connue (la source est prioritaire)
|
||||
if s.duration.is_none() {
|
||||
if let Some(dur) = duration_sec {
|
||||
if dur > 0.0 {
|
||||
s.duration = Some(crate::pipeline::seconds_to_upnp_time(dur));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user