mirror of
https://github.com/johrpan/musicus.git
synced 2025-10-26 19:57:25 +01:00
Fix MPRIS player
This commit is contained in:
parent
8950b04ed2
commit
a70b7b5453
1 changed files with 41 additions and 32 deletions
|
|
@ -47,7 +47,7 @@ mod imp {
|
||||||
|
|
||||||
pub play: OnceCell<gstreamer_play::Play>,
|
pub play: OnceCell<gstreamer_play::Play>,
|
||||||
pub play_signal_adapter: OnceCell<gstreamer_play::PlaySignalAdapter>,
|
pub play_signal_adapter: OnceCell<gstreamer_play::PlaySignalAdapter>,
|
||||||
pub mpris: OnceCell<mpris_server::Player>,
|
pub mpris_player: OnceCell<mpris_server::Player>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Player {
|
impl Player {
|
||||||
|
|
@ -87,7 +87,7 @@ mod imp {
|
||||||
let item_clone = item.clone();
|
let item_clone = item.clone();
|
||||||
glib::spawn_future_local(async move {
|
glib::spawn_future_local(async move {
|
||||||
obj.imp()
|
obj.imp()
|
||||||
.mpris
|
.mpris_player
|
||||||
.get()
|
.get()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.set_metadata(
|
.set_metadata(
|
||||||
|
|
@ -142,7 +142,15 @@ mod imp {
|
||||||
|
|
||||||
let obj = self.obj().clone();
|
let obj = self.obj().clone();
|
||||||
glib::spawn_future_local(async move {
|
glib::spawn_future_local(async move {
|
||||||
obj.init_mpris().await;
|
match obj.init_mpris().await {
|
||||||
|
Ok(task) => {
|
||||||
|
// Run the MPRIS server
|
||||||
|
task.await;
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
log::error!("Failed to initialize MPRIS server: {err:?}");
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let play = gstreamer_play::Play::new(None::<gstreamer_play::PlayVideoRenderer>);
|
let play = gstreamer_play::Play::new(None::<gstreamer_play::PlayVideoRenderer>);
|
||||||
|
|
@ -354,7 +362,7 @@ impl Player {
|
||||||
let obj = self.clone();
|
let obj = self.clone();
|
||||||
glib::spawn_future_local(async move {
|
glib::spawn_future_local(async move {
|
||||||
obj.imp()
|
obj.imp()
|
||||||
.mpris
|
.mpris_player
|
||||||
.get()
|
.get()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.set_playback_status(mpris_server::PlaybackStatus::Playing)
|
.set_playback_status(mpris_server::PlaybackStatus::Playing)
|
||||||
|
|
@ -371,7 +379,7 @@ impl Player {
|
||||||
let obj = self.clone();
|
let obj = self.clone();
|
||||||
glib::spawn_future_local(async move {
|
glib::spawn_future_local(async move {
|
||||||
obj.imp()
|
obj.imp()
|
||||||
.mpris
|
.mpris_player
|
||||||
.get()
|
.get()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.set_playback_status(mpris_server::PlaybackStatus::Paused)
|
.set_playback_status(mpris_server::PlaybackStatus::Paused)
|
||||||
|
|
@ -414,8 +422,8 @@ impl Player {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn init_mpris(&self) {
|
async fn init_mpris(&self) -> Result<mpris_server::LocalServerRunTask> {
|
||||||
let mpris = mpris_server::Player::builder(config::APP_ID)
|
let mpris_player = mpris_server::Player::builder(config::APP_ID)
|
||||||
.desktop_entry(config::APP_ID)
|
.desktop_entry(config::APP_ID)
|
||||||
.can_raise(true)
|
.can_raise(true)
|
||||||
.can_play(true)
|
.can_play(true)
|
||||||
|
|
@ -423,51 +431,52 @@ impl Player {
|
||||||
.can_go_previous(true)
|
.can_go_previous(true)
|
||||||
.can_go_next(true)
|
.can_go_next(true)
|
||||||
.build()
|
.build()
|
||||||
.await
|
.await?;
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let obj = self.clone();
|
mpris_player.connect_raise(clone!(
|
||||||
|
#[weak(rename_to = obj)]
|
||||||
mpris.connect_raise(clone!(
|
self,
|
||||||
#[weak]
|
|
||||||
obj,
|
|
||||||
move |_| obj.emit_by_name::<()>("raise", &[])
|
move |_| obj.emit_by_name::<()>("raise", &[])
|
||||||
));
|
));
|
||||||
|
|
||||||
mpris.connect_play(clone!(
|
mpris_player.connect_play(clone!(
|
||||||
#[weak]
|
#[weak(rename_to = obj)]
|
||||||
obj,
|
self,
|
||||||
move |_| obj.play()
|
move |_| obj.play()
|
||||||
));
|
));
|
||||||
|
|
||||||
mpris.connect_pause(clone!(
|
mpris_player.connect_pause(clone!(
|
||||||
#[weak]
|
#[weak(rename_to = obj)]
|
||||||
obj,
|
self,
|
||||||
move |_| obj.pause()
|
move |_| obj.pause()
|
||||||
));
|
));
|
||||||
|
|
||||||
mpris.connect_play_pause(clone!(
|
mpris_player.connect_play_pause(clone!(
|
||||||
#[weak]
|
#[weak(rename_to = obj)]
|
||||||
obj,
|
self,
|
||||||
move |_| obj.play_pause()
|
move |_| obj.play_pause()
|
||||||
));
|
));
|
||||||
|
|
||||||
mpris.connect_previous(clone!(
|
mpris_player.connect_previous(clone!(
|
||||||
#[weak]
|
#[weak(rename_to = obj)]
|
||||||
obj,
|
self,
|
||||||
move |_| obj.previous()
|
move |_| obj.previous()
|
||||||
));
|
));
|
||||||
|
|
||||||
mpris.connect_next(clone!(
|
mpris_player.connect_next(clone!(
|
||||||
#[weak]
|
#[weak(rename_to = obj)]
|
||||||
obj,
|
self,
|
||||||
move |_| obj.next()
|
move |_| obj.next()
|
||||||
));
|
));
|
||||||
|
|
||||||
|
let task = mpris_player.run();
|
||||||
|
|
||||||
self.imp()
|
self.imp()
|
||||||
.mpris
|
.mpris_player
|
||||||
.set(mpris)
|
.set(mpris_player)
|
||||||
.expect("mpris should not be set");
|
.map_err(|_| anyhow!("Player already initialized"))?;
|
||||||
|
|
||||||
|
Ok(task)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generate new playlist items based on `program` and return the index of the first newly
|
/// Generate new playlist items based on `program` and return the index of the first newly
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue