fix: player deadlock related to start_watching
This commit is contained in:
@@ -1,5 +1,4 @@
|
||||
use r2d2::Pool;
|
||||
use r2d2_sqlite::SqliteConnectionManager;
|
||||
use deadpool_sqlite::Pool;
|
||||
use std::{pin::Pin, time::Duration};
|
||||
use tokio::sync::mpsc;
|
||||
use tokio_stream::{wrappers::ReceiverStream, Stream};
|
||||
@@ -20,11 +19,11 @@ use crate::{
|
||||
|
||||
pub struct PlayerService {
|
||||
state: GrooveState,
|
||||
pool: Pool<SqliteConnectionManager>,
|
||||
pool: Pool,
|
||||
}
|
||||
|
||||
impl PlayerService {
|
||||
pub fn new(state: GrooveState, pool: Pool<SqliteConnectionManager>) -> Self {
|
||||
pub fn new(state: GrooveState, pool: Pool) -> Self {
|
||||
Self { state, pool }
|
||||
}
|
||||
}
|
||||
@@ -37,28 +36,21 @@ impl Player for PlayerService {
|
||||
&self,
|
||||
request: tonic::Request<TrackRequest>,
|
||||
) -> Result<tonic::Response<PlayTrackResponse>, tonic::Status> {
|
||||
let Ok(db) = self.pool.get() else {
|
||||
return Err(tonic::Status::internal(""));
|
||||
};
|
||||
|
||||
let input = request.get_ref();
|
||||
|
||||
let Ok(track) = get_track(&db, input.hash.as_str()) else {
|
||||
return Err(tonic::Status::not_found(""));
|
||||
let Ok(track) = get_track(&self.pool, input.hash.as_str()).await else {
|
||||
return Err(tonic::Status::not_found("Could not get track"));
|
||||
};
|
||||
|
||||
let Ok(track_path) = get_track_full_path(&db, input.hash.as_str()) else {
|
||||
return Err(tonic::Status::not_found(""));
|
||||
let Ok(track_path) = get_track_full_path(&self.pool, input.hash.as_str()).await else {
|
||||
return Err(tonic::Status::not_found("Could not get track file path"));
|
||||
};
|
||||
|
||||
let state = self.state.lock().await;
|
||||
|
||||
let _ = state
|
||||
.player
|
||||
.lock()
|
||||
.await
|
||||
.play_track(track.clone(), track_path, true)
|
||||
.await;
|
||||
let player = &mut state.player.lock().await;
|
||||
|
||||
let _ = player.play_track(track.clone(), track_path, true);
|
||||
|
||||
let response = PlayTrackResponse {
|
||||
track: Some(proto::library::Track::from(track.into())),
|
||||
@@ -74,7 +66,7 @@ impl Player for PlayerService {
|
||||
) -> Result<tonic::Response<PauseState>, tonic::Status> {
|
||||
let state = self.state.lock().await;
|
||||
|
||||
state.player.lock().await.resume().await;
|
||||
state.player.lock().await.resume();
|
||||
|
||||
let response = PauseState { is_paused: false };
|
||||
|
||||
@@ -87,7 +79,7 @@ impl Player for PlayerService {
|
||||
) -> Result<tonic::Response<PauseState>, tonic::Status> {
|
||||
let state = self.state.lock().await;
|
||||
|
||||
state.player.lock().await.pause().await;
|
||||
state.player.lock().await.pause();
|
||||
|
||||
let response = PauseState { is_paused: true };
|
||||
|
||||
@@ -100,7 +92,7 @@ impl Player for PlayerService {
|
||||
) -> Result<tonic::Response<PauseState>, tonic::Status> {
|
||||
let state = self.state.lock().await;
|
||||
|
||||
let is_paused = state.player.lock().await.toggle_pause().await;
|
||||
let is_paused = state.player.lock().await.toggle_pause();
|
||||
|
||||
let response = PauseState { is_paused };
|
||||
|
||||
@@ -114,7 +106,7 @@ impl Player for PlayerService {
|
||||
let input = request.get_ref();
|
||||
let state = self.state.lock().await;
|
||||
|
||||
state.player.lock().await.set_position(input.position).await;
|
||||
state.player.lock().await.set_position(input.position);
|
||||
|
||||
let response = SeekPositionResponse {
|
||||
position: input.position,
|
||||
@@ -130,7 +122,7 @@ impl Player for PlayerService {
|
||||
let input = request.get_ref();
|
||||
let state = self.state.lock().await;
|
||||
|
||||
state.player.lock().await.set_volume(input.volume).await;
|
||||
state.player.lock().await.set_volume(input.volume);
|
||||
|
||||
let response = SetVolumeResponse {
|
||||
volume: input.volume,
|
||||
@@ -159,7 +151,6 @@ impl Player for PlayerService {
|
||||
.lock()
|
||||
.await
|
||||
.get_snapshot()
|
||||
.await
|
||||
.into()))
|
||||
.await
|
||||
{
|
||||
@@ -181,17 +172,13 @@ impl Player for PlayerService {
|
||||
&self,
|
||||
request: tonic::Request<TrackRequest>,
|
||||
) -> Result<tonic::Response<Queue>, tonic::Status> {
|
||||
let Ok(db) = self.pool.get() else {
|
||||
return Err(tonic::Status::internal(""));
|
||||
};
|
||||
|
||||
let input = request.get_ref();
|
||||
|
||||
let Ok(track) = get_track(&db, input.hash.as_str()) else {
|
||||
let Ok(track) = get_track(&self.pool, input.hash.as_str()).await else {
|
||||
return Err(tonic::Status::not_found(""));
|
||||
};
|
||||
|
||||
let Ok(track_path) = get_track_full_path(&db, input.hash.as_str()) else {
|
||||
let Ok(track_path) = get_track_full_path(&self.pool, input.hash.as_str()).await else {
|
||||
return Err(tonic::Status::not_found(""));
|
||||
};
|
||||
|
||||
@@ -202,7 +189,7 @@ impl Player for PlayerService {
|
||||
return Err(tonic::Status::internal(""));
|
||||
}
|
||||
|
||||
let queue = player.queue().await;
|
||||
let queue = player.queue();
|
||||
|
||||
let response = Queue {
|
||||
tracks: queue_to_track_vec(queue),
|
||||
@@ -215,28 +202,24 @@ impl Player for PlayerService {
|
||||
&self,
|
||||
request: tonic::Request<TrackRequest>,
|
||||
) -> Result<tonic::Response<Queue>, tonic::Status> {
|
||||
let Ok(db) = self.pool.get() else {
|
||||
return Err(tonic::Status::internal(""));
|
||||
};
|
||||
|
||||
let input = request.get_ref();
|
||||
|
||||
let Ok(track) = get_track(&db, input.hash.as_str()) else {
|
||||
let Ok(track) = get_track(&self.pool, input.hash.as_str()).await else {
|
||||
return Err(tonic::Status::not_found(""));
|
||||
};
|
||||
|
||||
let Ok(track_path) = get_track_full_path(&db, input.hash.as_str()) else {
|
||||
let Ok(track_path) = get_track_full_path(&self.pool, input.hash.as_str()).await else {
|
||||
return Err(tonic::Status::not_found(""));
|
||||
};
|
||||
|
||||
let state = self.state.lock().await;
|
||||
let mut player = state.player.lock().await;
|
||||
|
||||
if let Err(_) = player.play_track_next(track, &track_path).await {
|
||||
if let Err(_) = player.play_track_next(track, &track_path) {
|
||||
return Err(tonic::Status::internal(""));
|
||||
}
|
||||
|
||||
let queue = player.queue().await;
|
||||
let queue = player.queue();
|
||||
|
||||
let response = Queue {
|
||||
tracks: queue_to_track_vec(queue),
|
||||
@@ -253,11 +236,11 @@ impl Player for PlayerService {
|
||||
|
||||
let mut player = state.player.lock().await;
|
||||
|
||||
if let Err(_) = player.skip_track().await {
|
||||
if let Err(_) = player.skip_track() {
|
||||
return Err(tonic::Status::internal(""));
|
||||
};
|
||||
|
||||
let response = player.get_snapshot().await.into();
|
||||
let response = player.get_snapshot().into();
|
||||
|
||||
Ok(tonic::Response::new(response))
|
||||
}
|
||||
@@ -275,11 +258,11 @@ impl Player for PlayerService {
|
||||
let state = self.state.lock().await;
|
||||
let mut player = state.player.lock().await;
|
||||
|
||||
if let Err(_) = player.skip_to_queue_index(index).await {
|
||||
if let Err(_) = player.skip_to_queue_index(index) {
|
||||
return Err(tonic::Status::internal(""));
|
||||
};
|
||||
|
||||
let response = player.get_snapshot().await.into();
|
||||
let response = player.get_snapshot().into();
|
||||
|
||||
Ok(tonic::Response::new(response))
|
||||
}
|
||||
@@ -301,11 +284,11 @@ impl Player for PlayerService {
|
||||
let state = self.state.lock().await;
|
||||
let mut player = state.player.lock().await;
|
||||
|
||||
if !player.swap_queue_indices(a, b).await {
|
||||
if !player.swap_queue_indices(a, b) {
|
||||
return Err(tonic::Status::internal(""));
|
||||
};
|
||||
|
||||
let queue = player.queue().await;
|
||||
let queue = player.queue();
|
||||
|
||||
let response = Queue {
|
||||
tracks: queue_to_track_vec(queue),
|
||||
|
||||
Reference in New Issue
Block a user