mpris: Use zbus streams in a better way
I believe this is correct, and works around a zbus issue affecting the previous implementation: https://gitlab.freedesktop.org/dbus/zbus/-/merge_requests/460.
This commit is contained in:
parent
c03d6a9d0a
commit
31cb313e07
1 changed files with 23 additions and 16 deletions
|
|
@ -126,21 +126,21 @@ impl MprisPlayer {
|
|||
.build()
|
||||
.await?;
|
||||
|
||||
let metadata_stream = player.receive_metadata_changed().await;
|
||||
let playback_status_stream = player.receive_playback_status_changed().await;
|
||||
let mut stream = futures::stream_select!(
|
||||
metadata_stream.map(|_| ()),
|
||||
playback_status_stream.map(|_| ())
|
||||
);
|
||||
let mut status_stream = player.receive_playback_status_changed().await;
|
||||
let mut metadata_stream = player.receive_metadata_changed().await;
|
||||
|
||||
obj.inner().player.set(player);
|
||||
|
||||
glib::MainContext::default().spawn_local(clone!(@strong obj => async move {
|
||||
while stream.next().await.is_some() {
|
||||
obj.update();
|
||||
while status_stream.next().await.is_some() {
|
||||
obj.update_status();
|
||||
}
|
||||
}));
|
||||
glib::MainContext::default().spawn_local(clone!(@strong obj => async move {
|
||||
while metadata_stream.next().await.is_some() {
|
||||
obj.update_metadata();
|
||||
}
|
||||
}));
|
||||
obj.update();
|
||||
|
||||
Ok(obj)
|
||||
}
|
||||
|
|
@ -177,10 +177,9 @@ impl MprisPlayer {
|
|||
}
|
||||
}
|
||||
|
||||
fn update(&self) {
|
||||
let player = &self.inner().player;
|
||||
let (status, metadata) = match (player.cached_playback_status(), player.cached_metadata()) {
|
||||
(Ok(Some(status)), Ok(Some(metadata))) => (status, metadata),
|
||||
fn update_status(&self) {
|
||||
let status = match self.inner().player.cached_playback_status() {
|
||||
Ok(Some(status)) => status,
|
||||
_ => return,
|
||||
};
|
||||
|
||||
|
|
@ -190,6 +189,17 @@ impl MprisPlayer {
|
|||
"media-playback-start-symbolic"
|
||||
};
|
||||
|
||||
self.inner()
|
||||
.play_pause_button
|
||||
.set_icon_name(play_pause_icon);
|
||||
}
|
||||
|
||||
fn update_metadata(&self) {
|
||||
let metadata = match self.inner().player.cached_metadata() {
|
||||
Ok(Some(metadata)) => metadata,
|
||||
_ => return,
|
||||
};
|
||||
|
||||
let title = metadata.title().unwrap_or_else(|| String::new());
|
||||
// XXX correct way to handle multiple?
|
||||
let artist = metadata
|
||||
|
|
@ -204,9 +214,6 @@ impl MprisPlayer {
|
|||
self_.update_arturl(arturl.as_deref()).await;
|
||||
}));
|
||||
|
||||
self.inner()
|
||||
.play_pause_button
|
||||
.set_icon_name(play_pause_icon);
|
||||
self.inner().title_label.set_label(&title);
|
||||
self.inner().artist_label.set_label(&artist);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue