diff --git a/Cargo.lock b/Cargo.lock index f5f441d..4102a67 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -147,7 +147,7 @@ dependencies = [ "js-sys", "num-traits", "wasm-bindgen", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -288,7 +288,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" dependencies = [ - "gio-sys", + "gio-sys 0.18.1", "glib-sys 0.18.1", "gobject-sys 0.18.0", "libc", @@ -318,7 +318,7 @@ checksum = "dbab43f332a3cf1df9974da690b5bb0e26720ed09a228178ce52175372dcfef0" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", - "gio-sys", + "gio-sys 0.18.1", "glib-sys 0.18.1", "gobject-sys 0.18.0", "libc", @@ -368,7 +368,7 @@ dependencies = [ "futures-core", "futures-io", "futures-util", - "gio-sys", + "gio-sys 0.18.1", "glib 0.18.3", "libc", "once_cell", @@ -390,6 +390,19 @@ dependencies = [ "winapi", ] +[[package]] +name = "gio-sys" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcf8e1d9219bb294636753d307b030c1e8a032062cba74f493c431a5c8b81ce4" +dependencies = [ + "glib-sys 0.19.0", + "gobject-sys 0.19.0", + "libc", + "system-deps", + "windows-sys", +] + [[package]] name = "glib" version = "0.15.12" @@ -422,7 +435,7 @@ dependencies = [ "futures-executor", "futures-task", "futures-util", - "gio-sys", + "gio-sys 0.18.1", "glib-macros 0.18.3", "glib-sys 0.18.1", "gobject-sys 0.18.0", @@ -433,6 +446,28 @@ dependencies = [ "thiserror", ] +[[package]] +name = "glib" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab9e86540b5d8402e905ad4ce7d6aa544092131ab564f3102175af176b90a053" +dependencies = [ + "bitflags 2.4.1", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys 0.19.0", + "glib-macros 0.19.2", + "glib-sys 0.19.0", + "gobject-sys 0.19.0", + "libc", + "memchr", + "smallvec", + "thiserror", +] + [[package]] name = "glib-macros" version = "0.15.13" @@ -462,6 +497,19 @@ dependencies = [ "syn 2.0.39", ] +[[package]] +name = "glib-macros" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f5897ca27a83e4cdc7b4666850bade0a2e73e17689aabafcc9acddad9d823b8" +dependencies = [ + "heck", + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.39", +] + [[package]] name = "glib-sys" version = "0.15.10" @@ -482,6 +530,16 @@ dependencies = [ "system-deps", ] +[[package]] +name = "glib-sys" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630f097773d7c7a0bb3258df4e8157b47dc98bbfa0e60ad9ab56174813feced4" +dependencies = [ + "libc", + "system-deps", +] + [[package]] name = "gobject-sys" version = "0.15.10" @@ -504,6 +562,17 @@ dependencies = [ "system-deps", ] +[[package]] +name = "gobject-sys" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c85e2b1080b9418dd0c58b498da3a5c826030343e0ef07bde6a955d28de54979" +dependencies = [ + "glib-sys 0.19.0", + "libc", + "system-deps", +] + [[package]] name = "graphene-rs" version = "0.18.1" @@ -560,38 +629,38 @@ dependencies = [ [[package]] name = "gstreamer" -version = "0.21.2" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed97f98d186e63e49079b26af1a1b73e70ab7a2f450eb46a136f2bffc2bf12d5" +checksum = "48a5e10c539f8b594c50f6cd1bd1cd07785e06d701a077bff397ad211bc92e88" dependencies = [ "cfg-if", "futures-channel", "futures-core", "futures-util", - "glib 0.18.3", + "glib 0.19.2", "gstreamer-sys", "itertools", "libc", "muldiv", "num-integer", "num-rational", + "once_cell", "option-operations", "paste", "pin-project-lite", - "pretty-hex", "smallvec", "thiserror", ] [[package]] name = "gstreamer-base" -version = "0.21.2" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb150b6904a49052237fede7cc2e6479df6ced5043d95e6af8134bc141a3167f" +checksum = "514c71195b53c7eced4842b66ca9149833e41cf6a1d949e45e2ca4a4fa929850" dependencies = [ "atomic_refcell", "cfg-if", - "glib 0.18.3", + "glib 0.19.2", "gstreamer", "gstreamer-base-sys", "libc", @@ -599,38 +668,38 @@ dependencies = [ [[package]] name = "gstreamer-base-sys" -version = "0.21.1" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4ca701f9078fe115b29b24c80910b577f9cb5b039182f050dbadf5933594b64" +checksum = "286591e0f85bbda1adf9bab6f21d015acd9ca0a4d4acb61da65e3d0487e23c4e" dependencies = [ - "glib-sys 0.18.1", - "gobject-sys 0.18.0", + "glib-sys 0.19.0", + "gobject-sys 0.19.0", "gstreamer-sys", "libc", "system-deps", ] [[package]] -name = "gstreamer-player" -version = "0.21.2" +name = "gstreamer-play" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276900527b2f8323c6ed97ab3ed42854bb169a993fb8cef946fb43d1e9097a66" +checksum = "04cd4315d97f8f38a6a6fdaad27d51cc67fd132785816091ad9985e197d2c052" dependencies = [ - "glib 0.18.3", + "glib 0.19.2", "gstreamer", - "gstreamer-player-sys", + "gstreamer-play-sys", "gstreamer-video", "libc", ] [[package]] -name = "gstreamer-player-sys" -version = "0.21.0" +name = "gstreamer-play-sys" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5ef4d00b43d0aa94e9a518e6ef4a4c504b4b855304a0a5f4ed1493d5e5ca66c" +checksum = "19def7b12d3a53c520ad661b8f4501ae04158627e4a9fc49cc30c4ea04522cbf" dependencies = [ - "glib-sys 0.18.1", - "gobject-sys 0.18.0", + "glib-sys 0.19.0", + "gobject-sys 0.19.0", "gstreamer-sys", "gstreamer-video-sys", "libc", @@ -639,40 +708,41 @@ dependencies = [ [[package]] name = "gstreamer-sys" -version = "0.21.2" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "564cda782b3e6eed1b81cb4798a06794db56440fb05b422505be689f34ce3bc4" +checksum = "d5ddf526b3bf90ea627224c804f00b8bcb0452e3b447978b4d5092f8e8ff5918" dependencies = [ - "glib-sys 0.18.1", - "gobject-sys 0.18.0", + "glib-sys 0.19.0", + "gobject-sys 0.19.0", "libc", "system-deps", ] [[package]] name = "gstreamer-video" -version = "0.21.2" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e85b2a4d1d3b7a98ae03806c3ed5c2db89d6b37a5f138780b48de015d68715e5" +checksum = "5ab3f4045ddb92bf2b469f5db8825d4f5eb46e4beff661fc97f50bb4e2b2c626" dependencies = [ "cfg-if", "futures-channel", - "glib 0.18.3", + "glib 0.19.2", "gstreamer", "gstreamer-base", "gstreamer-video-sys", "libc", + "once_cell", "thiserror", ] [[package]] name = "gstreamer-video-sys" -version = "0.21.2" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0302318d98e6b054501e485b6bb4ee20225823218f4a8660c182f115a33b16ee" +checksum = "c1ea7996ba44fbbf563aeeda96e24259efc9f06b407854d837ee58e260d7ba78" dependencies = [ - "glib-sys 0.18.1", - "gobject-sys 0.18.0", + "glib-sys 0.19.0", + "gobject-sys 0.19.0", "gstreamer-base-sys", "gstreamer-sys", "libc", @@ -723,7 +793,7 @@ dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", "gdk4-sys", - "gio-sys", + "gio-sys 0.18.1", "glib-sys 0.18.1", "gobject-sys 0.18.0", "graphene-sys", @@ -793,9 +863,9 @@ dependencies = [ [[package]] name = "itertools" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] @@ -838,7 +908,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e10aaa38de1d53374f90deeb4535209adc40cc5dba37f9704724169bceec69a" dependencies = [ "gdk4-sys", - "gio-sys", + "gio-sys 0.18.1", "glib-sys 0.18.1", "gobject-sys 0.18.0", "gtk4-sys", @@ -903,9 +973,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "memoffset" @@ -939,7 +1009,7 @@ dependencies = [ "chrono", "fragile", "gettext-rs", - "gstreamer-player", + "gstreamer-play", "gtk4", "libadwaita", "log", @@ -1097,12 +1167,6 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" -[[package]] -name = "pretty-hex" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" - [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -1122,6 +1186,15 @@ dependencies = [ "toml_edit 0.20.7", ] +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.0", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1301,9 +1374,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "syn" @@ -1600,7 +1673,16 @@ version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.4", ] [[package]] @@ -1609,13 +1691,28 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +dependencies = [ + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] [[package]] @@ -1624,42 +1721,84 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" + [[package]] name = "winnow" version = "0.5.19" diff --git a/Cargo.toml b/Cargo.toml index db04ae3..a211399 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ adw = { package = "libadwaita", version = "0.5", features = ["v1_4"] } chrono = "0.4" fragile = "2" gettext-rs = { version = "0.7", features = ["gettext-system"] } -gstreamer-player = "0.21" +gstreamer-play = "0.22" gtk = { package = "gtk4", version = "0.7", features = ["v4_12", "blueprint"] } log = "0.4" mpris-player = "0.6" diff --git a/src/main.rs b/src/main.rs index 1c0889d..7a53f36 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,7 +19,7 @@ use self::{application::MusicusApplication, window::MusicusWindow}; use config::{GETTEXT_PACKAGE, LOCALEDIR, PKGDATADIR}; use gettextrs::{bind_textdomain_codeset, bindtextdomain, textdomain}; -use gstreamer_player::gst; +use gstreamer_play::gst; use gtk::{gio, glib, prelude::*}; fn main() -> glib::ExitCode { diff --git a/src/player.rs b/src/player.rs index ed24359..cb7dfa8 100644 --- a/src/player.rs +++ b/src/player.rs @@ -1,6 +1,6 @@ use crate::playlist_item::PlaylistItem; use fragile::Fragile; -use gstreamer_player::gst; +use gstreamer_play::gst; use gtk::{ gio, glib::{self, clone, subclass::Signal, Properties}, @@ -34,9 +34,9 @@ mod imp { pub duration_ms: Cell, #[property(get, set)] pub position_ms: Cell, - #[property(get, construct_only)] - pub player: OnceCell, + pub play: OnceCell, + pub play_signal_adapter: OnceCell, pub mpris: OnceCell>, } @@ -62,10 +62,10 @@ mod imp { let uri = glib::filename_to_uri(item.path(), None) .expect("track path should be parsable as an URI"); - let player = self.player.get().unwrap(); - player.set_uri(Some(&uri)); + let play = self.play.get().unwrap(); + play.set_uri(Some(&uri)); if self.playing.get() { - player.play(); + play.play(); } self.current_index.set(index); @@ -92,6 +92,8 @@ mod imp { fn constructed(&self) { self.parent_constructed(); + let play = gstreamer_play::Play::new(None::); + let mpris = MprisPlayer::new( "de.johrpan.musicus".to_string(), "Musicus".to_string(), @@ -116,20 +118,20 @@ mod imp { self.mpris.set(mpris).expect("mpris should not be set"); - let player = self.player.get().unwrap(); - - let mut config = player.config(); + let mut config = play.config(); config.set_position_update_interval(250); - player.set_config(config).unwrap(); - player.set_video_track_enabled(false); + play.set_config(config).unwrap(); + play.set_video_track_enabled(false); + + let play_signal_adapter = gstreamer_play::PlaySignalAdapter::new(&play); let obj = Fragile::new(self.obj().to_owned()); - player.connect_end_of_stream(move |_| { + play_signal_adapter.connect_end_of_stream(move |_| { obj.get().next(); }); let obj = Fragile::new(self.obj().to_owned()); - player.connect_position_updated(move |_, position| { + play_signal_adapter.connect_position_updated(move |_, position| { if let Some(position) = position { let obj = obj.get(); obj.imp().position_ms.set(position.mseconds()); @@ -138,7 +140,7 @@ mod imp { }); let obj = Fragile::new(self.obj().to_owned()); - player.connect_duration_changed(move |_, duration| { + play_signal_adapter.connect_duration_changed(move |_, duration| { if let Some(duration) = duration { let obj = obj.get(); let imp = obj.imp(); @@ -150,6 +152,9 @@ mod imp { obj.notify_duration_ms(); } }); + + self.play.set(play).unwrap(); + self.play_signal_adapter.set(play_signal_adapter).unwrap(); } } } @@ -160,13 +165,6 @@ glib::wrapper! { impl MusicusPlayer { pub fn new() -> Self { - let player = gstreamer_player::Player::new( - None::, - Some(gstreamer_player::PlayerGMainContextSignalDispatcher::new( - None, - )), - ); - glib::Object::builder() .property("active", false) .property("playing", false) @@ -174,7 +172,6 @@ impl MusicusPlayer { .property("current-index", 0u32) .property("position-ms", 0u64) .property("duration-ms", 60_000u64) - .property("player", player) .build() } @@ -209,27 +206,31 @@ impl MusicusPlayer { } pub fn play(&self) { - self.player().play(); + let imp = self.imp(); + imp.play.get().unwrap().play(); self.set_playing(true); - self.imp() - .mpris + imp.mpris .get() .unwrap() .set_playback_status(PlaybackStatus::Playing); } pub fn pause(&self) { - self.player().pause(); + let imp = self.imp(); + imp.play.get().unwrap().pause(); self.set_playing(false); - self.imp() - .mpris + imp.mpris .get() .unwrap() .set_playback_status(PlaybackStatus::Paused); } pub fn seek_to(&self, time_ms: u64) { - self.player().seek(gst::ClockTime::from_mseconds(time_ms)); + let imp = self.imp(); + imp.play + .get() + .unwrap() + .seek(gst::ClockTime::from_mseconds(time_ms)); } pub fn current_item(&self) -> Option {