diff options
Diffstat (limited to 'src/daemon.rs')
| -rw-r--r-- | src/daemon.rs | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/src/daemon.rs b/src/daemon.rs index 3379c7b..9e02e3f 100644 --- a/src/daemon.rs +++ b/src/daemon.rs | |||
| @@ -150,8 +150,12 @@ impl Queue { | |||
| 150 | } | 150 | } |
| 151 | 151 | ||
| 152 | fn insert_after_current(&mut self, path: PathBuf) { | 152 | fn insert_after_current(&mut self, path: PathBuf) { |
| 153 | let insert_idx = self.position + 1; | 153 | if self.tracks.is_empty() { |
| 154 | self.tracks.insert(insert_idx, Track::from_path(path)); | 154 | self.tracks.push(Track::from_path(path)); |
| 155 | } else { | ||
| 156 | let insert_idx = self.position + 1; | ||
| 157 | self.tracks.insert(insert_idx, Track::from_path(path)); | ||
| 158 | } | ||
| 155 | self.update_shuffle_indices(); | 159 | self.update_shuffle_indices(); |
| 156 | } | 160 | } |
| 157 | 161 | ||
| @@ -165,11 +169,15 @@ impl Queue { | |||
| 165 | } | 169 | } |
| 166 | 170 | ||
| 167 | fn update_shuffle_indices(&mut self) { | 171 | fn update_shuffle_indices(&mut self) { |
| 168 | self.shuffled_indices = (0..self.tracks.len()).collect(); | 172 | let len = self.tracks.len(); |
| 173 | self.shuffled_indices = (0..len).collect(); | ||
| 169 | if let ShuffleMode::All = self.shuffle { | 174 | if let ShuffleMode::All = self.shuffle { |
| 170 | use rand::seq::SliceRandom; | 175 | use rand::seq::SliceRandom; |
| 171 | let mut rng = rand::rng(); | 176 | let mut rng = rand::rng(); |
| 172 | self.shuffled_indices.shuffle(&mut rng); | 177 | let pos = self.position.min(len.saturating_sub(1)); |
| 178 | if pos + 1 < len { | ||
| 179 | self.shuffled_indices[pos + 1..].shuffle(&mut rng); | ||
| 180 | } | ||
| 173 | } | 181 | } |
| 174 | } | 182 | } |
| 175 | 183 | ||
| @@ -583,10 +591,13 @@ fn process_command( | |||
| 583 | let path = std::path::PathBuf::from(path_str.clone()); | 591 | let path = std::path::PathBuf::from(path_str.clone()); |
| 584 | if path.is_file() { | 592 | if path.is_file() { |
| 585 | if let Ok(mut q) = queue.lock() { | 593 | if let Ok(mut q) = queue.lock() { |
| 594 | let was_empty = q.tracks.is_empty(); | ||
| 586 | match position { | 595 | match position { |
| 587 | "now" => { | 596 | "now" => { |
| 588 | q.insert_after_current(path.clone()); | 597 | q.insert_after_current(path.clone()); |
| 589 | q.position += 1; | 598 | if !was_empty { |
| 599 | q.position += 1; | ||
| 600 | } | ||
| 590 | if let Some(track) = q.track_at(q.position) { | 601 | if let Some(track) = q.track_at(q.position) { |
| 591 | audio.play(track.path.clone()); | 602 | audio.play(track.path.clone()); |
| 592 | } | 603 | } |
| @@ -609,12 +620,15 @@ fn process_command( | |||
| 609 | match find_audio_in_dir(&path) { | 620 | match find_audio_in_dir(&path) { |
| 610 | Some(files) if !files.is_empty() => { | 621 | Some(files) if !files.is_empty() => { |
| 611 | if let Ok(mut q) = queue.lock() { | 622 | if let Ok(mut q) = queue.lock() { |
| 623 | let was_empty = q.tracks.is_empty(); | ||
| 612 | match position { | 624 | match position { |
| 613 | "now" => { | 625 | "now" => { |
| 614 | for file in &files { | 626 | for file in &files { |
| 615 | q.insert_after_current(file.clone()); | 627 | q.insert_after_current(file.clone()); |
| 616 | } | 628 | } |
| 617 | q.position += 1; | 629 | if !was_empty { |
| 630 | q.position += 1; | ||
| 631 | } | ||
| 618 | if let Some(track) = q.track_at(q.position) { | 632 | if let Some(track) = q.track_at(q.position) { |
| 619 | audio.play(track.path.clone()); | 633 | audio.play(track.path.clone()); |
| 620 | } | 634 | } |
| @@ -638,8 +652,10 @@ fn process_command( | |||
| 638 | for file in &files { | 652 | for file in &files { |
| 639 | q.add_track(file.clone()); | 653 | q.add_track(file.clone()); |
| 640 | } | 654 | } |
| 641 | if let Some(track) = q.current() { | 655 | if !audio.is_playing() { |
| 642 | audio.play(track.path.clone()); | 656 | if let Some(track) = files.first() { |
| 657 | audio.play(track.clone()); | ||
| 658 | } | ||
| 643 | } | 659 | } |
| 644 | format!("Queued {} tracks from: {}\n", files.len(), path_str) | 660 | format!("Queued {} tracks from: {}\n", files.len(), path_str) |
| 645 | } | 661 | } |
