Add exclude current clearing for the server
stable / cross-${{ matrix.target }} (aarch64-unknown-linux-gnu) Details
stable / cross-${{ matrix.target }} (armv7-unknown-linux-gnueabihf) Details
stable / cross-${{ matrix.target }} (x86_64-unknown-linux-gnu) Details
stable / fmt Details

This commit is contained in:
Hans Mündelein 2023-06-12 22:18:34 +02:00
parent 02f47d682b
commit 5d1a62c630
Signed by: hans
GPG Key ID: BA7B55E984CE74F4
5 changed files with 62 additions and 19 deletions

View File

@ -14,11 +14,11 @@ service CrabidyService {
rpc Append(AppendRequest) returns (AppendResponse);
rpc Remove(RemoveRequest) returns (RemoveResponse);
rpc Insert(InsertRequest) returns (InsertResponse);
rpc ClearQueue(ClearQueueRequest) returns (ClearQueueResponse);
rpc SetCurrent(SetCurrentRequest) returns (SetCurrentResponse);
rpc ToggleShuffle(ToggleShuffleRequest) returns (ToggleShuffleResponse);
rpc ToggleRepeat(ToggleRepeatRequest) returns (ToggleRepeatResponse);
rpc GetUpdateStream(GetUpdateStreamRequest) returns (stream GetUpdateStreamResponse);
rpc ClearQueue(ClearQueueRequest) returns (ClearQueueResponse);
rpc SaveQueue(SaveQueueRequest) returns (SaveQueueResponse);
// Playback

View File

@ -219,6 +219,20 @@ impl QueueManager {
self.shuffle_behind(self.current_offset);
}
}
pub fn clear(&mut self, exclude_current: bool) -> bool {
let current_track = self.current_track();
self.current_offset = 0;
self.tracks.clear();
if exclude_current {
if let Some(track) = current_track {
self.tracks.push(track);
}
}
!exclude_current
}
}
#[cfg(test)]

View File

@ -170,6 +170,10 @@ pub enum PlaybackMessage {
uuids: Vec<String>,
span: Span,
},
Clear {
exclude_current: bool,
span: Span,
},
SetCurrent {
position: u32,
span: Span,

View File

@ -225,6 +225,27 @@ impl Playback {
debug!("queue lock released");
}
PlaybackMessage::Clear {
exclude_current,
span,
} => {
let _e = span.enter();
debug!("clearing");
let should_stop = {
let mut queue = self.queue.lock().unwrap();
debug!("got queue lock");
let should_stop = queue.clear(exclude_current);
let queue_update_tx = self.update_tx.clone();
let update = StreamUpdate::Queue(queue.clone().into());
queue_update_tx.send(update).unwrap();
should_stop
};
debug!("queue lock released");
if should_stop {
self.player.stop().in_current_span().await;
}
}
PlaybackMessage::SetCurrent {
position: queue_position,
span,

View File

@ -201,6 +201,28 @@ impl CrabidyService for RpcService {
Ok(Response::new(reply))
}
#[instrument(skip(self, request), fields(exclude_current))]
async fn clear_queue(
&self,
request: tonic::Request<ClearQueueRequest>,
) -> std::result::Result<tonic::Response<ClearQueueResponse>, tonic::Status> {
let exclude_current = request.into_inner().exclude_current;
Span::current().record("exclude_current", exclude_current);
debug!("Received clear_queue request");
let playback_tx = self.playback_tx.clone();
let span = debug_span!("play-chan");
playback_tx
.send_async(PlaybackMessage::Clear {
exclude_current,
span,
})
.in_current_span()
.await
.map_err(|_| Status::internal("Failed to send request via channel"))?;
let reply = ClearQueueResponse {};
Ok(Response::new(reply))
}
#[instrument(skip(self, request), fields(position))]
async fn set_current(
&self,
@ -279,24 +301,6 @@ impl CrabidyService for RpcService {
Ok(Response::new(Box::pin(output_stream)))
}
#[instrument(skip(self, _request))]
async fn clear_queue(
&self,
_request: tonic::Request<ClearQueueRequest>,
) -> std::result::Result<tonic::Response<ClearQueueResponse>, tonic::Status> {
debug!("Received clear_queue request");
let playback_tx = self.playback_tx.clone();
let span = debug_span!("play-chan");
let uuids = Vec::new();
playback_tx
.send_async(PlaybackMessage::Replace { uuids, span })
.in_current_span()
.await
.map_err(|_| Status::internal("Failed to send request via channel"))?;
let reply = ClearQueueResponse {};
Ok(Response::new(reply))
}
#[instrument(skip(self, _request))]
async fn save_queue(
&self,