From dfd2e0af92989048d5abe4e3288e00c1547efbd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hans=20M=C3=BCndelein?= Date: Wed, 14 Jun 2023 10:44:26 +0200 Subject: [PATCH] Fix incorrect position update on queue and insert --- crabidy-server/src/lib.rs | 64 ++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/crabidy-server/src/lib.rs b/crabidy-server/src/lib.rs index 03c575e..f7feb3d 100644 --- a/crabidy-server/src/lib.rs +++ b/crabidy-server/src/lib.rs @@ -160,33 +160,6 @@ impl QueueManager { } } - pub fn queue_tracks(&mut self, tracks: &[Track]) { - let len = self.tracks.len(); - if len == 0 { - self.replace_with_tracks(tracks); - return; - } - let pos = self.current_position(); - let order_additions: Vec = (len..len + tracks.len()).collect(); - debug!( - "extending play of len {:#?} with {:#?}", - len, order_additions - ); - self.play_order.extend(order_additions); - let tail: Vec = self - .tracks - .splice((self.current_position() + 1).., tracks.to_vec()) - .collect(); - self.tracks.extend(tail); - // self.play_order - // .iter_mut() - // .filter(|i| (pos as usize) < **i) - // .for_each(|i| *i += len); - if self.shuffle { - self.shuffle_behind(self.current_offset); - } - } - pub fn remove_tracks(&mut self, positions: &[u32]) -> Option { let mut play_next = false; for pos in positions { @@ -224,6 +197,10 @@ impl QueueManager { pub fn insert_tracks(&mut self, position: u32, tracks: &[Track]) { let len = self.tracks.len(); + if len == 0 { + self.replace_with_tracks(tracks); + return; + } let order_additions: Vec = (len..len + tracks.len()).collect(); self.play_order.extend(order_additions); let tail: Vec = self @@ -231,11 +208,44 @@ impl QueueManager { .splice((position as usize + 1).., tracks.to_vec()) .collect(); self.tracks.extend(tail); + let mut changed: Vec = Vec::new(); + // in shuffle mode, it might be that we played already postions which are behind + // the insertion point and which postions are shifted by the lenght of the inserted + // track + for i in self + .play_order + .iter_mut() + .take(self.current_offset) + .filter(|i| (position as usize) < **i) + { + *i += len; + changed.push(*i); + } + if !self.shuffle { + // if we don't shuffle, there should be no positions alredy played behind the + // current track + assert!(changed.is_empty()); + } + // the newly inserted indices need to replaced with the ones that we already handled + self.play_order + .iter_mut() + .skip(self.current_offset) + .for_each(|i| { + if changed.contains(i) { + *i -= len; + } + }); + if self.shuffle { self.shuffle_behind(self.current_offset); } } + pub fn queue_tracks(&mut self, tracks: &[Track]) { + let pos = self.current_position(); + self.insert_tracks(pos as u32, tracks); + } + pub fn clear(&mut self, exclude_current: bool) -> bool { let current_track = self.current_track(); self.current_offset = 0;