From dd7a76148461e6153cbe98e9b95f67a945ce12bc Mon Sep 17 00:00:00 2001 From: Jake Stanger Date: Sat, 1 Apr 2023 13:07:47 +0100 Subject: [PATCH] [wip] volume --- Cargo.lock | 789 +++++++++++++---------- Cargo.toml | 9 + src/clients/mod.rs | 2 + src/clients/volume/mod.rs | 9 + src/clients/volume/pulse/callbacks.rs | 345 ++++++++++ src/clients/volume/pulse/common.rs | 30 + src/clients/volume/pulse/errors.rs | 17 + src/clients/volume/pulse/mod.rs | 36 ++ src/clients/volume/pulse/monitor.rs | 278 ++++++++ src/clients/volume/pulse/pa_actions.rs | 148 +++++ src/clients/volume/pulse/pa_interface.rs | 162 +++++ src/clients/volume/pulse_bak.rs | 90 +++ src/main.rs | 2 + 13 files changed, 1590 insertions(+), 327 deletions(-) create mode 100644 src/clients/volume/mod.rs create mode 100644 src/clients/volume/pulse/callbacks.rs create mode 100644 src/clients/volume/pulse/common.rs create mode 100644 src/clients/volume/pulse/errors.rs create mode 100644 src/clients/volume/pulse/mod.rs create mode 100644 src/clients/volume/pulse/monitor.rs create mode 100644 src/clients/volume/pulse/pa_actions.rs create mode 100644 src/clients/volume/pulse/pa_interface.rs create mode 100644 src/clients/volume/pulse_bak.rs diff --git a/Cargo.lock b/Cargo.lock index ba49443..d2d9e68 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.17.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" dependencies = [ "gimli", ] @@ -48,9 +48,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.66" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6" +checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" [[package]] name = "arrayvec" @@ -111,17 +111,16 @@ dependencies = [ "slab", "socket2", "waker-fn", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] name = "async-lock" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8101efe8695a6c17e02911402145357e718ac92d3ff88ae8419e84b1707b685" +checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7" dependencies = [ "event-listener", - "futures-lite", ] [[package]] @@ -142,7 +141,7 @@ checksum = "d7d78656ba01f1b93024b7c3a0467f1608e4be67d725749fdcd7d2c7678fd7a2" dependencies = [ "proc-macro2", "quote 1.0.26", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] @@ -153,13 +152,13 @@ checksum = "7a40729d2133846d9ed0ea60a8b9541bccddab49cd30f0715a1da672fe9a2524" [[package]] name = "async-trait" -version = "0.1.59" +version = "0.1.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6e93155431f3931513b243d371981bb2770112b370c82745a1d19d2f99364" +checksum = "86ea188f25f0255d8f92797797c97ebf5631fa88178beb1a46fdf5622c9a00e4" dependencies = [ "proc-macro2", "quote 1.0.26", - "syn 1.0.105", + "syn 2.0.2", ] [[package]] @@ -200,9 +199,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" -version = "0.3.66" +version = "0.3.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7" +checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" dependencies = [ "addr2line", "cc", @@ -227,18 +226,18 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "block-buffer" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] [[package]] name = "bumpalo" -version = "3.11.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "byteorder" @@ -248,9 +247,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "cairo-rs" @@ -279,9 +278,9 @@ dependencies = [ [[package]] name = "calloop" -version = "0.10.4" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19457a0da465234abd76134a5c2a910c14bd3c5558463e4396ab9a37a328e465" +checksum = "1a59225be45a478d772ce015d9743e49e92798ece9e34eda9a6aa2a6a7f40192" dependencies = [ "log", "nix 0.25.1", @@ -292,9 +291,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.77" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f73505338f7d905b19d18738976aae232eb46b8efc15554ffc56deb5d9ebe4" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" [[package]] name = "cfg-expr" @@ -313,9 +312,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.23" +version = "0.4.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" +checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" dependencies = [ "iana-time-zone", "js-sys", @@ -365,9 +364,9 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd7bef69dc86e3c610e4e7aed41035e2a7ed12e72dd7530f61327a6579a4390b" +checksum = "c278839b831783b70278b14df4d45e1beb1aad306c07bb796637de9a0e323e8e" dependencies = [ "crossbeam-utils", ] @@ -399,9 +398,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c" dependencies = [ "cfg-if", "crossbeam-utils", @@ -409,9 +408,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" dependencies = [ "cfg-if", "crossbeam-epoch", @@ -420,22 +419,22 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.13" +version = "0.9.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" +checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" dependencies = [ "autocfg", "cfg-if", "crossbeam-utils", - "memoffset 0.7.1", + "memoffset 0.8.0", "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" +checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" dependencies = [ "cfg-if", ] @@ -452,9 +451,9 @@ dependencies = [ [[package]] name = "cxx" -version = "1.0.83" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdf07d07d6531bfcdbe9b8b739b104610c6508dcc4d63b410585faf338241daf" +checksum = "a9c00419335c41018365ddf7e4d5f1c12ee3659ddcf3e01974650ba1de73d038" dependencies = [ "cc", "cxxbridge-flags", @@ -464,9 +463,9 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.83" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2eb5b96ecdc99f72657332953d4d9c50135af1bac34277801cc3937906ebd39" +checksum = "fb8307ad413a98fff033c8545ecf133e3257747b3bae935e7602aab8aa92d4ca" dependencies = [ "cc", "codespan-reporting", @@ -474,31 +473,31 @@ dependencies = [ "proc-macro2", "quote 1.0.26", "scratch", - "syn 1.0.105", + "syn 2.0.2", ] [[package]] name = "cxxbridge-flags" -version = "1.0.83" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac040a39517fd1674e0f32177648334b0f4074625b5588a64519804ba0553b12" +checksum = "edc52e2eb08915cb12596d29d55f0b5384f00d697a646dbd269b6ecb0fbd9d31" [[package]] name = "cxxbridge-macro" -version = "1.0.83" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1362b0ddcfc4eb0a1f57b68bd77dd99f0e826958a96abd0ae9bd092e114ffed6" +checksum = "631569015d0d8d54e6c241733f944042623ab6df7bc3be7466874b05fcdb1c5f" dependencies = [ "proc-macro2", "quote 1.0.26", - "syn 1.0.105", + "syn 2.0.2", ] [[package]] name = "darling" -version = "0.13.4" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" dependencies = [ "darling_core", "darling_macro", @@ -506,34 +505,34 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.4" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote 1.0.26", "strsim", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] name = "darling_macro" -version = "0.13.4" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" dependencies = [ "darling_core", "quote 1.0.26", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] name = "dbus" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f8bcdd56d2e5c4ed26a529c5a9029f5db8290d433497506f958eae3be148eb6" +checksum = "1bb21987b9fb1613058ba3843121dd18b163b254d8a6e797e144cbac14d96d1b" dependencies = [ "libc", "libdbus-sys", @@ -548,7 +547,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote 1.0.26", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] @@ -615,15 +614,15 @@ checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" [[package]] name = "either" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "encoding_rs" -version = "0.8.31" +version = "0.8.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" dependencies = [ "cfg-if", ] @@ -636,7 +635,7 @@ checksum = "4e40a16955681d469ab3da85aaa6b42ff656b3c67b52e1d8d3dd36afe97fd462" dependencies = [ "proc-macro2", "quote 1.0.26", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] @@ -657,7 +656,28 @@ checksum = "f58dc3c5e468259f19f2d46304a6b28f1c3d034442e14b322d2b850e36f6d5ae" dependencies = [ "proc-macro2", "quote 1.0.26", - "syn 1.0.105", + "syn 1.0.109", +] + +[[package]] +name = "errno" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +dependencies = [ + "errno-dragonfly", + "libc", + "winapi", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", ] [[package]] @@ -678,33 +698,33 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" dependencies = [ "instant", ] [[package]] name = "field-offset" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e1c54951450cbd39f3dbcf1005ac413b49487dabf18a720ad2383eccfeffb92" +checksum = "a3cf3a800ff6e860c863ca6d4b16fd999db8b752819c1606884047b73e468535" dependencies = [ - "memoffset 0.6.5", + "memoffset 0.8.0", "rustc_version", ] [[package]] name = "filetime" -version = "0.2.19" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e884668cd0c7480504233e951174ddc3b382f7c2666e3b7310b5c4e7b0c37f9" +checksum = "8a3de6e8d11b22ff9edc6d916f890800597d60f8b2da1caf2955c274638d6412" dependencies = [ "cfg-if", "libc", "redox_syscall", - "windows-sys", + "windows-sys 0.45.0", ] [[package]] @@ -739,45 +759,45 @@ dependencies = [ [[package]] name = "from_variants" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cf36180ca6f3c021e91b194e16b670ef5cbdd0cea48354ff6f5f83e3c2d1629" +checksum = "4e859c8f2057687618905dbe99fc76e836e0a69738865ef90e46fc214a41bbf2" dependencies = [ "from_variants_impl", ] [[package]] name = "from_variants_impl" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13abfd95d43eabb051a8d4b408ef92dfe6d8d4aa17651e5786d5c761e5e6e7ad" +checksum = "55a5e644a80e6d96b2b4910fa7993301d7b7926c045b475b62202b20a36ce69e" dependencies = [ "darling", "proc-macro2", "quote 1.0.26", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] name = "futures-channel" -version = "0.3.25" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" +checksum = "164713a5a0dcc3e7b4b1ed7d3b433cabc18025386f9339346e8daf15963cf7ac" dependencies = [ "futures-core", ] [[package]] name = "futures-core" -version = "0.3.25" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" +checksum = "86d7a0c1aa76363dac491de0ee99faf6941128376f1cf96f07db7603b7de69dd" [[package]] name = "futures-executor" -version = "0.3.25" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" +checksum = "1997dd9df74cdac935c76252744c1ed5794fac083242ea4fe77ef3ed60ba0f83" dependencies = [ "futures-core", "futures-task", @@ -786,9 +806,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.25" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" +checksum = "89d422fa3cbe3b40dca574ab087abb5bc98258ea57eea3fd6f1fa7162c778b91" [[package]] name = "futures-lite" @@ -807,32 +827,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.25" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" +checksum = "3eb14ed937631bd8b8b8977f2c198443447a8355b6e3ca599f38c975e5a963b6" dependencies = [ "proc-macro2", "quote 1.0.26", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] name = "futures-sink" -version = "0.3.25" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" +checksum = "ec93083a4aecafb2a80a885c9de1f0ccae9dbd32c2bb54b0c3a65690e0b8d2f2" [[package]] name = "futures-task" -version = "0.3.25" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" +checksum = "fd65540d33b37b16542a0438c12e6aeead10d4ac5d05bd3f805b8f35ab592879" [[package]] name = "futures-util" -version = "0.3.25" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" +checksum = "3ef6b17e481503ec85211fed8f39d1970f128935ca1f814cd32ac4a6842e84ab" dependencies = [ "futures-core", "futures-macro", @@ -926,9 +946,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.26.2" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" +checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" [[package]] name = "gio" @@ -993,12 +1013,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "454924cafe58d9174dc32972261fe271d6cd3c10f5e9ff505522a28dcf601a40" dependencies = [ "anyhow", - "heck 0.4.0", + "heck 0.4.1", "proc-macro-crate", "proc-macro-error", "proc-macro2", "quote 1.0.26", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] @@ -1102,14 +1122,14 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote 1.0.26", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] name = "h2" -version = "0.3.15" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" +checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d" dependencies = [ "bytes", "fnv", @@ -1141,19 +1161,25 @@ dependencies = [ [[package]] name = "heck" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.1.19" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + [[package]] name = "hex" version = "0.4.3" @@ -1162,9 +1188,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "http" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ "bytes", "fnv", @@ -1196,9 +1222,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.23" +version = "0.14.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" +checksum = "cc5e554ff619822309ffd57d8734d77cd5ce6238bc956f037ea06c58238c9899" dependencies = [ "bytes", "futures-channel", @@ -1337,6 +1363,17 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "io-lifetimes" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd6da19f25979c7270e70fa95ab371ec3b701cd0eefc47667a09785b3c59155" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.45.0", +] + [[package]] name = "ipnet" version = "2.7.1" @@ -1359,6 +1396,8 @@ dependencies = [ "hyprland", "indexmap", "lazy_static", + "libpulse-binding", + "libpulse-glib-binding", "mpd_client", "mpris", "nix 0.26.2", @@ -1384,15 +1423,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" [[package]] name = "js-sys" -version = "0.3.60" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -1425,9 +1464,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.138" +version = "0.2.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" +checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" [[package]] name = "libcorn" @@ -1439,14 +1478,14 @@ dependencies = [ "pest", "pest_derive", "serde", - "toml 0.5.9", + "toml 0.5.11", ] [[package]] name = "libdbus-sys" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c185b5b7ad900923ef3a8ff594083d4d9b5aea80bb4f32b8342363138c0d456b" +checksum = "9f8d7ae751e1cb825c840ae5e682f59b098cdfd213c350ac268b61449a5f58a0" dependencies = [ "pkg-config", ] @@ -1462,14 +1501,70 @@ dependencies = [ ] [[package]] -name = "link-cplusplus" -version = "1.0.7" +name = "libpulse-binding" +version = "2.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369" +checksum = "1745b20bfc194ac12ef828f144f0ec2d4a7fe993281fa3567a0bd4969aee6890" +dependencies = [ + "bitflags", + "libc", + "libpulse-sys", + "num-derive", + "num-traits", + "winapi", +] + +[[package]] +name = "libpulse-glib-binding" +version = "2.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d39d9166164cf39b619f6a029ffafac958e718a10dabdc35bcebf8f69b5fa3cf" +dependencies = [ + "glib", + "glib-sys", + "libpulse-binding", + "libpulse-mainloop-glib-sys", +] + +[[package]] +name = "libpulse-mainloop-glib-sys" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b97cd2ed4e84e54f3825b85648ec8637bec273ea7fcb981032b0a575dfef697" +dependencies = [ + "glib-sys", + "libpulse-sys", + "pkg-config", +] + +[[package]] +name = "libpulse-sys" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2191e6880818d1df4cf72eac8e91dce7a5a52ba0da4b2a5cdafabc22b937eadb" +dependencies = [ + "libc", + "num-derive", + "num-traits", + "pkg-config", + "winapi", +] + +[[package]] +name = "link-cplusplus" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" dependencies = [ "cc", ] +[[package]] +name = "linux-raw-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" + [[package]] name = "lock_api" version = "0.4.9" @@ -1506,9 +1601,9 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memmap2" -version = "0.5.8" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b182332558b18d807c4ce1ca8ca983b34c3ee32765e47b3f0f69b90355cc1dc" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" dependencies = [ "libc", ] @@ -1531,6 +1626,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + [[package]] name = "mime" version = "0.3.16" @@ -1545,30 +1649,30 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.5.4" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" +checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" dependencies = [ "libc", "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "windows-sys 0.45.0", ] [[package]] name = "mpd_client" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ddb4e7f7f0323823dcadfb17cb8b4d25d7ebcfee20779a814091d5b6dec95" +checksum = "09acf3ba374ec87b03c0ca60f648dc3f7d045d4b8a4254553217f9098fef9039" dependencies = [ "bytes", "mpd_protocol", @@ -1674,9 +1778,9 @@ dependencies = [ [[package]] name = "nom" -version = "7.1.1" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", @@ -1684,9 +1788,9 @@ dependencies = [ [[package]] name = "notify" -version = "5.0.0" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2c66da08abae1c024c01d635253e402341b4060a12e99b31c7594063bf490a" +checksum = "58ea850aa68a06e48fdb069c0ec44d0d64c8dbffa49bf3b6f7f0a901fdea1ba9" dependencies = [ "bitflags", "filetime", @@ -1695,7 +1799,7 @@ dependencies = [ "libc", "mio", "walkdir", - "winapi", + "windows-sys 0.42.0", ] [[package]] @@ -1717,6 +1821,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote 1.0.26", + "syn 1.0.109", +] + [[package]] name = "num-integer" version = "0.1.45" @@ -1738,34 +1853,34 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi", + "hermit-abi 0.2.6", "libc", ] [[package]] name = "object" -version = "0.29.0" +version = "0.30.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" +checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.16.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "openssl" -version = "0.10.45" +version = "0.10.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1" +checksum = "fd2523381e46256e40930512c7fd25562b9eae4812cb52078f155e87217c9d1e" dependencies = [ "bitflags", "cfg-if", @@ -1784,7 +1899,7 @@ checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" dependencies = [ "proc-macro2", "quote 1.0.26", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] @@ -1795,9 +1910,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.80" +version = "0.9.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23bbbf7854cd45b83958ebe919f0e8e516793727652e27fda10a8384cfc790b7" +checksum = "176be2629957c157240f68f61f2d0053ad3a4ecfdd9ebf1e6521d18d9635cf67" dependencies = [ "autocfg", "cc", @@ -1872,22 +1987,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.5" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys", + "windows-sys 0.45.0", ] [[package]] name = "paste" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" +checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" [[package]] name = "percent-encoding" @@ -1897,9 +2012,9 @@ checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] name = "pest" -version = "2.5.1" +version = "2.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc8bed3549e0f9b0a2a78bf7c0018237a2cdf085eecbbc048e52612438e4e9d0" +checksum = "8cbd939b234e95d72bc393d51788aec68aeeb5d51e748ca08ff3aad58cb722f7" dependencies = [ "thiserror", "ucd-trie", @@ -1907,9 +2022,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.5.1" +version = "2.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdc078600d06ff90d4ed238f0119d84ab5d43dbaad278b0e33a8820293b32344" +checksum = "a81186863f3d0a27340815be8f2078dd8050b14cd71913db9fbda795e5f707d7" dependencies = [ "pest", "pest_generator", @@ -1917,26 +2032,26 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.5.1" +version = "2.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a1af60b1c4148bb269006a750cff8e2ea36aff34d2d96cf7be0b14d1bed23c" +checksum = "75a1ef20bf3193c15ac345acb32e26b3dc3223aff4d77ae4fc5359567683796b" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote 1.0.26", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] name = "pest_meta" -version = "2.5.1" +version = "2.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fec8605d59fc2ae0c6c1aefc0c7c7a9769732017c0ce07f7a9cfffa7b4404f20" +checksum = "5e3b284b1f13a20dc5ebc90aff59a51b8d7137c221131b52a7260c08cbc1cc80" dependencies = [ "once_cell", "pest", - "sha1 0.10.5", + "sha2", ] [[package]] @@ -1959,16 +2074,18 @@ checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" [[package]] name = "polling" -version = "2.5.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "166ca89eb77fd403230b9c156612965a81e094ec6ec3aa13663d4c8b113fa748" +checksum = "7e1f879b2998099c2d69ab9605d145d5b661195627eccc680002c4918a7fb6fa" dependencies = [ "autocfg", + "bitflags", "cfg-if", + "concurrent-queue", "libc", "log", - "wepoll-ffi", - "windows-sys", + "pin-project-lite", + "windows-sys 0.45.0", ] [[package]] @@ -1979,13 +2096,12 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro-crate" -version = "1.2.1" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "thiserror", - "toml 0.5.9", + "toml_edit", ] [[package]] @@ -1997,7 +2113,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote 1.0.26", - "syn 1.0.105", + "syn 1.0.109", "version_check", ] @@ -2068,9 +2184,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db3a213adf02b3bcfd2d3846bb41cb22857d131789e01df434fb7e7bc0759b7" +checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" dependencies = [ "either", "rayon-core", @@ -2078,9 +2194,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cac410af5d00ab6884528b4ab69d1e8e146e8d471201800fa1b4524126de6ad3" +checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" dependencies = [ "crossbeam-channel", "crossbeam-deque", @@ -2110,9 +2226,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" +checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" dependencies = [ "aho-corasick", "memchr", @@ -2134,15 +2250,6 @@ version = "0.6.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - [[package]] name = "reqwest" version = "0.11.14" @@ -2188,24 +2295,38 @@ checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" [[package]] name = "rustc_version" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ "semver", ] [[package]] -name = "rustversion" -version = "1.0.11" +name = "rustix" +version = "0.36.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70" +checksum = "2fe885c3a125aa45213b68cc1472a49880cb5923dc23f522ad2791b882228778" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.45.0", +] + +[[package]] +name = "rustversion" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" [[package]] name = "ryu" -version = "1.0.11" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" [[package]] name = "same-file" @@ -2222,7 +2343,7 @@ version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" dependencies = [ - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -2233,15 +2354,15 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "scratch" -version = "1.0.2" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898" +checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1" [[package]] name = "security-framework" -version = "2.8.1" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c4437699b6d34972de58652c68b98cb5b53a4199ab126db8e20ec8ded29a721" +checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" dependencies = [ "bitflags", "core-foundation", @@ -2262,21 +2383,9 @@ dependencies = [ [[package]] name = "semver" -version = "0.11.0" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "serde" @@ -2311,13 +2420,13 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.9" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fe39d9fbb0ebf5eb2c7cb7e2a47e4f462fad1379f1166b8ae49ad9eae89a7ca" +checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" dependencies = [ "proc-macro2", "quote 1.0.26", - "syn 1.0.105", + "syn 2.0.2", ] [[package]] @@ -2364,22 +2473,22 @@ dependencies = [ ] [[package]] -name = "sha1" -version = "0.10.5" +name = "sha1_smol" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" dependencies = [ "cfg-if", "cpufeatures", "digest", ] -[[package]] -name = "sha1_smol" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" - [[package]] name = "sharded-slab" version = "0.1.4" @@ -2391,18 +2500,18 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" dependencies = [ "libc", ] [[package]] name = "slab" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" dependencies = [ "autocfg", ] @@ -2443,9 +2552,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" dependencies = [ "libc", "winapi", @@ -2502,11 +2611,11 @@ version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ - "heck 0.4.0", + "heck 0.4.1", "proc-macro2", "quote 1.0.26", "rustversion", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] @@ -2547,9 +2656,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.105" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote 1.0.26", @@ -2578,9 +2687,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.27.0" +version = "0.27.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d08ba83d6dde63d053e42d7230f0dc7f8d8efeb8d30d3681580d158156461ba" +checksum = "a902e9050fca0a5d6877550b769abd2bd1ce8c04634b941dbe2809735e1a1e33" dependencies = [ "cfg-if", "core-foundation-sys", @@ -2598,31 +2707,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2955b1fe31e1fa2fbd1976b71cc69a606d7d4da16f6de3333d0c92d51419aeff" dependencies = [ "cfg-expr", - "heck 0.4.0", + "heck 0.4.1", "pkg-config", - "toml 0.5.9", + "toml 0.5.11", "version-compare", ] [[package]] name = "tempfile" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "af18f7ae1acd354b992402e9ec5864359d693cd8a79dcbef59f76891701c1e95" dependencies = [ "cfg-if", "fastrand", - "libc", "redox_syscall", - "remove_dir_all", - "winapi", + "rustix", + "windows-sys 0.42.0", ] [[package]] name = "termcolor" -version = "1.1.3" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" dependencies = [ "winapi-util", ] @@ -2649,10 +2757,11 @@ dependencies = [ [[package]] name = "thread_local" -version = "1.1.4" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" dependencies = [ + "cfg-if", "once_cell", ] @@ -2669,9 +2778,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.17" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" dependencies = [ "itoa", "serde", @@ -2687,9 +2796,9 @@ checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" [[package]] name = "time-macros" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" dependencies = [ "time-core", ] @@ -2705,15 +2814,15 @@ dependencies = [ [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.23.0" +version = "1.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab6d665857cc6ca78d6e80303a02cea7a7851e85dfbd77cbdc09bd129f1ef46" +checksum = "03201d01c3c27a29c8a5cee5b55a93ddae1ccf6f08f65365c2c918f8c1b76f64" dependencies = [ "autocfg", "bytes", @@ -2726,7 +2835,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.45.0", ] [[package]] @@ -2737,14 +2846,14 @@ checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" dependencies = [ "proc-macro2", "quote 1.0.26", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] name = "tokio-native-tls" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ "native-tls", "tokio", @@ -2752,9 +2861,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce" +checksum = "8fb52b74f05dbf495a8fba459fdc331812b96aa086d9eb78101fa0d4569c3313" dependencies = [ "futures-core", "pin-project-lite", @@ -2763,9 +2872,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.4" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" +checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" dependencies = [ "bytes", "futures-core", @@ -2777,9 +2886,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] @@ -2843,7 +2952,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09d48f71a791638519505cefafe162606f706c25592e4bde4d97600c0195312e" dependencies = [ "crossbeam-channel", - "time 0.3.17", + "time 0.3.20", "tracing-subscriber", ] @@ -2855,7 +2964,7 @@ checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" dependencies = [ "proc-macro2", "quote 1.0.26", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] @@ -2937,15 +3046,15 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.10" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" +checksum = "7d502c968c6a838ead8e69b2ee18ec708802f99db92a0d156705ec9ef801993b" [[package]] name = "unicode-ident" -version = "1.0.5" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" [[package]] name = "unicode-normalization" @@ -2958,9 +3067,9 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" [[package]] name = "unicode-width" @@ -3009,9 +3118,9 @@ dependencies = [ [[package]] name = "utf8parse" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "valuable" @@ -3072,12 +3181,11 @@ checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" [[package]] name = "walkdir" -version = "2.3.2" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" dependencies = [ "same-file", - "winapi", "winapi-util", ] @@ -3105,9 +3213,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -3115,24 +3223,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote 1.0.26", - "syn 1.0.105", + "syn 1.0.109", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.33" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" +checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" dependencies = [ "cfg-if", "js-sys", @@ -3142,9 +3250,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote 1.0.26", "wasm-bindgen-macro-support", @@ -3152,22 +3260,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote 1.0.26", - "syn 1.0.105", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wayland-client" @@ -3241,23 +3349,14 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.60" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" dependencies = [ "js-sys", "wasm-bindgen", ] -[[package]] -name = "wepoll-ffi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" -dependencies = [ - "cc", -] - [[package]] name = "winapi" version = "0.3.9" @@ -3305,46 +3404,70 @@ dependencies = [ ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.1" +name = "windows-sys" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +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", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_msvc" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_i686_gnu" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_msvc" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_x86_64_gnu" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_msvc" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "winnow" @@ -3408,7 +3531,7 @@ dependencies = [ "rand", "serde", "serde_repr", - "sha1 0.6.1", + "sha1", "static_assertions", "tokio", "tracing", @@ -3429,14 +3552,14 @@ dependencies = [ "proc-macro2", "quote 1.0.26", "regex", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] name = "zbus_names" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c737644108627748a660d038974160e0cbb62605536091bdfa28fd7f64d43c8" +checksum = "f34f314916bd89bdb9934154627fab152f4f28acdda03e7c4c68181b214fe7e3" dependencies = [ "serde", "static_assertions", @@ -3445,9 +3568,9 @@ dependencies = [ [[package]] name = "zvariant" -version = "3.9.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f8c89c183461e11867ded456db252eae90874bc6769b7adbea464caa777e51" +checksum = "46fe4914a985446d6fd287019b5fceccce38303d71407d9e6e711d44954a05d8" dependencies = [ "byteorder", "enumflags2", @@ -3459,12 +3582,24 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "3.9.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "155247a5d1ab55e335421c104ccd95d64f17cebbd02f50cdbc1c33385f9c4d81" +checksum = "34c20260af4b28b3275d6676c7e2a6be0d4332e8e0aba4616d34007fd84e462a" dependencies = [ "proc-macro-crate", "proc-macro2", "quote 1.0.26", - "syn 1.0.105", + "syn 1.0.109", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b22993dbc4d128a17a3b6c92f1c63872dd67198537ee728d8b5d7c40640a8b" +dependencies = [ + "proc-macro2", + "quote 1.0.26", + "syn 1.0.109", ] diff --git a/Cargo.toml b/Cargo.toml index e7c9359..12c5929 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ default = [ "music+all", "sys_info", "tray", + "volume+all", "workspaces+all" ] @@ -38,6 +39,10 @@ sys_info = ["sysinfo", "regex"] tray = ["stray"] +volume = [] +"volume+all" = ["volume", "volume+pulse"] +"volume+pulse" = ["libpulse-binding", "libpulse-glib-binding"] + workspaces = ["futures-util"] "workspaces+all" = ["workspaces", "workspaces+sway", "workspaces+hyprland"] "workspaces+sway" = ["workspaces", "swayipc-async"] @@ -88,6 +93,10 @@ sysinfo = { version = "0.27.0", optional = true } # tray stray = { version = "0.1.3", optional = true } +# volume +libpulse-binding = { version = "2.27.1", optional = true } +libpulse-glib-binding = { version = "2.27.1", optional = true } + # workspaces swayipc-async = { version = "2.0.1", optional = true } hyprland = { version = "0.3.0", optional = true } diff --git a/src/clients/mod.rs b/src/clients/mod.rs index d14fd0a..cdf6c73 100644 --- a/src/clients/mod.rs +++ b/src/clients/mod.rs @@ -7,3 +7,5 @@ pub mod music; #[cfg(feature = "tray")] pub mod system_tray; pub mod wayland; +#[cfg(feature = "volume")] +pub mod volume; diff --git a/src/clients/volume/mod.rs b/src/clients/volume/mod.rs new file mode 100644 index 0000000..1ef208a --- /dev/null +++ b/src/clients/volume/mod.rs @@ -0,0 +1,9 @@ +#[cfg(feature = "volume+pulse")] +pub mod pulse_bak; +// #[cfg(feature = "volume+pulse")] +// pub mod pulse; + +trait VolumeClient { + // TODO: Write +} + diff --git a/src/clients/volume/pulse/callbacks.rs b/src/clients/volume/pulse/callbacks.rs new file mode 100644 index 0000000..21ee90b --- /dev/null +++ b/src/clients/volume/pulse/callbacks.rs @@ -0,0 +1,345 @@ +use libpulse_binding::{ + callbacks::ListResult, + context::{ + introspect::{CardInfo, SinkInfo, SinkInputInfo, SourceInfo, SourceOutputInfo}, + subscribe::{InterestMaskSet, Operation}, + }, + // def::{SinkState, SourceState}, +}; +use tracing::{debug, error, info}; + +use super::{common::*, /*pa_interface::ACTIONS_SX*/}; +// use crate::{ +// entry::{CardProfile, Entry}, +// models::EntryUpdate, +// ui::Rect, +// }; +use color_eyre::Result; +use crate::clients::volume::pulse::CardProfile; + +pub fn subscribe( + context: &Rc>, + info_sx: mpsc::UnboundedSender, +) -> Result<()> { + info!("[PAInterface] Registering pulseaudio callbacks"); + + context.borrow_mut().subscribe( + InterestMaskSet::SINK + | InterestMaskSet::SINK_INPUT + | InterestMaskSet::SOURCE + | InterestMaskSet::CARD + | InterestMaskSet::SOURCE_OUTPUT + | InterestMaskSet::CLIENT + | InterestMaskSet::SERVER, + |success: bool| { + assert!(success, "subscription failed"); + }, + ); + + context.borrow_mut().set_subscribe_callback(Some(Box::new( + move |facility, operation, index| { + if let Some(facility) = facility { + match facility { + Facility::Server | Facility::Client => { + error!("{:?} {:?}", facility, operation); + return; + } + _ => {} + }; + + let entry_type: EntryType = facility.into(); + match operation { + Some(Operation::New) => { + info!("[PAInterface] New {:?}", entry_type); + + info_sx + .send(EntryIdentifier::new(entry_type, index)) + .unwrap(); + } + Some(Operation::Changed) => { + info!("[PAInterface] {:?} changed", entry_type); + info_sx + .send(EntryIdentifier::new(entry_type, index)) + .unwrap(); + } + Some(Operation::Removed) => { + info!("[PAInterface] {:?} removed", entry_type); + // (*ACTIONS_SX) + // .get() + // .send(EntryUpdate::EntryRemoved(EntryIdentifier::new( + // entry_type, index, + // ))) + // .unwrap(); + } + _ => {} + }; + }; + }, + ))); + + Ok(()) +} + +pub fn request_current_state( + context: Rc>, + info_sxx: mpsc::UnboundedSender, +) -> Result<()> { + info!("[PAInterface] Requesting starting state"); + + let introspector = context.borrow_mut().introspect(); + + let info_sx = info_sxx.clone(); + introspector.get_sink_info_list(move |x: ListResult<&SinkInfo>| { + if let ListResult::Item(e) = x { + let _ = info_sx + .clone() + .send(EntryIdentifier::new(EntryType::Sink, e.index)); + } + }); + + let info_sx = info_sxx.clone(); + introspector.get_sink_input_info_list(move |x: ListResult<&SinkInputInfo>| { + if let ListResult::Item(e) = x { + let _ = info_sx.send(EntryIdentifier::new(EntryType::SinkInput, e.index)); + } + }); + + let info_sx = info_sxx.clone(); + introspector.get_source_info_list(move |x: ListResult<&SourceInfo>| { + if let ListResult::Item(e) = x { + let _ = info_sx.send(EntryIdentifier::new(EntryType::Source, e.index)); + } + }); + + let info_sx = info_sxx.clone(); + introspector.get_source_output_info_list(move |x: ListResult<&SourceOutputInfo>| { + if let ListResult::Item(e) = x { + let _ = info_sx.send(EntryIdentifier::new(EntryType::SourceOutput, e.index)); + } + }); + + introspector.get_card_info_list(move |x: ListResult<&CardInfo>| { + if let ListResult::Item(e) = x { + let _ = info_sxx.send(EntryIdentifier::new(EntryType::Card, e.index)); + } + }); + + Ok(()) +} + +pub fn request_info( + ident: EntryIdentifier, + context: &Rc>, + info_sx: mpsc::UnboundedSender, +) { + let introspector = context.borrow_mut().introspect(); + debug!( + "[PAInterface] Requesting info for {:?} {}", + ident.entry_type, ident.index + ); + match ident.entry_type { + EntryType::SinkInput => { + introspector.get_sink_input_info(ident.index, on_sink_input_info(&info_sx)); + } + EntryType::Sink => { + introspector.get_sink_info_by_index(ident.index, on_sink_info(&info_sx)); + } + EntryType::SourceOutput => { + introspector.get_source_output_info(ident.index, on_source_output_info(&info_sx)); + } + EntryType::Source => { + introspector.get_source_info_by_index(ident.index, on_source_info(&info_sx)); + } + EntryType::Card => { + introspector.get_card_info_by_index(ident.index, on_card_info); + } + }; +} +pub fn on_card_info(res: ListResult<&CardInfo>) { + if let ListResult::Item(i) = res { + let n = match i + .proplist + .get_str(libpulse_binding::proplist::properties::DEVICE_DESCRIPTION) + { + Some(s) => s, + None => String::from(""), + }; + let profiles: Vec = i + .profiles + .iter() + .filter_map(|p| { + p.name.clone().map(|n| CardProfile { + // area: Rect::default(), + is_selected: false, + name: n.to_string(), + description: match &p.description { + Some(s) => s.to_string(), + None => n.to_string(), + }, + #[cfg(any(feature = "pa_v13"))] + available: p.available, + }) + }) + .collect(); + + let selected_profile = match &i.active_profile { + Some(x) => { + if let Some(n) = &x.name { + profiles.iter().position(|p| p.name == *n) + } else { + None + } + } + None => None, + }; + + // let ident = EntryIdentifier::new(EntryType::Card, i.index); + // let entry = Entry::new_card_entry(i.index, n, profiles, selected_profile); + + // (*ACTIONS_SX) + // .get() + // .send(EntryUpdate::EntryUpdate(ident, Box::new(entry))) + // .unwrap(); + } +} + +pub fn on_sink_info( + _sx: &mpsc::UnboundedSender, +) -> impl Fn(ListResult<&SinkInfo>) { + |res: ListResult<&SinkInfo>| { + if let ListResult::Item(i) = res { + debug!("[PADataInterface] Update {} sink info", i.index); + let name = match &i.description { + Some(name) => name.to_string(), + None => String::new(), + }; + // let ident = EntryIdentifier::new(EntryType::Sink, i.index); + // let entry = Entry::new_play_entry( + // EntryType::Sink, + // i.index, + // name, + // None, + // i.mute, + // i.volume, + // Some(i.monitor_source), + // None, + // i.state == SinkState::Suspended, + // ); + + // (*ACTIONS_SX) + // .get() + // .send(EntryUpdate::EntryUpdate(ident, Box::new(entry))) + // .unwrap(); + } + } +} + +pub fn on_sink_input_info( + sx: &mpsc::UnboundedSender, +) -> impl Fn(ListResult<&SinkInputInfo>) { + let info_sx = sx.clone(); + move |res: ListResult<&SinkInputInfo>| { + if let ListResult::Item(i) = res { + debug!("[PADataInterface] Update {} sink input info", i.index); + let n = match i + .proplist + .get_str(libpulse_binding::proplist::properties::APPLICATION_NAME) + { + Some(s) => s, + None => match &i.name { + Some(s) => s.to_string(), + None => String::from(""), + }, + }; + // let ident = EntryIdentifier::new(EntryType::SinkInput, i.index); + // + // let entry = Entry::new_play_entry( + // EntryType::SinkInput, + // i.index, + // n, + // Some(i.sink), + // i.mute, + // i.volume, + // None, + // Some(i.sink), + // false, + // ); + + // (*ACTIONS_SX) + // .get() + // .send(EntryUpdate::EntryUpdate(ident, Box::new(entry))) + // .unwrap(); + let _ = info_sx.send(EntryIdentifier::new(EntryType::Sink, i.sink)); + } + } +} + +pub fn on_source_info( + _sx: &mpsc::UnboundedSender, +) -> impl Fn(ListResult<&SourceInfo>) { + move |res: ListResult<&SourceInfo>| { + if let ListResult::Item(i) = res { + debug!("[PADataInterface] Update {} source info", i.index); + let name = match &i.description { + Some(name) => name.to_string(), + None => String::new(), + }; + // let ident = EntryIdentifier::new(EntryType::Source, i.index); + // let entry = Entry::new_play_entry( + // EntryType::Source, + // i.index, + // name, + // None, + // i.mute, + // i.volume, + // Some(i.index), + // None, + // i.state == SourceState::Suspended, + // ); + + // (*ACTIONS_SX) + // .get() + // .send(EntryUpdate::EntryUpdate(ident, Box::new(entry))) + // .unwrap(); + } + } +} + +pub fn on_source_output_info( + sx: &mpsc::UnboundedSender, +) -> impl Fn(ListResult<&SourceOutputInfo>) { + let info_sx = sx.clone(); + move |res: ListResult<&SourceOutputInfo>| { + if let ListResult::Item(i) = res { + debug!("[PADataInterface] Update {} source output info", i.index); + let n = match i + .proplist + .get_str(libpulse_binding::proplist::properties::APPLICATION_NAME) + { + Some(s) => s, + None => String::from(""), + }; + if n == "RsMixerContext" { + return; + } + // let ident = EntryIdentifier::new(EntryType::SourceOutput, i.index); + // let entry = Entry::new_play_entry( + // EntryType::SourceOutput, + // i.index, + // n, + // Some(i.source), + // i.mute, + // i.volume, + // Some(i.source), + // None, + // false, + // ); + + // (*ACTIONS_SX) + // .get() + // .send(EntryUpdate::EntryUpdate(ident, Box::new(entry))) + // .unwrap(); + let _ = info_sx.send(EntryIdentifier::new(EntryType::Source, i.index)); + } + } +} diff --git a/src/clients/volume/pulse/common.rs b/src/clients/volume/pulse/common.rs new file mode 100644 index 0000000..c5da237 --- /dev/null +++ b/src/clients/volume/pulse/common.rs @@ -0,0 +1,30 @@ +pub use std::{cell::RefCell, collections::HashMap, rc::Rc}; + +pub use libpulse_binding::{ + context::{subscribe::Facility, Context as PAContext}, + mainloop::{api::Mainloop as MainloopTrait, threaded::Mainloop}, + stream::Stream, +}; +pub use tokio::sync::mpsc; + +pub use super::{monitor::Monitors, PAInternal, SPEC}; +// pub use crate::{ +// entry::{EntryIdentifier, EntryType}, +// models::{EntryUpdate, PulseAudioAction}, +// prelude::*, +// }; + +pub static LOGGING_MODULE: &str = "PAInterface"; + +impl From for EntryType { + fn from(fac: Facility) -> Self { + match fac { + Facility::Sink => EntryType::Sink, + Facility::Source => EntryType::Source, + Facility::SinkInput => EntryType::SinkInput, + Facility::SourceOutput => EntryType::SourceOutput, + Facility::Card => EntryType::Card, + _ => EntryType::Sink, + } + } +} diff --git a/src/clients/volume/pulse/errors.rs b/src/clients/volume/pulse/errors.rs new file mode 100644 index 0000000..93a4514 --- /dev/null +++ b/src/clients/volume/pulse/errors.rs @@ -0,0 +1,17 @@ +// use thiserror::Error; +// +// use super::PAInternal; +// +// #[derive(Debug, Error)] +// pub enum PAError { +// #[error("cannot create pulseaudio mainloop")] +// MainloopCreateError, +// #[error("cannot connect pulseaudio mainloop")] +// MainloopConnectError, +// #[error("cannot create pulseaudio stream")] +// StreamCreateError, +// #[error("internal channel send error")] +// ChannelError(#[from] cb_channel::SendError), +// #[error("pulseaudio disconnected")] +// PulseAudioDisconnected, +// } diff --git a/src/clients/volume/pulse/mod.rs b/src/clients/volume/pulse/mod.rs new file mode 100644 index 0000000..c7520fc --- /dev/null +++ b/src/clients/volume/pulse/mod.rs @@ -0,0 +1,36 @@ +mod callbacks; +pub mod common; +mod errors; +mod monitor; +mod pa_actions; +mod pa_interface; + +use common::*; +use lazy_static::lazy_static; +pub use pa_interface::start; + +#[derive(Debug)] +pub enum PAInternal { + Tick, + Command(Box), + AskInfo(EntryIdentifier), +} + +lazy_static! { + pub static ref SPEC: libpulse_binding::sample::Spec = libpulse_binding::sample::Spec { + format: libpulse_binding::sample::Format::FLOAT32NE, + channels: 1, + rate: 1024, + }; +} + +#[derive(PartialEq, Clone, Debug)] +pub struct CardProfile { + pub name: String, + pub description: String, + #[cfg(any(feature = "pa_v13"))] + pub available: bool, + // pub area: Rect, + pub is_selected: bool, +} +impl Eq for CardProfile {} \ No newline at end of file diff --git a/src/clients/volume/pulse/monitor.rs b/src/clients/volume/pulse/monitor.rs new file mode 100644 index 0000000..b23e5bb --- /dev/null +++ b/src/clients/volume/pulse/monitor.rs @@ -0,0 +1,278 @@ +use std::convert::TryInto; + +use libpulse_binding::stream::PeekResult; +use tracing::{debug, error, info, warn}; + +use super::{common::*, /*pa_interface::ACTIONS_SX*/}; +// use crate::VARIABLES; +use color_eyre::{Report, Result}; + +pub struct Monitor { + stream: Rc>, + exit_sender: mpsc::UnboundedSender, +} + +pub struct Monitors { + monitors: HashMap, + errors: HashMap, +} + +impl Default for Monitors { + fn default() -> Self { + Self { + monitors: HashMap::new(), + errors: HashMap::new(), + } + } +} + +impl Monitors { + pub fn filter( + &mut self, + mainloop: &Rc>, + context: &Rc>, + targets: &HashMap>, + ) { + // remove failed streams + // then send exit signal if stream is unwanted + self.monitors.retain(|ident, monitor| { + match monitor.stream.borrow_mut().get_state() { + libpulse_binding::stream::State::Terminated + | libpulse_binding::stream::State::Failed => { + info!( + "[PAInterface] Disconnecting {} sink input monitor (failed state)", + ident.index + ); + return false; + } + _ => {} + }; + + if targets.get(ident) == None { + let _ = monitor.exit_sender.send(0); + } + + true + }); + + targets.iter().for_each(|(ident, monitor_src)| { + if self.monitors.get(ident).is_none() { + self.create_monitor(mainloop, context, *ident, *monitor_src); + } + }); + } + + fn create_monitor( + &mut self, + mainloop: &Rc>, + context: &Rc>, + ident: EntryIdentifier, + monitor_src: Option, + ) { + if let Some(count) = self.errors.get(&ident) { + if *count >= 5 { + self.errors.remove(&ident); + // (*ACTIONS_SX) + // .get() + // .send(EntryUpdate::EntryRemoved(ident)) + // .unwrap(); + } + } + if self.monitors.contains_key(&ident) { + return; + } + let (sx, rx) = mpsc::unbounded_channel(); + if let Ok(stream) = create( + &mainloop, + &context, + &libpulse_binding::sample::Spec { + format: libpulse_binding::sample::Format::FLOAT32NE, + channels: 1, + rate: /*(*VARIABLES).get().pa_rate*/ 20, + }, + ident, + monitor_src, + rx, + ) { + self.monitors.insert( + ident, + Monitor { + stream, + exit_sender: sx, + }, + ); + self.errors.remove(&ident); + } else { + self.error(&ident); + } + } + + fn error(&mut self, ident: &EntryIdentifier) { + let count = match self.errors.get(&ident) { + Some(x) => *x, + None => 0, + }; + self.errors.insert(*ident, count + 1); + } +} + +fn slice_to_4_bytes(slice: &[u8]) -> [u8; 4] { + slice.try_into().expect("slice with incorrect length") +} + +fn create( + p_mainloop: &Rc>, + p_context: &Rc>, + p_spec: &libpulse_binding::sample::Spec, + ident: EntryIdentifier, + source_index: Option, + mut close_rx: mpsc::UnboundedReceiver, +) -> Result>> { + info!("[PADataInterface] Attempting to create new monitor stream"); + + let stream_index = if ident.entry_type == EntryType::SinkInput { + Some(ident.index) + } else { + None + }; + + let stream = Rc::new(RefCell::new( + match Stream::new(&mut p_context.borrow_mut(), "RsMixer monitor", p_spec, None) { + Some(stream) => stream, + None => return Err(Report::msg("Error creating stream for monitoring volume")), + }, + )); + + // Stream state change callback + { + debug!("[PADataInterface] Registering stream state change callback"); + let ml_ref = Rc::clone(&p_mainloop); + let stream_ref = Rc::downgrade(&stream); + stream + .borrow_mut() + .set_state_callback(Some(Box::new(move || { + let state = unsafe { (*(*stream_ref.as_ptr()).as_ptr()).get_state() }; + match state { + libpulse_binding::stream::State::Ready + | libpulse_binding::stream::State::Failed + | libpulse_binding::stream::State::Terminated => { + unsafe { (*ml_ref.as_ptr()).signal(false) }; + } + _ => {} + } + }))); + } + + // for sink inputs we want to set monitor stream to sink + if let Some(index) = stream_index { + stream.borrow_mut().set_monitor_stream(index).unwrap(); + } + + let x; + let mut s = None; + if let Some(i) = source_index { + x = i.to_string(); + s = Some(x.as_str()); + } + + debug!("[PADataInterface] Connecting stream"); + match stream.borrow_mut().connect_record( + s, + Some(&libpulse_binding::def::BufferAttr { + maxlength: std::u32::MAX, + tlength: std::u32::MAX, + prebuf: std::u32::MAX, + minreq: 0, + fragsize: /*(*VARIABLES).get().pa_frag_size*/ 48, + }), + libpulse_binding::stream::FlagSet::PEAK_DETECT + | libpulse_binding::stream::FlagSet::ADJUST_LATENCY, + ) { + Ok(_) => {} + Err(err) => { + return Err(Report::new(err).wrap_err("while connecting stream for monitoring volume")); + } + }; + + debug!("[PADataInterface] Waiting for stream to be ready"); + loop { + match stream.borrow_mut().get_state() { + libpulse_binding::stream::State::Ready => { + break; + } + libpulse_binding::stream::State::Failed + | libpulse_binding::stream::State::Terminated => { + error!("[PADataInterface] Stream state failed/terminated"); + return Err(Report::msg("Stream terminated")) + } + _ => { + p_mainloop.borrow_mut().wait(); + } + } + } + + stream.borrow_mut().set_state_callback(None); + + { + info!("[PADataInterface] Registering stream read callback"); + let ml_ref = Rc::clone(&p_mainloop); + let stream_ref = Rc::downgrade(&stream); + stream.borrow_mut().set_read_callback(Some(Box::new(move |_size: usize| { + let remove_failed = || { + error!("[PADataInterface] Monitor failed or terminated"); + }; + let disconnect_stream = || { + warn!("[PADataInterface] {:?} Monitor existed while the sink (input)/source (output) was already gone", ident); + unsafe { + (*(*stream_ref.as_ptr()).as_ptr()).disconnect().unwrap(); + (*ml_ref.as_ptr()).signal(false); + }; + }; + + if close_rx.try_recv().is_ok() { + disconnect_stream(); + return; + } + + match unsafe {(*(*stream_ref.as_ptr()).as_ptr()).get_state() }{ + libpulse_binding::stream::State::Failed => { + remove_failed(); + }, + libpulse_binding::stream::State::Terminated => { + remove_failed(); + }, + libpulse_binding::stream::State::Ready => { + match unsafe{ (*(*stream_ref.as_ptr()).as_ptr()).peek() } { + Ok(res) => match res { + PeekResult::Data(data) => { + let count = data.len() / 4; + let mut peak = 0.0; + for c in 0..count { + let data_slice = slice_to_4_bytes(&data[c * 4 .. (c + 1) * 4]); + peak += f32::from_ne_bytes(data_slice).abs(); + } + peak = peak / count as f32; + + // if (*ACTIONS_SX).get().send(EntryUpdate::PeakVolumeUpdate(ident, peak)).is_err() { + // disconnect_stream(); + // } + + unsafe { (*(*stream_ref.as_ptr()).as_ptr()).discard().unwrap(); }; + }, + PeekResult::Hole(_) => { + unsafe { (*(*stream_ref.as_ptr()).as_ptr()).discard().unwrap(); }; + }, + _ => {}, + }, + Err(_) => { + remove_failed(); + }, + } + }, + _ => {}, + }; + }))); + } + + Ok(stream) +} diff --git a/src/clients/volume/pulse/pa_actions.rs b/src/clients/volume/pulse/pa_actions.rs new file mode 100644 index 0000000..53dfba8 --- /dev/null +++ b/src/clients/volume/pulse/pa_actions.rs @@ -0,0 +1,148 @@ +use super::{callbacks, common::*}; + +pub fn handle_command( + cmd: PulseAudioAction, + context: &Rc>, + info_sx: &mpsc::UnboundedSender, +) -> Option<()> { + match cmd { + PulseAudioAction::RequestPulseAudioState => { + callbacks::request_current_state(Rc::clone(&context), info_sx.clone()).unwrap(); + } + PulseAudioAction::MuteEntry(ident, mute) => { + set_mute(ident, mute, &context); + } + PulseAudioAction::MoveEntryToParent(ident, parent) => { + move_entry_to_parent(ident, parent, &context, info_sx.clone()); + } + PulseAudioAction::ChangeCardProfile(ident, profile) => { + change_card_profile(ident, profile, &context); + } + PulseAudioAction::SetVolume(ident, vol) => { + set_volume(ident, vol, &context); + } + PulseAudioAction::SetSuspend(ident, suspend) => { + set_suspend(ident, suspend, &context); + } + PulseAudioAction::KillEntry(ident) => { + kill_entry(ident, &context); + } + PulseAudioAction::Shutdown => { + //@TODO disconnect monitors + return None; + } + _ => {} + }; + Some(()) +} + +fn set_volume( + ident: EntryIdentifier, + vol: libpulse_binding::volume::ChannelVolumes, + context: &Rc>, +) { + let mut introspector = context.borrow_mut().introspect(); + match ident.entry_type { + EntryType::Sink => { + introspector.set_sink_volume_by_index(ident.index, &vol, None); + } + EntryType::SinkInput => { + introspector.set_sink_input_volume(ident.index, &vol, None); + } + EntryType::Source => { + introspector.set_source_volume_by_index(ident.index, &vol, None); + } + EntryType::SourceOutput => { + introspector.set_source_output_volume(ident.index, &vol, None); + } + _ => {} + }; +} + +fn change_card_profile(ident: EntryIdentifier, profile: String, context: &Rc>) { + if ident.entry_type != EntryType::Card { + return; + } + context + .borrow_mut() + .introspect() + .set_card_profile_by_index(ident.index, &profile[..], None); +} + +fn move_entry_to_parent( + ident: EntryIdentifier, + parent: EntryIdentifier, + context: &Rc>, + info_sx: mpsc::UnboundedSender, +) { + let mut introspector = context.borrow_mut().introspect(); + + match ident.entry_type { + EntryType::SinkInput => { + introspector.move_sink_input_by_index( + ident.index, + parent.index, + Some(Box::new(move |_| { + info_sx.send(parent).unwrap(); + info_sx.send(ident).unwrap(); + })), + ); + } + EntryType::SourceOutput => { + introspector.move_source_output_by_index( + ident.index, + parent.index, + Some(Box::new(move |_| { + info_sx.send(parent).unwrap(); + info_sx.send(ident).unwrap(); + })), + ); + } + _ => {} + }; +} + +fn set_suspend(ident: EntryIdentifier, suspend: bool, context: &Rc>) { + let mut introspector = context.borrow_mut().introspect(); + match ident.entry_type { + EntryType::Sink => { + introspector.suspend_sink_by_index(ident.index, suspend, None); + } + EntryType::Source => { + introspector.suspend_source_by_index(ident.index, suspend, None); + } + _ => {} + }; +} + +fn kill_entry(ident: EntryIdentifier, context: &Rc>) { + let mut introspector = context.borrow_mut().introspect(); + match ident.entry_type { + EntryType::SinkInput => { + introspector.kill_sink_input(ident.index, |_| {}); + } + EntryType::SourceOutput => { + introspector.kill_source_output(ident.index, |_| {}); + } + _ => {} + }; +} + +fn set_mute(ident: EntryIdentifier, mute: bool, context: &Rc>) { + let mut introspector = context.borrow_mut().introspect(); + match ident.entry_type { + EntryType::Sink => { + introspector.set_sink_mute_by_index(ident.index, mute, None); + } + EntryType::SinkInput => { + introspector.set_sink_input_mute(ident.index, mute, None); + } + EntryType::Source => { + introspector.set_source_mute_by_index(ident.index, mute, None); + } + EntryType::SourceOutput => { + introspector.set_source_output_mute(ident.index, mute, None); + } + _ => {} + }; +} diff --git a/src/clients/volume/pulse/pa_interface.rs b/src/clients/volume/pulse/pa_interface.rs new file mode 100644 index 0000000..3d654f6 --- /dev/null +++ b/src/clients/volume/pulse/pa_interface.rs @@ -0,0 +1,162 @@ +use std::ops::Deref; + +// use lazy_static::lazy_static; +use libpulse_binding::proplist::Proplist; +use tracing::{debug, error, info}; +// use state::Storage; +use color_eyre::{Report, Result}; + +use super::{callbacks, common::*, pa_actions}; + +// lazy_static! { +// pub static ref ACTIONS_SX: Storage> = Storage::new(); +// } + +pub async fn start( + mut internal_rx: mpsc::Receiver, + info_sx: mpsc::UnboundedSender, + actions_sx: mpsc::UnboundedSender, +) -> Result<()> { + // (*ACTIONS_SX).set(actions_sx); + + // Create new mainloop and context + let mut proplist = Proplist::new().unwrap(); + proplist + .set_str(libpulse_binding::proplist::properties::APPLICATION_NAME, "RsMixer") + .unwrap(); + + debug!("[PAInterface] Creating new mainloop"); + let mainloop = Rc::new(RefCell::new(match Mainloop::new() { + Some(ml) => ml, + None => { + error!("[PAInterface] Error while creating new mainloop"); + return Err(Report::msg("Error while creating new mainloop")); + } + })); + + debug!("[PAInterface] Creating new context"); + let context = Rc::new(RefCell::new( + match PAContext::new_with_proplist( + mainloop.borrow_mut().deref().deref(), + "RsMixerContext", + &proplist, + ) { + Some(ctx) => ctx, + None => { + error!("[PAInterface] Error while creating new context"); + return Err(Report::msg("Error while creating new context")); + } + }, + )); + + // PAContext state change callback + { + debug!("[PAInterface] Registering state change callback"); + let ml_ref = Rc::clone(&mainloop); + let context_ref = Rc::clone(&context); + context + .borrow_mut() + .set_state_callback(Some(Box::new(move || { + let state = unsafe { (*context_ref.as_ptr()).get_state() }; + if matches!( + state, + libpulse_binding::context::State::Ready + | libpulse_binding::context::State::Failed + | libpulse_binding::context::State::Terminated + ) { + unsafe { (*ml_ref.as_ptr()).signal(false) }; + } + }))); + } + + // Try to connect to pulseaudio + debug!("[PAInterface] Connecting context"); + + if context + .borrow_mut() + .connect(None, libpulse_binding::context::FlagSet::NOFLAGS, None) + .is_err() + { + error!("[PAInterface] Error while connecting context"); + return Err(Report::msg("Error while connecting context")); + } + + info!("[PAInterface] Starting mainloop"); + + // start mainloop + mainloop.borrow_mut().lock(); + + if let Err(err) = mainloop.borrow_mut().start() { + return Err(Report::new(err)); + } + + debug!("[PAInterface] Waiting for context to be ready..."); + // wait for context to be ready + loop { + match context.borrow_mut().get_state() { + libpulse_binding::context::State::Ready => { + break; + } + libpulse_binding::context::State::Failed | libpulse_binding::context::State::Terminated => { + mainloop.borrow_mut().unlock(); + mainloop.borrow_mut().stop(); + error!("[PAInterface] Connection failed or context terminated"); + return Err(Report::msg("Connection failed or context terminated")); + } + _ => { + mainloop.borrow_mut().wait(); + } + } + } + debug!("[PAInterface] PAContext ready"); + + context.borrow_mut().set_state_callback(None); + + callbacks::subscribe(&context, info_sx.clone())?; + callbacks::request_current_state(context.clone(), info_sx.clone())?; + + mainloop.borrow_mut().unlock(); + + debug!("[PAInterface] Actually starting our mainloop"); + + let mut monitors = Monitors::default(); + let mut last_targets = HashMap::new(); + + while let Some(msg) = internal_rx.recv().await { + mainloop.borrow_mut().lock(); + + match context.borrow_mut().get_state() { + libpulse_binding::context::State::Ready => {} + _ => { + mainloop.borrow_mut().unlock(); + return Err(Report::msg("Disconnected while working")) + } + } + + match msg { + PAInternal::AskInfo(ident) => { + callbacks::request_info(ident, &context, info_sx.clone()); + } + PAInternal::Tick => { + // remove failed monitors + monitors.filter(&mainloop, &context, &last_targets); + } + PAInternal::Command(cmd) => { + let cmd = cmd.deref(); + if pa_actions::handle_command(cmd.clone(), &context, &info_sx).is_none() { + monitors.filter(&mainloop, &context, &HashMap::new()); + mainloop.borrow_mut().unlock(); + break; + } + + if let PulseAudioAction::CreateMonitors(mons) = cmd.clone() { + last_targets = mons; + monitors.filter(&mainloop, &context, &last_targets); + } + } + }; + mainloop.borrow_mut().unlock(); + } + + Ok(()) +} diff --git a/src/clients/volume/pulse_bak.rs b/src/clients/volume/pulse_bak.rs new file mode 100644 index 0000000..97c58f9 --- /dev/null +++ b/src/clients/volume/pulse_bak.rs @@ -0,0 +1,90 @@ +use crate::clients::volume::VolumeClient; +use libpulse_binding::context::State; +use libpulse_binding::{ + context::{Context, FlagSet}, + mainloop::threaded::Mainloop, + proplist::{properties, Proplist}, +}; +use std::cell::RefCell; +use std::ops::Deref; +use std::rc::Rc; +use tracing::{debug, error}; + +pub fn test() { + let mut prop_list = Proplist::new().unwrap(); + prop_list + .set_str(properties::APPLICATION_NAME, "ironbar") + .unwrap(); + + let mainloop = Rc::new(RefCell::new(Mainloop::new().unwrap())); + + let context = Rc::new(RefCell::new( + Context::new_with_proplist(mainloop.borrow().deref(), "ironbar_context", &prop_list) + .unwrap(), + )); + + // PAContext state change callback + { + debug!("[PAInterface] Registering state change callback"); + let ml_ref = Rc::clone(&mainloop); + let context_ref = Rc::clone(&context); + context + .borrow_mut() + .set_state_callback(Some(Box::new(move || { + let state = unsafe { (*context_ref.as_ptr()).get_state() }; + if matches!(state, State::Ready | State::Failed | State::Terminated) { + unsafe { (*ml_ref.as_ptr()).signal(false) }; + } + }))); + } + + if let Err(err) = context.borrow_mut().connect(None, FlagSet::NOFLAGS, None) { + error!("{err:?}"); + } + + println!("{:?}", context.borrow().get_server()); + + mainloop.borrow_mut().lock(); + if let Err(err) = mainloop.borrow_mut().start() { + error!("{err:?}"); + } + + debug!("[PAInterface] Waiting for context to be ready..."); + println!("[PAInterface] Waiting for context to be ready..."); + // wait for context to be ready + loop { + match context.borrow().get_state() { + State::Ready => { + break; + } + State::Failed | State::Terminated => { + mainloop.borrow_mut().unlock(); + mainloop.borrow_mut().stop(); + error!("[PAInterface] Connection failed or context terminated"); + } + _ => { + mainloop.borrow_mut().wait(); + } + } + } + debug!("[PAInterface] PAContext ready"); + println!("[PAInterface] PAContext ready"); + + context.borrow_mut().set_state_callback(None); + + println!("jfgjfgg"); + + let introspector = context.borrow().introspect(); + + println!("jfgjfgg2"); + + introspector.get_sink_info_list(|result| { + println!("boo: {result:?}"); + }); + + println!("fjgjfgf??"); +} + +struct PulseVolumeClient {} + +impl VolumeClient for PulseVolumeClient {} diff --git a/src/main.rs b/src/main.rs index 0abb761..23cdb0b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -44,6 +44,8 @@ async fn main() -> Result<()> { info!("Ironbar version {}", VERSION); info!("Starting application"); + clients::volume::pulse_bak::test(); + let wayland_client = wayland::get_client().await; let app = Application::builder().application_id(GTK_APP_ID).build();