Start playing when adding to an empty queue
CI checks / stable / fmt (push) Successful in 3s Details
CI release / stable / cross-${{ matrix.target }} (x86_64-unknown-linux-gnu) (push) Successful in 5m52s Details
CI release / stable / cross-${{ matrix.target }} (aarch64-unknown-linux-gnu) (push) Successful in 7m41s Details
CI release / stable / cross-${{ matrix.target }} (armv7-unknown-linux-gnueabihf) (push) Successful in 7m40s Details

This commit is contained in:
Hans Mündelein 2023-06-14 11:49:27 +02:00
parent a4303b9b70
commit 24e968ac08
Signed by: hans
GPG Key ID: BA7B55E984CE74F4
2 changed files with 27 additions and 15 deletions

View File

@ -159,14 +159,20 @@ impl QueueManager {
} }
} }
pub fn append_tracks(&mut self, tracks: &[Track]) { pub fn append_tracks(&mut self, tracks: &[Track]) -> Option<Track> {
let len = self.tracks.len(); let len = self.tracks.len();
let is_empty = len == 0;
let order_additions: Vec<usize> = (len..len + tracks.len()).collect(); let order_additions: Vec<usize> = (len..len + tracks.len()).collect();
self.play_order.extend(order_additions); self.play_order.extend(order_additions);
self.tracks.extend(tracks.iter().cloned()); self.tracks.extend(tracks.iter().cloned());
if self.shuffle { if self.shuffle {
self.shuffle_behind(self.current_offset); self.shuffle_behind(self.current_offset);
} }
if is_empty {
self.current_track()
} else {
None
}
} }
pub fn remove_tracks(&mut self, positions: &[u32]) -> Option<Track> { pub fn remove_tracks(&mut self, positions: &[u32]) -> Option<Track> {
@ -204,11 +210,10 @@ impl QueueManager {
} }
} }
pub fn insert_tracks(&mut self, position: u32, tracks: &[Track]) { pub fn insert_tracks(&mut self, position: u32, tracks: &[Track]) -> Option<Track> {
let len = self.tracks.len(); let len = self.tracks.len();
if len == 0 { if len == 0 {
self.replace_with_tracks(tracks); return self.replace_with_tracks(tracks);
return;
} }
let order_additions: Vec<usize> = (len..len + tracks.len()).collect(); let order_additions: Vec<usize> = (len..len + tracks.len()).collect();
self.play_order.extend(order_additions); self.play_order.extend(order_additions);
@ -248,11 +253,12 @@ impl QueueManager {
if self.shuffle { if self.shuffle {
self.shuffle_behind(self.current_offset); self.shuffle_behind(self.current_offset);
} }
None
} }
pub fn queue_tracks(&mut self, tracks: &[Track]) { pub fn queue_tracks(&mut self, tracks: &[Track]) -> Option<Track> {
let pos = self.current_position(); let pos = self.current_position();
self.insert_tracks(pos as u32, tracks); self.insert_tracks(pos as u32, tracks)
} }
pub fn clear(&mut self, exclude_current: bool) -> bool { pub fn clear(&mut self, exclude_current: bool) -> bool {

View File

@ -143,20 +143,22 @@ impl Playback {
} }
} }
trace!("got tracks {:?}", all_tracks); trace!("got tracks {:?}", all_tracks);
{ let track = {
let Ok(mut queue) = self.queue.lock() else { let Ok(mut queue) = self.queue.lock() else {
debug!("got queue lock"); debug!("got queue lock");
continue; continue;
}; };
debug!("got queue lock"); debug!("got queue lock");
queue.queue_tracks(&all_tracks); let track = queue.queue_tracks(&all_tracks);
let queue_update_tx = self.update_tx.clone(); let queue_update_tx = self.update_tx.clone();
let update = StreamUpdate::Queue(queue.clone().into()); let update = StreamUpdate::Queue(queue.clone().into());
if let Err(err) = queue_update_tx.send(update) { if let Err(err) = queue_update_tx.send(update) {
trace!("{:?}", err) trace!("{:?}", err)
} }
} track
};
debug!("que lock released"); debug!("que lock released");
self.play(track).in_current_span().await;
} }
PlaybackMessage::Append { uuids, span } => { PlaybackMessage::Append { uuids, span } => {
@ -174,20 +176,22 @@ impl Playback {
} }
} }
trace!("got tracks {:?}", all_tracks); trace!("got tracks {:?}", all_tracks);
{ let track = {
let Ok(mut queue) = self.queue.lock() else { let Ok(mut queue) = self.queue.lock() else {
debug!("got queue lock"); debug!("got queue lock");
continue; continue;
}; };
debug!("got queue lock"); debug!("got queue lock");
queue.append_tracks(&all_tracks); let track = queue.append_tracks(&all_tracks);
let queue_update_tx = self.update_tx.clone(); let queue_update_tx = self.update_tx.clone();
let update = StreamUpdate::Queue(queue.clone().into()); let update = StreamUpdate::Queue(queue.clone().into());
if let Err(err) = queue_update_tx.send(update) { if let Err(err) = queue_update_tx.send(update) {
trace!("{:?}", err) trace!("{:?}", err)
} }
} track
};
debug!("queue lock released"); debug!("queue lock released");
self.play(track).in_current_span().await;
} }
PlaybackMessage::Remove { positions, span } => { PlaybackMessage::Remove { positions, span } => {
@ -247,20 +251,22 @@ impl Playback {
} }
} }
trace!("got tracks {:?}", all_tracks); trace!("got tracks {:?}", all_tracks);
{ let track = {
let Ok(mut queue) = self.queue.lock() else { let Ok(mut queue) = self.queue.lock() else {
debug!("got queue lock"); debug!("got queue lock");
continue; continue;
}; };
debug!("got queue lock"); debug!("got queue lock");
queue.insert_tracks(position, &all_tracks); let track = queue.insert_tracks(position, &all_tracks);
let queue_update_tx = self.update_tx.clone(); let queue_update_tx = self.update_tx.clone();
let update = StreamUpdate::Queue(queue.clone().into()); let update = StreamUpdate::Queue(queue.clone().into());
if let Err(err) = queue_update_tx.send(update) { if let Err(err) = queue_update_tx.send(update) {
trace!("{:?}", err) trace!("{:?}", err)
}; };
} track
};
debug!("queue lock released"); debug!("queue lock released");
self.play(track).in_current_span().await;
} }
PlaybackMessage::Clear { PlaybackMessage::Clear {